You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/02/01 21:07:36 UTC
[1/4] jena git commit: Print with newline.
Repository: jena
Updated Branches:
refs/heads/master 7f6e6e5e4 -> f41d74ab3
Print with newline.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/59952d65
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/59952d65
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/59952d65
Branch: refs/heads/master
Commit: 59952d6562de6ac1749a884b643f47c66407d3d0
Parents: 7f6e6e5
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Feb 1 17:47:37 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Feb 1 17:47:37 2016 +0000
----------------------------------------------------------------------
.../apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/59952d65/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java
index 5995123..cdfc731 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterPlainWrapper.java
@@ -73,5 +73,5 @@ public class QueryIterPlainWrapper extends QueryIter
@Override
public void output(IndentedWriter out, SerializationContext sCxt)
- { out.print(Lib.className(this)) ; }
+ { out.println(Lib.className(this)) ; }
}
[2/4] jena git commit: Tidy up path code.
Posted by an...@apache.org.
Tidy up path code.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/6680124c
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/6680124c
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/6680124c
Branch: refs/heads/master
Commit: 6680124c2dff0e5baf70748cde46b6404fe014c5
Parents: 59952d6
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Feb 1 17:47:48 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Feb 1 17:47:48 2016 +0000
----------------------------------------------------------------------
.../apache/jena/sparql/path/P_OneOrMore1.java | 1 +
.../apache/jena/sparql/path/P_OneOrMoreN.java | 1 +
.../org/apache/jena/sparql/path/PathLib.java | 148 ++++++++-----------
3 files changed, 60 insertions(+), 90 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/6680124c/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMore1.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMore1.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMore1.java
index 19425b1..242bd18 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMore1.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMore1.java
@@ -20,6 +20,7 @@ package org.apache.jena.sparql.path;
import org.apache.jena.sparql.util.NodeIsomorphismMap ;
+/** One or more - unique results */
public class P_OneOrMore1 extends P_Path1
{
public P_OneOrMore1(Path path)
http://git-wip-us.apache.org/repos/asf/jena/blob/6680124c/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMoreN.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMoreN.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMoreN.java
index d411700..a162d1c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMoreN.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/P_OneOrMoreN.java
@@ -20,6 +20,7 @@ package org.apache.jena.sparql.path;
import org.apache.jena.sparql.util.NodeIsomorphismMap ;
+/** One or more - all results */
public class P_OneOrMoreN extends P_Path1
{
public P_OneOrMoreN(Path path)
http://git-wip-us.apache.org/repos/asf/jena/blob/6680124c/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
index 465f359..63b433e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
@@ -45,80 +45,62 @@ import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
import org.apache.jena.sparql.engine.iterator.QueryIterYieldN ;
import org.apache.jena.sparql.mgt.Explain ;
import org.apache.jena.sparql.path.eval.PathEval ;
-import org.apache.jena.sparql.pfunction.PropertyFunction ;
import org.apache.jena.sparql.pfunction.PropertyFunctionFactory ;
import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry ;
import org.apache.jena.sparql.util.graph.GraphUtils ;
public class PathLib
{
- /** Convert any paths of exactly one predicate to a triple pattern */
- public static Op pathToTriples(PathBlock pattern)
- {
- BasicPattern bp = null ;
- Op op = null ;
+ /** Convert any paths of exactly one predicate to a triple pattern */
+ public static Op pathToTriples(PathBlock pattern) {
+ BasicPattern bp = null;
+ Op op = null;
- for ( TriplePath tp : pattern )
- {
- if ( tp.isTriple() )
- {
+ for ( TriplePath tp : pattern ) {
+ if ( tp.isTriple() ) {
if ( bp == null )
- bp = new BasicPattern() ;
- bp.add(tp.asTriple()) ;
- continue ;
+ bp = new BasicPattern();
+ bp.add(tp.asTriple());
+ continue;
}
// Path form.
- op = flush(bp, op) ;
- bp = null ;
+ op = flush(bp, op);
+ bp = null;
- OpPath opPath2 = new OpPath(tp) ;
- op = OpSequence.create(op, opPath2) ;
- continue ;
+ OpPath opPath2 = new OpPath(tp);
+ op = OpSequence.create(op, opPath2);
+ continue;
}
- // End. Finish off any outstanding BGP.
- op = flush(bp, op) ;
- return op ;
+ // End. Finish off any outstanding BGP.
+ op = flush(bp, op);
+ return op;
}
- static private Op flush(BasicPattern bp, Op op)
- {
+ static private Op flush(BasicPattern bp, Op op) {
if ( bp == null || bp.isEmpty() )
- return op ;
-
- OpBGP opBGP = new OpBGP(bp) ;
- op = OpSequence.create(op, opBGP) ;
- return op ;
+ return op;
+
+ OpBGP opBGP = new OpBGP(bp);
+ op = OpSequence.create(op, opBGP);
+ return op;
}
-
+
/** Install a path as a property function in the global property function registry */
public static void install(String uri, Path path)
{ install(uri, path, PropertyFunctionRegistry.get()) ; }
/** Install a path as a property function in a given registry */
- public static void install(String uri, final Path path, PropertyFunctionRegistry registry)
- {
- PropertyFunctionFactory pathPropFuncFactory = new PropertyFunctionFactory()
- {
- @Override
- public PropertyFunction create(String uri)
- {
- return new PathPropertyFunction(path) ;
- }
- };
-
+ public static void install(String uri, final Path path, PropertyFunctionRegistry registry) {
+ PropertyFunctionFactory pathPropFuncFactory = (u) -> new PathPropertyFunction(path) ;
registry.put(uri, pathPropFuncFactory) ;
}
- public static QueryIterator execTriplePath(Binding binding, TriplePath triplePath, ExecutionContext execCxt)
- {
- if ( triplePath.isTriple() )
- {
- // Fake it. This happens only for API constructed situations.
- Path path = new P_Link(triplePath.getPredicate()) ;
- triplePath = new TriplePath(triplePath.getSubject(),
- path,
- triplePath.getObject()) ;
+ public static QueryIterator execTriplePath(Binding binding, TriplePath triplePath, ExecutionContext execCxt) {
+ if ( triplePath.isTriple() ) {
+ // Fake it. This happens only for API constructed situations.
+ Path path = new P_Link(triplePath.getPredicate());
+ triplePath = new TriplePath(triplePath.getSubject(), path, triplePath.getObject());
}
return execTriplePath(binding,
@@ -128,48 +110,39 @@ public class PathLib
execCxt) ;
}
- public static QueryIterator execTriplePath(Binding binding,
- Node s, Path path, Node o,
- ExecutionContext execCxt)
- {
+ public static QueryIterator execTriplePath(Binding binding, Node s, Path path, Node o, ExecutionContext execCxt) {
Explain.explain(s, path, o, execCxt.getContext()) ;
-
s = Var.lookup(binding, s) ;
o = Var.lookup(binding, o) ;
Iterator<Node> iter = null ;
Node endNode = null ;
Graph graph = execCxt.getActiveGraph() ;
-
- if ( Var.isVar(s) && Var.isVar(o) )
- {
+
+ // Both variables.
+ if ( Var.isVar(s) && Var.isVar(o) ) {
if ( s.equals(o) )
- return ungroundedPathSameVar(binding, graph, Var.alloc(s), path, execCxt) ;
+ return execUngroundedPathSameVar(binding, graph, Var.alloc(s), path, execCxt);
else
- return ungroundedPath(binding, graph, Var.alloc(s), path, Var.alloc(o), execCxt) ;
+ return execUngroundedPath(binding, graph, Var.alloc(s), path, Var.alloc(o), execCxt);
}
- if ( ! Var.isVar(s) && ! Var.isVar(o) )
- return groundedPath(binding, graph, s, path, o, execCxt) ;
-
- if ( Var.isVar(s) )
- {
+ // Both constants.
+ if ( !Var.isVar(s) && !Var.isVar(o) )
+ return evalGroundedPath(binding, graph, s, path, o, execCxt);
+
+ // One variable, one constant
+ if ( Var.isVar(s) ) {
// Var subject, concrete object - do backwards.
- iter = PathEval.evalReverse(graph, o, path, execCxt.getContext()) ;
- endNode = s ;
- }
- else
- {
- iter = PathEval.eval(graph, s, path, execCxt.getContext()) ;
- endNode = o ;
+ iter = PathEval.evalReverse(graph, o, path, execCxt.getContext());
+ endNode = s;
+ } else {
+ iter = PathEval.eval(graph, s, path, execCxt.getContext());
+ endNode = o;
}
- return _execTriplePath(binding, iter, endNode, execCxt) ;
+ return evalGroundedOneEnd(binding, iter, endNode, execCxt);
}
- private static QueryIterator _execTriplePath(Binding binding,
- Iterator<Node> iter,
- Node endNode,
- ExecutionContext execCxt)
- {
+ private static QueryIterator evalGroundedOneEnd(Binding binding, Iterator<Node> iter, Node endNode, ExecutionContext execCxt) {
List<Binding> results = new ArrayList<>() ;
if (! Var.isVar(endNode))
@@ -177,8 +150,7 @@ public class PathLib
Var var = Var.alloc(endNode) ;
// Assign.
- for (; iter.hasNext();)
- {
+ for (; iter.hasNext();) {
Node n = iter.next() ;
results.add(BindingFactory.binding(binding, var, n)) ;
}
@@ -186,9 +158,9 @@ public class PathLib
}
// Subject and object are nodes.
- private static QueryIterator groundedPath(Binding binding, Graph graph, Node subject, Path path, Node object,
- ExecutionContext execCxt)
- {
+ private static QueryIterator evalGroundedPath(Binding binding,
+ Graph graph, Node subject, Path path, Node object,
+ ExecutionContext execCxt) {
Iterator<Node> iter = PathEval.eval(graph, subject, path, execCxt.getContext()) ;
// Now count the number of matches.
@@ -204,9 +176,7 @@ public class PathLib
}
// Brute force evaluation of a TriplePath where neither subject nor object are bound
- private static QueryIterator ungroundedPath(Binding binding, Graph graph, Var sVar, Path path, Var oVar,
- ExecutionContext execCxt)
- {
+ private static QueryIterator execUngroundedPath(Binding binding, Graph graph, Var sVar, Path path, Var oVar, ExecutionContext execCxt) {
Iterator<Node> iter = GraphUtils.allNodes(graph) ;
QueryIterConcat qIterCat = new QueryIterConcat(execCxt) ;
@@ -215,14 +185,13 @@ public class PathLib
Node n = iter.next() ;
Binding b2 = BindingFactory.binding(binding, sVar, n) ;
Iterator<Node> pathIter = PathEval.eval(graph, n, path, execCxt.getContext()) ;
- QueryIterator qIter = _execTriplePath(b2, pathIter, oVar, execCxt) ;
+ QueryIterator qIter = evalGroundedOneEnd(b2, pathIter, oVar, execCxt) ;
qIterCat.add(qIter) ;
}
return qIterCat ;
}
- private static QueryIterator ungroundedPathSameVar(Binding binding, Graph graph, Var var, Path path, ExecutionContext execCxt)
- {
+ private static QueryIterator execUngroundedPathSameVar(Binding binding, Graph graph, Var var, Path path, ExecutionContext execCxt) {
// Try each end, grounded
// Slightly more efficient would be to add a per-engine to do this.
Iterator<Node> iter = GraphUtils.allNodes(graph) ;
@@ -242,8 +211,7 @@ public class PathLib
return qIterCat ;
}
- private static int existsPath(Graph graph, Node subject, Path path, final Node object, ExecutionContext execCxt)
- {
+ private static int existsPath(Graph graph, Node subject, Path path, final Node object, ExecutionContext execCxt) {
if ( ! subject.isConcrete() || !object.isConcrete() )
throw new ARQInternalErrorException("Non concrete node for existsPath evaluation") ;
Iterator<Node> iter = PathEval.eval(graph, subject, path, execCxt.getContext()) ;
[3/4] jena git commit: Change name of loggers to agree with
documentation.
Posted by an...@apache.org.
Change name of loggers to agree with documentation.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/7734fe3e
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/7734fe3e
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/7734fe3e
Branch: refs/heads/master
Commit: 7734fe3e79a015b5534f7bb408221201bccb11b3
Parents: 6680124
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Feb 1 17:50:21 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Feb 1 17:50:21 2016 +0000
----------------------------------------------------------------------
jena-arq/src/main/java/org/apache/jena/query/ARQ.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/7734fe3e/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
index 646e824..98bdc77 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
@@ -61,13 +61,13 @@ public class ARQ
// 2/ stageGenerator constant must be set before the call to ARQ.init.
/** Name of the execution logger */
- public static final String logExecName = "com.hp.hpl.jena.arq.exec" ;
+ public static final String logExecName = "org.apache.jena.arq.exec" ;
/** Name of the information logger */
- public static final String logInfoName = "com.hp.hpl.jena.arq.info" ;
+ public static final String logInfoName = "org.apache.jena.arq.info" ;
/** Name of the logger for remote HTTP requests */
- public static final String logHttpRequestName = "com.hp.hpl.jena.arq.service" ;
+ public static final String logHttpRequestName = "org.apache.jena.arq.service" ;
private static final Logger logExec = LoggerFactory.getLogger(logExecName) ;
private static final Logger logInfo = LoggerFactory.getLogger(logInfoName) ;
@@ -93,7 +93,7 @@ public class ARQ
/** Get the currently global execution logging setting */
public static Explain.InfoLevel getExecutionLogging() { return (Explain.InfoLevel)ARQ.getContext().get(ARQ.symLogExec) ; }
- /** Set execution logging - logging is to logger "com.hp.hpl.jena.arq.exec" at level INFO.
+ /** Set execution logging - logging is to logger "org.apache.jena.arq.exec" at level INFO.
* An appropriate logging configuration is also required.
*/
public static void setExecutionLogging(Explain.InfoLevel infoLevel)
[4/4] jena git commit: JENA-1127: Seed the start of :predicate+
better.
Posted by an...@apache.org.
JENA-1127: Seed the start of :predicate+ better.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/f41d74ab
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/f41d74ab
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/f41d74ab
Branch: refs/heads/master
Commit: f41d74ab342332ab79511765cfcad2547bc13db7
Parents: 7734fe3
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Feb 1 18:56:25 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Feb 1 20:07:15 2016 +0000
----------------------------------------------------------------------
.../org/apache/jena/sparql/path/PathLib.java | 38 +++++++++++++++++---
.../apache/jena/sparql/path/eval/PathEval.java | 4 +--
2 files changed, 35 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/f41d74ab/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
index 63b433e..a6e8e6d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/PathLib.java
@@ -27,6 +27,7 @@ import java.util.function.Predicate;
import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.op.OpBGP ;
@@ -165,8 +166,7 @@ public class PathLib
// Now count the number of matches.
int count = 0 ;
- for ( ; iter.hasNext() ; )
- {
+ for ( ; iter.hasNext() ; ) {
Node n = iter.next() ;
if ( n.sameValueAs(object) )
count++ ;
@@ -177,7 +177,8 @@ public class PathLib
// Brute force evaluation of a TriplePath where neither subject nor object are bound
private static QueryIterator execUngroundedPath(Binding binding, Graph graph, Var sVar, Path path, Var oVar, ExecutionContext execCxt) {
- Iterator<Node> iter = GraphUtils.allNodes(graph) ;
+ // Starting points.
+ Iterator<Node> iter = determineUngroundedStartingSet(graph, path, execCxt) ;
QueryIterConcat qIterCat = new QueryIterConcat(execCxt) ;
for ( ; iter.hasNext() ; )
@@ -192,9 +193,9 @@ public class PathLib
}
private static QueryIterator execUngroundedPathSameVar(Binding binding, Graph graph, Var var, Path path, ExecutionContext execCxt) {
- // Try each end, grounded
+ // Try each end, ungrounded.
// Slightly more efficient would be to add a per-engine to do this.
- Iterator<Node> iter = GraphUtils.allNodes(graph) ;
+ Iterator<Node> iter = determineUngroundedStartingSet(graph, path, execCxt) ;
QueryIterConcat qIterCat = new QueryIterConcat(execCxt) ;
for ( ; iter.hasNext() ; )
@@ -211,6 +212,33 @@ public class PathLib
return qIterCat ;
}
+ private static Iterator<Node> determineUngroundedStartingSet(Graph graph, Path path, ExecutionContext execCxt) {
+ // Find a better set of seed values than "everything"
+ // (:p+) and (^:p)+
+ // :p* need everything because it is always the case that "<x> :p* <x>"
+ if ( path instanceof P_OneOrMore1 || path instanceof P_OneOrMoreN ) {
+ Path subPath = ((P_Path1)path).getSubPath() ;
+ if ( subPath instanceof P_Link ) {
+ // :predicate+
+ P_Link link = (P_Link)subPath ;
+ Iterator<Triple> sIter = graph.find(null, link.getNode(), null) ;
+ return Iter.iter(sIter).distinctAdjacent().map(Triple::getSubject).distinct() ;
+ } else {
+ if ( subPath instanceof P_Inverse ) {
+ P_Inverse pInv = (P_Inverse)subPath ;
+ if ( pInv.getSubPath() instanceof P_Link ) {
+ // (^:predicate)+
+ P_Link link = (P_Link)(pInv.getSubPath()) ;
+ Iterator<Triple> sIter = graph.find(null, link.getNode(), null) ;
+ return Iter.iter(sIter).distinctAdjacent().map(Triple::getObject).distinct() ;
+ }
+ }
+ }
+ }
+ // No idea - everything.
+ return GraphUtils.allNodes(graph) ;
+ }
+
private static int existsPath(Graph graph, Node subject, Path path, final Node object, ExecutionContext execCxt) {
if ( ! subject.isConcrete() || !object.isConcrete() )
throw new ARQInternalErrorException("Non concrete node for existsPath evaluation") ;
http://git-wip-us.apache.org/repos/asf/jena/blob/f41d74ab/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEval.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEval.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEval.java
index 2d42323..e290e2e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEval.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEval.java
@@ -65,13 +65,13 @@ public class PathEval
}
/** Evaluate a path */
- static void eval$(Graph graph, Node node, Path path, PathEngine engine, Collection<Node> acc) {
+ /*package*/ static void eval$(Graph graph, Node node, Path path, PathEngine engine, Collection<Node> acc) {
PathEvaluator evaluator = new PathEvaluator(graph, node, acc, engine) ;
path.visit(evaluator) ;
}
/** Evaluate a path */
- static Iter<Node> eval$(Graph graph, Node node, Path path, PathEngine engine) {
+ /*package*/ static Iter<Node> eval$(Graph graph, Node node, Path path, PathEngine engine) {
Collection<Node> acc = new ArrayList<>() ;
eval$(graph, node, path, engine, acc);
return Iter.iter(acc) ;