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_Column(o) ⇒ Object
- #visit_Count(o) ⇒ Object
- #visit_CrossJoin(o) ⇒ Object
- #visit_CurrentUser(o) ⇒ Object
- #visit_Date(o) ⇒ Object
- #visit_DateTime(o) ⇒ Object
- #visit_Delete(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_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_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_Limit(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_Update(o) ⇒ Object
- #visit_UpdateColumn(o) ⇒ Object
- #visit_UpdateColumnList(o) ⇒ Object
- #visit_Using(o) ⇒ Object
- #visit_WhereClause(o) ⇒ Object
Constructor Details
#initialize ⇒ 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
283 284 285 |
# File 'lib/sql-parser/sql_visitor.rb', line 283 def visit_Add(o) arithmetic('+', o) end |
#visit_All(o) ⇒ Object
78 79 80 |
# File 'lib/sql-parser/sql_visitor.rb', line 78 def visit_All(o) o.table.nil? ? '*' : "#{visit(o.table)}.*" end |
#visit_And(o) ⇒ Object
131 132 133 |
# File 'lib/sql-parser/sql_visitor.rb', line 131 def visit_And(o) search_condition('AND', o) end |
#visit_ApproximateFloat(o) ⇒ Object
331 332 333 |
# File 'lib/sql-parser/sql_visitor.rb', line 331 def visit_ApproximateFloat(o) "#{visit(o.mantissa)}E#{visit(o.exponent)}" end |
#visit_As(o) ⇒ Object
271 272 273 |
# File 'lib/sql-parser/sql_visitor.rb', line 271 def visit_As(o) "#{visit(o.value)} AS #{visit(o.column)}" end |
#visit_Ascending(o) ⇒ Object
99 100 101 |
# File 'lib/sql-parser/sql_visitor.rb', line 99 def visit_Ascending(o) "#{visit(o.column)} ASC" end |
#visit_Average(o) ⇒ Object
219 220 221 |
# File 'lib/sql-parser/sql_visitor.rb', line 219 def visit_Average(o) aggregate('AVG', o) end |
#visit_Between(o) ⇒ Object
175 176 177 178 179 180 181 |
# File 'lib/sql-parser/sql_visitor.rb', line 175 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
267 268 269 |
# File 'lib/sql-parser/sql_visitor.rb', line 267 def visit_Column(o) quote(o.name) end |
#visit_Count(o) ⇒ Object
223 224 225 |
# File 'lib/sql-parser/sql_visitor.rb', line 223 def visit_Count(o) aggregate('COUNT', o) end |
#visit_CrossJoin(o) ⇒ Object
227 228 229 |
# File 'lib/sql-parser/sql_visitor.rb', line 227 def visit_CrossJoin(o) "#{visit(o.left)} CROSS JOIN #{visit(o.right)}" end |
#visit_CurrentUser(o) ⇒ Object
315 316 317 |
# File 'lib/sql-parser/sql_visitor.rb', line 315 def visit_CurrentUser(o) 'CURRENT_USER' end |
#visit_Date(o) ⇒ Object
323 324 325 |
# File 'lib/sql-parser/sql_visitor.rb', line 323 def visit_Date(o) "DATE '%s'" % escape(o.value.strftime('%Y-%m-%d')) end |
#visit_DateTime(o) ⇒ Object
319 320 321 |
# File 'lib/sql-parser/sql_visitor.rb', line 319 def visit_DateTime(o) "'%s'" % escape(o.value.strftime('%Y-%m-%d %H:%M:%S')) end |
#visit_Delete(o) ⇒ Object
13 14 15 16 17 |
# File 'lib/sql-parser/sql_visitor.rb', line 13 def visit_Delete(o) name = visit(o.from_clause) where_clause = o.where_clause.nil? ? '' : ' ' + visit(o.where_clause) "DELETE #{name}#{where_clause}" end |
#visit_Descending(o) ⇒ Object
103 104 105 |
# File 'lib/sql-parser/sql_visitor.rb', line 103 def visit_Descending(o) "#{visit(o.column)} DESC" end |
#visit_DirectSelect(o) ⇒ Object
43 44 45 46 47 48 49 |
# File 'lib/sql-parser/sql_visitor.rb', line 43 def visit_DirectSelect(o) [ o.query_expression, o.order_by, o.limit_clause ].compact.collect { |e| visit(e) }.join(' ') end |
#visit_Distinct(o) ⇒ Object
74 75 76 |
# File 'lib/sql-parser/sql_visitor.rb', line 74 def visit_Distinct(o) "DISTINCT(#{visit(o.column)})" end |
#visit_Divide(o) ⇒ Object
279 280 281 |
# File 'lib/sql-parser/sql_visitor.rb', line 279 def visit_Divide(o) arithmetic('/', o) end |
#visit_Equals(o) ⇒ Object
199 200 201 202 203 204 205 |
# File 'lib/sql-parser/sql_visitor.rb', line 199 def visit_Equals(o) if @negated comparison('<>', o) else comparison('=', o) end end |
#visit_Exists(o) ⇒ Object
135 136 137 138 139 140 141 |
# File 'lib/sql-parser/sql_visitor.rb', line 135 def visit_Exists(o) if @negated "NOT EXISTS #{visit(o.table_subquery)}" else "EXISTS #{visit(o.table_subquery)}" end end |
#visit_False(o) ⇒ Object
307 308 309 |
# File 'lib/sql-parser/sql_visitor.rb', line 307 def visit_False(o) 'FALSE' end |
#visit_Float(o) ⇒ Object
335 336 337 |
# File 'lib/sql-parser/sql_visitor.rb', line 335 def visit_Float(o) o.value.to_s end |
#visit_FromClause(o) ⇒ Object
91 92 93 |
# File 'lib/sql-parser/sql_visitor.rb', line 91 def visit_FromClause(o) "FROM #{arrayize(o.tables)}" end |
#visit_FullJoin(o) ⇒ Object
251 252 253 |
# File 'lib/sql-parser/sql_visitor.rb', line 251 def visit_FullJoin(o) qualified_join('FULL', o) end |
#visit_FullOuterJoin(o) ⇒ Object
255 256 257 |
# File 'lib/sql-parser/sql_visitor.rb', line 255 def visit_FullOuterJoin(o) qualified_join('FULL OUTER', o) end |
#visit_Greater(o) ⇒ Object
191 192 193 |
# File 'lib/sql-parser/sql_visitor.rb', line 191 def visit_Greater(o) comparison('>', o) end |
#visit_GreaterOrEquals(o) ⇒ Object
183 184 185 |
# File 'lib/sql-parser/sql_visitor.rb', line 183 def visit_GreaterOrEquals(o) comparison('>=', o) end |
#visit_GroupByClause(o) ⇒ Object
111 112 113 |
# File 'lib/sql-parser/sql_visitor.rb', line 111 def visit_GroupByClause(o) "GROUP BY #{arrayize(o.columns)}" end |
#visit_HavingClause(o) ⇒ Object
107 108 109 |
# File 'lib/sql-parser/sql_visitor.rb', line 107 def visit_HavingClause(o) "HAVING #{visit(o.search_condition)}" end |
#visit_In(o) ⇒ Object
159 160 161 162 163 164 165 |
# File 'lib/sql-parser/sql_visitor.rb', line 159 def visit_In(o) if @negated comparison('NOT IN', o) else comparison('IN', o) end end |
#visit_InColumnList(o) ⇒ Object
167 168 169 |
# File 'lib/sql-parser/sql_visitor.rb', line 167 def visit_InColumnList(o) "(#{arrayize(o.columns)})" end |
#visit_InnerJoin(o) ⇒ Object
231 232 233 |
# File 'lib/sql-parser/sql_visitor.rb', line 231 def visit_InnerJoin(o) qualified_join('INNER', o) end |
#visit_Insert(o) ⇒ Object
36 37 38 39 40 41 |
# File 'lib/sql-parser/sql_visitor.rb', line 36 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
339 340 341 |
# File 'lib/sql-parser/sql_visitor.rb', line 339 def visit_Integer(o) o.value.to_s end |
#visit_InValueList(o) ⇒ Object
171 172 173 |
# File 'lib/sql-parser/sql_visitor.rb', line 171 def visit_InValueList(o) "(#{arrayize(o.values)})" end |
#visit_Is(o) ⇒ Object
143 144 145 146 147 148 149 |
# File 'lib/sql-parser/sql_visitor.rb', line 143 def visit_Is(o) if @negated comparison('IS NOT', o) else comparison('IS', o) end end |
#visit_LeftJoin(o) ⇒ Object
235 236 237 |
# File 'lib/sql-parser/sql_visitor.rb', line 235 def visit_LeftJoin(o) qualified_join('LEFT', o) end |
#visit_LeftOuterJoin(o) ⇒ Object
239 240 241 |
# File 'lib/sql-parser/sql_visitor.rb', line 239 def visit_LeftOuterJoin(o) qualified_join('LEFT OUTER', o) end |
#visit_Less(o) ⇒ Object
195 196 197 |
# File 'lib/sql-parser/sql_visitor.rb', line 195 def visit_Less(o) comparison('<', o) end |
#visit_LessOrEquals(o) ⇒ Object
187 188 189 |
# File 'lib/sql-parser/sql_visitor.rb', line 187 def visit_LessOrEquals(o) comparison('<=', o) end |
#visit_Like(o) ⇒ Object
151 152 153 154 155 156 157 |
# File 'lib/sql-parser/sql_visitor.rb', line 151 def visit_Like(o) if @negated comparison('NOT LIKE', o) else comparison('LIKE', o) end end |
#visit_Limit(o) ⇒ Object
55 56 57 |
# File 'lib/sql-parser/sql_visitor.rb', line 55 def visit_Limit(o) "LIMIT #{o.limit_count}" end |
#visit_Maximum(o) ⇒ Object
215 216 217 |
# File 'lib/sql-parser/sql_visitor.rb', line 215 def visit_Maximum(o) aggregate('MAX', o) end |
#visit_Minimum(o) ⇒ Object
211 212 213 |
# File 'lib/sql-parser/sql_visitor.rb', line 211 def visit_Minimum(o) aggregate('MIN', o) end |
#visit_Multiply(o) ⇒ Object
275 276 277 |
# File 'lib/sql-parser/sql_visitor.rb', line 275 def visit_Multiply(o) arithmetic('*', o) end |
#visit_Not(o) ⇒ Object
291 292 293 |
# File 'lib/sql-parser/sql_visitor.rb', line 291 def visit_Not(o) negate { visit(o.value) } end |
#visit_Null(o) ⇒ Object
311 312 313 |
# File 'lib/sql-parser/sql_visitor.rb', line 311 def visit_Null(o) 'NULL' end |
#visit_On(o) ⇒ Object
119 120 121 |
# File 'lib/sql-parser/sql_visitor.rb', line 119 def visit_On(o) "ON #{visit(o.search_condition)}" end |
#visit_Or(o) ⇒ Object
127 128 129 |
# File 'lib/sql-parser/sql_visitor.rb', line 127 def visit_Or(o) search_condition('OR', o) end |
#visit_OrderBy(o) ⇒ Object
51 52 53 |
# File 'lib/sql-parser/sql_visitor.rb', line 51 def visit_OrderBy(o) "ORDER BY #{arrayize(o.sort_specification)}" end |
#visit_OrderClause(o) ⇒ Object
95 96 97 |
# File 'lib/sql-parser/sql_visitor.rb', line 95 def visit_OrderClause(o) "ORDER BY #{arrayize(o.columns)}" end |
#visit_QualifiedColumn(o) ⇒ Object
263 264 265 |
# File 'lib/sql-parser/sql_visitor.rb', line 263 def visit_QualifiedColumn(o) "#{visit(o.table)}.#{visit(o.column)}" end |
#visit_RightJoin(o) ⇒ Object
243 244 245 |
# File 'lib/sql-parser/sql_visitor.rb', line 243 def visit_RightJoin(o) qualified_join('RIGHT', o) end |
#visit_RightOuterJoin(o) ⇒ Object
247 248 249 |
# File 'lib/sql-parser/sql_visitor.rb', line 247 def visit_RightOuterJoin(o) qualified_join('RIGHT OUTER', o) end |
#visit_Select(o) ⇒ Object
63 64 65 66 67 68 |
# File 'lib/sql-parser/sql_visitor.rb', line 63 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
70 71 72 |
# File 'lib/sql-parser/sql_visitor.rb', line 70 def visit_SelectList(o) arrayize(o.columns) end |
#visit_String(o) ⇒ Object
327 328 329 |
# File 'lib/sql-parser/sql_visitor.rb', line 327 def visit_String(o) "'%s'" % escape(o.value) end |
#visit_Subquery(o) ⇒ Object
59 60 61 |
# File 'lib/sql-parser/sql_visitor.rb', line 59 def visit_Subquery(o) "(#{visit(o.query_specification)})" end |
#visit_Subtract(o) ⇒ Object
287 288 289 |
# File 'lib/sql-parser/sql_visitor.rb', line 287 def visit_Subtract(o) arithmetic('-', o) end |
#visit_Sum(o) ⇒ Object
207 208 209 |
# File 'lib/sql-parser/sql_visitor.rb', line 207 def visit_Sum(o) aggregate('SUM', o) end |
#visit_Table(o) ⇒ Object
259 260 261 |
# File 'lib/sql-parser/sql_visitor.rb', line 259 def visit_Table(o) quote(o.name) end |
#visit_TableExpression(o) ⇒ Object
82 83 84 85 86 87 88 89 |
# File 'lib/sql-parser/sql_visitor.rb', line 82 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
303 304 305 |
# File 'lib/sql-parser/sql_visitor.rb', line 303 def visit_True(o) 'TRUE' end |
#visit_UnaryMinus(o) ⇒ Object
299 300 301 |
# File 'lib/sql-parser/sql_visitor.rb', line 299 def visit_UnaryMinus(o) "-#{visit(o.value)}" end |
#visit_UnaryPlus(o) ⇒ Object
295 296 297 |
# File 'lib/sql-parser/sql_visitor.rb', line 295 def visit_UnaryPlus(o) "+#{visit(o.value)}" end |
#visit_Update(o) ⇒ Object
19 20 21 22 23 24 |
# File 'lib/sql-parser/sql_visitor.rb', line 19 def visit_Update(o) name = visit(o.table_reference) update_column_list = visit(o.update_column_list) where_clause = o.where_clause.nil? ? '' : ' ' + visit(o.where_clause) "UPDATE #{name} SET #{update_column_list}#{where_clause}" end |
#visit_UpdateColumn(o) ⇒ Object
26 27 28 29 30 |
# File 'lib/sql-parser/sql_visitor.rb', line 26 def visit_UpdateColumn(o) column = visit(o.column) value = visit(o.value) "#{column} = #{value}" end |
#visit_UpdateColumnList(o) ⇒ Object
32 33 34 |
# File 'lib/sql-parser/sql_visitor.rb', line 32 def visit_UpdateColumnList(o) arrayize(o.update_columns) end |
#visit_Using(o) ⇒ Object
123 124 125 |
# File 'lib/sql-parser/sql_visitor.rb', line 123 def visit_Using(o) "USING (#{arrayize(o.columns)})" end |
#visit_WhereClause(o) ⇒ Object
115 116 117 |
# File 'lib/sql-parser/sql_visitor.rb', line 115 def visit_WhereClause(o) "WHERE #{visit(o.search_condition)}" end |