diff --git a/src/main/java/org/springframework/data/support/WindowIterator.java b/src/main/java/org/springframework/data/support/WindowIterator.java index 9e80bccd8..7af2a9ae3 100644 --- a/src/main/java/org/springframework/data/support/WindowIterator.java +++ b/src/main/java/org/springframework/data/support/WindowIterator.java @@ -15,6 +15,7 @@ */ package org.springframework.data.support; +import java.util.Collections; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.function.Function; @@ -81,7 +82,9 @@ public class WindowIterator implements Iterator { if (currentIterator == null) { if (currentWindow != null) { - currentIterator = currentWindow.iterator(); + currentIterator = isBackwardsScrolling(currentPosition) + ? currentWindow.stream().sorted(Collections.reverseOrder()).iterator() + : currentWindow.iterator(); } } @@ -116,15 +119,17 @@ public class WindowIterator implements Iterator { private static ScrollPosition getNextPosition(ScrollPosition currentPosition, Window window) { - if (currentPosition instanceof KeysetScrollPosition ksp) { - if (ksp.scrollsBackward()) { - return window.positionAt(0); - } + if (isBackwardsScrolling(currentPosition)) { + return window.positionAt(0); } return window.positionAt(window.size() - 1); } + private static boolean isBackwardsScrolling(ScrollPosition position) { + return position instanceof KeysetScrollPosition ksp ? ksp.scrollsBackward() : false; + } + /** * Builder API to construct a {@link WindowIterator}. * diff --git a/src/test/java/org/springframework/data/domain/WindowIteratorUnitTests.java b/src/test/java/org/springframework/data/domain/WindowIteratorUnitTests.java index 3f97ce84e..732d5bcf0 100644 --- a/src/test/java/org/springframework/data/domain/WindowIteratorUnitTests.java +++ b/src/test/java/org/springframework/data/domain/WindowIteratorUnitTests.java @@ -131,7 +131,7 @@ class WindowIteratorUnitTests { assertThat(capturedResult).containsExactly("a", "b", "c", "d"); } - @Test // GH-2151 + @Test // GH-2151, GH-2857 void considersBackwardKeysetScrolling() { Window initial = Window.from(List.of("c", "d"), @@ -152,6 +152,6 @@ class WindowIteratorUnitTests { }).startingAt(ScrollPosition.keyset().backward()); List items = Streamable.of(() -> iterator).toList(); - assertThat(items).containsExactly("c", "d", "a", "b"); + assertThat(items).containsExactly("d", "c", "b", "a"); } }