Adapt to ScrollPosition API changes in Spring Data Commons.
Fixes #4377. Related ticket: #2824.
This commit is contained in:
@@ -24,8 +24,8 @@ import java.util.function.IntFunction;
|
||||
import org.bson.BsonNull;
|
||||
import org.bson.Document;
|
||||
import org.springframework.data.domain.KeysetScrollPosition;
|
||||
import org.springframework.data.domain.KeysetScrollPosition.Direction;
|
||||
import org.springframework.data.domain.ScrollPosition;
|
||||
import org.springframework.data.domain.ScrollPosition.Direction;
|
||||
import org.springframework.data.domain.Window;
|
||||
import org.springframework.data.mongodb.core.EntityOperations.Entity;
|
||||
import org.springframework.data.mongodb.core.query.Query;
|
||||
@@ -65,13 +65,13 @@ class ScrollUtils {
|
||||
|
||||
List<T> resultsToUse = director.postPostProcessResults(result, query.getLimit());
|
||||
|
||||
IntFunction<KeysetScrollPosition> positionFunction = value -> {
|
||||
IntFunction<ScrollPosition> positionFunction = value -> {
|
||||
|
||||
T last = resultsToUse.get(value);
|
||||
Entity<T> entity = operations.forEntity(last);
|
||||
|
||||
Map<String, Object> keys = entity.extractKeys(sortObject, sourceType);
|
||||
return KeysetScrollPosition.of(keys);
|
||||
return ScrollPosition.forward(keys);
|
||||
};
|
||||
|
||||
return Window.from(resultsToUse, positionFunction, hasMoreElements(result, query.getLimit()));
|
||||
@@ -103,8 +103,8 @@ class ScrollUtils {
|
||||
*/
|
||||
static class KeysetScrollDirector {
|
||||
|
||||
private static final KeysetScrollDirector forward = new KeysetScrollDirector();
|
||||
private static final KeysetScrollDirector reverse = new ReverseKeysetScrollDirector();
|
||||
private static final KeysetScrollDirector FORWARD = new KeysetScrollDirector();
|
||||
private static final KeysetScrollDirector REVERSE = new ReverseKeysetScrollDirector();
|
||||
|
||||
/**
|
||||
* Factory method to obtain the right {@link KeysetScrollDirector}.
|
||||
@@ -112,8 +112,8 @@ class ScrollUtils {
|
||||
* @param direction
|
||||
* @return
|
||||
*/
|
||||
public static KeysetScrollDirector of(KeysetScrollPosition.Direction direction) {
|
||||
return direction == Direction.Forward ? forward : reverse;
|
||||
public static KeysetScrollDirector of(ScrollPosition.Direction direction) {
|
||||
return direction == Direction.FORWARD ? FORWARD : REVERSE;
|
||||
}
|
||||
|
||||
public Document getSortObject(String idPropertyName, Query query) {
|
||||
@@ -259,7 +259,7 @@ class ScrollUtils {
|
||||
static <T> List<T> getLast(int count, List<T> list) {
|
||||
|
||||
if (count > 0 && list.size() > count) {
|
||||
return list.subList(list.size() - (count), list.size());
|
||||
return list.subList(list.size() - count, list.size());
|
||||
}
|
||||
|
||||
return list;
|
||||
|
||||
@@ -40,8 +40,6 @@ import org.springframework.context.support.GenericApplicationContext;
|
||||
import org.springframework.data.annotation.PersistenceCreator;
|
||||
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
|
||||
import org.springframework.data.domain.KeysetScrollPosition;
|
||||
import org.springframework.data.domain.KeysetScrollPosition.Direction;
|
||||
import org.springframework.data.domain.OffsetScrollPosition;
|
||||
import org.springframework.data.domain.ScrollPosition;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.domain.Window;
|
||||
@@ -128,7 +126,7 @@ class MongoTemplateScrollTests {
|
||||
|
||||
Query q = new Query(where("name").regex("J.*")).with(Sort.by("nested.name", "nested.age", "document.name"))
|
||||
.limit(2);
|
||||
q.with(KeysetScrollPosition.initial());
|
||||
q.with(ScrollPosition.keyset());
|
||||
|
||||
Window<WithNestedDocument> window = template.scroll(q, WithNestedDocument.class);
|
||||
|
||||
@@ -176,7 +174,7 @@ class MongoTemplateScrollTests {
|
||||
|
||||
template.insertAll(Arrays.asList(john20, john40_1, john40_2, jane_20, jane_40, jane_42));
|
||||
Query q = new Query(where("firstName").regex("J.*")).with(Sort.by("firstName", "age"));
|
||||
q.with(KeysetScrollPosition.initial()).limit(6);
|
||||
q.with(ScrollPosition.keyset()).limit(6);
|
||||
|
||||
Window<Person> window = template.scroll(q, Person.class);
|
||||
|
||||
@@ -185,9 +183,7 @@ class MongoTemplateScrollTests {
|
||||
assertThat(window).hasSize(6);
|
||||
|
||||
KeysetScrollPosition scrollPosition = (KeysetScrollPosition) window.positionAt(window.size() - 2);
|
||||
KeysetScrollPosition reversePosition = KeysetScrollPosition.of(scrollPosition.getKeys(), Direction.Backward);
|
||||
|
||||
window = template.scroll(q.with(reversePosition).limit(2), Person.class);
|
||||
window = template.scroll(q.with(scrollPosition.backward()).limit(2), Person.class);
|
||||
|
||||
assertThat(window).hasSize(2);
|
||||
assertThat(window).containsOnly(jane_42, john20);
|
||||
@@ -256,10 +252,10 @@ class MongoTemplateScrollTests {
|
||||
template.insertAll(Arrays.asList(one, two, three));
|
||||
|
||||
Query q = new Query(where("value").regex("v.*")).with(Sort.by(Sort.Direction.DESC, "value")).limit(2);
|
||||
q.with(KeysetScrollPosition.initial());
|
||||
q.with(ScrollPosition.keyset());
|
||||
|
||||
Window<T> window = template.query(WithRenamedField.class).as(resultType).matching(q)
|
||||
.scroll(KeysetScrollPosition.initial());
|
||||
.scroll(ScrollPosition.keyset());
|
||||
|
||||
assertThat(window.hasNext()).isTrue();
|
||||
assertThat(window.isLast()).isFalse();
|
||||
@@ -277,12 +273,12 @@ class MongoTemplateScrollTests {
|
||||
|
||||
static Stream<Arguments> positions() {
|
||||
|
||||
return Stream.of(args(KeysetScrollPosition.initial(), Person.class, Function.identity()), //
|
||||
args(KeysetScrollPosition.initial(), Document.class, MongoTemplateScrollTests::toDocument), //
|
||||
args(OffsetScrollPosition.initial(), Person.class, Function.identity()), //
|
||||
args(OffsetScrollPosition.initial(), PersonDtoProjection.class,
|
||||
return Stream.of(args(ScrollPosition.keyset(), Person.class, Function.identity()), //
|
||||
args(ScrollPosition.keyset(), Document.class, MongoTemplateScrollTests::toDocument), //
|
||||
args(ScrollPosition.offset(), Person.class, Function.identity()), //
|
||||
args(ScrollPosition.offset(), PersonDtoProjection.class,
|
||||
MongoTemplateScrollTests::toPersonDtoProjection), //
|
||||
args(OffsetScrollPosition.initial(), PersonInterfaceProjection.class,
|
||||
args(ScrollPosition.offset(), PersonInterfaceProjection.class,
|
||||
MongoTemplateScrollTests::toPersonInterfaceProjection, MongoTemplateScrollTests::compareProxies));
|
||||
}
|
||||
|
||||
|
||||
@@ -146,10 +146,10 @@ class ReactiveMongoTemplateScrollTests {
|
||||
template.insertAll(Arrays.asList(one, two, three)).as(StepVerifier::create).expectNextCount(3).verifyComplete();
|
||||
|
||||
Query q = new Query(where("value").regex("v.*")).with(Sort.by(Sort.Direction.DESC, "value")).limit(2);
|
||||
q.with(KeysetScrollPosition.initial());
|
||||
q.with(ScrollPosition.keyset());
|
||||
|
||||
Window<T> window = template.query(WithRenamedField.class).as(resultType).matching(q)
|
||||
.scroll(KeysetScrollPosition.initial()).block(Duration.ofSeconds(10));
|
||||
.scroll(ScrollPosition.keyset()).block(Duration.ofSeconds(10));
|
||||
|
||||
assertThat(window.hasNext()).isTrue();
|
||||
assertThat(window.isLast()).isFalse();
|
||||
@@ -167,9 +167,9 @@ class ReactiveMongoTemplateScrollTests {
|
||||
|
||||
static Stream<Arguments> positions() {
|
||||
|
||||
return Stream.of(args(KeysetScrollPosition.initial(), Person.class, Function.identity()), //
|
||||
args(KeysetScrollPosition.initial(), Document.class, MongoTemplateScrollTests::toDocument), //
|
||||
args(OffsetScrollPosition.initial(), Person.class, Function.identity()));
|
||||
return Stream.of(args(ScrollPosition.keyset(), Person.class, Function.identity()), //
|
||||
args(ScrollPosition.keyset(), Document.class, MongoTemplateScrollTests::toDocument), //
|
||||
args(ScrollPosition.offset(), Person.class, Function.identity()));
|
||||
}
|
||||
|
||||
static Stream<Arguments> renamedFieldProjectTargets() {
|
||||
|
||||
@@ -206,7 +206,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests implements Dirtie
|
||||
void appliesScrollPositionCorrectly() {
|
||||
|
||||
Window<Person> page = repository.findTop2ByLastnameLikeOrderByLastnameAscFirstnameAsc("*a*",
|
||||
KeysetScrollPosition.initial());
|
||||
ScrollPosition.keyset());
|
||||
|
||||
assertThat(page.isLast()).isFalse();
|
||||
assertThat(page.size()).isEqualTo(2);
|
||||
@@ -957,7 +957,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests implements Dirtie
|
||||
void shouldScrollPersonsWhenUsingQueryDslPerdicatedOnIdProperty() {
|
||||
|
||||
Window<Person> scroll = repository.findBy(person.id.in(asList(dave.id, carter.id, boyd.id)), //
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(KeysetScrollPosition.initial()));
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(ScrollPosition.keyset()));
|
||||
|
||||
assertThat(scroll).containsExactly(boyd, carter);
|
||||
|
||||
@@ -1187,7 +1187,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests implements Dirtie
|
||||
|
||||
Window<Person> result = repository.findBy(
|
||||
Example.of(sample, ExampleMatcher.matching().withMatcher("lastname", GenericPropertyMatcher::startsWith)),
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(KeysetScrollPosition.initial()));
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(ScrollPosition.keyset()));
|
||||
|
||||
assertThat(result).containsOnly(dave, leroi);
|
||||
assertThat(result.hasNext()).isTrue();
|
||||
|
||||
@@ -16,11 +16,12 @@
|
||||
package org.springframework.data.mongodb.repository;
|
||||
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.springframework.data.domain.Sort.Direction.*;
|
||||
import static org.springframework.data.mongodb.core.query.Criteria.*;
|
||||
import static org.springframework.data.mongodb.core.query.Query.*;
|
||||
import static org.springframework.data.mongodb.test.util.Assertions.assertThat;
|
||||
import static org.springframework.data.mongodb.test.util.DirtiesStateExtension.*;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
@@ -47,7 +48,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.dao.IncorrectResultSizeDataAccessException;
|
||||
import org.springframework.data.domain.KeysetScrollPosition;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.ScrollPosition;
|
||||
@@ -69,6 +69,8 @@ import org.springframework.data.mongodb.repository.Person.Sex;
|
||||
import org.springframework.data.mongodb.repository.support.ReactiveMongoRepositoryFactory;
|
||||
import org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository;
|
||||
import org.springframework.data.mongodb.test.util.DirtiesStateExtension;
|
||||
import org.springframework.data.mongodb.test.util.DirtiesStateExtension.DirtiesState;
|
||||
import org.springframework.data.mongodb.test.util.DirtiesStateExtension.ProvidesState;
|
||||
import org.springframework.data.mongodb.test.util.EnableIfMongoServerVersion;
|
||||
import org.springframework.data.mongodb.test.util.ReactiveMongoClientClosingTestConfiguration;
|
||||
import org.springframework.data.querydsl.ReactiveQuerydslPredicateExecutor;
|
||||
@@ -294,7 +296,7 @@ class ReactiveMongoRepositoryTests implements DirtiesStateExtension.StateFunctio
|
||||
void appliesScrollingCorrectly() {
|
||||
|
||||
Window<Person> scroll = repository
|
||||
.findTop2ByLastnameLikeOrderByFirstnameAscLastnameAsc("*", KeysetScrollPosition.initial()).block();
|
||||
.findTop2ByLastnameLikeOrderByFirstnameAscLastnameAsc("*", ScrollPosition.keyset()).block();
|
||||
|
||||
assertThat(scroll).hasSize(2);
|
||||
assertThat(scroll).containsSequence(alicia, boyd);
|
||||
@@ -476,7 +478,7 @@ class ReactiveMongoRepositoryTests implements DirtiesStateExtension.StateFunctio
|
||||
|
||||
List<Window<Person>> capture = new ArrayList<>();
|
||||
repository.findBy(person.id.in(Arrays.asList(dave.id, carter.id, boyd.id)), //
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(KeysetScrollPosition.initial())) //
|
||||
q -> q.limit(2).sortBy(Sort.by("firstname")).scroll(ScrollPosition.keyset())) //
|
||||
.as(StepVerifier::create) //
|
||||
.recordWith(() -> capture).assertNext(actual -> {
|
||||
assertThat(actual).hasSize(2).containsExactly(boyd, carter);
|
||||
|
||||
Reference in New Issue
Block a user