Skip to content

Commit eee7f09

Browse files
committed
Refine hasPrevious/hasNext for keyset scrolling
Closes gh-843
1 parent 966276c commit eee7f09

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/query/WindowConnectionAdapter.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.Collection;
2020

21+
import org.springframework.data.domain.KeysetScrollPosition;
2122
import org.springframework.data.domain.ScrollPosition;
2223
import org.springframework.data.domain.Window;
2324
import org.springframework.graphql.data.pagination.ConnectionAdapter;
@@ -53,12 +54,31 @@ public <T> Collection<T> getContent(Object container) {
5354
@Override
5455
public boolean hasPrevious(Object container) {
5556
Window<?> window = window(container);
56-
return (window.size() > 0 && !window.positionAt(0).isInitial());
57+
if (!window.isEmpty()) {
58+
ScrollPosition position = window.positionAt(0);
59+
if (position instanceof KeysetScrollPosition keysetPosition) {
60+
return (keysetPosition.scrollsBackward() && window.hasNext());
61+
}
62+
else {
63+
return !position.isInitial();
64+
}
65+
}
66+
return false;
5767
}
5868

5969
@Override
6070
public boolean hasNext(Object container) {
61-
return window(container).hasNext();
71+
Window<?> window = window(container);
72+
if (!window.isEmpty()) {
73+
ScrollPosition pos = window.positionAt(0);
74+
if (pos instanceof KeysetScrollPosition keysetPos) {
75+
return (keysetPos.scrollsForward() && window.hasNext());
76+
}
77+
else {
78+
return window.hasNext();
79+
}
80+
}
81+
return false;
6282
}
6383

6484
@Override

spring-graphql/src/test/java/org/springframework/graphql/data/query/WindowConnectionAdapterTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.graphql.data.query;
1818

19+
import java.util.Collections;
1920
import java.util.List;
2021

2122
import org.junit.jupiter.api.Test;
@@ -60,4 +61,28 @@ void unpaged() {
6061
assertThat(this.adapter.cursorAt(window, 3)).isEqualTo("O_3");
6162
}
6263

64+
@Test
65+
void hasNextPreviousWithKeysetScrollForward() {
66+
67+
Window<Book> window = Window.from(
68+
BookSource.books(),
69+
index -> ScrollPosition.of(Collections.singletonMap("id", index), ScrollPosition.Direction.FORWARD),
70+
true);
71+
72+
assertThat(this.adapter.hasPrevious(window)).isFalse();
73+
assertThat(this.adapter.hasNext(window)).isEqualTo(true);
74+
}
75+
76+
@Test
77+
void hasNextPreviousWithKeysetScrollBackward() {
78+
79+
Window<Book> window = Window.from(
80+
BookSource.books(),
81+
index -> ScrollPosition.of(Collections.singletonMap("id", index), ScrollPosition.Direction.BACKWARD),
82+
true);
83+
84+
assertThat(this.adapter.hasPrevious(window)).isEqualTo(true);
85+
assertThat(this.adapter.hasNext(window)).isFalse();
86+
}
87+
6388
}

0 commit comments

Comments
 (0)