Skip to content

Commit b5b0936

Browse files
committed
Reduced allocations for relations
1 parent cd8803b commit b5b0936

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

lib/searchkick/relation.rb

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ def aggs(*args, **kwargs)
3737

3838
def aggs!(*args, **kwargs)
3939
check_loaded
40-
@options[:aggs] ||= {}
40+
aggs = {}
4141
args.flatten.each do |arg|
4242
if arg.is_a?(Hash)
43-
@options[:aggs].merge!(arg)
43+
aggs.merge!(arg)
4444
else
45-
@options[:aggs][arg] = {}
45+
aggs[arg] = {}
4646
end
4747
end
48-
@options[:aggs].merge!(kwargs)
48+
aggs.merge!(kwargs)
49+
@options[:aggs] = (@options[:aggs] || {}).merge(aggs)
4950
self
5051
end
5152

@@ -69,7 +70,7 @@ def body_options(value)
6970

7071
def body_options!(value)
7172
check_loaded
72-
(@options[:body_options] ||= {}).merge!(value)
73+
@options[:body_options] = (@options[:body_options] || {}).merge(value)
7374
self
7475
end
7576

@@ -94,7 +95,7 @@ def boost_by!(value)
9495
elsif !value.is_a?(Hash)
9596
value = {value => {factor: 1}}
9697
end
97-
(@options[:boost_by] ||= {}).merge!(value)
98+
@options[:boost_by] = (@options[:boost_by] || {}).merge(value)
9899
self
99100
end
100101

@@ -106,7 +107,7 @@ def boost_by_distance!(value)
106107
check_loaded
107108
# legacy format
108109
value = {value[:field] => value.except(:field)} if value[:field]
109-
(@options[:boost_by_distance] ||= {}).merge!(value)
110+
@options[:boost_by_distance] = (@options[:boost_by_distance] || {}).merge(value)
110111
self
111112
end
112113

@@ -116,7 +117,7 @@ def boost_by_recency(value)
116117

117118
def boost_by_recency!(value)
118119
check_loaded
119-
(@options[:boost_by_recency] ||= {}).merge!(value)
120+
@options[:boost_by_recency] = (@options[:boost_by_recency] || {}).merge(value)
120121
self
121122
end
122123

@@ -127,7 +128,7 @@ def boost_where(value)
127128
def boost_where!(value)
128129
check_loaded
129130
# TODO merge duplicate fields
130-
(@options[:boost_where] ||= {}).merge!(value)
131+
@options[:boost_where] = (@options[:boost_where] || {}).merge(value)
131132
self
132133
end
133134

@@ -197,7 +198,8 @@ def exclude(*values)
197198

198199
def exclude!(*values)
199200
check_loaded
200-
(@options[:exclude] ||= []).concat(values.flatten)
201+
@options[:exclude] ||= []
202+
@options[:exclude] += values.flatten
201203
self
202204
end
203205

@@ -217,7 +219,8 @@ def fields(*values)
217219

218220
def fields!(*values)
219221
check_loaded
220-
(@options[:fields] ||= []).concat(values.flatten)
222+
@options[:fields] ||= []
223+
@options[:fields] += values.flatten
221224
self
222225
end
223226

@@ -237,7 +240,8 @@ def includes(*values)
237240

238241
def includes!(*values)
239242
check_loaded
240-
(@options[:includes] ||= []).concat(values.flatten)
243+
@options[:includes] ||= []
244+
@options[:includes] += values.flatten
241245
self
242246
end
243247

@@ -251,7 +255,8 @@ def index_name!(*values)
251255
if values.all? { |v| v.respond_to?(:searchkick_index) }
252256
models!(*values)
253257
else
254-
(@options[:index_name] ||= []).concat(values)
258+
@options[:index_name] ||= []
259+
@options[:index_name] += values
255260
self
256261
end
257262
end
@@ -262,7 +267,7 @@ def indices_boost(value)
262267

263268
def indices_boost!(value)
264269
check_loaded
265-
(@options[:indices_boost] ||= {}).merge!(value)
270+
@options[:indices_boost] = (@options[:indices_boost] || {}).merge(value)
266271
self
267272
end
268273

@@ -327,7 +332,8 @@ def models(*values)
327332

328333
def models!(*values)
329334
check_loaded
330-
(@options[:models] ||= []).concat(values.flatten)
335+
@options[:models] ||= []
336+
@options[:models] += values.flatten
331337
self
332338
end
333339

@@ -337,7 +343,8 @@ def model_includes(*values)
337343

338344
def model_includes!(*values)
339345
check_loaded
340-
(@options[:model_includes] ||= []).concat(values.flatten)
346+
@options[:model_includes] ||= []
347+
@options[:model_includes] += values.flatten
341348
self
342349
end
343350

@@ -381,7 +388,8 @@ def order(*values)
381388

382389
def order!(*values)
383390
check_loaded
384-
(@options[:order] ||= []).concat(values.flatten)
391+
@options[:order] ||= []
392+
@options[:order] += values.flatten
385393
self
386394
end
387395

@@ -444,7 +452,7 @@ def request_params(value)
444452

445453
def request_params!(value)
446454
check_loaded
447-
(@options[:request_params] ||= {}).merge!(value)
455+
@options[:request_params] = (@options[:request_params] || {}).merge(value)
448456
self
449457
end
450458

@@ -494,7 +502,8 @@ def select(*values, &block)
494502

495503
def select!(*values)
496504
check_loaded
497-
(@options[:select] ||= []).concat(values.flatten)
505+
@options[:select] ||= []
506+
@options[:select] += values.flatten
498507
self
499508
end
500509

@@ -558,7 +567,8 @@ def type(*values)
558567

559568
def type!(*values)
560569
check_loaded
561-
(@options[:type] ||= []).concat(values.flatten)
570+
@options[:type] ||= []
571+
@options[:type] += values.flatten
562572
self
563573
end
564574

@@ -695,7 +705,8 @@ def ensure_permitted(obj)
695705

696706
def initialize_copy(other)
697707
super
698-
@options = @options.deep_dup
708+
# shallow dup and avoid updating values in-place
709+
@options = @options.dup
699710
@execute = nil
700711
end
701712
end

0 commit comments

Comments
 (0)