01: /*
02:
03: Derby - Class org.apache.derby.iapi.sql.compile.Visitor
04:
05: Licensed to the Apache Software Foundation (ASF) under one or more
06: contributor license agreements. See the NOTICE file distributed with
07: this work for additional information regarding copyright ownership.
08: The ASF licenses this file to you under the Apache License, Version 2.0
09: (the "License"); you may not use this file except in compliance with
10: the License. You may obtain a copy of the License at
11:
12: http://www.apache.org/licenses/LICENSE-2.0
13:
14: Unless required by applicable law or agreed to in writing, software
15: distributed under the License is distributed on an "AS IS" BASIS,
16: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17: See the License for the specific language governing permissions and
18: limitations under the License.
19:
20: */
21:
22: package org.apache.derby.iapi.sql.compile;
23:
24: import org.apache.derby.iapi.error.StandardException;
25:
26: /**
27: * A visitor is an object that traverses the querytree
28: * and performs some action.
29: *
30: * @author jamie
31: */
32: public interface Visitor {
33: /**
34: * This is the default visit operation on a
35: * QueryTreeNode. It just returns the node. This
36: * will typically suffice as the default visit
37: * operation for most visitors unless the visitor
38: * needs to count the number of nodes visited or
39: * something like that.
40: * <p>
41: * Visitors will overload this method by implementing
42: * a version with a signature that matches a specific
43: * type of node. For example, if I want to do
44: * something special with aggregate nodes, then
45: * that Visitor will implement a
46: * <I> visit(AggregateNode node)</I>
47: * method which does the aggregate specific processing.
48: *
49: * @param node the node to process
50: *
51: * @return a query tree node. Often times this is
52: * the same node that was passed in, but Visitors that
53: * replace nodes with other nodes will use this to
54: * return the new replacement node.
55: *
56: * @exception StandardException may be throw an error
57: * as needed by the visitor (i.e. may be a normal error
58: * if a particular node is found, e.g. if checking
59: * a group by, we don't expect to find any ColumnReferences
60: * that aren't under an AggregateNode -- the easiest
61: * thing to do is just throw an error when we find the
62: * questionable node).
63: */
64: Visitable visit(Visitable node) throws StandardException;
65:
66: /**
67: * Method that is called to see
68: * if query tree traversal should be
69: * stopped before visiting all nodes.
70: * Useful for short circuiting traversal
71: * if we already know we are done.
72: *
73: * @return true/false
74: */
75: boolean stopTraversal();
76:
77: /**
78: * Method that is called to indicate whether
79: * we should skip all nodes below this node
80: * for traversal. Useful if we want to effectively
81: * ignore/prune all branches under a particular
82: * node.
83: * <p>
84: * Differs from stopTraversal() in that it
85: * only affects subtrees, rather than the
86: * entire traversal.
87: *
88: * @param node the node to process
89: *
90: * @return true/false
91: */
92: boolean skipChildren(Visitable node) throws StandardException;
93: }
|