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(); } });
