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/08/14 14:25:31 UTC

svn commit: r1372857 - /jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java

Author: andy
Date: Tue Aug 14 12:25:31 2012
New Revision: 1372857

URL: http://svn.apache.org/viewvc?rev=1372857&view=rev
Log:
Add small part of optimizing for unit table.

Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterEquality.java

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=1372857&r1=1372856&r2=1372857&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 Tue Aug 14 12:25:31 2012
@@ -27,14 +27,7 @@ import com.hp.hpl.jena.sparql.algebra.Tr
 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 ;
-import com.hp.hpl.jena.sparql.expr.E_SameTerm ;
-import com.hp.hpl.jena.sparql.expr.Expr ;
-import com.hp.hpl.jena.sparql.expr.ExprFunction2 ;
-import com.hp.hpl.jena.sparql.expr.ExprList ;
-import com.hp.hpl.jena.sparql.expr.ExprVar ;
-import com.hp.hpl.jena.sparql.expr.ExprVars ;
-import com.hp.hpl.jena.sparql.expr.NodeValue ;
+import com.hp.hpl.jena.sparql.expr.* ;
 
 public class TransformFilterEquality extends TransformCopy
 {
@@ -101,7 +94,8 @@ public class TransformFilterEquality ext
     
     private static boolean safeToTransform(ExprList exprs, Op op)
     {
-        if ( op instanceof OpBGP || op instanceof OpQuadPattern ) return true ;
+        if ( op instanceof OpBGP || op instanceof OpQuadPattern )
+            return true ;
         
         // This will be applied also in sub-calls of the Transform but queries 
         // are very rarely so deep that it matters. 
@@ -132,10 +126,19 @@ public class TransformFilterEquality ext
                 return false ;
             
             Op opLeft = opleftjoin.getLeft() ;
-            // ?? Slightly stronger condition that OpConditional transformation.
-            Set<Var> x = OpVars.patternVars(opLeft) ;
+            //Op opRight = opleftjoin.getRight() ;
+            // ?? Slightly stronger condition than OpConditional transformation.
+            //    ** Extract out the (conditional) condition
+            //    ** Reorder so join optimization does first and be more aggregsssive if (conditional).
+            // The requirment is that all expression vars are certainy bound.
+            
+            Set<Var> varsLeft = OpVars.patternVars(opLeft) ;
+            //Set<Var> varsRight = OpVars.patternVars(opRight) ;
             Set<Var> y = ExprVars.getVarsMentioned(exprs) ;
-            if ( x.containsAll(y) )
+            
+            //if ( varsLeft.containsAll(y) )
+            
+            if ( varsLeft.containsAll(y) )
                 return true ;
             return false ;
         }
@@ -146,6 +149,12 @@ public class TransformFilterEquality ext
             return safeToTransform(exprs, opg.getSubOp()) ;
         }
         
+        if (op instanceof OpTable )
+        {
+            if ( ((OpTable)op).isJoinIdentity() )
+                return true;
+        }
+        
         return false ;
     }
     
@@ -196,6 +205,10 @@ public class TransformFilterEquality ext
             return null ;
 
         if ( !patternVars.contains(var) )
+            // The underlying op does not define the variable.
+            // The filter will fail.  Could remove all together.
+            //return OpTable.empty() ;
+            // For now, play safe in this (rare?) case.
             return null ;
         
         // Corner case: sameTerm is false for string/plain literal,