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}