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