package com.google.refine.test.org.deri.reconcile.executors;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequest;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.IdentifiedValueContext;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.PropertyContext;
import com.google.refine.org.deri.reconcile.model.ReconciliationRequestContext.TextualValueContext;
import com.google.refine.org.deri.reconcile.rdf.executors.DumpQueryExecutor;
import com.google.refine.org.deri.reconcile.rdf.executors.QueryExecutor;
import com.google.refine.org.deri.reconcile.rdf.factories.LarqSparqlQueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
/**
* @author fadmaa
* this class mainly tests that queries produced by {@link org.deri.refine.reconcile.rdf.factories.LarqSparqlQueryFactory LarqSparqlQueryFactory}
* are correct (executable)
*/
public class LarqSparqlQueryExecutorTest {
QueryExecutor executor;
LarqSparqlQueryFactory factory;
//query
int limit =8;
String queryString = "godfather";
ImmutableList<String> searchPropertyUris = ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label",
"http://www.w3.org/2004/02/skos/core#prefLabel");
@BeforeClass
public void init(){
Model m = ModelFactory.createDefaultModel();
InputStream in = this.getClass().getResourceAsStream("../files/films.ttl");
m.read(in,null,"TTL");
executor = new DumpQueryExecutor(m);
factory = new LarqSparqlQueryFactory();
}
@Test
public void executeSimpleReconciliationQuery(){
ReconciliationRequest request = new ReconciliationRequest(queryString, limit);
String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris);
ResultSet resultset = executor.sparql(sparql);
assertResult(null,resultset,"http://data.linkedmdb.org/resource/film/930","http://data.linkedmdb.org/resource/film/329",
"http://data.linkedmdb.org/resource/film_series/261");
}
@Test
public void executeReconciliationQueryWithType(){
ReconciliationRequest request = new ReconciliationRequest(queryString, limit);
request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film"});
String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris);
ResultSet resultset = executor.sparql(sparql);
assertResult("http://data.linkedmdb.org/resource/film_series/261", resultset,"http://data.linkedmdb.org/resource/film/930","http://data.linkedmdb.org/resource/film/329");
}
@Test
public void executeReconciliationQueryWithContext(){
ReconciliationRequest request = new ReconciliationRequest(queryString, limit);
request.setTypes(new String[] {"http://data.linkedmdb.org/resource/movie/film"});
PropertyContext prop1 = new PropertyContext("http://data.linkedmdb.org/resource/movie/initial_release_date",
new TextualValueContext("2006"));
PropertyContext prop2 = new PropertyContext("http://data.linkedmdb.org/resource/movie/director",
new IdentifiedValueContext("http://data.linkedmdb.org/resource/movie/director3"));
request.setContext(new ReconciliationRequestContext(prop1 ,prop2));
String sparql = factory.getReconciliationSparqlQuery(request, searchPropertyUris);
ResultSet resultset = executor.sparql(sparql);
assertResult("http://data.linkedmdb.org/resource/film/329", resultset,"http://data.linkedmdb.org/resource/film/930");
}
private void assertResult(String notContainedUri, ResultSet resultset, String... containedUris){
Set<String> urisSet = new HashSet<String>(Arrays.asList(containedUris));
while(resultset.hasNext()){
QuerySolution solution = resultset.nextSolution();
Resource r = solution.getResource("entity");
String uri = r.getURI();
urisSet.remove(uri);
if(uri.equals(notContainedUri)){
fail(notContainedUri + " was found in the result") ;
}
}
assertTrue(urisSet.isEmpty(), urisSet + " were not found in the result");
}
/*
* Suggest type
*/
@Test
public void sugestTypeTest(){
String prefix = "fil";
String sparql = factory.getTypeSuggestSparqlQuery(prefix, limit);
ResultSet resultset = executor.sparql(sparql);
assertInResultset("type",resultset,"http://data.linkedmdb.org/resource/movie/film","http://data.linkedmdb.org/resource/movie/film_series");
}
private void assertInResultset(String propertyName, ResultSet resultset, String... containedUris){
Set<String> urisSet = new HashSet<String>(Arrays.asList(containedUris));
while(resultset.hasNext()){
QuerySolution solution = resultset.nextSolution();
Resource r = solution.getResource(propertyName);
String uri = r.getURI();
urisSet.remove(uri);
}
assertTrue(urisSet.isEmpty(), urisSet + " were not found in the result");
}
/*
* Suggest property
*/
@Test
public void sugestPropertyTest(){
String prefix = "init";
String sparql = factory.getPropertySuggestSparqlQuery(prefix, "http://data.linkedmdb.org/resource/movie/film", limit);
ResultSet resultset = executor.sparql(sparql);
assertInResultset("p", resultset,"http://data.linkedmdb.org/resource/movie/initial_release_date");
}
/*
* sample instances
*/
@Test
public void sampleInstancesTest(){
String sparql = factory.getSampleInstancesSparqlQuery("http://data.linkedmdb.org/resource/movie/film", ImmutableList.of("http://www.w3.org/2000/01/rdf-schema#label"), limit);
ResultSet resultset = executor.sparql(sparql);
assertTrue(resultset.hasNext());
QuerySolution sol = resultset.nextSolution();
assertFalse(sol.getLiteral("label1").getString().isEmpty());
String uri1 = sol.getResource("entity").getURI();
assertTrue(resultset.hasNext());
sol = resultset.nextSolution();
assertFalse(sol.getLiteral("label1").getString().isEmpty());
assertFalse(uri1.equals(sol.getResource("entity").getURI()));
}
/*
* search entities
*/
@Test
public void searchEntitiesTest(){
String prefix = "godf";
String sparql = factory.getEntitySearchSparqlQuery(prefix, searchPropertyUris, limit);
ResultSet resultset = executor.sparql(sparql);
assertInResultset("entity", resultset, "http://data.linkedmdb.org/resource/film_series/261",
"http://data.linkedmdb.org/resource/film/930","http://data.linkedmdb.org/resource/film/329");
}
}