This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch SLING-13323 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 6fead81976a65c466a92720ff8fe841dad1df4af Author: Julian Reschke <[email protected]> AuthorDate: Thu Aug 27 09:20:02 2026 +0100 SLING-13323: when paging encounters unexpected values, log the position inside the page as well --- .../impl/mapping/PagedQueryIterator.java | 9 +++++++-- .../impl/mapping/PagedQueryIteratorTest.java | 20 +++++++++++++++++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIterator.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIterator.java index d98adb4c..45500233 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIterator.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIterator.java @@ -48,6 +48,7 @@ public class PagedQueryIterator implements Iterator<Resource> { private String lastValue = null; private Iterator<Resource> it; private int count = 0; + private int indexInPage = 0; private int page = 0; private Resource next = null; private int largestPage = 0; @@ -74,6 +75,7 @@ public class PagedQueryIterator implements Iterator<Resource> { private void nextPage() { count = 0; + indexInPage = 0; String formattedQuery = String.format(query, QueryBuildHelper.escapeString(lastKey)); log.debug("start {} query (page {}): {}", subject, page, formattedQuery); long queryStart = System.nanoTime(); @@ -96,6 +98,7 @@ public class PagedQueryIterator implements Iterator<Resource> { private Resource getNext() throws NoSuchElementException { Resource resource = it.next(); count += 1; + indexInPage += 1; final ValueMap valueMap = resource.getValueMap(); final String[] values = valueMap.get(propertyName, defaultValue); @@ -104,8 +107,9 @@ public class PagedQueryIterator implements Iterator<Resource> { String value = values[0]; if (value.compareTo(lastKey) < 0) { log.warn( - "unexpected query result in page {}, property name '{}', got '{}'{}, despite querying for > '{}'" + "unexpected query result at index {} in page {}, property name '{}', got '{}'{}, despite querying for > '{}'" + " (the async index may not yet reflect the current property value)", + indexInPage, (page - 1), propertyName, value, @@ -114,8 +118,9 @@ public class PagedQueryIterator implements Iterator<Resource> { } if (lastValue != null && value.compareTo(lastValue) < 0) { log.warn( - "unexpected query result in page {}, property name '{}', got '{}'{}, last value was '{}'" + "unexpected query result at index {} in page {}, property name '{}', got '{}'{}, last value was '{}'" + " (the async index may not yet reflect the current property value)", + indexInPage, (page - 1), propertyName, value, diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIteratorTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIteratorTest.java index 33a013b8..5e8b6684 100644 --- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIteratorTest.java +++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/PagedQueryIteratorTest.java @@ -98,9 +98,23 @@ public class PagedQueryIteratorTest extends AbstractMappingMapEntriesTest { Collection<Resource> expectedResources = toResourceList(expected); when(resourceResolver.findResources(eq("testSimpleWrongOrder"), eq("JCR-SQL2"))) .thenReturn(expectedResources.iterator()); - PagedQueryIterator it = - new PagedQueryIterator("alias", PROPNAME, resourceResolver, "testSimpleWrongOrder", 2000); - checkResult(it, expected); + try (TestLogger logger = TestLogger.create(PagedQueryIterator.class) + .contains("unexpected") + .start()) { + PagedQueryIterator it = + new PagedQueryIterator("alias", PROPNAME, resourceResolver, "testSimpleWrongOrder", 2000); + checkResult(it, expected); + + // implementation detail: assumes format of log message + List<String> logEntries = logger.stopAndGetLogs(); + assertTrue( + "Log should contain 'unexpected query result', but got: " + logEntries, + logEntries.toString().contains("unexpected query result")); + String expectedMessage = String.format("at index %d in page %d", 4, 0); + assertTrue( + "Log should contain '" + expectedMessage + "', but got: " + logEntries, + logEntries.toString().contains(expectedMessage)); + } } @Test
