diff --git a/core/src/main/java/dev/vml/es/acm/core/repo/Repo.java b/core/src/main/java/dev/vml/es/acm/core/repo/Repo.java index 7b9a3d2f7..d5ee350d9 100644 --- a/core/src/main/java/dev/vml/es/acm/core/repo/Repo.java +++ b/core/src/main/java/dev/vml/es/acm/core/repo/Repo.java @@ -1,10 +1,13 @@ package dev.vml.es.acm.core.repo; -import dev.vml.es.acm.core.util.StreamUtils; +import dev.vml.es.acm.core.util.JcrUtils; import java.util.stream.Stream; import javax.jcr.Node; +import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.Query; +import javax.jcr.query.QueryManager; +import javax.jcr.query.QueryResult; import org.apache.commons.lang3.StringUtils; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.*; @@ -169,8 +172,21 @@ public Stream query(String path, String nodeType, String where, St } public Stream queryRaw(String sql) { - return StreamUtils.asStream(resourceResolver.findResources(sql, Query.JCR_SQL2)) - .map(r -> new RepoResource(this, r.getPath())); + try { + QueryManager queryManager = session.getWorkspace().getQueryManager(); + Query query = queryManager.createQuery(sql, Query.JCR_SQL2); + QueryResult result = query.execute(); + + return JcrUtils.asNodeStream(result.getNodes()).map(n -> { + try { + return new RepoResource(this, n.getPath()); + } catch (RepositoryException e) { + throw new RepoException(String.format("Cannot read node path from query result '%s'!", sql), e); + } + }); + } catch (Exception e) { + throw new RepoException(String.format("Cannot execute raw query '%s'!", sql), e); + } } public boolean isCompositeNodeStore() { diff --git a/core/src/main/java/dev/vml/es/acm/core/util/JcrUtils.java b/core/src/main/java/dev/vml/es/acm/core/util/JcrUtils.java new file mode 100644 index 000000000..b91ee7afe --- /dev/null +++ b/core/src/main/java/dev/vml/es/acm/core/util/JcrUtils.java @@ -0,0 +1,26 @@ +package dev.vml.es.acm.core.util; + +import java.util.Iterator; +import java.util.stream.Stream; +import javax.jcr.Node; +import javax.jcr.NodeIterator; + +public class JcrUtils { + + public static Stream asNodeStream(NodeIterator nodeIterator) { + if (nodeIterator == null) { + return Stream.empty(); + } + return StreamUtils.asStream(new Iterator() { + @Override + public boolean hasNext() { + return nodeIterator.hasNext(); + } + + @Override + public Node next() { + return nodeIterator.nextNode(); + } + }); + } +} diff --git a/core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java b/core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java index c316baabc..d2efee24e 100644 --- a/core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java +++ b/core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java @@ -12,6 +12,9 @@ public static Stream asStream(Iterator sourceIterator) { } public static Stream asStream(Iterator sourceIterator, boolean parallel) { + if (sourceIterator == null) { + return Stream.empty(); + } Iterable iterable = () -> sourceIterator; return StreamSupport.stream(iterable.spliterator(), parallel); }