Improve precedence mappings

This commit is contained in:
Timo Westkämper 2015-08-18 00:11:21 +03:00
parent 32f5c66b70
commit 7c72de81ea
4 changed files with 48 additions and 21 deletions

View File

@ -1,8 +1,13 @@
package com.querydsl.collections;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.TemplatesTestUtils;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.StringPath;
public class CollQueryTemplatesTest {
@ -11,4 +16,13 @@ public class CollQueryTemplatesTest {
TemplatesTestUtils.testPrecedence(CollQueryTemplates.DEFAULT);
}
@Test
public void Concat() {
StringPath a = Expressions.stringPath("a");
StringPath b = Expressions.stringPath("b");
Expression<?> expr = a.append(b).toLowerCase();
String str = new CollQuerySerializer(CollQueryTemplates.DEFAULT).handle(expr).toString();
assertEquals("(a + b).toLowerCase()", str);
}
}

View File

@ -30,20 +30,20 @@ public class JavaTemplates extends Templates {
add(Ops.IS_NULL, "{0} == null");
add(Ops.IS_NOT_NULL, "{0} != null");
add(Ops.INSTANCE_OF, "{0} instanceof {1}");
add(Ops.ORDINAL, "{0}.ordinal()");
add(Ops.ORDINAL, "{0}.ordinal()", Precedence.DOT);
// collection
add(Ops.IN, "{1}.contains({0})");
add(Ops.NOT_IN, "!{1}.contains({0})");
add(Ops.COL_IS_EMPTY, "{0}.isEmpty()");
add(Ops.COL_SIZE, "{0}.size()");
add(Ops.COL_IS_EMPTY, "{0}.isEmpty()", Precedence.DOT);
add(Ops.COL_SIZE, "{0}.size()", Precedence.DOT);
// array
add(Ops.ARRAY_SIZE, "{0}.length");
add(Ops.ARRAY_SIZE, "{0}.length", Precedence.DOT);
// map
add(Ops.MAP_IS_EMPTY, "{0}.isEmpty()");
add(Ops.MAP_SIZE, "{0}.size()");
add(Ops.MAP_IS_EMPTY, "{0}.isEmpty()", Precedence.DOT);
add(Ops.MAP_SIZE, "{0}.size()", Precedence.DOT);
add(Ops.CONTAINS_KEY, "{0}.containsKey({1})");
add(Ops.CONTAINS_VALUE, "{0}.containsValue({1})");
@ -52,15 +52,15 @@ public class JavaTemplates extends Templates {
// String
add(Ops.CHAR_AT, "{0}.charAt({1})");
add(Ops.LOWER, "{0}.toLowerCase()");
add(Ops.LOWER, "{0}.toLowerCase()", Precedence.DOT);
add(Ops.SUBSTR_1ARG, "{0}.substring({1})");
add(Ops.SUBSTR_2ARGS, "{0}.substring({1},{2})");
add(Ops.TRIM, "{0}.trim()");
add(Ops.UPPER, "{0}.toUpperCase()");
add(Ops.TRIM, "{0}.trim()", Precedence.DOT);
add(Ops.UPPER, "{0}.toUpperCase()", Precedence.DOT);
add(Ops.MATCHES, "{0}.matches({1})");
add(Ops.MATCHES_IC, "{0}.matches({1})");
add(Ops.STRING_LENGTH, "{0}.length()");
add(Ops.STRING_IS_EMPTY, "{0}.isEmpty()");
add(Ops.STRING_LENGTH, "{0}.length()", Precedence.DOT);
add(Ops.STRING_IS_EMPTY, "{0}.isEmpty()", Precedence.DOT);
add(Ops.STRING_CONTAINS, "{0}.contains({1})");
add(Ops.STRING_CONTAINS_IC, "{0l}.contains({1l})");
add(Ops.STARTS_WITH, "{0}.startsWith({1})");
@ -74,16 +74,16 @@ public class JavaTemplates extends Templates {
add(Ops.StringOps.LOCATE2, "({1}.indexOf({0},{2s}-1)+1)");
// Date and Time
add(Ops.DateTimeOps.DAY_OF_MONTH, "{0}.getDayOfMonth()");
add(Ops.DateTimeOps.DAY_OF_WEEK, "{0}.getDayOfWeek()");
add(Ops.DateTimeOps.DAY_OF_YEAR, "{0}.getDayOfYear()");
add(Ops.DateTimeOps.HOUR, "{0}.getHour()");
add(Ops.DateTimeOps.MINUTE, "{0}.getMinute()");
add(Ops.DateTimeOps.MONTH, "{0}.getMonth()");
add(Ops.DateTimeOps.MILLISECOND, "{0}.getMilliSecond()");
add(Ops.DateTimeOps.SECOND, "{0}.getSecond()");
add(Ops.DateTimeOps.WEEK, "{0}.getWeek()");
add(Ops.DateTimeOps.YEAR, "{0}.getYear()");
add(Ops.DateTimeOps.DAY_OF_MONTH, "{0}.getDayOfMonth()", Precedence.DOT);
add(Ops.DateTimeOps.DAY_OF_WEEK, "{0}.getDayOfWeek()", Precedence.DOT);
add(Ops.DateTimeOps.DAY_OF_YEAR, "{0}.getDayOfYear()", Precedence.DOT);
add(Ops.DateTimeOps.HOUR, "{0}.getHour()", Precedence.DOT);
add(Ops.DateTimeOps.MINUTE, "{0}.getMinute()", Precedence.DOT);
add(Ops.DateTimeOps.MONTH, "{0}.getMonth()", Precedence.DOT);
add(Ops.DateTimeOps.MILLISECOND, "{0}.getMilliSecond()", Precedence.DOT);
add(Ops.DateTimeOps.SECOND, "{0}.getSecond()", Precedence.DOT);
add(Ops.DateTimeOps.WEEK, "{0}.getWeek()", Precedence.DOT);
add(Ops.DateTimeOps.YEAR, "{0}.getYear()", Precedence.DOT);
add(Ops.DateTimeOps.YEAR_MONTH, "{0}.getYear() * 100 + {0}.getMonth()");

View File

@ -30,6 +30,7 @@ public class Templates {
*/
protected static class Precedence {
public static final int HIGHEST = -1;
public static final int DOT = 5;
public static final int NOT_HIGH = 10;
public static final int NEGATE = 20;
public static final int ARITH_HIGH = 30;

View File

@ -5,9 +5,12 @@ import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Operator;
import com.querydsl.core.types.Ops;
import com.querydsl.core.types.TemplatesTestUtils;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.core.types.dsl.StringPath;
public class JDOQLTemplatesTest {
@ -55,4 +58,13 @@ public class JDOQLTemplatesTest {
TemplatesTestUtils.testPrecedence(JDOQLTemplates.DEFAULT);
}
@Test
public void Concat() {
StringPath a = Expressions.stringPath("a");
StringPath b = Expressions.stringPath("b");
StringPath c = Expressions.stringPath("c");
Expression<?> expr = a.append(b).toLowerCase();
String str = new JDOQLSerializer(JDOQLTemplates.DEFAULT, c).handle(expr).toString();
assertEquals("(a + b).toLowerCase()", str);
}
}