/*
* Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.obidea.semantika.queryanswer;
import com.obidea.semantika.app.ApplicationManager;
import com.obidea.semantika.exception.SemantikaException;
import com.obidea.semantika.queryanswer.exception.QueryAnswerException;
import com.obidea.semantika.queryanswer.internal.ConnectionManager;
import com.obidea.semantika.queryanswer.internal.ConnectionManagerException;
import com.obidea.semantika.queryanswer.internal.DatabaseSession;
import com.obidea.semantika.queryanswer.internal.QueryModifiers;
import com.obidea.semantika.queryanswer.internal.QueryPlan;
import com.obidea.semantika.queryanswer.internal.QueryTranslationException;
import com.obidea.semantika.queryanswer.internal.SelectQuery;
import com.obidea.semantika.queryanswer.internal.UserStatementSettings;
import com.obidea.semantika.queryanswer.result.IQueryResult;
public class SparqlQueryEngine extends AbstractQueryEngine
{
private ConnectionManager mConnectionManager;
private DatabaseSession mSession = new DatabaseSession(this);
public SparqlQueryEngine(final ApplicationManager manager)
{
super(manager);
}
@Override
public void start() throws QueryEngineException
{
LOG.debug("Starting query engine."); //$NON-NLS-1$
mConnectionManager = new ConnectionManager(mSession);
}
@Override
public void stop() throws QueryEngineException
{
try {
throwExceptionIfNull();
LOG.debug("Stopping query engine."); //$NON-NLS-1$
mConnectionManager.close();
}
catch (ConnectionManagerException e) {
throw new QueryEngineException(e);
}
catch (SemantikaException e) {
throw new QueryEngineException(e);
}
}
@Override
public boolean isStarted()
{
try {
throwExceptionIfNull();
return mConnectionManager.isClosed() ? false : true;
}
catch (SemantikaException e) {
return false;
}
}
@Override
public ConnectionManager getConnectionManager()
{
return mConnectionManager;
}
public SelectQuery createQuery(String sparql) throws QueryAnswerException
{
return new SelectQuery(sparql, this, getQueryPlan(sparql).getQueryMetadata());
}
@Override
public IQueryResult evaluate(String sparql) throws QueryAnswerException
{
return createQuery(sparql).evaluate();
}
@Override
public IQueryResult evaluate(String sparql, QueryModifiers modifiers, UserStatementSettings userSettings)
throws QueryAnswerException
{
QueryPlan plan = getQueryPlan(sparql);
IQueryResult results = plan.evaluateQuery(modifiers, userSettings);
return results;
}
@Override
public String translate(String sparql) throws QueryAnswerException
{
QueryPlan plan = getQueryPlan(sparql);
return plan.getSqlString();
}
/*
* Private utility methods
*/
private QueryPlan getQueryPlan(String queryString) throws QueryTranslationException
{
return mSession.getQueryPlanCache().getQueryPlan(queryString);
}
private void throwExceptionIfNull() throws QueryEngineException
{
if (mConnectionManager == null) {
throw new QueryEngineException("Call start() first to initialize query engine"); //$NON-NLS-1$
}
}
}