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);