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 de2527686b1a11dceb9835d4147485a4cba1887a Author: Claus Stadler <[email protected]> AuthorDate: Mon Feb 24 18:02:39 2025 +0100 Support for JSON query type in QueryTransformOps. --- jena-arq/src/main/java/org/apache/jena/query/Query.java | 11 +++++++++++ .../syntax/syntaxtransform/QueryTransformOps.java | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/jena-arq/src/main/java/org/apache/jena/query/Query.java b/jena-arq/src/main/java/org/apache/jena/query/Query.java index faf6a8aa70..905862c681 100644 --- a/jena-arq/src/main/java/org/apache/jena/query/Query.java +++ b/jena-arq/src/main/java/org/apache/jena/query/Query.java @@ -503,6 +503,17 @@ public class Query extends Prologue implements Cloneable, Printable return Collections.unmodifiableMap(jsonMapping); } + /** + * Overwrite all prior JSON mappings with new ones. + * + * @param newJsonMapping The new JSON mappings. Must not be null. + */ + public void setJsonMapping(Map<String, Node> newJsonMapping) { + Objects.requireNonNull(newJsonMapping); + jsonMapping.clear(); + jsonMapping.putAll(newJsonMapping); + } + // ---- Aggregates // Record allocated aggregations. 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 34081c0fae..37f9352391 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 @@ -21,9 +21,12 @@ 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 org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; @@ -193,7 +196,9 @@ public class QueryTransformOps { mutateVarExprList(q2.getProject(), exprTransform); break; case CONSTRUCT_JSON : - throw new UnsupportedOperationException("Transform of JSON template queries"); + Map<String, Node> newJsonMapping = transformJsonMapping(q2.getJsonMapping(), exprTransform); + q2.setJsonMapping(newJsonMapping); + break; case UNKNOWN : default : throw new JenaException("Unknown query type"); @@ -318,6 +323,16 @@ public class QueryTransformOps { return varExprList2; } + 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. + return result; + } + // Transform a variable node (for low-usage cases). // Returns node object for "no transform" private static Node transform(Node node, ExprTransform exprTransform) {
