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