From ae272e2a1e328fdcec3820b0502333b4f804a52b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 10 Apr 2024 15:56:28 +0200 Subject: [PATCH] Align OffsetScrolling to zero-based indexes. Closes #1764 --- .../support/FetchableFluentQueryByExample.java | 6 +++++- .../data/jdbc/repository/support/ScrollDelegate.java | 2 +- .../jdbc/repository/JdbcRepositoryIntegrationTests.java | 2 +- .../r2dbc/repository/support/SimpleR2dbcRepository.java | 9 ++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java index e5632452..b23a53b6 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/FetchableFluentQueryByExample.java @@ -102,7 +102,11 @@ class FetchableFluentQueryByExample extends FluentQuerySupport { if (scrollPosition instanceof OffsetScrollPosition osp) { - Query query = createQuery().sort(getSort()).offset(osp.getOffset()); + Query query = createQuery().sort(getSort()); + + if (!osp.isInitial()) { + query = query.offset(osp.getOffset() + 1); + } if (getLimit() > 0) { query = query.limit(getLimit()); diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/ScrollDelegate.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/ScrollDelegate.java index 3eba008e..94fea673 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/ScrollDelegate.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/ScrollDelegate.java @@ -54,7 +54,7 @@ public class ScrollDelegate { List result = queryFunction.apply(query); if (scrollPosition instanceof OffsetScrollPosition offset) { - return createWindow(result, limit, OffsetScrollPosition.positionFunction(offset.getOffset())); + return createWindow(result, limit, offset.positionFunction()); } throw new UnsupportedOperationException("ScrollPosition " + scrollPosition + " not supported"); diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java index e7f47592..2e7b4d5a 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java @@ -1137,7 +1137,7 @@ public class JdbcRepositoryIntegrationTests { assertThat(first.map(DummyEntity::getName)).containsExactly("one", "three"); Window second = repository.findBy(example, q -> q.limit(2).sortBy(Sort.by("name"))) - .scroll(ScrollPosition.offset(2)); + .scroll(ScrollPosition.offset(1)); assertThat(second.map(DummyEntity::getName)).containsExactly("two"); WindowIterator iterator = WindowIterator.of( diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/repository/support/SimpleR2dbcRepository.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/repository/support/SimpleR2dbcRepository.java index 9b45bdba..9b15b669 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/repository/support/SimpleR2dbcRepository.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/repository/support/SimpleR2dbcRepository.java @@ -409,7 +409,11 @@ public class SimpleR2dbcRepository implements R2dbcRepository { int limit = getLimit(); return createQuery(q -> { - Query queryToUse = q.offset(osp.getOffset()); + Query queryToUse = q; + + if (!osp.isInitial()) { + queryToUse = queryToUse.offset(osp.getOffset() + 1); + } if (limit > 0) { queryToUse = queryToUse.limit(limit + 1); @@ -419,8 +423,7 @@ public class SimpleR2dbcRepository implements R2dbcRepository { }).all() // .collectList() // .map(content -> { - return ScrollDelegate.createWindow(content, limit, - OffsetScrollPosition.positionFunction(osp.getOffset())); + return ScrollDelegate.createWindow(content, limit, osp.positionFunction()); }); }