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 495eaa40933a0770320e7ebe226d57f1098c6461
Author: Andy Seaborne <[email protected]>
AuthorDate: Thu Dec 18 14:36:14 2025 +0000

    GH-3656: Include VALUES in WHERE for modify requests
---
 .../jena/arq/querybuilder/UpdateBuilder.java       | 39 ------------------
 .../arq/querybuilder/handlers/WhereHandler.java    | 48 ++++------------------
 .../updatebuilder/WhereQuadHolder.java             | 10 ++++-
 .../AbstractRegexpBasedTest.java                   |  2 +-
 .../jena/arq/querybuilder/AskBuilderTest.java      |  1 -
 .../arq/querybuilder/ConstructBuilderTest.java     |  1 -
 .../jena/arq/querybuilder/SelectBuilderTest.java   |  1 -
 .../TestAbstractQueryBuilder.java                  |  9 ++--
 .../jena/arq/querybuilder/UpdateBuilderTest.java   | 17 ++++++++
 .../querybuilder/handlers/AbstractHandlerTest.java |  2 +-
 10 files changed, 40 insertions(+), 90 deletions(-)

diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/UpdateBuilder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/UpdateBuilder.java
index 9e3e821746..8684bb853d 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/UpdateBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/UpdateBuilder.java
@@ -977,45 +977,6 @@ public class UpdateBuilder {
         return this;
     }
 
-    /**
-     * Create a list node from a list of objects as per RDF Collections.
-     *
-     * http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#collections
-     *
-     * See {@link AbstractQueryBuilder#makeNode} for conversion of the param 
values.
-     * <p>
-     * usage:
-     * <ul>
-     * <li>list( param1, param2, param3, ... )</li>
-     * <li>addWhere( list( param1, param2, param3, ... ), p, o )</li>
-     * <li>addOptional( list( param1, param2, param3, ... ), p, o )</li>
-     * </ul>
-     *
-     * @param objs the list of objects for the list.
-     * @return the first blank node in the list.
-     * @deprecated use makeList
-     * @see #makeList(Object...)
-     */
-    @Deprecated(since="5.0.0")
-    public Node list(Object... objs) {
-        Node retval = NodeFactory.createBlankNode();
-        Node lastObject = retval;
-        for (int i = 0; i < objs.length; i++) {
-            Node n = makeNode(objs[i]);
-            addWhere(new TriplePath(Triple.create(lastObject, 
RDF.first.asNode(), n)));
-            if (i + 1 < objs.length) {
-                Node nextObject = NodeFactory.createBlankNode();
-                addWhere(new TriplePath(Triple.create(lastObject, 
RDF.rest.asNode(), nextObject)));
-                lastObject = nextObject;
-            } else {
-                addWhere(new TriplePath(Triple.create(lastObject, 
RDF.rest.asNode(), RDF.nil.asNode())));
-            }
-
-        }
-
-        return retval;
-    }
-
     /**
      * Create a list node from a list of objects as per RDF Collections.
      *
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
index 0b1fd064f2..6b9e23e31d 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/WhereHandler.java
@@ -26,8 +26,6 @@ import org.apache.jena.arq.querybuilder.clauses.SelectClause;
 import org.apache.jena.arq.querybuilder.rewriters.BuildElementVisitor;
 import org.apache.jena.arq.querybuilder.rewriters.ElementRewriter;
 import org.apache.jena.graph.Node;
-import org.apache.jena.graph.NodeFactory;
-import org.apache.jena.graph.Triple;
 import org.apache.jena.query.Query;
 import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.core.TriplePath;
@@ -35,7 +33,6 @@ import org.apache.jena.sparql.core.Var;
 import org.apache.jena.sparql.expr.Expr;
 import org.apache.jena.sparql.syntax.*;
 import org.apache.jena.sparql.util.ExprUtils;
-import org.apache.jena.vocabulary.RDF;
 
 /**
  * The where handler. Generally handles GroupGraphPattern.
@@ -51,7 +48,6 @@ public class WhereHandler implements Handler {
 
     private static Predicate<Node> checkSubject = n -> checkPredicate.test(n) 
|| n.isBlank();
 
-
     // the query to modify
     private final Query query;
 
@@ -454,47 +450,19 @@ public class WhereHandler implements Handler {
          */
         BuildElementVisitor visitor = new BuildElementVisitor();
         getElement().visit(visitor);
