/*
* 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.sparql.engine;
import org.apache.jena.query.Query;
import org.apache.jena.sparql.algebra.Op;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.util.Context;
/**
* A {@code QueryEngineFactory} builds query {@link Plan}s via
* {@link #create(Query, DatasetGraph, Binding, Context)} or
* {@link #create(Op, DatasetGraph, Binding, Context)}. A {@link Plan} has a
* query iterator for the results of executing the {@link Op}, a SPARQL algebra
* expression with local extensions.
* <p>
* * A {@code QueryEngineFactory} is registered with the
* {@link QueryEngineRegistry}.
* <p>
* * When determining which factory to use, the querye execution process calls
* {@link #accept(Query, DatasetGraph, Context)} or
* {@link #accept(Op, DatasetGraph, Context)} to determine whether the
* particular type of query engine produced by this factory accepts the
* particular request.
* <p>
* A QueryEngineFactory can be registered for use with
* {@link QueryEngineRegistry#addFactory(QueryEngineFactory)} and
* unregistered with
* {@link QueryEngineRegistry#removeFactory(QueryEngineFactory)}.
*/
public interface QueryEngineFactory {
/**
* Detect appropriate requests for a particular query engine for a particular graph type.
*
* @param query
* a {@link Query} to be executed
* @param dataset
* the {@link DatasetGraph} over which the query is to be executed
* @param context
* the {@link Context} in which the query is to be executed
* @return whether the kind of query engine produced by this factory can handle this task
*/
public boolean accept(Query query, DatasetGraph dataset, Context context);
/**
* Call to create a {@link Plan} : the companion {@link #accept} wil have returned {@code true}.
* @param query
* @param dataset
* @param inputBinding
* @param context
*/
public Plan create(Query query, DatasetGraph dataset, Binding inputBinding, Context context);
/**
* Detect appropriate requests for a particular query engine for a particular graph type.
*
* @param op
* an {@link Op} to be executed
* @param dataset
* the {@link DatasetGraph} over which the operation is to be executed
* @param context
* the {@link Context} in which the operation is to be executed
* @return whether the kind of query engine produced by this factory can handle this task
*/
public boolean accept(Op op, DatasetGraph dataset, Context context);
/**
* Call to create a {@link Plan} : the companion {@link #accept} wil have returned {@code true}.
* @param op
* @param dataset
* @param inputBinding
* @param context
*/
public Plan create(Op op, DatasetGraph dataset, Binding inputBinding, Context context);
}