diff --git a/pom.xml b/pom.xml
index 7227da3581..349a1e28dd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 9baccaa905..31abde74d9 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml
index 47a5b7aba7..188f993dbc 100644
--- a/spring-data-mongodb-cross-store/pom.xml
+++ b/spring-data-mongodb-cross-store/pom.xml
@@ -6,7 +6,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
../pom.xml
@@ -50,7 +50,7 @@
org.springframework.data
spring-data-mongodb
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index e5c865ea08..5c6996c101 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index b86dc2808c..c5e56ec707 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATAMONGO-2003-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java
index 5eeda51d0c..af07e0f071 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java
@@ -21,6 +21,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.Optional;
+import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -206,7 +207,9 @@ private Criteria from(Part part, MongoPersistentProperty property, Criteria crit
case NOT_CONTAINING:
return createContainingCriteria(part, property, criteria.not(), parameters);
case REGEX:
- return criteria.regex(parameters.next().toString());
+
+ Object param = parameters.next();
+ return param instanceof Pattern ? criteria.regex((Pattern) param) : criteria.regex(param.toString());
case EXISTS:
return criteria.exists((Boolean) parameters.next());
case TRUE:
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
index 9f19b8af27..23264fc238 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
@@ -28,6 +28,7 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -1216,4 +1217,18 @@ public void findWithSortOverwritesAnnotatedSort() {
assertThat(repository.findByAgeGreaterThan(40, Sort.by(Direction.ASC, "age"))).containsExactly(leroi, dave, boyd,
carter);
}
+
+ @Test // DATAMONGO-2003
+ public void findByRegexWithPattern() {
+ assertThat(repository.findByFirstnameRegex(Pattern.compile(alicia.getFirstname()))).hasSize(1);
+ }
+
+ @Test // DATAMONGO-2003
+ public void findByRegexWithPatternAndOptions() {
+
+ String fn = alicia.getFirstname().toUpperCase();
+
+ assertThat(repository.findByFirstnameRegex(Pattern.compile(fn))).hasSize(0);
+ assertThat(repository.findByFirstnameRegex(Pattern.compile(fn, Pattern.CASE_INSENSITIVE))).hasSize(1);
+ }
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java
index 7745b524df..4d1590ea34 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Optional;
import java.util.UUID;
+import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.springframework.data.domain.Page;
@@ -353,4 +354,6 @@ Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, Li
@Query(sort = "{ age : -1 }")
List findByAgeGreaterThan(int age, Sort sort);
+
+ List findByFirstnameRegex(Pattern pattern);
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java
index ecf4398f6b..ed9f492ec6 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java
@@ -24,7 +24,9 @@
import java.lang.reflect.Method;
import java.util.List;
+import java.util.regex.Pattern;
+import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.Before;
import org.junit.Rule;
@@ -60,8 +62,6 @@
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
import org.springframework.data.repository.query.parser.PartTree;
-import org.bson.Document;
-
/**
* Unit test for {@link MongoQueryCreator}.
*
@@ -627,6 +627,25 @@ public void queryShouldThrowExceptionWhenArgumentDoesNotMatchDeclaration() {
new MongoQueryCreator(tree, accessor, context).createQuery();
}
+ @Test // DATAMONGO-2003
+ public void createsRegexQueryForPatternCorrectly() throws Exception {
+
+ PartTree tree = new PartTree("findByFirstNameRegex", Person.class);
+ MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, Pattern.compile(".*")), context);
+
+ assertThat(creator.createQuery(), is(query(where("firstName").regex(".*"))));
+ }
+
+ @Test // DATAMONGO-2003
+ public void createsRegexQueryForPatternWithOptionsCorrectly() throws Exception {
+
+ Pattern pattern = Pattern.compile(".*", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
+
+ PartTree tree = new PartTree("findByFirstNameRegex", Person.class);
+ MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, pattern), context);
+ assertThat(creator.createQuery(), is(query(where("firstName").regex(".*", "iu"))));
+ }
+
interface PersonRepository extends Repository {
List findByLocationNearAndFirstname(Point location, Distance maxDistance, String firstname);