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_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
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
278 279 280 |
# File 'lib/sql-parser/sql_visitor.rb', line 278 def visit_Add(o) arithmetic('+', o) end |
#visit_All(o) ⇒ Object
73 74 75 |
# File 'lib/sql-parser/sql_visitor.rb', line 73 def visit_All(o) '*' end |
#visit_And(o) ⇒ Object
126 127 128 |
# File 'lib/sql-parser/sql_visitor.rb', line 126 def visit_And(o) search_condition('AND', o) end |
#visit_ApproximateFloat(o) ⇒ Object
326 327 328 |
# File 'lib/sql-parser/sql_visitor.rb', line 326 def visit_ApproximateFloat(o) "#{visit(o.mantissa)}E#{visit(o.exponent)}" end |
#visit_As(o) ⇒ Object
266 267 268 |
# File 'lib/sql-parser/sql_visitor.rb', line 266 def visit_As(o) "#{visit(o.value)} AS #{visit(o.column)}" end |
#visit_Ascending(o) ⇒ Object
94 95 96 |
# File 'lib/sql-parser/sql_visitor.rb', line 94 def visit_Ascending(o) "#{visit(o.column)} ASC" end |
#visit_Average(o) ⇒ Object
214 215 216 |
# File 'lib/sql-parser/sql_visitor.rb', line 214 def visit_Average(o) aggregate('AVG', o) end |
#visit_Between(o) ⇒ Object
170 171 172 173 174 175 176 |
# File 'lib/sql-parser/sql_visitor.rb', line 170 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
262 263 264 |
# File 'lib/sql-parser/sql_visitor.rb', line 262 def visit_Column(o) quote(o.name) end |
#visit_Count(o) ⇒ Object
218 219 220 |
# File 'lib/sql-parser/sql_visitor.rb', line 218 def visit_Count(o) aggregate('COUNT', o) end |
#visit_CrossJoin(o) ⇒ Object
222 223 224 |
# File 'lib/sql-parser/sql_visitor.rb', line 222 def visit_CrossJoin(o) "#{visit(o.left)} CROSS JOIN #{visit(o.right)}" end |
#visit_CurrentUser(o) ⇒ Object
310 311 312 |
# File 'lib/sql-parser/sql_visitor.rb', line 310 def visit_CurrentUser(o) 'CURRENT_USER' end |
#visit_Date(o) ⇒ Object
318 319 320 |
# File 'lib/sql-parser/sql_visitor.rb', line 318 def visit_Date(o) "DATE '%s'" % escape(o.value.strftime('%Y-%m-%d')) end |
#visit_DateTime(o) ⇒ Object
314 315 316 |
# File 'lib/sql-parser/sql_visitor.rb', line 314 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
98 99 100 |
# File 'lib/sql-parser/sql_visitor.rb', line 98 def visit_Descending(o) "#{visit(o.column)} DESC" end |
#visit_DirectSelect(o) ⇒ Object
43 44 45 46 47 48 |
# File 'lib/sql-parser/sql_visitor.rb', line 43 def visit_DirectSelect(o) [ o.query_expression, o.order_by ].compact.collect { |e| visit(e) }.join(' ') end |
#visit_Distinct(o) ⇒ Object
69 70 71 |
# File 'lib/sql-parser/sql_visitor.rb', line 69 def visit_Distinct(o) "DISTINCT(#{visit(o.column)})" end |
#visit_Divide(o) ⇒ Object
274 275 276 |
# File 'lib/sql-parser/sql_visitor.rb', line 274 def visit_Divide(o) arithmetic('/', o) end |
#visit_Equals(o) ⇒ Object
194 195 196 197 198 199 200 |
# File 'lib/sql-parser/sql_visitor.rb', line 194 def visit_Equals(o) if @negated comparison('<>', o) else comparison('=', o) end end |
#visit_Exists(o) ⇒ Object
130 131 132 133 134 135 136 |
# File 'lib/sql-parser/sql_visitor.rb', line 130 def visit_Exists(o) if @negated "NOT EXISTS #{visit(o.table_subquery)}" else "EXISTS #{visit(o.table_subquery)}" end end |
#visit_False(o) ⇒ Object
302 303 304 |
# File 'lib/sql-parser/sql_visitor.rb', line 302 def visit_False(o) 'FALSE' end |
#visit_Float(o) ⇒ Object
330 331 332 |
# File 'lib/sql-parser/sql_visitor.rb', line 330 def visit_Float(o) o.value.to_s end |
#visit_FromClause(o) ⇒ Object
86 87 88 |
# File 'lib/sql-parser/sql_visitor.rb', line 86 def visit_FromClause(o) "FROM #{arrayize(o.tables)}" end |
#visit_FullJoin(o) ⇒ Object
246 247 248 |
# File 'lib/sql-parser/sql_visitor.rb', line 246 def visit_FullJoin(o) qualified_join('FULL', o) end |
#visit_FullOuterJoin(o) ⇒ Object
250 251 252 |
# File 'lib/sql-parser/sql_visitor.rb', line 250 def visit_FullOuterJoin(o) qualified_join('FULL OUTER', o) end |
#visit_Greater(o) ⇒ Object
186 187 188 |
# File 'lib/sql-parser/sql_visitor.rb', line 186 def visit_Greater(o) comparison('>', o) end |
#visit_GreaterOrEquals(o) ⇒ Object
178 179 180 |
# File 'lib/sql-parser/sql_visitor.rb', line 178 def visit_GreaterOrEquals(o) comparison('>=', o) end |
#visit_GroupByClause(o) ⇒ Object
106 107 108 |
# File 'lib/sql-parser/sql_visitor.rb', line 106 def visit_GroupByClause(o) "GROUP BY #{arrayize(o.columns)}" end |
#visit_HavingClause(o) ⇒ Object
102 103 104 |
# File 'lib/sql-parser/sql_visitor.rb', line 102 def visit_HavingClause(o) "HAVING #{visit(o.search_condition)}" end |
#visit_In(o) ⇒ Object
154 155 156 157 158 159 160 |
# File 'lib/sql-parser/sql_visitor.rb', line 154 def visit_In(o) if @negated comparison('NOT IN', o) else comparison('IN', o) end end |
#visit_InColumnList(o) ⇒ Object
162 163 164 |
# File 'lib/sql-parser/sql_visitor.rb', line 162 def visit_InColumnList(o) "(#{arrayize(o.columns)})" end |
#visit_InnerJoin(o) ⇒ Object
226 227 228 |
# File 'lib/sql-parser/sql_visitor.rb', line 226 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
334 335 336 |
# File 'lib/sql-parser/sql_visitor.rb', line 334 def visit_Integer(o) o.value.to_s end |
#visit_InValueList(o) ⇒ Object
166 167 168 |
# File 'lib/sql-parser/sql_visitor.rb', line 166 def visit_InValueList(o) "(#{arrayize(o.values)})" end |
#visit_Is(o) ⇒ Object
138 139 140 141 142 143 144 |
# File 'lib/sql-parser/sql_visitor.rb', line 138 def visit_Is(o) if @negated comparison('IS NOT', o) else comparison('IS', o) end end |
#visit_LeftJoin(o) ⇒ Object
230 231 232 |
# File 'lib/sql-parser/sql_visitor.rb', line 230 def visit_LeftJoin(o) qualified_join('LEFT', o) end |
#visit_LeftOuterJoin(o) ⇒ Object
234 235 236 |
# File 'lib/sql-parser/sql_visitor.rb', line 234 def visit_LeftOuterJoin(o) qualified_join('LEFT OUTER', o) end |
#visit_Less(o) ⇒ Object
190 191 192 |
# File 'lib/sql-parser/sql_visitor.rb', line 190 def visit_Less(o) comparison('<', o) end |
#visit_LessOrEquals(o) ⇒ Object
182 183 184 |
# File 'lib/sql-parser/sql_visitor.rb', line 182 def visit_LessOrEquals(o) comparison('<=', o) end |
#visit_Like(o) ⇒ Object
146 147 148 149 150 151 152 |
# File 'lib/sql-parser/sql_visitor.rb', line 146 def visit_Like(o) if @negated comparison('NOT LIKE', o) else comparison('LIKE', o) end end |
#visit_Maximum(o) ⇒ Object
210 211 212 |
# File 'lib/sql-parser/sql_visitor.rb', line 210 def visit_Maximum(o) aggregate('MAX', o) end |
#visit_Minimum(o) ⇒ Object
206 207 208 |
# File 'lib/sql-parser/sql_visitor.rb', line 206 def visit_Minimum(o) aggregate('MIN', o) end |
#visit_Multiply(o) ⇒ Object
270 271 272 |
# File 'lib/sql-parser/sql_visitor.rb', line 270 def visit_Multiply(o) arithmetic('*', o) end |
#visit_Not(o) ⇒ Object
286 287 288 |
# File 'lib/sql-parser/sql_visitor.rb', line 286 def visit_Not(o) negate { visit(o.value) } end |
#visit_Null(o) ⇒ Object
306 307 308 |
# File 'lib/sql-parser/sql_visitor.rb', line 306 def visit_Null(o) 'NULL' end |
#visit_On(o) ⇒ Object
114 115 116 |
# File 'lib/sql-parser/sql_visitor.rb', line 114 def visit_On(o) "ON #{visit(o.search_condition)}" end |
#visit_Or(o) ⇒ Object
122 123 124 |
# File 'lib/sql-parser/sql_visitor.rb', line 122 def visit_Or(o) search_condition('OR', o) end |
#visit_OrderBy(o) ⇒ Object
50 51 52 |
# File 'lib/sql-parser/sql_visitor.rb', line 50 def visit_OrderBy(o) "ORDER BY #{arrayize(o.sort_specification)}" end |
#visit_OrderClause(o) ⇒ Object
90 91 92 |
# File 'lib/sql-parser/sql_visitor.rb', line 90 def visit_OrderClause(o) "ORDER BY #{arrayize(o.columns)}" end |
#visit_QualifiedColumn(o) ⇒ Object
258 259 260 |
# File 'lib/sql-parser/sql_visitor.rb', line 258 def visit_QualifiedColumn(o) "#{visit(o.table)}.#{visit(o.column)}" end |
#visit_RightJoin(o) ⇒ Object
238 239 240 |
# File 'lib/sql-parser/sql_visitor.rb', line 238 def visit_RightJoin(o) qualified_join('RIGHT', o) end |
#visit_RightOuterJoin(o) ⇒ Object
242 243 244 |
# File 'lib/sql-parser/sql_visitor.rb', line 242 def visit_RightOuterJoin(o) qualified_join('RIGHT OUTER', o) end |
#visit_Select(o) ⇒ Object
58 59 60 61 62 63 |
# File 'lib/sql-parser/sql_visitor.rb', line 58 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
65 66 67 |
# File 'lib/sql-parser/sql_visitor.rb', line 65 def visit_SelectList(o) arrayize(o.columns) end |
#visit_String(o) ⇒ Object
322 323 324 |
# File 'lib/sql-parser/sql_visitor.rb', line 322 def visit_String(o) "'%s'" % escape(o.value) end |
#visit_Subquery(o) ⇒ Object
54 55 56 |
# File 'lib/sql-parser/sql_visitor.rb', line 54 def visit_Subquery(o) "(#{visit(o.query_specification)})" end |
#visit_Subtract(o) ⇒ Object
282 283 284 |
# File 'lib/sql-parser/sql_visitor.rb', line 282 def visit_Subtract(o) arithmetic('-', o) end |
#visit_Sum(o) ⇒ Object
202 203 204 |
# File 'lib/sql-parser/sql_visitor.rb', line 202 def visit_Sum(o) aggregate('SUM', o) end |
#visit_Table(o) ⇒ Object
254 255 256 |
# File 'lib/sql-parser/sql_visitor.rb', line 254 def visit_Table(o) quote(o.name) end |
#visit_TableExpression(o) ⇒ Object
77 78 79 80 81 82 83 84 |
# File 'lib/sql-parser/sql_visitor.rb', line 77 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
298 299 300 |
# File 'lib/sql-parser/sql_visitor.rb', line 298 def visit_True(o) 'TRUE' end |
#visit_UnaryMinus(o) ⇒ Object
294 295 296 |
# File 'lib/sql-parser/sql_visitor.rb', line 294 def visit_UnaryMinus(o) "-#{visit(o.value)}" end |
#visit_UnaryPlus(o) ⇒ Object
290 291 292 |
# File 'lib/sql-parser/sql_visitor.rb', line 290 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
118 119 120 |
# File 'lib/sql-parser/sql_visitor.rb', line 118 def visit_Using(o) "USING (#{arrayize(o.columns)})" end |
#visit_WhereClause(o) ⇒ Object
110 111 112 |
# File 'lib/sql-parser/sql_visitor.rb', line 110 def visit_WhereClause(o) "WHERE #{visit(o.search_condition)}" end |