blob: f84e97b1304b93fe9b0297a464b1a2e12c2071b0 [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.List ;
import java.util.Objects;
import org.apache.http.client.HttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.jena.graph.Graph;
import org.apache.jena.graph.impl.WrappedGraph;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.DatasetGraphFactory;
import org.apache.jena.sparql.core.GraphView;
import org.apache.jena.sparql.engine.Plan ;
import org.apache.jena.sparql.engine.QueryEngineFactory ;
import org.apache.jena.sparql.engine.QueryEngineRegistry ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.engine.binding.BindingRoot ;
import org.apache.jena.sparql.engine.http.QueryEngineHTTP ;
import org.apache.jena.sparql.graph.GraphWrapper;
import org.apache.jena.sparql.syntax.Element ;
import org.apache.jena.sparql.util.Context ;
/** Place to make QueryExecution objects from Query objects or a string. */
public class QueryExecutionFactory
{
protected QueryExecutionFactory() {}
// ---------------- Query
/**
* Create a QueryExecution
*
* @param query Query
* @return QueryExecution
*/
static public QueryExecution create(Query query) {
checkArg(query) ;
return make(query) ;
}
/**
* Create a QueryExecution
*
* @param queryStr Query string
* @return QueryExecution
*/
static public QueryExecution create(String queryStr) {
checkArg(queryStr) ;
return create(makeQuery(queryStr)) ;
}
/**
* Create a QueryExecution
*
* @param queryStr Query string
* @param syntax Query syntax
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax syntax) {
checkArg(queryStr) ;
return create(makeQuery(queryStr, syntax)) ;
}
// ---------------- Query + Dataset
/**
* Create a QueryExecution to execute over the Dataset.
*
* @param query Query
* @param dataset Target of the query
* @return QueryExecution
*/
static public QueryExecution create(Query query, Dataset dataset) {
// checkArg(dataset) ; // Allow null
return make(query, dataset) ;
}
/**
* Create a QueryExecution to execute over the {@link DatasetGraph}.
*
* @param query Query
* @param datasetGraph Target of the query
* @return QueryExecution
*/
static public QueryExecution create(Query query, DatasetGraph datasetGraph) {
Objects.requireNonNull(query, "Query is null") ;
Objects.requireNonNull(datasetGraph, "DatasetGraph is null") ;
return make(query, datasetGraph) ;
}
/** Create a QueryExecution to execute over the Dataset.
*
* @param queryStr Query string
* @param dataset Target of the query
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Dataset dataset) {
checkArg(queryStr) ;
// checkArg(dataset) ; // Allow null
return make(makeQuery(queryStr), dataset) ;
}
/** Create a QueryExecution to execute over the Dataset.
*
* @param queryStr Query string
* @param syntax Query language
* @param dataset Target of the query
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax syntax, Dataset dataset) {
checkArg(queryStr) ;
// checkArg(dataset) ; // Allow null
return make(makeQuery(queryStr, syntax), dataset) ;
}
// ---------------- Query + Model
/** Create a QueryExecution to execute over the Model.
*
* @param query Query
* @param model Target of the query
* @return QueryExecution
*/
static public QueryExecution create(Query query, Model model) {
checkArg(query) ;
checkArg(model) ;
return make(query, model) ;
}
/** Create a QueryExecution to execute over the Model.
*
* @param queryStr Query string
* @param model Target of the query
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Model model) {
checkArg(queryStr) ;
checkArg(model) ;
return create(makeQuery(queryStr), model) ;
}
/** Create a QueryExecution to execute over the Model.
*
* @param queryStr Query string
* @param lang Query language
* @param model Target of the query
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax lang, Model model) {
checkArg(queryStr) ;
checkArg(model) ;
return create(makeQuery(queryStr, lang), model) ;
}
/** Create a QueryExecution to execute over the Model.
*
* @param query Query string
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(Query query, QuerySolution initialBinding) {
checkArg(query) ;
QueryExecution qe = make(query) ;
if ( initialBinding != null )
qe.setInitialBinding(initialBinding) ;
return qe ;
}
/** Create a QueryExecution given some initial values of variables.
*
* @param queryStr QueryString
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, QuerySolution initialBinding) {
checkArg(queryStr) ;
return create(makeQuery(queryStr), initialBinding) ;
}
/** Create a QueryExecution given some initial values of variables.
*
* @param queryStr QueryString
* @param syntax Query language syntax
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax syntax, QuerySolution initialBinding) {
checkArg(queryStr) ;
return create(makeQuery(queryStr, syntax), initialBinding) ;
}
/** Create a QueryExecution to execute over the Model,
* given some initial values of variables.
*
* @param query Query
* @param model Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(Query query, Model model, QuerySolution initialBinding) {
checkArg(model) ;
return create(query, DatasetFactory.wrap(model), initialBinding) ;
}
/** Create a QueryExecution to execute over the Model,
* given some initial values of variables.
*
* @param queryStr Query string
* @param model Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Model model, QuerySolution initialBinding) {
checkArg(queryStr) ;
checkArg(model) ;
return create(makeQuery(queryStr), model, initialBinding) ;
}
/** Create a QueryExecution to execute over the Model,
* given some initial values of variables.
*
* @param queryStr Query string
* @param syntax Query language
* @param model Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax syntax, Model model, QuerySolution initialBinding) {
checkArg(queryStr) ;
return create(makeQuery(queryStr, syntax), model, initialBinding) ;
}
/** Create a QueryExecution over a Dataset given some initial values of variables.
*
* @param query Query
* @param dataset Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(Query query, Dataset dataset, QuerySolution initialBinding) {
checkArg(query) ;
QueryExecution qe = make(query, dataset) ;
if ( initialBinding != null )
qe.setInitialBinding(initialBinding) ;
return qe ;
}
/** Create a QueryExecution over a Dataset given some initial values of variables.
*
* @param queryStr Query string
* @param dataset Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Dataset dataset, QuerySolution initialBinding) {
checkArg(queryStr) ;
return create(makeQuery(queryStr), dataset, initialBinding) ;
}
/** Create a QueryExecution over a Dataset given some initial values of variables.
*
* @param queryStr Query string
* @param dataset Target of the query
* @param initialBinding Any initial binding of variables
* @return QueryExecution
*/
static public QueryExecution create(String queryStr, Syntax syntax, Dataset dataset, QuerySolution initialBinding) {
checkArg(queryStr) ;
return create(makeQuery(queryStr, syntax), dataset, initialBinding) ;
}
// ---------------- Remote query execution
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query) {
return sparqlService(service, query, (HttpClient)null) ;
}
static public QueryExecution sparqlService(String service, String query, HttpClient client) {
return sparqlService(service, query, client, null);
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param client HTTP client
* @param httpContext HTTP Context
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
checkArg(query) ;
return sparqlService(service, QueryFactory.create(query), client) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraph URI of the default graph
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, String defaultGraph) {
return sparqlService(service, query, defaultGraph, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraph URI of the default graph
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, String defaultGraph, HttpClient client) {
return sparqlService(service, query, defaultGraph, client, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraph URI of the default graph
* @param client HTTP client
* @param httpContext HTTP Context
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, String defaultGraph, HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
// checkNotNull(defaultGraph, "IRI for default graph is null") ;
checkArg(query) ;
return sparqlService(service, QueryFactory.create(query), defaultGraph, client, httpContext) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, List<String> defaultGraphURIs, List<String> namedGraphURIs) {
return sparqlService(service, query, defaultGraphURIs, namedGraphURIs, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, List<String> defaultGraphURIs, List<String> namedGraphURIs,
HttpClient client) {
return sparqlService(service, query, defaultGraphURIs, namedGraphURIs, client, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query string to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @param client HTTP client
* @param httpContext HTTP Context
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, String query, List<String> defaultGraphURIs, List<String> namedGraphURIs,
HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
// checkNotNull(defaultGraphURIs, "List of default graph URIs is null") ;
// checkNotNull(namedGraphURIs, "List of named graph URIs is null") ;
checkArg(query) ;
return sparqlService(service, QueryFactory.create(query), defaultGraphURIs, namedGraphURIs, client, httpContext) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query) {
return sparqlService(service, query, (HttpClient)null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, HttpClient client) {
checkNotNull(service, "URL for service is null") ;
checkArg(query) ;
return createServiceRequest(service, query, client) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
checkArg(query) ;
return createServiceRequest(service, query, client, httpContext) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, List<String> defaultGraphURIs, List<String> namedGraphURIs) {
return sparqlService(service, query, defaultGraphURIs, namedGraphURIs, null, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, List<String> defaultGraphURIs, List<String> namedGraphURIs, HttpClient client) {
return sparqlService(service, query, defaultGraphURIs, namedGraphURIs, client, null);
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraphURIs List of URIs to make up the default graph
* @param namedGraphURIs List of URIs to make up the named graphs
* @param client HTTP client
* @param httpContext HTTP Context
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, List<String> defaultGraphURIs, List<String> namedGraphURIs,
HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
// checkNotNull(defaultGraphURIs, "List of default graph URIs is null") ;
// checkNotNull(namedGraphURIs, "List of named graph URIs is null") ;
checkArg(query) ;
QueryEngineHTTP qe = createServiceRequest(service, query, client) ;
if ( defaultGraphURIs != null )
qe.setDefaultGraphURIs(defaultGraphURIs) ;
if ( namedGraphURIs != null )
qe.setNamedGraphURIs(namedGraphURIs) ;
return qe ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraph URI of the default graph
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, String defaultGraph) {
return sparqlService(service, query, defaultGraph, null) ;
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraph URI of the default graph
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, String defaultGraph, HttpClient client) {
return sparqlService(service, query, defaultGraph, client, null);
}
/** Create a QueryExecution that will access a SPARQL service over HTTP
* @param service URL of the remote service
* @param query Query to execute
* @param defaultGraph URI of the default graph
* @param client HTTP client
* @return QueryExecution
*/
static public QueryExecution sparqlService(String service, Query query, String defaultGraph, HttpClient client, HttpContext httpContext) {
checkNotNull(service, "URL for service is null") ;
// checkNotNull(defaultGraph, "IRI for default graph is null") ;
checkArg(query) ;
QueryEngineHTTP qe = createServiceRequest(service, query, client, httpContext) ;
qe.addDefaultGraph(defaultGraph) ;
return qe ;
}
/** Create a service request for remote execution over HTTP. The returned class,
* {@link QueryEngineHTTP},
* allows various HTTP specific parameters to be set.
* @param service Endpoint URL
* @param query Query
* @return Remote Query Engine
*/
static public QueryEngineHTTP createServiceRequest(String service, Query query) {
return createServiceRequest(service, query, null) ;
}
/** Create a service request for remote execution over HTTP. The returned class,
* {@link QueryEngineHTTP},
* allows various HTTP specific parameters to be set.
* @param service Endpoint URL
* @param query Query
* @param client HTTP client
* @return Remote Query Engine
*/
static public QueryEngineHTTP createServiceRequest(String service, Query query, HttpClient client) {
QueryEngineHTTP qe = new QueryEngineHTTP(service, query, client) ;
return qe ;
}
/** Create a service request for remote execution over HTTP. The returned class,
* {@link QueryEngineHTTP},
* allows various HTTP specific parameters to be set.
* @param service Endpoint URL
* @param query Query
* @param client HTTP client
* @param httpContext HTTP Context
* @return Remote Query Engine
*/
static public QueryEngineHTTP createServiceRequest(String service, Query query, HttpClient client, HttpContext httpContext) {
QueryEngineHTTP qe = new QueryEngineHTTP(service, query, client, httpContext) ;
return qe ;
}
// -----------------
static public Plan createPlan(Query query, DatasetGraph dataset, Binding input, Context context) {
return makePlan(query, dataset, input, context) ;
}
public static Plan createPlan(Query query, DatasetGraph dataset, Binding input) {
return makePlan(query, dataset, input, null) ;
}
private static Query toQuery(Element pattern) {
Query query = QueryFactory.make() ;
query.setQueryPattern(pattern) ;
query.setQuerySelectType() ;
query.setQueryResultStar(true) ;
return query ;
}
private static Plan makePlan(Query query, DatasetGraph dataset, Binding input, Context context)
{
if ( context == null )
context = new Context(ARQ.getContext()) ;
if ( input == null )
input = BindingRoot.create() ;
QueryEngineFactory f = QueryEngineRegistry.get().find(query, dataset, context);
if ( f == null )
return null ;
return f.create(query, dataset, input, context) ;
}
// ---------------- Internal routines
static private Query makeQuery(String queryStr) {
return QueryFactory.create(queryStr) ;
}
static private Query makeQuery(String queryStr, Syntax syntax) {
return QueryFactory.create(queryStr, syntax) ;
}
static protected QueryExecution make(Query query) {
return QueryExecution.create().query(query).build();
}
protected static QueryExecution make(Query query, Model model) {
Graph graph = model.getGraph();
DatasetGraph dataset = DatasetGraphFactory.wrap(graph);
Graph g = unwrap(graph);
if ( g instanceof GraphView ) {
GraphView gv = (GraphView)g;
// Copy context of the storage dataset to the wrapper dataset.
dataset.getContext().putAll(gv.getDataset().getContext());
}
return make(query, dataset);
}
private static Graph unwrap(Graph graph) {
for(;;) {
if ( graph instanceof GraphWrapper )
graph = ((GraphWrapper)graph).get();
else if ( graph instanceof WrappedGraph )
graph = ((WrappedGraph)graph).getWrapped();
else return graph;
}
}
protected static QueryExecution make(Query query, Dataset dataset) {
DatasetGraph dsg = dataset==null ? null : dataset.asDatasetGraph();
return make(query, dsg);
}
protected static QueryExecution make(Query query, DatasetGraph datasetGraph)
{ return QueryExecution.create().query(query).dataset(datasetGraph).build(); }
static private <X> void checkNotNull(X obj, String msg) {
Objects.requireNonNull(obj, msg);
}
static private void checkArg(Model model)
{ checkNotNull(model, "Model is a null pointer") ; }
// static private void checkArg(Dataset dataset)
// { checkNotNull(dataset, "Dataset is a null pointer") ; }
static private void checkArg(String queryStr)
{ checkNotNull(queryStr, "Query string is null") ; }
static private void checkArg(Query query)
{ checkNotNull(query, "Query is null") ; }
}