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/20 15:24:47 UTC
(sling-org-apache-sling-resourceresolver) branch master updated: SLING-12204: ResourceResolver: refactor PagedQueryIterator for re-use (#108)
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 <ju...@gmx.de>
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 <jo...@users.noreply.github.com>
---------
Co-authored-by: Jörg Hoh <jo...@users.noreply.github.com>
---
.../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;