From 0aff94b5ce9b2048aa5a65ee09cf672e3037d4a0 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 26 Apr 2016 19:33:15 +0200 Subject: [PATCH] DATAMONGO-1425 - Fix query derivation for notContaining on String properties. We now correctly build up the criteria for derived queries using notContaining keyword on String properties. Original pull request: #363. --- .../mongodb/repository/query/MongoQueryCreator.java | 2 +- .../AbstractPersonRepositoryIntegrationTests.java | 12 ++++++------ .../data/mongodb/repository/PersonRepository.java | 11 +++++++---- .../repository/query/MongoQueryCreatorUnitTests.java | 3 ++- 4 files changed, 16 insertions(+), 12 deletions(-) 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 a0cb9aa00..cdb70da2f 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 @@ -201,7 +201,7 @@ class MongoQueryCreator extends AbstractQueryCreator { case CONTAINING: return createContainingCriteria(part, property, criteria, parameters); case NOT_CONTAINING: - return createContainingCriteria(part, property, criteria, parameters).not(); + return createContainingCriteria(part, property, criteria.not(), parameters); case REGEX: return criteria.regex(parameters.next().toString()); case EXISTS: 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 6adc4bbc2..b3fb7fa05 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 @@ -1211,14 +1211,14 @@ public abstract class AbstractPersonRepositoryIntegrationTests { } /** - * @see DATAMONGO-990 + * @see DATAMONGO-1425 */ @Test - public void shouldFindByFirstnameForSpELExpressionWithParameterVariableOnly() { - - List users = repository.findWithSpelByFirstnameForSpELExpressionWithParameterVariableOnly("Dave"); + public void findsPersonsByFirstnameNotContains() throws Exception { - assertThat(users, hasSize(1)); - assertThat(users.get(0), is(dave)); + List result = repository.findByFirstnameNotContains("Boyd"); + assertThat(result.size(), is((int) (repository.count() - 1))); + assertThat(result, not(hasItem(boyd))); } + } 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 eae2c02e1..00a91b4e4 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 @@ -89,6 +89,8 @@ public interface PersonRepository extends MongoRepository, Query */ List findByFirstnameLike(String firstname); + List findByFirstnameNotContains(String firstname); + List findByFirstnameLikeOrderByLastnameAsc(String firstname, Sort sort); @Query("{'age' : { '$lt' : ?0 } }") @@ -309,7 +311,8 @@ public interface PersonRepository extends MongoRepository, Query * @see DATAMONGO-745 */ @Query("{lastname:?0, address.street:{$in:?1}}") - Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, List streetNames, Pageable page); + Page findByCustomQueryLastnameAndAddressStreetInList(String lastname, List streetNames, + Pageable page); /** * @see DATAMONGO-950 @@ -334,19 +337,19 @@ public interface PersonRepository extends MongoRepository, Query */ @Query("{ firstname : { $in : ?0 }}") Stream findByCustomQueryWithStreamingCursorByFirstnames(List firstnames); - + /** * @see DATAMONGO-990 */ @Query("{ firstname : ?#{[0]}}") List findWithSpelByFirstnameForSpELExpressionWithParameterIndexOnly(String firstname); - + /** * @see DATAMONGO-990 */ @Query("{ firstname : ?#{[0]}, email: ?#{principal.email} }") List findWithSpelByFirstnameAndCurrentUserWithCustomQuery(String firstname); - + /** * @see DATAMONGO-990 */ 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 4d8fd0b3a..6c8dac8bd 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 @@ -461,6 +461,7 @@ public class MongoQueryCreatorUnitTests { /** * @see DATAMONGO-1075 + * @see DATAMONGO-1425 */ @Test public void shouldCreateRegexWhenUsingNotContainsOnStringProperty() { @@ -469,7 +470,7 @@ public class MongoQueryCreatorUnitTests { MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "thew"), context); Query query = creator.createQuery(); - assertThat(query, is(query(where("username").regex(".*thew.*").not()))); + assertThat(query.getQueryObject(), is(query(where("username").not().regex(".*thew.*")).getQueryObject())); } /**