Skip to content

Commit ced1da9

Browse files
authored
Merge pull request rails#42128 from flavorjones/flavorjones-clean-up-arel-visitor-dot
clean up Arel::Visitors::Dot
2 parents 58f26fc + d478b0f commit ced1da9

File tree

4 files changed

+253
-88
lines changed

4 files changed

+253
-88
lines changed

activerecord/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
* `Arel::Visitors::Dot` now renders a complete set of properties when visiting
2+
`Arel::Nodes::SelectCore`, `SelectStatement`, `InsertStatement`, `UpdateStatement`, and
3+
`DeleteStatement`, which fixes #42026. Previously, some properties were omitted.
4+
5+
*Mike Dalessio*
6+
7+
* `Arel::Visitors::Dot` now supports `Arel::Nodes::Bin`, `Case`, `CurrentRow`, `Distinct`,
8+
`DistinctOn`, `Else`, `Except`, `InfixOperation`, `Intersect`, `Lock`, `NotRegexp`, `Quoted`,
9+
`Regexp`, `UnaryOperation`, `Union`, `UnionAll`, `When`, and `With`. Previously, these node
10+
types caused an exception to be raised by `Arel::Visitors::Dot#accept`.
11+
12+
*Mike Dalessio*
13+
114
* Optimize `remove_columns` to use a single SQL statement.
215

