Adapt to ScrollPosition API changes in Spring Data Commons.

Fixes #4377.
Related ticket: #2824.
This commit is contained in:
Oliver Drotbohm
2023-04-27 19:42:27 +02:00
parent 3a99d4c29a
commit 83958ba316
5 changed files with 32 additions and 34 deletions

View File

@@ -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;

View File

@@ -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));
}

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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);