Short cut MINUS evaluation when the RHS is empty. Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/7c8ba919 Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/7c8ba919 Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/7c8ba919
Branch: refs/heads/JENA-507 Commit: 7c8ba91980ec7a130e3b79f3a60b7ba6ad5d8ad7 Parents: 9230bbd Author: Andy Seaborne <[email protected]> Authored: Fri Jan 22 16:16:12 2016 +0000 Committer: Andy Seaborne <[email protected]> Committed: Fri Jan 22 16:16:12 2016 +0000 ---------------------------------------------------------------------- .../sparql/engine/iterator/QueryIterMinus.java | 91 +++++++++----------- .../jena/sparql/engine/main/OpExecutor.java | 2 +- 2 files changed, 44 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/7c8ba919/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java index fe47d89..2ae1ce1 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterMinus.java @@ -18,72 +18,67 @@ package org.apache.jena.sparql.engine.iterator; -import java.util.Map; -import java.util.Set ; +import java.util.Set; -import org.apache.jena.graph.Node ; -import org.apache.jena.sparql.core.Var ; -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.index.IndexFactory ; -import org.apache.jena.sparql.engine.index.IndexTable ; +import org.apache.jena.sparql.core.Var; +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.index.IndexFactory; +import org.apache.jena.sparql.engine.index.IndexTable; /** Minus by materializing the RHS - this is not streamed on the right */ -public class QueryIterMinus extends QueryIter2 -{ - private IndexTable tableRight; - private Map<Var, Integer> varColumns ; - private Set<Node[]> rightTable; - Binding slot = null ; +public class QueryIterMinus extends QueryIter2 { + private final IndexTable tableRight; + private Binding slot = null; - public QueryIterMinus(QueryIterator left, QueryIterator right, Set<Var> commonVars, ExecutionContext qCxt) - { - super(left, right, qCxt) ; - tableRight = IndexFactory.createIndex(commonVars, right) ; + public static QueryIterator create(QueryIterator left, QueryIterator right, Set<Var> commonVars, ExecutionContext qCxt) { + if ( ! right.hasNext() ) + // Empty MINUS left + return left ; + return new QueryIterMinus(left, right, commonVars, qCxt) ; + } + + private QueryIterMinus(QueryIterator left, QueryIterator right, Set<Var> commonVars, ExecutionContext qCxt) { + super(left, right, qCxt); + tableRight = IndexFactory.createIndex(commonVars, right); } - protected Binding getNextSlot(Binding bindingLeft) - { + protected Binding getNextSlot(Binding bindingLeft) { if ( tableRight.containsCompatibleWithSharedDomain(bindingLeft) ) - return null ; - + return null; return bindingLeft; } @Override - protected final void closeSubIterator() { } - + protected final void closeSubIterator() {} + @Override - protected void requestSubCancel() { } - + protected void requestSubCancel() {} + @Override - protected final boolean hasNextBinding() - { + protected final boolean hasNextBinding() { if ( slot != null ) - return true ; - - while ( getLeft().hasNext() ) - { - Binding bindingLeft = getLeft().nextBinding() ; - slot = getNextSlot(bindingLeft) ; - if ( slot != null ) - { - slot = bindingLeft ; - return true ; + return true; + + while (getLeft().hasNext()) { + Binding bindingLeft = getLeft().nextBinding(); + slot = getNextSlot(bindingLeft); + if ( slot != null ) { + slot = bindingLeft; + return true; } } - getLeft().close() ; - return false ; + getLeft().close(); + return false; } @Override - protected final Binding moveToNextBinding() - { - if ( ! hasNextBinding() ) - return null ; - Binding x = slot ; - slot = null ; - return x ; + protected final Binding moveToNextBinding() { + if ( !hasNextBinding() ) + return null; + Binding x = slot; + slot = null; + return x; } } http://git-wip-us.apache.org/repos/asf/jena/blob/7c8ba919/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 3929975..d301a38 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 @@ -263,7 +263,7 @@ public class OpExecutor Set<Var> commonVars = OpVars.visibleVars(lhsOp) ; commonVars.retainAll(OpVars.visibleVars(rhsOp)) ; - return new QueryIterMinus(left, right, commonVars, execCxt) ; + return QueryIterMinus.create(left, right, commonVars, execCxt) ; } protected QueryIterator execute(OpDisjunction opDisjunction, QueryIterator input) {
