/* * 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.internal; import java.util.List; import org.openrdf.query.MalformedQueryException; import org.openrdf.query.QueryLanguage; import org.openrdf.query.algebra.Slice; import org.openrdf.query.algebra.TupleExpr; import org.openrdf.query.parser.ParsedQuery; import org.openrdf.query.parser.QueryParser; import org.openrdf.query.parser.QueryParserUtil; import com.obidea.semantika.queryanswer.SparqlQueryEngine; import com.obidea.semantika.queryanswer.exception.QueryAnswerException; import com.obidea.semantika.queryanswer.exception.QueryParserException; import com.obidea.semantika.queryanswer.result.IQueryResult; import com.obidea.semantika.queryanswer.result.IQueryResultHandler; import com.obidea.semantika.queryanswer.result.ListResultHandler; import com.obidea.semantika.queryanswer.result.QueryResultHandlerException; public class SelectQuery { private static QueryParser sQueryValidator = QueryParserUtil.createParser(QueryLanguage.SPARQL); private QueryModifiers mQueryModifiers = new QueryModifiers(); private UserStatementSettings mUserStatementSettings = new UserStatementSettings(); private String mSparqlString; private SparqlQueryEngine mQueryEngine; private QueryMetadata mQueryMetadata; public SelectQuery(String sparql, final SparqlQueryEngine engine, final QueryMetadata metadata) throws QueryParserException { validateQuery(sparql); mSparqlString = sparql; mQueryEngine = engine; mQueryMetadata = metadata; } private void validateQuery(String sparqlString) throws QueryParserException { try { ParsedQuery query = sQueryValidator.parseQuery(sparqlString, null); // base URI is null /* * If the validation ok, do a quick scan on the query object to collect * any query modifers, if any. */ addModifiersIfExist(query); } catch (MalformedQueryException e) { throw new QueryParserException(e.getMessage()); } } private void addModifiersIfExist(ParsedQuery query) { TupleExpr expr = query.getTupleExpr(); if (expr instanceof Slice) { Slice sliceExpr = (Slice) expr; mQueryModifiers.setLimit((int) sliceExpr.getLimit()); mQueryModifiers.setOffset((int) sliceExpr.getOffset()); } } public QueryMetadata getProjection() { return mQueryMetadata; } public String getQueryString() { return mSparqlString; } public QueryModifiers getModifiers() { return mQueryModifiers; } public UserStatementSettings getTransactionSettings() { return mUserStatementSettings; } public SelectQuery setMaxResults(int limit) { mQueryModifiers.setLimit(limit); return this; } public SelectQuery setFirstResult(int offset) { mQueryModifiers.setOffset(offset); return this; } public SelectQuery setAscendingOrder(String column) { mQueryModifiers.setAscendingOrder(column); return this; } public SelectQuery setDescendingOrder(String column) { mQueryModifiers.setDescendingOrder(column); return this; } public void setFetchSize(int fetchSize) { mUserStatementSettings.setFetchSize(fetchSize); } public void setTimeout(int timeout) { mUserStatementSettings.setQueryTimeout(timeout); } public void setMaxRows(int maxRows) { mUserStatementSettings.setMaxRows(maxRows); } public IQueryResult evaluate() throws QueryAnswerException { return mQueryEngine.evaluate(getQueryString(), getModifiers(), getTransactionSettings()); } public void evaluate(IQueryResultHandler handler) throws QueryAnswerException { try { IQueryResult result = evaluate(); handler.start(result.getSelectNames()); while (result.next()) { handler.handleResultFragment(result.getValueArray()); } handler.stop(); } catch (QueryResultHandlerException e) { throw new QueryEvaluationException("Exception occured when handling query results", e); //$NON-NLS-1$ } } public List<Object[]> list() throws QueryAnswerException { ListResultHandler handler = new ListResultHandler(); evaluate(handler); return handler.getListResult(); } }