package org.rdfhdt.hdtjena.solver;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import org.junit.Before;
import org.junit.Test;
import org.rdfhdt.hdt.enums.ResultEstimationType;
import org.rdfhdt.hdt.hdt.HDT;
import org.rdfhdt.hdt.hdt.HDTManager;
import org.rdfhdt.hdt.options.HDTSpecification;
import org.rdfhdt.hdt.triples.IteratorTripleString;
import org.rdfhdt.hdt.triples.TripleString;
import org.rdfhdt.hdtjena.HDTGraph;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.Syntax;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.DatasetGraphFactory;
import org.apache.jena.sparql.engine.Plan;
public class OptimizedCountTest {
HDTGraph graph;
DatasetGraph dataset;
@Before
public void setUp() throws Exception {
HDT hdt = HDTManager.generateHDT(new DummyIteratorTripleString(), "", new HDTSpecification(), null);
graph =new HDTGraph(hdt, true);
dataset = DatasetGraphFactory.createOneGraph(graph);
}
private Plan getPlan(String sparql) {
try {
System.out.println(sparql);
Query query = QueryFactory.create(sparql, Syntax.syntaxARQ);
return OptimizedCount.getPlan(null, query, dataset, null, null);
} catch (Throwable e) {
System.out.println("ERR");
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Test
public void testDictionary() {
assertNotNull(getPlan("SELECT COUNT(distinct ?s) WHERE { ?s ?p ?o }"));
assertNotNull(getPlan("SELECT COUNT(distinct ?p) { ?s ?p ?o }"));
assertNotNull(getPlan("SELECT COUNT(distinct ?o) { ?s ?p ?o }"));
}
@Test
public void testAllTriples() {
assertNotNull(getPlan("SELECT COUNT(*) { ?s ?p ?o }"));
assertNotNull(getPlan("SELECT COUNT(?s) { ?s ?p ?o }"));
assertNotNull(getPlan("SELECT COUNT(?p) { ?s ?p ?o }"));
assertNotNull(getPlan("SELECT COUNT(?o) { ?s ?p ?o }"));
}
@Test
public void testTriplePattern() {
assertNotNull(getPlan("SELECT COUNT(*) { <hello> ?p ?o }"));
}
@Test
public void testGraph() {
assertNotNull(getPlan("SELECT COUNT(*) { graph <hello> { ?s ?p ?o }}"));
}
@Test
public void testWrong() {
assertNull("not count", getPlan("SELECT * { ?s ?p ?o }"));
assertNull("distinct + Triple Pattern",getPlan("SELECT COUNT(distinct ?p) { <hello> ?p ?o }"));
assertNull("unused variable", getPlan("SELECT COUNT(distinct ?NO) { ?s ?p ?o }"));
assertNull("triple pattern join", getPlan("SELECT COUNT(distinct ?o) { ?s ?SAME ?SAME }"));
assertNull("filter", getPlan("SELECT COUNT(*) { ?s ?p ?o FILTER (isLiteral(?o))}"));
assertNull("having", getPlan("SELECT COUNT(*) { ?s ?p ?o } HAVING(?o>0)"));
assertNull("limit", getPlan("SELECT COUNT(*) { ?s ?p ?o } LIMIT 0"));
assertNull("offset", getPlan("SELECT COUNT(*) { ?s ?p ?o } OFFSET 10"));
}
private class DummyIteratorTripleString implements IteratorTripleString {
boolean used;
@Override
public boolean hasNext() {
return !used;
}
@Override
public TripleString next() {
used=true;
return new TripleString("<http://www.example.org/foo>", "<http://www.example.org/bar>", "\"test\"");
}
@Override
public void remove() {
}
@Override
public boolean hasPrevious() {
return false;
}
@Override
public TripleString previous() {
return null;
}
@Override
public void goToStart() {
used = false;
}
@Override
public long estimatedNumResults() {
return 1;
}
@Override
public ResultEstimationType numResultEstimation() {
return ResultEstimationType.EXACT;
}
}
}