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

commit 958f5f53e0a4625443fdbb1f074a513323b0cebc
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Mar 21 12:04:24 2026 +0000

    Support ANY and '_' in SSE.parseNode
---
 .../main/java/org/apache/jena/sparql/core/Substitute.java |  4 ++++
 .../main/java/org/apache/jena/sparql/sse/ItemLift.java    | 15 ++++++++++-----
 .../org/apache/jena/sparql/sse/ItemTransformBase.java     |  1 -
 .../src/main/java/org/apache/jena/sparql/sse/SSE.java     |  8 +++++++-
 .../org/apache/jena/sparql/sse/builders/BuilderNode.java  |  3 +--
 .../java/org/apache/jena/sparql/sse/TestSSE_Basic.java    |  2 +-
 6 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/Substitute.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/core/Substitute.java
index 523304826a..e071038102 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/Substitute.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/Substitute.java
@@ -107,6 +107,8 @@ public class Substitute {
     public static Triple substitute(Triple triple, Binding binding) {
         if ( isNotNeeded(binding) )
             return triple;
+        if ( triple.isConcrete() )
+            return triple;
 
         Node s = triple.getSubject();
         Node p = triple.getPredicate();
@@ -143,6 +145,8 @@ public class Substitute {
     public static Quad substitute(Quad quad, Binding binding) {
         if ( isNotNeeded(binding) )
             return quad;
+        if ( quad.isConcrete() )
+            return quad;
 
         Node g = quad.getGraph();
         Node s = quad.getSubject();
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemLift.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemLift.java
index 78f01a085d..27cb7268f2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemLift.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemLift.java
@@ -30,20 +30,25 @@ import org.apache.jena.sparql.sse.builders.BuilderLib;
 /**
  * Lift and reverse.
  * <p>
- * All {@linkplain #liftItem} and {@link #lowerItem}
+ * All {@linkplain #liftItem} and {@linkplain #lowerItem}
  * <p>
  * Compound - processes nodes that become compound items -- (qtriple)
  * <p>
  * Symbol - processes nodes by special names. TRUE, FALSE
  */
 public class ItemLift {
+    private static final ItemTransform liftAll = new LiftAll();
+    private static final ItemTransform lowerAll = new LowerAll();
+    private static final ItemTransform liftCompound = new LiftCompound();
+    private static final ItemTransform lowerCompound = new LowerCompound();
+
     // ==== All conversions
     public static Item liftItem(Item item) {
-        return ItemTransformer.transform(new LiftAll(), item);
+        return ItemTransformer.transform(liftAll, item);
     }
 
     public static Item lowerItem(Item item) {
-        return ItemTransformer.transform(new LowerAll(), item);
+        return ItemTransformer.transform(lowerAll, item);
     }
 
     // Create an item for a node, applying any conversions for compound nodes.
@@ -62,7 +67,7 @@ public class ItemLift {
     // ==== Compound only
 
     public static Item liftCompound(Item item) {
-        return ItemTransformer.transform(new LiftCompound(), item);
+        return ItemTransformer.transform(liftCompound, item);
     }
 
     /** Reverse lift. */
@@ -78,7 +83,7 @@ public class ItemLift {
      * Reverse the lift transformation.
      */
     public static Item lowerCompound(Item item) {
-        return ItemTransformer.transform(new LowerCompound(), item);
+        return ItemTransformer.transform(lowerCompound, item);
     }
 
     private static Item lowerCompound(Node node, int line, int column) {
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemTransformBase.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemTransformBase.java
index 3dc84f544d..0e65b9b613 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemTransformBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/ItemTransformBase.java
@@ -78,5 +78,4 @@ public class ItemTransformBase implements ItemTransform
     private Item xformNil(Item item) {
         return item;
     }
-
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/sse/SSE.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/SSE.java
index f90ae4d623..e53d68e2cc 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/sse/SSE.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/sse/SSE.java
@@ -465,13 +465,19 @@ public class SSE {
             return new ParseHandlerPlain();
     }
 
+    private static Item itemANY1 = Item.createSymbol("_");
+    private static Item itemANY2 = Item.createSymbol("ANY");
+
     private static Node parseNode(Reader reader, PrefixMapping pmap) {
         if ( pmap == null )
             pmap = getPrefixMapRead();
         Item item = parse(reader, pmap);
         Item item2 = ItemLift.liftItem(item);
-        if ( !item2.isNode() )
+        if ( !item2.isNode() ) {
+            if ( item2.isSymbol() && ( item2.equals(itemANY1) || 
item2.equals(itemANY2) ) )
+                return Node.ANY;
             throw new SSE_ParseException("Not a node: " + item.shortString(), 
item.getLine(), item.getColumn());
+        }
         return item2.getNode();
     }
 
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderNode.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderNode.java
index c8e80ba75d..0b9b3ac9f6 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderNode.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/sse/builders/BuilderNode.java
@@ -37,8 +37,7 @@ import org.apache.jena.sparql.sse.Tags;
 public class BuilderNode {
     /**
      * Build a node from an Item - it is assumed the item has been lifted for
-     * compound node items. This function does not convert compound node 
(qtriple
-     * etc).
+     * compound node items. This function does not convert compound node 
(qtriple etc).
      *
      * @see ItemLift#liftCompound
      */
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/sse/TestSSE_Basic.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/sse/TestSSE_Basic.java
index 3774fed5e8..b086dedc6e 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/sse/TestSSE_Basic.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/sse/TestSSE_Basic.java
@@ -262,7 +262,7 @@ public class TestSSE_Basic
     @Test public void testTripleTermTag_4()  { testNode("(tripleterm 
(tripleterm :s :p :o ) :q (tripleterm :s :p :o))"); }
     @Test public void testTripleTermTag_5()  { testNode("(tripleterm <<( :s :p 
:o )>> :q <<( :s :p :o )>>)"); }
 
-    // Legal as  structure, can't be lifted.
+    // Legal as structure, can't be lifted.
     @Test public void testTripleTermTag_11()  { parseBadNoLift("(tripleterm 
:s)"); }
     @Test public void testTripleTermTag_12()  { parseBadNoLift("(tripleterm :s 
:p)"); }
     @Test public void testTripleTermTag_13()  { parseBadNoLift("(tripleterm 
(tripleterm :s :p :o) :q "); }

Reply via email to