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 0b26a2dddd213ed7131197bab1270d3ba8fcb8b4 Author: Andy Seaborne <[email protected]> AuthorDate: Tue Mar 4 11:29:11 2025 +0000 Tests for QueryTransformOps on JSON template query --- .../syntax/syntaxtransform/QueryTransformOps.java | 44 +++++++++------------- .../syntaxtransform/TestQuerySyntaxTransform.java | 33 +++++++++++++--- 2 files changed, 44 insertions(+), 33 deletions(-) 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 c9efb591cc..e6823219f8 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 @@ -20,13 +20,7 @@ package org.apache.jena.sparql.syntax.syntaxtransform; import static org.apache.jena.sparql.syntax.syntaxtransform.QuerySyntaxSubstituteScope.scopeCheck; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.stream.Collectors; +import java.util.*; import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; @@ -179,10 +173,10 @@ public class QueryTransformOps { QuadAcc acc = new QuadAcc(); List<Quad> quads = template.getQuads(); quads.forEach(q->{ - Node g = transform(q.getGraph(), exprTransform); - Node s = transform(q.getSubject(), exprTransform); - Node p = transform(q.getPredicate(), exprTransform); - Node o = transform(q.getObject(), exprTransform); + Node g = transformOrSame(q.getGraph(), exprTransform); + Node s = transformOrSame(q.getSubject(), exprTransform); + Node p = transformOrSame(q.getPredicate(), exprTransform); + Node o = transformOrSame(q.getObject(), exprTransform); acc.addQuad(Quad.create(g, s, p, o)); }); Template template2 = new Template(acc); @@ -268,7 +262,7 @@ public class QueryTransformOps { private static void mutateDescribeVar(List<Var> varList, List<Node> constants, ExprTransform exprTransform) { List<Var> varList2 = new ArrayList<>(varList.size()); for (Var v : varList) { - Node n = transform(v, exprTransform); + Node n = transformOrSame(v, exprTransform); if ( n != v ) { if ( !constants.contains(n) ) constants.add(n); @@ -324,24 +318,21 @@ public class QueryTransformOps { } private static Map<String, Node> transformJsonMapping(Map<String, Node> jsonMapping, ExprTransform exprTransform) { - Map<String, Node> result = jsonMapping.entrySet().stream() - .collect(Collectors.toMap( - Entry::getKey, - e -> transform(e.getValue(), exprTransform), // transform(Node, ExprTransform) never returns null. - (u, v) -> v, // Clashes can't happen. - LinkedHashMap::new)); // Retain order. + Map<String, Node> result = new LinkedHashMap<>(); + jsonMapping.forEach((k,n)->{ + Node n2 = transformOrSame(n, exprTransform); + result.put(k, n2); + }); return result; } - // Transform a variable node (for low-usage cases). - // Returns node object for "no transform" - private static Node transform(Node node, ExprTransform exprTransform) { + // Transform a variable node. + // Returns the argument java object for "no transform" + private static Node transformOrSame(Node node, ExprTransform exprTransform) { if ( ! Var.isVar(node) ) return node; - Var v = Var.alloc(node); - ExprVar ev = new ExprVar(v); - Expr e2 = exprTransform.transform(ev); - if (e2 == null || e2 == ev ) + Expr e2 = exprTransform.transform(node); + if ( e2 == null ) return node; if ( ! e2.isConstant() ) return node; @@ -351,8 +342,7 @@ public class QueryTransformOps { static class QueryShallowCopy implements QueryVisitor { final Query newQuery = new Query(); - QueryShallowCopy() { - } + QueryShallowCopy() {} @Override public void startVisit(Query query) { diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxTransform.java b/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxTransform.java index cafad5fe56..b275cf6a0c 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxTransform.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxTransform.java @@ -185,17 +185,38 @@ public class TestQuerySyntaxTransform "x", "<urn:ex:z>"); } - @Test public void transformTransformJsonReplace_30() { - testQuery("JSON { \"s\": ?s } { ?s ?p ?o }", - "JSON { \"s\": 123 } { ?s ?p ?o }", - "s", "123"); + @Test public void transformTransformJsonReplace_01() { + testQuery("JSON { 'key': ?x } { }", + "JSON { 'key': 123 } { }", + "x", "123"); + } + + @Test public void transformTransformJsonReplace_02() { + testQuery("PREFIX : <http://example/> JSON { \"o\": ?o } { ?s :p ?o }", + "PREFIX : <http://example/> JSON { \"o\": 123 } { ?s :p 123}", + "o", "123"); + } + + @Test public void transformTransformJsonReplace_03() { + String queryString = """ + JSON { "s" : ?s , + "x" : ?x , + "unused": ?unused , + "fixed" : 'fixed' } WHERE {} + """; + String expectedString = """ + JSON { "s" : ?s , + "x" : "abc" , + "unused": ?unused , + "fixed" : 'fixed' } WHERE {} + """; + testQuery(queryString, expectedString, "x", "'abc'"); } //static final String PREFIX = "PREFIX : <http://example/>\n"; static final String PREFIX = ""; - private void testQuery(String input, String output, String varStr, String valStr) - { + private void testQuery(String input, String output, String varStr, String valStr) { Query q1 = QueryFactory.create(PREFIX+input); Query qExpected = QueryFactory.create(PREFIX+output);
