/* * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007. * * Licensed under the Aduna BSD-style license. */ package org.openrdf.query.algebra.helpers; import org.openrdf.query.algebra.And; import org.openrdf.query.algebra.BNodeGenerator; import org.openrdf.query.algebra.BinaryTupleOperator; import org.openrdf.query.algebra.BinaryValueOperator; import org.openrdf.query.algebra.Bound; import org.openrdf.query.algebra.Compare; import org.openrdf.query.algebra.CompareAll; import org.openrdf.query.algebra.CompareAny; import org.openrdf.query.algebra.CompareSubQueryValueOperator; import org.openrdf.query.algebra.Count; import org.openrdf.query.algebra.Datatype; import org.openrdf.query.algebra.Difference; import org.openrdf.query.algebra.Distinct; import org.openrdf.query.algebra.EmptySet; import org.openrdf.query.algebra.Exists; import org.openrdf.query.algebra.Extension; import org.openrdf.query.algebra.ExtensionElem; import org.openrdf.query.algebra.Filter; import org.openrdf.query.algebra.FunctionCall; import org.openrdf.query.algebra.Group; import org.openrdf.query.algebra.GroupElem; import org.openrdf.query.algebra.In; import org.openrdf.query.algebra.Intersection; import org.openrdf.query.algebra.IsBNode; import org.openrdf.query.algebra.IsLiteral; import org.openrdf.query.algebra.IsResource; import org.openrdf.query.algebra.IsURI; import org.openrdf.query.algebra.Join; import org.openrdf.query.algebra.Label; import org.openrdf.query.algebra.Lang; import org.openrdf.query.algebra.LangMatches; import org.openrdf.query.algebra.LeftJoin; import org.openrdf.query.algebra.Like; import org.openrdf.query.algebra.LocalName; import org.openrdf.query.algebra.MathExpr; import org.openrdf.query.algebra.Max; import org.openrdf.query.algebra.Min; import org.openrdf.query.algebra.MultiProjection; import org.openrdf.query.algebra.Namespace; import org.openrdf.query.algebra.Not; import org.openrdf.query.algebra.Or; import org.openrdf.query.algebra.Order; import org.openrdf.query.algebra.OrderElem; import org.openrdf.query.algebra.Projection; import org.openrdf.query.algebra.ProjectionElem; import org.openrdf.query.algebra.ProjectionElemList; import org.openrdf.query.algebra.QueryModelNode; import org.openrdf.query.algebra.QueryModelVisitor; import org.openrdf.query.algebra.QueryRoot; import org.openrdf.query.algebra.Regex; import org.openrdf.query.algebra.SameTerm; import org.openrdf.query.algebra.SingletonSet; import org.openrdf.query.algebra.Slice; import org.openrdf.query.algebra.StatementPattern; import org.openrdf.query.algebra.Str; import org.openrdf.query.algebra.SubQueryValueOperator; import org.openrdf.query.algebra.UnaryTupleOperator; import org.openrdf.query.algebra.UnaryValueOperator; import org.openrdf.query.algebra.Union; import org.openrdf.query.algebra.ValueConstant; import org.openrdf.query.algebra.Var; /** * Base class for {@link QueryModelVisitor}s. This class implements all * <tt>meet(... node)</tt> methods from the visitor interface, forwarding the * call to a method for the node's supertype. This is done recursively until * {@link #meetNode} is reached. This allows subclasses to easily define default * behaviour for visited nodes of a certain type. The default implementation of * {@link #meetDefault} is to visit the node's children. */ public abstract class QueryModelVisitorBase<X extends Exception> implements QueryModelVisitor<X> { public void meet(And node) throws X { meetBinaryValueOperator(node); } public void meet(BNodeGenerator node) throws X { meetNode(node); } public void meet(Bound node) throws X { meetNode(node); } public void meet(Compare node) throws X { meetBinaryValueOperator(node); } public void meet(CompareAll node) throws X { meetCompareSubQueryValueOperator(node); } public void meet(CompareAny node) throws X { meetCompareSubQueryValueOperator(node); } public void meet(Count node) throws X { meetUnaryValueOperator(node); } public void meet(Datatype node) throws X { meetUnaryValueOperator(node); } public void meet(Difference node) throws X { meetBinaryTupleOperator(node); } public void meet(Distinct node) throws X { meetUnaryTupleOperator(node); } public void meet(EmptySet node) throws X { meetNode(node); } public void meet(Exists node) throws X { meetSubQueryValueOperator(node); } public void meet(Extension node) throws X { meetUnaryTupleOperator(node); } public void meet(ExtensionElem node) throws X { meetNode(node); } public void meet(Filter node) throws X { meetUnaryTupleOperator(node); } public void meet(FunctionCall node) throws X { meetNode(node); } public void meet(Group node) throws X { meetUnaryTupleOperator(node); } public void meet(GroupElem node) throws X { meetNode(node); } public void meet(In node) throws X { meetCompareSubQueryValueOperator(node); } public void meet(Intersection node) throws X { meetBinaryTupleOperator(node); } public void meet(IsBNode node) throws X { meetUnaryValueOperator(node); } public void meet(IsLiteral node) throws X { meetUnaryValueOperator(node); } public void meet(IsResource node) throws X { meetUnaryValueOperator(node); } public void meet(IsURI node) throws X { meetUnaryValueOperator(node); } public void meet(Join node) throws X { meetBinaryTupleOperator(node); } public void meet(Label node) throws X { meetUnaryValueOperator(node); } public void meet(Lang node) throws X { meetUnaryValueOperator(node); } public void meet(LangMatches node) throws X { meetBinaryValueOperator(node); } public void meet(LeftJoin node) throws X { meetBinaryTupleOperator(node); } public void meet(LocalName node) throws X { meetUnaryValueOperator(node); } public void meet(Like node) throws X { meetUnaryValueOperator(node); } public void meet(MathExpr node) throws X { meetBinaryValueOperator(node); } public void meet(Max node) throws X { meetUnaryValueOperator(node); } public void meet(Min node) throws X { meetUnaryValueOperator(node); } public void meet(MultiProjection node) throws X { meetUnaryTupleOperator(node); } public void meet(Namespace node) throws X { meetUnaryValueOperator(node); } public void meet(Not node) throws X { meetUnaryValueOperator(node); } public void meet(Or node) throws X { meetBinaryValueOperator(node); } public void meet(Order node) throws X { meetUnaryTupleOperator(node); } public void meet(OrderElem node) throws X { meetNode(node); } public void meet(Projection node) throws X { meetUnaryTupleOperator(node); } public void meet(ProjectionElem node) throws X { meetNode(node); } public void meet(ProjectionElemList node) throws X { meetNode(node); } public void meet(QueryRoot node) throws X { meetNode(node); } public void meet(Regex node) throws X { meetBinaryValueOperator(node); } public void meet(Slice node) throws X { meetUnaryTupleOperator(node); } public void meet(SameTerm node) throws X { meetBinaryValueOperator(node); } public void meet(SingletonSet node) throws X { meetNode(node); } public void meet(StatementPattern node) throws X { meetNode(node); } public void meet(Str node) throws X { meetUnaryValueOperator(node); } public void meet(Union node) throws X { meetBinaryTupleOperator(node); } public void meet(ValueConstant node) throws X { meetNode(node); } public void meet(Var node) throws X { meetNode(node); } public void meetOther(QueryModelNode node) throws X { if (node instanceof UnaryTupleOperator) { meetUnaryTupleOperator((UnaryTupleOperator)node); } else if (node instanceof BinaryTupleOperator) { meetBinaryTupleOperator((BinaryTupleOperator)node); } else if (node instanceof CompareSubQueryValueOperator) { meetCompareSubQueryValueOperator((CompareSubQueryValueOperator)node); } else if (node instanceof SubQueryValueOperator) { meetSubQueryValueOperator((SubQueryValueOperator)node); } else if (node instanceof UnaryValueOperator) { meetUnaryValueOperator((UnaryValueOperator)node); } else if (node instanceof BinaryValueOperator) { meetBinaryValueOperator((BinaryValueOperator)node); } else { meetNode(node); } } /** * Method called by all <tt>meet</tt> methods with a * {@link UnaryTupleOperator} node as argument. Forwards the call to * {@link #meetTupleExpr} by default. * * @param node * The node that is being visited. */ protected void meetUnaryTupleOperator(UnaryTupleOperator node) throws X { meetNode(node); } /** * Method called by all <tt>meet</tt> methods with a * {@link BinaryTupleOperator} node as argument. Forwards the call to * {@link #meetTupleExpr} by default. * * @param node * The node that is being visited. */ protected void meetBinaryTupleOperator(BinaryTupleOperator node) throws X { meetNode(node); } /** * Method called by all <tt>meet</tt> methods with a * {@link CompareSubQueryValueOperator} node as argument. Forwards the call * to {@link #meetSubQueryValueOperator} by default. * * @param node * The node that is being visited. */ protected void meetCompareSubQueryValueOperator(CompareSubQueryValueOperator node) throws X { meetSubQueryValueOperator(node); } /** * Method called by all <tt>meet</tt> methods with a * {@link SubQueryValueOperator} node as argument. Forwards the call to * {@link #meetValueExpr} by default. * * @param node * The node that is being visited. */ protected void meetSubQueryValueOperator(SubQueryValueOperator node) throws X { meetNode(node); } /** * Method called by all <tt>meet</tt> methods with a * {@link UnaryValueOperator} node as argument. Forwards the call to * {@link #meetValueExpr} by default. * * @param node * The node that is being visited. */ protected void meetUnaryValueOperator(UnaryValueOperator node) throws X { meetNode(node); } /** * Method called by all <tt>meet</tt> methods with a * {@link BinaryValueOperator} node as argument. Forwards the call to * {@link #meetValueExpr} by default. * * @param node * The node that is being visited. * @throws */ protected void meetBinaryValueOperator(BinaryValueOperator node) throws X { meetNode(node); } /** * Method called by all of the other <tt>meet</tt> methods that are not * overridden in subclasses. This method can be overridden in subclasses to * define default behaviour when visiting nodes. The default behaviour of * this method is to visit the node's children. * * @param node * The node that is being visited. */ protected void meetNode(QueryModelNode node) throws X { node.visitChildren(this); } }