WindowIterator should emit items in order when scrolling backwards.

Closes #2857
Original pull request: #2858
This commit is contained in:
Christoph Strobl
2023-06-16 08:13:22 +02:00
committed by Mark Paluch
parent 8aff631032
commit d1568198d8
2 changed files with 12 additions and 7 deletions

View File

@@ -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<T> implements Iterator<T> {
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<T> implements Iterator<T> {
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}.
*