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/01/31 14:15:30 UTC
[3/4] jena git commit: Place filters around extend/assign when
introduced variables allow it.
Place filters around extend/assign when introduced variables allow it.
JENA-875
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/e2ec1f74
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/e2ec1f74
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/e2ec1f74
Branch: refs/heads/master
Commit: e2ec1f745fcc83fcfb832315b7cf6fc1309ee084
Parents: 25d5ea4
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Jan 31 13:13:52 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Jan 31 13:13:52 2015 +0000
----------------------------------------------------------------------
.../optimize/TransformFilterPlacement.java | 50 +++++++++++++-------
.../optimize/TestTransformFilterPlacement.java | 19 ++++----
2 files changed, 45 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/e2ec1f74/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
index 2e4687f..0f43fa2 100644
--- a/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
+++ b/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
@@ -599,30 +599,48 @@ public class TransformFilterPlacement extends TransformCopy {
}
private Placement processExtendAssign(ExprList exprs, OpExtendAssign input) {
- // We assume that each (extend) and (assign) is in simple form - always one
- // assignment. We cope with the general form (multiple assignments)
- // but do not attempt reordering of assignments.
+ // We assume that each (extend) and (assign) is usually in simple form -
+ // always one assignment. We cope with the general form (multiple
+ // assignments) but do not attempt reordering of assignments.
+
+ // There are three cases:
+ // 1 - expressions that can be pushed into the subop.
+ // 2 - expressions that are covered when the extend/assign has applied.
+ // 3 - "unpushed" : expressions that are not covered even at the outermost level.
+
List<Var> vars1 = input.getVarExprList().getVars() ;
- ExprList pushed = new ExprList() ;
- ExprList unpushed = new ExprList() ;
Op subOp = input.getSubOp() ;
+
+ // Case 1 : Do as much inner placement as possible.
+ ExprList remaining = exprs ;
+ Placement p = transform(exprs, input.getSubOp()) ;
+ if ( p != null ) {
+ subOp = p.op ;
+ remaining = p.unplaced ;
+ }
+
+ // Case 2 : wrapping
+ // Case 3 : unplaced
+
+ // Variables in subop and introduced by (extend)/(assign)
Set<Var> subVars = OpVars.fixedVars(subOp) ;
+ subVars.addAll(input.getVarExprList().getVars()) ;
- for ( Expr expr : exprs ) {
+ ExprList wrapping = new ExprList() ;
+ ExprList unplaced = new ExprList() ;
+
+ for ( Expr expr : remaining ) {
Set<Var> exprVars = expr.getVarsMentioned() ;
- if ( disjoint(vars1, exprVars) && subVars.containsAll(exprVars) )
- pushed.add(expr);
+ if ( subVars.containsAll(exprVars) )
+ wrapping.add(expr) ;
else
- unpushed.add(expr) ;
+ unplaced.add(expr) ;
}
-
- if ( pushed.isEmpty() )
- return resultNoChange(input) ;
- // (filter ... (extend ... ))
- // ===>
- // (extend ... (filter ... ))
- return processSubOp1(pushed, unpushed, input) ;
+ Op result = input.copy(subOp) ;
+ if ( ! wrapping.isEmpty() )
+ result = OpFilter.filter(wrapping, result) ;
+ return result(result, unplaced) ;
}
private Placement placeProject(ExprList exprs, OpProject input) {
http://git-wip-us.apache.org/repos/asf/jena/blob/e2ec1f74/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
index 8ef081a..d1826d5 100644
--- a/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
+++ b/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
@@ -334,8 +334,7 @@ public class TestTransformFilterPlacement extends BaseTest { //extends AbstractT
// Same outcome as pre JENA-874 for different reasons.
@Test public void place_distinct_03() {
test("(filter (= ?x 123) (distinct (extend ((?x 123)) (bgp (?s ?p ?o)) )))",
- null) ;
- //"(distinct (filter (= ?x 123) (extend ((?x 123)) (bgp (?s ?p ?o)) )))") ;
+ "(distinct (filter (= ?x 123) (extend ((?x 123)) (bgp (?s ?p ?o)) )))") ;
}
@Test public void place_distinct_04() {
@@ -354,12 +353,16 @@ public class TestTransformFilterPlacement extends BaseTest { //extends AbstractT
null) ;
}
+ @Test public void place_reduced_04() {
+ test("(filter ((= ?o 456) (= ?z 987)) (reduced (bgp (?s ?p ?o) )))",
+ "(filter (= ?z 987) (reduced (filter (= ?o 456) (bgp (?s ?p ?o) ))))") ;
+ }
+
// Breaks for JENA-874 fix but correct (again) when JENA-875 applied.
// Same outcome as pre JENA-874 for different reasons.
@Test public void place_reduced_03() {
test("(filter (= ?x 123) (reduced (extend ((?x 123)) (bgp (?s ?p ?o)) )))",
- null ) ;
- //"(reduced (filter (= ?x 123) (extend ((?x 123)) (bgp (?s ?p ?o)) )))") ;
+ "(reduced (filter (= ?x 123) (extend ((?x 123)) (bgp (?s ?p ?o)) )))") ;
}
@Test public void place_extend_01() {
@@ -435,8 +438,8 @@ public class TestTransformFilterPlacement extends BaseTest { //extends AbstractT
," (extend ((?w 2))"
," (filter (= ?s 'S')"
," (extend ((?s 1))"
- ," (filter (= ?a 'A')"
- ," (distinct"
+ ," (distinct"
+ ," (filter (= ?a 'A')"
," (extend ((?a 2))"
," (filter (= ?b 'B')"
," (extend ((?b 1))"
@@ -529,8 +532,8 @@ public class TestTransformFilterPlacement extends BaseTest { //extends AbstractT
," (assign ((?w 2))"
," (filter (= ?s 'S')"
," (assign ((?s 1))"
- ," (filter (= ?a 'A')"
- ," (distinct"
+ ," (distinct"
+ ," (filter (= ?a 'A')"
," (assign ((?a 2))"
," (filter (= ?b 'B')"
," (assign ((?b 1))"