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/09/02 19:36:20 UTC

svn commit: r1164651 - in /incubator/jena/Jena2/ARQ/trunk: src-test/com/hp/hpl/jena/sparql/algebra/optimize/ src-test/com/hp/hpl/jena/sparql/api/ src/com/hp/hpl/jena/sparql/algebra/op/ src/com/hp/hpl/jena/sparql/algebra/optimize/ src/com/hp/hpl/jena/sp...

Author: andy
Date: Fri Sep  2 17:36:20 2011
New Revision: 1164651

URL: http://svn.apache.org/viewvc?rev=1164651&view=rev
Log:
Add looking for REDUCDED in TransformTopN optimization - can be treated same as distinct to get consistent output.

Modified:
    incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
    incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/api/TestQueryExecutionTimeout.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/op/OpTopN.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformTopN.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/OpExecutor.java

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java Fri Sep  2 17:36:20 2011
@@ -172,13 +172,24 @@ public class TestOptimizer extends BaseT
         String opExpectedString = 
             "(top (42 ?p ?o)\n" + 
             "  (distinct\n" +
-            "  (bgp (triple ?s ?p ?o))))" ; 
+            "     (bgp (triple ?s ?p ?o))))" ; 
         check(queryString, opExpectedString) ;
     }
 
     @Test public void slice_order_to_topn_05()
     {
         assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
+        String queryString = "SELECT REDUCED * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 42"  ;  
+        String opExpectedString = 
+            "(top (42 ?p ?o)\n" + 
+            "  (distinct\n" +
+            "     (bgp (triple ?s ?p ?o))))" ; 
+        check(queryString, opExpectedString) ;
+    }
+
+    @Test public void slice_order_to_topn_06()
+    {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
         String queryString = "SELECT DISTINCT * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 4242"  ;  
         String opExpectedString = 
             "(slice _ 4242\n" + 
@@ -188,6 +199,29 @@ public class TestOptimizer extends BaseT
         check(queryString, opExpectedString) ;
     }
 
