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()