001/*
002 * (C) Copyright 2006-2016 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 */
019package org.nuxeo.ecm.core.query.sql.model;
020
021/**
022 * A default implementation of a visitor that visits depth-first in standard expression order.
023 *
024 * @author Florent Guillaume
025 */
026public class DefaultQueryVisitor implements IVisitor {
027
028    @Override
029    public void visitQuery(SQLQuery node) {
030        node.select.accept(this);
031        node.from.accept(this);
032        if (node.where != null) {
033            node.where.accept(this);
034        }
035        if (node.orderBy != null) {
036            node.orderBy.accept(this);
037        }
038        if (node.groupBy != null) {
039            node.groupBy.accept(this);
040        }
041        if (node.having != null) {
042            node.having.accept(this);
043        }
044    }
045
046    @Override
047    public void visitSelectClause(SelectClause node) {
048        node.elements.forEach((alias, operand) -> operand.accept(this));
049    }
050
051    @Override
052    public void visitFromClause(FromClause node) {
053    }
054
055    @Override
056    public void visitWhereClause(WhereClause node) {
057        node.predicate.accept(this);
058    }
059
060    @Override
061    public void visitGroupByClause(GroupByClause node) {
062    }
063
064    @Override
065    public void visitHavingClause(HavingClause node) {
066        if (node.predicate != null) {
067            node.predicate.accept(this);
068        }
069    }
070
071    @Override
072    public void visitOrderByClause(OrderByClause node) {
073        node.elements.accept(this);
074    }
075
076    @Override
077    public void visitOrderByList(OrderByList node) {
078        for (OrderByExpr aNode : node) {
079            aNode.accept(this);
080        }
081    }
082
083    @Override
084    public void visitOrderByExpr(OrderByExpr node) {
085        node.reference.accept(this);
086    }
087
088    @Override
089    public void visitExpression(Expression node) {
090        if (node.rvalue == null) {
091            if (node.isSuffix()) {
092                // IS NULL, IS NOT NULL
093                node.lvalue.accept(this);
094                node.operator.accept(this);
095            } else {
096                // NOT
097                node.operator.accept(this);
098                node.lvalue.accept(this);
099            }
100        } else {
101            node.lvalue.accept(this);
102            node.operator.accept(this);
103            node.rvalue.accept(this);
104        }
105    }
106
107    @Override
108    public void visitMultiExpression(MultiExpression node) {
109        for (Predicate predicate : node.predicates) {
110            predicate.accept(this);
111        }
112    }
113
114    @Override
115    public void visitOperator(Operator node) {
116    }
117
118    @Override
119    public void visitReference(Reference node) {
120    }
121
122    @Override
123    public void visitReferenceList(ReferenceList node) {
124        for (Reference reference : node) {
125            reference.accept(this);
126        }
127    }
128
129    @Override
130    public void visitLiteral(Literal node) {
131    }
132
133    @Override
134    public void visitLiteralList(LiteralList node) {
135        for (Literal literal : node) {
136            literal.accept(this);
137        }
138    }
139
140    @Override
141    public void visitDateLiteral(DateLiteral node) {
142        visitLiteral(node);
143    }
144
145    @Override
146    public void visitStringLiteral(StringLiteral node) {
147        visitLiteral(node);
148    }
149
150    @Override
151    public void visitDoubleLiteral(DoubleLiteral node) {
152        visitLiteral(node);
153    }
154
155    @Override
156    public void visitIntegerLiteral(IntegerLiteral node) {
157        visitLiteral(node);
158    }
159
160    @Override
161    public void visitBooleanLiteral(BooleanLiteral node) {
162        visitLiteral(node);
163    }
164
165    @Override
166    public void visitFunction(Function node) {
167        if (node.args != null) {
168            for (Operand operand : node.args) {
169                operand.accept(this);
170            }
171        }
172    }
173
174    @Override
175    public void visitOperandList(OperandList node) {
176        for (Operand operand : node) {
177            operand.accept(this);
178        }
179    }
180
181}