Browse Source

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.
pull/663/head
Christoph Strobl 10 years ago committed by Mark Paluch
parent
commit
0aff94b5ce
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java
  2. 12
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
  3. 11
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java
  4. 3
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java

2
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java

@ -201,7 +201,7 @@ class MongoQueryCreator extends AbstractQueryCreator<Query, Criteria> {
case CONTAINING: case CONTAINING:
return createContainingCriteria(part, property, criteria, parameters); return createContainingCriteria(part, property, criteria, parameters);
case NOT_CONTAINING: case NOT_CONTAINING:
return createContainingCriteria(part, property, criteria, parameters).not(); return createContainingCriteria(part, property, criteria.not(), parameters);
case REGEX: case REGEX:
return criteria.regex(parameters.next().toString()); return criteria.regex(parameters.next().toString());
case EXISTS: case EXISTS:

12
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 @Test
public void shouldFindByFirstnameForSpELExpressionWithParameterVariableOnly() { public void findsPersonsByFirstnameNotContains() throws Exception {
List<Person> users = repository.findWithSpelByFirstnameForSpELExpressionWithParameterVariableOnly("Dave");
assertThat(users, hasSize(1)); List<Person> result = repository.findByFirstnameNotContains("Boyd");
assertThat(users.get(0), is(dave)); assertThat(result.size(), is((int) (repository.count() - 1)));
assertThat(result, not(hasItem(boyd)));
} }
} }

11
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java

@ -89,6 +89,8 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
*/ */
List<Person> findByFirstnameLike(String firstname); List<Person> findByFirstnameLike(String firstname);
List<Person> findByFirstnameNotContains(String firstname);
List<Person> findByFirstnameLikeOrderByLastnameAsc(String firstname, Sort sort); List<Person> findByFirstnameLikeOrderByLastnameAsc(String firstname, Sort sort);
@Query("{'age' : { '$lt' : ?0 } }") @Query("{'age' : { '$lt' : ?0 } }")
@ -309,7 +311,8 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
* @see DATAMONGO-745 * @see DATAMONGO-745
*/ */
@Query("{lastname:?0, address.street:{$in:?1}}") @Query("{lastname:?0, address.street:{$in:?1}}")
Page<Person> findByCustomQueryLastnameAndAddressStreetInList(String lastname, List<String> streetNames, Pageable page); Page<Person> findByCustomQueryLastnameAndAddressStreetInList(String lastname, List<String> streetNames,
Pageable page);
/** /**
* @see DATAMONGO-950 * @see DATAMONGO-950
@ -334,19 +337,19 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
*/ */
@Query("{ firstname : { $in : ?0 }}") @Query("{ firstname : { $in : ?0 }}")
Stream<Person> findByCustomQueryWithStreamingCursorByFirstnames(List<String> firstnames); Stream<Person> findByCustomQueryWithStreamingCursorByFirstnames(List<String> firstnames);
/** /**
* @see DATAMONGO-990 * @see DATAMONGO-990
*/ */
@Query("{ firstname : ?#{[0]}}") @Query("{ firstname : ?#{[0]}}")
List<Person> findWithSpelByFirstnameForSpELExpressionWithParameterIndexOnly(String firstname); List<Person> findWithSpelByFirstnameForSpELExpressionWithParameterIndexOnly(String firstname);
/** /**
* @see DATAMONGO-990 * @see DATAMONGO-990
*/ */
@Query("{ firstname : ?#{[0]}, email: ?#{principal.email} }") @Query("{ firstname : ?#{[0]}, email: ?#{principal.email} }")
List<Person> findWithSpelByFirstnameAndCurrentUserWithCustomQuery(String firstname); List<Person> findWithSpelByFirstnameAndCurrentUserWithCustomQuery(String firstname);
/** /**
* @see DATAMONGO-990 * @see DATAMONGO-990
*/ */

3
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-1075
* @see DATAMONGO-1425
*/ */
@Test @Test
public void shouldCreateRegexWhenUsingNotContainsOnStringProperty() { public void shouldCreateRegexWhenUsingNotContainsOnStringProperty() {
@ -469,7 +470,7 @@ public class MongoQueryCreatorUnitTests {
MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "thew"), context); MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "thew"), context);
Query query = creator.createQuery(); Query query = creator.createQuery();
assertThat(query, is(query(where("username").regex(".*thew.*").not()))); assertThat(query.getQueryObject(), is(query(where("username").not().regex(".*thew.*")).getQueryObject()));
} }
/** /**

Loading…
Cancel
Save