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 {
