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