package exp.cornercases;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import javax.sql.DataSource;
import org.aksw.commons.util.MapReader;
import org.aksw.commons.util.jdbc.Schema;
import org.aksw.jena_sparql_api.core.QueryExecutionFactory;
import org.aksw.jena_sparql_api.views.CandidateViewSelector;
import org.aksw.sparqlify.core.algorithms.CandidateViewSelectorSparqlify;
import org.aksw.sparqlify.core.algorithms.OpMappingRewriterImpl;
import org.aksw.sparqlify.core.algorithms.SqlTranslatorImpl;
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.core.interfaces.OpMappingRewriter;
import org.aksw.sparqlify.core.interfaces.SparqlSqlStringRewriter;
import org.aksw.sparqlify.core.interfaces.SqlExprSerializer;
import org.aksw.sparqlify.core.interfaces.SqlTranslator;
import org.aksw.sparqlify.core.sparql.QueryExecutionFactorySparqlifyDs;
import org.aksw.sparqlify.core.sql.expr.serialization.SqlFunctionSerializer;
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.query.QueryExecution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MappingOpsImplTest {
private static final Logger logger = LoggerFactory.getLogger(MappingOpsImplTest.class);
//@Test
public void creationTest() throws RecognitionException, SQLException, IOException {
SparqlifyCoreInit.initSparqlifyFunctions();
//TypeSystem typeSystem = SparqlifyCoreInit.createDefaultDatatypeSystem();
ExprRewriteSystem ers = SparqlifyUtils.createDefaultExprRewriteSystem();
TypeSystem typeSystem = ers.getTypeSystem();
SqlTranslator sqlTranslator = new SqlTranslatorImpl(typeSystem);
DataSource dataSource = SparqlifyUtils.createTestDatabase();
Connection conn = dataSource.getConnection();
Schema databaseSchema = Schema.create(conn);
// typeAliases for the H2 datatype
Map<String, String> typeAlias = MapReader.readFile(new File("src/main/resources/type-map.h2.tsv"));
/* Some important interfaces for quick access */
SqlExprSerializer serExpr = null;
SqlFunctionSerializer serFn = null;
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");
ViewDefinition personAgeView = vdf.create("Prefix ex:<http://ex.org/> Prefix xsd:<http://www.w3.org/2001/XMLSchema#> Create View person As Construct { ?s ex:age ?a } With ?s = uri(concat('http://ex.org/person/', ?ID) ?a = typedLiteral(?AGE, xsd:int) From person");
ViewDefinition personAndAgeView = vdf.create("Prefix ex:<http://ex.org/> Create View person As Construct { ?s a ex:Person ; ex:name ?t ; ex:age ?a } With ?s = uri(concat('http://ex.org/person/', ?ID) ?t = plainLiteral(?NAME) ?a = typedLiteral(?AGE, xsd:int) From person");
//OpMappingRewriter opMappingRewriter = SparqlifyUtils.createDefaultOpMappingRewriter(typeSystem);
MappingOps mappingOps = SparqlifyUtils.createDefaultMappingOps(ers);
CandidateViewSelector<ViewDefinition> candidateViewSelector = new CandidateViewSelectorSparqlify(mappingOps, new ViewDefinitionNormalizerImpl());
//candidateViewSelector.addView(personView);
candidateViewSelector.addView(deptView);
//candidateViewSelector.addView(personToDeptView);
//candidateViewSelector.addView(personAgeView);
candidateViewSelector.addView(personAndAgeView);
/*
* A test with (in)equalities in filter conditions of the query
*/
// ExprEvaluator exprTransformer = SqlTranslationUtils.createDefaultEvaluator();
//
//
// Expr expr = ExprUtils.parse("concat('http://ex.org/dept/', ?DEPT_ID) > 21");
// Expr transExpr = exprTransformer.eval(expr, null);
//
// System.out.println(transExpr);
//
// Expr expr = ExprUtils.parse("<http://aksw.org/sparqlify/uri>(concat('foo', 'bar', ?v)) > <http://aksw.org/sparqlify/uri>('foobarx')");
// Expr transExpr = exprTransformer.eval(expr, null);
//
// System.out.println(transExpr);
//
//
// Map<String, TypeToken> typeMap = new HashMap<String, TypeToken>();
// typeMap.put("DEPT_ID", TypeToken.Int);
// SqlExpr sqlExpr = sqlTranslator.translate(expr, null, typeMap);
//
// System.out.println(sqlExpr);
//
//
//
// //Expr transExpr = SqlTranslationUtils.optimizeOpConcat((ExprFunction2)expr);
//
// if(true) {
// System.exit(1);
// }
//
// Mapping m1 = personView.getMapping();
//
//
// VarBinding binding = new VarBinding();
// ViewInstance vi = new ViewInstance(personView, binding);
//
// //DatatypeAssigner da = DatatypeAssignerMap.createDefaultAssignments(vd.getDatatypeSystem());
//
//
// ExprEvaluator exprTransformer = SqlTranslationUtils.createDefaultEvaluator();
// ExprDatatypeNorm exprNormalizer = new ExprDatatypeNorm(datatypeSystem);
//
//
// MappingOps ops = new MappingOpsImpl(exprTransformer, sqlTranslator, exprNormalizer);
//
// Mapping m2 = ops.join(m1, m1);
// Mapping m3 = ops.join(m2, m1);
// Mapping m4 = ops.union(Arrays.asList(m1, m3));
//
// Mapping mTest = m4;
// //System.out.println(m2);
//
// System.out.println(mTest.getSqlOp());
//
// SqlExprColumn x;
//
//// Context ctx = new InitialContext();
//// ctx.bind("jdbc/dsName", ds);
//
// ExprSqlBridge b;
//
// System.out.println(personView.getMapping().getSqlOp().getSchema());
//
// SqlOp block = SqlOpSelectBlockCollectorImpl._makeSelect(mTest.getSqlOp());
// System.out.println(block);
//
//
// SqlExprSerializer exprSerializer = new SqlExprSerializerPostgres();//null /*da*/);
//
// SqlOpSerializer serializer = new SqlOpSerializerImpl(exprSerializer);
//
// String sqlQueryString = serializer.serialize(block);
//SparqlSqlRewriter rewriter = new SparqlSqlRewriterImpl();
OpMappingRewriter opMappingRewriter = new OpMappingRewriterImpl(mappingOps);
SparqlSqlStringRewriter rewriter = null; //SparqlifyUtils.createTestRewriter(candidateViewSelector, opMappingRewriter, typeSystem, databaseSchema);
QueryExecutionFactory qef = new QueryExecutionFactorySparqlifyDs(rewriter, dataSource);
//System.out.println(sqlQueryString);
{
//QueryExecution qe = qef.createQueryExecution("Select ?s (Count(*) As ?c) { ?s ?p ?o . Filter(?s = <http://ex.org/person/1> || ?s = <http://ex.org/person/2>) . } Group By ?s");
//QueryExecution qe = qef.createQueryExecution("Select ?s ?p (Count(*) As ?c) { ?s ?p ?o . } Group By ?s ?p");
// Simple Optional Test
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?x ?y ?z . ?s ?p ?o . Optional { ?s ex:name ?l } . Filter(!(?o > 21)) }");
// Self Join elimination test
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s a ex:Person ; ex:name ?l ; ex:age ?a . }");
// Count query
QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select (Count(*) As ?c) { ?s a ex:Person ; ex:name ?l ; ex:age ?a . }");
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s a ?t . Optional { ?s ex:name ?n . } . ?s ex:age ?a . Filter(?a < 'foo') .}");
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s ex:age ?a . Filter(?a < 'foo') .}");
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s a ?t . Optional { ?s ex:name ?n . } . ?s ex:age ?a . Filter(?a > 20 || ?a < 'foo') .}");
// Simple Optional Test With Scope [not working]
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s ?p ?o . Optional { ?s ex:name ?l . Filter(!(?o > 21)) } }");
//QueryExecution qe = qef.createQueryExecution("Prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#> Select * { ?s rdfs:label ?l . ?s ?p ?o . Filter(!(?o > 21)) .} ");
// Filter Scope Test
//QueryExecution qe = qef.createQueryExecution("Prefix ex:<http://ex.org/> Select * { ?s a ?t . Optional { ?s ex:name ?l . Filter(?t = ex:Person) } . }");
ResultSet rs = qe.execSelect();
String rsStr = ResultSetFormatter.asText(rs);
System.out.println(rsStr);
}
// {
// QueryExecution qe = qef.createQueryExecution("Select * { ?s ?p ?o . Filter(?s = <http://ex.org/person/1> && ?s = <http://ex.org/person/2>) . }");
// ResultSet rs = qe.execSelect();
// String rsStr = ResultSetFormatter.asText(rs);
// System.out.println(rsStr);
// }
// {
// QueryExecution qe = qef.createQueryExecution("Select * { ?s ?p ?o . Filter(!(?s = <http://ex.org/person/1>)) . }");
// ResultSet rs = qe.execSelect();
// String rsStr = ResultSetFormatter.asText(rs);
// System.out.println(rsStr);
// }
//
//
// {
// QueryExecution qe = qef.createQueryExecution("Select * { ?s ?p ?o . ?x ?y ?z . Filter(?s = ?x)}");
// ResultSet rs = qe.execSelect();
// String rsStr = ResultSetFormatter.asText(rs);
// System.out.println(rsStr);
// }
//SqlSelectBlock x;
//ViewDefinition vd = new ViewDefinition(name, );
}
}