arel_toolkit 0.4.3 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/coverage.yml +48 -0
  3. data/.github/workflows/test.yml +68 -0
  4. data/.gitignore +3 -1
  5. data/.rubocop.yml +2 -0
  6. data/.ruby-version +1 -1
  7. data/.tool-versions +1 -0
  8. data/Appraisals +4 -0
  9. data/CHANGELOG.md +49 -3
  10. data/Gemfile.lock +134 -84
  11. data/README.md +20 -3
  12. data/arel_toolkit.gemspec +3 -5
  13. data/bin/console +2 -1
  14. data/bin/setup +23 -2
  15. data/docker-compose.yml +11 -0
  16. data/gemfiles/active_record_6.gemfile +3 -3
  17. data/gemfiles/active_record_6.gemfile.lock +9 -7
  18. data/gemfiles/active_record_6_1.gemfile +7 -0
  19. data/gemfiles/active_record_6_1.gemfile.lock +263 -0
  20. data/gemfiles/arel_gems.gemfile.lock +9 -7
  21. data/gemfiles/default.gemfile.lock +9 -7
  22. data/lib/arel/enhance/context_enhancer/arel_table.rb +20 -0
  23. data/lib/arel/enhance/node.rb +20 -12
  24. data/lib/arel/enhance/visitor.rb +1 -1
  25. data/lib/arel/enhance.rb +2 -2
  26. data/lib/arel/extensions/conflict.rb +3 -3
  27. data/lib/arel/extensions/delete_statement.rb +19 -14
  28. data/lib/arel/extensions/infer.rb +2 -2
  29. data/lib/arel/extensions/insert_statement.rb +3 -3
  30. data/lib/arel/extensions/overlaps.rb +7 -1
  31. data/lib/arel/extensions/table.rb +7 -2
  32. data/lib/arel/extensions/transaction.rb +9 -9
  33. data/lib/arel/extensions/tree_manager.rb +0 -5
  34. data/lib/arel/extensions/update_statement.rb +8 -22
  35. data/lib/arel/sql_to_arel/pg_query_visitor/frame_options.rb +37 -5
  36. data/lib/arel/sql_to_arel/pg_query_visitor.rb +430 -521
  37. data/lib/arel/transformer/prefix_schema_name.rb +5 -3
  38. data/lib/arel/transformer.rb +0 -1
  39. data/lib/arel_toolkit/version.rb +1 -1
  40. metadata +15 -12
  41. data/.github/workflows/develop.yml +0 -90
  42. data/.github/workflows/master.yml +0 -67
  43. data/lib/arel/transformer/remove_active_record_info.rb +0 -40
@@ -1,7 +1,7 @@
1
1
  # This file was generated by Appraisal
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
- gem 'activerecord', '~> 6.0.0'
5
+ gem "activerecord", "~> 6.0.0"
6
6
 
7
- gemspec path: '../'
7
+ gemspec path: "../"
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- arel_toolkit (0.4.2)
5
- activerecord
4
+ arel_toolkit (0.4.7)
5
+ activerecord (>= 5.0.0)
6
6
  pg (~> 1.1.4)
7
- pg_query (~> 1.2.0)
7
+ pg_query (~> 2.1)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
@@ -23,7 +23,7 @@ GEM
23
23
  addressable (2.7.0)
24
24
  public_suffix (>= 2.0.2, < 5.0)
25
25
  ansi (1.5.0)
26
- appraisal (2.2.0)
26
+ appraisal (2.4.1)
27
27
  bundler
28
28
  rake
29
29
  thor (>= 0.14.0)
@@ -55,6 +55,7 @@ GEM
55
55
  rainbow (>= 2.2.1)
56
56
  rake (>= 10.0)
57
57
  retriable (~> 3.0)
58
+ google-protobuf (3.19.4-x86_64-darwin)
58
59
  guard (2.16.2)
59
60
  formatador (>= 0.2.4)
60
61
  listen (>= 2.7, < 4.0)
@@ -104,7 +105,8 @@ GEM
104
105
  parser (2.7.2.0)
105
106
  ast (~> 2.4.1)