+        Element result = visitor.getResult();
+
         if (!valuesHandler.isEmpty()) {
-            if (visitor.getResult() instanceof ElementGroup) {
-                ((ElementGroup) 
visitor.getResult()).addElement(valuesHandler.asElement());
-                ;
-            } else {
-                ElementGroup eg = new ElementGroup();
-                eg.addElement(visitor.getResult());
+            if (result instanceof ElementGroup eg) {
                 eg.addElement(valuesHandler.asElement());
-                visitor.setResult(eg);
-            }
-        }
-        query.setQueryPattern(visitor.getResult());
-    }
-
-    /**
-     * Create a list node from a list of objects as per RDF Collections.
-     *
-     * http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#collections
-     *
-     * @param objs the list of objects for the list.
-     * @return the first blank node in the list.
-     * @deprecated use {code Converters.makeCollection(List.of(Object...))}.
-     */
-    @Deprecated(since="5.0.0")
-    public Node list(Object... objs) {
-        Node retval = NodeFactory.createBlankNode();
-        Node lastObject = retval;
-        for (int i = 0; i < objs.length; i++) {
-            Node n = Converters.makeNode(objs[i], query.getPrefixMapping());
-            addWhere(new TriplePath(Triple.create(lastObject, 
RDF.first.asNode(), n)));
-            if (i + 1 < objs.length) {
-                Node nextObject = NodeFactory.createBlankNode();
-                addWhere(new TriplePath(Triple.create(lastObject, 
RDF.rest.asNode(), nextObject)));
-                lastObject = nextObject;
             } else {
-                addWhere(new TriplePath(Triple.create(lastObject, 
RDF.rest.asNode(), RDF.nil.asNode())));
+                ElementGroup eg2 = new ElementGroup();
+                eg2.addElement(result);
+                eg2.addElement(valuesHandler.asElement());
+                result = eg2;
             }
-
         }
-
-        return retval;
+        query.setQueryPattern(result);
     }
 
     /**
diff --git 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/WhereQuadHolder.java
 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/WhereQuadHolder.java
index a01a949e61..4f73cb91a3 100644
--- 
a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/WhereQuadHolder.java
+++ 
b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/updatebuilder/WhereQuadHolder.java
@@ -97,7 +97,15 @@ public class WhereQuadHolder implements QuadHolder {
      */
     public void addAll(WhereHandler whereHandler) {
 
-        Element e = whereHandler.getQueryPattern();
+        // GH-3656
+        // Need to make the whereHandler have a completed query pattern.
+        // Values assembly is incremental and need freezing.
+        // Clone and build to leave the WhereHandler argument untouched.
+        WhereHandler whereHandler2 = new WhereHandler();
+        whereHandler2.addAll(whereHandler);
+        whereHandler2.build();
+        Element e = whereHandler2.getQueryPattern();
+
         if (e != null) {
             // clone the Element
             ElementRewriter rewriter = new 
ElementRewriter(Collections.emptyMap());
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractRegexpBasedTest.java
similarity index 99%
rename from 
jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
rename to 
jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractRegexpBasedTest.java
index 829b3d4731..3276f34256 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/AbstractRegexpBasedTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AbstractRegexpBasedTest.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jena.arq;
+package org.apache.jena.arq.querybuilder;
 
 import static org.junit.jupiter.api.Assertions.fail;
 
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AskBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AskBuilderTest.java
index 7f3c879ee0..8a7fcc7549 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AskBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/AskBuilderTest.java
@@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import org.apache.jena.arq.AbstractRegexpBasedTest;
 import org.apache.jena.vocabulary.RDF;
 
 public class AskBuilderTest extends AbstractRegexpBasedTest {
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/ConstructBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/ConstructBuilderTest.java
index 227363a9a9..7c3378ea05 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/ConstructBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/ConstructBuilderTest.java
@@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import org.apache.jena.arq.AbstractRegexpBasedTest;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.vocabulary.RDF;
 
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
index 875f555512..fb4633dc46 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/SelectBuilderTest.java
@@ -25,7 +25,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import org.apache.jena.arq.AbstractRegexpBasedTest;
 import org.apache.jena.query.*;
 import org.apache.jena.rdf.model.Model;
 import org.apache.jena.rdf.model.ModelFactory;
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/TestAbstractQueryBuilder.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/TestAbstractQueryBuilder.java
similarity index 92%
rename from 
jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/TestAbstractQueryBuilder.java
rename to 
jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/TestAbstractQueryBuilder.java
index 08439f8cab..8a9824d835 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/TestAbstractQueryBuilder.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/TestAbstractQueryBuilder.java
@@ -6,18 +6,17 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License. You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.jena.arq;
+package org.apache.jena.arq.querybuilder;
 
-import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.arq.querybuilder.handlers.HandlerBlock;
 import org.apache.jena.query.QueryFactory;
 
@@ -26,7 +25,7 @@ import org.apache.jena.query.QueryFactory;
  */
 @SuppressWarnings("rawtypes")
 public class TestAbstractQueryBuilder extends AbstractQueryBuilder {
-    
+
     public HandlerBlock handlerBlock = new HandlerBlock( 
QueryFactory.create());
 
     @Override
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/UpdateBuilderTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/UpdateBuilderTest.java
index c7d9ae8d85..71dcaa0ca1 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/UpdateBuilderTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/UpdateBuilderTest.java
@@ -42,6 +42,7 @@ import org.apache.jena.sparql.syntax.ElementGroup;
 import org.apache.jena.sparql.syntax.ElementPathBlock;
 import org.apache.jena.update.Update;
 import org.apache.jena.update.UpdateAction;
+import org.apache.jena.update.UpdateRequest;
 import org.apache.jena.vocabulary.DC_11;
 
 public class UpdateBuilderTest {
@@ -559,4 +560,20 @@ public class UpdateBuilderTest {
         // JENA-1739 fails here
         new UpdateBuilder().addDelete("?s", "<x>", "?p").addOptional("?s", 
path, "?p").build();
     }
+
+    @Test
+    public void testValuesInWhereClause() {
+        Var s = Converters.makeVar("s");
+        Node[] uris = { NodeFactory.createURI("my:uri1"), 
NodeFactory.createURI("my:uri2") };
+        WhereBuilder where = new WhereBuilder();
+        where.addWhere("?s", "?p", "?o");
+        where.addWhereValueVar(s, (Object[])uris);
+        UpdateBuilder update = new UpdateBuilder();
+        update.addDelete("?s", "?p", "?o");
+        update.addWhere(where);
+        UpdateRequest upRequest = update.buildRequest();
+
+        String output = upRequest.toString();
+        assertTrue(output.contains("VALUES"));
+    }
 }
diff --git 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/AbstractHandlerTest.java
 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/AbstractHandlerTest.java
index 4e164a19fb..d41bec2394 100644
--- 
a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/AbstractHandlerTest.java
+++ 
b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/AbstractHandlerTest.java
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.jena.arq.AbstractRegexpBasedTest;
+import org.apache.jena.arq.querybuilder.AbstractRegexpBasedTest;
 
 public abstract class AbstractHandlerTest extends AbstractRegexpBasedTest {
 

Reply via email to