This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch SLING-13287 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 7ca22ef1ab70597f2663ad868c8b5bda7e2e6bd2 Author: Julian Reschke <[email protected]> AuthorDate: Tue Aug 4 12:37:58 2026 +0100 SLING-13287: log type - w.i.p. --- .../impl/mapping/PagedQueryIterator.java | 21 +++++++++++++--- .../impl/mapping/PagedQueryIteratorTest.java | 28 ++++++++++++++++++++-- 2 files changed, 44 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 2081daa9..4989bd31 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 @@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ValueMap; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,29 +83,43 @@ public class PagedQueryIterator implements Iterator<Resource> { page += 1; } + private static String getDiagInformationWhenNotString(ValueMap valueMap, String propertyNName) { + Object value = valueMap.get(propertyNName); + if (value == null || value instanceof String[] || value instanceof String) { + // all good + return ""; + } else { + return " (type: '" + value.getClass() + "')"; + } + } + private Resource getNext() throws NoSuchElementException { Resource resource = it.next(); count += 1; - final String[] values = resource.getValueMap().get(propertyName, defaultValue); + + final ValueMap valueMap = resource.getValueMap(); + final String[] values = valueMap.get(propertyName, defaultValue); if (values.length > 0) { 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 in page {}, property name '{}', got '{}'{}, despite querying for > '{}'" + " (the async index may not yet reflect the current property value)", (page - 1), propertyName, value, + getDiagInformationWhenNotString(valueMap, propertyName), lastKey); } if (lastValue != null && value.compareTo(lastValue) < 0) { log.warn( - "unexpected query result in page {}, property name '{}', got '{}', last value was '{}'" + "unexpected query result in page {}, property name '{}', got '{}'{}, last value was '{}'" + " (the async index may not yet reflect the current property value)", (page - 1), propertyName, value, + getDiagInformationWhenNotString(valueMap, propertyName), lastValue); } 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 24ac0777..7f6b208b 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 @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.Iterator; import java.util.Map; import java.util.function.Predicate; @@ -37,6 +38,7 @@ import org.mockito.MockitoAnnotations; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -98,14 +100,36 @@ public class PagedQueryIteratorTest extends AbstractMappingMapEntriesTest { checkResult(it, expected); } + @Test + public void testSimpleWrongType() { + // SLING-13284: out-of-order results (from a stale async index) should not abort iteration + String[] expected = new String[] {"a", "b", "c"}; + Collection<Resource> expectedResources = toResourceList(expected); + + ValueMap m = mock(ValueMap.class); + when(m.get(eq(PROPNAME), any(Object.class))).thenReturn(new Date[] {new Date(0)}); + Resource r = mock(Resource.class); + when(r.getValueMap()).thenReturn(m); + + expectedResources.add(r); + + when(resourceResolver.findResources(eq("testSimpleWrongType"), eq("JCR-SQL2"))) + .thenReturn(expectedResources.iterator()); + PagedQueryIterator it = + new PagedQueryIterator("alias", PROPNAME, resourceResolver, "testSimpleWrongType", 2000); + assertNotNull(it); + checkResult(it, expected); + } + @Test public void testSimpleWrongResultAfterKey() { // SLING-13284: out-of-order results across page boundaries should not abort iteration String[] expected = new String[] {"x", "x", "a", "a"}; Collection<Resource> expectedResources = toResourceList(expected); - when(resourceResolver.findResources("testSimpleWrongOrder", "JCR-SQL2")) + when(resourceResolver.findResources("testSimpleWrongResultAfterKey", "JCR-SQL2")) .thenReturn(expectedResources.iterator()); - PagedQueryIterator it = new PagedQueryIterator("alias", PROPNAME, resourceResolver, "testSimpleWrongOrder", 1); + PagedQueryIterator it = + new PagedQueryIterator("alias", PROPNAME, resourceResolver, "testSimpleWrongResultAfterKey", 1); int count = 0; while (it.hasNext()) { it.next();