106
107
  pg (1.1.4)
107
- pg_query (1.2.0)
108
+ pg_query (2.1.3)
109
+ google-protobuf (>= 3.19.2)
108
110
  pry (0.12.2)
109
111
  coderay (~> 1.1.0)
110
112
  method_source (~> 0.9.0)
@@ -180,7 +182,7 @@ PLATFORMS
180
182
 
181
183
  DEPENDENCIES
182
184
  activerecord (~> 6.0.0)
183
- appraisal (~> 2.2.0)
185
+ appraisal (~> 2.4.1)
184
186
  approvals (~> 0.0.24)
185
187
  arel_toolkit!
186
188
  bundler (~> 2.0)
@@ -207,4 +209,4 @@ DEPENDENCIES
207
209
  stackprof (~> 0.2)
208
210
 
209
211
  BUNDLED WITH
210
- 2.0.2
212
+ 2.3.6
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", "~> 6.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,263 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ arel_toolkit (0.4.7)
5
+ activerecord (>= 5.0.0)
6
+ pg (~> 1.1.4)
7
+ pg_query (~> 2.1)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (6.1.4.1)
13
+ activesupport (= 6.1.4.1)
14
+ activerecord (6.1.4.1)
15
+ activemodel (= 6.1.4.1)
16
+ activesupport (= 6.1.4.1)
17
+ activesupport (6.1.4.1)
18
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
+ i18n (>= 1.6, < 2)
20
+ minitest (>= 5.1)
21
+ tzinfo (~> 2.0)
22
+ zeitwerk (~> 2.3)
23
+ addressable (2.8.0)
24
+ public_suffix (>= 2.0.2, < 5.0)
25
+ ansi (1.5.0)
26
+ appraisal (2.4.1)
27
+ bundler
28
+ rake
29
+ thor (>= 0.14.0)
30
+ approvals (0.0.25)
31
+ nokogiri (~> 1.8)
32
+ thor (~> 1.0)
33
+ ast (2.4.2)
34
+ async (1.30.1)
35
+ console (~> 1.10)
36
+ nio4r (~> 2.3)
37
+ timers (~> 4.1)
38
+ async-http (0.56.5)
39
+ async (>= 1.25)
40
+ async-io (>= 1.28)
41
+ async-pool (>= 0.2)
42
+ protocol-http (~> 0.22.0)
43
+ protocol-http1 (~> 0.14.0)
44
+ protocol-http2 (~> 0.14.0)
45
+ async-http-faraday (0.11.0)
46
+ async-http (~> 0.42)
47
+ faraday
48
+ async-io (1.32.2)
49
+ async
50
+ async-pool (0.3.8)
51
+ async (>= 1.25)
52
+ binding_of_caller (1.0.0)
53
+ debug_inspector (>= 0.0.1)
54
+ coderay (1.1.3)
55
+ concurrent-ruby (1.1.9)
56
+ console (1.13.1)
57
+ fiber-local
58
+ database_cleaner (1.7.0)
59
+ debug_inspector (1.1.0)
60
+ diff-lcs (1.4.4)
61
+ docile (1.4.0)
62
+ dpl (1.10.16)
63
+ faraday (1.8.0)
64
+ faraday-em_http (~> 1.0)
65
+ faraday-em_synchrony (~> 1.0)
66
+ faraday-excon (~> 1.1)
67
+ faraday-httpclient (~> 1.0.1)
68
+ faraday-net_http (~> 1.0)
69
+ faraday-net_http_persistent (~> 1.1)
70
+ faraday-patron (~> 1.0)
71
+ faraday-rack (~> 1.0)
72
+ multipart-post (>= 1.2, < 3)
73
+ ruby2_keywords (>= 0.0.4)
74
+ faraday-em_http (1.0.0)
75
+ faraday-em_synchrony (1.0.0)
76
+ faraday-excon (1.1.0)
77
+ faraday-http-cache (2.2.0)
78
+ faraday (>= 0.8)
79
+ faraday-httpclient (1.0.1)
80
+ faraday-net_http (1.0.1)
81
+ faraday-net_http_persistent (1.2.0)
82
+ faraday-patron (1.0.0)
83
+ faraday-rack (1.0.0)
84
+ ffi (1.15.4)
85
+ fiber-local (1.0.0)
86
+ formatador (0.3.0)
87
+ github_changelog_generator (1.16.4)
88
+ activesupport
89
+ async (>= 1.25.0)
90
+ async-http-faraday
91
+ faraday-http-cache
92
+ multi_json
93
+ octokit (~> 4.6)
94
+ rainbow (>= 2.2.1)
95
+ rake (>= 10.0)
96
+ google-protobuf (3.19.4-x86_64-darwin)
97
+ guard (2.17.0)
98
+ formatador (>= 0.2.4)
99
+ listen (>= 2.7, < 4.0)
100
+ lumberjack (>= 1.0.12, < 2.0)
101
+ nenv (~> 0.1)
102
+ notiffany (~> 0.0)
103
+ pry (>= 0.9.12)
104
+ shellany (~> 0.0)
105
+ thor (>= 0.18.1)
106
+ guard-compat (1.2.1)
107
+ guard-rake (1.0.0)
108
+ guard
109
+ rake
110
+ guard-rspec (4.7.3)
111
+ guard (~> 2.1)
112
+ guard-compat (~> 1.1)
113
+ rspec (>= 2.99.0, < 4.0)
114
+ guard-rubocop (1.3.0)
115
+ guard (~> 2.0)
116
+ rubocop (~> 0.20)
117
+ hirb (0.7.3)
118
+ i18n (1.8.10)
119
+ concurrent-ruby (~> 1.0)
120
+ interception (0.5)
121
+ jaro_winkler (1.5.4)
122
+ json (2.5.1)
123
+ listen (3.7.0)
124
+ rb-fsevent (~> 0.10, >= 0.10.3)
125
+ rb-inotify (~> 0.9, >= 0.9.10)
126
+ lumberjack (1.2.8)
127
+ memory_profiler (0.9.14)
128
+ method_source (0.9.2)
129
+ mini_portile2 (2.6.1)
130
+ minitest (5.14.4)
131
+ multi_json (1.15.0)
132
+ multipart-post (2.1.1)
133
+ nenv (0.3.0)
134
+ nio4r (2.5.8)
135
+ nokogiri (1.12.4)
136
+ mini_portile2 (~> 2.6.1)
137
+ racc (~> 1.4)
138
+ nokogiri (1.12.4-x86_64-darwin)
139
+ racc (~> 1.4)
140
+ notiffany (0.1.3)
141
+ nenv (~> 0.1)
142
+ shellany (~> 0.0)
143
+ octokit (4.21.0)
144
+ faraday (>= 0.9)
145
+ sawyer (~> 0.8.0, >= 0.5.3)
146
+ parallel (1.21.0)
147
+ parser (3.0.2.0)
148
+ ast (~> 2.4.1)
149
+ pg (1.1.4)
150
+ pg_query (2.1.3)
151
+ google-protobuf (>= 3.19.2)
152
+ protocol-hpack (1.4.2)
153
+ protocol-http (0.22.5)
154
+ protocol-http1 (0.14.2)
155
+ protocol-http (~> 0.22)
156
+ protocol-http2 (0.14.2)
157
+ protocol-hpack (~> 1.4)
158
+ protocol-http (~> 0.18)
159
+ pry (0.12.2)
160
+ coderay (~> 1.1.0)
161
+ method_source (~> 0.9.0)
162
+ pry-alias (0.0.1)
163
+ binding_of_caller
164
+ pry
165
+ pry-doc (1.2.0)
166
+ pry (~> 0.11)
167
+ yard (~> 0.9.11)
168
+ pry-nav (0.3.0)
169
+ pry (>= 0.9.10, < 0.13.0)
170
+ pry-rescue (1.5.2)
171
+ interception (>= 0.5)
172
+ pry (>= 0.12.0)
173
+ pry-stack_explorer (0.4.9.3)
174
+ binding_of_caller (>= 0.7)
175
+ pry (>= 0.9.11)
176
+ public_suffix (4.0.6)
177
+ racc (1.5.2)
178
+ rainbow (3.0.0)
179
+ rake (13.0.6)
180
+ rake-compiler (1.1.1)
181
+ rake
182
+ rb-fsevent (0.11.0)
183
+ rb-inotify (0.10.1)
184
+ ffi (~> 1.0)
185
+ rspec (3.10.0)
186
+ rspec-core (~> 3.10.0)
187
+ rspec-expectations (~> 3.10.0)
188
+ rspec-mocks (~> 3.10.0)
189
+ rspec-core (3.10.1)
190
+ rspec-support (~> 3.10.0)
191
+ rspec-expectations (3.10.1)
192
+ diff-lcs (>= 1.2.0, < 2.0)
193
+ rspec-support (~> 3.10.0)
194
+ rspec-mocks (3.10.2)
195
+ diff-lcs (>= 1.2.0, < 2.0)
196
+ rspec-support (~> 3.10.0)
197
+ rspec-support (3.10.2)
198
+ rubocop (0.71.0)
199
+ jaro_winkler (~> 1.5.1)
200
+ parallel (~> 1.10)
201
+ parser (>= 2.6)
202
+ rainbow (>= 2.2.2, < 4.0)
203
+ ruby-progressbar (~> 1.7)
204
+ unicode-display_width (>= 1.4.0, < 1.7)
205
+ ruby-progressbar (1.11.0)
206
+ ruby2_keywords (0.0.5)
207
+ sawyer (0.8.2)
208
+ addressable (>= 2.3.5)
209
+ faraday (> 0.8, < 2.0)
210
+ shellany (0.0.1)
211
+ simplecov (0.16.1)
212
+ docile (~> 1.1)
213
+ json (>= 1.8, < 3)
214
+ simplecov-html (~> 0.10.0)
215
+ simplecov-console (0.4.2)
216
+ ansi
217
+ hirb
218
+ simplecov
219
+ simplecov-html (0.10.2)
220
+ stackprof (0.2.17)
221
+ thor (1.1.0)
222
+ timers (4.3.3)
223
+ tzinfo (2.0.4)
224
+ concurrent-ruby (~> 1.0)
225
+ unicode-display_width (1.6.1)
226
+ yard (0.9.26)
227
+ zeitwerk (2.4.2)
228
+
229
+ PLATFORMS
230
+ aarch64-linux
231
+ x86_64-darwin-20
232
+ x86_64-darwin-21
233
+
234
+ DEPENDENCIES
235
+ activerecord (~> 6.1.0)
236
+ appraisal (~> 2.4.1)
237
+ approvals (~> 0.0.24)
238
+ arel_toolkit!
239
+ bundler (~> 2.0)
240
+ database_cleaner (~> 1.7.0)
241
+ dpl (~> 1.10.11)
242
+ github_changelog_generator (~> 1.15)
243
+ guard (~> 2.15)
244
+ guard-rake (~> 1.0.0)
245
+ guard-rspec (~> 4.7)
246
+ guard-rubocop (~> 1.3.0)
247
+ memory_profiler (~> 0.9)
248
+ pry
249
+ pry-alias
250
+ pry-doc
251
+ pry-nav
252
+ pry-rescue
253
+ pry-stack_explorer
254
+ rake (~> 13.0)
255
+ rake-compiler (~> 1.0)
256
+ rspec (~> 3.8)
257
+ rubocop (= 0.71.0)
258
+ simplecov (~> 0.16.1)
259
+ simplecov-console (~> 0.4.2)
260
+ stackprof (~> 0.2)
261
+
262
+ BUNDLED WITH
263
+ 2.3.6
@@ -31,10 +31,10 @@ GIT
31
31
  PATH
