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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/coverage.yml +48 -0
  3. data/.github/workflows/test.yml +65 -0
  4. data/.gitignore +6 -1
  5. data/Appraisals +4 -0
  6. data/CHANGELOG.md +87 -7
  7. data/Gemfile.lock +50 -39
  8. data/Guardfile +4 -0
  9. data/README.md +25 -11
  10. data/Rakefile +11 -1
  11. data/arel_toolkit.gemspec +10 -5
  12. data/benchmark.rb +54 -0
  13. data/ext/pg_result_init/extconf.rb +52 -0
  14. data/ext/pg_result_init/pg_result_init.c +138 -0
  15. data/ext/pg_result_init/pg_result_init.h +6 -0
  16. data/gemfiles/active_record_6.gemfile +7 -0
  17. data/gemfiles/active_record_6.gemfile.lock +210 -0
  18. data/gemfiles/arel_gems.gemfile.lock +28 -18
  19. data/gemfiles/default.gemfile.lock +30 -20
  20. data/lib/arel/enhance.rb +1 -0
  21. data/lib/arel/enhance/context_enhancer/arel_table.rb +18 -1
  22. data/lib/arel/enhance/node.rb +71 -28
  23. data/lib/arel/enhance/query.rb +2 -0
  24. data/lib/arel/enhance/query_methods.rb +23 -0
  25. data/lib/arel/enhance/visitor.rb +19 -3
  26. data/lib/arel/extensions.rb +8 -2
  27. data/lib/arel/extensions/active_model_attribute_with_cast_value.rb +22 -0
  28. data/lib/arel/extensions/active_record_relation_query_attribute.rb +22 -0
  29. data/lib/arel/extensions/active_record_type_caster_connection.rb +7 -0
  30. data/lib/arel/extensions/attributes_attribute.rb +47 -0
  31. data/lib/arel/extensions/bind_param.rb +15 -0
  32. data/lib/arel/extensions/coalesce.rb +17 -3
  33. data/lib/arel/extensions/delete_statement.rb +20 -15
  34. data/lib/arel/extensions/exists.rb +59 -0
  35. data/lib/arel/extensions/function.rb +3 -2
  36. data/lib/arel/extensions/greatest.rb +17 -3
  37. data/lib/arel/extensions/infer.rb +1 -1
  38. data/lib/arel/extensions/insert_statement.rb +3 -3
  39. data/lib/arel/extensions/least.rb +17 -3
  40. data/lib/arel/extensions/node.rb +10 -0
  41. data/lib/arel/extensions/range_function.rb +10 -2
  42. data/lib/arel/extensions/select_core.rb +22 -7
  43. data/lib/arel/extensions/top.rb +8 -0
  44. data/lib/arel/extensions/tree_manager.rb +5 -0
  45. data/lib/arel/extensions/update_statement.rb +9 -23
  46. data/lib/arel/middleware.rb +5 -1
  47. data/lib/arel/middleware/active_record_extension.rb +13 -0
  48. data/lib/arel/middleware/cache_accessor.rb +35 -0
  49. data/lib/arel/middleware/chain.rb +110 -31
  50. data/lib/arel/middleware/database_executor.rb +77 -0
  51. data/lib/arel/middleware/no_op_cache.rb +9 -0
  52. data/lib/arel/middleware/postgresql_adapter.rb +41 -5
  53. data/lib/arel/middleware/railtie.rb +6 -2
  54. data/lib/arel/middleware/result.rb +170 -0
  55. data/lib/arel/middleware/to_sql_executor.rb +15 -0
  56. data/lib/arel/middleware/to_sql_middleware.rb +33 -0
  57. data/lib/arel/sql_to_arel/pg_query_visitor.rb +34 -33
  58. data/lib/arel/sql_to_arel/result.rb +19 -2
  59. data/lib/arel/transformer.rb +2 -1
  60. data/lib/arel/transformer/prefix_schema_name.rb +183 -0
  61. data/lib/arel/transformer/remove_active_record_info.rb +2 -4
  62. data/lib/arel/transformer/replace_table_with_subquery.rb +31 -0
  63. data/lib/arel_toolkit.rb +7 -1
  64. data/lib/arel_toolkit/version.rb +1 -1
  65. metadata +101 -37
  66. data/.travis.yml +0 -34
  67. data/lib/arel/extensions/generate_series.rb +0 -9
  68. data/lib/arel/extensions/rank.rb +0 -9
  69. 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.0)
