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 2015/07/14 19:38:10 UTC

jena git commit: Neater multiple OPTIONALs

Repository: jena
Updated Branches:
  refs/heads/master a31c7d271 -> 16a6ddf9a


Neater multiple OPTIONALs

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/16a6ddf9
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/16a6ddf9
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/16a6ddf9

Branch: refs/heads/master
Commit: 16a6ddf9a3600aca60956bb1c0800a49982dac32
Parents: a31c7d2
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Jul 14 18:37:59 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Jul 14 18:37:59 2015 +0100

----------------------------------------------------------------------
 .../apache/jena/sparql/algebra/OpAsQuery.java   | 52 ++++++++++++--------
 .../jena/sparql/algebra/TestOpAsQuery.java      | 10 ++--
 2 files changed, 39 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/16a6ddf9/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
index a6e339c..ebdeb9d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/algebra/OpAsQuery.java
@@ -69,7 +69,14 @@ import org.apache.jena.vocabulary.RDF ;
 public class OpAsQuery {
     // Query cleaning is done in fixupGroupsOfOne by applying an ElementTransform. 
     
-    // TODO OpTopN (which is an optimizer additional algebra operator).
+    // Some thigns that can be done further:
+    
+    // TODO Optimization formats like OpTopN (which is an optimizer additional algebra operator).
+    // TODO More group flattening.
+    // OPTIONAL (LeftJoin) unbundles the LHS to avoid { { P OPTIONAL{} } OPTIONAL{} }
+    // This is actually a general situation.
+    // Adding onto the end of a group when the item added can not merge into the existing last element.  
+    // e.g. BIND, VALUES.
 
     static class /* struct */ QueryLevelDetails {
         // The stack of processing in a query is:
@@ -552,13 +559,6 @@ public class OpAsQuery {
             return ;
         }
 
-        private static boolean emptyGroup(Element element) {
-            if ( !(element instanceof ElementGroup) )
-                return false ;
-            ElementGroup eg = (ElementGroup)element ;
-            return eg.isEmpty() ;
-        }
-
         @Override
         public void visit(OpLeftJoin opLeftJoin) {
             Element eLeft = asElement(opLeftJoin.getLeft()) ;
@@ -569,13 +569,7 @@ public class OpAsQuery {
             // OPTIONAL {{ ?s ?p ?o FILTER (?o>34) }} is not the same as
             // OPTIONAL { ?s ?p ?o FILTER (?o>34) }
             
-            boolean mustProtect = false ;
-            for ( Element el : eRight.getElements() ) {
-                if ( el instanceof ElementFilter ) {
-                    mustProtect = true ;
-                    break ;
-                }
-            }
+            boolean mustProtect = eRight.getElements().stream().anyMatch(el -> el instanceof ElementFilter ) ;
                 
             if ( mustProtect ) {
                 ElementGroup eRight2 = new ElementGroup() ;
@@ -590,8 +584,13 @@ public class OpAsQuery {
                 }
             }
             ElementGroup g = currentGroup() ;
-            if ( !emptyGroup(eLeft) )
-                g.addElement(eLeft) ;
+            if ( !emptyGroup(eLeft) ) {
+                if ( eLeft instanceof ElementGroup )
+                    g.getElements().addAll(((ElementGroup)eLeft).getElements()) ;
+                else
+                    g.addElement(eLeft) ;
+            }
+                
             ElementOptional opt = new ElementOptional(eRight) ;
             g.addElement(opt) ;
         }
@@ -799,6 +798,20 @@ public class OpAsQuery {
             throw new ARQNotImplemented("OpTopN") ;
         }
 
+        private static boolean emptyGroup(Element element) {
+            if ( !(element instanceof ElementGroup) )
+                return false ;
+            ElementGroup eg = (ElementGroup)element ;
+            return eg.isEmpty() ;
+        }
+
+        private static boolean groupOfOne(Element element) {
+            if ( !(element instanceof ElementGroup) )
+                return false ;
+            ElementGroup eg = (ElementGroup)element ;
+            return eg.size() == 1 ;
+        }
+
         /** Insert into a group, skip initial empty subgroups; recombining ElementPathBlock */
         private static void insertIntoGroup(ElementGroup eg, Element e) {
             // Skip initial empty subgroup.
@@ -837,10 +850,9 @@ public class OpAsQuery {
         }
 
         private static Element getElementOfGroupOfOne(Element e) {
-            if ( e instanceof ElementGroup ) {
+            if ( groupOfOne(e) ) {
                 ElementGroup eg = (ElementGroup)e ;
-                if ( eg.size() == 1 )
-                    return eg.get(0) ;
+                return eg.get(0) ;
             }
             return null ;
         }

http://git-wip-us.apache.org/repos/asf/jena/blob/16a6ddf9/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestOpAsQuery.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestOpAsQuery.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestOpAsQuery.java
index ab8666f..24169d5 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestOpAsQuery.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestOpAsQuery.java
@@ -53,9 +53,13 @@ public class TestOpAsQuery {
     @Test public void testOptional02() 
     { test_roundTripQuery("SELECT * WHERE { ?s ?p ?o OPTIONAL { { ?s ?q ?z FILTER (?foo) } } }") ; }
     
-    /**
-     * Test of asQuery method, of class OpAsQuery.
-     */
+    @Test public void testOptional03() 
+    // Don't currently unnest the LHS of the second optional.  See testOptional03a
+    { test_roundTripQuery("SELECT * WHERE { ?s ?p ?o OPTIONAL { ?s ?p1 ?o1 } OPTIONAL { ?s ?p2 ?o2 } } ") ; }
+
+    @Test public void testOptional04() 
+    { test_roundTripQuery("SELECT * WHERE { ?s ?p ?o OPTIONAL { ?s ?p1 ?o1 } OPTIONAL { ?s ?p2 ?o2 } OPTIONAL { ?s ?p3 ?o3 }} ") ; }
+
     @Test
     public void testCountStar() {
         test_roundTripQuery("select (count(*) as ?cs) { ?s ?p ?o }");