32
32
  remote: ..
33
33
  specs:
34
- arel_toolkit (0.4.2)
35
- activerecord
34
+ arel_toolkit (0.4.7)
35
+ activerecord (>= 5.0.0)
36
36
  pg (~> 1.1.4)
37
- pg_query (~> 1.2.0)
37
+ pg_query (~> 2.1)
38
38
 
39
39
  GEM
40
40
  remote: https://rubygems.org/
@@ -66,7 +66,7 @@ GEM
66
66
  addressable (2.7.0)
67
67
  public_suffix (>= 2.0.2, < 5.0)
68
68
  ansi (1.5.0)
69
- appraisal (2.2.0)
69
+ appraisal (2.4.1)
70
70
  bundler
71
71
  rake
72
72
  thor (>= 0.14.0)
@@ -101,6 +101,7 @@ GEM
101
101
  rainbow (>= 2.2.1)
102
102
  rake (>= 10.0)
103
103
  retriable (~> 3.0)
104
+ google-protobuf (3.19.4-x86_64-darwin)
104
105
  guard (2.15.0)
105
106
  formatador (>= 0.2.4)
106
107
  listen (>= 2.7, < 4.0)
@@ -154,7 +155,8 @@ GEM
154
155
  ast (~> 2.4.0)
155
156
  pg (1.1.4)
