This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch SLING-12204 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 932011ee313a73aa4d181502727518cb25a458f0 Author: Julian Reschke <[email protected]> AuthorDate: Tue Dec 19 15:56:43 2023 +0100 SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use --- .../resourceresolver/impl/mapping/MapEntries.java | 39 +++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java index 1c89504..942a658 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java @@ -1288,50 +1288,58 @@ public class MapEntries implements return it; } + /** + * Utility class for running paged queries. + */ private class PagedQueryIterator implements Iterator<Resource> { private ResourceResolver resolver; + private String name; + private String propertyName; private String query; - private String lastPath = ""; + private String lastValue = ""; private Iterator<Resource> it; private int count = 0; private int page = 0; - private int pageSize = Integer.getInteger("sling.vanityPath.pageSize", 2000); + private int pageSize; private Resource next = null; - public PagedQueryIterator(ResourceResolver resolver, String query) { + public PagedQueryIterator(String name, String propertyName, ResourceResolver resolver, String query, int pageSize) { + this.name = name; + this.propertyName = propertyName; this.resolver = resolver; this.query = query; + this.pageSize = pageSize; nextPage(); } private void nextPage() { count = 0; - String tquery = String.format(query, queryLiteral(lastPath)); - log.debug("start vanity path query (page {}): {}", page, tquery); + String tquery = String.format(query, queryLiteral(lastValue)); + log.debug("start {} query (page {}): {}", name, page, tquery); long queryStart = System.nanoTime(); this.it = resolver.findResources(tquery, "JCR-SQL2"); long queryElapsed = System.nanoTime() - queryStart; - log.debug("end vanity path query (page {}); elapsed {}ms", page, TimeUnit.NANOSECONDS.toMillis(queryElapsed)); + log.debug("end {} query (page {}); elapsed {}ms", name, page, TimeUnit.NANOSECONDS.toMillis(queryElapsed)); page += 1; } private Resource getNext() throws NoSuchElementException { Resource resource = it.next(); count += 1; - final String[] paths = resource.getValueMap().get(PROP_VANITY_PATH, new String[0]); - if (paths.length > 0) { - String p = paths[0]; - if (p.compareTo(lastPath) < 0) { + final String[] values = resource.getValueMap().get(propertyName, new String[0]); + if (values.length > 0) { + String value = values[0]; + if (value.compareTo(lastValue) < 0) { String message = String.format( - "unexpected query result in page %d, vanity path of '%s' despite querying for > '%s'", (page - 1), p, - lastPath); + "unexpected query result in page %d, {} of '%s' despite querying for > '%s'", (page - 1), propertyName, value, + lastValue); log.error(message); throw new RuntimeException(message); } // start next page? - if (count > pageSize && !p.equals(lastPath)) { - lastPath = p; + if (count > pageSize && !value.equals(lastValue)) { + lastValue = value; nextPage(); } } @@ -1374,7 +1382,8 @@ public class MapEntries implements Iterator<Resource> it; try { final String queryStringWithSort = baseQueryString + " AND FIRST([sling:vanityPath]) > '%s' ORDER BY FIRST([sling:vanityPath])"; - it = new PagedQueryIterator(resolver, queryStringWithSort); + it = new PagedQueryIterator("vanity path", PROP_VANITY_PATH, resolver, queryStringWithSort, + Integer.getInteger("sling.vanityPath.pageSize", 2000)); } catch (QuerySyntaxException ex) { log.debug("sort with first() not supported, falling back to base query", ex); supportsSort = false;
