Skip to content

Commit c25b19b

Browse files
Merge main into develop (#5410)
2 parents 405d6ce + 3111faa commit c25b19b

4 files changed

Lines changed: 85 additions & 0 deletions

File tree

compliance/repository/src/test/java/org/eclipse/rdf4j/repository/sparql/federation/RepositoryFederatedServiceIntegrationTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,16 @@ public void test10_consumePartially() {
340340
}
341341
}
342342

343+
@Test
344+
public void test_ValuesClause() {
345+
346+
addData(serviceRepo, Lists.newArrayList(vf.createStatement(iri("s1"), RDFS.LABEL, l("val1"))));
347+
348+
String query = "SELECT ?var WHERE { SERVICE <urn:dummy> { VALUES ?var { 'val1' 'val2' } ?s ?p ?var } }";
349+
350+
assertResultEquals(evaluateQuery(query), "var", Lists.newArrayList(l("val1")));
351+
}
352+
343353
private void addData(Repository repo, Collection<? extends Statement> m) {
344354
try (RepositoryConnection conn = repo.getConnection()) {
345355
conn.add(m);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Eclipse RDF4J contributors.
3+
*
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Distribution License v1.0
6+
* which accompanies this distribution, and is available at
7+
* http://www.eclipse.org/org/documents/edl-v10.php.
8+
*
9+
* SPDX-License-Identifier: BSD-3-Clause
10+
*******************************************************************************/
11+
package org.eclipse.rdf4j.repository.sparql.federation;
12+
13+
import org.eclipse.rdf4j.repository.Repository;
14+
import org.eclipse.rdf4j.repository.sail.SailRepository;
15+
import org.eclipse.rdf4j.sail.memory.MemoryStore;
16+
import org.junit.jupiter.api.Disabled;
17+
import org.junit.jupiter.api.Test;
18+
19+
public class SparqlFederatedServiceIntegrationTest {
20+
21+
@Test
22+
@Disabled("manual test to demonstrate the original issue of GH-5358")
23+
public void testValues_Wikidata() {
24+
Repository repo = new SailRepository(new MemoryStore());
25+
try (var conn = repo.getConnection()) {
26+
27+
var tq = conn.prepareTupleQuery("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
28+
+ "PREFIX sh: <http://www.w3.org/ns/shacl#>\n"
29+
+ "SELECT * WHERE {\n"
30+
+ " SERVICE <https://query.wikidata.org/sparql> {\n"
31+
+ " VALUES ?resource {\n"
32+
+ " <http://www.wikidata.org/entity/Q7455975>\n"
33+
+ " }\n"
34+
+ " ?resource <http://www.wikidata.org/prop/direct/P856> ?website\n"
35+
+ " }\n"
36+
+ "}");
37+
38+
try (var tqr = tq.evaluate()) {
39+
tqr.stream().forEach(bs -> System.out.println(bs));
40+
}
41+
}
42+
}
43+
}

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/BindingSetAssignmentInlinerOptimizer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.eclipse.rdf4j.query.algebra.Filter;
2121
import org.eclipse.rdf4j.query.algebra.LeftJoin;
2222
import org.eclipse.rdf4j.query.algebra.QueryModelNode;
23+
import org.eclipse.rdf4j.query.algebra.Service;
2324
import org.eclipse.rdf4j.query.algebra.TupleExpr;
2425
import org.eclipse.rdf4j.query.algebra.Var;
2526
import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
@@ -54,6 +55,11 @@ public void meet(BindingSetAssignment bsa) {
5455
super.meet(bsa);
5556
}
5657

58+
@Override
59+
public void meet(Service node) throws RuntimeException {
60+
// do not inject bindings inside service clauses
61+
}
62+
5763
@Override
5864
public void meet(Var var) {
5965
if (bindingSet != null && bindingSet.hasBinding(var.getName())) {

core/queryalgebra/evaluation/src/test/java/org/eclipse/rdf4j/query/algebra/evaluation/impl/BindingSetAssignmentInlinerTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.eclipse.rdf4j.query.algebra.Not;
2727
import org.eclipse.rdf4j.query.algebra.Projection;
2828
import org.eclipse.rdf4j.query.algebra.QueryRoot;
29+
import org.eclipse.rdf4j.query.algebra.Service;
2930
import org.eclipse.rdf4j.query.algebra.StatementPattern;
3031
import org.eclipse.rdf4j.query.algebra.TupleExpr;
3132
import org.eclipse.rdf4j.query.algebra.Union;
@@ -311,6 +312,31 @@ public void testOptimize_Minus() {
311312
assertThat(sp.getSubjectVar().getValue()).isNull();
312313
}
313314

315+
@Test
316+
public void testServiceClause() {
317+
String query = "SELECT * WHERE { SERVICE <urn:myService> { VALUES ?s1 { <urn:a> } ?s1 ?p1 ?o1 } }";
318+
319+
ParsedTupleQuery parsedQuery = QueryParserUtil.parseTupleQuery(QueryLanguage.SPARQL, query, null);
320+
321+
QueryOptimizer optimizer = getOptimizer();
322+
optimizer.optimize(parsedQuery.getTupleExpr(), new SimpleDataset(), EmptyBindingSet.getInstance());
323+
324+
TupleExpr optimizedTreeRoot = parsedQuery.getTupleExpr();
325+
TupleExpr optimizedTree = ((QueryRoot) optimizedTreeRoot).getArg();
326+
327+
assertThat(optimizedTree).isInstanceOf(Projection.class);
328+
329+
Projection projection = (Projection) optimizedTree;
330+
331+
Service service = (Service) projection.getArg();
332+
333+
Join join = (Join) service.getArg();
334+
Var s1 = ((StatementPattern) join.getRightArg()).getSubjectVar();
335+
assertThat(s1.getName()).isEqualTo("s1");
336+
assertThat(s1.hasValue()).isFalse();
337+
338+
}
339+
314340
@Override
315341
public QueryOptimizer getOptimizer() {
316342
return new BindingSetAssignmentInlinerOptimizer();

0 commit comments

Comments
 (0)