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 2012/06/09 14:14:33 UTC
svn commit: r1348369 - in
/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize:
Optimize.java TransformFilterEquality.java TransformFilterPlacement.java
Author: andy
Date: Sat Jun 9 12:14:32 2012
New Revision: 1348369
URL: http://svn.apache.org/viewvc?rev=1348369&view=rev
Log:
Apply filter equality transformations to pre- and post- other optimization forms.
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java?rev=1348369&r1=1348368&r2=1348369&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java Sat Jun 9 12:14:32 2012
@@ -169,8 +169,8 @@ public class Optimize implements Rewrite
op = apply("Break up IN and NOT IN", new TransformExpandOneOf(), op) ;
// TODO Improve filter placement to go through assigns that have no effect.
- // Do this before filter placement and other sequence generating transformations.
- // or improve to place in a sequence.
+ // Either, do filter placement and other sequence generating transformations.
+ // or improve to place in a sequence (latter is better?)
if ( context.isTrueOrUndef(ARQ.optFilterEquality) )
{
@@ -192,7 +192,7 @@ public class Optimize implements Rewrite
op = apply("Distinct replaced with reduced", new TransformDistinctToReduced(), op) ;
// Convert paths to triple patterns.
- // Also done in the AlgebraGenerator so this transofmr step catches programattically built op expressions
+ // Also done in the AlgebraGenerator so this transform step catches programattically built op expressions
op = apply("Path flattening", new TransformPathFlattern(), op) ;
// Find joins/leftJoin that can be done by index joins (generally preferred as fixed memory overhead).
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java?rev=1348369&r1=1348368&r2=1348369&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java Sat Jun 9 12:14:32 2012
@@ -24,13 +24,7 @@ import com.hp.hpl.jena.query.ARQ ;
import com.hp.hpl.jena.sparql.algebra.Op ;
import com.hp.hpl.jena.sparql.algebra.OpVars ;
import com.hp.hpl.jena.sparql.algebra.TransformCopy ;
-import com.hp.hpl.jena.sparql.algebra.op.OpAssign ;
-import com.hp.hpl.jena.sparql.algebra.op.OpBGP ;
-import com.hp.hpl.jena.sparql.algebra.op.OpConditional ;
-import com.hp.hpl.jena.sparql.algebra.op.OpFilter ;
-import com.hp.hpl.jena.sparql.algebra.op.OpGraph ;
-import com.hp.hpl.jena.sparql.algebra.op.OpQuadPattern ;
-import com.hp.hpl.jena.sparql.algebra.op.OpSequence ;
+import com.hp.hpl.jena.sparql.algebra.op.* ;
import com.hp.hpl.jena.sparql.core.Substitute ;
import com.hp.hpl.jena.sparql.core.Var ;
import com.hp.hpl.jena.sparql.expr.E_Equals ;
@@ -108,12 +102,35 @@ public class TransformFilterEquality ext
private static boolean safeToTransform(ExprList exprs, Op op)
{
if ( op instanceof OpBGP || op instanceof OpQuadPattern ) return true ;
- if ( op instanceof OpSequence ) return true ;
+
+ // This will be applied also in sub-calls of the Transform but queries
+ // are very rarely so deep that it matters.
+ if ( op instanceof OpSequence )
+ {
+ OpN opN = (OpN)op ;
+ for ( Op subOp : opN.getElements() )
+ {
+ if ( ! safeToTransform(exprs, subOp) )
+ return false ;
+ }
+ return true ;
+ }
+
+ if ( op instanceof OpJoin )
+ {
+ Op2 op2 = (Op2)op ;
+ return safeToTransform(exprs, op2.getLeft()) && safeToTransform(exprs, op2.getRight()) ;
+ }
// Not safe unless filter is on the RHS.
if ( op instanceof OpConditional )
{
OpConditional opCond = (OpConditional)op ;
+
+ if ( ! safeToTransform(exprs, opCond.getLeft()) ||
+ ! safeToTransform(exprs, opCond.getRight()) )
+ return false ;
+
Op opLeft = opCond.getLeft() ;
Set<Var> x = OpVars.patternVars(opLeft) ;
@@ -125,7 +142,6 @@ public class TransformFilterEquality ext
if ( op instanceof OpGraph )
{
- // ???
OpGraph opg = (OpGraph)op ;
return safeToTransform(exprs, opg.getSubOp()) ;
}
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java?rev=1348369&r1=1348368&r2=1348369&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java Sat Jun 9 12:14:32 2012
@@ -98,6 +98,7 @@ public class TransformFilterPlacement ex
private static Op transform(ExprList exprs, Set<Var> varsScope, Op x)
{
+ // OpAssign could be done if the assignment and exprs are independent.
// TODO Dispatch by visitor
if ( x instanceof OpBGP )
return transformFilterBGP(exprs, varsScope, (OpBGP)x) ;