MinusTest.java
/*******************************************************************************
* Copyright (c) 2022 Eclipse RDF4J contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*******************************************************************************/
package org.eclipse.rdf4j.testsuite.sparql.tests;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.util.Values;
import org.eclipse.rdf4j.query.BindingSet;
import org.eclipse.rdf4j.query.TupleQuery;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.testsuite.sparql.AbstractComplianceTest;
import org.junit.jupiter.api.DynamicTest;
/**
* Test for queries using MINUS
*
* @author H��vard M. Ottestad
*/
public class MinusTest extends AbstractComplianceTest {
public MinusTest(Supplier<Repository> repo) {
super(repo);
}
private void testScopingOfFilterInMinus(RepositoryConnection conn) {
String ex = "http://example/";
IRI a1 = Values.iri(ex, "a1");
IRI a2 = Values.iri(ex, "a2");
IRI both = Values.iri(ex, "both");
IRI predicate1 = Values.iri(ex, "predicate1");
IRI predicate2 = Values.iri(ex, "predicate2");
conn.add(a1, predicate1, both);
conn.add(a1, predicate2, both);
conn.add(a2, predicate1, both);
conn.add(a2, predicate2, Values.bnode());
TupleQuery tupleQuery = conn.prepareTupleQuery(
"PREFIX : <http://example/>\n" +
"SELECT * WHERE {\n" +
" ?a :predicate1 ?p1\n" +
" MINUS {\n" +
" ?a :predicate2 ?p2 .\n" +
" FILTER(?p2 = ?p1)\n" +
" }\n" +
"} ORDER BY ?a\n"
);
try (Stream<BindingSet> stream = tupleQuery.evaluate().stream()) {
List<BindingSet> collect = stream.collect(Collectors.toList());
assertEquals(2, collect.size());
List<Value> expectedValues = List.of(a1, a2);
List<Value> actualValues = collect
.stream()
.map(b -> b.getValue("a"))
.collect(Collectors.toList());
assertEquals(expectedValues, actualValues);
}
}
public Stream<DynamicTest> tests() {
return Stream.of(makeTest("ScopingOfFilterInMinus", this::testScopingOfFilterInMinus));
}
}