156
157
  pg_array_parser (0.0.9)
157
- pg_query (1.2.0)
158
+ pg_query (2.1.3)
159
+ google-protobuf (>= 3.19.2)
158
160
  pry (0.12.2)
159
161
  coderay (~> 1.1.0)
160
162
  method_source (~> 0.9.0)
@@ -251,7 +253,7 @@ PLATFORMS
251
253
 
252
254
  DEPENDENCIES
253
255
  active_record_upsert!
254
- appraisal (~> 2.2.0)
256
+ appraisal (~> 2.4.1)
255
257
  approvals (~> 0.0.24)
256
258
  arel_toolkit!
257
259
  bundler (~> 2.0)
@@ -281,4 +283,4 @@ DEPENDENCIES
281
283
  stackprof (~> 0.2)
282
284
 
283
285
  BUNDLED WITH
284
- 2.0.2
286
+ 2.3.6
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- arel_toolkit (0.4.2)
5
- activerecord
4
+ arel_toolkit (0.4.7)
5
+ activerecord (>= 5.0.0)
6
6
  pg (~> 1.1.4)
7
- pg_query (~> 1.2.0)
7
+ pg_query (~> 2.1)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
@@ -23,7 +23,7 @@ GEM
23
23
  addressable (2.7.0)
24
24
  public_suffix (>= 2.0.2, < 5.0)
