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 <[email protected]>
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 <[email protected]>
    
    ---------
    
    Co-authored-by: Jörg Hoh <[email protected]>
---
 .../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;

Reply via email to