Skip to content

Commit 8e1fdbc

Browse files
Merge pull request #296 from wttech/make-query-use-query
make Repo.query use actual JCR Query (issue 295)
2 parents 61aa1e6 + 7579d5e commit 8e1fdbc

3 files changed

Lines changed: 48 additions & 3 deletions

File tree

core/src/main/java/dev/vml/es/acm/core/repo/Repo.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package dev.vml.es.acm.core.repo;
22

3-
import dev.vml.es.acm.core.util.StreamUtils;
3+
import dev.vml.es.acm.core.util.JcrUtils;
44
import java.util.stream.Stream;
55
import javax.jcr.Node;
6+
import javax.jcr.RepositoryException;
67
import javax.jcr.Session;
78
import javax.jcr.query.Query;
9+
import javax.jcr.query.QueryManager;
10+
import javax.jcr.query.QueryResult;
811
import org.apache.commons.lang3.StringUtils;
912
import org.apache.jackrabbit.JcrConstants;
1013
import org.apache.sling.api.resource.*;
@@ -169,8 +172,21 @@ public Stream<RepoResource> query(String path, String nodeType, String where, St
169172
}
170173

171174
public Stream<RepoResource> queryRaw(String sql) {
172-
return StreamUtils.asStream(resourceResolver.findResources(sql, Query.JCR_SQL2))
173-
.map(r -> new RepoResource(this, r.getPath()));
175+
try {
176+
QueryManager queryManager = session.getWorkspace().getQueryManager();
177+
Query query = queryManager.createQuery(sql, Query.JCR_SQL2);
178+
QueryResult result = query.execute();
179+
180+
return JcrUtils.asNodeStream(result.getNodes()).map(n -> {
181+
try {
182+
return new RepoResource(this, n.getPath());
183+
} catch (RepositoryException e) {
184+
throw new RepoException(String.format("Cannot read node path from query result '%s'!", sql), e);
185+
}
186+
});
187+
} catch (Exception e) {
188+
throw new RepoException(String.format("Cannot execute raw query '%s'!", sql), e);
189+
}
174190
}
175191

176192
public boolean isCompositeNodeStore() {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dev.vml.es.acm.core.util;
2+
3+
import java.util.Iterator;
4+
import java.util.stream.Stream;
5+
import javax.jcr.Node;
6+
import javax.jcr.NodeIterator;
7+
8+
public class JcrUtils {
9+
10+
public static Stream<Node> asNodeStream(NodeIterator nodeIterator) {
11+
if (nodeIterator == null) {
12+
return Stream.empty();
13+
}
14+
return StreamUtils.asStream(new Iterator<Node>() {
15+
@Override
16+
public boolean hasNext() {
17+
return nodeIterator.hasNext();
18+
}
19+
20+
@Override
21+
public Node next() {
22+
return nodeIterator.nextNode();
23+
}
24+
});
25+
}
26+
}

core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public static <T> Stream<T> asStream(Iterator<T> sourceIterator) {
1212
}
1313

1414
public static <T> Stream<T> asStream(Iterator<T> sourceIterator, boolean parallel) {
15+
if (sourceIterator == null) {
16+
return Stream.empty();
17+
}
1518
Iterable<T> iterable = () -> sourceIterator;
1619
return StreamSupport.stream(iterable.spliterator(), parallel);
1720
}

0 commit comments

Comments
 (0)