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 2022/06/24 08:30:37 UTC

[jena] branch main updated: gh-1397 OpAsQuery fix for BIND within GRAPH

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new a6e218e477 gh-1397 OpAsQuery fix for BIND within GRAPH
     new 4fcd7c3e01 Merge pull request #1403 from Aklakan/gh-1397
a6e218e477 is described below

commit a6e218e47713786b1fe319a6bd8371fc1a8f1fcb
Author: Claus Stadler <Ra...@googlemail.com>
AuthorDate: Thu Jun 23 19:57:27 2022 +0200

    gh-1397 OpAsQuery fix for BIND within GRAPH
---
 .../ElementTransformCleanGroupsOfOne.java          | 33 +++++++++++-----------
 .../apache/jena/sparql/algebra/TestOpAsQuery.java  |  4 +++
 2 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ElementTransformCleanGroupsOfOne.java b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ElementTransformCleanGroupsOfOne.java
index 9faeb576b5..b9f7911021 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ElementTransformCleanGroupsOfOne.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ElementTransformCleanGroupsOfOne.java
@@ -22,7 +22,7 @@ import java.util.List ;
 
 import org.apache.jena.sparql.syntax.* ;
 
-/** 
+/**
  * Clean a SPARQL and ARQ syntax. This applies after using OpAsQuery.
  * <ul>
  * <li>Unwrap groups of one where they do not matter.
@@ -34,9 +34,9 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
     // Improvements: scan group elements to work out for non-reduceable adjacents.
     // These ones may clash with an adjeact one in the group above.
     // ElementTransformCleanGroupsOfOne -> ElementTransformCleanGroups
-    
+
     public ElementTransformCleanGroupsOfOne() {}
-    
+
     @Override
     public Element transform(ElementGroup eltGroup, List<Element> elts) {
         if ( elts.size() != 1 )
@@ -44,7 +44,8 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
         Element elt = elts.get(0) ;
         if ( ( elt instanceof ElementTriplesBlock ) ||
              ( elt instanceof ElementPathBlock ) ||
-             ( elt instanceof ElementFilter ) )
+             ( elt instanceof ElementFilter ) ||
+             ( elt instanceof ElementBind ) )
             return super.transform(eltGroup, elts) ;    // No transformation.
         return elt ;
     }
@@ -63,11 +64,11 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
                 elg.addElement(el);
                 el = elg ;
             }
-            el2.addElement(el); 
+            el2.addElement(el);
         }
         return el2 ;
     }
-    
+
     // Special case: If Optional, and the original had a {{}} protected filter, keep {{}}
     // transform/ElementGroup has already run so undo if necessary.
     @Override
@@ -79,16 +80,16 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
             protectedElt.addElement(transformedElt);
             transformedElt = protectedElt ;
         }
-        
-        // Step 1 : does the original eltOptional has a {{}} RHS? 
+
+        // Step 1 : does the original eltOptional has a {{}} RHS?
         Element x = eltOptional.getOptionalElement() ;
-        
+
         if ( ! ( x instanceof ElementGroup ) )
-            // No. But it is not possible in written query syntax to have a nongroup as the RHS. 
+            // No. But it is not possible in written query syntax to have a nongroup as the RHS.
             return super.transform(eltOptional, transformedElt) ;
         // So far - {}-RHS.
         ElementGroup eGroup = (ElementGroup)x ;
-        
+
         // Is it {{}}?
         //ElementGroup inner = getGroupInGroup(x) ;
         if ( eGroup.size() != 1 )
@@ -101,21 +102,21 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
         // Unbundle multiple levels.
         innerGroup = unwrap(innerGroup) ;
         boolean mustProtect = containsFilter(innerGroup) ;
-        
+
         if ( mustProtect ) {
             // No need to check for {{}} in elt1 as the transform(ElementGroup) will have processed it.
             ElementGroup protectedElt = new ElementGroup() ;
             protectedElt.addElement(transformedElt);
             return new ElementOptional(protectedElt) ;
-        } 
+        }
         // No need to protect - process as usual.
         return super.transform(eltOptional, transformedElt) ;
     }
-    
+
     private boolean containsFilter(ElementGroup eltGroup) {
         return eltGroup.getElements().stream().anyMatch(el2 ->( el2 instanceof ElementFilter ) ) ;
     }
-    
+
     // Removed layers of groups of one.  Return inner most group.
     private ElementGroup unwrap(ElementGroup eltGroup) {
         if ( eltGroup.size() != 1 )
@@ -124,7 +125,7 @@ public class ElementTransformCleanGroupsOfOne extends ElementTransformCopyBase {
         if ( ! ( el instanceof ElementGroup ) )
             return eltGroup ;
         ElementGroup eltGroup2 = (ElementGroup)el ;
-        return unwrap(eltGroup2) ; 
+        return unwrap(eltGroup2) ;
     }
 
 }
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 2fa959bfbb..b9924c9e13 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
@@ -73,6 +73,10 @@ public class TestOpAsQuery {
     @Test public void testBind12() { test_roundTripQuery("SELECT ?w ('y' AS ?y) ?x { BIND('w' AS ?w) ?s ?p ?o BIND ('x' AS ?x) }"); }
     @Test public void testBind13() { test_roundTripQuery("SELECT ('x' AS ?x) (str(?x) AS ?y) (str(?x) AS ?z) {}"); }
 
+    // https://github.com/apache/jena/issues/1397
+    @Test public void testBind14() { test_roundTripQuery("SELECT * { GRAPH ?g { BIND('x' AS ?x) } }"); }
+    @Test public void testBind15() { test_roundTripQuery("SELECT * { GRAPH ?g { BIND('x' AS ?x) BIND('y' AS ?y) } }"); }
+
     @Test public void testOptional01()
     { test_roundTripQuery("SELECT * WHERE { ?s ?p ?o OPTIONAL { ?s ?q ?z FILTER (?foo) } }") ; }