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 <[email protected]>
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 <[email protected]>
---------
Co-authored-by: Jörg Hoh <[email protected]>
---
.../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;