25
25
  ansi (1.5.0)
26
- appraisal (2.2.0)
26
+ appraisal (2.4.1)
27
27
  bundler
28
28
  rake
29
29
  thor (>= 0.14.0)
@@ -55,6 +55,7 @@ GEM
55
55
  rainbow (>= 2.2.1)
56
56
  rake (>= 10.0)
57
57
  retriable (~> 3.0)
58
+ google-protobuf (3.19.4-x86_64-darwin)
58
59
  guard (2.15.0)
59
60
  formatador (>= 0.2.4)
60
61
  listen (>= 2.7, < 4.0)
@@ -104,7 +105,8 @@ GEM
104
105
  parser (2.6.3.0)
105
106
  ast (~> 2.4.0)
106
107
  pg (1.1.4)
107
- pg_query (1.2.0)
108
+ pg_query (2.1.3)
109
+ google-protobuf (>= 3.19.2)
108
110
  pry (0.12.2)
109
111
  coderay (~> 1.1.0)
110
112
  method_source (~> 0.9.0)
@@ -178,7 +180,7 @@ PLATFORMS
178
180
  ruby
179
181
 
180
182
  DEPENDENCIES
181
- appraisal (~> 2.2.0)
183
+ appraisal (~> 2.4.1)
182
184
  approvals (~> 0.0.24)
183
185
  arel_toolkit!
184
186
  bundler (~> 2.0)
@@ -205,4 +207,4 @@ DEPENDENCIES
205
207
  stackprof (~> 0.2)
206
208
 
207
209
  BUNDLED WITH
208
- 2.0.2
210
+ 2.3.6
@@ -22,6 +22,10 @@ module Arel
22
22
  node.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
23
23
  context[:range_variable] = true
24
24
 
25
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
26
+ node.parent.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
27
+ context[:range_variable] = true
28
+
25
29
  # Using Arel::Table as SELECT ... FROM [<table>]
