package org.aksw.sparqlify.core.sparql; import java.sql.Connection; import java.sql.SQLException; import java.util.concurrent.TimeUnit; import org.aksw.jena_sparql_api.core.QueryExecutionBaseSelect; import org.aksw.jena_sparql_api.core.QueryExecutionFactory; import org.aksw.jena_sparql_api.core.QueryExecutionTimeoutHelper; import org.aksw.jena_sparql_api.core.ResultSetCloseable; import org.aksw.sparqlify.core.interfaces.SparqlSqlStringRewriter; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // TODO Replace with class from AKSW commons /* class QueryExecutionAdapter implements QueryExecution { @Override public void setFileManager(FileManager fm) { throw new NotImplementedException(); } @Override public void setInitialBinding(QuerySolution binding) { throw new NotImplementedException(); } @Override public Dataset getDataset() { throw new NotImplementedException(); } @Override public Context getContext() { throw new NotImplementedException(); } @Override public ResultSet execSelect() { throw new NotImplementedException(); } @Override public Model execConstruct() { throw new NotImplementedException(); } @Override public Model execConstruct(Model model) { throw new NotImplementedException(); } @Override public Model execDescribe() { throw new NotImplementedException(); } @Override public Model execDescribe(Model model) { throw new NotImplementedException(); } @Override public boolean execAsk() { throw new NotImplementedException(); } @Override public void abort() { } @Override public void close() { } @Override public void setTimeout(long timeout, TimeUnit timeoutUnits) { throw new NotImplementedException(); } @Override public void setTimeout(long timeout) { throw new NotImplementedException(); } @Override public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) { throw new NotImplementedException(); } @Override public void setTimeout(long timeout1, long timeout2) { throw new NotImplementedException(); } @Override public Query getQuery() { throw new NotImplementedException(); } } */ /* public class QueryExecutionTimeout extends QueryExecutionAdapter { protected QueryExecutionTimeoutHelper timeoutHelper = new QueryExecutionTimeoutHelper(this); @Override public void setTimeout(long timeout, TimeUnit timeoutUnits) { timeoutHelper.setTimeout(timeout, timeoutUnits); } @Override public void setTimeout(long timeout) { timeoutHelper.setTimeout(timeout); } @Override public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) { timeoutHelper.setTimeout(timeout1, timeUnit1, timeout2, timeUnit2); } @Override public void setTimeout(long timeout1, long timeout2) { timeoutHelper.setTimeout(timeout1, timeout2); } } */ public class QueryExecutionSparqlify extends QueryExecutionBaseSelect { public static Logger logger = LoggerFactory.getLogger(QueryExecutionSparqlify.class); private SparqlSqlStringRewriter rewriter; private Connection conn; private boolean closeConnWhenDone; //private Query query; // subFactory is needed for DESCRIBE queries right now public QueryExecutionSparqlify(SparqlSqlStringRewriter rewriter, Connection conn, boolean closeConnWhenDone, Query query, QueryExecutionFactory subFactory) { super(query, subFactory); this.rewriter = rewriter; this.conn = conn; this.closeConnWhenDone = closeConnWhenDone; //this.query = query; } /* @Override public Object getId() { // Transient id means, that after recreation of the object with the same // configuration, the id might be different. // Caches can be cleared once such object gets destroyed. // TODO Think about how to implement this properly return "transient-id-" + this.hashCode(); }*/ @Override protected QueryExecution executeCoreSelectX(Query dummy) { // TODO This object hardly closes the connection again.... QueryExecution result = new QueryExecutionSelect(rewriter, conn, dummy, false); return result; } @Override protected ResultSetCloseable executeCoreSelect(Query query) { timeoutHelper.startExecutionTimer(); try { ResultSetCloseable result = super.executeCoreSelect(query); return result; } finally { timeoutHelper.stopExecutionTimer(); } } protected QueryExecutionTimeoutHelper timeoutHelper = new QueryExecutionTimeoutHelper(this); @Override public void setTimeout(long timeout, TimeUnit timeoutUnits) { timeoutHelper.setTimeout(timeout, timeoutUnits); } @Override public void setTimeout(long timeout) { timeoutHelper.setTimeout(timeout); } @Override public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) { timeoutHelper.setTimeout(timeout1, timeUnit1, timeout2, timeUnit2); } @Override public void setTimeout(long timeout1, long timeout2) { timeoutHelper.setTimeout(timeout1, timeout2); } @Override public void close() { super.close(); if(this.closeConnWhenDone) { try { logger.trace("Closed connection: [" + conn + "]"); conn.close(); } catch (SQLException e) { throw new RuntimeException(e); } } } // /* protected ResultSet executeSelectImpl(Query query) throws SQLException { /* if (!query.isSelectType()) { throw new RuntimeException("SELECT query expected. Got: [" + query.toString() + "]"); } * / Op view = system.getApplicableViews(query); // ViewRewriter sqlRewriter = new ViewRewriter(); SqlNode sqlNode = sqlRewriter.rewriteMM(view); System.out.println("Final sparql var mapping = " + sqlNode.getSparqlVarToExprs()); SqlGenerator sqlGenerator = new SqlGenerator(); String sqlQuery = sqlGenerator.generateMM(sqlNode); System.out.println(sqlQuery); double cost = RdfViewDatabase.getCostPostgres(conn, sqlQuery); if (cost > 4000) { System.out.println("Aborted due to high query cost: " + cost); return null; } System.out.println("Query cost ok (" + cost + ")"); ResultSet rs = ResultSetFactory.create(conn, sqlQuery, sqlNode.getSparqlVarToExprs()); return rs; } //@Override public void abort() { } */ }