Skip to content

Commit e0b64de

Browse files
committed
Polishing.
Fix also offset scroll position.
1 parent 821349b commit e0b64de

File tree

8 files changed

+49
-17
lines changed

8 files changed

+49
-17
lines changed

src/main/java/org/springframework/data/domain/KeysetScrollPosition.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* @author Mark Paluch
3030
* @since 3.1
3131
*/
32-
public class KeysetScrollPosition implements ScrollPosition {
32+
public final class KeysetScrollPosition implements ScrollPosition {
3333

3434
private static final KeysetScrollPosition initial = new KeysetScrollPosition(Collections.emptyMap(),
3535
Direction.Forward);

src/main/java/org/springframework/data/domain/OffsetScrollPosition.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.function.IntFunction;
1919

20+
import org.springframework.util.Assert;
2021
import org.springframework.util.ObjectUtils;
2122

2223
/**
@@ -25,7 +26,7 @@
2526
* @author Mark Paluch
2627
* @since 3.1
2728
*/
28-
public class OffsetScrollPosition implements ScrollPosition {
29+
public final class OffsetScrollPosition implements ScrollPosition {
2930

3031
private static final OffsetScrollPosition initial = new OffsetScrollPosition(0);
3132

@@ -60,18 +61,16 @@ public static OffsetScrollPosition of(long offset) {
6061
}
6162

6263
/**
63-
* Returns the {@link IntFunction position function} to calculate
64+
* Returns the {@link IntFunction position function} to calculate.
6465
*
65-
* @return
66+
* @param startOffset the start offset to be used. Must not be negative.
67+
* @return the offset-based position function.
6668
*/
6769
public static IntFunction<OffsetScrollPosition> positionFunction(long startOffset) {
68-
return offset -> {
69-
if (offset < 0) {
70-
throw new IndexOutOfBoundsException(offset);
71-
}
7270

73-
return of(offset);
74-
};
71+
Assert.isTrue(startOffset >= 0, "Start offset must not be negative");
72+
73+
return startOffset == 0 ? OffsetPositionFunction.ZERO : new OffsetPositionFunction(startOffset);
7574
}
7675

7776
@Override
@@ -110,4 +109,19 @@ public int hashCode() {
110109
public String toString() {
111110
return String.format("OffsetScrollPosition [%s]", offset);
112111
}
112+
113+
private record OffsetPositionFunction(long startOffset) implements IntFunction<OffsetScrollPosition> {
114+
115+
static final OffsetPositionFunction ZERO = new OffsetPositionFunction(0);
116+
117+
@Override
118+
public OffsetScrollPosition apply(int offset) {
119+
120+
if (offset < 0) {
121+
throw new IndexOutOfBoundsException(offset);
122+
}
123+
124+
return of(startOffset + offset + 1);
125+
}
126+
}
113127
}

src/main/java/org/springframework/data/domain/ScrollImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,6 @@ public int hashCode() {
114114

115115
@Override
116116
public String toString() {
117-
return "CursorWindow " + items;
117+
return "Scroll " + items;
118118
}
119119
}

src/main/java/org/springframework/data/repository/query/ParametersParameterAccessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ protected Object[] getValues() {
9696
public ScrollPosition getScrollPosition() {
9797

9898
if (!parameters.hasScrollPositionParameter()) {
99+
100+
Pageable pageable = getPageable();
101+
if (pageable.isPaged()) {
102+
return pageable.toScrollPosition();
103+
}
104+
99105
return null;
100106
}
101107

src/main/java/org/springframework/data/repository/query/QueryMethod.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ public QueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory
109109
}
110110

111111
if (isScrollQuery()) {
112-
Assert.isTrue(this.parameters.hasScrollPositionParameter(),
112+
113+
Assert.isTrue(this.parameters.hasScrollPositionParameter() || this.parameters.hasPageableParameter(),
113114
String.format("Scroll query needs to have a ScrollPosition parameter; Offending method: %s", method));
114115
}
115116

src/test/java/org/springframework/data/domain/KeysetScrollPositionUnitTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void equalsAndHashCode() {
3535
KeysetScrollPosition foo1 = KeysetScrollPosition.of(Collections.singletonMap("k", "v"));
3636
KeysetScrollPosition foo2 = KeysetScrollPosition.of(Collections.singletonMap("k", "v"));
3737
KeysetScrollPosition bar = KeysetScrollPosition.of(Collections.singletonMap("k", "v"), Direction.Backward);
38-
System.out.println(bar);
38+
3939
assertThat(foo1).isEqualTo(foo2).hasSameClassAs(foo2);
4040
assertThat(foo1).isNotEqualTo(bar).doesNotHaveSameHashCodeAs(bar);
4141
}

src/test/java/org/springframework/data/domain/OffsetScrollPositionUnitTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.domain;
1717

1818
import static org.assertj.core.api.Assertions.*;
19+
import static org.springframework.data.domain.OffsetScrollPosition.*;
1920

2021
import org.junit.jupiter.api.Test;
2122

@@ -36,4 +37,14 @@ void equalsAndHashCode() {
3637
assertThat(foo1).isEqualTo(foo2).hasSameClassAs(foo2);
3738
assertThat(foo1).isNotEqualTo(bar).doesNotHaveSameHashCodeAs(bar);
3839
}
40+
41+
@Test // GH-2151
42+
void shouldCreateCorrectIndexPosition() {
43+
44+
assertThat(positionFunction(0).apply(0)).isEqualTo(OffsetScrollPosition.of(1));
45+
assertThat(positionFunction(0).apply(1)).isEqualTo(OffsetScrollPosition.of(2));
46+
47+
assertThat(positionFunction(100).apply(0)).isEqualTo(OffsetScrollPosition.of(101));
48+
assertThat(positionFunction(100).apply(1)).isEqualTo(OffsetScrollPosition.of(102));
49+
}
3950
}

src/test/java/org/springframework/data/domain/ScrollUnitTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ void shouldCreateCorrectPositions() {
5757

5858
Scroll<Integer> scroll = Scroll.from(List.of(1, 2, 3), OffsetScrollPosition.positionFunction(0));
5959

60-
assertThat(scroll.firstPosition()).isEqualTo(OffsetScrollPosition.initial());
61-
assertThat(scroll.lastPosition()).isEqualTo(OffsetScrollPosition.of(2));
60+
assertThat(scroll.firstPosition()).isEqualTo(OffsetScrollPosition.of(1));
61+
assertThat(scroll.lastPosition()).isEqualTo(OffsetScrollPosition.of(3));
6262

6363
// by index
64-
assertThat(scroll.positionAt(1)).isEqualTo(OffsetScrollPosition.of(1));
64+
assertThat(scroll.positionAt(1)).isEqualTo(OffsetScrollPosition.of(2));
6565

6666
// by object
67-
assertThat(scroll.positionAt(Integer.valueOf(1))).isEqualTo(OffsetScrollPosition.of(0));
67+
assertThat(scroll.positionAt(Integer.valueOf(1))).isEqualTo(OffsetScrollPosition.of(1));
6868
}
6969
}

0 commit comments

Comments
 (0)