Repository: jena Updated Branches: refs/heads/master 7d3eaa2bc -> fefcbe639
JENA-1329: Define and use QueryIterator.isJoinIdentity. Don't test for QueryIterRoot. Don't use QueryIterRoot to hold a binding with set variables. Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/b1ff0c1c Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/b1ff0c1c Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/b1ff0c1c Branch: refs/heads/master Commit: b1ff0c1c382c1eef4e381e041c25846ddc970b7e Parents: 7d3eaa2 Author: Andy Seaborne <[email protected]> Authored: Wed Apr 26 11:43:44 2017 +0100 Committer: Andy Seaborne <[email protected]> Committed: Wed May 3 10:34:41 2017 +0100 ---------------------------------------------------------------------- .../jena/sparql/algebra/TableFactory.java | 7 +++---- .../jena/sparql/engine/QueryIterator.java | 6 ++++++ .../jena/sparql/engine/binding/BindingRoot.java | 2 -- .../sparql/engine/iterator/QueryIterRoot.java | 20 ++++++++++++-------- .../jena/sparql/engine/main/OpExecutor.java | 6 +++--- .../sparql/engine/main/QueryEngineMain.java | 6 +++++- .../engine/main/StageGeneratorGeneric.java | 11 ++++------- .../org/apache/jena/sparql/engine/ref/Eval.java | 4 ++-- .../jena/sparql/engine/ref/EvaluatorSimple.java | 4 ++-- .../jena/sparql/path/eval/PathEngine.java | 2 +- 10 files changed, 38 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TableFactory.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TableFactory.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TableFactory.java index 12f0475..3f5a5e0 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TableFactory.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/TableFactory.java @@ -27,7 +27,6 @@ import org.apache.jena.sparql.algebra.table.TableN ; import org.apache.jena.sparql.algebra.table.TableUnit ; import org.apache.jena.sparql.core.Var ; import org.apache.jena.sparql.engine.QueryIterator ; -import org.apache.jena.sparql.engine.iterator.QueryIterRoot ; public class TableFactory { @@ -45,13 +44,13 @@ public class TableFactory public static Table create(QueryIterator queryIterator) { - if ( queryIterator instanceof QueryIterRoot ) - { + if ( queryIterator.isJoinIdentity() ) { queryIterator.close(); return createUnit() ; } - return new TableN(queryIterator) ; } + return new TableN(queryIterator) ; + } public static Table create(Var var, Node value) { return new Table1(var, value) ; } http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryIterator.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryIterator.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryIterator.java index 7ff4b60..83dcdc2 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryIterator.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryIterator.java @@ -35,4 +35,10 @@ public interface QueryIterator extends Closeable, Iterator<Binding>, PrintSerial * Cancels the query as soon as is possible for the given iterator */ public void cancel(); + + /* + * Indicate whether this iterator is known to be an iterator of the join identity (one row, no columns). + * Returns true if definitely a join identity; false for not or don't know. + */ + public default boolean isJoinIdentity() { return false; } } http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingRoot.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingRoot.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingRoot.java index c624b27..c229089 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingRoot.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/binding/BindingRoot.java @@ -19,8 +19,6 @@ package org.apache.jena.sparql.engine.binding; /** Special purpose binding for the root of all bindings. */ - - public class BindingRoot extends Binding0 { public static Binding create() { return new BindingRoot() ; } http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java index a6f8058..eb7170e 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java @@ -20,29 +20,33 @@ package org.apache.jena.sparql.engine.iterator; import org.apache.jena.atlas.io.IndentedWriter ; import org.apache.jena.sparql.engine.ExecutionContext ; +import org.apache.jena.sparql.engine.QueryIterator; import org.apache.jena.sparql.engine.binding.Binding ; import org.apache.jena.sparql.engine.binding.BindingRoot ; import org.apache.jena.sparql.serializer.SerializationContext ; +/** The root binding is one-row, no columns making it the join identity. + * It is useful to be able to spot it before having to activate a {@link QueryIterator}. + * Executing with a pre-set binding does not use QueryIterRoot. + */ public class QueryIterRoot extends QueryIterSingleton { - public static QueryIterRoot create(ExecutionContext execCxt) + public static QueryIterator createRoot(ExecutionContext execCxt) { return new QueryIterRoot(BindingRoot.create(), execCxt) ; } - public static QueryIterRoot create(Binding binding, ExecutionContext execCxt) - { return new QueryIterRoot(binding, execCxt) ; } - - private QueryIterRoot(Binding binding, ExecutionContext execCxt) - { + private QueryIterRoot(Binding binding, ExecutionContext execCxt) { super(binding, execCxt) ; } @Override - public void output(IndentedWriter out, SerializationContext sCxt) - { + public void output(IndentedWriter out, SerializationContext sCxt) { if ( binding instanceof BindingRoot ) out.print("QueryIterRoot"); else + // Not used out.print("QueryIterRoot: "+binding); } + + @Override + public boolean isJoinIdentity() { return true; } } http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java index f97c5c1..a8ab2f4 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java @@ -320,9 +320,9 @@ public class OpExecutor protected QueryIterator execute(OpTable opTable, QueryIterator input) { if (opTable.isJoinIdentity()) return input ; - if (input instanceof QueryIterRoot) { + if (input.isJoinIdentity() ) { input.close() ; - return opTable.getTable().iterator(execCxt) ; + return opTable.getTable().iterator(execCxt); } QueryIterator qIterT = opTable.getTable().iterator(execCxt) ; QueryIterator qIter = Join.join(input, qIterT, execCxt) ; @@ -435,7 +435,7 @@ public class OpExecutor } public static QueryIterator createRootQueryIterator(ExecutionContext execCxt) { - return QueryIterRoot.create(execCxt) ; + return QueryIterRoot.createRoot(execCxt) ; } protected QueryIterator root() { http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java index c9a85aa..861242a 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java @@ -27,6 +27,7 @@ import org.apache.jena.sparql.core.DatasetGraph ; import org.apache.jena.sparql.engine.* ; import org.apache.jena.sparql.engine.binding.Binding ; import org.apache.jena.sparql.engine.iterator.QueryIterRoot ; +import org.apache.jena.sparql.engine.iterator.QueryIterSingleton; import org.apache.jena.sparql.engine.iterator.QueryIteratorCheck ; import org.apache.jena.sparql.engine.iterator.QueryIteratorTiming ; import org.apache.jena.sparql.util.Context ; @@ -49,7 +50,10 @@ public class QueryEngineMain extends QueryEngineBase public QueryIterator eval(Op op, DatasetGraph dsg, Binding input, Context context) { ExecutionContext execCxt = new ExecutionContext(context, dsg.getDefaultGraph(), dsg, QC.getFactory(context)) ; - QueryIterator qIter1 = QueryIterRoot.create(input, execCxt) ; + QueryIterator qIter1 = + ( input.isEmpty() ) + ? QueryIterRoot.createRoot(execCxt) + : QueryIterSingleton.create(input, execCxt); QueryIterator qIter = QC.execute(op, qIter1, execCxt) ; // Wrap with something to check for closed iterators. qIter = QueryIteratorCheck.check(qIter, execCxt) ; http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/StageGeneratorGeneric.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/StageGeneratorGeneric.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/StageGeneratorGeneric.java index fd07195..e639267 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/StageGeneratorGeneric.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/StageGeneratorGeneric.java @@ -28,7 +28,6 @@ import org.apache.jena.sparql.engine.QueryIterator ; import org.apache.jena.sparql.engine.binding.Binding ; import org.apache.jena.sparql.engine.iterator.QueryIterBlockTriples ; import org.apache.jena.sparql.engine.iterator.QueryIterPeek ; -import org.apache.jena.sparql.engine.iterator.QueryIterRoot ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderLib ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderProc ; import org.apache.jena.sparql.engine.optimizer.reorder.ReorderTransformation ; @@ -63,20 +62,18 @@ public class StageGeneratorGeneric implements StageGenerator { return input ; if ( reorder != null && pattern.size() >= 2 ) { - // If pattern size is 0 or one, nothing to do. + // If pattern size is 0 or 1, nothing to do. BasicPattern bgp2 = pattern ; // Try to ground the pattern - if ( ! ( input instanceof QueryIterRoot ) ) { + if ( ! input.isJoinIdentity() ) { QueryIterPeek peek = QueryIterPeek.create(input, execCxt) ; - Binding b = peek.peek() ; - // And use this one + // And now use this one input = peek ; + Binding b = peek.peek() ; bgp2 = Substitute.substitute(pattern, b) ; - // ---- common ReorderProc reorderProc = reorder.reorderIndexes(bgp2) ; pattern = reorderProc.reorder(pattern) ; - } } Explain.explain("Reorder/generic", pattern, execCxt.getContext()) ; http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/Eval.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/Eval.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/Eval.java index 40608d2..5843728 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/Eval.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/Eval.java @@ -159,7 +159,7 @@ public class Eval if ( g == null ) return new TableEmpty() ; ExecutionContext cxt2 = new ExecutionContext(cxt, g) ; - QueryIterator qIter = executeBGP(pattern, QueryIterRoot.create(cxt2), cxt2) ; + QueryIterator qIter = executeBGP(pattern, QueryIterRoot.createRoot(cxt2), cxt2) ; return TableFactory.create(qIter) ; } else @@ -180,7 +180,7 @@ public class Eval // Eval the pattern, eval the variable, join. // Pattern may be non-linear in the variable - do a pure execution. Table t1 = TableFactory.create(gVar, gn) ; - QueryIterator qIter = executeBGP(pattern, QueryIterRoot.create(cxt2), cxt2) ; + QueryIterator qIter = executeBGP(pattern, QueryIterRoot.createRoot(cxt2), cxt2) ; Table t2 = TableFactory.create(qIter) ; Table t3 = evaluator.join(t1, t2) ; concat.add(t3.iterator(cxt2)) ; http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/EvaluatorSimple.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/EvaluatorSimple.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/EvaluatorSimple.java index fb57584..f14befa 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/EvaluatorSimple.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/EvaluatorSimple.java @@ -63,7 +63,7 @@ public class EvaluatorSimple implements Evaluator @Override public Table basicPattern(BasicPattern pattern) { - QueryIterator qIter = QC.executeDirect(pattern, QueryIterRoot.create(execCxt), execCxt) ; + QueryIterator qIter = QC.executeDirect(pattern, QueryIterRoot.createRoot(execCxt), execCxt) ; return TableFactory.create(qIter) ; } @@ -72,7 +72,7 @@ public class EvaluatorSimple implements Evaluator { // Shudder - this may well be expensive, but this is the simple evaluator, written for correctness. QueryIterator qIter = new QueryIterPath(triplePath, - QueryIterRoot.create(execCxt), + QueryIterRoot.createRoot(execCxt), execCxt) ; return TableFactory.create(qIter) ; } http://git-wip-us.apache.org/repos/asf/jena/blob/b1ff0c1c/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java index 643411c..0def867 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java @@ -210,7 +210,7 @@ abstract public class PathEngine PropertyFunction pf = f.create(p.getURI()) ; PropFuncArg sv = arg(s, "S") ; PropFuncArg ov = arg(o, "O") ; - QueryIterator r = QueryIterRoot.create(new ExecutionContext(context, graph, null, null)) ; + QueryIterator r = QueryIterRoot.createRoot(new ExecutionContext(context, graph, null, null)) ; QueryIterator qIter = pf.exec(r, sv, p, ov, new ExecutionContext(ARQ.getContext(), graph, null, null)) ; if ( ! qIter.hasNext() ) return Iter.nullIterator() ;
