org.apache.jena.sparql.algebra.walker.Walker Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jena-arq Show documentation
Show all versions of jena-arq Show documentation
ARQ is a SPARQL 1.1 query engine for Apache Jena
/*
* 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.walker;
import java.util.Objects ;
import org.apache.jena.sparql.algebra.* ;
import org.apache.jena.sparql.core.VarExprList ;
import org.apache.jena.sparql.expr.* ;
/** Walk algebra, {@link Op}s and {@link Expr}s. */
public class Walker {
/** Walk visiting every {@link Op} with an {@link OpVisitor},
* including inside expressions.
*/
public static void walk(Op op, OpVisitor opVisitor) {
Objects.requireNonNull(opVisitor) ;
walk(op, opVisitor, null);
}
/** Walk visiting every {@link Op} and every {@link Expr},
* starting from an {@link Op}.
*/
public static void walk(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor) {
walk(op, opVisitor, exprVisitor, null, null) ;
}
/** Walk visiting every {@link Op} and every {@link Expr},
* starting from an {@link Op}.
*/
public static void walk(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( op == null )
return ;
walk$(op, opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
}
public static void walkSkipService(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( op == null )
return ;
walkSkipService$(op, opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
}
private static void walk$(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
WalkerVisitor wv = createWalker(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
walk$(op, wv) ;
}
private static void walkSkipService$(Op op, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
WalkerVisitor wv = createWalkerSkipService(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
walk$(op, wv) ;
}
private static void walk$(Op op, WalkerVisitor walker) {
walker.walk(op);
}
/** Walk visiting every {@link Expr} with an {@link ExprVisitor},
* including inside any {@link Op} in expressions.
*/
public static void walk(Expr expr, ExprVisitor exprVisitor) {
Objects.requireNonNull(exprVisitor) ;
walk(expr, null, exprVisitor);
}
/** Walk visiting every {@link Op} and every {@link Expr},
* starting from an {@link Expr}.
*/
public static void walk(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor) {
walk(expr, opVisitor, exprVisitor, null, null) ;
}
/** Walk visiting every {@link Op} and every {@link Expr},
* starting from an {@link Expr}.
*/
public static void walk(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( expr == null )
return ;
walk$(expr, opVisitor, exprVisitor, beforeVisitor,afterVisitor) ;
}
private static void walk$(Expr expr, OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
WalkerVisitor wv = createWalker(opVisitor, exprVisitor, beforeVisitor,afterVisitor) ;
walk$(expr, wv);
}
private static void walk$(Expr expr, WalkerVisitor walker) {
walker.walk(expr);
}
/** Walk visiting every {@link Expr} with an {@link ExprVisitor},
* including inside any {@link Op} in expressions.
*/
public static void walk(ExprList exprList, ExprVisitor exprVisitor) {
walk(exprList, null, exprVisitor);
}
/** Walk visiting every {@link Op} and every {@link Expr},
* starting from an {@link ExprList}.
*/
public static void walk(ExprList exprList, OpVisitor opVisitor, ExprVisitor exprVisitor) {
if ( exprList == null )
return ;
Objects.requireNonNull(exprVisitor) ;
exprList.forEach(e->walk(e,opVisitor, exprVisitor)) ;
}
public static void walk(VarExprList varExprList, ExprVisitor exprVisitor) {
Objects.requireNonNull(exprVisitor) ;
walk(varExprList, null, exprVisitor);
}
public static void walk(VarExprList varExprList, OpVisitor opVisitor, ExprVisitor exprVisitor) {
if ( varExprList == null )
return ;
varExprList.forEachExpr((v,e)->walk(e,opVisitor, exprVisitor)) ;
}
private static OpVisitor nullOpVisitor = new OpVisitorBase() ;
private static ExprVisitor nullExprVisitor = new ExprVisitorBase() ;
public static WalkerVisitor createWalker(OpVisitor opVisitor, ExprVisitor exprVisitor) {
return createWalker(opVisitor, exprVisitor, null, null) ;
}
public static WalkerVisitor createWalker(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( opVisitor == null )
opVisitor = nullOpVisitor ;
if ( exprVisitor == null )
exprVisitor = nullExprVisitor ;
return new WalkerVisitor(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
}
public static WalkerVisitor createWalkerSkipService(OpVisitor opVisitor, ExprVisitor exprVisitor, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( opVisitor == null )
opVisitor = nullOpVisitor ;
if ( exprVisitor == null )
exprVisitor = nullExprVisitor ;
return new WalkerVisitorSkipService(opVisitor, exprVisitor, beforeVisitor, afterVisitor) ;
}
/** Transform an algebra expression */
public static Op transform(Op op, Transform transform) {
return transform(op, transform, null) ;
}
/** Transform an {@link Op}. */
public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform) {
ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
return transform(op, v) ;
}
/** Transform an {@link Op}. */
public static Op transform(Op op, Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
ApplyTransformVisitor v = createTransformer(opTransform, exprTransform, beforeVisitor,afterVisitor) ;
return transform(op, v, beforeVisitor, afterVisitor) ;
}
/** Transform an {@link Op}. */
public static Op transform(Op op, ApplyTransformVisitor v) {
return transform(op, v, null, null) ;
}
/** Transform an {@link Op}. */
public static Op transform(Op op, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
walk(op, v, v, beforeVisitor, afterVisitor) ;
return v.opResult() ;
}
/** Transform an {@link Op}. */
public static Op transformSkipService(Op op, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
walkSkipService(op, v, v, beforeVisitor, afterVisitor) ;
return v.opResult() ;
}
/** Transform an expression */
public static Expr transform(Expr expr, ExprTransform exprTransform) {
return transform(expr, null, exprTransform) ;
}
/** Transform an {@link Expr}. */
public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform) {
ApplyTransformVisitor v = createTransformer(opTransform, exprTransform) ;
return transform(expr, v) ;
}
/** Transform an {@link Expr}. */
public static Expr transform(Expr expr, Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
ApplyTransformVisitor v = createTransformer(opTransform, exprTransform, beforeVisitor,afterVisitor) ;
return transform(expr, v, beforeVisitor, afterVisitor) ;
}
/** Transform an {@link Expr}. */
public static Expr transform(Expr expr, ApplyTransformVisitor v) {
walk(expr, v, v, null, null) ;
return v.exprResult() ;
}
/** Transform an {@link Expr}. */
public static Expr transform(Expr expr, ApplyTransformVisitor v, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
walk(expr, v, v, beforeVisitor, afterVisitor) ;
return v.exprResult() ;
}
private static Transform nullOpTransform = new TransformCopy() ;
private static ExprTransform nullExprTransform = new ExprTransformCopy() ;
public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform) {
return createTransformer(opTransform, exprTransform, null, null) ;
}
public static ApplyTransformVisitor createTransformer(Transform opTransform, ExprTransform exprTransform, OpVisitor beforeVisitor, OpVisitor afterVisitor) {
if ( opTransform == null )
opTransform = nullOpTransform ;
if ( exprTransform == null )
exprTransform = nullExprTransform ;
return new ApplyTransformVisitor(opTransform, exprTransform, true, null, null) ;
}
}