Skip to content

Commit 3570e6a

Browse files
committed
Accept PagingState when creating CassandraScrollPosition and in Query.pagingState.
Closes #1585
1 parent ac57d0a commit 3570e6a

File tree

4 files changed

+52
-9
lines changed

4 files changed

+52
-9
lines changed

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/query/CassandraScrollPosition.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@
1818
import java.nio.ByteBuffer;
1919

2020
import org.springframework.data.cassandra.core.query.CassandraScrollPosition.Initial;
21-
import org.springframework.data.cassandra.core.query.CassandraScrollPosition.PagingState;
21+
import org.springframework.data.cassandra.core.query.CassandraScrollPosition.PagingScrollPosition;
2222
import org.springframework.data.domain.ScrollPosition;
2323
import org.springframework.util.Assert;
2424
import org.springframework.util.ObjectUtils;
2525

26+
import com.datastax.oss.driver.api.core.cql.PagingState;
27+
2628
/**
27-
* Cassandra-specific implementation of {@link ScrollPosition} using
28-
* {@link com.datastax.oss.driver.api.core.cql.PagingState}.
29+
* Cassandra-specific implementation of {@link ScrollPosition} using {@link PagingState}.
2930
*
3031
* @author Mark Paluch
3132
* @since 4.2
3233
*/
33-
public abstract sealed class CassandraScrollPosition implements ScrollPosition permits Initial,PagingState {
34+
public abstract sealed class CassandraScrollPosition implements ScrollPosition permits Initial, PagingScrollPosition {
3435

3536
/**
3637
* Returns an initial {@link CassandraScrollPosition}.
@@ -41,6 +42,19 @@ public static CassandraScrollPosition initial() {
4142
return Initial.INSTANCE;
4243
}
4344

45+
/**
46+
* Creates a continuation {@link CassandraScrollPosition} given {@link PagingScrollPosition}.
47+
*
48+
* @return a continuation {@link CassandraScrollPosition} given {@link PagingScrollPosition}.
49+
* @since 5.0
50+
*/
51+
public static CassandraScrollPosition of(PagingState pagingState) {
52+
53+
Assert.notNull(pagingState, "PagingState must not be null");
54+
55+
return of(pagingState.getRawPagingState());
56+
}
57+
4458
/**
4559
* Creates a continuation {@link CassandraScrollPosition} given {@code pagingState}.
4660
*
@@ -50,7 +64,7 @@ public static CassandraScrollPosition of(ByteBuffer pagingState) {
5064

5165
Assert.notNull(pagingState, "PagingState must not be null");
5266

53-
return new PagingState(pagingState);
67+
return new PagingScrollPosition(pagingState);
5468
}
5569

5670
/**
@@ -78,11 +92,11 @@ public ByteBuffer getPagingState() {
7892
}
7993
}
8094

81-
static final class PagingState extends CassandraScrollPosition {
95+
static final class PagingScrollPosition extends CassandraScrollPosition {
8296

8397
private final ByteBuffer pagingState;
8498

85-
PagingState(ByteBuffer pagingState) {
99+
PagingScrollPosition(ByteBuffer pagingState) {
86100
this.pagingState = pagingState;
87101
}
88102

@@ -103,7 +117,7 @@ public boolean equals(Object o) {
103117
if (o == null || getClass() != o.getClass())
104118
return false;
105119

106-
PagingState that = (PagingState) o;
120+
PagingScrollPosition that = (PagingScrollPosition) o;
107121

108122
return ObjectUtils.nullSafeEquals(pagingState, that.pagingState);
109123
}

spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/query/Query.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.stream.StreamSupport;
2828

2929
import org.jspecify.annotations.Nullable;
30+
3031
import org.springframework.dao.InvalidDataAccessApiUsageException;
3132
import org.springframework.data.cassandra.core.cql.QueryOptions;
3233
import org.springframework.data.domain.Limit;
@@ -36,6 +37,8 @@
3637
import org.springframework.data.domain.Sort.Order;
3738
import org.springframework.util.Assert;
3839

40+
import com.datastax.oss.driver.api.core.cql.PagingState;
41+
3942
/**
4043
* Query object representing {@link CriteriaDefinition}s, {@link Columns}, {@link Sort}, {@link ByteBuffer paging state}
4144
* and {@link QueryOptions} for a CQL query. {@link Query} is created with a fluent API creating immutable objects.
@@ -256,6 +259,17 @@ public Query pagingState(CassandraScrollPosition scrollPosition) {
256259
this.allowFiltering);
257260
}
258261

262+
/**
263+
* Set the {@link PagingState paging state} to skip rows.
264+
*
265+
* @param pagingState must not be {@literal null}.
266+
* @return a new {@link Query} object containing the former settings with {@link PagingState paging state} applied.
267+
* @since 5.0
268+
*/
269+
public Query pagingState(PagingState pagingState) {
270+
return pagingState(CassandraScrollPosition.of(pagingState));
271+
}
272+
259273
/**
260274
* Set the {@link ByteBuffer paging state} to skip rows.
261275
*

spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/query/QueryUnitTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@
2121
import java.nio.ByteBuffer;
2222

2323
import org.junit.jupiter.api.Test;
24+
2425
import org.springframework.data.domain.PageRequest;
2526
import org.springframework.data.domain.Sort;
2627
import org.springframework.data.domain.Sort.Direction;
2728

29+
import com.datastax.oss.driver.api.core.cql.PagingState;
30+
2831
/**
2932
* Unit tests for {@link Query}.
3033
*
@@ -85,4 +88,15 @@ void shouldApplyPageRequests() {
8588
assertThat(query.getQueryOptions())
8689
.hasValueSatisfying(actual -> assertThat(actual).extracting("pageSize").isEqualTo(42));
8790
}
91+
92+
@Test // GH-1585
93+
void shouldApplyPagingState() {
94+
95+
PagingState pagingState = PagingState.fromString("00080006536b796c6572f07ffffffdf07ffffffd");
96+
Query query = Query.empty().pagingState(pagingState);
97+
98+
assertThat(query.getPagingState())
99+
.hasValueSatisfying(actual -> assertThat(actual).isEqualByComparingTo(pagingState.getRawPagingState()));
100+
}
101+
88102
}

src/main/antora/modules/ROOT/pages/cassandra/template.adoc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ The `Query` class has some additional methods that you can use to provide option
198198
* `Query` *limit* `(Limit limit)`: Used to limit the size of the returned results to the provided limit (used `SELECT` limiting).
199199
* `Query` *limit* `(long limit)`: Used to limit the size of the returned results to the provided limit (used `SELECT` limiting).
200200
* `Query` *pageRequest* `(Pageable pageRequest)`: Used to associate `Sort`, `PagingState`, and `fetchSize` with the query (used for paging).
201-
* `Query` *pagingState* `(ByteBuffer pagingState)`: Used to associate a `ByteBuffer` with the query (used for paging).
201+
* `Query` *pagingState* `(CassandraScrollPosition pagingState)`: Used to associate a `CassandraScrollPosition` with the query (used for paging).
202+
* `Query` *pagingState* `(ByteBuffer pagingState)`: Used to associate a raw `ByteBuffer` with the query (used for paging).
202203
* `Query` *queryOptions* `(QueryOptions queryOptions)`: Used to associate `QueryOptions` with the query.
203204
* `Query` *sort* `(Sort sort)`: Used to provide a sort definition for the results.
204205
* `Query` *withAllowFiltering* `()`: Used to render `ALLOW FILTERING` queries.

0 commit comments

Comments
 (0)