Skip to content

Commit 2443f22

Browse files
committed
Adapt to ScrollPosition API changes in Spring Data Commons.
Fixes #2714. Related ticket: #2824.
1 parent 51ac921 commit 2443f22

File tree

7 files changed

+28
-25
lines changed

7 files changed

+28
-25
lines changed

src/main/java/org/springframework/data/neo4j/repository/query/CypherAdapterUtils.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.neo4j.driver.Value;
3838
import org.springframework.data.domain.KeysetScrollPosition;
3939
import org.springframework.data.domain.Pageable;
40+
import org.springframework.data.domain.ScrollPosition.Direction;
4041
import org.springframework.data.domain.Sort;
4142
import org.springframework.data.neo4j.core.mapping.Constants;
4243
import org.springframework.data.neo4j.core.mapping.Neo4jPersistentEntity;
@@ -141,7 +142,7 @@ record PropertyAndOrder(Neo4jPersistentProperty property, Sort.Order order) {
141142
var scrollDirection = scrollPosition.getDirection();
142143
if (Constants.NAME_OF_ADDITIONAL_SORT.equals(k)) {
143144
expression = entity.getIdExpression();
144-
var comparatorFunction = getComparatorFunction(scrollDirection == KeysetScrollPosition.Direction.Forward ? Sort.Direction.ASC : Sort.Direction.DESC, scrollDirection);
145+
var comparatorFunction = getComparatorFunction(scrollPosition.scrollsForward() ? Sort.Direction.ASC : Sort.Direction.DESC, scrollDirection);
145146
allEqualsWithArtificialSort = allEqualsWithArtificialSort.and(comparatorFunction.apply(expression, parameter));
146147
} else {
147148
var p = propertyAndDirection.get(k);
@@ -157,7 +158,7 @@ record PropertyAndOrder(Neo4jPersistentProperty property, Sort.Order order) {
157158
}
158159

159160
private static BiFunction<Expression, Expression, Condition> getComparatorFunction(Sort.Direction sortDirection, KeysetScrollPosition.Direction scrollDirection) {
160-
if (scrollDirection == KeysetScrollPosition.Direction.Backward) {
161+
if (scrollDirection == Direction.BACKWARD) {
161162
return sortDirection.isAscending() ? Expression::lte : Expression::gte;
162163
}
163164
return sortDirection.isAscending() ? Expression::gt : Expression::lt;

src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ private QueryFragments createQueryFragments(@Nullable Condition condition, Sort
242242
conditionFragment = conditionFragment.and(CypherAdapterUtils.combineKeysetIntoCondition(entity, keysetScrollPosition, theSort));
243243
}
244244

245-
queryFragments.setRequiresReverseSort(keysetScrollPosition.getDirection() == KeysetScrollPosition.Direction.Backward);
245+
queryFragments.setRequiresReverseSort(keysetScrollPosition.scrollsBackward());
246246
} else if (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) {
247247
queryFragments.setSkip(offsetScrollPosition.getOffset());
248248
queryFragments.setLimit(limitModifier.apply(pagingParameter.isUnpaged() ? maxResults.intValue() : pagingParameter.getPageSize()));

src/main/java/org/springframework/data/neo4j/repository/query/Neo4jQuerySupport.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.springframework.data.domain.KeysetScrollPosition;
4242
import org.springframework.data.domain.OffsetScrollPosition;
4343
import org.springframework.data.domain.Range;
44+
import org.springframework.data.domain.ScrollPosition;
45+
import org.springframework.data.domain.ScrollPosition.Direction;
4446
import org.springframework.data.domain.Window;
4547
import org.springframework.data.geo.Box;
4648
import org.springframework.data.geo.Circle;
@@ -282,14 +284,14 @@ final Window<?> createWindow(ResultProcessor resultProcessor, boolean incrementL
282284
var conversionService = mappingContext.getConversionService();
283285
var scrollPosition = parameterAccessor.getScrollPosition();
284286

285-
var scrollDirection = scrollPosition instanceof KeysetScrollPosition keysetScrollPosition ? keysetScrollPosition.getDirection() : KeysetScrollPosition.Direction.Forward;
286-
if (scrollDirection == KeysetScrollPosition.Direction.Backward) {
287+
var scrollDirection = scrollPosition instanceof KeysetScrollPosition keysetScrollPosition ? keysetScrollPosition.getDirection() : Direction.FORWARD;
288+
if (scrollDirection == Direction.BACKWARD) {
287289
Collections.reverse(rawResult);
288290
}
289291

290292
return Window.from(getSubList(rawResult, limit, scrollDirection), v -> {
291293
if (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) {
292-
return OffsetScrollPosition.of(offsetScrollPosition.getOffset() + v + limit);
294+
return offsetScrollPosition.advanceBy(v + limit);
293295
} else {
294296
var accessor = neo4jPersistentEntity.getPropertyAccessor(rawResult.get(v));
295297
var keys = new LinkedHashMap<String, Object>();
@@ -299,7 +301,7 @@ final Window<?> createWindow(ResultProcessor resultProcessor, boolean incrementL
299301
keys.put(persistentProperty.getPropertyName(), conversionService.convert(accessor.getProperty(persistentProperty), Value.class));
300302
});
301303
keys.put(Constants.NAME_OF_ADDITIONAL_SORT, conversionService.convert(accessor.getProperty(neo4jPersistentEntity.getRequiredIdProperty()), Value.class));
302-
return KeysetScrollPosition.of(keys);
304+
return ScrollPosition.forward(keys);
303305
}
304306
}, hasMoreElements(rawResult, limit));
305307
}
@@ -308,10 +310,10 @@ private static boolean hasMoreElements(List<?> result, int limit) {
308310
return !result.isEmpty() && result.size() > limit;
309311
}
310312

311-
private static <T> List<T> getSubList(List<T> result, int limit, KeysetScrollPosition.Direction scrollDirection) {
313+
private static <T> List<T> getSubList(List<T> result, int limit, Direction scrollDirection) {
312314

313315
if (limit > 0 && result.size() > limit) {
314-
return scrollDirection == KeysetScrollPosition.Direction.Forward ? result.subList(0, limit) : result.subList(1, limit + 1);
316+
return scrollDirection == Direction.FORWARD ? result.subList(0, limit) : result.subList(1, limit + 1);
315317
}
316318

317319
return result;

src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@
7575
import org.springframework.data.domain.Example;
7676
import org.springframework.data.domain.ExampleMatcher;
7777
import org.springframework.data.domain.ExampleMatcher.StringMatcher;
78-
import org.springframework.data.domain.KeysetScrollPosition;
79-
import org.springframework.data.domain.OffsetScrollPosition;
8078
import org.springframework.data.domain.Page;
8179
import org.springframework.data.domain.PageRequest;
8280
import org.springframework.data.domain.Pageable;
@@ -85,7 +83,6 @@
8583
import org.springframework.data.domain.ScrollPosition;
8684
import org.springframework.data.domain.Slice;
8785
import org.springframework.data.domain.Sort;
88-
import org.springframework.data.domain.WindowIterator;
8986
import org.springframework.data.geo.Box;
9087
import org.springframework.data.geo.Circle;
9188
import org.springframework.data.geo.Distance;
@@ -168,6 +165,7 @@
168165
import org.springframework.data.neo4j.types.GeographicPoint2d;
169166
import org.springframework.data.repository.query.FluentQuery;
170167
import org.springframework.data.repository.query.Param;
168+
import org.springframework.data.support.WindowIterator;
171169
import org.springframework.test.annotation.DirtiesContext;
172170
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
173171
import org.springframework.transaction.PlatformTransactionManager;
@@ -272,7 +270,7 @@ void findAll(@Autowired PersonRepository repository) {
272270
}
273271

274272
static Stream<Arguments> basicScrollSupportFor(@Autowired PersonRepository repository) {
275-
return Stream.of(Arguments.of(repository, KeysetScrollPosition.initial()), Arguments.of(repository, OffsetScrollPosition.initial()));
273+
return Stream.of(Arguments.of(repository, ScrollPosition.keyset()), Arguments.of(repository, ScrollPosition.offset()));
276274
}
277275

278276
@ParameterizedTest(name = "basicScrollSupportFor {1}")

src/test/java/org/springframework/data/neo4j/integration/imperative/ScrollingIT.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.springframework.context.annotation.Bean;
3131
import org.springframework.context.annotation.Configuration;
3232
import org.springframework.data.domain.KeysetScrollPosition;
33-
import org.springframework.data.domain.WindowIterator;
33+
import org.springframework.data.domain.ScrollPosition;
3434
import org.springframework.data.neo4j.core.DatabaseSelectionProvider;
3535
import org.springframework.data.neo4j.core.mapping.Constants;
3636
import org.springframework.data.neo4j.core.transaction.Neo4jBookmarkManager;
@@ -42,6 +42,7 @@
4242
import org.springframework.data.neo4j.test.Neo4jExtension;
4343
import org.springframework.data.neo4j.test.Neo4jImperativeTestConfiguration;
4444
import org.springframework.data.neo4j.test.Neo4jIntegrationTest;
45+
import org.springframework.data.support.WindowIterator;
4546
import org.springframework.transaction.PlatformTransactionManager;
4647
import org.springframework.transaction.annotation.EnableTransactionManagement;
4748

@@ -82,7 +83,7 @@ void forwardWithDuplicatesManualIteration(@Autowired ScrollingRepository reposit
8283
var duplicates = repository.findAllByAOrderById("D0");
8384
assertThat(duplicates).hasSize(2);
8485

85-
var window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, KeysetScrollPosition.initial());
86+
var window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, ScrollPosition.keyset());
8687
assertThat(window.hasNext()).isTrue();
8788
assertThat(window)
8889
.hasSize(4)
@@ -110,7 +111,7 @@ void forwardWithDuplicatesManualIteration(@Autowired ScrollingRepository reposit
110111
void forwardWithDuplicatesIteratorIteration(@Autowired ScrollingRepository repository) {
111112

112113
var it = WindowIterator.of(pos -> repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, pos))
113-
.startingAt(KeysetScrollPosition.initial());
114+
.startingAt(ScrollPosition.keyset());
114115
var content = new ArrayList<ScrollingEntity>();
115116
while (it.hasNext()) {
116117
var next = it.next();
@@ -136,15 +137,15 @@ void backwardWithDuplicatesManualIteration(@Autowired ScrollingRepository reposi
136137
var duplicates = repository.findAllByAOrderById("D0");
137138
assertThat(duplicates).hasSize(2);
138139

139-
var window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, KeysetScrollPosition.of(keys, KeysetScrollPosition.Direction.Backward));
140+
var window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, ScrollPosition.backward(keys));
140141
assertThat(window.hasNext()).isTrue();
141142
assertThat(window)
142143
.hasSize(4)
143144
.extracting(ScrollingEntity::getA)
144145
.containsExactly("F0", "G0", "H0", "I0");
145146

146147
var pos = ((KeysetScrollPosition) window.positionAt(0));
147-
pos = KeysetScrollPosition.of(pos.getKeys(), KeysetScrollPosition.Direction.Backward);
148+
pos = ScrollPosition.backward(pos.getKeys());
148149
window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, pos);
149150
assertThat(window.hasNext()).isTrue();
150151
assertThat(window)
@@ -154,7 +155,7 @@ void backwardWithDuplicatesManualIteration(@Autowired ScrollingRepository reposi
154155
.containsExactly("C0", "D0", "D0", "E0");
155156

156157
pos = ((KeysetScrollPosition) window.positionAt(0));
157-
pos = KeysetScrollPosition.of(pos.getKeys(), KeysetScrollPosition.Direction.Backward);
158+
pos = ScrollPosition.backward(pos.getKeys());
158159
window = repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, pos);
159160
assertThat(window.isLast()).isTrue();
160161
assertThat(window).extracting(ScrollingEntity::getA)

src/test/java/org/springframework/data/neo4j/integration/reactive/ReactiveScrollingIT.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Bean;
3232
import org.springframework.context.annotation.Configuration;
3333
import org.springframework.data.domain.KeysetScrollPosition;
34+
import org.springframework.data.domain.ScrollPosition;
3435
import org.springframework.data.domain.Window;
3536
import org.springframework.data.neo4j.core.ReactiveDatabaseSelectionProvider;
3637
import org.springframework.data.neo4j.core.mapping.Constants;
@@ -88,7 +89,7 @@ void forwardWithDuplicatesManualIteration(@Autowired ReactiveScrollingRepository
8889
.verifyComplete();
8990

9091
var windowContainer = new AtomicReference<Window<ScrollingEntity>>();
91-
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, KeysetScrollPosition.initial())
92+
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, ScrollPosition.keyset())
9293
.as(StepVerifier::create)
9394
.consumeNextWith(windowContainer::set)
9495
.verifyComplete();
@@ -142,7 +143,7 @@ void backwardWithDuplicatesManualIteration(@Autowired ReactiveScrollingRepositor
142143
.verifyComplete();
143144

144145
var windowContainer = new AtomicReference<Window<ScrollingEntity>>();
145-
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, KeysetScrollPosition.of(keys, KeysetScrollPosition.Direction.Backward))
146+
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, ScrollPosition.backward(keys))
146147
.as(StepVerifier::create)
147148
.consumeNextWith(windowContainer::set)
148149
.verifyComplete();
@@ -154,7 +155,7 @@ void backwardWithDuplicatesManualIteration(@Autowired ReactiveScrollingRepositor
154155
.containsExactly("F0", "G0", "H0", "I0");
155156

156157
var pos = ((KeysetScrollPosition) window.positionAt(0));
157-
pos = KeysetScrollPosition.of(pos.getKeys(), KeysetScrollPosition.Direction.Backward);
158+
pos = ScrollPosition.backward(pos.getKeys());
158159
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, pos)
159160
.as(StepVerifier::create)
160161
.consumeNextWith(windowContainer::set)
@@ -168,7 +169,7 @@ void backwardWithDuplicatesManualIteration(@Autowired ReactiveScrollingRepositor
168169
.containsExactly("C0", "D0", "D0", "E0");
169170

170171
pos = ((KeysetScrollPosition) window.positionAt(0));
171-
pos = KeysetScrollPosition.of(pos.getKeys(), KeysetScrollPosition.Direction.Backward);
172+
pos = ScrollPosition.backward(pos.getKeys());
172173
repository.findTop4By(ScrollingEntity.SORT_BY_B_AND_A, pos)
173174
.as(StepVerifier::create)
174175
.consumeNextWith(windowContainer::set)

src/test/java/org/springframework/data/neo4j/repository/query/CypherAdapterUtilsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import org.neo4j.cypherdsl.core.Cypher;
2525
import org.neo4j.cypherdsl.core.renderer.Configuration;
2626
import org.neo4j.cypherdsl.core.renderer.Renderer;
27-
import org.springframework.data.domain.KeysetScrollPosition;
27+
import org.springframework.data.domain.ScrollPosition;
2828
import org.springframework.data.domain.Sort;
2929
import org.springframework.data.neo4j.core.mapping.Constants;
3030
import org.springframework.data.neo4j.core.mapping.Neo4jMappingContext;
@@ -43,7 +43,7 @@ void shouldCombineSortKeysetProper() {
4343
var n = Constants.NAME_OF_TYPED_ROOT_NODE.apply(entity);
4444

4545
var condition = CypherAdapterUtils.combineKeysetIntoCondition(entity,
46-
KeysetScrollPosition.of(Map.of("foobar", "D0", "b", 3, "c", LocalDateTime.of(2023, 3, 19, 14, 21, 8, 716))),
46+
ScrollPosition.forward(Map.of("foobar", "D0", "b", 3, "c", LocalDateTime.of(2023, 3, 19, 14, 21, 8, 716))),
4747
Sort.by(Sort.Order.asc("b"), Sort.Order.desc("a"), Sort.Order.asc("c"))
4848
);
4949

0 commit comments

Comments
 (0)