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

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

commit 63cb31194bb54d91380d1107eb32b7306d568978
Author: Julian Reschke <[email protected]>
AuthorDate: Thu Dec 21 13:10:17 2023 +0100

    SLING-11799: ResourceResolver - use keyset pagination for sling:alias query
---
 .../resourceresolver/impl/mapping/MapEntries.java  | 33 +++++++++++++---------
 .../impl/mapping/MapEntriesTest.java               |  2 +-
 2 files changed, 21 insertions(+), 14 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 a6b010e..369b327 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
@@ -1148,19 +1148,26 @@ public class MapEntries implements
      */
     private Map<String, Map<String, Collection<String>>> loadAliases(final 
ResourceResolver resolver) {
         final Map<String, Map<String, Collection<String>>> map = new 
ConcurrentHashMap<>();
-        final String queryString = generateAliasQuery();
+        final String baseQueryString = generateAliasQuery();
 
-        log.debug("start alias query: {}", queryString);
-        long queryStart = System.nanoTime();
-        final Iterator<Resource> i = resolver.findResources(queryString, 
"JCR-SQL2");
-        long queryElapsed = System.nanoTime() - queryStart;
-        log.debug("end alias query; elapsed {}ms", 
TimeUnit.NANOSECONDS.toMillis(queryElapsed));
+        Iterator<Resource> it;
+        try {
+            final String queryStringWithSort = baseQueryString + " AND 
FIRST([sling:alias]) > '%s' ORDER BY FIRST([sling:alias])";
+            it = new PagedQueryIterator("alias", "sling:alias", resolver, 
queryStringWithSort,
+                    Integer.getInteger("sling.alias.pageSize", 2000));
+        } catch (QuerySyntaxException ex) {
+            log.debug("sort with first() not supported, falling back to base 
query", ex);
+            it = queryUnpaged("alias", baseQueryString);
+        } catch (UnsupportedOperationException ex) {
+            log.debug("query failed as unsupported, retrying without 
paging/sorting", ex);
+            it = queryUnpaged("alias", baseQueryString);
+        }
 
         long count = 0;
         long processStart = System.nanoTime();
-        while (i.hasNext()) {
+        while (it.hasNext()) {
             count += 1;
-            loadAlias(i.next(), map);
+            loadAlias(it.next(), map);
         }
         long processElapsed = System.nanoTime() - processStart;
         log.debug("processed {} resources with sling:alias properties in 
{}ms", count, TimeUnit.NANOSECONDS.toMillis(processElapsed));
@@ -1276,12 +1283,12 @@ public class MapEntries implements
         return invalid;
     }
 
-    private Iterator<Resource> queryAllVanityPaths(String query) {
-        log.debug("start vanityPath query: {}", query);
+    private Iterator<Resource> queryUnpaged(String subject, String query) {
+        log.debug("start {} query: {}", subject, query);
         long queryStart = System.nanoTime();
         final Iterator<Resource> it = resolver.findResources(query, 
"JCR-SQL2");
         long queryElapsed = System.nanoTime() - queryStart;
-        log.debug("end vanityPath query; elapsed {}ms", 
TimeUnit.NANOSECONDS.toMillis(queryElapsed));
+        log.debug("end {} query; elapsed {}ms", subject, 
TimeUnit.NANOSECONDS.toMillis(queryElapsed));
         return it;
     }
 
@@ -1392,11 +1399,11 @@ public class MapEntries implements
         } catch (QuerySyntaxException ex) {
             log.debug("sort with first() not supported, falling back to base 
query", ex);
             supportsSort = false;
-            it = queryAllVanityPaths(baseQueryString);
+            it = queryUnpaged("vanity path", baseQueryString);
         } catch (UnsupportedOperationException ex) {
             log.debug("query failed as unsupported, retrying without 
paging/sorting", ex);
             supportsSort = false;
-            it = queryAllVanityPaths(baseQueryString);
+            it = queryUnpaged("vanity path", baseQueryString);
         }
 
         long count = 0;
diff --git 
a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
 
b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
index 5c7c421..b82baaf 100644
--- 
a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
+++ 
b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
@@ -2279,7 +2279,7 @@ public class MapEntriesTest extends 
AbstractMappingMapEntriesTest {
             @Override
             public Iterator<Resource> answer(InvocationOnMock invocation) 
throws Throwable {
                 String query = 
StringUtils.trim((String)invocation.getArguments()[0]);
-                assertEquals("SELECT [sling:alias] FROM [nt:base] WHERE NOT 
isdescendantnode('/jcr:system') AND [sling:alias] IS NOT NULL", query);
+                assertEquals("SELECT [sling:alias] FROM [nt:base] WHERE NOT 
isdescendantnode('/jcr:system') AND [sling:alias] IS NOT NULL AND 
FIRST([sling:alias]) > '' ORDER BY FIRST([sling:alias])", query);
                 return Collections.<Resource> emptySet().iterator();
             }
         });

Reply via email to