blob: f1ab67c1ad4881c898426c519fe259f31ee3ebea [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.tdb.junit;
import java.util.List ;
import org.apache.jena.query.* ;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.sparql.SystemARQ ;
import org.apache.jena.sparql.engine.QueryEngineFactory ;
import org.apache.jena.sparql.engine.QueryExecutionBase ;
import org.apache.jena.sparql.engine.ref.QueryEngineRef ;
import org.apache.jena.sparql.junit.EarlReport ;
import org.apache.jena.sparql.junit.EarlTestCase ;
import org.apache.jena.sparql.junit.TestItem ;
import org.apache.jena.sparql.resultset.ResultSetCompare ;
import org.apache.jena.sparql.resultset.SPARQLResult ;
import org.apache.jena.system.Txn;
import org.apache.jena.tdb.TDBFactory ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
public class QueryTestTDB1 extends EarlTestCase
{
// Changed to using in-memory graphs/datasets because this is testing the query
// processing. Physical graph/datsets is in package "store".
private static Logger log = LoggerFactory.getLogger(QueryTestTDB1.class) ;
private Dataset dataset = null ;
boolean skipThisTest = false ;
final List<String> defaultGraphURIs ;
final List<String> namedGraphURIs ;
final String queryFile ;
final SPARQLResult results ;
// Track what's currently loaded in the GraphLocation
private static List<String> currentDefaultGraphs = null ;
private static List<String> currentNamedGraphs = null ;
// Old style (Junit3)
public QueryTestTDB1(String testName, EarlReport report, TestItem item)
{
this(testName, report, item.getURI(),
item.getDefaultGraphURIs(), item.getNamedGraphURIs(),
item.getResults(), item.getQueryFile()
) ;
}
public QueryTestTDB1(String testName, EarlReport report,
String uri,
List<String> dftGraphs,
List<String> namedGraphs,
SPARQLResult rs,
String queryFile
)
{
super(testName, uri, report) ;
this.defaultGraphURIs = dftGraphs ;
this.namedGraphURIs = namedGraphs ;
this.queryFile = queryFile ;
this.results = rs ;
}
boolean oldValueUsePlainGraph = SystemARQ.UsePlainGraph ;
@Override public void setUpTest()
{
dataset = TDBFactory.createDataset() ;
// Make sure a plain, no sameValueAs graph is used.
oldValueUsePlainGraph = SystemARQ.UsePlainGraph ;
SystemARQ.UsePlainGraph = true ;
setupData() ;
}
@Override public void tearDownTest()
{
if ( dataset != null )
{
dataset.close() ;
dataset = null ;
}
SystemARQ.UsePlainGraph = oldValueUsePlainGraph ;
}
public void setupData()
{
if ( compareLists(defaultGraphURIs, currentDefaultGraphs) &&
compareLists(namedGraphURIs, currentNamedGraphs) )
return ;
if ( defaultGraphURIs == null )
throw new TDBTestException("No default graphs given") ;
//graphLocation.clear() ;
// Allow "qt:data" to be quads in defaultGraphURIs.
for ( String fn : defaultGraphURIs )
RDFDataMgr.read(dataset, fn);
for ( String fn : namedGraphURIs )
RDFDataMgr.read(dataset.getNamedModel(fn), fn) ;
}
@Override
protected void runTestForReal()
{
if ( skipThisTest )
{
log.info(this.getName()+" : Skipped") ;
return ;
}
Query query = QueryFactory.read(queryFile) ;
Dataset ds = DatasetFactory.create();
for ( String fn : defaultGraphURIs )
RDFDataMgr.read(ds, fn); // Allow quads
for ( String fn : namedGraphURIs )
RDFDataMgr.read(ds.getNamedModel(fn), fn) ;
// ---- First, get the expected results by executing in-memory or from a results file.
ResultSetRewindable rs1;
String expectedLabel;
if ( results != null )
{
rs1 = ResultSetFactory.makeRewindable(results.getResultSet()) ;
expectedLabel = "Results file" ;
}
else
{
QueryEngineFactory f = QueryEngineRef.getFactory() ;
try(QueryExecution qExec1 = new QueryExecutionBase(query, ds, null, f)) {
rs1 = ResultSetFactory.makeRewindable(qExec1.execSelect()) ;
}
expectedLabel = "Standard engine" ;
}
// ---- Second, execute in persistent graph
Dataset ds2 = dataset ;
Txn.executeRead(ds2, ()->{
QueryExecution qExec2 = QueryExecutionFactory.create(query, ds2) ;
ResultSet rs = qExec2.execSelect() ;
ResultSetRewindable rs2 = ResultSetFactory.makeRewindable(rs) ;
// See if the same.
boolean b = ResultSetCompare.equalsByValue(rs1, rs2) ;
if ( !b )
{
rs1.reset() ;
rs2.reset() ;
System.out.println("------------------- "+this.getName());
System.out.printf("**** Expected (%s)", expectedLabel) ;
ResultSetFormatter.out(System.out, rs1) ;
System.out.println("**** Got (TDB)") ;
ResultSetFormatter.out(System.out, rs2) ;
}
assertTrue("Results sets not the same", b) ;
});
}
private static boolean compareLists(List<String> list1, List<String> list2)
{
if ( list1 == null )
return ( list2 == null ) ;
return list1.equals(list2) ;
}
}