Class: SQLParser::SQLVisitor

Inherits:
Object
  • Object
show all
Defined in:
lib/sql-parser/sql_visitor.rb

Instance Method Summary collapse

Constructor Details

#initializeSQLVisitor

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



244
245
246
# File 'lib/sql-parser/sql_visitor.rb', line 244

def visit_Add(o)
  arithmetic('+', o)
end

#visit_All(o) ⇒ Object



43
44
45
# File 'lib/sql-parser/sql_visitor.rb', line 43

def visit_All(o)
  '*'
end

#visit_And(o) ⇒ Object



96
97
98
# File 'lib/sql-parser/sql_visitor.rb', line 96

def visit_And(o)
  search_condition('AND', o)
end

#visit_ApproximateFloat(o) ⇒ Object



292
293
294
# File 'lib/sql-parser/sql_visitor.rb', line 292

def visit_ApproximateFloat(o)
  "#{visit(o.mantissa)}E#{visit(o.exponent)}"
end

#visit_As(o) ⇒ Object



232
233
234
# File 'lib/sql-parser/sql_visitor.rb', line 232

def visit_As(o)
  "#{visit(o.value)} AS #{visit(o.column)}"
end

#visit_Ascending(o) ⇒ Object



64
65
66
# File 'lib/sql-parser/sql_visitor.rb', line 64

def visit_Ascending(o)
  "#{visit(o.column)} ASC"
end

#visit_Average(o) ⇒ Object



180
181
182
# File 'lib/sql-parser/sql_visitor.rb', line 180

def visit_Average(o)
  aggregate('AVG', o)
end

#visit_Between(o) ⇒ Object



136
137
138
139
140
141
142
# File 'lib/sql-parser/sql_visitor.rb', line 136

def visit_Between(o)
  if @negated
    "#{visit(o.left)} NOT BETWEEN #{visit(o.min)} AND #{visit(o.max)}"
  else
    "#{visit(o.left)} BETWEEN #{visit(o.min)} AND #{visit(o.max)}"
  end
end

#visit_Column(o) ⇒ Object



228
229
230
# File 'lib/sql-parser/sql_visitor.rb', line 228

def visit_Column(o)
  quote(o.name)
end

#visit_Count(o) ⇒ Object



184
185
186
# File 'lib/sql-parser/sql_visitor.rb', line 184

def visit_Count(o)
  aggregate('COUNT', o)
end

#visit_CrossJoin(o) ⇒ Object



188
189
190
# File 'lib/sql-parser/sql_visitor.rb', line 188

def visit_CrossJoin(o)
  "#{visit(o.left)} CROSS JOIN #{visit(o.right)}"
end

#visit_CurrentUser(o) ⇒ Object



276
277
278
# File 'lib/sql-parser/sql_visitor.rb', line 276

def visit_CurrentUser(o)
  'CURRENT_USER'
end

#visit_Date(o) ⇒ Object



284
285
286
# File 'lib/sql-parser/sql_visitor.rb', line 284

def visit_Date(o)
  "DATE '%s'" % escape(o.value.strftime('%Y-%m-%d'))
end

#visit_DateTime(o) ⇒ Object



280
281
282
# File 'lib/sql-parser/sql_visitor.rb', line 280

def visit_DateTime(o)
  "'%s'" % escape(o.value.strftime('%Y-%m-%d %H:%M:%S'))
end

#visit_Descending(o) ⇒ Object



68
69
70
# File 'lib/sql-parser/sql_visitor.rb', line 68

def visit_Descending(o)
  "#{visit(o.column)} DESC"
end

#visit_DirectSelect(o) ⇒ Object



13
14
15
16
17
18
# File 'lib/sql-parser/sql_visitor.rb', line 13

def visit_DirectSelect(o)
  [
    o.query_expression,
    o.order_by
  ].compact.collect { |e| visit(e) }.join(' ')
end

#visit_Distinct(o) ⇒ Object



39
40
41
# File 'lib/sql-parser/sql_visitor.rb', line 39

def visit_Distinct(o)
  "DISTINCT(#{visit(o.column)})"
end

#visit_Divide(o) ⇒ Object



240
241
242
# File 'lib/sql-parser/sql_visitor.rb', line 240

def visit_Divide(o)
  arithmetic('/', o)
end

#visit_Equals(o) ⇒ Object



160
161
162
163
164
165
166
# File 'lib/sql-parser/sql_visitor.rb', line 160

def visit_Equals(o)
  if @negated
    comparison('<>', o)
  else
    comparison('=', o)
  end
end

#visit_Exists(o) ⇒ Object



