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 2013/04/16 22:13:28 UTC

svn commit: r1468591 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java

Author: andy
Date: Tue Apr 16 20:13:28 2013
New Revision: 1468591

URL: http://svn.apache.org/r1468591
Log:
Expand the optimization of joins to include simple projection on right side.

Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java?rev=1468591&r1=1468590&r2=1468591&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java Tue Apr 16 20:13:28 2013
@@ -38,10 +38,18 @@ public class JoinClassifier
 
     static public boolean isLinear(Op left, Op right)
     {
+        // OpModifier: OpDistinct, OpList, OpOrder, OpProject, OpReduced, OpSlice, OpTopN 
+        // All OK if sub OK.
+        // NB Project: substitution works -- do nothing to project of a substituted variable
+        // because it won't actually occur in the bindings. 
+
         left = effectiveOp(left) ;
         right = effectiveOp(right) ;
         
-        if (right instanceof OpModifier) return false ;
+        // OpExtend, OpAssign, OpGroup - dubious
+        if (right instanceof OpExtend) return false ;
+        if (right instanceof OpAssign) return false ;
+        if (right instanceof OpGroup) return false ;
         if (right instanceof OpDiff) return false ;
         if (right instanceof OpMinus) return false ;
 
@@ -126,10 +134,12 @@ public class JoinClassifier
         return !bad1 && !bad2 ;
     }
 
-    static public Op effectiveOp(Op op)
+    private static Op effectiveOp(Op op)
     {
-        if (op instanceof OpExt) op = ((OpExt) op).effectiveOp() ;
+        if (op instanceof OpExt)
+            op = ((OpExt) op).effectiveOp() ;
+        while(op instanceof OpModifier )
+            op = ((OpModifier)op).getSubOp() ;
         return op ;
     }
-
 }

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java?rev=1468591&r1=1468590&r2=1468591&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/main/LeftJoinClassifier.java Tue Apr 16 20:13:28 2013
@@ -24,6 +24,7 @@ import org.apache.jena.atlas.lib.SetUtil
 
 import com.hp.hpl.jena.sparql.algebra.Op ;
 import com.hp.hpl.jena.sparql.algebra.OpVars ;
+import com.hp.hpl.jena.sparql.algebra.op.OpExt ;
 import com.hp.hpl.jena.sparql.algebra.op.OpLeftJoin ;
 import com.hp.hpl.jena.sparql.algebra.op.OpModifier ;
 import com.hp.hpl.jena.sparql.core.Var ;
@@ -50,8 +51,8 @@ public class LeftJoinClassifier
     }
     static public boolean isLinear(Op left, Op right)
     {
-        left = JoinClassifier.effectiveOp(left) ;
-        right = JoinClassifier.effectiveOp(right) ;
+        left = effectiveOp(left) ;
+        right = effectiveOp(right) ;
         
         // Subquery with modifier.  Substitution does not apply.
         // With SELECT *, it's as if the subquery were just the pattern.
@@ -74,11 +75,19 @@ public class LeftJoinClassifier
     
     static public Set<Var> nonLinearVars(OpLeftJoin op)
     {
-        Op left = JoinClassifier.effectiveOp(op.getLeft()) ;
-        Op right = JoinClassifier.effectiveOp(op.getRight()) ;
+        Op left = effectiveOp(op.getLeft()) ;
+        Op right = effectiveOp(op.getRight()) ;
         Set<Var> leftVars = OpVars.visibleVars(left) ;
         Set<Var> optRight = VarFinder.optDefined(right) ;
 
         return SetUtils.intersection(leftVars, optRight) ;
     }
+    
+    private static Op effectiveOp(Op op)
+    {
+        if (op instanceof OpExt)
+            op = ((OpExt) op).effectiveOp() ;
+        return op ;
+    }
+
 }

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java?rev=1468591&r1=1468590&r2=1468591&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestClassify.java Tue Apr 16 20:13:28 2013
@@ -99,9 +99,8 @@ public class TestClassify extends TestCa
     @Test public void testClassify_Join_21() 
     { classifyJ("{ { {} OPTIONAL { :s :p ?x } } {?s :p ?x } }", true) ; }
 
-    // Will become true.
     @Test public void testClassify_Join_31() 
-    { classifyJ("{ ?x ?y ?z {SELECT ?s { ?s ?p ?o} } }", false) ; }
+    { classifyJ("{ ?x ?y ?z {SELECT ?s { ?s ?p ?o} } }", true) ; }
 
     // Use of a filter variable not in from the LHS
     @Test public void testClassify_Join_32() 
@@ -166,7 +165,7 @@ public class TestClassify extends TestCa
     @Test public void testClassify_LeftJoin_07()
     { classifyLJ("{ ?s ?p ?x OPTIONAL { ?s ?p ?x1 OPTIONAL { ?s ?p ?x2 FILTER(?x) } } }", false)  ; }
 
-    // Can't lineraize into a projection.
+    // Can't linearize into a projection.
     @Test public void testClassify_LeftJoin_10()
     { classifyLJ("{ ?s ?p ?x OPTIONAL { SELECT ?s { ?s ?p ?o } } }", false)  ; }