diff --git a/pom.xml b/pom.xml index 018dd48e27..f8160da8de 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4397-SNAPSHOT pom Spring Data MongoDB @@ -26,7 +26,7 @@ multi spring-data-mongodb - 3.2.0-SNAPSHOT + 3.2.x-2827-SNAPSHOT 4.9.1 ${mongo} 1.19 diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 2de4b6b635..b90f2435e1 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 - 4.2.0-SNAPSHOT + 4.2.x-4397-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 3bc1ab9df2..bacee67813 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4397-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 921254ca44..0640c436d0 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 4.2.0-SNAPSHOT + 4.2.x-4397-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index 6e74538572..2596d0f1d3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -21,6 +21,7 @@ import java.util.Iterator; import java.util.List; +import org.springframework.data.domain.Limit; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Range; import org.springframework.data.domain.ScrollPosition; @@ -117,6 +118,11 @@ public UpdateDefinition getUpdate() { return delegate.getUpdate(); } + @Override + public Limit getLimit() { + return delegate.getLimit(); + } + /** * Converts the given value with the underlying {@link MongoWriter}. * 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 646a268e0e..fae8fe9cf1 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 @@ -213,6 +213,17 @@ void appliesScrollPositionCorrectly() { assertThat(page).contains(carter); } + @Test // GH-4397 + void appliesLimitToScrollingCorrectly() { + + Window page = repository.findByLastnameLikeOrderByLastnameAscFirstnameAsc("*a*", + ScrollPosition.keyset(), Limit.of(2)); + + assertThat(page.isLast()).isFalse(); + assertThat(page.size()).isEqualTo(2); + assertThat(page).contains(carter); + } + @Test // GH-4308 void appliesScrollPositionWithProjectionCorrectly() { @@ -236,6 +247,14 @@ void executesPagedFinderCorrectly() { assertThat(page).contains(carter, stefan); } + @Test // GH-4397 + void executesFinderCorrectlyWithSortAndLimit() { + + List page = repository.findByLastnameLike("*a*", Sort.by(Direction.ASC, "lastname", "firstname"), Limit.of(2)); + + assertThat(page).containsExactly(carter, stefan); + } + @Test void executesPagedFinderWithAnnotatedQueryCorrectly() { 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 1e6a37b0a9..7e158b5055 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 @@ -23,6 +23,7 @@ import java.util.regex.Pattern; import java.util.stream.Stream; +import org.springframework.data.domain.Limit; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Range; @@ -126,6 +127,9 @@ public interface PersonRepository extends MongoRepository, Query Window findTop2ByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastname, ScrollPosition scrollPosition); + Window findByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastname, + ScrollPosition scrollPosition, Limit limit); + /** * Returns a scroll of {@link Person}s applying projections with a lastname matching the given one (*-wildcards * supported). @@ -145,6 +149,8 @@ Window findTop2ByLastnameLikeOrderByLastnameAscFirstnameAsc(String lastn */ Page findByLastnameLike(String lastname, Pageable pageable); + List findByLastnameLike(String lastname, Sort sort, Limit limit); + @Query("{ 'lastname' : { '$regex' : '?0', '$options' : 'i'}}") Page findByLastnameLikeWithPageable(String lastname, Pageable pageable); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java index a6c7d3ed94..0fc4d8b73f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java @@ -36,6 +36,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; +import org.springframework.data.domain.Limit; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -493,6 +494,30 @@ void updateShouldApplyHint() { assertThat(captor.getValue().getHint()).isEqualTo("idx-ln"); } + @Test // GH-4397 + void limitShouldBeAppliedToQuery() { + + createQueryForMethod("findWithLimit", String.class, Limit.class).execute(new Object[] { "dalinar", Limit.of(42) }); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Query.class); + verify(withQueryMock).matching(captor.capture()); + + assertThat(captor.getValue().getLimit()).isEqualTo(42); + } + + @Test // GH-4397 + void sortAndLimitShouldBeAppliedToQuery() { + + createQueryForMethod("findWithSortAndLimit", String.class, Sort.class, Limit.class) + .execute(new Object[] { "dalinar", Sort.by("fn"), Limit.of(42) }); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Query.class); + verify(withQueryMock).matching(captor.capture()); + + assertThat(captor.getValue().getLimit()).isEqualTo(42); + assertThat(captor.getValue().getSortObject()).isEqualTo(new Document("fn", 1)); + } + private MongoQueryFake createQueryForMethod(String methodName, Class... paramTypes) { return createQueryForMethod(Repo.class, methodName, paramTypes); } @@ -614,6 +639,10 @@ private interface Repo extends MongoRepository { @Hint("idx-fn") void findWithHintByFirstname(String firstname); + + List findWithLimit(String firstname, Limit limit); + + List findWithSortAndLimit(String firstname, Sort sort, Limit limit); } // DATAMONGO-1872