blob: 55f18189d9fb67b6eeb90d505303b4ee12c984ae [file] [log] [blame]
/**
* 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.query.text;
import static org.junit.Assert.assertEquals;
import java.io.Reader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collection;
import java.util.List ;
import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.lib.Creator;
import org.apache.jena.atlas.lib.StrUtils ;
import org.apache.jena.query.* ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.sparql.sse.SSE ;
import org.apache.jena.system.Txn;
import org.apache.jena.tdb.TDB ;
import org.apache.jena.tdb.TDBFactory ;
import org.apache.jena.tdb2.TDB2;
import org.apache.jena.tdb2.TDB2Factory;
import org.apache.jena.vocabulary.RDFS ;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory ;
import org.apache.lucene.store.RAMDirectory ;
import org.junit.Test ;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/** Text dataset tests using TDB1 and TDB2 transactionally, including context unionDefaultGraph.
* <p>
* Note that in Lucene, writes are not visible to a reader of the {@code Directory}
* until committed. A special {@link IndexReader} is needed. See
* {@link DirectoryReader#open(IndexWriter)}. jena-text does not currentyl do this.
* <p>
* When used outside a transaction, writes are "autocommit" (see
* {@link TextDocProducerTriples}) and so are visible immediately.
* <p>
* TDB2 is transactional only.
* <p>Union graph support by context is required for these tests.
*/
@RunWith(Parameterized.class)
public class TestTextTxnTDB
{
@Parameters(name = "{index}: {0}")
public static Collection<Object[]> data() {
Creator<Dataset> tdb1Factory = ()->TDBFactory.createDataset();
Creator<Dataset> tdb2Factory = ()->TDB2Factory.createDataset();
return Arrays.asList( new Object[][]{
{ "TDB1", tdb1Factory } ,
{ "TDB2", tdb2Factory }
});
}
private final Creator<Dataset> factory;
public TestTextTxnTDB(String name, Creator<Dataset> factory) {
this.factory = factory;
}
private Dataset create() {
Dataset ds1 = factory.create();
Directory dir = new RAMDirectory() ;
EntityDefinition eDef = new EntityDefinition("iri", "text");
eDef.setPrimaryPredicate(RDFS.label);
TextIndex tidx = new TextIndexLucene(dir, new TextIndexConfig(eDef)) ;
Dataset ds = TextDatasetFactory.create(ds1, tidx) ;
return ds ;
}
@Test public void textTDB_union_1() {
// Check the union graph still works
Dataset ds = create() ;
ds.getContext().set(TDB.symUnionDefaultGraph, true) ;
ds.getContext().set(TDB2.symUnionDefaultGraph, true) ;
Quad quad = SSE.parseQuad("(<g> <p> rdfs:label 'foo')") ;
Txn.executeWrite(ds, ()->ds.asDatasetGraph().add(quad));
Txn.executeRead(ds, ()->{
Query q = QueryFactory.create("SELECT * { ?s ?p ?o }") ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_union_2() {
// Check text query and union graph
Dataset ds = create() ;
ds.getContext().set(TDB.symUnionDefaultGraph, true) ;
ds.getContext().set(TDB2.symUnionDefaultGraph, true) ;
Txn.executeWrite(ds, ()->{
Quad quad = SSE.parseQuad("(<g> <s> rdfs:label 'foo')") ;
ds.asDatasetGraph().add(quad) ;
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL("PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"{ ?s text:query 'foo' ;",
" rdfs:label 'foo'",
"}"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_3() {
Dataset ds = create() ;
ds.getContext().set(TDB.symUnionDefaultGraph, true) ;
ds.getContext().set(TDB2.symUnionDefaultGraph, true) ;
Txn.executeWrite(ds, ()->{
data(ds,
"(<ex:g1> <s1> rdfs:label 'foo')",
"(<ex:g2> <s2> rdfs:label 'bar')") ;
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"{ ?s text:query 'foo' ;",
" rdfs:label 'foo'",
"}"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_4() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
data(ds,
"(<ex:g1> <s1> rdfs:label 'foo')",
"(<ex:g1> <s2> rdfs:label 'apple')",
"(<ex:g2> <s3> rdfs:label 'bar')") ;
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"FROM <ex:g1>",
"{ ?s text:query 'foo' . ?s rdfs:label ?o }"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_5() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
data(ds,
"(<ex:g1> <s1> rdfs:label 'foo')",
"(<ex:g1> <s2> rdfs:label 'apple')",
"(<ex:g2> <s3> rdfs:label 'food')") ;
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"FROM <"+Quad.unionGraph+">",
"{ ?s text:query 'foo*' . ?s rdfs:label ?o }"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(2,x.size());
});
}
@Test public void textTDB_6() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
data(ds,
"(<ex:g1> <s1> rdfs:label 'foo')",
"(<ex:g1> <s2> rdfs:label 'apple')",
"(<ex:g2> <s3> rdfs:label 'food')") ;
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"{ GRAPH <"+Quad.unionGraph+">",
" { ?s text:query 'foo*' . ?s rdfs:label ?o }",
"}"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(2,x.size());
});
}
@Test public void textTDB_7_subject_bound_first() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
data(ds,
"(<ex:g1> <s1> rdfs:label 'foo')",
"(<ex:g1> <s1> rdf:type <http://example.org/Entity>)",
"(<ex:g1> <s2> rdfs:label 'apple')",
"(<ex:g1> <s2> rdf:type <http://example.org/Entity>)",
"(<ex:g2> <s3> rdfs:label 'food')",
"(<ex:g2> <s3> rdf:type <http://example.org/Entity>)");
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"FROM <ex:g1>",
"{ ?s a <http://example.org/Entity> . ?s text:query 'foo' }"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_8_bnode_subject() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
dataTurtle(ds,
StrUtils.strjoinNL(
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"[] a <http://example.org/Entity>; rdfs:label 'foo' ."
)
);
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"{ ?s text:query 'foo' . ?s a <http://example.org/Entity> }"
) ;
Query q = QueryFactory.create(qs) ;
QueryExecution qexec = QueryExecutionFactory.create(q, ds) ;
ResultSet rs = qexec.execSelect() ;
List<QuerySolution> x = Iter.toList(rs) ;
assertEquals(1,x.size());
});
}
@Test public void textTDB_9_bnode_subject_bound_first() {
Dataset ds = create() ;
Txn.executeWrite(ds, ()->{
dataTurtle(ds,
StrUtils.strjoinNL(
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"[] a <http://example.org/Entity>; rdfs:label 'foo' ."
)
);
});
Txn.executeRead(ds, ()->{
String qs = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"SELECT *",
"{ ?s a <http://example.org/Entity> . ?s text:query 'foo' }"
);
Query q = QueryFactory.create(qs);
QueryExecution qexec = QueryExecutionFactory.create(q, ds);
ResultSet rs = qexec.execSelect();
List<QuerySolution> x = Iter.toList(rs);
assertEquals(1,x.size());
});
}
private static void data(Dataset ds, String... quadStrs) {
for ( String qs : quadStrs ) {
Quad quad = SSE.parseQuad(qs) ;
ds.asDatasetGraph().add(quad) ;
}
}
private static void dataTurtle(Dataset ds, String turtle) {
Model model = ds.getDefaultModel();
Reader reader = new StringReader(turtle);
model.read(reader, "", "TURTLE");
}
// With FROM and FROM NAMED + TDB
}