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