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 2013/12/24 18:17:33 UTC
svn commit: r1553306 - in /jena/trunk/jena-arq: ReleaseNotes.txt
src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
Author: andy
Date: Tue Dec 24 17:17:33 2013
New Revision: 1553306
URL: http://svn.apache.org/r1553306
Log:
JENA-595 , JENA-432 , JENA-616 , JENA-293 , JENA-383
Put filter equality rewrite after filter placement because
it may then be possible to apply it when it could not when
covering a larger pattern.
Modify some test that were sensitive to this.
Modified:
jena/trunk/jena-arq/ReleaseNotes.txt
jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
Modified: jena/trunk/jena-arq/ReleaseNotes.txt
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/ReleaseNotes.txt?rev=1553306&r1=1553305&r2=1553306&view=diff
==============================================================================
--- jena/trunk/jena-arq/ReleaseNotes.txt (original)
+++ jena/trunk/jena-arq/ReleaseNotes.txt Tue Dec 24 17:17:33 2013
@@ -6,6 +6,9 @@ ChangeLog for ARQ
RDF 1.1 Language support (Turtle, TriG, N-Triples, N-Quads)
++ JENA-595 : Improved filter placement optimization.
+ See also JENA-293, JENA-383, JENA-432, JENA-616
+
+ JENA-606 : URIs for prefixes are resolved (made absolute) before adding
to a models prefix mapping. Previously, they were left as
relative, ifrelative URis in the document.
Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java?rev=1553306&r1=1553305&r2=1553306&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java Tue Dec 24 17:17:33 2013
@@ -173,11 +173,11 @@ public class Optimize implements Rewrite
if ( context.isTrueOrUndef(ARQ.optImplicitLeftJoin) )
op = apply("Implicit Left Join", new TransformImplicitLeftJoin(), op);
- if ( context.isTrueOrUndef(ARQ.optFilterEquality) )
- {
- //boolean termStrings = context.isDefined(ARQ.optTermStrings) ;
- op = apply("Filter Equality", new TransformFilterEquality(), op) ;
- }
+ // Replace suitable FILTER(?x = TERM) with (assign) and write the TERM for ?x in the pattern.
+ // This is also applied a second time after FILTER placement.
+ // This application maximises the scope of the (assign). See JENA-616.
+// if ( context.isTrueOrUndef(ARQ.optFilterEquality) )
+// op = apply("Filter Equality", new TransformFilterEquality(), op) ;
// Can promote table empty at this point since only the implicit join optimizations
// are currently capable of introducing it
@@ -216,11 +216,17 @@ public class Optimize implements Rewrite
// of a filter in a (sequence) from each half of a (join). This is harmless,
// because filters are generally cheap, but it looks a bit bad.
if ( context.isTrueOrUndef(ARQ.optFilterPlacement) ) {
- // Wether to push into BGPs
+ // Whether to push into BGPs
boolean b = context.isTrueOrUndef(ARQ.optFilterPlacementBGP) ;
op = apply("Filter Placement", new TransformFilterPlacement(b), op) ;
}
+ // Replace suitable FILTER(?x = TERM) with (assign) and write the TERm for ?x in the pattern.
+ // Apply (possible a second time) after FILTER placement as it can create new possibilities.
+ // See JENA-616.
+ if ( context.isTrueOrUndef(ARQ.optFilterEquality) )
+ op = apply("Filter Equality", new TransformFilterEquality(), op) ;
+
// Merge adjacent BGPs
if ( context.isTrueOrUndef(ARQ.optMergeBGPs) )
op = apply("Merge BGPs", new TransformMergeBGPs(), op) ;
Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java?rev=1553306&r1=1553305&r2=1553306&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/optimize/TestTransformFilters.java Tue Dec 24 17:17:33 2013
@@ -188,7 +188,6 @@ public class TestTransformFilters extend
(String[])null);
}
- // Related to JENA-432
@Test public void optionalEqualitySubQuery_01() {
// Presence of ?test in the projection blocks the rewrite.
// (this is actually over cautious).
@@ -202,15 +201,14 @@ public class TestTransformFilters extend
String ops = StrUtils.strjoinNL
("(sequence"
- ," (filter (= ?test <http://localhost/t1>)"
- ," (bgp (triple ?test ?p1 ?X)))"
+ ," (assign ((?test <http://localhost/t1>))"
+ ," (bgp (triple <http://localhost/t1> ?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 *"
@@ -219,13 +217,24 @@ public class TestTransformFilters extend
, " FILTER ( ?test = <http://localhost/t1> )"
, " { SELECT ?s1 { ?test ?p2 ?o2 } }"
, "}") ;
+ // JENA-616
+ // Answer if FILTER equality done only after filter placement.
String ops = StrUtils.strjoinNL
- ( " (assign ((?test <http://localhost/t1>))"
- , " (sequence"
- , " (bgp (triple <http://localhost/t1> ?p1 ?X))"
- , " (project (?s1)"
- , " (bgp (triple ?/test ?/p2 ?/o2))) ))"
+ ( "(sequence"
+ , " (assign ((?test <http://localhost/t1>))"
+ , " (bgp (triple <http://localhost/t1> ?p1 ?X)))"
+ , " (project (?s1)"
+ , " (bgp (triple ?/test ?/p2 ?/o2))) )"
) ;
+ // Answer if FILTER equality done only before filter placement
+ // (and possibly after as well).
+// 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) ;
}
@@ -286,6 +295,7 @@ public class TestTransformFilters extend
// JENA-294 part II
@Test public void optionalEqualityScope_02() {
+ // Safe to transform: ?x is fixed.
String qs = StrUtils.strjoinNL
( "PREFIX : <http://example/> SELECT * {"
, " ?x :p ?o2"
@@ -293,14 +303,24 @@ public class TestTransformFilters extend
, " FILTER(?x = :x)"
, "}"
) ;
- // Safe to transform: ?x is fixed.
+ // JENA-616
+ // Answer if FILTER equality optimization done only after FILTER placement.
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))"
- , " ))"
+ ( "(conditional"
+ , " (assign ((?x <http://example/x>))"
+ , " (bgp (triple <http://example/x> <http://example/p> ?o2)))"
+ , " (bgp (triple ?x <http://example/q> ?o))"
+ , " )"
) ;
+ // Answer if FILTER equality optimization done before FILTER placement
+ // (and possible afterwards as well).
+// 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) ;
}