/*
* Copyright (c) 1998-2009, The University of Sheffield.
*
* This file is part of GATE (see http://gate.ac.uk/), and is free
* software, licenced under the GNU Library General Public License,
* Version 2, June 1991 (in the distribution as file licence.html,
* and also available at http://gate.ac.uk/gate/licence.html).
*
* Johann Petrak 2009-08-13
*
* $Id: UtilBooleanQuery.java 11598 2009-10-13 13:44:17Z johann_p $
*/
package gate.creole.ontology.impl.sesame;
import gate.creole.ontology.GateOntologyException;
import gate.creole.ontology.LiteralOrONodeID;
import gate.creole.ontology.OntologyBooleanQuery;
import gate.creole.ontology.OConstants;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.openrdf.model.Value;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.repository.RepositoryConnection;
/**
* A class representing a Sesame ASK Query. This class makes it easy to
* use a boolean query and reuse a query with different variable
* bindings.
* <p>
* The following steps should be carried out when using this class:
* <ol>
* <li>Create an object and pass on the repository connection, query string,
* and query language constant
* <li>Set any variables for the query using {@link #setBinding} one or more times
* <li>Evaluate the query using {@link evaluate} and retrieve the boolean result.
* <li>To reuse the query, repeat from step 2
* </ol>
*
* @author Johann Petrak
*/
public class UtilBooleanQuery implements OntologyBooleanQuery {
private RepositoryConnection mRepositoryConnection;
private String mQuery;
private BooleanQuery mBooleanQuery;
private QueryLanguage mLang = QueryLanguage.SERQL;
private Logger logger;
private boolean mIsPrepared = false;
public UtilBooleanQuery(RepositoryConnection repositoryConnection,
String query, OConstants.QueryLanguage lang) {
logger = Logger.getLogger(this.getClass().getName());
mRepositoryConnection = repositoryConnection;
logger.debug("Creating query: " + query);
mQuery = query;
if(lang == OConstants.QueryLanguage.SPARQL) {
mLang = QueryLanguage.SPARQL;
} else if(lang == OConstants.QueryLanguage.SERQL) {
mLang = QueryLanguage.SERQL;
} else {
throw new GateOntologyException("Query language not supported: "+lang);
}
prepare();
}
public void prepare() {
try {
mBooleanQuery = mRepositoryConnection.prepareBooleanQuery(mLang, mQuery);
mIsPrepared = true;
} catch (Exception e) {
throw new GateOntologyException("Cannot prepare boolean query: "+mQuery, e);
}
}
/**
*
* @param name
* @param value
*/
public void setBinding(String name, LiteralOrONodeID value) {
mBooleanQuery.setBinding(name, UtilConvert.toSesameValue(value));
}
public void setBinding(String name, Value value) {
mBooleanQuery.setBinding(name, value);
}
/**
*
* @return
*/
public boolean evaluate() {
boolean ret;
if(!mIsPrepared) {
prepare();
}
try {
ret = mBooleanQuery.evaluate();
} catch (Exception e) {
throw new GateOntologyException("Cannot evaluate query: "+mQuery, e);
}
return ret;
}
}