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 <[email protected]>
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()