You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2015/02/17 13:42:11 UTC
[02/50] [abbrv] jena git commit: JENA-881 : Don't leak filter
expressions into the unplaced list.
JENA-881 : Don't leak filter expressions into the unplaced list.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/4f5fd491
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/4f5fd491
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/4f5fd491
Branch: refs/heads/eliminate-assignments
Commit: 4f5fd491949127be1d4584df8444d1c4ac8772b5
Parents: 387bc73
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Feb 7 12:37:02 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Feb 7 12:37:02 2015 +0000
----------------------------------------------------------------------
.../optimize/TransformFilterPlacement.java | 34 +++++++++++++-------
1 file changed, 23 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/4f5fd491/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 023b03c..435d787 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
@@ -210,7 +210,6 @@ public class TransformFilterPlacement extends TransformCopy {
placement = placeAssign(exprs, (OpAssign)input) ;
// Modifiers
// else if ( input instanceof OpGroup ) {
-// // TODO
// placement = noChangePlacement ;
// }
// else if ( input instanceof OpSlice ) {
@@ -233,16 +232,29 @@ public class TransformFilterPlacement extends TransformCopy {
}
private Placement placeFilter(ExprList exprs, OpFilter input) {
- if ( exprs.size() == 0 )
- // Unpack the filter,
- return transform(input.getExprs(), input.getSubOp()) ;
-
- // Thrown the filter expressions into the general list to be placed.
- // Add to keep the application order (original filter then additional exprs)
- // Not important, but nice.
- ExprList exprs2 = ExprList.copy(input.getExprs()) ;
- exprs2.addAll(exprs);
- return transform(exprs2, input.getSubOp()) ;
+ // If input.getSubOp is itself a filter, it has already been
+ // processed because the Transform is applied bottom-up.
+
+ // We must not let the filter's expressions go back as "unplaced"
+ // as they are scoped to the input and if "unplaced" are available
+ // out of that scope.
+
+ Op op = input.getSubOp() ;
+ ExprList exprsInner = input.getExprs() ;
+ ExprList exprsOuter = exprs ;
+
+ // Outer
+ Placement p = transform(exprsOuter, input.getSubOp()) ;
+ if ( p != null ) {
+ op = p.op ;
+ exprsOuter = p.unplaced ;
+ }
+ // Put inner round the modified Op.
+ // If op is also a filter, a single filter is created with
+ // exprsInner now after placed filters.
+ // ("after" means later in the exprList of the filter).
+ Op f = OpFilter.filter(exprsInner, op) ;
+ return new Placement(f, exprsOuter) ;
}
private Placement placeOrWrapBGP(ExprList exprs, OpBGP x) {