+    @Test public void slice_order_to_topn_07()
+    {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
+        String queryString = "SELECT REDUCED * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 4242"  ;  
+        String opExpectedString = 
+            "(slice _ 4242\n" + 
+            "  (reduced\n" +
+            "    (order (?p ?o)\n" +
+            "      (bgp (triple ?s ?p ?o)))))" ; 
+        check(queryString, opExpectedString) ;
+    }
+    
+    @Test public void slice_order_to_topn_08()
+    {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
+        String queryString = "SELECT * { ?s ?p ?o } ORDER BY ?p ?o OFFSET 1 LIMIT 5"  ;  
+        String opExpectedString = 
+            "(slice 1 5\n" + 
+            "  (order (?p ?o)\n" +
+            "    (bgp (triple ?s ?p ?o))))" ; 
+        check(queryString, opExpectedString) ;
+    }
+
     @Test public void distinct_to_reduced_01()
     {
         assertTrue(ARQ.isTrueOrUndef(ARQ.optDistinctToReduced)) ;

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/api/TestQueryExecutionTimeout.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/api/TestQueryExecutionTimeout.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/api/TestQueryExecutionTimeout.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/api/TestQueryExecutionTimeout.java Fri Sep  2 17:36:20 2011
@@ -149,7 +149,7 @@ public class TestQueryExecutionTimeout e
     {
         String qs = prefix + "SELECT * { ?s ?p ?o }" ;
         QueryExecution qExec = QueryExecutionFactory.create(qs, ds) ;
-        qExec.setTimeout(100, TimeUnit.MILLISECONDS, -1, TimeUnit.MILLISECONDS) ;
+        qExec.setTimeout(200, TimeUnit.MILLISECONDS, -1, TimeUnit.MILLISECONDS) ;
         ResultSet rs = qExec.execSelect() ;
         rs.next() ; // First timeout does not go off. Resets timers.
         rs.next() ; // Second timeout never goes off 
@@ -163,7 +163,7 @@ public class TestQueryExecutionTimeout e
     {
         String qs = prefix + "SELECT * { ?s ?p ?o }" ;
         QueryExecution qExec = QueryExecutionFactory.create(qs, ds) ;
-        qExec.setTimeout(50, TimeUnit.MILLISECONDS, 100, TimeUnit.MILLISECONDS) ;
+        qExec.setTimeout(100, TimeUnit.MILLISECONDS, 100, TimeUnit.MILLISECONDS) ;
         ResultSet rs = qExec.execSelect() ;
         rs.next() ; // First timeout does not go off. Resets timers.
         rs.next() ; // Second timeout never goes off 

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/op/OpTopN.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/op/OpTopN.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/op/OpTopN.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/op/OpTopN.java Fri Sep  2 17:36:20 2011
@@ -28,7 +28,6 @@ public class OpTopN extends OpModifier
         this.limit = N ;
     }
     
-    
     public List<SortCondition> getConditions()  { return conditions ; }
     public int getLimit()                       { return limit ; }
     

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java Fri Sep  2 17:36:20 2011
@@ -26,6 +26,8 @@ import com.hp.hpl.jena.sparql.algebra.op
 
 public class TransformDistinctToReduced extends TransformCopy {
 
+    // Best is this is after TransformTopN but they are order independent
+    // TopN of "reduced or distinct of order" is handled. 
     @Override
     public Op transform(OpDistinct opDistinct, Op subOp) { 
         if ( subOp instanceof OpOrder ) {

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformTopN.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformTopN.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformTopN.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformTopN.java Fri Sep  2 17:36:20 2011
@@ -20,9 +20,11 @@ package com.hp.hpl.jena.sparql.algebra.o
 
 import com.hp.hpl.jena.query.Query ;
 import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.op.Op1 ;
 import com.hp.hpl.jena.sparql.algebra.TransformCopy ;
 import com.hp.hpl.jena.sparql.algebra.op.OpDistinct ;
 import com.hp.hpl.jena.sparql.algebra.op.OpOrder ;
+import com.hp.hpl.jena.sparql.algebra.op.OpReduced ;
 import com.hp.hpl.jena.sparql.algebra.op.OpSlice ;
 import com.hp.hpl.jena.sparql.algebra.op.OpTopN ;
 
@@ -33,21 +35,49 @@ public class TransformTopN extends Trans
     @Override
 	public Op transform(OpSlice opSlice, Op subOp) { 
 
-    	if ( ( ( opSlice.getStart() == 0 ) || ( opSlice.getStart() == Query.NOLIMIT ) ) && 
-    	     ( opSlice.getLength() < TOPN_LIMIT_THRESHOLD ) ) {
-        	if ( subOp instanceof OpOrder ) {
+        /* This looks for two cases:
+         * (slice _  N
+         *   (order PATTERN) )
+         * ==> (top N PATTERN)
+         * and
+         * 
+         * (slice _  N
+         *   (distinct or reduced
+         *     (order PATTEN) ))
+         * ==>  (top N (distinct PATTERN))
+         *
+         * and evaluation of (top) looks for (top N (distinct PATTERN))
+         * See OpExecutor.execute(OpTopN)
+         * 
+         * Note that in TransformDistinctToReduced (distinct (order X)) is turned into (reduced (order X))
+         * and that this optimization should be before that one but this is order independent
+         * as we process reducded or distinct in the same way. 
+         */
+        
+        boolean acceptableStart = ( ( opSlice.getStart() == 0 ) || ( opSlice.getStart() == Query.NOLIMIT ) ) ;
+        boolean acceptableFinish =  (opSlice.getLength() < TOPN_LIMIT_THRESHOLD ) ;  
+        
+    	if ( acceptableStart && acceptableFinish )
+    	{
+        	if ( subOp instanceof OpOrder ) 
+        	{
+        	    // First case.
         	    OpOrder opOrder = (OpOrder)subOp ;
-        		return new OpTopN( opOrder.getSubOp(), (int)opSlice.getLength(), opOrder.getConditions() ) ;
-        	} else if ( subOp instanceof OpDistinct ) {
-        	    OpDistinct opDistinct = (OpDistinct)subOp ;
-        	    if ( opDistinct.getSubOp() instanceof OpOrder ) {
-        	        OpOrder opOrder = (OpOrder)opDistinct.getSubOp() ;
+        	    return new OpTopN( opOrder.getSubOp(), (int)opSlice.getLength(), opOrder.getConditions() ) ;
+        	}
+            	
+        	if ( subOp instanceof OpDistinct || subOp instanceof OpReduced )
+        	{
+        	    Op subSubOp = ((Op1)subOp).getSubOp() ;
+        	    if ( subSubOp instanceof OpOrder ) {
+        	        OpOrder opOrder = (OpOrder)subSubOp ;
         	        Op opDistinct2 = OpDistinct.create(opOrder.getSubOp()) ;
         	        return new OpTopN( opDistinct2, (int)opSlice.getLength(), opOrder.getConditions() ) ;
         	    }
         	}
     	}
-
+    	
+    	// Pass through.
     	return super.transform(opSlice, subOp) ; 
    	}
 	

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/OpExecutor.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/OpExecutor.java?rev=1164651&r1=1164650&r2=1164651&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/OpExecutor.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/engine/main/OpExecutor.java Fri Sep  2 17:36:20 2011
@@ -384,6 +384,10 @@ public class OpExecutor
     protected QueryIterator execute(OpTopN opTop, QueryIterator input)
     { 
         QueryIterator qIter = null ;
+        // We could also do (reduced) here as well.
+        // but it's detected in TrabsformTopN and turned into (distinct)
+        // there so that code catches that already.
+        // We leave this to do the strict case of (top N (distinct ...)) 
         if ( opTop.getSubOp() instanceof OpDistinct ) {
             OpDistinct opDistinct = (OpDistinct)opTop.getSubOp() ;
             qIter = executeOp(opDistinct.getSubOp(), input) ;