From 78b5f2a19840eb375c720085dfe75bfbc79c8699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Fri, 13 Jul 2012 12:52:52 +0300 Subject: [PATCH] #199 added like handling for Mongodb --- .../java/com/mysema/query/types/ExpressionUtils.java | 10 +++++++++- .../com/mysema/query/types/ExpressionUtilsTest.java | 2 ++ .../com/mysema/query/mongodb/MongodbSerializer.java | 4 ++++ .../com/mysema/query/mongodb/MongodbQueryTest.java | 8 ++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) 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 8a8a10f98..27eb6d152 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 @@ -241,7 +241,15 @@ public final class ExpressionUtils { public static Expression likeToRegex(Expression expr){ // TODO : this should take the escape character into account if (expr instanceof Constant) { - return ConstantImpl.create(expr.toString().replace("%", ".*").replace("_", ".")); + String like = expr.toString(); + if (!like.startsWith("%") && !like.startsWith("_")) { + like = "^" + like; + } + if (!like.endsWith("%") && !like.endsWith("_")) { + like = like + "$"; + } + like = like.replace("%", ".*").replace("_", "."); + return ConstantImpl.create(like); } else if (expr instanceof Operation) { Operation o = (Operation)expr; if (o.getOperator() == Ops.CONCAT) { 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 4c2401712..a7bd9a033 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 @@ -30,6 +30,8 @@ public class ExpressionUtilsTest { @Test public void LikeToRegex() { assertEquals(".*", regex(ConstantImpl.create("%"))); + assertEquals("^abc.*", regex(ConstantImpl.create("abc%"))); + assertEquals(".*abc$", regex(ConstantImpl.create("%abc"))); assertEquals(".", regex(ConstantImpl.create("_"))); StringPath path = new StringPath("path"); diff --git a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java index a9e52bfbd..e450fae26 100644 --- a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java +++ b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbSerializer.java @@ -153,6 +153,10 @@ public class MongodbSerializer implements Visitor { } else if (op == Ops.MATCHES_IC) { return asDBObject(asDBKey(expr, 0), Pattern.compile(asDBValue(expr, 1).toString(), Pattern.CASE_INSENSITIVE)); + } else if (op == Ops.LIKE) { + String regex = ExpressionUtils.likeToRegex((Expression)expr.getArg(1)).toString(); + return asDBObject(asDBKey(expr, 0), Pattern.compile(regex)); + } else if (op == Ops.BETWEEN) { BasicDBObject value = new BasicDBObject("$gte", asDBValue(expr, 1)); value.append("$lte", asDBValue(expr, 2)); 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 5b8410a3e..cea6f902f 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 @@ -236,6 +236,14 @@ public class MongodbQueryTest { assertQuery(user.firstName.matches(".*aa.*[^i]$"), u3, u4, u1); } + + @Test + public void Like() { + assertQuery(user.firstName.like("Jaan%"), u3, u4); + assertQuery(user.firstName.like("jaan%")); + + assertQuery(user.lastName.like("%unen"), u2, u1); + } @Test public void IsNotNull(){