26
30
  elsif parent_object.is_a?(Array) &&
27
31
  node.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
@@ -35,10 +39,26 @@ module Arel
35
39
  node.parent.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
36
40
  context[:range_variable] = true
37
41
 
42
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
43
+ node.parent.parent.object.is_a?(Arel::Attributes::Attribute)
44
+ context[:column_reference] = true
45
+
46
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
47
+ node.parent.parent.parent.object.is_a?(Arel::Attributes::Attribute)
48
+ context[:column_reference] = true
49
+
38
50
  # Using Arel::Table as SELECT ... INNER JOIN <table> ON TRUE
39
51
  elsif parent_object.is_a?(Arel::Nodes::Join)
40
52
  context[:range_variable] = true
41
53
 
54
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
55
+ node.parent.parent.object.is_a?(Arel::Nodes::Join)
56
+ context[:range_variable] = true
57
+
58
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
59
+ node.parent.parent.parent.object.is_a?(Arel::Nodes::Join)
60
+ context[:range_variable] = true
61
+
42
62
  # Using Arel::Table as an attribute SELECT <table>.id ...
43
63
  elsif parent_object.is_a?(Arel::Attributes::Attribute)
44
64
  context[:column_reference] = true
@@ -1,21 +1,15 @@
1
1
  module Arel
2
2
  module Enhance
3
3
  class Node
4
+ attr_reader :local_path
4
5
  attr_reader :object
5
6
  attr_reader :parent
6
- attr_reader :local_path
7
- attr_reader :fields
8
- attr_reader :children
9
7
  attr_reader :root_node
10
- attr_reader :context
11
8
 
12
9
  def initialize(object)
13
10
  @object = object
14
11
  @root_node = self
15
- @fields = []
16
- @children = {}
17
12
  @dirty = false
18
- @context = {}
19
13
  end
20
14
 
21
15
  def inspect
@@ -25,7 +19,7 @@ module Arel
25
19
  def value
26
20
  return unless value?
27
21
 
28
- @fields.first
22
+ fields.first
29
23
  end
30
24
 
31
25
  def each(&block)
@@ -58,7 +52,7 @@ module Arel
58
52
  node.local_path = path_node
59
53
  node.parent = self
60
54
  node.root_node = root_node
61
- @children[path_node.value.to_s] = node
55
+ children[path_node.value.to_s] = node
62
56
  end
63
57
 
64
58
  def to_sql(engine = Table.engine)
@@ -78,19 +72,19 @@ module Arel
78
72
  end
79
73
 
80
74
  def method_missing(name, *args, &block)
81
- child = @children[name.to_s]
75
+ child = children[name.to_s]
82
76
  return super if child.nil?
83
77
 
84
78
  child
85
79
  end
86
80
 
87
81
  def respond_to_missing?(method, include_private = false)
88
- child = @children[method.to_s]
82
+ child = children[method.to_s]
89
83
  child.present? || super
90
84
  end
91
85
 
92
86
  def [](key)
93
- @children.fetch(key.to_s)
87
+ children.fetch(key.to_s)
94
88
  end
95
89
 
96
90
  def child_at_path(path_items)
@@ -118,6 +112,18 @@ module Arel
118
112
  the_path.compact
119
113
  end
120
114
 
115
+ def children
116
+ @children ||= {}
117
+ end
118
+
119
+ def fields
120
+ @fields ||= []
121
+ end
122
+
123
+ def context
124
+ @context ||= {}
125
+ end
126
+
121
127
  protected
122
128
 
123
129
  attr_writer :local_path
@@ -211,6 +217,8 @@ module Arel
211
217
  else
212
218
  parent_object[local_path.value] = new_arel_node
213
219
  end
220
+ elsif parent_object.is_a?(Arel::Nodes::TableAlias) && local_path.value == 'relation'
221
+ parent_object.instance_variable_set('@left', new_arel_node)
214
222
  else
215
223
  raise "Don't know how to replace `#{local_path.value}` in #{parent_object.inspect}"
216
224
  end
@@ -14,7 +14,7 @@ module Arel
14
14
  @context_enhancers = context_enhancers
