/*
* 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.core;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.query.* ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.sparql.sse.SSE ;
import org.junit.After ;
import org.junit.Before ;
import org.junit.Test ;
public abstract class AbstractTestDynamicDataset extends BaseTest
{
protected abstract Dataset createDataset() ;
protected abstract void releaseDataset(Dataset ds) ;
Dataset dataset ;
@After public void after() {
releaseDataset(dataset) ;
}
@Before public void before()
{
dataset = createDataset() ;
// Named graphs
for ( int i = 0 ; i < 5 ; i++ )
addGraph(dataset, i) ;
// Default model.
Model m = dataset.getDefaultModel() ;
Triple t1 = SSE.parseTriple("(<uri:x> <uri:p> 0)") ;
Triple t2 = SSE.parseTriple("(<uri:y> <uri:q> 'ABC')") ;
Triple t3 = SSE.parseTriple("(<uri:z> <uri:property> 'DEF')") ;
m.getGraph().add(t1) ;
m.getGraph().add(t2) ;
m.getGraph().add(t3) ;
}
private static void addGraph(Dataset dataset, int i)
{
// Not a very interesting model
String x = "graph:"+i ;
Model m = dataset.getNamedModel(x) ;
Triple t1 = SSE.parseTriple("(<uri:x> <uri:p> "+i+")") ;
Triple t2 = SSE.parseTriple("(<uri:y> <uri:q> 'ABC')") ;
m.getGraph().add(t1) ;
m.getGraph().add(t2) ;
}
@Test public void dynamic01() { testCount("SELECT * {?s ?p ?o}", 3, dataset) ; }
@Test public void dynamic02() { testCount("SELECT ?g { GRAPH ?g {} }", 5, dataset) ; }
@Test public void dynamic03() { testCount("SELECT * FROM <graph:1> {?s <uri:p> ?o}", 1, dataset) ; }
@Test public void dynamic04() { testCount("SELECT * FROM <graph:1> { GRAPH ?g { ?s ?p ?o} }", 0, dataset) ; }
@Test public void dynamic05() { testCount("SELECT * FROM <graph:1> FROM <graph:2> {?s <uri:p> ?o}", 2, dataset) ; }
// Duplicate surpression
@Test public void dynamic06() { testCount("SELECT ?s FROM <graph:1> FROM <graph:2> {?s <uri:q> ?o}", 1, dataset) ; }
@Test public void dynamic07() { testCount("SELECT ?s FROM NAMED <graph:1> {?s <uri:q> ?o}", 0, dataset) ; }
@Test public void dynamic08() { testCount("SELECT ?s FROM <graph:2> FROM NAMED <graph:1> {?s <uri:q> ?o}", 1, dataset) ; }
@Test public void dynamic09() { testCount("SELECT * "+
"FROM <graph:1> FROM <graph:2> "+
"FROM NAMED <graph:3> FROM NAMED <graph:4> "+
"{ GRAPH ?g { ?s <uri:q> ?o }}",
2, dataset) ;
}
@Test public void dynamic10() { testCount("SELECT * "+
"FROM <graph:1> FROM <graph:2>"+
"FROM NAMED <graph:3> FROM NAMED <graph:4> "+
"{ GRAPH ?g { ?s <uri:q> ?o }}",
2, dataset) ;
}
@Test public void dynamic11() { testCount("SELECT * "+
"FROM <x:unknown>"+
"{ GRAPH ?g { ?s <uri:q> ?o }}",
0, dataset) ;
}
@Test public void dynamic12() { testCount("SELECT * "+
"FROM <graph:1>"+
"{ GRAPH ?g { }}",
0, dataset) ;
}
@Test public void dynamic13() { testCount("SELECT * "+
"FROM NAMED <graph:1>"+
"{ GRAPH ?g { }}",
1, dataset) ;
}
@Test public void dynamic14() { testCount("SELECT * "+
"FROM NAMED <graph:1> FROM NAMED <graph:2>"+
"FROM <graph:3> "+
"{ GRAPH ?g { }}",
2, dataset) ;
}
//
//
// // If context.isTrue(TDB.symUnionDefaultGraph)
//
// protected abstract void startDynamicAndUnionTest() ; // TDB.getContext().setTrue(TDB.symUnionDefaultGraph) ;
// protected abstract void finishDynamicAndUnionTest() ; // TDB.getContext().unset(TDB.symUnionDefaultGraph) ;
//
// @Test public void dynamicAndUnion1() {
// try {
// startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ GRAPH ?g { ?s <uri:q> ?o }}",
// 2, dataset) ;
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// @Test public void dynamicAndUnion2() {
// try { startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ ?s <uri:q> ?o }", // Same in each graph
// 1, dataset) ;
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// @Test public void dynamicAndUnion3() {
// try { startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ ?s <uri:p> ?o }", // Different in each graph
// 2, dataset) ;
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// @Test public void dynamicAndUnion4() {
// try { startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM <graph:1> FROM <graph:2>"+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ ?s <uri:p> ?o }",
// 2, dataset) ; // Only see <graph:1> and <graph:2> as default graph.
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion5() {
// testCount("SELECT * "+
// "FROM <graph:1>"+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ GRAPH <urn:x-arq:DefaultGraph> { ?s <uri:p> ?o } }", // Different in each graph
// 1, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion6() {
// try {
// startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM <graph:1>"+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ GRAPH <urn:x-arq:DefaultGraph> { ?s <uri:p> ?o } }",
// 1, dataset) ;
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion7() {
// testCount("SELECT * "+
// "FROM <graph:1>"+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ GRAPH <urn:x-arq:UnionGraph> { ?s <uri:p> ?o } }",
// 2, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion8() {
// try {
// startDynamicAndUnionTest() ;
// testCount("SELECT * "+
// "FROM <graph:1>"+
// "FROM NAMED <graph:3> FROM NAMED <graph:4> "+
// "{ GRAPH <urn:x-arq:UnionGraph> { ?s <uri:p> ?o } }",
// 2, dataset) ;
// } finally { finishDynamicAndUnionTest() ; }
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion10() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:DefaultGraph>" +
// "{ ?s ?p ?o }",
// 3, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion10a() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:DefaultGraph>" +
// "{ GRAPH ?g { ?s ?p ?o } }",
// 0, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion11() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:UnionGraph>" +
// "{ ?s ?p ?o }",
// 6, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion11a() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:UnionGraph>" +
// "{ GRAPH ?g { ?s ?p ?o } }",
// 0, dataset) ;
// }
//
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion12() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:DefaultGraph>" +
// "FROM <urn:x-arq:UnionGraph>" +
// "{ ?s ?p ?o }",
// 7, dataset) ;
// }
//
// //@Ignore("Test of dynamic datasets with named default or union graph")
// @Test public void dynamicAndUnion12a() {
// testCount("SELECT * "+
// "FROM <urn:x-arq:DefaultGraph>" +
// "FROM <urn:x-arq:UnionGraph>" +
// "{ GRAPH ?g { ?s ?p ?o } }",
// 0, dataset) ;
// }
// @Test public void dynamic99() {
// // Check we did not mess with the global context in getting previous tests to pass.
// testCount("SELECT * FROM NAMED <graph:3> { ?s ?p ?o }", 0, dataset) ;
// }
//
// // Tests of patterns and paths across graphs.
//
// private static String dataStr = StrUtils.strjoinNL(
// "(dataset" ,
// " (graph" ,
// " (triple <http://example/s> <http://example/p> 'dft')" ,
// " (triple <http://example/s> <http://example/p> <http://example/x>)" ,
// " (triple <http://example/x> <http://example/p> <http://example/o>)" ,
// " )" ,
// " (graph <http://example/g1>",
// " (triple <http://example/s> <http://example/p> 'g1')",
// " (triple <http://example/s> <http://example/p1> <http://example/x>)",
// " (triple <http://example/x> <http://example/p2> <http://example/o>)",
// " )",
// " (graph <http://example/g2>",
// " (triple <http://example/s> <http://example/p> 'g2')",
// " (triple <http://example/x> <http://example/p1> <http://example/z>)",
// " (triple <http://example/x> <http://example/p2> <http://example/o>)",
// " (triple <http://example/x> <http://example/p2> <http://example/o2>)",
// " )",
// " (graph <http://example/g3>",
// " (triple <http://example/s> <http://example/p> 'g3')",
// " (triple <http://example/s> <http://example/p1> <http://example/y>)",
// " ))") ;
//
// private static Dataset dataset2 = TDBFactory.createDataset() ;
// static {
// Item item = SSE.parse(dataStr) ;
// DatasetGraph dsg = BuilderGraph.buildDataset(item) ;
//
// Iterator<Quad> iter = dsg.find() ;
// for ( ; iter.hasNext(); )
// dataset2.asDatasetGraph().add(iter.next()) ;
// }
// private static Node gn1 = SSE.parseNode("<http://example/g1>") ;
// private static Node gn2 = SSE.parseNode("<http://example/g2>") ;
// private static Node gn3 = SSE.parseNode("<http://example/g3>") ;
// private static Node gn9 = SSE.parseNode("<http://example/g9>") ;
//
// private static final String prefix = "PREFIX : <http://example/> " ;
//
// // g1+g2 { ?s :p1 ?x . ?x :p2 ?o } ==> 1
// // g1+g2 { ?s :p1* ?o } ==> 1
//
// @Test public void pattern_01()
// {
// testCount(prefix + "SELECT * FROM :g1 FROM :g2 { ?s :p1 ?x . ?x :p2 ?o }", 2, dataset2) ;
// }
//
// @Test public void pattern_02()
// {
// String qs = prefix + "SELECT * FROM :g1 FROM :g2 { ?s :p1+ ?x }" ;
//// Query query = QueryFactory.create(qs) ;
//// Dataset ds = DatasetFactory.create(DynamicDatasets.dynamicDataset(query, dataset2.asDatasetGraph())) ;
//// QueryExecution qExec = QueryExecutionFactory.create(query, ds) ;
//// ResultSetFormatter.out(qExec.execSelect()) ;
// testCount(qs, 3, dataset2) ;
// }
//
// @Test public void pattern_03()
// {
// // Do it externally to the TDB query engine.
// String qs = prefix + "SELECT * FROM :g1 FROM :g2 { ?s :p1+ ?x }" ;
// Query query = QueryFactory.create(qs) ;
// DatasetDescription dsDesc = DatasetDescription.create(query) ;
// Dataset ds = DynamicDatasets.dynamicDataset(dsDesc, dataset2, false) ;
// testCount(qs, 3, ds) ;
// }
private static void testCount(String queryString, int expected, Dataset ds)
{
Query query = QueryFactory.create(queryString) ;
QueryExecution qExec = QueryExecutionFactory.create(query, ds) ;
ResultSet rs = qExec.execSelect() ;
int n = ResultSetFormatter.consume(rs) ;
assertEquals(expected, n) ;
}
}