/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.language.visitor; import org.teiid.language.*; /** * Visits each node in a hierarchy of LanguageObjects. The default * implementation of each visit() method is simply to visit the children of a * given LanguageObject, if any exist, with this HierarchyVisitor (without * performing any actions on the node). A subclass can selectively override * visit() methods to delegate the actions performed on a node to another * visitor by calling that Visitor's visit() method. This implementation makes * no guarantees about the order in which the children of an LanguageObject are * visited. * @see DelegatingHierarchyVisitor */ public abstract class HierarchyVisitor extends AbstractLanguageVisitor { private boolean visitSubcommands; public HierarchyVisitor() { this(true); } public HierarchyVisitor(boolean visitSubcommands) { this.visitSubcommands = visitSubcommands; } public void visit(AggregateFunction obj) { visitNodes(obj.getParameters()); visitNode(obj.getCondition()); visitNode(obj.getOrderBy()); } public void visit(BatchedUpdates obj) { visitNodes(obj.getUpdateCommands()); } public void visit(Comparison obj) { visitNode(obj.getLeftExpression()); visitNode(obj.getRightExpression()); } public void visit(AndOr obj) { visitNode(obj.getLeftCondition()); visitNode(obj.getRightCondition()); } public void visit(Delete obj) { visitNode(obj.getTable()); visitNode(obj.getWhere()); } public void visit(Call obj) { visitNodes(obj.getArguments()); } public void visit(Exists obj) { if (visitSubcommands) { visitNode(obj.getSubquery()); } } public void visit(Function obj) { visitNodes(obj.getParameters()); } public void visit(GroupBy obj) { visitNodes(obj.getElements()); } public void visit(In obj) { visitNode(obj.getLeftExpression()); visitNodes(obj.getRightExpressions()); } public void visit(Insert obj) { visitNode(obj.getTable()); visitNodes(obj.getColumns()); if (!(obj.getValueSource() instanceof QueryExpression) || visitSubcommands) { visitNode(obj.getValueSource()); } } @Override public void visit(ExpressionValueSource obj) { visitNodes(obj.getValues()); } public void visit(IsNull obj) { visitNode(obj.getExpression()); } public void visit(Join obj) { visitNode(obj.getLeftItem()); visitNode(obj.getRightItem()); visitNode(obj.getCondition()); } public void visit(Like obj) { visitNode(obj.getLeftExpression()); visitNode(obj.getRightExpression()); } public void visit(Not obj) { visitNode(obj.getCriteria()); } public void visit(OrderBy obj) { visitNodes(obj.getSortSpecifications()); } public void visit(Select obj) { visitNode(obj.getWith()); visitNodes(obj.getDerivedColumns()); visitNodes(obj.getFrom()); visitNode(obj.getWhere()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getOrderBy()); visitNode(obj.getLimit()); } public void visit(ScalarSubquery obj) { if (visitSubcommands) { visitNode(obj.getSubquery()); } } public void visit(SearchedCase obj) { visitNodes(obj.getCases()); visitNode(obj.getElseExpression()); } @Override public void visit(SearchedWhenClause obj) { visitNode(obj.getCondition()); visitNode(obj.getResult()); } public void visit(DerivedColumn obj) { visitNode(obj.getExpression()); } public void visit(SubqueryComparison obj) { visitNode(obj.getLeftExpression()); if (visitSubcommands) { visitNode(obj.getSubquery()); } } public void visit(SubqueryIn obj) { visitNode(obj.getLeftExpression()); if (visitSubcommands) { visitNode(obj.getSubquery()); } } public void visit(SetQuery obj) { visitNode(obj.getWith()); if (visitSubcommands) { visitNode(obj.getLeftQuery()); visitNode(obj.getRightQuery()); } visitNode(obj.getOrderBy()); visitNode(obj.getLimit()); } public void visit(Update obj) { visitNode(obj.getTable()); visitNodes(obj.getChanges()); visitNode(obj.getWhere()); } @Override public void visit(DerivedTable obj) { if (visitSubcommands) { visitNode(obj.getQuery()); } } @Override public void visit(NamedProcedureCall namedProcedureCall) { if (visitSubcommands) { visitNode(namedProcedureCall.getCall()); } } @Override public void visit(SetClause obj) { visitNode(obj.getSymbol()); visitNode(obj.getValue()); } @Override public void visit(With obj) { visitNodes(obj.getItems()); } @Override public void visit(WithItem obj) { visitNode(obj.getTable()); visitNodes(obj.getColumns()); if (visitSubcommands) { visitNode(obj.getSubquery()); } } @Override public void visit(WindowFunction windowFunction) { visitNode(windowFunction.getFunction()); visitNode(windowFunction.getWindowSpecification()); } @Override public void visit(WindowSpecification windowSpecification) { visitNodes(windowSpecification.getPartition()); visitNode(windowSpecification.getOrderBy()); } }