package org.aksw.sparqlify.core.sparql; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.aksw.jena_sparql_api.views.RestrictedExpr; import org.aksw.sparqlify.core.ResultSetSparqlify; import org.apache.jena.graph.Node; import org.apache.jena.sparql.core.Var; import org.apache.jena.sparql.engine.binding.Binding; import com.google.common.collect.Iterators; import com.google.common.collect.Multimap; public class ResultSetFactory { /** * * @param conn * @param sqlQuery An SQL query to be sent to the database. null if empty result set. * @param sparqlVarMap * @param projectionVars The variables that should appear in the result set. If null, sparqlVarMap.keySet() is used. * @return * @throws SQLException */ public static ResultSetSparqlify create(Connection conn, Statement stmt, String sqlQuery, Multimap<Var, RestrictedExpr> sparqlVarMap, List<Var> projectionVars) throws SQLException { List<String> resultVars = new ArrayList<String>(); if(projectionVars == null) { projectionVars = new ArrayList<Var>(); for(Node var : sparqlVarMap.keySet()) { projectionVars.add((Var)var); } } for(Var var : projectionVars) { resultVars.add(var.getName()); } // TODO ONLY FOR USE WITH MYSQL - MAY HAVE UNDEFINED EFFECTS WITH OTHER DBSs // Enables streaming result sets /* stmt.setFetchSize(Integer.MIN_VALUE); */ Iterator<Binding> it; if(sqlQuery == null) { it = Iterators.emptyIterator(); } else { ResultSet rs = stmt.executeQuery(sqlQuery); // Note: We commit AFTER closing the result set // Result sets may not be stable after commit it = new IteratorResultSetSparqlifyBinding(conn, rs, sparqlVarMap); } ResultSetSparqlify result = new ResultSetSparqlify(it, resultVars, 0); return result; } }