Author: rvesse
Date: Fri Apr 18 20:10:04 2014
New Revision: 1588554
URL: http://svn.apache.org/r1588554
Log:
Added additional test cases that pertain to JENA-628. This is a sanitized
version of a customer query in our regression suite where the changed filter
placement behaviour broke the query when using the don't break BGPs mode. As
part of adding this test case I also found and fixed a case where filter
pushing was not respecting the includeBGPs flag when considering whether to
push into quadpatterns
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
Modified:
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java?rev=1588554&r1=1588553&r2=1588554&view=diff
==============================================================================
---
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
(original)
+++
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/TransformFilterPlacement.java
Fri Apr 18 20:10:04 2014
@@ -258,7 +258,7 @@ public class TransformFilterPlacement ex
}
private Placement placeOrWrapQuadPattern(ExprList exprs, OpQuadPattern
pattern) {
- return placeQuadPattern(exprs, pattern.getGraphNode(),
pattern.getBasicPattern()) ;
+ return placeOrWrapQuadPattern(exprs, pattern.getGraphNode(),
pattern.getBasicPattern()) ;
}
private Placement placeOrWrapQuadPattern(ExprList exprsIn, Node graphNode,
BasicPattern pattern) {
Modified:
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
URL:
http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java?rev=1588554&r1=1588553&r2=1588554&view=diff
==============================================================================
---
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
(original)
+++
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilterPlacement.java
Fri Apr 18 20:10:04 2014
@@ -27,6 +27,7 @@ import com.hp.hpl.jena.sparql.algebra.Op
import com.hp.hpl.jena.sparql.algebra.Transform ;
import com.hp.hpl.jena.sparql.algebra.Transformer ;
import com.hp.hpl.jena.sparql.sse.SSE ;
+import com.hp.hpl.jena.sparql.util.StringUtils;
public class TestTransformFilterPlacement extends BaseTest { //extends
AbstractTestTransform {
@@ -68,6 +69,58 @@ public class TestTransformFilterPlacemen
testNoBGP("(filter (= ?x 123) (bgp (?s ?p ?x) (?s ?p ?x1) (?s ?p ?x2))
)",
null) ;
}
+
+ @Test public void place_bgp_06() {
+ test(StrUtils.strjoinNL("(filter (exprlist (|| (|| (|| (&& (<
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (< ?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (&& (<
?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<= ?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<=
?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (<=
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1)) (<= ?startDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>))) (!
(sameTerm ?node2 <urn:foo>)))",
+ " (quadpattern",
+ " (quad <urn:x-arq:DefaultGraphNode> ?inst1
?arg1Pred1 <urn:foo>)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?inst1
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?class1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?inst1
?arg2Pred1 ?node2)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?inst1
?startDatePred1 ?startDate1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?inst1
?endDatePred1 ?endDate1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <urn:class>)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:pred1> ?arg1Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:pred2> ?arg2Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:predStartDate> ?startDatePred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:predEndDate> ?endDatePred1)",
+ "))"),
+ StrUtils.strjoinNL("(sequence",
+ " (filter (|| (|| (|| (&& (<
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (< ?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (&& (<
?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<= ?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<=
?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (<=
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1)) (<= ?startDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)))",
+ " (sequence",
+ " (filter (! (sameTerm ?node2 <urn:foo>))",
+ " (quadpattern",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?arg1Pred1 <urn:foo>)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?class1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?arg2Pred1 ?node2)",
+ " ))",
+ " (quadpattern",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?startDatePred1 ?startDate1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?endDatePred1 ?endDate1)",
+ " )))",
+ " (quadpattern",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <urn:class>)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:pred1> ?arg1Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:pred2> ?arg2Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:predStartDate> ?startDatePred1)",
+ " (quad <urn:x-arq:DefaultGraphNode> ?class1
<urn:predEndDate> ?endDatePred1)",
+ " ))"));
+ }
+
+ @Test public void place_bgp_06a() {
+ testNoBGP(StrUtils.strjoinNL("(filter (exprlist (|| (|| (|| (&& (<
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (< ?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (&& (<
?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<= ?startDate1
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>) (<=
?endDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>)) (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1))) (&& (&& (<=
\"2012-01-01T00:00:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?startDate1) (<=
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>
?endDate1)) (<= ?startDate1
\"2012-12-31T23:59:59\"^^<http://www.w3.org/2001/XMLSchema#dateTime>))) (!
(sameTerm ?node2 <urn:foo>)))",
+ " (quadpattern",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?arg1Pred1 <urn:foo>)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?class1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?arg2Pred1 ?node2)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?startDatePred1 ?startDate1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?inst1 ?endDatePred1 ?endDate1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?class1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <urn:class>)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?class1 <urn:pred1> ?arg1Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?class1 <urn:pred2> ?arg2Pred1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?class1 <urn:predStartDate> ?startDatePred1)",
+ " (quad <urn:x-arq:DefaultGraphNode>
?class1 <urn:predEndDate> ?endDatePred1)",
+ "))"), null);
+ }
@Test public void place_no_match_01() {
// Unbound
@@ -527,6 +580,7 @@ public class TestTransformFilterPlacemen
Transform t_placement = new TransformFilterPlacement(includeBGPs) ;
Op op1 = SSE.parseOp(input) ;
Op op2 = Transformer.transform(t_placement, op1) ;
+ System.out.println(op2.toString());
if ( output == null ) {
// No transformation.
Assert.assertEquals(op1, op2) ;