diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/EvaluatorUtils.java b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/EvaluatorUtils.java index 4510a2637..59ac590e0 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/EvaluatorUtils.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/EvaluatorUtils.java @@ -1,6 +1,10 @@ +/* + * Copyright (c) 2009 Mysema Ltd. + * All rights reserved. + * + */ package com.mysema.query.collections.utils; -import java.lang.reflect.InvocationTargetException; import java.util.List; import org.codehaus.janino.ExpressionEvaluator; @@ -17,14 +21,6 @@ import com.mysema.query.grammar.types.Expr; */ public class EvaluatorUtils { - public static T evaluate(ExpressionEvaluator ev, Object... args){ - try { - return (T) ev.evaluate(args); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } - } - public static ExpressionEvaluator create(JavaOps ops, List> sources, Expr expr){ try { return new JavaSerializer(ops).handle(expr).createExpressionEvaluator(sources, expr); diff --git a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java index 523e1018f..d7182af7d 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java +++ b/querydsl-collections/src/main/java/com/mysema/query/collections/utils/QueryIteratorUtils.java @@ -1,5 +1,11 @@ +/* + * Copyright (c) 2009 Mysema Ltd. + * All rights reserved. + * + */ package com.mysema.query.collections.utils; +import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.List; @@ -13,12 +19,20 @@ import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Expr.EBoolean; /** - * Util provides + * QueryIteratorUtils provides * * @author tiwe * @version $Id$ */ public class QueryIteratorUtils { + + public static T evaluate(ExpressionEvaluator ev, Object... args){ + try { + return (T) ev.evaluate(args); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } public static Iterator multiArgFilter(JavaOps ops, Iterator source, List> sources, EBoolean condition){ ExpressionEvaluator ev = EvaluatorUtils.create(ops, sources, condition); @@ -28,7 +42,7 @@ public class QueryIteratorUtils { private static Iterator multiArgFilter(Iterator source, final ExpressionEvaluator ev){ return IteratorUtils.filteredIterator(source, new Predicate(){ public boolean evaluate(S object) { - return EvaluatorUtils.evaluate(ev, (Object[])object); + return QueryIteratorUtils.evaluate(ev, (Object[])object); } }); } @@ -41,7 +55,7 @@ public class QueryIteratorUtils { private static Iterator project(Iterator source, final ExpressionEvaluator ev){ return IteratorUtils.transformedIterator(source, new Transformer(){ public T transform(S input) { - return EvaluatorUtils.evaluate(ev, (Object[])input); + return QueryIteratorUtils.evaluate(ev, (Object[])input); } }); } @@ -49,7 +63,7 @@ public class QueryIteratorUtils { public static Iterator singleArgFilter(Iterator source, final ExpressionEvaluator ev){ return IteratorUtils.filteredIterator(source, new Predicate(){ public boolean evaluate(S object) { - return EvaluatorUtils.evaluate(ev, object); + return QueryIteratorUtils.evaluate(ev, object); } }); } diff --git a/querydsl-collections/src/main/java/com/mysema/query/grammar/FilteredJavaSerializer.java b/querydsl-collections/src/main/java/com/mysema/query/grammar/FilteredJavaSerializer.java index 8b1885a3c..791900d25 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/grammar/FilteredJavaSerializer.java +++ b/querydsl-collections/src/main/java/com/mysema/query/grammar/FilteredJavaSerializer.java @@ -7,6 +7,7 @@ package com.mysema.query.grammar; import java.util.List; +import com.mysema.query.grammar.Ops; import com.mysema.query.grammar.Ops.Op; import com.mysema.query.grammar.types.Expr; import com.mysema.query.grammar.types.Path; diff --git a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaOps.java b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaOps.java index 1c956d1d0..4ec401983 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaOps.java +++ b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaOps.java @@ -59,7 +59,7 @@ public class JavaOps extends OperationPatterns { add(Ops.LAST_INDEX_2ARGS, "%s.lastIndex(%s)"); add(Ops.LAST_INDEX, "%s.lastIndex(%s,%s)"); add(Ops.ISEMPTY, "%s.isEmpty()"); - add(Ops.STARTSWITH, "%s.startsWith(%s)"); + add(Ops.STARTSWITH, "%s.startsWith(%s, 0)"); add(Ops.INDEXOF_2ARGS, "%s.indexOf(%s,%s)"); add(Ops.INDEXOF, "%s.indexOf(%s)"); add(Ops.EQ_IGNORECASE, "%s.equalsIgnoreCase(%s)"); @@ -95,7 +95,7 @@ public class JavaOps extends OperationPatterns { } public static boolean like(String source, String pattern){ - return Pattern.compile(pattern.replace("%", ".*")).matcher(source).matches(); + return Pattern.compile(pattern.replace("%", ".*").replace("_",".")).matcher(source).matches(); } } diff --git a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java index 93ce78dbc..9e3e4e5a1 100644 --- a/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java +++ b/querydsl-collections/src/main/java/com/mysema/query/grammar/JavaSerializer.java @@ -207,7 +207,20 @@ public class JavaSerializer extends BaseSerializer{ @Override protected void visitOperation(Class type, Op operator, Expr... args) { - if (operator.equals(Ops.STRING_CAST)){ + if (operator.equals(Ops.LIKE)){ + String right = args[1].toString(); + if (!right.contains("_")){ + int lastIndex = right.lastIndexOf('%'); + if (lastIndex == right.length() -1){ + operator = Ops.STARTSWITH; + args[1] = new Expr.EConstant(right.substring(0, lastIndex)); + }else if (lastIndex == 0){ + operator = Ops.ENDSWITH; + args[1] = new Expr.EConstant(right.substring(1)); + } + } + super.visitOperation(type, operator, args); + }else if (operator.equals(Ops.STRING_CAST)){ visitCast(operator, args[0], String.class); }else if (operator.equals(Ops.NUMCAST)){ visitCast(operator, args[0], (Class) ((EConstant)args[1]).getConstant()); diff --git a/querydsl-collections/src/test/java/com/mysema/query/DomainTest.java b/querydsl-collections/src/test/java/com/mysema/query/DomainTest.java index 6f72230b2..6acc87739 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/DomainTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/DomainTest.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) 2009 Mysema Ltd. + * All rights reserved. + * + */ package com.mysema.query; import java.math.BigDecimal; diff --git a/querydsl-collections/src/test/java/com/mysema/query/grammar/FilteredJavaSerializerTest.java b/querydsl-collections/src/test/java/com/mysema/query/grammar/FilteredJavaSerializerTest.java index 6e38c74e6..f617d18ee 100644 --- a/querydsl-collections/src/test/java/com/mysema/query/grammar/FilteredJavaSerializerTest.java +++ b/querydsl-collections/src/test/java/com/mysema/query/grammar/FilteredJavaSerializerTest.java @@ -85,7 +85,7 @@ public class FilteredJavaSerializerTest { @Test public void test14(){ assertMatches1Expr("true && true", cat.name.ne(otherCat.name).and(otherCat.name.like("Kate5%"))); - assertMatches1Expr("true && com.mysema.query.grammar.JavaOps.like(cat.getName(),a1)", otherCat.name.ne(cat.name).and(cat.name.like("Kate5%"))); + assertMatches1Expr("true && cat.getName().startsWith(a1, 0)", otherCat.name.ne(cat.name).and(cat.name.like("Kate5%"))); } private void assertMatches1Expr(String expected, EBoolean where) {