100
101
102
103
104
105
106
# File 'lib/sql-parser/sql_visitor.rb', line 100

def visit_Exists(o)
  if @negated
    "NOT EXISTS #{visit(o.table_subquery)}"
  else
    "EXISTS #{visit(o.table_subquery)}"
  end
end

#visit_False(o) ⇒ Object



268
269
270
# File 'lib/sql-parser/sql_visitor.rb', line 268

def visit_False(o)
  'FALSE'
end

#visit_Float(o) ⇒ Object



296
297
298
# File 'lib/sql-parser/sql_visitor.rb', line 296

def visit_Float(o)
  o.value.to_s
end

#visit_FromClause(o) ⇒ Object



56
57
58
# File 'lib/sql-parser/sql_visitor.rb', line 56

def visit_FromClause(o)
  "FROM #{arrayize(o.tables)}"
end

#visit_FullJoin(o) ⇒ Object



212
213
214
# File 'lib/sql-parser/sql_visitor.rb', line 212

def visit_FullJoin(o)
  qualified_join('FULL', o)
end

#visit_FullOuterJoin(o) ⇒ Object



216
217
218
# File 'lib/sql-parser/sql_visitor.rb', line 216

def visit_FullOuterJoin(o)
  qualified_join('FULL OUTER', o)
end

#visit_Greater(o) ⇒ Object



152
153
154
# File 'lib/sql-parser/sql_visitor.rb', line 152

def visit_Greater(o)
  comparison('>', o)
end

#visit_GreaterOrEquals(o) ⇒ Object



144
145
146
# File 'lib/sql-parser/sql_visitor.rb', line 144

def visit_GreaterOrEquals(o)
  comparison('>=', o)
end

#visit_GroupByClause(o) ⇒ Object



76
77
78
# File 'lib/sql-parser/sql_visitor.rb', line 76

def visit_GroupByClause(o)
  "GROUP BY #{arrayize(o.columns)}"
end

#visit_HavingClause(o) ⇒ Object



72
73
74
# File 'lib/sql-parser/sql_visitor.rb', line 72

def visit_HavingClause(o)
  "HAVING #{visit(o.search_condition)}"
end

#visit_In(o) ⇒ Object



124
125
126
127
128
129
130
# File 'lib/sql-parser/sql_visitor.rb', line 124

def visit_In(o)
  if @negated
    comparison('NOT IN', o)
  else
    comparison('IN', o)
  end
end

#visit_InnerJoin(o) ⇒ Object



192
193
194
# File 'lib/sql-parser/sql_visitor.rb', line 192

def visit_InnerJoin(o)
  qualified_join('INNER', o)
end

#visit_Integer(o) ⇒ Object



300
301
302
# File 'lib/sql-parser/sql_visitor.rb', line 300

def visit_Integer(o)
  o.value.to_s
end

#visit_InValueList(o) ⇒ Object



132
133
134
# File 'lib/sql-parser/sql_visitor.rb', line 132

def visit_InValueList(o)
  "(#{arrayize(o.values)})"
end

#visit_Is(o) ⇒ Object



108
109
110
111
112
113
114
# File 'lib/sql-parser/sql_visitor.rb', line 108

def visit_Is(o)
  if @negated
    comparison('IS NOT', o)
  else
    comparison('IS', o)
  end
end

#visit_LeftJoin(o) ⇒ Object



196
197
198
# File 'lib/sql-parser/sql_visitor.rb', line 196

def visit_LeftJoin(o)
  qualified_join('LEFT', o)
end

#visit_LeftOuterJoin(o) ⇒ Object



200
201
202
# File 'lib/sql-parser/sql_visitor.rb', line 200

def visit_LeftOuterJoin(o)
  qualified_join('LEFT OUTER', o)
end

#visit_Less(o) ⇒ Object



156
157
158
# File 'lib/sql-parser/sql_visitor.rb', line 156

def visit_Less(o)
  comparison('<', o)
end

#visit_LessOrEquals(o) ⇒ Object



148
149
150
# File 'lib/sql-parser/sql_visitor.rb', line 148

def visit_LessOrEquals(o)
  comparison('<=', o)
end

#visit_Like(o) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/sql-parser/sql_visitor.rb', line 116

def visit_Like(o)
  if @negated
    comparison('NOT LIKE', o)
  else
    comparison('LIKE', o)
  end
end

#visit_Maximum(o) ⇒ Object



176
177
178
# File 'lib/sql-parser/sql_visitor.rb', line 176

def visit_Maximum(o)
  aggregate('MAX', o)
end

#visit_Minimum(o) ⇒ Object



