arel_toolkit 0.4.0 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/coverage.yml +48 -0
- data/.github/workflows/test.yml +65 -0
- data/.gitignore +6 -1
- data/Appraisals +4 -0
- data/CHANGELOG.md +87 -7
- data/Gemfile.lock +50 -39
- data/Guardfile +4 -0
- data/README.md +25 -11
- data/Rakefile +11 -1
- data/arel_toolkit.gemspec +10 -5
- data/benchmark.rb +54 -0
- data/ext/pg_result_init/extconf.rb +52 -0
- data/ext/pg_result_init/pg_result_init.c +138 -0
- data/ext/pg_result_init/pg_result_init.h +6 -0
- data/gemfiles/active_record_6.gemfile +7 -0
- data/gemfiles/active_record_6.gemfile.lock +210 -0
- data/gemfiles/arel_gems.gemfile.lock +28 -18
- data/gemfiles/default.gemfile.lock +30 -20
- data/lib/arel/enhance.rb +1 -0
- data/lib/arel/enhance/context_enhancer/arel_table.rb +18 -1
- data/lib/arel/enhance/node.rb +71 -28
- data/lib/arel/enhance/query.rb +2 -0
- data/lib/arel/enhance/query_methods.rb +23 -0
- data/lib/arel/enhance/visitor.rb +19 -3
- data/lib/arel/extensions.rb +8 -2
- data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
- data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
- data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
- data/lib/arel/extensions/attributes_attribute.rb +47 -0
- data/lib/arel/extensions/bind_param.rb +15 -0
- data/lib/arel/extensions/coalesce.rb +17 -3
- data/lib/arel/extensions/delete_statement.rb +20 -15
- data/lib/arel/extensions/exists.rb +59 -0
- data/lib/arel/extensions/function.rb +3 -2
- data/lib/arel/extensions/greatest.rb +17 -3
- data/lib/arel/extensions/infer.rb +1 -1
- data/lib/arel/extensions/insert_statement.rb +3 -3
- data/lib/arel/extensions/least.rb +17 -3
- data/lib/arel/extensions/node.rb +10 -0
- data/lib/arel/extensions/range_function.rb +10 -2
- data/lib/arel/extensions/select_core.rb +22 -7
- data/lib/arel/extensions/top.rb +8 -0
- data/lib/arel/extensions/tree_manager.rb +5 -0
- data/lib/arel/extensions/update_statement.rb +9 -23
- data/lib/arel/middleware.rb +5 -1
- data/lib/arel/middleware/active_record_extension.rb +13 -0
- data/lib/arel/middleware/cache_accessor.rb +35 -0
- data/lib/arel/middleware/chain.rb +110 -31
- data/lib/arel/middleware/database_executor.rb +77 -0
- data/lib/arel/middleware/no_op_cache.rb +9 -0
- data/lib/arel/middleware/postgresql_adapter.rb +41 -5
- data/lib/arel/middleware/railtie.rb +6 -2
- data/lib/arel/middleware/result.rb +170 -0
- data/lib/arel/middleware/to_sql_executor.rb +15 -0
- data/lib/arel/middleware/to_sql_middleware.rb +33 -0
- data/lib/arel/sql_to_arel/pg_query_visitor.rb +34 -33
- data/lib/arel/sql_to_arel/result.rb +19 -2
- data/lib/arel/transformer.rb +2 -1
- data/lib/arel/transformer/prefix_schema_name.rb +183 -0
- data/lib/arel/transformer/remove_active_record_info.rb +2 -4
- data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
- data/lib/arel_toolkit.rb +7 -1
- data/lib/arel_toolkit/version.rb +1 -1
- metadata +101 -37
- data/.travis.yml +0 -34
- data/lib/arel/extensions/generate_series.rb +0 -9
- data/lib/arel/extensions/rank.rb +0 -9
- data/lib/arel/transformer/add_schema_to_table.rb +0 -26
|
@@ -31,11 +31,10 @@ GIT
|
|
|
31
31
|
PATH
|
|
32
32
|
remote: ..
|
|
33
33
|
specs:
|
|
34
|
-
arel_toolkit (0.4.
|
|
35
|
-
activerecord
|
|
36
|
-
arel (~> 9.0.0)
|
|
34
|
+
arel_toolkit (0.4.5)
|
|
35
|
+
activerecord
|
|
37
36
|
pg (~> 1.1.4)
|
|
38
|
-
pg_query (~> 1.
|
|
37
|
+
pg_query (~> 1.3)
|
|
39
38
|
|
|
40
39
|
GEM
|
|
41
40
|
remote: https://rubygems.org/
|
|
@@ -64,8 +63,8 @@ GEM
|
|
|
64
63
|
i18n (>= 0.7, < 2)
|
|
65
64
|
minitest (~> 5.1)
|
|
66
65
|
tzinfo (~> 1.1)
|
|
67
|
-
addressable (2.
|
|
68
|
-
public_suffix (>= 2.0.2, <
|
|
66
|
+
addressable (2.7.0)
|
|
67
|
+
public_suffix (>= 2.0.2, < 5.0)
|
|
69
68
|
ansi (1.5.0)
|
|
70
69
|
appraisal (2.2.0)
|
|
71
70
|
bundler
|
|
@@ -88,20 +87,20 @@ GEM
|
|
|
88
87
|
docile (1.3.2)
|
|
89
88
|
dpl (1.10.12)
|
|
90
89
|
erubi (1.8.0)
|
|
91
|
-
faraday (0.
|
|
90
|
+
faraday (0.17.0)
|
|
92
91
|
multipart-post (>= 1.2, < 3)
|
|
93
92
|
faraday-http-cache (2.0.0)
|
|
94
93
|
faraday (~> 0.8)
|
|
95
94
|
ffi (1.11.1)
|
|
96
95
|
formatador (0.2.5)
|
|
97
|
-
github_changelog_generator (1.
|
|
96
|
+
github_changelog_generator (1.15.0)
|
|
98
97
|
activesupport
|
|
99
98
|
faraday-http-cache
|
|
100
99
|
multi_json
|
|
101
100
|
octokit (~> 4.6)
|
|
102
|
-
rainbow (>= 2.1)
|
|
101
|
+
rainbow (>= 2.2.1)
|
|
103
102
|
rake (>= 10.0)
|
|
104
|
-
retriable (~>
|
|
103
|
+
retriable (~> 3.0)
|
|
105
104
|
guard (2.15.0)
|
|
106
105
|
formatador (>= 0.2.4)
|
|
107
106
|
listen (>= 2.7, < 4.0)
|
|
@@ -112,6 +111,9 @@ GEM
|
|
|
112
111
|
shellany (~> 0.0)
|
|
113
112
|
thor (>= 0.18.1)
|
|
114
113
|
guard-compat (1.2.1)
|
|
114
|
+
guard-rake (1.0.0)
|
|
115
|
+
guard
|
|
116
|
+
rake
|
|
115
117
|
guard-rspec (4.7.3)
|
|
116
118
|
guard (~> 2.1)
|
|
117
119
|
guard-compat (~> 1.1)
|
|
@@ -133,10 +135,11 @@ GEM
|
|
|
133
135
|
crass (~> 1.0.2)
|
|
134
136
|
nokogiri (>= 1.5.9)
|
|
135
137
|
lumberjack (1.0.13)
|
|
138
|
+
memory_profiler (0.9.14)
|
|
136
139
|
method_source (0.9.2)
|
|
137
140
|
mini_portile2 (2.4.0)
|
|
138
141
|
minitest (5.11.3)
|
|
139
|
-
multi_json (1.
|
|
142
|
+
multi_json (1.14.1)
|
|
140
143
|
multipart-post (2.1.1)
|
|
141
144
|
nenv (0.3.0)
|
|
142
145
|
nokogiri (1.10.3)
|
|
@@ -151,7 +154,7 @@ GEM
|
|
|
151
154
|
ast (~> 2.4.0)
|
|
152
155
|
pg (1.1.4)
|
|
153
156
|
pg_array_parser (0.0.9)
|
|
154
|
-
pg_query (1.
|
|
157
|
+
pg_query (1.3.0)
|
|
155
158
|
pry (0.12.2)
|
|
156
159
|
coderay (~> 1.1.0)
|
|
157
160
|
method_source (~> 0.9.0)
|
|
@@ -169,7 +172,7 @@ GEM
|
|
|
169
172
|
pry-stack_explorer (0.4.9.3)
|
|
170
173
|
binding_of_caller (>= 0.7)
|
|
171
174
|
pry (>= 0.9.11)
|
|
172
|
-
public_suffix (
|
|
175
|
+
public_suffix (4.0.1)
|
|
173
176
|
rack (2.0.7)
|
|
174
177
|
rack-test (1.1.0)
|
|
175
178
|
rack (>= 1.0, < 3)
|
|
@@ -185,11 +188,13 @@ GEM
|
|
|
185
188
|
rake (>= 0.8.7)
|
|
186
189
|
thor (>= 0.19.0, < 2.0)
|
|
187
190
|
rainbow (3.0.0)
|
|
188
|
-
rake (
|
|
191
|
+
rake (13.0.1)
|
|
192
|
+
rake-compiler (1.0.7)
|
|
193
|
+
rake
|
|
189
194
|
rb-fsevent (0.10.3)
|
|
190
195
|
rb-inotify (0.10.0)
|
|
191
196
|
ffi (~> 1.0)
|
|
192
|
-
retriable (
|
|
197
|
+
retriable (3.1.2)
|
|
193
198
|
rspec (3.8.0)
|
|
194
199
|
rspec-core (~> 3.8.0)
|
|
195
200
|
rspec-expectations (~> 3.8.0)
|
|
@@ -233,6 +238,7 @@ GEM
|
|
|
233
238
|
hirb
|
|
234
239
|
simplecov
|
|
235
240
|
simplecov-html (0.10.2)
|
|
241
|
+
stackprof (0.2.13)
|
|
236
242
|
thor (0.20.3)
|
|
237
243
|
thread_safe (0.3.6)
|
|
238
244
|
tzinfo (1.2.5)
|
|
@@ -251,10 +257,12 @@ DEPENDENCIES
|
|
|
251
257
|
bundler (~> 2.0)
|
|
252
258
|
database_cleaner (~> 1.7.0)
|
|
253
259
|
dpl (~> 1.10.11)
|
|
254
|
-
github_changelog_generator (~> 1.
|
|
260
|
+
github_changelog_generator (~> 1.15)
|
|
255
261
|
guard (~> 2.15)
|
|
262
|
+
guard-rake (~> 1.0.0)
|
|
256
263
|
guard-rspec (~> 4.7)
|
|
257
264
|
guard-rubocop (~> 1.3.0)
|
|
265
|
+
memory_profiler (~> 0.9)
|
|
258
266
|
pg_search!
|
|
259
267
|
postgres_ext!
|
|
260
268
|
pry
|
|
@@ -263,12 +271,14 @@ DEPENDENCIES
|
|
|
263
271
|
pry-nav
|
|
264
272
|
pry-rescue
|
|
265
273
|
pry-stack_explorer
|
|
266
|
-
rake (~>
|
|
274
|
+
rake (~> 13.0)
|
|
275
|
+
rake-compiler (~> 1.0)
|
|
267
276
|
rspec (~> 3.8)
|
|
268
277
|
rspec-rails (~> 3.8.0)
|
|
269
278
|
rubocop (= 0.71.0)
|
|
270
279
|
simplecov (~> 0.16.1)
|
|
271
280
|
simplecov-console (~> 0.4.2)
|
|
281
|
+
stackprof (~> 0.2)
|
|
272
282
|
|
|
273
283
|
BUNDLED WITH
|
|
274
|
-
2.
|
|
284
|
+
2.2.19
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: ..
|
|
3
3
|
specs:
|
|
4
|
-
arel_toolkit (0.4.
|
|
5
|
-
activerecord
|
|
6
|
-
arel (~> 9.0.0)
|
|
4
|
+
arel_toolkit (0.4.5)
|
|
5
|
+
activerecord
|
|
7
6
|
pg (~> 1.1.4)
|
|
8
|
-
pg_query (~> 1.
|
|
7
|
+
pg_query (~> 1.3)
|
|
9
8
|
|
|
10
9
|
GEM
|
|
11
10
|
remote: https://rubygems.org/
|
|
@@ -21,8 +20,8 @@ GEM
|
|
|
21
20
|
i18n (>= 0.7, < 2)
|
|
22
21
|
minitest (~> 5.1)
|
|
23
22
|
tzinfo (~> 1.1)
|
|
24
|
-
addressable (2.
|
|
25
|
-
public_suffix (>= 2.0.2, <
|
|
23
|
+
addressable (2.7.0)
|
|
24
|
+
public_suffix (>= 2.0.2, < 5.0)
|
|
26
25
|
ansi (1.5.0)
|
|
27
26
|
appraisal (2.2.0)
|
|
28
27
|
bundler
|
|
@@ -42,20 +41,20 @@ GEM
|
|
|
42
41
|
diff-lcs (1.3)
|
|
43
42
|
docile (1.3.2)
|
|
44
43
|
dpl (1.10.12)
|
|
45
|
-
faraday (0.
|
|
44
|
+
faraday (0.17.0)
|
|
46
45
|
multipart-post (>= 1.2, < 3)
|
|
47
46
|
faraday-http-cache (2.0.0)
|
|
48
47
|
faraday (~> 0.8)
|
|
49
48
|
ffi (1.11.1)
|
|
50
49
|
formatador (0.2.5)
|
|
51
|
-
github_changelog_generator (1.
|
|
50
|
+
github_changelog_generator (1.15.0)
|
|
52
51
|
activesupport
|
|
53
52
|
faraday-http-cache
|
|
54
53
|
multi_json
|
|
55
54
|
octokit (~> 4.6)
|
|
56
|
-
rainbow (>= 2.1)
|
|
55
|
+
rainbow (>= 2.2.1)
|
|
57
56
|
rake (>= 10.0)
|
|
58
|
-
retriable (~>
|
|
57
|
+
retriable (~> 3.0)
|
|
59
58
|
guard (2.15.0)
|
|
60
59
|
formatador (>= 0.2.4)
|
|
61
60
|
listen (>= 2.7, < 4.0)
|
|
@@ -66,6 +65,9 @@ GEM
|
|
|
66
65
|
shellany (~> 0.0)
|
|
67
66
|
thor (>= 0.18.1)
|
|
68
67
|
guard-compat (1.2.1)
|
|
68
|
+
guard-rake (1.0.0)
|
|
69
|
+
guard
|
|
70
|
+
rake
|
|
69
71
|
guard-rspec (4.7.3)
|
|
70
72
|
guard (~> 2.1)
|
|
71
73
|
guard-compat (~> 1.1)
|
|
@@ -74,7 +76,7 @@ GEM
|
|
|
74
76
|
guard (~> 2.0)
|
|
75
77
|
rubocop (~> 0.20)
|
|
76
78
|
hirb (0.7.3)
|
|
77
|
-
i18n (1.
|
|
79
|
+
i18n (1.7.0)
|
|
78
80
|
concurrent-ruby (~> 1.0)
|
|
79
81
|
interception (0.5)
|
|
80
82
|
jaro_winkler (1.5.3)
|
|
@@ -84,10 +86,11 @@ GEM
|
|
|
84
86
|
rb-inotify (~> 0.9, >= 0.9.7)
|
|
85
87
|
ruby_dep (~> 1.2)
|
|
86
88
|
lumberjack (1.0.13)
|
|
89
|
+
memory_profiler (0.9.14)
|
|
87
90
|
method_source (0.9.2)
|
|
88
91
|
mini_portile2 (2.4.0)
|
|
89
|
-
minitest (5.
|
|
90
|
-
multi_json (1.
|
|
92
|
+
minitest (5.13.0)
|
|
93
|
+
multi_json (1.14.1)
|
|
91
94
|
multipart-post (2.1.1)
|
|
92
95
|
nenv (0.3.0)
|
|
93
96
|
nokogiri (1.10.3)
|
|
@@ -101,7 +104,7 @@ GEM
|
|
|
101
104
|
parser (2.6.3.0)
|
|
102
105
|
ast (~> 2.4.0)
|
|
103
106
|
pg (1.1.4)
|
|
104
|
-
pg_query (1.
|
|
107
|
+
pg_query (1.3.0)
|
|
105
108
|
pry (0.12.2)
|
|
106
109
|
coderay (~> 1.1.0)
|
|
107
110
|
method_source (~> 0.9.0)
|
|
@@ -119,13 +122,15 @@ GEM
|
|
|
119
122
|
pry-stack_explorer (0.4.9.3)
|
|
120
123
|
binding_of_caller (>= 0.7)
|
|
121
124
|
pry (>= 0.9.11)
|
|
122
|
-
public_suffix (
|
|
125
|
+
public_suffix (4.0.1)
|
|
123
126
|
rainbow (3.0.0)
|
|
124
|
-
rake (
|
|
127
|
+
rake (13.0.1)
|
|
128
|
+
rake-compiler (1.0.7)
|
|
129
|
+
rake
|
|
125
130
|
rb-fsevent (0.10.3)
|
|
126
131
|
rb-inotify (0.10.0)
|
|
127
132
|
ffi (~> 1.0)
|
|
128
|
-
retriable (
|
|
133
|
+
retriable (3.1.2)
|
|
129
134
|
rspec (3.8.0)
|
|
130
135
|
rspec-core (~> 3.8.0)
|
|
131
136
|
rspec-expectations (~> 3.8.0)
|
|
@@ -161,6 +166,7 @@ GEM
|
|
|
161
166
|
hirb
|
|
162
167
|
simplecov
|
|
163
168
|
simplecov-html (0.10.2)
|
|
169
|
+
stackprof (0.2.13)
|
|
164
170
|
thor (0.20.3)
|
|
165
171
|
thread_safe (0.3.6)
|
|
166
172
|
tzinfo (1.2.5)
|
|
@@ -178,21 +184,25 @@ DEPENDENCIES
|
|
|
178
184
|
bundler (~> 2.0)
|
|
179
185
|
database_cleaner (~> 1.7.0)
|
|
180
186
|
dpl (~> 1.10.11)
|
|
181
|
-
github_changelog_generator (~> 1.
|
|
187
|
+
github_changelog_generator (~> 1.15)
|
|
182
188
|
guard (~> 2.15)
|
|
189
|
+
guard-rake (~> 1.0.0)
|
|
183
190
|
guard-rspec (~> 4.7)
|
|
184
191
|
guard-rubocop (~> 1.3.0)
|
|
192
|
+
memory_profiler (~> 0.9)
|
|
185
193
|
pry
|
|
186
194
|
pry-alias
|
|
187
195
|
pry-doc
|
|
188
196
|
pry-nav
|
|
189
197
|
pry-rescue
|
|
190
198
|
pry-stack_explorer
|
|
191
|
-
rake (~>
|
|
199
|
+
rake (~> 13.0)
|
|
200
|
+
rake-compiler (~> 1.0)
|
|
192
201
|
rspec (~> 3.8)
|
|
193
202
|
rubocop (= 0.71.0)
|
|
194
203
|
simplecov (~> 0.16.1)
|
|
195
204
|
simplecov-console (~> 0.4.2)
|
|
205
|
+
stackprof (~> 0.2)
|
|
196
206
|
|
|
197
207
|
BUNDLED WITH
|
|
198
|
-
2.
|
|
208
|
+
2.2.19
|
data/lib/arel/enhance.rb
CHANGED
|
@@ -6,18 +6,35 @@ module Arel
|
|
|
6
6
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
7
7
|
# rubocop:disable Metrics/AbcSize
|
|
8
8
|
def self.call(node)
|
|
9
|
-
context = node.context.merge!(
|
|
9
|
+
context = node.context.merge!(
|
|
10
|
+
range_variable: false, column_reference: false, alias: false,
|
|
11
|
+
)
|
|
10
12
|
parent_object = node.parent.object
|
|
11
13
|
|
|
12
14
|
# Using Arel::Table as SELECT ... FROM <table>
|
|
13
15
|
if parent_object.is_a?(Arel::Nodes::JoinSource)
|
|
14
16
|
context[:range_variable] = true
|
|
15
17
|
|
|
18
|
+
# NOTE: only applies to ActiveRecord generated Arel
|
|
19
|
+
# which does not use Arel::Table#alias but Arel::TableAlias instead
|
|
20
|
+
# Using Arel::Table as SELECT ... FROM <table> AS alias
|
|
21
|
+
elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
|
|
22
|
+
node.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
|
|
23
|
+
context[:range_variable] = true
|
|
24
|
+
|
|
16
25
|
# Using Arel::Table as SELECT ... FROM [<table>]
|
|
17
26
|
elsif parent_object.is_a?(Array) &&
|
|
18
27
|
node.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
|
|
19
28
|
context[:range_variable] = true
|
|
20
29
|
|
|
30
|
+
# NOTE: only applies to ActiveRecord generated Arel
|
|
31
|
+
# which does not use Arel::Table#alias but Arel::TableAlias instead
|
|
32
|
+
# Using Arel::Table as SELECT ... FROM [<table> AS alias]
|
|
33
|
+
elsif parent_object.is_a?(Arel::Nodes::TableAlias) &&
|
|
34
|
+
node.parent.parent.object.is_a?(Array) &&
|
|
35
|
+
node.parent.parent.parent.object.is_a?(Arel::Nodes::JoinSource)
|
|
36
|
+
context[:range_variable] = true
|
|
37
|
+
|
|
21
38
|
# Using Arel::Table as SELECT ... INNER JOIN <table> ON TRUE
|
|
22
39
|
elsif parent_object.is_a?(Arel::Nodes::Join)
|
|
23
40
|
context[:range_variable] = true
|
data/lib/arel/enhance/node.rb
CHANGED
|
@@ -3,7 +3,7 @@ module Arel
|
|
|
3
3
|
class Node
|
|
4
4
|
attr_reader :object
|
|
5
5
|
attr_reader :parent
|
|
6
|
-
attr_reader :
|
|
6
|
+
attr_reader :local_path
|
|
7
7
|
attr_reader :fields
|
|
8
8
|
attr_reader :children
|
|
9
9
|
attr_reader :root_node
|
|
@@ -11,7 +11,6 @@ module Arel
|
|
|
11
11
|
|
|
12
12
|
def initialize(object)
|
|
13
13
|
@object = object
|
|
14
|
-
@path = Path.new
|
|
15
14
|
@root_node = self
|
|
16
15
|
@fields = []
|
|
17
16
|
@children = {}
|
|
@@ -51,28 +50,47 @@ module Arel
|
|
|
51
50
|
mutate(nil, remove: true)
|
|
52
51
|
end
|
|
53
52
|
|
|
54
|
-
def replace(
|
|
55
|
-
mutate(
|
|
53
|
+
def replace(new_arel_node)
|
|
54
|
+
mutate(new_arel_node)
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
def add(path_node, node)
|
|
59
|
-
node.
|
|
58
|
+
node.local_path = path_node
|
|
60
59
|
node.parent = self
|
|
61
60
|
node.root_node = root_node
|
|
62
|
-
@children[path_node.value] = node
|
|
61
|
+
@children[path_node.value.to_s] = node
|
|
63
62
|
end
|
|
64
63
|
|
|
65
64
|
def to_sql(engine = Table.engine)
|
|
66
65
|
return nil if children.empty?
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
if object.respond_to?(:to_sql)
|
|
68
|
+
object.to_sql(engine)
|
|
69
|
+
else
|
|
70
|
+
collector = Arel::Collectors::SQLString.new
|
|
71
|
+
collector = engine.connection.visitor.accept object, collector
|
|
72
|
+
collector.value
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def to_sql_and_binds(engine = Table.engine)
|
|
77
|
+
object.to_sql_and_binds(engine)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def method_missing(name, *args, &block)
|
|
81
|
+
child = @children[name.to_s]
|
|
82
|
+
return super if child.nil?
|
|
83
|
+
|
|
84
|
+
child
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def respond_to_missing?(method, include_private = false)
|
|
88
|
+
child = @children[method.to_s]
|
|
89
|
+
child.present? || super
|
|
72
90
|
end
|
|
73
91
|
|
|
74
92
|
def [](key)
|
|
75
|
-
@children.fetch(key)
|
|
93
|
+
@children.fetch(key.to_s)
|
|
76
94
|
end
|
|
77
95
|
|
|
78
96
|
def child_at_path(path_items)
|
|
@@ -88,9 +106,21 @@ module Arel
|
|
|
88
106
|
Arel::Enhance::Query.call(self, kwargs)
|
|
89
107
|
end
|
|
90
108
|
|
|
109
|
+
def full_path
|
|
110
|
+
the_path = [local_path]
|
|
111
|
+
current_parent = parent
|
|
112
|
+
|
|
113
|
+
while current_parent
|
|
114
|
+
the_path.unshift current_parent.local_path
|
|
115
|
+
current_parent = current_parent.parent
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
the_path.compact
|
|
119
|
+
end
|
|
120
|
+
|
|
91
121
|
protected
|
|
92
122
|
|
|
93
|
-
attr_writer :
|
|
123
|
+
attr_writer :local_path
|
|
94
124
|
attr_writer :parent
|
|
95
125
|
attr_writer :root_node
|
|
96
126
|
|
|
@@ -98,7 +128,7 @@ module Arel
|
|
|
98
128
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
99
129
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
100
130
|
def recursive_inspect(string, indent = 1)
|
|
101
|
-
string << "<#{inspect_name} #{
|
|
131
|
+
string << "<#{inspect_name} #{full_path.inspect}\n"
|
|
102
132
|
string << "#{spacing(indent)}sql = #{to_sql}\n" unless to_sql.nil?
|
|
103
133
|
string << "#{spacing(indent)}parent = #{parent.nil? ? nil.inspect : parent.inspect_name}"
|
|
104
134
|
string << "\n" unless children.length.zero?
|
|
@@ -116,6 +146,7 @@ module Arel
|
|
|
116
146
|
"#{spacing(indent - 1)}>\n"
|
|
117
147
|
end
|
|
118
148
|
end
|
|
149
|
+
|
|
119
150
|
# rubocop:enable Metrics/AbcSize
|
|
120
151
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
121
152
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
@@ -135,10 +166,16 @@ module Arel
|
|
|
135
166
|
def deep_copy_object
|
|
136
167
|
# https://github.com/mvgijssel/arel_toolkit/issues/97
|
|
137
168
|
new_object = Marshal.load(Marshal.dump(object))
|
|
169
|
+
self.object = new_object
|
|
138
170
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
171
|
+
recursive_update_object(new_object)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def recursive_update_object(arel_tree)
|
|
175
|
+
children.each_value do |child|
|
|
176
|
+
tree_child = arel_tree.send(*child.local_path.method)
|
|
177
|
+
child.object = tree_child
|
|
178
|
+
child.recursive_update_object(tree_child)
|
|
142
179
|
end
|
|
143
180
|
end
|
|
144
181
|
|
|
@@ -158,28 +195,34 @@ module Arel
|
|
|
158
195
|
root_node.mark_as_dirty
|
|
159
196
|
|
|
160
197
|
parent_object = parent.object
|
|
161
|
-
|
|
198
|
+
new_arel_node = new_node.is_a?(Arel::Enhance::Node) ? new_node.object : new_node
|
|
199
|
+
new_arel_node = [] if remove && object.is_a?(Array)
|
|
162
200
|
|
|
163
|
-
if parent_object.respond_to?("#{
|
|
164
|
-
parent_object.send("#{
|
|
201
|
+
if parent_object.respond_to?("#{local_path.value}=")
|
|
202
|
+
parent_object.send("#{local_path.value}=", new_arel_node)
|
|
165
203
|
|
|
166
|
-
elsif parent_object.instance_values.key?(
|
|
167
|
-
parent_object.instance_variable_set("@#{
|
|
204
|
+
elsif parent_object.instance_values.key?(local_path.value)
|
|
205
|
+
parent_object.instance_variable_set("@#{local_path.value}", new_arel_node)
|
|
168
206
|
|
|
169
|
-
elsif
|
|
207
|
+
elsif local_path.arguments? && parent_object.respond_to?(local_path.method[0])
|
|
170
208
|
if remove
|
|
171
|
-
parent_object.delete_at(
|
|
209
|
+
parent_object.delete_at(local_path.value)
|
|
172
210
|
|
|
173
211
|
else
|
|
174
|
-
parent_object[
|
|
212
|
+
parent_object[local_path.value] = new_arel_node
|
|
175
213
|
end
|
|
176
214
|
else
|
|
177
|
-
raise "Don't know how to replace `#{
|
|
215
|
+
raise "Don't know how to replace `#{local_path.value}` in #{parent_object.inspect}"
|
|
178
216
|
end
|
|
179
217
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
218
|
+
if new_node.is_a?(Arel::Enhance::Node)
|
|
219
|
+
parent.add(local_path, new_node)
|
|
220
|
+
parent[local_path.value]
|
|
221
|
+
else
|
|
222
|
+
new_parent_tree = Visitor.new.accept_with_root(parent_object, parent)
|
|
223
|
+
parent.parent.add(parent.local_path, new_parent_tree)
|
|
224
|
+
new_parent_tree[local_path.value]
|
|
225
|
+
end
|
|
183
226
|
end
|
|
184
227
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
185
228
|
# rubocop:enable Metrics/CyclomaticComplexity
|