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/13 22:30:21 UTC
svn commit: r1467700 - in /jena/trunk/jena-arq/src:
main/java/com/hp/hpl/jena/sparql/algebra/optimize/
main/java/com/hp/hpl/jena/sparql/engine/main/
test/java/com/hp/hpl/jena/sparql/algebra/
Author: andy
Date: Sat Apr 13 20:30:20 2013
New Revision: 1467700
URL: http://svn.apache.org/r1467700
Log:
Fix filter/equlaity transform.
Better join and leftjoin classification for optimzation.
Modified:
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/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/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=1467700&r1=1467699&r2=1467700&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 Apr 13 20:30:20 2013
@@ -18,12 +18,13 @@
package com.hp.hpl.jena.sparql.algebra.optimize;
+import static org.apache.jena.atlas.lib.CollectionUtils.disjoint ;
+
import java.util.ArrayList ;
import java.util.Collection ;
import java.util.List ;
import java.util.Set ;
-import static org.apache.jena.atlas.lib.CollectionUtils.disjoint ;
import org.apache.jena.atlas.lib.Pair ;
import com.hp.hpl.jena.query.ARQ ;
@@ -33,6 +34,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.core.VarExprList ;
import com.hp.hpl.jena.sparql.expr.* ;
public class TransformFilterEquality extends TransformCopy
@@ -174,16 +176,17 @@ public class TransformFilterEquality ext
private static boolean safeToTransform(Collection<Var> varsEquality, Op op)
{
+ // Structure as a visitor?
if ( op instanceof OpBGP || op instanceof OpQuadPattern )
return true ;
if ( op instanceof OpFilter )
{
OpFilter opf = (OpFilter)op ;
-
- Collection<Var> fvars = opf.getExprs().getVarsMentioned() ;
- if ( ! disjoint(fvars, varsEquality) )
- return false ;
+ // Expressions are always safe transform by substitution.
+// Collection<Var> fvars = opf.getExprs().getVarsMentioned() ;
+// if ( ! disjoint(fvars, varsEquality) )
+// return false ;
return safeToTransform(varsEquality, opf.getSubOp()) ;
}
@@ -224,7 +227,7 @@ public class TransformFilterEquality ext
// Needs more investigation.
Op opLeft = opleftjoin.getLeft() ;
- Set<Var> varsLeft = OpVars.patternVars(opLeft) ;
+ Set<Var> varsLeft = OpVars.visibleVars(opLeft) ;
if ( varsLeft.containsAll(varsEquality) )
return true ;
return false ;
@@ -236,17 +239,56 @@ public class TransformFilterEquality ext
return safeToTransform(varsEquality, opg.getSubOp()) ;
}
+ // Subquery - assume scope rewriting has already been applied.
+ if ( op instanceof OpModifier )
+ {
+ // ORDER BY?
+ OpModifier opMod = (OpModifier)op ;
+ if ( opMod instanceof OpProject )
+ {
+ OpProject opProject = (OpProject)op ;
+ // Writing "SELECT ?var" for "?var" -> a value would need AS-ification.
+ for ( Var v : opProject.getVars() )
+ {
+ if ( varsEquality.contains(v) )
+ return false ;
+ }
+ }
+ return safeToTransform(varsEquality, opMod.getSubOp()) ;
+ }
+
+ if ( op instanceof OpGroup )
+ {
+ OpGroup opGroup = (OpGroup)op ;
+ VarExprList varExprList = opGroup.getGroupVars() ;
+ return safeToTransform(varsEquality, varExprList) &&
+ safeToTransform(varsEquality, opGroup.getSubOp()) ;
+ }
+
+ // Op1 - OpGroup
+ // Op1 - OpOrder
+ // Op1 - OpAssign, OpExtend
+ // Op1 - OpFilter - done.
+ // Op1 - OpLabel - easy
+ // Op1 - OpService - no.
+
return false ;
}
+ private static boolean safeToTransform(Collection<Var> varsEquality, VarExprList varsExprList)
+ {
+ // If the named variable is used, unsafe to rewrite.
+ return disjoint(varsExprList.getVars(), varsEquality) ;
+ }
+
// -- A special case
private static boolean testSpecialCaseUnused(Op op, List<Pair<Var, NodeValue>> equalities, ExprList remaining)
{
// If the op does not contain the var at all, for some equality
- // then the filter expression wil/ be "eval unbound" i.e. false.
+ // then the filter expression will be "eval unbound" i.e. false.
// We can return empty table.
- Set<Var> patternVars = OpVars.patternVars(op) ;
+ Set<Var> patternVars = OpVars.visibleVars(op) ;
for ( Pair<Var, NodeValue> p : equalities )
{
if ( ! patternVars.contains(p.getLeft()))
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=1467700&r1=1467699&r2=1467700&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 Sat Apr 13 20:30:20 2013
@@ -23,11 +23,7 @@ import java.util.Set ;
import org.apache.jena.atlas.lib.SetUtils ;
import com.hp.hpl.jena.sparql.algebra.Op ;
-import com.hp.hpl.jena.sparql.algebra.op.OpDiff ;
-import com.hp.hpl.jena.sparql.algebra.op.OpExt ;
-import com.hp.hpl.jena.sparql.algebra.op.OpJoin ;
-import com.hp.hpl.jena.sparql.algebra.op.OpMinus ;
-import com.hp.hpl.jena.sparql.algebra.op.OpModifier ;
+import com.hp.hpl.jena.sparql.algebra.op.* ;
import com.hp.hpl.jena.sparql.core.Var ;
public class JoinClassifier
@@ -44,11 +40,7 @@ public class JoinClassifier
{
left = effectiveOp(left) ;
right = effectiveOp(right) ;
-
- // Old: Subquery with modifier. Substitution does not apply.
- // Renaming should make this work.
- // With SELECT *, it's as if the subquery were just the pattern.
-
+
if (right instanceof OpModifier) return false ;
if (right instanceof OpDiff) return false ;
if (right instanceof OpMinus) return false ;
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=1467700&r1=1467699&r2=1467700&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 Sat Apr 13 20:30:20 2013
@@ -58,8 +58,7 @@ public class LeftJoinClassifier
if ( right instanceof OpModifier )
return false ;
- Set<Var> leftVars = OpVars.patternVars(left) ;
-
+ Set<Var> leftVars = OpVars.visibleVars(left) ;
VarFinder vf = new VarFinder(right) ;
Set<Var> optRight = vf.getOpt() ;
@@ -77,7 +76,7 @@ public class LeftJoinClassifier
{
Op left = JoinClassifier.effectiveOp(op.getLeft()) ;
Op right = JoinClassifier.effectiveOp(op.getRight()) ;
- Set<Var> leftVars = OpVars.patternVars(left) ;
+ Set<Var> leftVars = OpVars.visibleVars(left) ;
Set<Var> optRight = VarFinder.optDefined(right) ;
return SetUtils.intersection(leftVars, optRight) ;
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=1467700&r1=1467699&r2=1467700&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 Sat Apr 13 20:30:20 2013
@@ -99,11 +99,7 @@ public class TestClassify extends TestCa
@Test public void testClassify_Join_21()
{ classifyJ("{ { {} OPTIONAL { :s :p ?x } } {?s :p ?x } }", true) ; }
- // Not a join by adjacent BGP flattening.
-// @Test public void testClassify_Join_30()
-// { classifyJ("{ ?x ?y ?z {SELECT * { ?s ?p ?o} } }", true) ; }
-
- // Subselect with modifier is handled without linearization
+ // Will become true.
@Test public void testClassify_Join_31()
{ classifyJ("{ ?x ?y ?z {SELECT ?s { ?s ?p ?o} } }", false) ; }
@@ -170,6 +166,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.
@Test public void testClassify_LeftJoin_10()
{ classifyLJ("{ ?s ?p ?x OPTIONAL { SELECT ?s { ?s ?p ?o } } }", false) ; }