172
173
174
# File 'lib/sql-parser/sql_visitor.rb', line 172

def visit_Minimum(o)
  aggregate('MIN', o)
end

#visit_Multiply(o) ⇒ Object



236
237
238
# File 'lib/sql-parser/sql_visitor.rb', line 236

def visit_Multiply(o)
  arithmetic('*', o)
end

#visit_Not(o) ⇒ Object



252
253
254
# File 'lib/sql-parser/sql_visitor.rb', line 252

def visit_Not(o)
  negate { visit(o.value) }
end

#visit_Null(o) ⇒ Object



272
273
274
# File 'lib/sql-parser/sql_visitor.rb', line 272

def visit_Null(o)
  'NULL'
end

#visit_On(o) ⇒ Object



84
85
86
# File 'lib/sql-parser/sql_visitor.rb', line 84

def visit_On(o)
  "ON #{visit(o.search_condition)}"
end

#visit_Or(o) ⇒ Object



92
93
94
# File 'lib/sql-parser/sql_visitor.rb', line 92

def visit_Or(o)
  search_condition('OR', o)
end

#visit_OrderBy(o) ⇒ Object



20
21
22
# File 'lib/sql-parser/sql_visitor.rb', line 20

def visit_OrderBy(o)
  "ORDER BY #{arrayize(o.sort_specification)}"
end

#visit_OrderClause(o) ⇒ Object



60
61
62
# File 'lib/sql-parser/sql_visitor.rb', line 60

def visit_OrderClause(o)
  "ORDER BY #{arrayize(o.columns)}"
end

#visit_QualifiedColumn(o) ⇒ Object



224
225
226
# File 'lib/sql-parser/sql_visitor.rb', line 224

def visit_QualifiedColumn(o)
  "#{visit(o.table)}.#{visit(o.column)}"
end

#visit_RightJoin(o) ⇒ Object



204
205
206
# File 'lib/sql-parser/sql_visitor.rb', line 204

def visit_RightJoin(o)
  qualified_join('RIGHT', o)
end

#visit_RightOuterJoin(o) ⇒ Object



208
209
210
# File 'lib/sql-parser/sql_visitor.rb', line 208

def visit_RightOuterJoin(o)
  qualified_join('RIGHT OUTER', o)
end

#visit_Select(o) ⇒ Object



28
29
30
31
32
33
# File 'lib/sql-parser/sql_visitor.rb', line 28

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



35
36
37
# File 'lib/sql-parser/sql_visitor.rb', line 35

def visit_SelectList(o)
  arrayize(o.columns)
end

#visit_String(o) ⇒ Object



288
289
290
# File 'lib/sql-parser/sql_visitor.rb', line 288

def visit_String(o)
  "'%s'" % escape(o.value)
end

#visit_Subquery(o) ⇒ Object



24
25
26
# File 'lib/sql-parser/sql_visitor.rb', line 24

def visit_Subquery(o)
  "(#{visit(o.query_specification)})"
end

#visit_Subtract(o) ⇒ Object



248
249
250
# File 'lib/sql-parser/sql_visitor.rb', line 248

def visit_Subtract(o)
  arithmetic('-', o)
end

#visit_Sum(o) ⇒ Object



168
169
170
# File 'lib/sql-parser/sql_visitor.rb', line 168

def visit_Sum(o)
  aggregate('SUM', o)
end

#visit_Table(o) ⇒ Object



220
221
222
# File 'lib/sql-parser/sql_visitor.rb', line 220

def visit_Table(o)
  quote(o.name)
end

#visit_TableExpression(o) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/sql-parser/sql_visitor.rb', line 47

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



264
265
266
# File 'lib/sql-parser/sql_visitor.rb', line 264

def visit_True(o)
  'TRUE'
end

#visit_UnaryMinus(o) ⇒ Object



260
261
262
# File 'lib/sql-parser/sql_visitor.rb', line 260

def visit_UnaryMinus(o)
  "-#{visit(o.value)}"
end

#visit_UnaryPlus(o) ⇒ Object



256
257
258
# File 'lib/sql-parser/sql_visitor.rb', line 256

def visit_UnaryPlus(o)
  "+#{visit(o.value)}"
end

#visit_Using(o) ⇒ Object



88
89
90
# File 'lib/sql-parser/sql_visitor.rb', line 88

def visit_Using(o)
  "USING (#{arrayize(o.columns)})"
end

#visit_WhereClause(o) ⇒ Object



80
81
82
# File 'lib/sql-parser/sql_visitor.rb', line 80

def visit_WhereClause(o)
  "WHERE #{visit(o.search_condition)}"
end