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 54f07c7 SLING-11799: ResourceResolver - use keyset pagination for
sling:alias query (#111)
54f07c7 is described below
commit 54f07c72f291a8b934b9b2c3f218adf736a72f69
Author: Julian Reschke <[email protected]>
AuthorDate: Tue Jan 9 10:31:27 2024 +0100
SLING-11799: ResourceResolver - use keyset pagination for sling:alias query
(#111)
* SLING-12205: ResourceResolver: switch sling:alias query to JCR-SQL2
* 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();
}
});