Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions core/src/main/java/dev/vml/es/acm/core/repo/Repo.java
Original file line number Diff line number Diff line change
@@ -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.*;
Expand Down Expand Up @@ -169,8 +172,21 @@ public Stream<RepoResource> query(String path, String nodeType, String where, St
}

public Stream<RepoResource> 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() {
Expand Down
26 changes: 26 additions & 0 deletions core/src/main/java/dev/vml/es/acm/core/util/JcrUtils.java
Original file line number Diff line number Diff line change
@@ -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<Node> asNodeStream(NodeIterator nodeIterator) {
if (nodeIterator == null) {
return Stream.empty();
}
return StreamUtils.asStream(new Iterator<Node>() {
@Override
public boolean hasNext() {
return nodeIterator.hasNext();
}

@Override
public Node next() {
return nodeIterator.nextNode();
}
});
}
}
3 changes: 3 additions & 0 deletions core/src/main/java/dev/vml/es/acm/core/util/StreamUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ public static <T> Stream<T> asStream(Iterator<T> sourceIterator) {
}

public static <T> Stream<T> asStream(Iterator<T> sourceIterator, boolean parallel) {
if (sourceIterator == null) {
return Stream.empty();
}
Iterable<T> iterable = () -> sourceIterator;
return StreamSupport.stream(iterable.spliterator(), parallel);
}
Expand Down