/*
* 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.main;
import org.apache.jena.atlas.logging.Log ;
import org.apache.jena.query.ARQ ;
import org.apache.jena.sparql.core.BasicPattern ;
import org.apache.jena.sparql.engine.ExecutionContext ;
import org.apache.jena.sparql.engine.QueryIterator ;
import org.apache.jena.sparql.engine.iterator.QueryIterBlockTriples ;
import org.apache.jena.sparql.util.Context ;
/** The stage builder (there is only one) is a library that encapsulates
* evaluation of a basic graph pattern (BGP). Matching BGPs is an extension
* point of SPARQL; different entailment regimes plug in at this point.
* They are also an extension point in ARQ to connect to any datasource,
* the most common case being connectinbg to a Jena graph.
*
* The StageBuilder finds the registered StageGenerator, and calls it to
* evaluate a basic graph pattern that has any bound variables
* replaced by their value (in effect, an index join).
*
* Extension happens by registering a different StageGenerator in
* the context object for the execution. Setting the StageGenerator
* in the global context ({@link ARQ}) makes it available
* to all query execution created after the point of setting.
*
* Helper static methods for setting the stage generator are provided.
*/
public class StageBuilder
{
// public static QueryIterator execute(BasicPattern pattern,
// QueryIterator input,
// ExecutionContext execCxt)
// {
// if ( pattern.isEmpty() )
// return input ;
//
// boolean hideBNodeVars = execCxt.getContext().isTrue(ARQ.hideNonDistiguishedVariables) ;
//
// StageGenerator gen = chooseStageGenerator(execCxt.getContext()) ;
// QueryIterator qIter = gen.execute(pattern, input, execCxt) ;
//
// // Remove non-distinguished variables here.
// // Project out only named variables.
// if ( hideBNodeVars )
// qIter = new QueryIterDistinguishedVars(qIter, execCxt) ;
// return qIter ;
// }
// -------- Initialize
private static StageGenerator defaultStageGenerator = new StageGeneratorGeneric() ;
/** The plain StageGenerator, no reordering */
public static StageGenerator executeInline = new StageGenerator() {
@Override
public QueryIterator execute(BasicPattern pattern, QueryIterator input, ExecutionContext execCxt)
{
return QueryIterBlockTriples.create(input, pattern, execCxt) ;
}} ;
// -------- Manage StageGenerator registration
public static void setGenerator(Context context, StageGenerator builder)
{
if ( ARQ.stageGenerator == null )
// Indicator of initialization problems
Log.warn(StageBuilder.class, "ARQ.stageGenerator = null") ;
context.set(ARQ.stageGenerator, builder) ;
}
public static StageGenerator getGenerator(Context context)
{
if ( context == null )
return null ;
return (StageGenerator)context.get(ARQ.stageGenerator) ;
}
public static StageGenerator getGenerator()
{
return getGenerator(ARQ.getContext()) ;
}
public static StageGenerator standardGenerator()
{
return defaultStageGenerator ;
}
public static StageGenerator chooseStageGenerator(Context context)
{
StageGenerator gen = getGenerator(context) ;
if ( gen == null )
gen = new StageGeneratorGeneric() ;
return gen ;
}
}