Copy sort from pageable to query. (#1305)

Closes #1304.
This commit is contained in:
Michael Reiche
2022-01-17 11:01:56 -08:00
committed by mikereiche
parent 6e3c6267f7
commit daa35059de
3 changed files with 73 additions and 19 deletions

View File

@@ -178,8 +178,7 @@ public class Query {
}
this.limit = pageable.getPageSize();
this.skip = pageable.getOffset();
if (!this.sort.equals(pageable.getSort()))
this.sort.and(pageable.getSort());
this.with(pageable.getSort());
return this;
}

View File

@@ -16,6 +16,7 @@
package org.springframework.data.couchbase.core;
import static com.couchbase.client.java.query.QueryScanConsistency.REQUEST_PLUS;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
@@ -26,9 +27,11 @@ import java.time.Instant;
import java.time.temporal.TemporalAccessor;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.stream.Collectors;
import com.couchbase.client.java.query.QueryOptions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.data.couchbase.core.query.Query;
@@ -50,6 +53,9 @@ import org.springframework.data.couchbase.util.IgnoreWhen;
import org.springframework.data.couchbase.util.JavaIntegrationTests;
import com.couchbase.client.java.query.QueryScanConsistency;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
/**
* Query tests Theses tests rely on a cb server running
@@ -73,7 +79,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
// ensure each test starts with clean state
couchbaseTemplate.removeByQuery(User.class).all();
couchbaseTemplate.findByQuery(User.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
couchbaseTemplate.findByQuery(User.class).withConsistency(REQUEST_PLUS).all();
}
@Test
@@ -85,7 +91,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
couchbaseTemplate.upsertById(User.class).all(Arrays.asList(user1, user2));
final List<User> foundUsers = couchbaseTemplate.findByQuery(User.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
.withConsistency(REQUEST_PLUS).all();
for (User u : foundUsers) {
if (!(u.equals(user1) || u.equals(user2))) {
@@ -108,7 +114,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
couchbaseTemplate.findById(User.class).one(user1.getId());
reactiveCouchbaseTemplate.findById(User.class).one(user1.getId()).block();
} finally {
couchbaseTemplate.removeByQuery(User.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
couchbaseTemplate.removeByQuery(User.class).withConsistency(REQUEST_PLUS).all();
}
User usery = couchbaseTemplate.findById(User.class).one("user1");
@@ -128,7 +134,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
Query specialUsers = new Query(QueryCriteria.where(i("firstname")).like("special"));
final List<User> foundUsers = couchbaseTemplate.findByQuery(User.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(specialUsers).all();
.withConsistency(REQUEST_PLUS).matching(specialUsers).all();
assertEquals(1, foundUsers.size());
}
@@ -142,7 +148,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
Query specialUsers = new Query(QueryCriteria.where(i("id")).is(ado.getId()));
final List<AssessmentDO> foundUsers = couchbaseTemplate.findByQuery(AssessmentDO.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(specialUsers).all();
.withConsistency(REQUEST_PLUS).matching(specialUsers).all();
assertEquals("123", foundUsers.get(0).getId(), "id");
assertEquals("44444444", foundUsers.get(0).getDocumentId(), "documentId");
assertEquals(ado, foundUsers.get(0));
@@ -169,7 +175,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
Query daveUsers = new Query(QueryCriteria.where("username").like("dave"));
final List<UserSubmissionProjected> foundUserSubmissions = couchbaseTemplate.findByQuery(UserSubmission.class)
.as(UserSubmissionProjected.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(daveUsers).all();
.as(UserSubmissionProjected.class).withConsistency(REQUEST_PLUS).matching(daveUsers).all();
assertEquals(1, foundUserSubmissions.size());
assertEquals(user.getUsername(), foundUserSubmissions.get(0).getUsername());
assertEquals(user.getId(), foundUserSubmissions.get(0).getId());
@@ -186,11 +192,11 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
Query specialUsers = new Query(QueryCriteria.where("firstname").like("special"));
final List<UserJustLastName> foundUsers = couchbaseTemplate.findByQuery(User.class).as(UserJustLastName.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(specialUsers).all();
.withConsistency(REQUEST_PLUS).matching(specialUsers).all();
assertEquals(1, foundUsers.size());
final List<UserJustLastName> foundUsersReactive = reactiveCouchbaseTemplate.findByQuery(User.class)
.as(UserJustLastName.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).matching(specialUsers).all()
.as(UserJustLastName.class).withConsistency(REQUEST_PLUS).matching(specialUsers).all()
.collectList().block();
assertEquals(1, foundUsersReactive.size());
@@ -206,7 +212,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
assertTrue(couchbaseTemplate.existsById().one(user1.getId()));
assertTrue(couchbaseTemplate.existsById().one(user2.getId()));
couchbaseTemplate.removeByQuery(User.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
couchbaseTemplate.removeByQuery(User.class).withConsistency(REQUEST_PLUS).all();
assertNull(couchbaseTemplate.findById(User.class).one(user1.getId()));
assertNull(couchbaseTemplate.findById(User.class).one(user2.getId()));
@@ -227,7 +233,7 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
Query nonSpecialUsers = new Query(QueryCriteria.where(i("firstname")).notLike("special"));
couchbaseTemplate.removeByQuery(User.class).withConsistency(QueryScanConsistency.REQUEST_PLUS)
couchbaseTemplate.removeByQuery(User.class).withConsistency(REQUEST_PLUS)
.matching(nonSpecialUsers).all();
assertNull(couchbaseTemplate.findById(User.class).one(user1.getId()));
@@ -252,17 +258,17 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
// distinct icao
List<Airport> airports1 = couchbaseTemplate.findByQuery(Airport.class).distinct(new String[] { "icao" })
.as(Airport.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
.as(Airport.class).withConsistency(REQUEST_PLUS).all();
assertEquals(2, airports1.size());
// distinct all-fields-in-Airport.class
List<Airport> airports2 = couchbaseTemplate.findByQuery(Airport.class).distinct(new String[] {}).as(Airport.class)
.withConsistency(QueryScanConsistency.REQUEST_PLUS).all();
.withConsistency(REQUEST_PLUS).all();
assertEquals(7, airports2.size());
// count( distinct { iata, icao } )
long count1 = couchbaseTemplate.findByQuery(Airport.class).distinct(new String[] { "iata", "icao" })
.as(Airport.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).count();
.as(Airport.class).withConsistency(REQUEST_PLUS).count();
assertEquals(7, count1);
} finally {
@@ -287,22 +293,22 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
// distinct icao
List<Airport> airports1 = reactiveCouchbaseTemplate.findByQuery(Airport.class).distinct(new String[] { "icao" })
.as(Airport.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all().collectList().block();
.as(Airport.class).withConsistency(REQUEST_PLUS).all().collectList().block();
assertEquals(2, airports1.size());
// distinct all-fields-in-Airport.class
List<Airport> airports2 = reactiveCouchbaseTemplate.findByQuery(Airport.class).distinct(new String[] {})
.as(Airport.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).all().collectList().block();
.as(Airport.class).withConsistency(REQUEST_PLUS).all().collectList().block();
assertEquals(7, airports2.size());
// count( distinct icao )
Long count1 = reactiveCouchbaseTemplate.findByQuery(Airport.class).distinct(new String[] { "icao" })
.as(Airport.class).withConsistency(QueryScanConsistency.REQUEST_PLUS).count().block();
.as(Airport.class).withConsistency(REQUEST_PLUS).count().block();
assertEquals(2, count1);
// count( distinct { icao, iata } )
Long count2 = reactiveCouchbaseTemplate.findByQuery(Airport.class).distinct(new String[] { "icao", "iata" })
.withConsistency(QueryScanConsistency.REQUEST_PLUS).count().block();
.withConsistency(REQUEST_PLUS).count().block();
assertEquals(7, count2);
} finally {
@@ -312,4 +318,31 @@ class CouchbaseTemplateQueryIntegrationTests extends JavaIntegrationTests {
}
}
@Test
void sortedTemplate() {
couchbaseTemplate.removeByQuery(Airport.class).withConsistency(REQUEST_PLUS).all();
String[] iatas = { "JFK", "IAD", "SFO", "SJC", "SEA", "LAX", "PHX" };
try {
couchbaseTemplate.insertById(Airport.class).all(
Arrays.stream(iatas).map((iata) -> new Airport("airports::" + iata, iata, iata.toLowerCase(Locale.ROOT)))
.collect(Collectors.toSet()));
org.springframework.data.couchbase.core.query.Query query = org.springframework.data.couchbase.core.query.Query.query(QueryCriteria.where("iata").isNotNull());
Pageable pageableWithSort = PageRequest.of(0, 7, Sort.by("iata"));
query.with(pageableWithSort);
List<Airport> airports = couchbaseTemplate.findByQuery(Airport.class).withConsistency(REQUEST_PLUS).matching(query).all();
String[] sortedIatas = iatas.clone();
System.out.println(""+iatas.length+" "+sortedIatas.length);
Arrays.sort(sortedIatas);
for(int i=0; i< pageableWithSort.getPageSize(); i++){
System.out.println(airports.get(i).getIata());
assertEquals(sortedIatas[i], airports.get(i).getIata());
}
} finally {
couchbaseTemplate.removeById(Airport.class).all(Arrays.stream(iatas).map((iata) -> "airports::" + iata).collect(Collectors.toSet()));
}
}
}

View File

@@ -577,6 +577,28 @@ public class CouchbaseRepositoryQueryIntegrationTests extends ClusterAwareIntegr
airportRepository.deleteById(airport2.getId());
}
@Test
void sortedRepository() {
airportRepository.withOptions(QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS)).deleteAll();
String[] iatas = { "JFK", "IAD", "SFO", "SJC", "SEA", "LAX", "PHX" };
try {
airportRepository.saveAll(
Arrays.stream(iatas).map((iata) -> new Airport("airports::" + iata, iata, iata.toLowerCase(Locale.ROOT)))
.collect(Collectors.toSet()));
List<Airport> airports = airportRepository.withOptions(QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS)).findAll(Sort.by("iata"));
String[] sortedIatas = iatas.clone();
System.out.println(""+iatas.length+" "+sortedIatas.length);
Arrays.sort(sortedIatas);
for(int i=0; i< sortedIatas.length; i++){
assertEquals(sortedIatas[i], airports.get(i).getIata());
}
} finally {
airportRepository
.deleteAllById(Arrays.stream(iatas).map((iata) -> "airports::" + iata).collect(Collectors.toSet()));
}
}
@Test
void count() {
airportRepository.withOptions(QueryOptions.queryOptions().scanConsistency(REQUEST_PLUS)).deleteAll();