blob: a5c4f76e63b7bf1e41e8073333e74af51f52a2c7 [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.sparql.algebra.optimize;
import org.apache.jena.sparql.ARQConstants ;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.Transform ;
import org.apache.jena.sparql.algebra.Transformer ;
import org.apache.jena.sparql.engine.ExecutionContext ;
import org.apache.jena.sparql.util.Context ;
/** Optimization of algebra expressions.
* <p>
* New optimization processes can be installed via a global change:
* <pre>
* Optimize.setFactory((cxt)-&gt;new MyOptimizer(cxt)) ;</pre>
* or on a per-context basis:
* <pre>
* Optimize.RewriterFactory f = (cxt)-&gt;new MyOptimizer(cxt) ;
* context.set(ARQConstants.sysOptimizerFactory, f) ;<pre>
*/
public class Optimize
{
/** Factory for the "Do nothing" optimizer. */
// also known as :: (context) -> { return (op) -> op ; } ;
public static RewriteFactory noOptimizationFactory = context -> op -> op ; // Right associative.
/** Factory for the "minimal" optimizer. */
public static RewriteFactory minimalOptimizationFactory = (context) -> new OptimizerMinimal(context);
/** Factory for the standard optimization sequnece. */
public static RewriteFactory stdOptimizationFactory = (context) -> new OptimizerStd(context);
/**
* Set this via {@link #setFactory} to a different factory implementation to have a
* different general optimizer.
*/
private static RewriteFactory factory = stdOptimizationFactory ;
public static Op optimize(Op op, ExecutionContext execCxt) {
return optimize(op, execCxt.getContext()) ;
}
/** @deprecated Use {@link RewriteFactory} */
@Deprecated
public interface RewriterFactory extends RewriteFactory {}
/** Optimize based on all options */
public static Op optimize(Op op, Context context) {
Rewrite opt = decideOptimizer(context) ;
return opt.rewrite(op) ;
}
/** Set the global optimizer factory to one that does nothing.
* Applications probably want {@link #basicOptimizer} */
public static void noOptimizer() {
setFactory(noOptimizationFactory) ;
}
/** Set the global optimizer factory to one that only does property functions and scoped variables.
* @see #minimalOptimizationFactory
*/
public static void basicOptimizer() {
setFactory(minimalOptimizationFactory) ;
}
static private Rewrite decideOptimizer(Context context) {
RewriteFactory f = (RewriteFactory)context.get(ARQConstants.sysOptimizerFactory) ;
if ( f == null )
f = factory ;
if ( f == null )
f = stdOptimizationFactory ; // Only if default 'factory' gets lost.
return f.create(context) ;
}
/** Globally set the factory for making optimizers */
public static void setFactory(RewriteFactory aFactory)
{ factory = aFactory ; }
/** Get the global factory for making optimizers */
public static RewriteFactory getFactory()
{ return factory ; }
/** Apply a {@link Transform} to an {@link Op} */
public static Op apply(Transform transform, Op op) {
Op op2 = Transformer.transformSkipService(transform, op) ;
if ( op2 != op )
return op2 ;
return op ;
}
}