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 2011/05/19 15:30:57 UTC
svn commit: r1124756 - in /incubator/jena/Jena2/ARQ/trunk: src-dev/dev/
src/com/hp/hpl/jena/sparql/algebra/optimize/
src/com/hp/hpl/jena/sparql/engine/http/
src/com/hp/hpl/jena/sparql/engine/main/
Author: andy
Date: Thu May 19 13:30:56 2011
New Revision: 1124756
URL: http://svn.apache.org/viewvc?rev=1124756&view=rev
Log:
Optimizer bug in JoinStrategy
Modified:
incubator/jena/Jena2/ARQ/trunk/src-dev/dev/RunARQ.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformJoinStrategy.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/http/QueryEngineHTTP.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java
incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/VarFinder.java
Modified: incubator/jena/Jena2/ARQ/trunk/src-dev/dev/RunARQ.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-dev/dev/RunARQ.java?rev=1124756&r1=1124755&r2=1124756&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-dev/dev/RunARQ.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-dev/dev/RunARQ.java Thu May 19 13:30:56 2011
@@ -52,10 +52,14 @@ import com.hp.hpl.jena.sparql.ARQConstan
import com.hp.hpl.jena.sparql.ARQException ;
import com.hp.hpl.jena.sparql.algebra.Algebra ;
import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.Transformer ;
+import com.hp.hpl.jena.sparql.algebra.op.OpJoin ;
+import com.hp.hpl.jena.sparql.algebra.optimize.TransformJoinStrategy ;
import com.hp.hpl.jena.sparql.core.DatasetGraph ;
import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ;
import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
import com.hp.hpl.jena.sparql.engine.QueryExecutionBase ;
+import com.hp.hpl.jena.sparql.engine.main.JoinClassifier ;
import com.hp.hpl.jena.sparql.expr.Expr ;
import com.hp.hpl.jena.sparql.expr.ExprEvalException ;
import com.hp.hpl.jena.sparql.expr.NodeValue ;
@@ -102,28 +106,49 @@ public class RunARQ
}
public static void exit(int code)
- {
+ {System.out.flush() ;
System.out.println("DONE") ;
System.exit(code) ;
}
-
+
public static void main(String[] argv) throws Exception
{
- if ( true )
+ String x = StrUtils.strjoinNL("(join",
+ " (conditional",
+ //" (leftjoin",
+ " (bgp (triple ?s ?p1 ?o1))" ,
+ " (bgp (triple ?s <foaf:knows> ?o2)))" ,
+ " (table",
+ " (row [?o2 :b])",
+ " ))") ;
+
+ Op op = SSE.parseOp(x) ;
+ System.out.print(op) ;
+ Op left = ((OpJoin)op).getLeft() ;
+ Op right = ((OpJoin)op).getRight() ;
+
+ if ( false )
{
- Query query = QueryFactory.create("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> SELECT ?a0 ?a1 WHERE { ?a0 rdf:type ?a1 }") ;
- DataSource source = DatasetFactory.create();
- Model model = ModelFactory.createDefaultModel();
- source.addNamedModel("?a1", model);
- source.setDefaultModel(model);
- QueryExecution queryExecution = QueryExecutionFactory.create(query, source);
- ResultSetFormatter.out(queryExecution.execSelect()) ;
- return ;
+ JoinClassifier.print = true ;
+ System.out.flush() ;
+ boolean b1 = JoinClassifier.isLinear(left, right) ;
+ System.out.println("Left/right: "+b1) ;
+
+
+
+ System.out.println() ;
+ System.out.flush() ;
+ boolean b2 = JoinClassifier.isLinear(right, left) ;
+ System.out.println("Right/left: "+b2) ;
+ exit(0) ;
+ System.out.println() ;
+ System.out.flush() ;
}
+ Op op2 = Transformer.transform(new TransformJoinStrategy(ARQ.getContext()), op) ;
+ System.out.println(op2) ;
+ System.out.flush() ;
-
-
-
+ exit(0) ;
// -----
Query query = QueryFactory.read("Q.rq") ;
@@ -131,7 +156,7 @@ public class RunARQ
//ARQ.setExecutionLogging(InfoLevel.ALL) ;
QueryExecution qExec = QueryExecutionFactory.create(query, m) ;
ResultSetFormatter.out(qExec.execSelect()) ;
-
+
exit(0) ;
}
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformJoinStrategy.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformJoinStrategy.java?rev=1124756&r1=1124755&r2=1124756&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformJoinStrategy.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformJoinStrategy.java Thu May 19 13:30:56 2011
@@ -41,10 +41,15 @@ public class TransformJoinStrategy exten
{
if ( right instanceof OpTable )
{
- // Swap left and right so start with a flow of concrete data.
- Op tmp = left ;
- left = right ;
- right = tmp ;
+ // Safe to swap? Need to reclassify.
+ boolean b = JoinClassifier.isLinear(right, left) ;
+ if ( b )
+ {
+ // Swap left and right so start with a flow of concrete data.
+ Op tmp = left ;
+ left = right ;
+ right = tmp ;
+ }
}
// Streamed evaluation
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/http/QueryEngineHTTP.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/http/QueryEngineHTTP.java?rev=1124756&r1=1124755&r2=1124756&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/http/QueryEngineHTTP.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/http/QueryEngineHTTP.java Thu May 19 13:30:56 2011
@@ -133,8 +133,6 @@ public class QueryEngineHTTP implements
public ResultSet execSelect()
{
-
-
HttpQuery httpQuery = makeHttpQuery() ;
// TODO Allow other content types.
httpQuery.setAccept(HttpParams.contentTypeResultsXML) ;
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java?rev=1124756&r1=1124755&r2=1124756&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/JoinClassifier.java Thu May 19 13:30:56 2011
@@ -19,7 +19,7 @@ import com.hp.hpl.jena.sparql.core.Var ;
public class JoinClassifier
{
- static final boolean print = false ;
+ static /*final*/ public boolean print = false ;
static public boolean isLinear(OpJoin join)
{
@@ -29,11 +29,11 @@ public class JoinClassifier
static public boolean isLinear(Op left, Op right)
{
- left = effectiveOp(left) ;
- right = effectiveOp(right) ;
+ left = effectiveOp(left) ;
+ right = effectiveOp(right) ;
// Old: Subquery with modifier. Substitution does not apply.
- // Renaming should make this work.
+ // Renaming should make this work.
// With SELECT *, it's as if the subquery were just the pattern.
if (right instanceof OpModifier) return false ;
@@ -73,7 +73,7 @@ public class JoinClassifier
if (print) System.err.println("Right/filter: " + vRightFilter) ;
// Step 1 : remove any variable definitely fixed from the floating sets
- // because the nature of the "join" will dela with that.
+ // because the nature of the "join" will deal with that.
vLeftOpt = SetUtils.difference(vLeftOpt, vLeftFixed) ;
vRightOpt = SetUtils.difference(vRightOpt, vRightFixed) ;
@@ -100,6 +100,8 @@ public class JoinClassifier
boolean r11 = SetUtils.intersectionP(vRightOpt, vLeftFixed) ;
boolean r12 = SetUtils.intersectionP(vRightOpt, vLeftOpt) ;
+
+ // What about rightfixed, left opt?
boolean bad1 = r11 || r12 ;
Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/VarFinder.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/VarFinder.java?rev=1124756&r1=1124755&r2=1124756&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/VarFinder.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/VarFinder.java Thu May 19 13:30:56 2011
@@ -18,6 +18,7 @@ import com.hp.hpl.jena.sparql.algebra.Op
import com.hp.hpl.jena.sparql.algebra.OpVisitorBase ;
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.OpExt ;
import com.hp.hpl.jena.sparql.algebra.op.OpExtend ;
import com.hp.hpl.jena.sparql.algebra.op.OpFilter ;
@@ -27,12 +28,14 @@ import com.hp.hpl.jena.sparql.algebra.op
import com.hp.hpl.jena.sparql.algebra.op.OpNull ;
import com.hp.hpl.jena.sparql.algebra.op.OpProject ;
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.OpTable ;
import com.hp.hpl.jena.sparql.algebra.op.OpUnion ;
import com.hp.hpl.jena.sparql.core.BasicPattern ;
import com.hp.hpl.jena.sparql.core.Var ;
import com.hp.hpl.jena.sparql.core.VarExprList ;
import com.hp.hpl.jena.sparql.expr.Expr ;
+import com.hp.hpl.jena.sparql.expr.ExprList ;
public class VarFinder
{
@@ -144,23 +147,42 @@ public class VarFinder
@Override
public void visit(OpJoin opJoin)
{
- VarUsageVisitor leftUsage = VarUsageVisitor.apply(opJoin.getLeft()) ;
- VarUsageVisitor rightUsage = VarUsageVisitor.apply(opJoin.getRight()) ;
-
- defines.addAll(leftUsage.defines) ;
- optDefines.addAll(leftUsage.optDefines) ;
- filterMentions.addAll(leftUsage.filterMentions) ;
+ joinAcc(opJoin.getLeft()) ;
+ joinAcc(opJoin.getRight()) ;
+ }
+
+ @Override
+ public void visit(OpSequence opSequence)
+ {
+ for ( Op op : opSequence.getElements() )
+ joinAcc(op) ;
+ }
+
+ private void joinAcc(Op op)
+ {
+ VarUsageVisitor usage = VarUsageVisitor.apply(op) ;
- defines.addAll(rightUsage.defines) ;
- optDefines.addAll(rightUsage.optDefines) ;
- filterMentions.addAll(rightUsage.filterMentions) ;
+ defines.addAll(usage.defines) ;
+ optDefines.addAll(usage.optDefines) ;
+ filterMentions.addAll(usage.filterMentions) ;
}
@Override
public void visit(OpLeftJoin opLeftJoin)
{
- VarUsageVisitor leftUsage = VarUsageVisitor.apply(opLeftJoin.getLeft()) ;
- VarUsageVisitor rightUsage = VarUsageVisitor.apply(opLeftJoin.getRight()) ;
+ leftJoin(opLeftJoin.getLeft(), opLeftJoin.getRight(), opLeftJoin.getExprs()) ;
+ }
+
+ @Override
+ public void visit(OpConditional opLeftJoin)
+ {
+ leftJoin(opLeftJoin.getLeft(), opLeftJoin.getRight(), null) ;
+ }
+
+ private void leftJoin(Op left, Op right, ExprList exprs)
+ {
+ VarUsageVisitor leftUsage = VarUsageVisitor.apply(left) ;
+ VarUsageVisitor rightUsage = VarUsageVisitor.apply(right) ;
defines.addAll(leftUsage.defines) ;
optDefines.addAll(leftUsage.optDefines) ;
@@ -175,10 +197,10 @@ public class VarFinder
optDefines.removeAll(leftUsage.defines) ;
// And the associated filter.
- if ( opLeftJoin.getExprs() != null )
- opLeftJoin.getExprs().varsMentioned(filterMentions);
+ if ( exprs != null )
+ exprs.varsMentioned(filterMentions);
}
-
+
@Override
public void visit(OpUnion opUnion)
{
@@ -250,7 +272,9 @@ public class VarFinder
@Override
public void visit(OpTable opTable)
- { }
+ {
+ defines.addAll(opTable.getTable().getVars()) ;
+ }
@Override
public void visit(OpNull opNull)