diff --git a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java index 27eb6d152..648be715d 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/ExpressionUtils.java @@ -231,30 +231,38 @@ public final class ExpressionUtils { return new PredicateOperation(Ops.IS_NOT_NULL, left); } + + /** * Convert the given like pattern to a regex pattern * * @param expr * @return - */ - @SuppressWarnings("unchecked") + */ public static Expression likeToRegex(Expression expr){ + return likeToRegex(expr, true); + } + + @SuppressWarnings("unchecked") + public static Expression likeToRegex(Expression expr, boolean matchStartAndEnd){ // TODO : this should take the escape character into account if (expr instanceof Constant) { String like = expr.toString(); - if (!like.startsWith("%") && !like.startsWith("_")) { - like = "^" + like; - } - if (!like.endsWith("%") && !like.endsWith("_")) { - like = like + "$"; - } - like = like.replace("%", ".*").replace("_", "."); + if (matchStartAndEnd) { + if (!like.startsWith("%")) { + like = "^" + like; + } + if (!like.endsWith("%")) { + like = like + "$"; + } + } + like = like.replace(".", "\\.").replace("%", ".*").replace("_", "."); return ConstantImpl.create(like); } else if (expr instanceof Operation) { Operation o = (Operation)expr; if (o.getOperator() == Ops.CONCAT) { - Expression lhs = likeToRegex((Expression) o.getArg(0)); - Expression rhs = likeToRegex((Expression) o.getArg(1)); + Expression lhs = likeToRegex((Expression) o.getArg(0), false); + Expression rhs = likeToRegex((Expression) o.getArg(1), false); return new OperationImpl(String.class, Ops.CONCAT, lhs, rhs); } else { return expr; diff --git a/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java b/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java index a7bd9a033..0d52e9800 100644 --- a/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/types/ExpressionUtilsTest.java @@ -32,7 +32,7 @@ public class ExpressionUtilsTest { assertEquals(".*", regex(ConstantImpl.create("%"))); assertEquals("^abc.*", regex(ConstantImpl.create("abc%"))); assertEquals(".*abc$", regex(ConstantImpl.create("%abc"))); - assertEquals(".", regex(ConstantImpl.create("_"))); + assertEquals("^.$", regex(ConstantImpl.create("_"))); StringPath path = new StringPath("path"); assertEquals("path + .*", regex(path.append("%"))); @@ -41,6 +41,11 @@ public class ExpressionUtilsTest { assertEquals(". + path", regex(path.prepend("_"))); } + @Test + public void LikeToRegex_Escape() { + assertEquals("^\\.$", regex(ConstantImpl.create("."))); + } + @Test public void RegexToLike() { assertEquals("%", like(ConstantImpl.create(".*"))); diff --git a/querydsl-jdo/src/main/java/com/mysema/query/jdo/JDOQLSerializer.java b/querydsl-jdo/src/main/java/com/mysema/query/jdo/JDOQLSerializer.java index 89229a272..8955e7460 100644 --- a/querydsl-jdo/src/main/java/com/mysema/query/jdo/JDOQLSerializer.java +++ b/querydsl-jdo/src/main/java/com/mysema/query/jdo/JDOQLSerializer.java @@ -331,7 +331,7 @@ public final class JDOQLSerializer extends SerializerBase { } else if (operator.equals(Ops.LIKE) || operator.equals(Ops.LIKE_ESCAPE)) { super.visitOperation(type, Ops.MATCHES, - Arrays.asList(args.get(0), ExpressionUtils.likeToRegex((Expression) args.get(1)))); + Arrays.asList(args.get(0), ExpressionUtils.likeToRegex((Expression) args.get(1), false))); // exists } else if (operator.equals(Ops.EXISTS) && args.get(0) instanceof SubQueryExpression) { diff --git a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java index cea6f902f..c9f3966e2 100644 --- a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java +++ b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java @@ -239,6 +239,7 @@ public class MongodbQueryTest { @Test public void Like() { + assertQuery(user.firstName.like("Jaan")); assertQuery(user.firstName.like("Jaan%"), u3, u4); assertQuery(user.firstName.like("jaan%"));