From de9454b73b965d3cb20073ef90b553f519a0b6a3 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 2 Aug 2024 15:57:04 +0200 Subject: [PATCH] Handle `Query.isSorted` in `QueryUtils` proxy. Closes #4758 Original pull request: #4759 --- .../mongodb/repository/query/QueryUtils.java | 10 +++++++++ .../query/AbstractMongoQueryUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java index c7cb84d09..4945fd8db 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java @@ -23,6 +23,7 @@ import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.Document; + import org.springframework.aop.framework.ProxyFactory; import org.springframework.data.mongodb.core.query.Collation; import org.springframework.data.mongodb.core.query.Query; @@ -151,6 +152,15 @@ public class QueryUtils { @Override public Object invoke(@NonNull MethodInvocation invocation) throws Throwable { + if (invocation.getMethod().getName().equals("isSorted")) { + + if (!defaultSort.isEmpty()) { + return true; + } + + return invocation.proceed(); + } + if (!invocation.getMethod().getName().equals("getSortObject")) { return invocation.proceed(); } 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 c35a328a1..5ddf4534d 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 @@ -37,12 +37,15 @@ 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.OffsetScrollPosition; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.ScrollPosition; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.domain.Window; import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.core.ExecutableFindOperation.ExecutableFind; import org.springframework.data.mongodb.core.ExecutableFindOperation.FindWithQuery; @@ -329,6 +332,20 @@ class AbstractMongoQueryUnitTests { assertThat(captor.getValue().getSortObject()).isEqualTo(new Document("age", 1)); } + @Test // GH-4758 + void scrollUsesAnnotatedSortWhenPresent() { + + createQueryForMethod("scrollByAge", Integer.class, ScrollPosition.class) // + .execute(new Object[] { 1000, ScrollPosition.keyset()}); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Query.class); + verify(withQueryMock).matching(captor.capture()); + + Query query = captor.getValue(); + assertThat(query.getSortObject()).isEqualTo(new Document("age", 1)); + assertThat(query.isSorted()).isTrue(); + } + @Test // DATAMONGO-1979 void usesExplicitSortOverridesAnnotatedSortWhenPresent() { @@ -637,6 +654,9 @@ class AbstractMongoQueryUnitTests { @org.springframework.data.mongodb.repository.Query(sort = "{ age : 1 }") List findByAge(Integer age); + @org.springframework.data.mongodb.repository.Query(sort = "{ age : 1 }") + Window scrollByAge(Integer age, ScrollPosition position); + @org.springframework.data.mongodb.repository.Query(sort = "{ age : 1 }") List findByAge(Integer age, Sort page); @@ -670,6 +690,7 @@ class AbstractMongoQueryUnitTests { @ReadPreference(value = "secondaryPreferred") List findWithReadPreferenceByFirstname(String firstname); + } // DATAMONGO-1872