Skip to content

Commit 257c9e2

Browse files
committed
Adopt to changes in Spring Data Commons.
OffsetScrollPosition is now 0-based instead of 1-based. We differentiate between ScrollPosition.offset() as initial position and ScrollPosition.offset(0) pointing to the first returned element. Closes #2890
1 parent c5d4be6 commit 257c9e2

File tree

9 files changed

+18
-16
lines changed

9 files changed

+18
-16
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,9 @@ private QueryFragments createQueryFragments(@Nullable Condition condition, Sort
244244

245245
queryFragments.setRequiresReverseSort(keysetScrollPosition.scrollsBackward());
246246
} else if (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) {
247-
queryFragments.setSkip(offsetScrollPosition.getOffset());
247+
if (!offsetScrollPosition.isInitial()) {
248+
queryFragments.setSkip(offsetScrollPosition.getOffset() + 1);
249+
}
248250
queryFragments.setLimit(limitModifier.apply(pagingParameter.isUnpaged() ? maxResults.intValue() : pagingParameter.getPageSize()));
249251
}
250252

Diff for: src/main/java/org/springframework/data/neo4j/repository/query/FetchableFluentQueryByExample.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public Window<R> scroll(ScrollPosition scrollPosition) {
170170

171171
var skip = scrollPosition.isInitial()
172172
? 0
173-
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset()
173+
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset() + 1
174174
: 0;
175175

176176
Condition condition = scrollPosition instanceof KeysetScrollPosition keysetScrollPosition

Diff for: src/main/java/org/springframework/data/neo4j/repository/query/FluentQuerySupport.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ final Window<R> scroll(ScrollPosition scrollPosition, List<R> rawResult, Neo4jPe
9090

9191
var skip = scrollPosition.isInitial()
9292
? 0
93-
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset()
93+
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset() + 1
9494
: 0;
9595

9696
var scrollDirection = scrollPosition instanceof KeysetScrollPosition keysetScrollPosition ? keysetScrollPosition.getDirection() : ScrollPosition.Direction.FORWARD;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ final Window<?> createWindow(ResultProcessor resultProcessor, boolean incrementL
295295

296296
return Window.from(getSubList(rawResult, limit, scrollDirection), v -> {
297297
if (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) {
298-
return offsetScrollPosition.advanceBy(v + limit);
298+
return offsetScrollPosition.advanceBy(v);
299299
} else {
300300
var accessor = neo4jPersistentEntity.getPropertyAccessor(rawResult.get(v));
301301
var keys = new LinkedHashMap<String, Object>();

Diff for: src/main/java/org/springframework/data/neo4j/repository/query/QueryFragmentsAndParameters.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ static QueryFragmentsAndParameters forConditionWithScrollPosition(Neo4jPersisten
273273
if (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) {
274274
skip = offsetScrollPosition.isInitial()
275275
? 0
276-
: offsetScrollPosition.getOffset();
276+
: offsetScrollPosition.getOffset() + 1;
277277

278278
return forCondition(entityMetaData, condition, null, sort, null, limit, skip, includeField);
279279
}

Diff for: src/main/java/org/springframework/data/neo4j/repository/query/ReactiveFluentQueryByExample.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public Mono<Window<R>> scroll(ScrollPosition scrollPosition) {
171171

172172
var skip = scrollPosition.isInitial()
173173
? 0
174-
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset()
174+
: (scrollPosition instanceof OffsetScrollPosition offsetScrollPosition) ? offsetScrollPosition.getOffset() + 1
175175
: 0;
176176

177177
Condition condition = scrollPosition instanceof KeysetScrollPosition keysetScrollPosition

Diff for: src/test/java/org/springframework/data/neo4j/integration/imperative/QuerydslNeo4jPredicateExecutorIT.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,15 @@ void scrollByExampleWithNoOffset(@Autowired QueryDSLPersonRepository repository)
137137
Predicate predicate = Expressions.predicate(Ops.EQ, firstNamePath, Expressions.asString("Helge"))
138138
.or(Expressions.predicate(Ops.EQ, lastNamePath, Expressions.asString("B.")));
139139

140-
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(0)));
140+
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset()));
141141

142142
assertThat(peopleWindow.getContent()).extracting(Person::getFirstName)
143143
.containsExactlyInAnyOrder("Helge");
144144

145145
assertThat(peopleWindow.isLast()).isFalse();
146146
assertThat(peopleWindow.hasNext()).isTrue();
147147

148-
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(1));
148+
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(0));
149149
}
150150

151151
@Test
@@ -154,14 +154,14 @@ void scrollByExampleWithOffset(@Autowired QueryDSLPersonRepository repository) {
154154
Predicate predicate = Expressions.predicate(Ops.EQ, firstNamePath, Expressions.asString("Helge"))
155155
.or(Expressions.predicate(Ops.EQ, lastNamePath, Expressions.asString("B.")));
156156

157-
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(1)));
157+
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(0)));
158158

