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/02/06 13:51:10 UTC
[3/4] jena git commit: Help for debugging filter placement.
Help for debugging filter placement.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/fd14ac19
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/fd14ac19
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/fd14ac19
Branch: refs/heads/master
Commit: fd14ac19722b99f762fcb493d6f3d322a9f4a151
Parents: 2b3569f
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Feb 6 12:05:03 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Feb 6 12:05:03 2015 +0000
----------------------------------------------------------------------
.../optimize/TransformFilterPlacement.java | 92 +++++++++++++-------
1 file changed, 61 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/fd14ac19/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 c0f1ca1..023b03c 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
@@ -18,10 +18,14 @@ z * Licensed to the Apache Software Foundation (ASF) under one
package com.hp.hpl.jena.sparql.algebra.optimize ;
-import java.util.* ;
+import java.util.Collection ;
+import java.util.Iterator ;
+import java.util.List ;
+import java.util.Set ;
import org.apache.jena.atlas.lib.CollectionUtils ;
import org.apache.jena.atlas.lib.DS ;
+import org.apache.jena.atlas.lib.Lib ;
import com.hp.hpl.jena.graph.Node ;
import com.hp.hpl.jena.graph.Triple ;
@@ -45,12 +49,28 @@ import com.hp.hpl.jena.sparql.util.VarUtils ;
*/
public class TransformFilterPlacement extends TransformCopy {
- static class Placement {
- final Op op ;
- final ExprList unplaced ;
- Placement(Op op, ExprList remaining) { this.op = op ; this.unplaced = remaining ; }
+ public static class Placement {
+ final public Op op ;
+ final public ExprList unplaced ;
+ public Placement(Op op, ExprList remaining) {
+ this.op = op ;
+ this.unplaced = remaining ;
+ }
+ @Override
+ public String toString() { return ""+op+" : "+unplaced ; }
+
+ @Override
+ public int hashCode() {
+ return 31*Lib.hashCodeObject(op,1) + Lib.hashCodeObject(unplaced) ;
+ }
@Override
- public String toString() { return ""+op+" : "+unplaced ; }
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true ;
+ if ( obj == null ) return false ;
+ if ( getClass() != obj.getClass() ) return false ;
+ Placement other = (Placement)obj ;
+ return Lib.equal(op, other.op) && Lib.equal(unplaced, other.unplaced) ;
+ }
}
// Empty, immutable ExprList
@@ -98,6 +118,16 @@ public class TransformFilterPlacement extends TransformCopy {
public TransformFilterPlacement(boolean includeBGPs)
{ this.includeBGPs = includeBGPs ; }
+ /** Operation exposes the filter placement mechanism
+ * so that investigation of filter placement issues
+ * can be done from outside this class.
+ * <i>Do not use in application code : subject to removal or change at any time.</i>
+ */
+ public static Placement filterPlacement$(ExprList exprs, Op op) {
+ TransformFilterPlacement t = new TransformFilterPlacement() ;
+ return t.transform(exprs, op) ;
+ }
+
@Override
public Op transform(OpFilter opFilter, Op x) {
ExprList exprs = opFilter.getExprs() ;
@@ -507,7 +537,7 @@ public class TransformFilterPlacement extends TransformCopy {
if ( pRight != null && ! pRight.unplaced.isEmpty() )
return noChangePlacement ;
- // Musrt be guarded by the above.
+ // Must be guarded by the above.
left = transformOpAlways(exprs, left) ;
right = transformOpAlways(exprs, right) ;
@@ -574,30 +604,6 @@ public class TransformFilterPlacement extends TransformCopy {
return processExtendAssign(exprs, input) ;
}
- /* Complete processing for an Op1.
- * Having split expressions into pushed and unpushed at this point,
- * try to push "pushed" down further into the subOp.
- */
- private Placement processSubOp1(ExprList pushed, ExprList unpushed, Op1 input) {
- Op opSub = input.getSubOp() ;
- Placement subPlacement = transform(pushed, opSub) ;
- if ( subPlacement == null ) {
- // (Same as if a placement of the exprlist and op passed in is given).
- // Didn't make any changes below, so add a filter for the 'pushed' and
- // return a placement for the unpushed.
- Op op1 = input.getSubOp() ;
- if ( pushed != null &&! pushed.isEmpty() )
- op1 = OpFilter.filter(pushed, op1) ;
- Op op2 = input.copy(op1) ;
- return result(op2, unpushed) ;
- }
- // We did make changes below. Add filter for these (which includes the
- // "pushed" at this level, now in the p.op or left in p.unplaced.
- Op op_a = OpFilter.filter(subPlacement.unplaced, subPlacement.op) ;
- op_a = input.copy(op_a) ;
- return result(op_a, unpushed) ;
- }
-
private Placement processExtendAssign(ExprList exprs, OpExtendAssign input) {
// We assume that each (extend) and (assign) is usually in simple form -
// always one assignment. We cope with the general form (multiple
@@ -669,6 +675,30 @@ public class TransformFilterPlacement extends TransformCopy {
// This is the cause of JENA-874.
+ /* Complete processing for an Op1.
+ * Having split expressions into pushed and unpushed at this point,
+ * try to push "pushed" down further into the subOp.
+ */
+ private Placement processSubOp1(ExprList pushed, ExprList unpushed, Op1 input) {
+ Op opSub = input.getSubOp() ;
+ Placement subPlacement = transform(pushed, opSub) ;
+ if ( subPlacement == null ) {
+ // (Same as if a placement of the exprlist and op passed in is given).
+ // Didn't make any changes below, so add a filter for the 'pushed' and
+ // return a placement for the unpushed.
+ Op op1 = input.getSubOp() ;
+ if ( pushed != null &&! pushed.isEmpty() )
+ op1 = OpFilter.filter(pushed, op1) ;
+ Op op2 = input.copy(op1) ;
+ return result(op2, unpushed) ;
+ }
+ // We did make changes below. Add filter for these (which includes the
+ // "pushed" at this level, now in the p.op or left in p.unplaced.
+ Op op_a = OpFilter.filter(subPlacement.unplaced, subPlacement.op) ;
+ op_a = input.copy(op_a) ;
+ return result(op_a, unpushed) ;
+ }
+
private Placement placeDistinctReduced(ExprList exprs, OpDistinctReduced input) {
Op subOp = input.getSubOp() ;
Placement p = transform(exprs, subOp) ;