Skip to content

Commit 5f03742

Browse files
make Repo.query use actual JCR Query (issue 295)
1 parent 61aa1e6 commit 5f03742

2 files changed

Lines changed: 39 additions & 2 deletions

File tree

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import dev.vml.es.acm.core.util.StreamUtils;
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,23 @@ 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 StreamUtils.asNodeStream(result.getNodes()).map(n -> {
181+
try {
182+
return new RepoResource(this, n.getPath());
183+
} catch (RepositoryException e) {
184+
throw new RepoException("Cannot read node path from query result!", e);
185+
}
186+
});
187+
} catch (RepoException e) {
188+
throw e;
189+
} catch (Exception e) {
190+
throw new RepoException(String.format("Cannot execute raw query '%s'!", sql), e);
191+
}
174192
}
175193

176194
public boolean isCompositeNodeStore() {

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import java.util.Iterator;
55
import java.util.stream.Stream;
66
import java.util.stream.StreamSupport;
7+
import javax.jcr.Node;
8+
import javax.jcr.NodeIterator;
79

810
public class StreamUtils {
911

@@ -32,4 +34,21 @@ public T next() {
3234
}
3335
});
3436
}
37+
38+
public static Stream<Node> asNodeStream(NodeIterator nodeIterator) {
39+
if (nodeIterator == null) {
40+
return Stream.empty();
41+
}
42+
return asStream(new Iterator<Node>() {
43+
@Override
44+
public boolean hasNext() {
45+
return nodeIterator.hasNext();
46+
}
47+
48+
@Override
49+
public Node next() {
50+
return nodeIterator.nextNode();
51+
}
52+
});
53+
}
3554
}

0 commit comments

Comments
 (0)