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