class ConstantExpressionVisitor extends java.lang.Object implements Visitor
This visitor replaces a ValueNode
with a node representing a
constant value, if the ValueNode
is known to always evaluate to the
same value. It may for instance replace a sub-tree representing 1=1
with a constant TRUE
.
The actual evaluation of the ValueNode
s is performed by invoking
ValueNode.evaluateConstantExpressions()
on every ValueNode
in the query tree.
In contrast to most other visitors, this visitor walks the tree bottom-up.
Top-down processing of the tree would only evaluate constant expressions
at the leaf level, so for instance (1=1)=(1=2)
would only be
simplified to TRUE=FALSE
. With bottom-up processing, the top-level
= node will be processed after the leaves, and it sees the intermediate
tree TRUE=FALSE
which it is able to transform into the even simpler
tree FALSE
.
Constructor and Description |
---|
ConstantExpressionVisitor() |
Modifier and Type | Method and Description |
---|---|
boolean |
skipChildren(Visitable node)
Method that is called to indicate whether
we should skip all nodes below this node
for traversal.
|
boolean |
stopTraversal()
Method that is called to see
if query tree traversal should be
stopped before visiting all nodes.
|
Visitable |
visit(Visitable node)
Visit the node and call
evaluateConstantExpressions() if it
is a ValueNode . |
boolean |
visitChildrenFirst(Visitable node)
Method that is called to see if
visit() should be called on
the children of node before it is called on node itself. |
public Visitable visit(Visitable node) throws StandardException
evaluateConstantExpressions()
if it
is a ValueNode
.visit
in interface Visitor
node
- the node to processStandardException
- may be throw an error
as needed by the visitor (i.e. may be a normal error
if a particular node is found, e.g. if checking
a group by, we don't expect to find any ColumnReferences
that aren't under an AggregateNode -- the easiest
thing to do is just throw an error when we find the
questionable node).ValueNode.evaluateConstantExpressions()
public boolean stopTraversal()
stopTraversal
in interface Visitor
false
, since the entire tree should be visitedpublic boolean skipChildren(Visitable node)
Differs from stopTraversal() in that it only affects subtrees, rather than the entire traversal.
skipChildren
in interface Visitor
node
- the node to processfalse
, since the entire tree should be visitedpublic boolean visitChildrenFirst(Visitable node)
visit()
should be called on
the children of node
before it is called on node
itself.
If this method always returns true
, the visitor will walk the
tree bottom-up. If it always returns false
, the tree is visited
top-down.visitChildrenFirst
in interface Visitor
node
- the top node of a sub-tree about to be visitedtrue
, since the tree should be walked bottom-upApache Derby V10.13 Internals - Copyright © 2004,2016 The Apache Software Foundation. All Rights Reserved.