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