15
15
 
16
16
  root_node = Arel::Enhance::Node.new(object)
17
- accept_with_root(object, root_node)
17
+ accept_with_root(object, root_node, context_enhancers)
18
18
  end
19
19
 
20
20
  def accept_with_root(object, root_node, context_enhancers = DEFAULT_CONTEXT_ENHANCERS)
data/lib/arel/enhance.rb CHANGED
@@ -9,9 +9,9 @@ module Arel
9
9
  module Enhance
10
10
  end
11
11
 
12
- def self.enhance(object)
12
+ def self.enhance(object, context_enhancers = Arel::Enhance::Visitor::DEFAULT_CONTEXT_ENHANCERS)
13
13
  return object if object.is_a?(Arel::Enhance::Node)
14
14
 
15
- Arel::Enhance::Visitor.new.accept(object)
15
+ Arel::Enhance::Visitor.new.accept(object, context_enhancers)
16
16
  end
17
17
  end
@@ -21,12 +21,12 @@ module Arel
21
21
  visit(o.infer, collector) if o.infer
22
22
 
23
23
  case o.action
24
- when 1
24
+ when :ONCONFLICT_NOTHING
25
25
  collector << 'DO NOTHING'
26
- when 2
26
+ when :ONCONFLICT_UPDATE
27
27
  collector << 'DO UPDATE SET '
28
28
  else
29
- raise "Unknown conflict clause `#{action}`"
29
+ raise "Unknown conflict clause `#{o.action}`"
30
30
  end
31
31
 
32
32
  o.values.any? && (inject_join o.values, collector, ', ')
@@ -9,11 +9,14 @@ module Arel
9
9
  attr_accessor :using
10
10
  attr_accessor :with
11
11
  attr_accessor :returning
12
+ attr_accessor :orders
12
13
 
13
14
  def initialize(relation = nil, wheres = [])
14
15
  super
15
16
 
16
17
  @returning = []
18
+ @orders = []
19
+ @using = []
17
20
  end
18
21
  end
19
22
 
@@ -30,24 +33,26 @@ module Arel
30
33
  collector << ' '
31
34
  end
32
35
 
33
- collector << 'DELETE FROM '
34
- collector = visit o.relation, collector
35
-
36
- if o.using
37
- collector << ' USING '
38
- collector = inject_join o.using, collector, ', '
39
- end
36
+ if Gem.loaded_specs['activerecord'].version >= Gem::Version.new('6.0.0')
37
+ o = prepare_delete_statement(o)
40
38
 
41
- if o.wheres.any?
42
- collector << ' WHERE '
43
- collector = inject_join o.wheres, collector, ' AND '
39
+ if has_join_sources?(o)
40
+ collector << 'DELETE '
41
+ visit o.relation.left, collector
42
+ collector << ' FROM '
43
+ else
44
+ collector << 'DELETE FROM '
45
+ end
46
+ else
47
+ collector << 'DELETE FROM '
44
48
  end
45
49
 
46
- unless o.returning.empty?
47
- collector << ' RETURNING '
48
- collector = inject_join o.returning, collector, ', '
49
- end
50
+ collector = visit o.relation, collector
50
51
 
52
+ collect_nodes_for o.using, collector, ' USING ', ', '
53
+ collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
54
+ collect_nodes_for o.returning, collector, ' RETURNING ', ', '
55
+ collect_nodes_for o.orders, collector, ' ORDER BY '
51
56
  maybe_visit o.limit, collector
52
57
  end
53
58
  # rubocop:enable Metrics/AbcSize
@@ -13,13 +13,13 @@ module Arel
13
13
  module Visitors
14
14
  class ToSql
15
15
  def visit_Arel_Nodes_Infer(o, collector)
16
- if o.name
16
+ if o.name.present?
17
17
  collector << 'ON CONSTRAINT '
18
18
  collector << o.left
19
19
  collector << ' '
20
20
  end
21
21
 
22
- if o.right
22
+ if o.right.present?
23
23
  collector << '('
24
24
  inject_join o.right, collector, ', '
25
25
  collector << ') '