35
- activerecord (~> 5.2.0)
36
- arel (~> 9.0.0)
34
+ arel_toolkit (0.4.5)
35
+ activerecord
37
36
  pg (~> 1.1.4)
38
- pg_query (~> 1.1.0)
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.6.0)
68
- public_suffix (>= 2.0.2, < 4.0)
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.15.4)
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.14.3)
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 (~> 2.1)
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.13.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.1.0)
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 (3.1.1)
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 (10.5.0)
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 (2.1.0)
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.14.3)
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 (~> 10.0)
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.0.1
284
+ 2.2.19
@@ -1,11 +1,10 @@
1
1
  PATH
2
2
  remote: ..
3
3
  specs:
4
- arel_toolkit (0.4.0)
5
- activerecord (~> 5.2.0)
6
- arel (~> 9.0.0)
4
+ arel_toolkit (0.4.5)
5
+ activerecord
7
6
  pg (~> 1.1.4)
8
- pg_query (~> 1.1.0)
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.6.0)
25
- public_suffix (>= 2.0.2, < 4.0)
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.15.4)
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.14.3)
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 (~> 2.1)
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.6.0)
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.11.3)
90
- multi_json (1.13.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.1.0)
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 (3.1.1)
125
+ public_suffix (4.0.1)
123
126
  rainbow (3.0.0)
124
- rake (10.5.0)
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 (2.1.0)
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.14.3)
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 (~> 10.0)
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.0.1
208
+ 2.2.19
data/lib/arel/enhance.rb CHANGED
@@ -2,6 +2,7 @@ require_relative './enhance/node'
2
2
  require_relative './enhance/path'
3
3
  require_relative './enhance/path_node'
4
4
  require_relative './enhance/query'
5
+ require_relative './enhance/query_methods'
5
6
  require_relative './enhance/visitor'
6
7
 
7
8
  module Arel
@@ -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!(range_variable: false, column_reference: false)
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
@@ -3,7 +3,7 @@ module Arel
3
3
  class Node
4
4
  attr_reader :object
5
5
  attr_reader :parent
6
- attr_reader :path
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(new_node)
55
- mutate(new_node)
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.path = path.append(path_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
- target_object = object.is_a?(Arel::TreeManager) ? object.ast : object
69
- collector = Arel::Collectors::SQLString.new
70
- collector = engine.connection.visitor.accept target_object, collector
71
- collector.value
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 :path
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} #{path.inspect}\n"
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
- each do |node|
140
- selected_object = node.path.dig_send(new_object)
141
- node.object = selected_object
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
- new_node = [] if remove && object.is_a?(Array)
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?("#{path.current.value}=")
164
- parent_object.send("#{path.current.value}=", new_node)
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?(path.current.value)
167
- parent_object.instance_variable_set("@#{path.current.value}", new_node)
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 path.current.arguments? && parent_object.respond_to?(path.current.method[0])
207
+ elsif local_path.arguments? && parent_object.respond_to?(local_path.method[0])
170
208
  if remove
171
- parent_object.delete_at(path.current.value)
209
+ parent_object.delete_at(local_path.value)
172
210
 
173
211
  else
174
- parent_object[path.current.value] = new_node
212
+ parent_object[local_path.value] = new_arel_node
175
213
  end
176
214
  else
177
- raise "Don't know how to replace `#{path.current.value}` in #{parent_object.inspect}"
215
+ raise "Don't know how to replace `#{local_path.value}` in #{parent_object.inspect}"
178
216
  end
179
217
 
180
- new_parent_tree = Visitor.new.accept_with_root(parent_object, parent)
181
- parent.parent.add(parent.path.current, new_parent_tree)
182
- new_parent_tree[path.current.value]
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