blob: 5fe99ab6c7b52ee782adcafc80218fa4290e7e7e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.jena.query;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import org.apache.jena.atlas.json.JsonArray;
import org.apache.jena.atlas.json.JsonObject;
import org.apache.jena.graph.Triple;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.util.Context;
/** A interface for a single execution of a query. */
public interface QueryExecution extends AutoCloseable
{
public static QueryExecutionBuilder create() { return QueryExecutionBuilder.create(); }
/** Set the initial association of variables and values.
* May not be supported by all QueryExecution implementations.
* @param binding
*/
public void setInitialBinding(QuerySolution binding) ;
/** Set the initial association of variables and values.
* May not be supported by all QueryExecution implementations.
* @param binding
*/
void setInitialBinding(Binding binding);
/**
* The dataset against which the query will execute.
* May be null, implying it is expected that the query itself
* has a dataset description.
*/
public Dataset getDataset() ;
/** The properties associated with a query execution -
* implementation specific parameters This includes
* Java objects (so it is not an RDF graph).
* Keys should be URIs as strings.
* May be null (this implementation does not provide any configuration).
*/
public Context getContext() ;
/** The query associated with a query execution.
* May be null (QueryExecution may have been created by other means)
*/
public Query getQuery() ;
/**
* Execute a SELECT query
* <p>
* <strong>Important:</strong> The name of this method is somewhat of a misnomer in that
* depending on the underlying implementation this typically does not execute the
* SELECT query but rather answers a wrapper over an internal data structure that can be
* used to answer the query. In essence calling this method only returns a plan for
* executing this query which only gets evaluated when you actually start iterating
* over the results.
* </p>
* */
public ResultSet execSelect();
/** Execute a CONSTRUCT query */
public Model execConstruct();
/** Execute a CONSTRUCT query, putting the statements into 'model'.
* @return Model The model argument for cascaded code.
*/
public Model execConstruct(Model model);
/**
* Execute a CONSTRUCT query, returning the results as an iterator of {@link Triple}.
* <p>
* <b>Caution:</b> This method may return duplicate Triples. This method may be useful if you only
* need the results for stream processing, as it can avoid having to place the results in a Model.
* </p>
* <p>
* <strong>Important:</strong> The name of this method is somewhat of a misnomer in that
* depending on the underlying implementation this typically does not execute the
* CONSTRUCT query but rather answers a wrapper over an internal data structure that can be
* used to answer the query. In essence calling this method only returns a plan for
* executing this query which only gets evaluated when you actually start iterating
* over the results.
* </p>
* @return An iterator of Triple objects (possibly containing duplicates) generated
* by applying the CONSTRUCT template of the query to the bindings in the WHERE clause.
*/
public Iterator<Triple> execConstructTriples();
/**
* Execute a CONSTRUCT query, returning the results as an iterator of {@link Quad}.
* <p>
* <b>Caution:</b> This method may return duplicate Quads. This method may be useful if you only
* need the results for stream processing, as it can avoid having to place the results in a Model.
* </p>
* @return An iterator of Quad objects (possibly containing duplicates) generated
* by applying the CONSTRUCT template of the query to the bindings in the WHERE clause.
* </p>
* <p>
* See {@link #execConstructTriples} for usage and features.
*/
public Iterator<Quad> execConstructQuads();
/** Execute a CONSTRUCT query, putting the statements into 'dataset'.
* This maybe an extended syntax query (if supported).
*/
public Dataset execConstructDataset();
/** Execute a CONSTRUCT query, putting the statements into 'dataset'.
* This maybe an extended syntax query (if supported).
*/
public Dataset execConstructDataset(Dataset dataset);
/** Execute a DESCRIBE query */
public Model execDescribe();
/** Execute a DESCRIBE query, putting the statements into 'model'.
* @return Model The model argument for cascaded code.
*/
public Model execDescribe(Model model);
/**
* Execute a DESCRIBE query, returning the results as an iterator of {@link Triple}.
* <p>
* <b>Caution:</b> This method may return duplicate Triples. This method may be useful if you only
* need the results for stream processing, as it can avoid having to place the results in a Model.
* </p>
* <p>
* <strong>Important:</strong> The name of this method is somewhat of a misnomer in that
* depending on the underlying implementation this typically does not execute the
* DESCRIBE query but rather answers a wrapper over an internal data structure that can be
* used to answer the query. In essence calling this method only returns a plan for
* executing this query which only gets evaluated when you actually start iterating
* over the results.
* </p>
* @return An iterator of Triple objects (possibly containing duplicates) generated as the output of the DESCRIBE query.
*/
public Iterator<Triple> execDescribeTriples();
/** Execute an ASK query */
public boolean execAsk();
/** Execute a JSON query and return a json array */
public JsonArray execJson() ;
/** Execute a JSON query and return an interator */
public Iterator<JsonObject> execJsonItems() ;
/** Stop in mid execution.
* This method can be called in parallel with other methods on the
* QueryExecution object.
* There is no guarantee that the concrete implementation actual
* will stop or that it will do so immediately.
* No operations on the query execution or any associated
* result set are permitted after this call and may cause exceptions to be thrown.
*/
public void abort();
/** Close the query execution and stop query evaluation as soon as convenient.
* QueryExecution objects, and a {@link ResultSet} from {@link #execSelect},
* can not be used once the QueryExecution is closed.
* Model results from {@link #execConstruct} and {@link #execDescribe}
* are still valid.
* It is important to close query execution objects in order to release
* resources such as working memory and to stop the query execution.
* Some storage subsystems require explicit ends of operations and this
* operation will cause those to be called where necessary.
* No operations on the query execution or any associated
* result set are permitted after this call.
*/
@Override
public void close();
/**
* Answer whether this QueryExecution object has been closed or not.
* @return boolean
*/
public boolean isClosed();
/** Set a timeout on the query execution.
* Processing will be aborted after the timeout (which starts when the appropriate exec call is made).
* Not all query execution systems support timeouts.
* A timeout of less than zero means no timeout.
*/
public void setTimeout(long timeout, TimeUnit timeoutUnits) ;
/** Set time, in milliseconds
* @see #setTimeout(long, TimeUnit)
*/
public void setTimeout(long timeout) ;
/** Set timeouts on the query execution; the first timeout refers to time to first result,
* the second refers to overall query execution after the first result.
* Processing will be aborted if a timeout expires.
* Not all query execution systems support timeouts.
* A timeout of less than zero means no timeout; this can be used for timeout1 or timeout2.
*/
public void setTimeout(long timeout1, TimeUnit timeUnit1, long timeout2, TimeUnit timeUnit2) ;
/** Set time, in milliseconds
* @see #setTimeout(long, TimeUnit, long, TimeUnit)
*/
public void setTimeout(long timeout1, long timeout2) ;
/** Return the first timeout (time to first result), in milliseconds: negative if unset */
public long getTimeout1() ;
/** Return the second timeout (overall query execution after first result), in milliseconds: negative if unset */
public long getTimeout2() ;
// /** Say whether this QueryExecution is useable or not.
// * An active execution is one that has not been closed, ended or aborted yet.
// * May not be supported or meaningful for all QueryExecution implementations.
// * aborted queries may not immediate show as no longer active.
// * This should not be called in parallel with other QueryExecution methods.
// */
// public boolean isActive() ;
}