316
```ruby

activerecord/lib/arel/visitors/dot.rb

Lines changed: 79 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,40 @@ def accept(object, collector)
3131
end
3232

3333
private
34+
def visit_Arel_Nodes_Function(o)
35+
visit_edge o, "expressions"
36+
visit_edge o, "distinct"
37+
visit_edge o, "alias"
38+
end
39+
40+
def visit_Arel_Nodes_Unary(o)
41+
visit_edge o, "expr"
42+
end
43+
44+
def visit_Arel_Nodes_Binary(o)
45+
visit_edge o, "left"
46+
visit_edge o, "right"
47+
end
48+
49+
def visit_Arel_Nodes_UnaryOperation(o)
50+
visit_edge o, "operator"
51+
visit_edge o, "expr"
52+
end
53+
54+
def visit_Arel_Nodes_InfixOperation(o)
55+
visit_edge o, "operator"
56+
visit_edge o, "left"
57+
visit_edge o, "right"
58+
end
59+
60+
def visit__regexp(o)
61+
visit_edge o, "left"
62+
visit_edge o, "right"
63+
visit_edge o, "case_sensitive"
64+
end
65+
alias :visit_Arel_Nodes_Regexp :visit__regexp
66+
alias :visit_Arel_Nodes_NotRegexp :visit__regexp
67+
3468
def visit_Arel_Nodes_Ordering(o)
3569
visit_edge o, "expr"
3670
end
@@ -53,71 +87,29 @@ def visit_Arel_Nodes_StringJoin(o)
5387
visit_edge o, "left"
5488
end
5589

56-
def visit_Arel_Nodes_InnerJoin(o)
57-
visit_edge o, "left"
58-
visit_edge o, "right"
59-
end
60-
alias :visit_Arel_Nodes_FullOuterJoin :visit_Arel_Nodes_InnerJoin
61-
alias :visit_Arel_Nodes_OuterJoin :visit_Arel_Nodes_InnerJoin
62-
alias :visit_Arel_Nodes_RightOuterJoin :visit_Arel_Nodes_InnerJoin
63-
64-
def visit_Arel_Nodes_DeleteStatement(o)
65-
visit_edge o, "relation"
66-
visit_edge o, "wheres"
67-
end
68-
69-
def unary(o)
70-
visit_edge o, "expr"
71-
end
72-
alias :visit_Arel_Nodes_Group :unary
73-
alias :visit_Arel_Nodes_Cube :unary
74-
alias :visit_Arel_Nodes_RollUp :unary
75-
alias :visit_Arel_Nodes_GroupingSet :unary
76-
alias :visit_Arel_Nodes_GroupingElement :unary
77-
alias :visit_Arel_Nodes_Grouping :unary
78-
alias :visit_Arel_Nodes_Having :unary
79-
alias :visit_Arel_Nodes_Limit :unary
80-
alias :visit_Arel_Nodes_Not :unary
81-
alias :visit_Arel_Nodes_Offset :unary
82-
alias :visit_Arel_Nodes_On :unary
83-
alias :visit_Arel_Nodes_UnqualifiedColumn :unary
84-
alias :visit_Arel_Nodes_OptimizerHints :unary
85-
alias :visit_Arel_Nodes_Preceding :unary
86-
alias :visit_Arel_Nodes_Following :unary
87-
alias :visit_Arel_Nodes_Rows :unary
88-
alias :visit_Arel_Nodes_Range :unary
89-
90-
def window(o)
90+
def visit_Arel_Nodes_Window(o)
9191
visit_edge o, "partitions"
9292
visit_edge o, "orders"
9393
visit_edge o, "framing"
9494
end
95-
alias :visit_Arel_Nodes_Window :window
9695

97-
def named_window(o)
96+
def visit_Arel_Nodes_NamedWindow(o)
9897
visit_edge o, "partitions"
9998
visit_edge o, "orders"
10099
visit_edge o, "framing"
101100
visit_edge o, "name"
102101
end
103-
alias :visit_Arel_Nodes_NamedWindow :named_window
104102

105-
def function(o)
106-
visit_edge o, "expressions"
107-
visit_edge o, "distinct"
108-
visit_edge o, "alias"
103+
def visit__no_edges(o)
104+
# intentionally left blank
109105
end
110-
alias :visit_Arel_Nodes_Exists :function
111-
alias :visit_Arel_Nodes_Min :function
112-
alias :visit_Arel_Nodes_Max :function
113-
alias :visit_Arel_Nodes_Avg :function
114-
alias :visit_Arel_Nodes_Sum :function
106+
alias :visit_Arel_Nodes_CurrentRow :visit__no_edges
107+
alias :visit_Arel_Nodes_Distinct :visit__no_edges
115108

116-
def extract(o)
109+
def visit_Arel_Nodes_Extract(o)
117110
visit_edge o, "expressions"
118111
visit_edge o, "alias"
119112
end
120-
alias :visit_Arel_Nodes_Extract :extract
121113

122114
def visit_Arel_Nodes_NamedFunction(o)
123115
visit_edge o, "name"
@@ -130,26 +122,47 @@ def visit_Arel_Nodes_InsertStatement(o)
130122
visit_edge o, "relation"
131123
visit_edge o, "columns"
132124
visit_edge o, "values"
125+
visit_edge o, "select"
133126
end
134127

135128
def visit_Arel_Nodes_SelectCore(o)
136129
visit_edge o, "source"
137130
visit_edge o, "projections"
138131
visit_edge o, "wheres"
139-
visit_edge o, "windows"
132+
visit_edge o, "windows"
133+
visit_edge o, "groups"
134+
visit_edge o, "comment"
135+
visit_edge o, "havings"
136+
visit_edge o, "set_quantifier"
137+
visit_edge o, "optimizer_hints"
140138
end
141139

142140
def visit_Arel_Nodes_SelectStatement(o)
143141
visit_edge o, "cores"
144142
visit_edge o, "limit"
145143
visit_edge o, "orders"
146144
visit_edge o, "offset"
145+
visit_edge o, "lock"
146+
visit_edge o, "with"
147147
end
148148

149149
def visit_Arel_Nodes_UpdateStatement(o)
150150
visit_edge o, "relation"
151151
visit_edge o, "wheres"
152152
visit_edge o, "values"
153+
visit_edge o, "orders"
154+
visit_edge o, "limit"
155+
visit_edge o, "offset"
156+
visit_edge o, "key"
157+
end
158+
159+
def visit_Arel_Nodes_DeleteStatement(o)
160+
visit_edge o, "relation"
161+
visit_edge o, "wheres"
162+
visit_edge o, "orders"
163+
visit_edge o, "limit"
164+
visit_edge o, "offset"
165+
visit_edge o, "key"
153166
end
154167

155168
def visit_Arel_Table(o)
@@ -172,36 +185,13 @@ def visit_Arel_Attributes_Attribute(o)
172185
visit_edge o, "name"
173186
end
174187

175-
def nary(o)
176-
o.children.each_with_index do |x, i|
177-
edge(i) { visit x }
188+
def visit__children(o)
189+
o.children.each_with_index do |child, i|
190+
edge(i) { visit child }
178191
end
179192
end
180-
alias :visit_Arel_Nodes_And :nary
181-
182-
def binary(o)
183-
visit_edge o, "left"
184-
visit_edge o, "right"
185-
end
186-
alias :visit_Arel_Nodes_As :binary
187-
alias :visit_Arel_Nodes_Assignment :binary
188-
alias :visit_Arel_Nodes_Between :binary
189-
alias :visit_Arel_Nodes_Concat :binary
190-
alias :visit_Arel_Nodes_DoesNotMatch :binary
191-
alias :visit_Arel_Nodes_Equality :binary
192-
alias :visit_Arel_Nodes_GreaterThan :binary
193-
alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
194-
alias :visit_Arel_Nodes_In :binary
195-
alias :visit_Arel_Nodes_JoinSource :binary
196-
alias :visit_Arel_Nodes_LessThan :binary
197-
alias :visit_Arel_Nodes_LessThanOrEqual :binary
198-
alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
199-
alias :visit_Arel_Nodes_IsDistinctFrom :binary
200-
alias :visit_Arel_Nodes_Matches :binary
201-
alias :visit_Arel_Nodes_NotEqual :binary
202-
alias :visit_Arel_Nodes_NotIn :binary
203-
alias :visit_Arel_Nodes_Or :binary
204-
alias :visit_Arel_Nodes_Over :binary
193+
alias :visit_Arel_Nodes_And :visit__children
194+
alias :visit_Arel_Nodes_With :visit__children
205195

206196
def visit_String(o)
207197
@node_stack.last.fields << o
@@ -219,22 +209,22 @@ def visit_String(o)
219209
alias :visit_Arel_Nodes_SqlLiteral :visit_String
220210

221211
def visit_Arel_Nodes_BindParam(o)
222-
edge("value") { visit o.value }
212+
visit_edge(o, "value")
223213
end
224214

225215
def visit_ActiveModel_Attribute(o)
226-
edge("value_before_type_cast") { visit o.value_before_type_cast }
216+
visit_edge(o, "value_before_type_cast")
227217
end
228218

229219
def visit_Hash(o)
230220
o.each_with_index do |pair, i|
231-
edge("pair_#{i}") { visit pair }
221+
edge("pair_#{i}") { visit pair }
232222
end
233223
end
234224

235225
def visit_Array(o)
236-
o.each_with_index do |x, i|
237-
edge(i) { visit x }
226+
o.each_with_index do |member, i|
227+
edge(i) { visit member }
238228
end
239229
end
240230
alias :visit_Set :visit_Array
@@ -243,6 +233,12 @@ def visit_Arel_Nodes_Comment(o)
243233
visit_edge(o, "values")
244234
end
245235

236+
def visit_Arel_Nodes_Case(o)
237+
visit_edge(o, "case")
238+
visit_edge(o, "conditions")
239+
visit_edge(o, "default")
240+
end
241+
246242
def visit_edge(o, method)
247243
edge(method) { visit o.send(method) }
248244
end

activerecord/lib/arel/visitors/to_sql.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,6 @@ def visit_Arel_Nodes_SelectStatement(o, collector)
132132
end
133133
end
134134

135-
visit_Arel_Nodes_SelectOptions(o, collector)
136-
end
137-
138-
def visit_Arel_Nodes_SelectOptions(o, collector)
139135
collector = maybe_visit o.limit, collector
140136
collector = maybe_visit o.offset, collector
141137
maybe_visit o.lock, collector

0 commit comments

Comments
 (0)