/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* 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.sparql.negation;
import java.io.StringReader ;
import java.util.Arrays ;
import java.util.Collection ;
import org.apache.jena.atlas.lib.StrUtils ;
import org.apache.jena.query.* ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.junit.AfterClass ;
import org.junit.Assert ;
import org.junit.Test ;
import org.junit.runner.RunWith ;
import org.junit.runners.Parameterized ;
import org.junit.runners.Parameterized.Parameters ;
/**
* Tests for calculating graph deltas using SPARQL
*
*/
@RunWith(Parameterized.class)
public class TestGraphDeltas {
private static final String testData = StrUtils.strjoinNL("<http://r1> <http://r1> <http://r1> .",
"<http://r2> <http://r2> <http://r2> .");
private static final String testData2 = StrUtils.strjoinNL("<http://r1> <http://r1> <http://r1> , <http://r2> .",
"<http://r2> <http://r2> <http://r2> .");
private static final String testData3 = StrUtils.strjoinNL("<http://r1> <http://r1> <http://r1> , \"value\" .",
"<http://r2> <http://r2> <http://r2> , 1234 .");
private static final String testData4 = StrUtils.strjoinNL(
"<http://r1> <http://r1> <http://r1> , \"value\" , 1234, 123e4, 123.4, true, false .",
"<http://r2> <http://r2> <http://r2> .");
private static final String MinusQuery = StrUtils.strjoinNL
("SELECT *",
"{",
" GRAPH <http://a>",
" {",
" ?s ?p ?o .",
" }",
" MINUS",
" {",
" GRAPH <http://b> { ?s ?p ?o }",
" }",
"}");
private static final String OptionalSameTermQuery1 = StrUtils.strjoinNL
("SELECT *",
"{",
" GRAPH <http://a>",
" {",
" ?s ?p ?o .",
" }",
" OPTIONAL",
" {",
" GRAPH <http://b> { ?s0 ?p0 ?o0 . }",
" FILTER (SAMETERM(?s, ?s0) && SAMETERM(?p, ?p0) && SAMETERM(?o, ?o0))",
" }",
" FILTER(!BOUND(?s0))",
"}");
private static final String OptionalSameTermQuery2 = StrUtils.strjoinNL
("SELECT *",
"{",
" GRAPH <http://a>",
" {",
" ?s ?p ?o .",
" }",
" OPTIONAL",
" {",
" GRAPH <http://b> { ?s ?p ?o0 . }",
" FILTER (SAMETERM(?o, ?o0))",
" }",
" FILTER(!BOUND(?o0))",
"}");
private static final String NotExistsQuery = StrUtils.strjoinNL
("SELECT *",
"{",
" GRAPH <http://a>",
" {",
" ?s ?p ?o .",
" }",
" FILTER NOT EXISTS { GRAPH <http://b> { ?s ?p ?o } }",
"}");
@AfterClass
public static void afterTests() {
ARQ.getContext().set(ARQ.optimization, true);
}
static boolean[] $enabled = new boolean[] { true }, $disabled = new boolean[] { false };
/**
* Data for parameters
*/
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] { { $enabled }, { $disabled } });
}
/**
* Creates new tests
*
* @param optimized
* Whether to enable the ARQ optimizer
*/
public TestGraphDeltas(boolean[] optimized) {
ARQ.getContext().set(ARQ.optimization, optimized[0]);
}
private void testQuery(Dataset ds, String query, String queryName, int differences) {
try(QueryExecution qe = QueryExecutionFactory.create(query, ds)) {
ResultSetRewindable results = ResultSetFactory.makeRewindable(qe.execSelect());
Assert.assertEquals(queryName + " gave incorrect results", differences, results.size());
}
}
/**
* Tests the delta queries which calculate deltas correctly i.e. finds
* triples in {@code a} which are not present in {@code b}
*
* @param a
* Model A
* @param b
* Model B
* @param differences
* Expected number of differences
*/
private void testDeltas(Model a, Model b, int differences) {
Dataset ds = DatasetFactory.createGeneral();
ds.addNamedModel("http://a", a);
ds.addNamedModel("http://b", b);
this.testQuery(ds, MinusQuery, "Minus", differences);
this.testQuery(ds, OptionalSameTermQuery1, "OptionalSameTerm1", differences);
this.testQuery(ds, OptionalSameTermQuery2, "OptionalSameTerm2", differences);
this.testQuery(ds, NotExistsQuery, "NotExists", differences);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_01() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData), null, "TTL");
b.read(new StringReader(testData), null, "TTL");
this.testDeltas(a, b, 0);
this.testDeltas(b, a, 0);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_02() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData), null, "TTL");
b.read(new StringReader(testData2), null, "TTL");
this.testDeltas(a, b, 0);
this.testDeltas(b, a, 1);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_03() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData), null, "TTL");
b.read(new StringReader(testData2), null, "TTL");
b.removeAll(b.createResource("http://r1"), null, null);
Assert.assertEquals(1, b.size());
this.testDeltas(a, b, 1);
this.testDeltas(b, a, 0);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_04() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData), null, "TTL");
this.testDeltas(a, b, 2);
this.testDeltas(b, a, 0);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_05() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData3), null, "TTL");
b.read(new StringReader(testData), null, "TTL");
this.testDeltas(a, b, 2);
this.testDeltas(b, a, 0);
}
/**
* Tests graph deltas calculate with SPARQL
*/
@Test
public void sparql_graph_delta_06() {
Model a = ModelFactory.createDefaultModel();
Model b = ModelFactory.createDefaultModel();
a.read(new StringReader(testData4), null, "TTL");
b.read(new StringReader(testData), null, "TTL");
this.testDeltas(a, b, 6);
this.testDeltas(b, a, 0);
}
}