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/21 12:10:32 UTC
(sling-org-apache-sling-resourceresolver) branch SLING-11799 created (now 63cb311)
This is an automated email from the ASF dual-hosted git repository.
reschke pushed a change to branch SLING-11799
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
at 63cb311 SLING-11799: ResourceResolver - use keyset pagination for sling:alias query
This branch includes the following new commits:
new 63cb311 SLING-11799: ResourceResolver - use keyset pagination for sling:alias query
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(sling-org-apache-sling-resourceresolver) 01/01: SLING-11799: ResourceResolver - use keyset pagination for sling:alias query
Posted by re...@apache.org.
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 <re...@apache.org>
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();
}
});