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 2015/10/03 19:11:56 UTC
[2/5] jena git commit: JENA-1049: Implement remaining Ops
JENA-1049: Implement remaining Ops
Because of inner selects, all optimziation ops can also be present in
the form being classified, and hence passed to VarFinder.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/4dbae033
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/4dbae033
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/4dbae033
Branch: refs/heads/master
Commit: 4dbae033d54c15c12a9ce389ff20ec097e8416ef
Parents: 4c9cda4
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Oct 3 10:33:59 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Oct 3 10:33:59 2015 +0100
----------------------------------------------------------------------
.../jena/sparql/engine/main/VarFinder.java | 44 ++++++++++--------
.../sparql/algebra/optimize/TestOptimizer.java | 49 +++++++++++++++++++-
2 files changed, 71 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/4dbae033/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
index 9e60fae..a65b73c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
@@ -30,7 +30,6 @@ import java.util.Map ;
import java.util.Map.Entry ;
import java.util.Set ;
-import org.apache.jena.atlas.lib.NotImplemented ;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.OpVisitor ;
import org.apache.jena.sparql.algebra.op.* ;
@@ -164,15 +163,24 @@ public class VarFinder
@Override
public void visit(OpMinus opMinus) {
- mergeVars(opMinus.getLeft()) ;
- VarUsageVisitor usage = VarUsageVisitor.apply(opMinus.getRight());
+ mergeMinusDiff(opMinus.getLeft(), opMinus.getRight()) ;
+ }
+
+ @Override
+ public void visit(OpDiff opDiff) {
+ mergeMinusDiff(opDiff.getLeft(), opDiff.getRight()) ;
+ }
+
+ private void mergeMinusDiff(Op left, Op right) {
+ mergeVars(left) ;
+ VarUsageVisitor usage = VarUsageVisitor.apply(right);
// Everything in the right side is really a filter.
filterMentions.addAll(usage.defines) ;
filterMentions.addAll(usage.optDefines) ;
filterMentions.addAll(usage.filterMentions) ;
filterMentions.addAll(usage.assignMentions) ;
}
-
+
@Override
public void visit(OpConditional opLeftJoin) {
leftJoin(opLeftJoin.getLeft(), opLeftJoin.getRight(), null);
@@ -292,6 +300,12 @@ public class VarFinder
public void visit(OpList opList) { mergeVars(opList.getSubOp()) ; }
@Override
+ public void visit(OpService opService) { mergeVars(opService.getSubOp()) ; }
+
+ @Override
+ public void visit(OpTopN opTop) { mergeVars(opTop.getSubOp()) ; }
+
+ @Override
public void visit(OpOrder opOrder) {
mergeVars(opOrder.getSubOp()) ;
opOrder.getConditions().forEach(sc-> {
@@ -314,22 +328,12 @@ public class VarFinder
addVar(defines, dsNames.getGraphNode()) ;
}
- // Not implemented: with checking.
-
- private void no() {
- throw new NotImplemented() ;
- }
-
@Override
- public void visit(OpProcedure opProc) { no() ; }
-
- @Override
- public void visit(OpService opService) { no(); }
-
- @Override
- public void visit(OpDiff opDiff) { no(); }
-
- @Override
- public void visit(OpTopN opTop) { no(); }
+ public void visit(OpProcedure opProc) {
+ for ( Expr expr : opProc.getArgs() ) {
+ Set<Var> vars = expr.getVarsMentioned() ;
+ defines.addAll(vars) ;
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/4dbae033/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestOptimizer.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestOptimizer.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestOptimizer.java
index 947bbe4..b8656d0 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestOptimizer.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/optimize/TestOptimizer.java
@@ -24,7 +24,6 @@ import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.op.OpAssign ;
import org.apache.jena.sparql.algebra.op.OpExtend ;
import org.apache.jena.sparql.algebra.op.OpTable ;
-import org.apache.jena.sparql.algebra.optimize.TransformExtendCombine ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.core.VarExprList ;
import org.apache.jena.sparql.expr.ExprVar ;
@@ -292,7 +291,7 @@ public class TestOptimizer extends AbstractTestTransform
// JENA-809 : check no changes to input.
String x = "(project (?x) (extend ((?bar 2)) (extend ((?foo 1)) (table unit))))" ;
String y = "(project (?x) (extend ((?foo 1) (?bar 2)) (table unit)))" ;
- AbstractTestTransform.checkAlgebra(x, new TransformExtendCombine(), y);
+ checkAlgebra(x, new TransformExtendCombine(), y);
}
@@ -362,5 +361,51 @@ public class TestOptimizer extends AbstractTestTransform
AbstractTestTransform.checkAlgebra(x, new TransformExtendCombine(), y);
}
+ // Nested
+/*
+ * String qs = StrUtils.strjoinNL
+ ("select *",
+ "where {",
+ " { select * { ?id ?p ?label } order by ?label limit 5 }",
+ " OPTIONAL { OPTIONAL { ?s ?p ?label }}",
+ "}"
+ );
+ */
+ // Derived from JENA-1041 (inner TopN)
+ @Test public void subselect_01() {
+ String qs = StrUtils.strjoinNL
+ ("select *",
+ "where {",
+ " { select * { ?id ?p ?label } order by ?label limit 5 }",
+ " ?s ?p ?label",
+ "}"
+ );
+ String expected = StrUtils.strjoinNL
+ ("(sequence"
+ ," (top (5 ?label)"
+ ," (bgp (triple ?id ?p ?label)))"
+ ," (bgp (triple ?s ?p ?label)))") ;
+ check(qs, expected) ;
+ }
+
+ // Derived from JENA-1041 (inner TopN)
+ @Test public void subselect_02() {
+ // Has a blocking optional pattern for the join strategy.
+ String qs = StrUtils.strjoinNL
+ ("select *",
+ "where {",
+ " { select * { ?id ?p ?label } order by ?label limit 5 }",
+ " OPTIONAL { OPTIONAL { ?s ?p ?label }}",
+ "}"
+ );
+ String expected = StrUtils.strjoinNL
+ ("(leftjoin"
+ ," (top (5 ?label)"
+ ," (bgp (triple ?id ?p ?label)))"
+ ," (conditional"
+ ," (table unit)"
+ ," (bgp (triple ?s ?p ?label))))") ;
+ check(qs, expected) ;
+ }
}