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 d2a05adc44 Allow transform from NodeValue to Var.
d2a05adc44 is described below

commit d2a05adc4440f25920699d8792c791c105ba1834
Author: Claus Stadler <ravenarka...@googlemail.com>
AuthorDate: Thu Sep 11 23:43:14 2025 +0200

    Allow transform from NodeValue to Var.
---
 .../org/apache/jena/sparql/expr/NodeValue.java     |  2 +-
 .../syntaxtransform/ExprTransformNodeElement.java  |  2 +-
 .../syntax/syntaxtransform/QueryTransformOps.java  | 15 +++++++----
 .../jena/sparql/algebra/TestNodeTransform.java     | 31 ++++++++++++++++++++++
 4 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
index 6696d22ee5..b6776c518e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/NodeValue.java
@@ -379,7 +379,7 @@ public abstract class NodeValue extends ExprNode
     public Expr applyNodeTransform(NodeTransform transform) {
         Node n = asNode();
         n = transform.apply(n);
-        return makeNode(n);
+        return ExprLib.nodeToExpr(n);
     }
 
     public Node evalNode(Binding binding, ExecutionContext execCxt) {
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ExprTransformNodeElement.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ExprTransformNodeElement.java
index ea7eca93ad..e62a65dc0b 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ExprTransformNodeElement.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/ExprTransformNodeElement.java
@@ -66,7 +66,7 @@ public class ExprTransformNodeElement extends 
ExprTransformCopy {
         Node n = nodeTransform.apply(nv.asNode());
         if ( n == nv.asNode() )
             return nv;
-        return NodeValue.makeNode(n);
+        return ExprLib.nodeToExpr(n);
     }
 
     @Override
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
index 9afc9d2472..44a7a12730 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QueryTransformOps.java
@@ -59,8 +59,8 @@ public class QueryTransformOps {
             List<Var> projectVars = query2.getProjectVars();
             substitutions.forEach((v, n) -> {
                 if ( ! projectVars.contains(v) ) {
-                    var nv = NodeValue.makeNode(n);
-                    query2.getProject().update(v, NodeValue.makeNode(n));
+                    NodeValue nv = NodeValue.makeNode(n);
+                    query2.getProject().update(v, nv);
                 }
             });
         }
@@ -112,14 +112,19 @@ public class QueryTransformOps {
         });
         QuerySyntaxSubstituteScope.scopeCheck(query, varsForConst);
 
-        ElementTransform eltrans = new ElementTransformSubst(substitutions);
         NodeTransform nodeTransform = new NodeTransformSubst(substitutions);
-        ExprTransform exprTrans = new ExprTransformNodeElement(nodeTransform, 
eltrans);
-        return transform(query, eltrans, exprTrans);
+        return transform(query, nodeTransform);
     }
 
     // ----------------
 
+    /** Transform a query using a generic NodeTransform. */
+    public static Query transform(Query query, NodeTransform transform) {
+        ElementTransform eltrans = new ElementTransformSubst(transform);
+        ExprTransform exprTrans = new ExprTransformNodeElement(transform, 
eltrans);
+        return QueryTransformOps.transform(query, eltrans, exprTrans);
+    }
+
     public static Query transform(Query query, ElementTransform transform) {
         ExprTransform noop = new ExprTransformApplyElementTransform(transform);
         return transform(query, transform, noop);
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestNodeTransform.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestNodeTransform.java
index 5c29db5e47..1933dff67a 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestNodeTransform.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestNodeTransform.java
@@ -26,9 +26,12 @@ import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.query.Query;
 import org.apache.jena.query.QueryFactory;
 import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.graph.NodeTransform;
 import org.apache.jena.sparql.graph.NodeTransformLib;
 import org.apache.jena.sparql.sse.SSE;
+import org.apache.jena.sparql.syntax.syntaxtransform.QueryTransformOps;
+import org.apache.jena.sparql.util.ExprUtils;
 
 /** Tests of node transformation : {@link NodeTransformLib}. */
 public class TestNodeTransform {
@@ -80,6 +83,18 @@ public class TestNodeTransform {
         testQuery(queryExpectedStr, queryInputStr, nodeTransform);
     }
 
+    @Test public void transformNodeValueToVar01() {
+        testExpr("?v", "1", x -> Var.alloc("v"));
+    }
+
+    @Test public void transformNodeValueToVar02() {
+        String queryInputStr    = "SELECT * { } ORDER BY ('foo')";
+        String queryExpectedStr = "SELECT * { } ORDER BY (?x)";
+        NodeTransform nt = n -> n.isLiteral() && 
n.getLiteralLexicalForm().equals("foo") ? Var.alloc("x") : n;
+        testQuery(queryExpectedStr, queryInputStr, nt);
+        testQueryElt(queryExpectedStr, queryInputStr, nt);
+    }
+
     /** Test query in, transform, query out */
     private static void testQuery(String expectedStr, String inputStr, 
NodeTransform nt) {
         Query qExpected = QueryFactory.create(expectedStr);
@@ -99,12 +114,28 @@ public class TestNodeTransform {
         assertEquals(qExpected, qActual1);
     }
 
+    /** Test query in, transform, query out - Element level. */
+    private static void testQueryElt(String expectedStr, String inputStr, 
NodeTransform nt) {
+        Query qExpected = QueryFactory.create(expectedStr);
+        Query inputQuery = QueryFactory.create(inputStr);
+        Query qActual = QueryTransformOps.transform(inputQuery, nt);
+        assertEquals(qExpected, qActual);
+    }
+
     /** Test Op in, transform, Op out */
     private static void testOp(Op opExpected, Op opInput, NodeTransform nt) {
         Op opActual = NodeTransformLib.transform(nt, opInput);
         assertEquals(opExpected, opActual);
     }
 
+    /** Test Expr in, transform, Expr out */
+    private static void testExpr(String exprExpectedStr, String exprInputStr, 
NodeTransform nt) {
+        Expr exprExpected = ExprUtils.parse(exprExpectedStr);
+        Expr exprInput = ExprUtils.parse(exprInputStr);
+        Expr exprActual = NodeTransformLib.transform(nt, exprInput);
+        assertEquals(exprExpected, exprActual);
+    }
+
     // Add a string to a variable name
     private static NodeTransform nodeTransform = n -> {
         return n.isVariable()

Reply via email to