You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by re...@apache.org on 2023/12/20 15:24:47 UTC

(sling-org-apache-sling-resourceresolver) branch master updated: SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (#108)

This is an automated email from the ASF dual-hosted git repository.

reschke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git


The following commit(s) were added to refs/heads/master by this push:
     new a241985  SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (#108)
a241985 is described below

commit a241985ae3040544a18d462851c0bc7972b24a02
Author: Julian Reschke <ju...@gmx.de>
AuthorDate: Wed Dec 20 16:24:41 2023 +0100

    SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (#108)
    
    * SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use
    
    * SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (more DEBUG diagnostics)
    
    * SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (fix log template)
    
    * SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (rename param, add javadoc)
    
    * Update src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
    
    Co-authored-by: Jörg Hoh <jo...@users.noreply.github.com>
    
    ---------
    
    Co-authored-by: Jörg Hoh <jo...@users.noreply.github.com>
---
 .../resourceresolver/impl/mapping/MapEntries.java  | 49 +++++++++++++++-------
 1 file changed, 33 insertions(+), 16 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..4aef222 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,66 @@ public class MapEntries implements
         return it;
     }
 
+    /**
+     * Utility class for running paged queries.
+     */
     private class PagedQueryIterator implements Iterator<Resource> {
 
         private ResourceResolver resolver;
+        private String subject;
+        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;
+        private String[] defaultValue = new String[0];
 
-        public PagedQueryIterator(ResourceResolver resolver, String query) {
+        /**
+         * @param subject name of the query, will be used only for logging
+         * @param propertyName name of multivalued string property to query on
+         * @param resolver resource resolver
+         * @param query query string in SQL2 syntax
+         * @param pageSize page size (start a new query after page size is exceeded)
+         */
+        public PagedQueryIterator(String subject, String propertyName, ResourceResolver resolver, String query, int pageSize) {
+            this.subject = subject;
+            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 {}): {}", subject, 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", subject, 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) {
-                    String message = String.format(
-                            "unexpected query result in page %d, vanity path of '%s' despite querying for > '%s'", (page - 1), p,
-                            lastPath);
+            final String[] values = resource.getValueMap().get(propertyName, defaultValue);
+            if (values.length > 0) {
+                String value = values[0];
+                if (value.compareTo(lastValue) < 0) {
+                    String message = String.format("unexpected query result in page %d, %s 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)) {
+                    log.debug("read {} query (page {}); {} entries", subject, page, count);
+                    lastValue = value;
                     nextPage();
                 }
             }
@@ -1374,7 +1390,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;