159159
assertThat(peopleWindow.getContent()).extracting(Person::getFirstName)
160160
.containsExactlyInAnyOrder("Bela");
161161

162162
assertThat(peopleWindow.isLast()).isTrue();
163163

164-
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(2));
164+
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(1));
165165
}
166166

167167
@Test
@@ -170,7 +170,7 @@ void scrollByExampleWithContinuingOffset(@Autowired QueryDSLPersonRepository rep
170170
Predicate predicate = Expressions.predicate(Ops.EQ, firstNamePath, Expressions.asString("Helge"))
171171
.or(Expressions.predicate(Ops.EQ, lastNamePath, Expressions.asString("B.")));
172172

173-
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(0)));
173+
Window<Person> peopleWindow = repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset()));
174174
ScrollPosition currentPosition = peopleWindow.positionAt(peopleWindow.getContent().get(0));
175175
peopleWindow = repository.findBy(predicate, q -> q.limit(1).scroll(currentPosition));
176176

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2923,7 +2923,7 @@ void scrollByExample(@Autowired PersonRepository repository) {
29232923

29242924
Example<PersonWithAllConstructor> example = Example.of(sameValuePerson,
29252925
ExampleMatcher.matchingAll().withIgnoreNullValues());
2926-
Window<PersonWithAllConstructor> person = repository.findBy(example, q -> q.sortBy(Sort.by("name")).limit(1).scroll(ScrollPosition.offset(0)));
2926+
Window<PersonWithAllConstructor> person = repository.findBy(example, q -> q.sortBy(Sort.by("name")).limit(1).scroll(ScrollPosition.offset()));
29272927

29282928
assertThat(person).isNotNull();
29292929
assertThat(person.getContent().get(0)).isEqualTo(person1);

Diff for: src/test/java/org/springframework/data/neo4j/integration/reactive/ReactiveQuerydslNeo4jPredicateExecutorIT.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ void scrollByExampleWithNoOffset(@Autowired QueryDSLPersonRepository repository)
196196
Predicate predicate = Expressions.predicate(Ops.EQ, firstNamePath, Expressions.asString("Helge"))
197197
.or(Expressions.predicate(Ops.EQ, lastNamePath, Expressions.asString("B.")));
198198

199-
repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(0)))
199+
repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset()))
200200
.as(StepVerifier::create)
201201
.expectNextMatches(peopleWindow -> {
202202

@@ -206,7 +206,7 @@ void scrollByExampleWithNoOffset(@Autowired QueryDSLPersonRepository repository)
206206
assertThat(peopleWindow.isLast()).isFalse();
207207
assertThat(peopleWindow.hasNext()).isTrue();
208208

209-
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(1));
209+
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(0));
210210
return true;
211211
}).verifyComplete();
212212
}
@@ -217,14 +217,14 @@ void scrollByExampleWithOffset(@Autowired QueryDSLPersonRepository repository) {
217217
Predicate predicate = Expressions.predicate(Ops.EQ, firstNamePath, Expressions.asString("Helge"))
218218
.or(Expressions.predicate(Ops.EQ, lastNamePath, Expressions.asString("B.")));
219219

220-
repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(1)))
220+
repository.findBy(predicate, q -> q.limit(1).sortBy(Sort.by("firstName").descending()).scroll(ScrollPosition.offset(0)))
221221
.as(StepVerifier::create)
222222
.expectNextMatches(peopleWindow -> {
223223
assertThat(peopleWindow.getContent()).extracting(Person::getFirstName)
224224
.containsExactlyInAnyOrder("Bela");
225225

226226
assertThat(peopleWindow.isLast()).isTrue();
227-
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(2));
227+
assertThat(peopleWindow.positionAt(peopleWindow.getContent().get(0))).isEqualTo(ScrollPosition.offset(1));
228228
return true;
229229
}).verifyComplete();
230230
}

0 commit comments

Comments
 (0)