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)