package edu.kit.aifb.cumulus.cli;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.sail.SailRepositoryConnection;
import edu.kit.aifb.cumulus.cli.log.MessageCatalog;
import edu.kit.aifb.cumulus.store.Store;
import edu.kit.aifb.cumulus.store.sesame.CumulusRDFSail;
/**
*
* Executes a SPARQL query and prints out all results.
*
* @author Andreas Wagner
* @since 1.0
*/
public class Query extends Command {
@Override
Options getOptions() {
final Option inputO = new Option("q", "sparql query string");
inputO.setRequired(true);
inputO.setArgs(1);
final Option storageO = new Option("s", "storage layout to use (triple|quad)");
storageO.setArgs(1);
final Option helpO = new Option("h", "print help");
final Options options = new Options();
options.addOption(inputO);
options.addOption(storageO);
options.addOption(helpO);
return options;
}
@Override
public void doExecute(final CommandLine commandLine, final Store store) {
final String query = commandLine.getOptionValue("q");
SailRepositoryConnection con = null;
SailRepository repo = null;
try {
final CumulusRDFSail sail = new CumulusRDFSail(store);
sail.initialize();
repo = new SailRepository(sail);
con = repo.getConnection();
org.openrdf.query.Query parsed_query = con.prepareQuery(QueryLanguage.SPARQL, query);
int i = 0;
if (parsed_query instanceof BooleanQuery) {
_log.info(MessageCatalog._00019_PARSED_ASK_QUERY, parsed_query);
_log.info(MessageCatalog._00020_PARSED_ASK_ANSWER, ((BooleanQuery) parsed_query).evaluate());
} else if (parsed_query instanceof TupleQuery) {
_log.info(MessageCatalog._00021_PARSED_SELECT_ANSWER);
for (final TupleQueryResult result = ((TupleQuery) parsed_query).evaluate(); result.hasNext(); i++) {
_log.info(i + ": " + result.next());
}
} else if (parsed_query instanceof GraphQuery) {
_log.info(MessageCatalog._00022_CONSTRUCT_ASK_QUERY, parsed_query);
_log.info(MessageCatalog._00023_CONSTRUCT_ASK_ANSWER);
for (final GraphQueryResult result = ((GraphQuery) parsed_query).evaluate(); result.hasNext(); i++) {
_log.info(i + ": " + result.next());
}
}
} catch (final Exception exception) {
_log.error(MessageCatalog._00026_NWS_SYSTEM_INTERNAL_FAILURE, exception);
return;
} finally {
if (con != null) {
// CHECKSTYLE:OFF
try { con.close(); } catch (Exception ignore) {};
// CHECKSTYLE: ON
}
if (repo != null) {
// CHECKSTYLE:OFF
try { repo.shutDown(); } catch (Exception ignore) {};
// CHECKSTYLE: ON
}
}
}
}