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 <[email protected]> Authored: Sat Jan 31 13:13:52 2015 +0000 Committer: Andy Seaborne <[email protected]> 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))"
