001/*
002 * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     Florent Guillaume
018 */
019
020package org.nuxeo.ecm.core.query.sql.model;
021
022/**
023 * A default implementation of a visitor that visits depth-first in standard expression order.
024 *
025 * @author Florent Guillaume
026 */
027public class DefaultQueryVisitor implements IVisitor {
028
029    private static final long serialVersionUID = 1L;
030
031    @Override
032    public void visitQuery(SQLQuery node) {
033        node.select.accept(this);
034        node.from.accept(this);
035        if (node.where != null) {
036            node.where.accept(this);
037        }
038        if (node.orderBy != null) {
039            node.orderBy.accept(this);
040        }
041        if (node.groupBy != null) {
042            node.groupBy.accept(this);
043        }
044        if (node.having != null) {
045            node.having.accept(this);
046        }
047    }
048
049    @Override
050    public void visitSelectClause(SelectClause node) {
051        SelectList elements = node.elements;
052        for (int i = 0; i < elements.size(); i++) {
053            elements.get(i).accept(this);
054        }
055    }
056
057    @Override
058    public void visitFromClause(FromClause node) {
059    }
060
061    @Override
062    public void visitWhereClause(WhereClause node) {
063        node.predicate.accept(this);
064    }
065
066    @Override
067    public void visitGroupByClause(GroupByClause node) {
068    }
069
070    @Override
071    public void visitHavingClause(HavingClause node) {
072        if (node.predicate != null) {
073            node.predicate.accept(this);
074        }
075    }
076
077    @Override
078    public void visitOrderByClause(OrderByClause node) {
079        node.elements.accept(this);
080    }
081
082    @Override
083    public void visitOrderByList(OrderByList node) {
084        for (OrderByExpr aNode : node) {
085            aNode.accept(this);
086        }
087    }
088
089    @Override
090    public void visitOrderByExpr(OrderByExpr node) {
091        node.reference.accept(this);
092    }
093
094    @Override
095    public void visitExpression(Expression node) {
096        if (node.rvalue == null) {
097            if (node.isSuffix()) {
098                // IS NULL, IS NOT NULL
099                node.lvalue.accept(this);
100                node.operator.accept(this);
101            } else {
102                // NOT
103                node.operator.accept(this);
104                node.lvalue.accept(this);
105            }
106        } else {
107            node.lvalue.accept(this);
108            node.operator.accept(this);
109            node.rvalue.accept(this);
110        }
111    }
112
113    @Override
114    public void visitMultiExpression(MultiExpression node) {
115        for (Operand operand : node.values) {
116            operand.accept(this);
117        }
118    }
119
120    @Override
121    public void visitOperator(Operator node) {
122    }
123
124    @Override
125    public void visitReference(Reference node) {
126    }
127
128    @Override
129    public void visitReferenceList(ReferenceList node) {
130        for (Reference reference : node) {
131            reference.accept(this);
132        }
133    }
134
135    @Override
136    public void visitLiteral(Literal node) {
137    }
138
139    @Override
140    public void visitLiteralList(LiteralList node) {
141        for (Literal literal : node) {
142            literal.accept(this);
143        }
144    }
145
146    @Override
147    public void visitDateLiteral(DateLiteral node) {
148        visitLiteral(node);
149    }
150
151    @Override
152    public void visitStringLiteral(StringLiteral node) {
153        visitLiteral(node);
154    }
155
156    @Override
157    public void visitDoubleLiteral(DoubleLiteral node) {
158        visitLiteral(node);
159    }
160
161    @Override
162    public void visitIntegerLiteral(IntegerLiteral node) {
163        visitLiteral(node);
164    }
165
166    @Override
167    public void visitBooleanLiteral(BooleanLiteral node) {
168        visitLiteral(node);
169    }
170
171    @Override
172    public void visitFunction(Function node) {
173        for (Operand operand : node.args) {
174            operand.accept(this);
175        }
176    }
177
178    @Override
179    public void visitOperandList(OperandList node) {
180        for (Operand operand : node) {
181            operand.accept(this);
182        }
183    }
184
185}