Class: SQLParser::SQLVisitor
- Inherits:
-
Object
- Object
- SQLParser::SQLVisitor
- Defined in:
- lib/sql-parser/sql_visitor.rb
Instance Method Summary collapse
-
#initialize ⇒ SQLVisitor
constructor
A new instance of SQLVisitor.
- #visit(node) ⇒ Object
- #visit_Add(o) ⇒ Object
- #visit_All(o) ⇒ Object
- #visit_And(o) ⇒ Object
- #visit_ApproximateFloat(o) ⇒ Object
- #visit_As(o) ⇒ Object
- #visit_Ascending(o) ⇒ Object
- #visit_Average(o) ⇒ Object
- #visit_Between(o) ⇒ Object
- #visit_BetweenRange(o) ⇒ Object
- #visit_Column(o) ⇒ Object
- #visit_Count(o) ⇒ Object
- #visit_CrossJoin(o) ⇒ Object
- #visit_CurrentUser(o) ⇒ Object
- #visit_Date(o) ⇒ Object
- #visit_DateTime(o) ⇒ Object
- #visit_Descending(o) ⇒ Object
- #visit_DirectSelect(o) ⇒ Object
- #visit_Distinct(o) ⇒ Object
- #visit_Divide(o) ⇒ Object
- #visit_Equals(o) ⇒ Object
- #visit_Exists(o) ⇒ Object
- #visit_False(o) ⇒ Object
- #visit_Float(o) ⇒ Object
- #visit_ForceIndex(o) ⇒ Object
- #visit_FromClause(o) ⇒ Object
- #visit_FullJoin(o) ⇒ Object
- #visit_FullOuterJoin(o) ⇒ Object
- #visit_Greater(o) ⇒ Object
- #visit_GreaterOrEquals(o) ⇒ Object
- #visit_GroupByClause(o) ⇒ Object
- #visit_HavingClause(o) ⇒ Object
- #visit_IgnoreIndex(o) ⇒ Object
- #visit_In(o) ⇒ Object
- #visit_InColumnList(o) ⇒ Object
- #visit_InnerJoin(o) ⇒ Object
- #visit_Insert(o) ⇒ Object
- #visit_Integer(o) ⇒ Object
- #visit_InValueList(o) ⇒ Object
- #visit_Is(o) ⇒ Object
- #visit_LeftJoin(o) ⇒ Object
- #visit_LeftOuterJoin(o) ⇒ Object
- #visit_Less(o) ⇒ Object
- #visit_LessOrEquals(o) ⇒ Object
- #visit_Like(o) ⇒ Object
- #visit_LimitClause(o) ⇒ Object
- #visit_Maximum(o) ⇒ Object
- #visit_Minimum(o) ⇒ Object
- #visit_Multiply(o) ⇒ Object
- #visit_Not(o) ⇒ Object
- #visit_Null(o) ⇒ Object
- #visit_On(o) ⇒ Object
- #visit_Or(o) ⇒ Object
- #visit_OrderBy(o) ⇒ Object
- #visit_OrderClause(o) ⇒ Object
- #visit_QualifiedColumn(o) ⇒ Object
- #visit_RightJoin(o) ⇒ Object
- #visit_RightOuterJoin(o) ⇒ Object
- #visit_Select(o) ⇒ Object
- #visit_SelectList(o) ⇒ Object
- #visit_String(o) ⇒ Object
- #visit_Subquery(o) ⇒ Object
- #visit_Subtract(o) ⇒ Object
- #visit_Sum(o) ⇒ Object
- #visit_Table(o) ⇒ Object
- #visit_TableExpression(o) ⇒ Object
- #visit_True(o) ⇒ Object
- #visit_UnaryMinus(o) ⇒ Object
- #visit_UnaryPlus(o) ⇒ Object
- #visit_UseIndex(o) ⇒ Object
- #visit_Using(o) ⇒ Object
- #visit_WhereClause(o) ⇒ Object
Constructor Details
#initialize ⇒ SQLVisitor
Returns a new instance of SQLVisitor.
5 6 7 |
# File 'lib/sql-parser/sql_visitor.rb', line 5 def initialize @negated = false end |
Instance Method Details
#visit(node) ⇒ Object
9 10 11 |
# File 'lib/sql-parser/sql_visitor.rb', line 9 def visit(node) node.accept(self) end |
#visit_Add(o) ⇒ Object
276 277 278 |
# File 'lib/sql-parser/sql_visitor.rb', line 276 def visit_Add(o) arithmetic('+', o) end |
#visit_All(o) ⇒ Object
55 56 57 |
# File 'lib/sql-parser/sql_visitor.rb', line 55 def visit_All(o) '*' end |
#visit_And(o) ⇒ Object
108 109 110 |
# File 'lib/sql-parser/sql_visitor.rb', line 108 def visit_And(o) search_condition('AND', o) end |
#visit_ApproximateFloat(o) ⇒ Object
324 325 326 |
# File 'lib/sql-parser/sql_visitor.rb', line 324 def visit_ApproximateFloat(o) "#{visit(o.mantissa)}E#{visit(o.exponent)}" end |
#visit_As(o) ⇒ Object
252 253 254 |
# File 'lib/sql-parser/sql_visitor.rb', line 252 def visit_As(o) "#{visit(o.original)} AS #{visit(o.alias)}" end |
#visit_Ascending(o) ⇒ Object
76 77 78 |
# File 'lib/sql-parser/sql_visitor.rb', line 76 def visit_Ascending(o) "#{visit(o.column)} ASC" end |
#visit_Average(o) ⇒ Object
200 201 202 |
# File 'lib/sql-parser/sql_visitor.rb', line 200 def visit_Average(o) aggregate('AVG', o) end |
#visit_Between(o) ⇒ Object
152 153 154 155 156 157 158 |
# File 'lib/sql-parser/sql_visitor.rb', line 152 def visit_Between(o) if @negated comparison('NOT BETWEEN', o) else comparison('BETWEEN', o) end end |
#visit_BetweenRange(o) ⇒ Object
160 161 162 |
# File 'lib/sql-parser/sql_visitor.rb', line 160 def visit_BetweenRange(o) "#{visit(o.min)} AND #{visit(o.max)}" end |
#visit_Column(o) ⇒ Object
248 249 250 |
# File 'lib/sql-parser/sql_visitor.rb', line 248 def visit_Column(o) quote(o.name) end |
#visit_Count(o) ⇒ Object
204 205 206 |
# File 'lib/sql-parser/sql_visitor.rb', line 204 def visit_Count(o) aggregate('COUNT', o) end |
#visit_CrossJoin(o) ⇒ Object
208 209 210 |
# File 'lib/sql-parser/sql_visitor.rb', line 208 def visit_CrossJoin(o) "#{visit(o.left)} CROSS JOIN #{visit(o.right)}" end |
#visit_CurrentUser(o) ⇒ Object
308 309 310 |
# File 'lib/sql-parser/sql_visitor.rb', line 308 def visit_CurrentUser(o) 'CURRENT_USER' end |
#visit_Date(o) ⇒ Object
316 317 318 |
# File 'lib/sql-parser/sql_visitor.rb', line 316 def visit_Date(o) "DATE '%s'" % escape(o.value.strftime('%Y-%m-%d')) end |
#visit_DateTime(o) ⇒ Object
312 313 314 |
# File 'lib/sql-parser/sql_visitor.rb', line 312 def visit_DateTime(o) "'%s'" % escape(o.value.strftime('%Y-%m-%d %H:%M:%S')) end |
#visit_Descending(o) ⇒ Object
80 81 82 |
# File 'lib/sql-parser/sql_visitor.rb', line 80 def visit_Descending(o) "#{visit(o.column)} DESC" end |
#visit_DirectSelect(o) ⇒ Object
20 21 22 23 24 25 26 |
# File 'lib/sql-parser/sql_visitor.rb', line 20 def visit_DirectSelect(o) [ o.query_expression, o.order_by, o.limit_clause ].compact.collect { |e| visit(e) }.join(' ') end |
#visit_Distinct(o) ⇒ Object
51 52 53 |
# File 'lib/sql-parser/sql_visitor.rb', line 51 def visit_Distinct(o) "DISTINCT(#{visit(o.column)})" end |
#visit_Divide(o) ⇒ Object
272 273 274 |
# File 'lib/sql-parser/sql_visitor.rb', line 272 def visit_Divide(o) arithmetic('/', o) end |
#visit_Equals(o) ⇒ Object
180 181 182 183 184 185 186 |
# File 'lib/sql-parser/sql_visitor.rb', line 180 def visit_Equals(o) if @negated comparison('<>', o) else comparison('=', o) end end |
#visit_Exists(o) ⇒ Object
112 113 114 115 116 117 118 |
# File 'lib/sql-parser/sql_visitor.rb', line 112 def visit_Exists(o) if @negated "NOT EXISTS #{visit(o.table_subquery)}" else "EXISTS #{visit(o.table_subquery)}" end end |
#visit_False(o) ⇒ Object
300 301 302 |
# File 'lib/sql-parser/sql_visitor.rb', line 300 def visit_False(o) 'FALSE' end |
#visit_Float(o) ⇒ Object
328 329 330 |
# File 'lib/sql-parser/sql_visitor.rb', line 328 def visit_Float(o) o.value.to_s end |
#visit_ForceIndex(o) ⇒ Object
256 257 258 |
# File 'lib/sql-parser/sql_visitor.rb', line 256 def visit_ForceIndex(o) "#{visit(o.table)} FORCE INDEX (`#{o.index}`)" end |
#visit_FromClause(o) ⇒ Object
68 69 70 |
# File 'lib/sql-parser/sql_visitor.rb', line 68 def visit_FromClause(o) "FROM #{arrayize(o.tables)}" end |
#visit_FullJoin(o) ⇒ Object
232 233 234 |
# File 'lib/sql-parser/sql_visitor.rb', line 232 def visit_FullJoin(o) qualified_join('FULL', o) end |
#visit_FullOuterJoin(o) ⇒ Object
236 237 238 |
# File 'lib/sql-parser/sql_visitor.rb', line 236 def visit_FullOuterJoin(o) qualified_join('FULL OUTER', o) end |
#visit_Greater(o) ⇒ Object
172 173 174 |
# File 'lib/sql-parser/sql_visitor.rb', line 172 def visit_Greater(o) comparison('>', o) end |
#visit_GreaterOrEquals(o) ⇒ Object
164 165 166 |
# File 'lib/sql-parser/sql_visitor.rb', line 164 def visit_GreaterOrEquals(o) comparison('>=', o) end |
#visit_GroupByClause(o) ⇒ Object
88 89 90 |
# File 'lib/sql-parser/sql_visitor.rb', line 88 def visit_GroupByClause(o) "GROUP BY #{arrayize(o.columns)}" end |
#visit_HavingClause(o) ⇒ Object
84 85 86 |
# File 'lib/sql-parser/sql_visitor.rb', line 84 def visit_HavingClause(o) "HAVING #{visit(o.search_condition)}" end |
#visit_IgnoreIndex(o) ⇒ Object
264 265 266 |
# File 'lib/sql-parser/sql_visitor.rb', line 264 def visit_IgnoreIndex(o) "#{visit(o.table)} IGNORE INDEX (`#{o.index}`)" end |
#visit_In(o) ⇒ Object
136 137 138 139 140 141 142 |
# File 'lib/sql-parser/sql_visitor.rb', line 136 def visit_In(o) if @negated comparison('NOT IN', o) else comparison('IN', o) end end |
#visit_InColumnList(o) ⇒ Object
144 145 146 |
# File 'lib/sql-parser/sql_visitor.rb', line 144 def visit_InColumnList(o) "(#{arrayize(o.columns)})" end |
#visit_InnerJoin(o) ⇒ Object
212 213 214 |
# File 'lib/sql-parser/sql_visitor.rb', line 212 def visit_InnerJoin(o) qualified_join('INNER', o) end |
#visit_Insert(o) ⇒ Object
13 14 15 16 17 18 |
# File 'lib/sql-parser/sql_visitor.rb', line 13 def visit_Insert(o) name = visit(o.table_reference) columns = ' ' + visit(o.column_list) if o.column_list values = ' VALUES ' + visit(o.in_value_list) "INSERT INTO #{name}#{columns}#{values}" end |
#visit_Integer(o) ⇒ Object
332 333 334 |
# File 'lib/sql-parser/sql_visitor.rb', line 332 def visit_Integer(o) o.value.to_s end |
#visit_InValueList(o) ⇒ Object
148 149 150 |
# File 'lib/sql-parser/sql_visitor.rb', line 148 def visit_InValueList(o) "(#{arrayize(o.values)})" end |
#visit_Is(o) ⇒ Object
120 121 122 123 124 125 126 |
# File 'lib/sql-parser/sql_visitor.rb', line 120 def visit_Is(o) if @negated comparison('IS NOT', o) else comparison('IS', o) end end |
#visit_LeftJoin(o) ⇒ Object
216 217 218 |
# File 'lib/sql-parser/sql_visitor.rb', line 216 def visit_LeftJoin(o) qualified_join('LEFT', o) end |
#visit_LeftOuterJoin(o) ⇒ Object
220 221 222 |
# File 'lib/sql-parser/sql_visitor.rb', line 220 def visit_LeftOuterJoin(o) qualified_join('LEFT OUTER', o) end |
#visit_Less(o) ⇒ Object
176 177 178 |
# File 'lib/sql-parser/sql_visitor.rb', line 176 def visit_Less(o) comparison('<', o) end |
#visit_LessOrEquals(o) ⇒ Object
168 169 170 |
# File 'lib/sql-parser/sql_visitor.rb', line 168 def visit_LessOrEquals(o) comparison('<=', o) end |
#visit_Like(o) ⇒ Object
128 129 130 131 132 133 134 |
# File 'lib/sql-parser/sql_visitor.rb', line 128 def visit_Like(o) if @negated comparison('NOT LIKE', o) else comparison('LIKE', o) end end |
#visit_LimitClause(o) ⇒ Object
32 33 34 |
# File 'lib/sql-parser/sql_visitor.rb', line 32 def visit_LimitClause(o) "LIMIT #{o.limit} OFFSET #{o.offset}" end |
#visit_Maximum(o) ⇒ Object
196 197 198 |
# File 'lib/sql-parser/sql_visitor.rb', line 196 def visit_Maximum(o) aggregate('MAX', o) end |
#visit_Minimum(o) ⇒ Object
192 193 194 |
# File 'lib/sql-parser/sql_visitor.rb', line 192 def visit_Minimum(o) aggregate('MIN', o) end |
#visit_Multiply(o) ⇒ Object
268 269 270 |
# File 'lib/sql-parser/sql_visitor.rb', line 268 def visit_Multiply(o) arithmetic('*', o) end |
#visit_Not(o) ⇒ Object
284 285 286 |
# File 'lib/sql-parser/sql_visitor.rb', line 284 def visit_Not(o) negate { visit(o.value) } end |
#visit_Null(o) ⇒ Object
304 305 306 |
# File 'lib/sql-parser/sql_visitor.rb', line 304 def visit_Null(o) 'NULL' end |
#visit_On(o) ⇒ Object
96 97 98 |
# File 'lib/sql-parser/sql_visitor.rb', line 96 def visit_On(o) "ON #{visit(o.search_condition)}" end |
#visit_Or(o) ⇒ Object
104 105 106 |
# File 'lib/sql-parser/sql_visitor.rb', line 104 def visit_Or(o) search_condition('OR', o) end |
#visit_OrderBy(o) ⇒ Object
28 29 30 |
# File 'lib/sql-parser/sql_visitor.rb', line 28 def visit_OrderBy(o) "ORDER BY #{arrayize(o.sort_specification)}" end |
#visit_OrderClause(o) ⇒ Object
72 73 74 |
# File 'lib/sql-parser/sql_visitor.rb', line 72 def visit_OrderClause(o) "ORDER BY #{arrayize(o.columns)}" end |
#visit_QualifiedColumn(o) ⇒ Object
244 245 246 |
# File 'lib/sql-parser/sql_visitor.rb', line 244 def visit_QualifiedColumn(o) "#{visit(o.table)}.#{visit(o.column)}" end |
#visit_RightJoin(o) ⇒ Object
224 225 226 |
# File 'lib/sql-parser/sql_visitor.rb', line 224 def visit_RightJoin(o) qualified_join('RIGHT', o) end |
#visit_RightOuterJoin(o) ⇒ Object
228 229 230 |
# File 'lib/sql-parser/sql_visitor.rb', line 228 def visit_RightOuterJoin(o) qualified_join('RIGHT OUTER', o) end |
#visit_Select(o) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/sql-parser/sql_visitor.rb', line 40 def visit_Select(o) # FIXME: This feels like a hack initialize "SELECT #{visit_all([o.list, o.table_expression].compact).join(' ')}" end |
#visit_SelectList(o) ⇒ Object
47 48 49 |
# File 'lib/sql-parser/sql_visitor.rb', line 47 def visit_SelectList(o) arrayize(o.columns) end |
#visit_String(o) ⇒ Object
320 321 322 |
# File 'lib/sql-parser/sql_visitor.rb', line 320 def visit_String(o) "'%s'" % escape(o.value) end |
#visit_Subquery(o) ⇒ Object
36 37 38 |
# File 'lib/sql-parser/sql_visitor.rb', line 36 def visit_Subquery(o) "(#{visit(o.query_specification)})" end |
#visit_Subtract(o) ⇒ Object
280 281 282 |
# File 'lib/sql-parser/sql_visitor.rb', line 280 def visit_Subtract(o) arithmetic('-', o) end |
#visit_Sum(o) ⇒ Object
188 189 190 |
# File 'lib/sql-parser/sql_visitor.rb', line 188 def visit_Sum(o) aggregate('SUM', o) end |
#visit_Table(o) ⇒ Object
240 241 242 |
# File 'lib/sql-parser/sql_visitor.rb', line 240 def visit_Table(o) quote(o.name) end |
#visit_TableExpression(o) ⇒ Object
59 60 61 62 63 64 65 66 |
# File 'lib/sql-parser/sql_visitor.rb', line 59 def visit_TableExpression(o) [ o.from_clause, o.where_clause, o.group_by_clause, o.having_clause ].compact.collect { |e| visit(e) }.join(' ') end |
#visit_True(o) ⇒ Object
296 297 298 |
# File 'lib/sql-parser/sql_visitor.rb', line 296 def visit_True(o) 'TRUE' end |
#visit_UnaryMinus(o) ⇒ Object
292 293 294 |
# File 'lib/sql-parser/sql_visitor.rb', line 292 def visit_UnaryMinus(o) "-#{visit(o.value)}" end |
#visit_UnaryPlus(o) ⇒ Object
288 289 290 |
# File 'lib/sql-parser/sql_visitor.rb', line 288 def visit_UnaryPlus(o) "+#{visit(o.value)}" end |
#visit_UseIndex(o) ⇒ Object
260 261 262 |
# File 'lib/sql-parser/sql_visitor.rb', line 260 def visit_UseIndex(o) "#{visit(o.table)} USE INDEX (`#{o.index}`)" end |
#visit_Using(o) ⇒ Object
100 101 102 |
# File 'lib/sql-parser/sql_visitor.rb', line 100 def visit_Using(o) "USING (#{arrayize(o.columns)})" end |
#visit_WhereClause(o) ⇒ Object
92 93 94 |
# File 'lib/sql-parser/sql_visitor.rb', line 92 def visit_WhereClause(o) "WHERE #{visit(o.search_condition)}" end |