package exp.cornercases;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Set;
import javax.sql.DataSource;
import org.aksw.commons.util.MapReader;
import org.aksw.jena_sparql_api.restriction.RestrictionManagerImpl;
import org.aksw.jena_sparql_api.views.CandidateViewSelector;
import org.aksw.jena_sparql_api.views.ViewQuad;
import org.aksw.sparqlify.core.algorithms.CandidateViewSelectorSparqlify;
import org.aksw.sparqlify.core.algorithms.ViewDefinitionNormalizerImpl;
import org.aksw.sparqlify.core.cast.TypeSystem;
import org.aksw.sparqlify.core.domain.input.ViewDefinition;
import org.aksw.sparqlify.core.interfaces.MappingOps;
import org.aksw.sparqlify.util.ExprRewriteSystem;
import org.aksw.sparqlify.util.SparqlifyCoreInit;
import org.aksw.sparqlify.util.SparqlifyUtils;
import org.aksw.sparqlify.util.ViewDefinitionFactory;
import org.antlr.runtime.RecognitionException;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.Syntax;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.core.Var;
import org.apache.jena.sparql.expr.E_Equals;
import org.apache.jena.sparql.expr.ExprVar;
import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.vocabulary.RDF;
public class CandidateViewSelectionTests {
//@Test
public void creationTest() throws RecognitionException, SQLException, IOException {
DataSource dataSource = SparqlifyUtils.createTestDatabase();
Connection conn = dataSource.getConnection();
// typeAliases for the H2 datatype
Map<String, String> typeAlias = MapReader.readFile(new File("src/main/resources/type-map.h2.tsv"));
ViewDefinitionFactory vdFactory = SparqlifyUtils.createViewDefinitionFactory(conn, typeAlias);
String testView = "Create View testview As Construct { ?s a ?t } With ?s = uri(?ID) ?t = uri(?NAME) From person";
ViewDefinition coreVd = vdFactory.create(testView);
System.out.println("VD: " + coreVd);
//TypeSystem typeSystem = SparqlifyCoreInit.createDefaultDatatypeSystem();
ExprRewriteSystem ers = SparqlifyUtils.createDefaultExprRewriteSystem();
//OpMappingRewriter opMappingRewriter = SparqlifyUtils.createDefaultOpMappingRewriter(typeSystem);
MappingOps mappingOps = SparqlifyUtils.createDefaultMappingOps(ers);
CandidateViewSelector<ViewDefinition> system = new CandidateViewSelectorSparqlify(mappingOps, new ViewDefinitionNormalizerImpl());
system.addView(coreVd);
String queryString = "Select * { ?s ?p ?o }";
Query query = new Query();
QueryFactory.parse(query, queryString, "http://ex.org/", Syntax.syntaxSPARQL_11);
Op op = system.getApplicableViews(query);
System.out.println(op);
}
//@Test
public void test2() throws Exception {
SparqlifyCoreInit.initSparqlifyFunctions();
TypeSystem datatypeSystem = SparqlifyCoreInit.createDefaultDatatypeSystem();
DataSource dataSource = SparqlifyUtils.createTestDatabase();
Connection conn = dataSource.getConnection();
// typeAliases for the H2 datatype
Map<String, String> typeAlias = MapReader.readFile(new File("src/main/resources/type-map.h2.tsv"));
ViewDefinitionFactory vdf = SparqlifyUtils.createViewDefinitionFactory(conn, typeAlias);
ViewDefinition personView = vdf.create("Prefix ex:<http://ex.org/> Create View person As Construct { ?s a ex:Person ; ex:name ?t } With ?s = uri(concat('http://ex.org/person/', ?ID) ?t = plainLiteral(?NAME) From person");
ViewDefinition deptView = vdf.create("Prefix ex:<http://ex.org/> Create View dept As Construct { ?s a ex:Department ; ex:name ?t } With ?s = uri(concat('http://ex.org/dept/', ?ID) ?t = plainLiteral(?NAME) From dept");
ViewDefinition personToDeptView = vdf.create("Prefix ex:<http://ex.org/> Create View person_to_dept As Construct { ?p ex:worksIn ?d } With ?p = uri(concat('http://ex.org/person/', ?PERSON_ID) ?d = uri(concat('http://ex.org/dept/', ?DEPT_ID) From person_to_dept");
ExprRewriteSystem ers = SparqlifyUtils.createDefaultExprRewriteSystem();
MappingOps mappingOps = SparqlifyUtils.createDefaultMappingOps(ers);
CandidateViewSelectorSparqlify candidateSelector = new CandidateViewSelectorSparqlify(mappingOps, new ViewDefinitionNormalizerImpl());
candidateSelector.addView(personView);
candidateSelector.addView(deptView);
candidateSelector.addView(personToDeptView);
Var g = Var.alloc("g");
Var s = Var.alloc("s");
Var p = Var.alloc("p");
Var o = Var.alloc("o");
Node gv = Quad.defaultGraphNodeGenerated; //Quad.defaultGraphIRI; //urn:x-arq:DefaultGraphNode
Node sv = NodeFactory.createURI("http://ex.org/person/5");
Node pv = RDF.type.asNode();
Node ov = NodeFactory.createURI("http://ex.org/Person");
Quad quad = new Quad(g, s, p, o);
RestrictionManagerImpl r = new RestrictionManagerImpl();
r.stateExpr(new E_Equals(new ExprVar(g), NodeValue.makeNode(gv)));
r.stateExpr(new E_Equals(new ExprVar(s), NodeValue.makeNode(sv)));
r.stateExpr(new E_Equals(new ExprVar(p), NodeValue.makeNode(pv)));
r.stateExpr(new E_Equals(new ExprVar(o), NodeValue.makeNode(ov)));
/*
r.stateNode(g, gv);
r.stateNode(s, sv);
r.stateNode(p, pv);
r.stateNode(o, ov);
*/
Set<ViewQuad<ViewDefinition>> viewQuads = candidateSelector.findCandidates(quad, r);
// If the constraints are working, there should be only 1 candidate
System.out.println("# View quads: " + viewQuads.size());
System.out.println("View quads: " + viewQuads);
/*
Query query = QueryFactory.create("Prefix ex:<http://ex.org/> Select * { <http://ex.org/person/123> a ex:Person }");
Op op = candidateSelector.getApplicableViews(query);
System.out.println(op);
System.out.println(personView);
Collection<ViewDefinition> viewDefs= Arrays.asList(personView, deptView, personToDeptView);
*/
}
}