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 fde6757336 GH-3622: Substitute: Check there is a query pattern to 
transform
fde6757336 is described below

commit fde6757336484a9d08406c34a3a49fa91a84344b
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Dec 6 09:27:13 2025 +0000

    GH-3622: Substitute: Check there is a query pattern to transform
---
 .../QuerySyntaxSubstituteScope.java                | 11 +++++++-
 .../syntax/syntaxtransform/QueryTransformOps.java  | 32 +++++++++++++---------
 .../syntaxtransform/TestQuerySyntaxSubstitute.java | 26 ++++++++++++++++++
 3 files changed, 55 insertions(+), 14 deletions(-)

diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QuerySyntaxSubstituteScope.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QuerySyntaxSubstituteScope.java
index d700a8b7b1..74ffa67e8f 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QuerySyntaxSubstituteScope.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/syntax/syntaxtransform/QuerySyntaxSubstituteScope.java
@@ -19,6 +19,7 @@
 package org.apache.jena.sparql.syntax.syntaxtransform;
 
 import java.util.Collection;
+import java.util.Objects;
 
 import org.apache.jena.query.Query;
 import org.apache.jena.sparql.core.Var;
@@ -35,11 +36,19 @@ public class QuerySyntaxSubstituteScope {
      * For example, an assigned variables ({@code AS ?var}) can not be replace 
by a value.
      */
     public static void scopeCheck(Query query, Collection<Var> vars) {
+        Objects.requireNonNull(query);
+        Objects.requireNonNull(vars);
+        if ( vars.isEmpty() )
+            return;
         checkLevel(query, vars);
-        checkPattern(query.getQueryPattern(), vars);
+        // DESCRIBE might not have a pattern
+        if ( query.getQueryPattern() != null )
+            checkPattern(query.getQueryPattern(), vars);
     }
 
     public static void checkPattern(Element element, Collection<Var> vars) {
+        Objects.requireNonNull(element);
+        Objects.requireNonNull(vars);
         ElementVisitor visitor = new SubstituteScopeVisitor(vars);
         ElementWalker.walk(element, visitor);
     }
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 7de683b917..3ccad2c073 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
@@ -42,14 +42,14 @@ import org.apache.jena.sparql.syntax.*;
 public class QueryTransformOps {
 
     /**
-     * Replace variables in a query by RDF terms.
-     * The replacements are added to the return queries SELECT clause (if a 
SELECT query).
+     * Replace variables in a query by RDF terms. The replacements are added 
to the
+     * return queries SELECT clause if the query is a SELECT query.
      *
-     * @throws QueryScopeException if the query contains variables used in a
-     *   way that does not allow substitution (.e.g {@code AS ?var} or used in
-     *   {@code VALUES}).
-     *
-     *  @see #replaceVars(Query, Map) to replace variables without adding the 
replacements to the SELECT clause.
+     * @throws QueryScopeException if the query contains variables used in a 
way that
+     *     does not allow substitution (.e.g {@code AS ?var} or used in
+     *     {@code VALUES}).
+     * @see #replaceVars(Query, Map) to replace variables without adding the
+     *     replacements to the SELECT clause.
      */
     public static Query syntaxSubstitute(Query input, Map<Var, ? extends Node> 
substitutions) {
         Query query2 = transformSubstitute(input, substitutions);
@@ -68,13 +68,14 @@ public class QueryTransformOps {
     }
 
     /**
-     * Transform a query based on a mapping from {@link Var} variable to 
replacement {@link Node}.
-     * The replacement can be a constant or another variable.
-     * This operation does not record the substitution made.
+     * Transform a query based on a mapping from {@link Var} variable to 
replacement
+     * {@link Node}. The replacement can be a constant or another variable.
+     * <p>
+     * To change the query to record the substitutions made, use
+     * {@link #syntaxSubstitute(Query,Map)}.
      *
-     * See {@link #syntaxSubstitute(Query,Map)}
-     * @throws QueryScopeException if the query contains variables used in a
-     *   way that does not allow constant substitution.
+     * @throws QueryScopeException if the query contains variables used in a 
way that
+     *     does not allow constant substitution.
      */
     public static Query replaceVars(Query query, Map<Var, ? extends Node> 
substitutions) {
         return transformSubstitute(query, substitutions);
@@ -98,6 +99,7 @@ public class QueryTransformOps {
           if (! ( node instanceof Var ) )
               varsForConst.add(var);
         });
+        // Check the transformation is possible (e.g. no replacement of "AS 
?var")
         QuerySyntaxSubstituteScope.scopeCheck(query, varsForConst);
 
         NodeTransform nodeTransform = new NodeTransformSubst(substitutions);
@@ -482,6 +484,10 @@ public class QueryTransformOps {
         }
     }
 
+    /**
+     * Return a new query object with copies of prefixes, base and dataset 
description
+     * and shares patterns and results clause (SELECT query) with the original.
+     */
     public static Query shallowCopy(Query query) {
         QueryShallowCopy copy = new QueryShallowCopy();
         query.visit(copy);
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxSubstitute.java
 
b/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxSubstitute.java
index 8b6e54a721..6ac13458fd 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxSubstitute.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/syntax/syntaxtransform/TestQuerySyntaxSubstitute.java
@@ -104,6 +104,32 @@ public class TestQuerySyntaxSubstitute {
                       );
     }
 
+    // ==== Other query forms
+
+    @Test public void syntaxSubstitute_describe_1() {
+        testSubstitute("DESCRIBE ?x", substitutions1, "DESCRIBE :xxx");
+    }
+
+    @Test public void syntaxSubstitute_describe_2() {
+        testSubstitute("DESCRIBE ?x {}", substitutions1, "DESCRIBE :xxx {}");
+    }
+
+    @Test public void syntaxSubstitute_describe_3() {
+        testSubstitute("DESCRIBE ?x ?y { ?x :p ?y }", substitutions1, 
"DESCRIBE :xxx ?y { :xxx :p ?y }");
+    }
+
+    @Test public void syntaxSubstitute_construct_1() {
+        testSubstitute("CONSTRUCT {} WHERE {}", substitutions1, "CONSTRUCT {} 
WHERE {}");
+    }
+
+    @Test public void syntaxSubstitute_construct_2() {
+        testSubstitute("CONSTRUCT { ?x :p ?y } WHERE {?x :p ?y }", 
substitutions1, "CONSTRUCT { :xxx :p ?y } WHERE { :xxx :p ?y }");
+    }
+
+    @Test public void syntaxSubstitute_ask_1() {
+        testSubstitute("ASK { ?x :p ?y}" , substitutions1, "ASK { :xxx :p ?y 
}");
+    }
+
     // ==== Variable-variable renaming.
     // This is always possible so no scoping checks are done.
 

Reply via email to