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))"