Author: andy
Date: Wed Apr 17 11:36:25 2013
New Revision: 1468844
URL: http://svn.apache.org/r1468844
Log:
More optimizer tests.
Added:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
- copied, changed from r1468591,
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestFilterTransform.java
Removed:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestFilterTransform.java
Modified:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
Modified:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java?rev=1468844&r1=1468843&r2=1468844&view=diff
==============================================================================
---
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
(original)
+++
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TS_Algebra.java
Wed Apr 17 11:36:25 2013
@@ -19,7 +19,7 @@
package com.hp.hpl.jena.sparql.algebra;
-import com.hp.hpl.jena.sparql.algebra.optimize.TestFilterTransform ;
+import com.hp.hpl.jena.sparql.algebra.optimize.TestTransformFilters ;
import com.hp.hpl.jena.sparql.algebra.optimize.TestOptimizer ;
import com.hp.hpl.jena.sparql.algebra.optimize.TestTransformMergeBGPs ;
import com.hp.hpl.jena.sparql.algebra.optimize.TestVarRename ;
@@ -33,7 +33,7 @@ import org.junit.runners.Suite ;
TestVarFinder.class
, TestAlgebraTranslate.class
, TestClassify.class
- , TestFilterTransform.class
+ , TestTransformFilters.class
, TestTransformQuads.class
, TestVarRename.class
Modified:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java?rev=1468844&r1=1468843&r2=1468844&view=diff
==============================================================================
---
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
(original)
+++
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
Wed Apr 17 11:36:25 2013
@@ -200,6 +200,40 @@ public class TestOptimizer extends BaseT
}
}
+ @Test public void subQueryProject_01() {
+ String qs = StrUtils.strjoinNL
+ ( "SELECT *"
+ , "WHERE {"
+ , " ?test ?p1 ?X."
+ , " { SELECT ?s1 ?test { ?test ?p2 ?o2 } }"
+ , "}") ;
+
+ String ops = StrUtils.strjoinNL
+ ("(sequence"
+ ," (bgp (triple ?test ?p1 ?X))"
+ ," (project (?s1 ?test)"
+ ," (bgp (triple ?test ?/p2 ?/o2))))"
+ ) ;
+ check(qs, ops) ;
+ }
+
+ @Test public void subQueryProject_02() {
+ String qs = StrUtils.strjoinNL
+ ( "SELECT *"
+ , "WHERE {"
+ , " ?test ?p1 ?X."
+ , " { SELECT ?s1 { ?test ?p2 ?o2 } }"
+ , "}") ;
+
+ String ops = StrUtils.strjoinNL
+ ("(sequence"
+ ," (bgp (triple ?test ?p1 ?X))"
+ ," (project (?s1)"
+ ," (bgp (triple ?/test ?/p2 ?/o2))))"
+ ) ;
+ check(qs, ops) ;
+ }
+
@Test public void optimize_01()
{
String queryString = "SELECT * { { ?s ?p ?x } UNION { ?s1 ?p1 ?x }
FILTER(?x = <urn:x1> || ?x = <urn:x2>) }" ;
Copied:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
(from r1468591,
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestFilterTransform.java)
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java?p2=jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java&p1=jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestFilterTransform.java&r1=1468591&r2=1468844&rev=1468844&view=diff
==============================================================================
---
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestFilterTransform.java
(original)
+++
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
Wed Apr 17 11:36:25 2013
@@ -34,11 +34,12 @@ import com.hp.hpl.jena.sparql.algebra.op
import com.hp.hpl.jena.sparql.algebra.optimize.TransformFilterPlacement ;
import com.hp.hpl.jena.sparql.sse.SSE ;
-public class TestFilterTransform
+/** Tests of transforms related to filters */
+public class TestTransformFilters
{
public static junit.framework.Test suite()
{
- return new JUnit4TestAdapter(TestFilterTransform.class) ;
+ return new JUnit4TestAdapter(TestTransformFilters.class) ;
}
private Transform t_equality = new TransformFilterEquality() ;
@@ -195,6 +196,163 @@ public class TestFilterTransform
) ;
}
+ // Related to JENA-432
+ @Test public void optionalEqualitySubQuery_01() {
+ // Presence of ?test in the projection blocks the rewrite.
+ // (this is actually over cautious).
+ String qs = StrUtils.strjoinNL
+ ( "SELECT *"
+ , "WHERE {"
+ , " ?test ?p1 ?X."
+ , " FILTER ( ?test = <http://localhost/t1> )"
+ , " { SELECT ?s1 ?test { ?test ?p2 ?o2 } }"
+ , "}") ;
+
+ String ops = StrUtils.strjoinNL
+ ("(filter (= ?test <http://localhost/t1>)"
+ ," (sequence"
+ ," (bgp (triple ?test ?p1 ?X))"
+ ," (project (?s1 ?test)"
+ ," (bgp (triple ?test ?/p2 ?/o2)))))"
+ ) ;
+ TestOptimizer.check(qs, ops) ;
+ }
+
+ // Related to JENA-432
+ @Test public void optionalEqualitySubQuery_02() {
+ String qs = StrUtils.strjoinNL
+ ( "SELECT *"
+ , "WHERE {"
+ , " ?test ?p1 ?X."
+ , " FILTER ( ?test = <http://localhost/t1> )"
+ , " { SELECT ?s1 { ?test ?p2 ?o2 } }"
+ , "}") ;
+ String ops = StrUtils.strjoinNL
+ ( " (assign ((?test <http://localhost/t1>))"
+ , " (sequence"
+ , " (bgp (triple <http://localhost/t1> ?p1 ?X))"
+ , " (project (?s1)"
+ , " (bgp (triple ?/test ?/p2 ?/o2))) ))"
+ ) ;
+
+ TestOptimizer.check(qs, ops) ;
+ }
+
+ // JENA-383, simplified.
+ @Test public void optionalEquality_01() {
+ // Not optimized because the TransformFilterEquality does not notice
+ // ?x is fixed in the expression by the join.
+ String qs = StrUtils.strjoinNL
+ ( "PREFIX : <http://example/> SELECT * {"
+ , " OPTIONAL { ?x :q ?o }"
+ , " FILTER(?x = :x)"
+ , " ?x :p ?o2"
+ , "}"
+ ) ;
+ String ops = StrUtils.strjoinNL
+ ( "(filter (= ?x <http://example/x>)"
+ , " (sequence"
+ , " (conditional"
+ , " (table unit)"
+ , " (bgp (triple ?x <http://example/q> ?o)))"
+ , " (bgp (triple ?x <http://example/p> ?o2))"
+ , " ))"
+ ) ;
+ TestOptimizer.check(qs, ops) ;
+ }
+
+ @Test public void optionalEqualityScope_01() {
+ String qs = StrUtils.strjoinNL
+ ( "PREFIX : <http://example/> SELECT * {"
+ , " OPTIONAL { ?x :q ?o }"
+ , " FILTER(?x = :x)"
+ , " ?x :p ?o2"
+ , "}"
+ ) ;
+ // Possible transformation:
+ // Safe to transform: This (sequence) always defined ?x
+ String ops = StrUtils.strjoinNL
+ ("(assign ((?x <http://example/x>))"
+ , " (sequence"
+ , " (conditional"
+ , " (table unit)"
+ , " (bgp (triple <http://example/x> <http://example/q>
?o)))"
+ , " (bgp (triple <http://example/x> <http://example/p>
?o2))))"
+ ) ;
+ // Currently :
+ String ops1 = StrUtils.strjoinNL
+ ("(filter (= ?x <http://example/x>)"
+ ," (sequence"
+ ," (conditional"
+ ," (table unit)"
+ ," (bgp (triple ?x <http://example/q> ?o)) )"
+ ," (bgp (triple ?x <http://example/p> ?o2)) ))"
+ ) ;
+
+ TestOptimizer.check(qs, ops1) ;
+ }
+
+ // JENA-294 part II
+ @Test public void optionalEqualityScope_02() {
+ String qs = StrUtils.strjoinNL
+ ( "PREFIX : <http://example/> SELECT * {"
+ , " ?x :p ?o2"
+ , " OPTIONAL { ?x :q ?o }"
+ , " FILTER(?x = :x)"
+ , "}"
+ ) ;
+ // Safe to transform: ?x is fixed.
+ String ops = StrUtils.strjoinNL
+ ( "(assign ((?x <http://example/x>))"
+ , " (conditional"
+ , " (bgp (triple <http://example/x> <http://example/p> ?o2))"
+ , " (bgp (triple <http://example/x> <http://example/q> ?o))"
+ , " ))"
+ ) ;
+ TestOptimizer.check(qs, ops) ;
+ }
+
+ // JENA-294 part II
+ @Test public void optionalEqualityScope_03() {
+ String qs = StrUtils.strjoinNL
+ ( "PREFIX : <http://example/> SELECT * {"
+ , " ?z :p ?o2"
+ , " OPTIONAL { ?x :q ?o }"
+ , " FILTER(?x = :x)"
+ , "}"
+ ) ;
+ // Unsafe to transform: ?x is optional.
+ String ops = StrUtils.strjoinNL
+ ( "(filter (= ?x <http://example/x>)"
+ , " (conditional"
+ , " (bgp (triple ?z <http://example/p> ?o2))"
+ , " (bgp (triple ?x <http://example/q> ?o))"
+ , "))"
+ ) ;
+ TestOptimizer.check(qs, ops) ;
+ }
+
+ // Scope of variable (optional, defined) cases
+ @Test public void test_OptEqualityScope_04() {
+ String qs = StrUtils.strjoinNL
+ ( "PREFIX : <http://example/> SELECT * {"
+ , " OPTIONAL { ?x :q ?o }"
+ , " FILTER(?x = :x)"
+ , "}"
+ ) ;
+ // Unsafe to transform: This may not defined ?x, then FILTER ->
unbound -> error -> false
+ String ops1 = StrUtils.strjoinNL
+ ("(filter (= ?x <http://example/x>)"
+ ," (conditional"
+ ," (table unit)"
+ ," (assign ((?x <http://example/x>))"
+ ," (bgp (triple <http://example/x> <http://example/q>
?o)))))"
+ ) ;
+
+ TestOptimizer.check(qs, ops1) ;
+ }
+
+
@Test public void disjunction01()
{
test("(filter (|| (= ?x <x>) (= ?x <y>)) (bgp ( ?s ?p ?x)) )",