bullet 5.9.0 → 6.1.1
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 +5 -5
- data/.travis.yml +22 -1
- data/CHANGELOG.md +27 -0
- data/Gemfile.rails-4.0 +1 -1
- data/Gemfile.rails-4.1 +1 -1
- data/Gemfile.rails-4.2 +1 -1
- data/Gemfile.rails-5.0 +1 -1
- data/Gemfile.rails-5.1 +1 -1
- data/Gemfile.rails-5.2 +1 -1
- data/Gemfile.rails-6.0 +15 -0
- data/Gemfile.rails-6.1 +15 -0
- data/README.md +31 -10
- data/lib/bullet.rb +50 -26
- data/lib/bullet/active_job.rb +13 -0
- data/lib/bullet/active_record4.rb +9 -32
- data/lib/bullet/active_record41.rb +7 -27
- data/lib/bullet/active_record42.rb +8 -24
- data/lib/bullet/active_record5.rb +188 -179
- data/lib/bullet/active_record52.rb +176 -168
- data/lib/bullet/active_record60.rb +267 -0
- data/lib/bullet/active_record61.rb +267 -0
- data/lib/bullet/bullet_xhr.js +63 -0
- data/lib/bullet/dependency.rb +50 -36
- data/lib/bullet/detector/association.rb +26 -20
- data/lib/bullet/detector/base.rb +1 -2
- data/lib/bullet/detector/counter_cache.rb +13 -9
- data/lib/bullet/detector/n_plus_one_query.rb +22 -12
- data/lib/bullet/detector/unused_eager_loading.rb +6 -3
- data/lib/bullet/ext/object.rb +4 -2
- data/lib/bullet/mongoid4x.rb +2 -6
- data/lib/bullet/mongoid5x.rb +2 -6
- data/lib/bullet/mongoid6x.rb +2 -6
- data/lib/bullet/mongoid7x.rb +2 -6
- data/lib/bullet/notification/base.rb +14 -18
- data/lib/bullet/notification/n_plus_one_query.rb +2 -4
- data/lib/bullet/notification/unused_eager_loading.rb +2 -4
- data/lib/bullet/rack.rb +50 -25
- data/lib/bullet/stack_trace_filter.rb +6 -12
- data/lib/bullet/version.rb +1 -1
- data/lib/generators/bullet/install_generator.rb +23 -23
- data/perf/benchmark.rb +8 -14
- data/spec/bullet/detector/counter_cache_spec.rb +6 -6
- data/spec/bullet/detector/n_plus_one_query_spec.rb +7 -3
- data/spec/bullet/detector/unused_eager_loading_spec.rb +19 -6
- data/spec/bullet/ext/object_spec.rb +9 -4
- data/spec/bullet/notification/base_spec.rb +1 -3
- data/spec/bullet/notification/n_plus_one_query_spec.rb +16 -3
- data/spec/bullet/notification/unused_eager_loading_spec.rb +5 -1
- data/spec/bullet/rack_spec.rb +86 -6
- data/spec/bullet/registry/association_spec.rb +2 -2
- data/spec/bullet/registry/base_spec.rb +1 -1
- data/spec/bullet_spec.rb +11 -30
- data/spec/integration/active_record/association_spec.rb +44 -136
- data/spec/integration/counter_cache_spec.rb +11 -31
- data/spec/integration/mongoid/association_spec.rb +18 -32
- data/spec/models/folder.rb +1 -2
- data/spec/models/group.rb +1 -2
- data/spec/models/page.rb +1 -2
- data/spec/models/writer.rb +1 -2
- data/spec/spec_helper.rb +6 -10
- data/spec/support/bullet_ext.rb +8 -9
- data/spec/support/mongo_seed.rb +2 -16
- data/test.sh +1 -0
- metadata +12 -7
@@ -5,7 +5,7 @@ module Bullet
|
|
5
5
|
def self.enable
|
6
6
|
require 'active_record'
|
7
7
|
::ActiveRecord::Base.class_eval do
|
8
|
-
class <<self
|
8
|
+
class << self
|
9
9
|
alias_method :origin_find_by_sql, :find_by_sql
|
10
10
|
def find_by_sql(sql, binds = [])
|
11
11
|
result = origin_find_by_sql(sql, binds)
|
@@ -49,9 +49,7 @@ module Bullet
|
|
49
49
|
|
50
50
|
::ActiveRecord::Persistence.class_eval do
|
51
51
|
def _create_record_with_bullet(*args)
|
52
|
-
_create_record_without_bullet(*args).tap
|
53
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
|
54
|
-
end
|
52
|
+
_create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
|
55
53
|
end
|
56
54
|
alias_method_chain :_create_record, :bullet
|
57
55
|
end
|
@@ -62,13 +60,12 @@ module Bullet
|
|
62
60
|
alias_method :origin_initialize, :initialize
|
63
61
|
def initialize(records, associations, preload_scope = nil)
|
64
62
|
origin_initialize(records, associations, preload_scope)
|
63
|
+
|
65
64
|
if Bullet.start?
|
66
65
|
records = [records].flatten.compact.uniq
|
67
66
|
return if records.empty?
|
68
67
|
|
69
|
-
records.each
|
70
|
-
Bullet::Detector::Association.add_object_associations(record, associations)
|
71
|
-
end
|
68
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
|
72
69
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
|
73
70
|
end
|
74
71
|
end
|
@@ -81,9 +78,7 @@ module Bullet
|
|
81
78
|
records = origin_find_with_associations
|
82
79
|
if Bullet.start?
|
83
80
|
associations = (eager_load_values + includes_values).uniq
|
84
|
-
records.each
|
85
|
-
Bullet::Detector::Association.add_object_associations(record, associations)
|
86
|
-
end
|
81
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
|
87
82
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
|
88
83
|
end
|
89
84
|
records
|
@@ -128,17 +123,13 @@ module Bullet
|
|
128
123
|
# call one to many associations
|
129
124
|
alias_method :origin_load_target, :load_target
|
130
125
|
def load_target
|
131
|
-
if Bullet.start?
|
132
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
133
|
-
end
|
126
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
|
134
127
|
origin_load_target
|
135
128
|
end
|
136
129
|
|
137
130
|
alias_method :origin_include?, :include?
|
138
131
|
def include?(object)
|
139
|
-
if Bullet.start?
|
140
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
141
|
-
end
|
132
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
|
142
133
|
origin_include?(object)
|
143
134
|
end
|
144
135
|
end
|
@@ -156,9 +147,7 @@ module Bullet
|
|
156
147
|
::ActiveRecord::Associations::HasAndBelongsToManyAssociation.class_eval do
|
157
148
|
alias_method :origin_empty?, :empty?
|
158
149
|
def empty?
|
159
|
-
if Bullet.start? && !loaded?
|
160
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
161
|
-
end
|
150
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start? && !loaded?
|
162
151
|
origin_empty?
|
163
152
|
end
|
164
153
|
end
|
@@ -181,23 +170,11 @@ module Bullet
|
|
181
170
|
::ActiveRecord::Associations::HasManyAssociation.class_eval do
|
182
171
|
alias_method :origin_has_cached_counter?, :has_cached_counter?
|
183
172
|
|
184
|
-
# rubocop:disable Style/MethodCallWithoutArgsParentheses
|
185
173
|
def has_cached_counter?(reflection = reflection())
|
186
174
|
result = origin_has_cached_counter?(reflection)
|
187
|
-
if Bullet.start? && !result
|
188
|
-
Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
|
189
|
-
end
|
175
|
+
Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name) if Bullet.start? && !result
|
190
176
|
result
|
191
177
|
end
|
192
|
-
# rubocop:enable Style/MethodCallWithoutArgsParentheses
|
193
|
-
end
|
194
|
-
|
195
|
-
::ActiveRecord::Associations::BelongsToAssociation.class_eval do
|
196
|
-
def writer_with_bullet(record)
|
197
|
-
Bullet::Detector::Association.add_object_associations(owner, reflection.name) if Bullet.start?
|
198
|
-
writer_without_bullet(record)
|
199
|
-
end
|
200
|
-
alias_method_chain :writer, :bullet
|
201
178
|
end
|
202
179
|
end
|
203
180
|
end
|
@@ -5,7 +5,7 @@ module Bullet
|
|
5
5
|
def self.enable
|
6
6
|
require 'active_record'
|
7
7
|
::ActiveRecord::Base.class_eval do
|
8
|
-
class <<self
|
8
|
+
class << self
|
9
9
|
alias_method :origin_find_by_sql, :find_by_sql
|
10
10
|
def find_by_sql(sql, binds = [])
|
11
11
|
result = origin_find_by_sql(sql, binds)
|
@@ -51,9 +51,7 @@ module Bullet
|
|
51
51
|
|
52
52
|
::ActiveRecord::Persistence.class_eval do
|
53
53
|
def _create_record_with_bullet(*args)
|
54
|
-
_create_record_without_bullet(*args).tap
|
55
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
|
56
|
-
end
|
54
|
+
_create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
|
57
55
|
end
|
58
56
|
alias_method_chain :_create_record, :bullet
|
59
57
|
end
|
@@ -65,9 +63,7 @@ module Bullet
|
|
65
63
|
if Bullet.start?
|
66
64
|
records.compact!
|
67
65
|
if records.first.class.name !~ /^HABTM_/
|
68
|
-
records.each
|
69
|
-
Bullet::Detector::Association.add_object_associations(record, association)
|
70
|
-
end
|
66
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
|
71
67
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
|
72
68
|
end
|
73
69
|
end
|
@@ -84,9 +80,7 @@ module Bullet
|
|
84
80
|
records = origin_find_with_associations
|
85
81
|
if Bullet.start?
|
86
82
|
associations = (eager_load_values + includes_values).uniq
|
87
|
-
records.each
|
88
|
-
Bullet::Detector::Association.add_object_associations(record, associations)
|
89
|
-
end
|
83
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
|
90
84
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
|
91
85
|
end
|
92
86
|
records
|
@@ -131,9 +125,7 @@ module Bullet
|
|
131
125
|
# call one to many associations
|
132
126
|
alias_method :origin_load_target, :load_target
|
133
127
|
def load_target
|
134
|
-
if Bullet.start?
|
135
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) unless @inversed
|
136
|
-
end
|
128
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start? && !@inversed
|
137
129
|
origin_load_target
|
138
130
|
end
|
139
131
|
|
@@ -147,9 +139,7 @@ module Bullet
|
|
147
139
|
|
148
140
|
alias_method :origin_include?, :include?
|
149
141
|
def include?(object)
|
150
|
-
if Bullet.start?
|
151
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
152
|
-
end
|
142
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
|
153
143
|
origin_include?(object)
|
154
144
|
end
|
155
145
|
end
|
@@ -173,20 +163,10 @@ module Bullet
|
|
173
163
|
alias_method :origin_count_records, :count_records
|
174
164
|
def count_records
|
175
165
|
result = has_cached_counter?
|
176
|
-
if Bullet.start? && !result
|
177
|
-
Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name)
|
178
|
-
end
|
166
|
+
Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name) if Bullet.start? && !result
|
179
167
|
origin_count_records
|
180
168
|
end
|
181
169
|
end
|
182
|
-
|
183
|
-
::ActiveRecord::Associations::BelongsToAssociation.class_eval do
|
184
|
-
def writer_with_bullet(record)
|
185
|
-
Bullet::Detector::Association.add_object_associations(owner, reflection.name) if Bullet.start?
|
186
|
-
writer_without_bullet(record)
|
187
|
-
end
|
188
|
-
alias_method_chain :writer, :bullet
|
189
|
-
end
|
190
170
|
end
|
191
171
|
end
|
192
172
|
end
|
@@ -5,7 +5,7 @@ module Bullet
|
|
5
5
|
def self.enable
|
6
6
|
require 'active_record'
|
7
7
|
::ActiveRecord::Base.class_eval do
|
8
|
-
class <<self
|
8
|
+
class << self
|
9
9
|
alias_method :origin_find, :find
|
10
10
|
def find(*args)
|
11
11
|
result = origin_find(*args)
|
@@ -45,9 +45,7 @@ module Bullet
|
|
45
45
|
|
46
46
|
::ActiveRecord::Persistence.class_eval do
|
47
47
|
def _create_record_with_bullet(*args)
|
48
|
-
_create_record_without_bullet(*args).tap
|
49
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
|
50
|
-
end
|
48
|
+
_create_record_without_bullet(*args).tap { Bullet::Detector::NPlusOneQuery.add_impossible_object(self) }
|
51
49
|
end
|
52
50
|
alias_method_chain :_create_record, :bullet
|
53
51
|
end
|
@@ -80,9 +78,7 @@ module Bullet
|
|
80
78
|
if Bullet.start?
|
81
79
|
records.compact!
|
82
80
|
if records.first.class.name !~ /^HABTM_/
|
83
|
-
records.each
|
84
|
-
Bullet::Detector::Association.add_object_associations(record, association)
|
85
|
-
end
|
81
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
|
86
82
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
|
87
83
|
end
|
88
84
|
end
|
@@ -99,9 +95,7 @@ module Bullet
|
|
99
95
|
records = origin_find_with_associations
|
100
96
|
if Bullet.start?
|
101
97
|
associations = (eager_load_values + includes_values).uniq
|
102
|
-
records.each
|
103
|
-
Bullet::Detector::Association.add_object_associations(record, associations)
|
104
|
-
end
|
98
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
|
105
99
|
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
|
106
100
|
end
|
107
101
|
records
|
@@ -195,9 +189,7 @@ module Bullet
|
|
195
189
|
|
196
190
|
alias_method :origin_include?, :include?
|
197
191
|
def include?(object)
|
198
|
-
if Bullet.start?
|
199
|
-
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
200
|
-
end
|
192
|
+
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name) if Bullet.start?
|
201
193
|
origin_include?(object)
|
202
194
|
end
|
203
195
|
end
|
@@ -207,9 +199,11 @@ module Bullet
|
|
207
199
|
alias_method :origin_reader, :reader
|
208
200
|
def reader(force_reload = false)
|
209
201
|
result = origin_reader(force_reload)
|
202
|
+
|
210
203
|
if Bullet.start?
|
211
204
|
if @owner.class.name !~ /^HABTM_/ && !@inversed
|
212
205
|
Bullet::Detector::NPlusOneQuery.call_association(@owner, @reflection.name)
|
206
|
+
|
213
207
|
if Bullet::Detector::NPlusOneQuery.impossible?(@owner)
|
214
208
|
Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
|
215
209
|
else
|
@@ -234,20 +228,10 @@ module Bullet
|
|
234
228
|
alias_method :origin_count_records, :count_records
|
235
229
|
def count_records
|
236
230
|
result = has_cached_counter?
|
237
|
-
if Bullet.start? && !result
|
238
|
-
Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name)
|
239
|
-
end
|
231
|
+
Bullet::Detector::CounterCache.add_counter_cache(@owner, @reflection.name) if Bullet.start? && !result
|
240
232
|
origin_count_records
|
241
233
|
end
|
242
234
|
end
|
243
|
-
|
244
|
-
::ActiveRecord::Associations::BelongsToAssociation.class_eval do
|
245
|
-
def writer_with_bullet(record)
|
246
|
-
Bullet::Detector::Association.add_object_associations(owner, reflection.name) if Bullet.start?
|
247
|
-
writer_without_bullet(record)
|
248
|
-
end
|
249
|
-
alias_method_chain :writer, :bullet
|
250
|
-
end
|
251
235
|
end
|
252
236
|
end
|
253
237
|
end
|
@@ -13,242 +13,251 @@ module Bullet
|
|
13
13
|
module ActiveRecord
|
14
14
|
def self.enable
|
15
15
|
require 'active_record'
|
16
|
-
::ActiveRecord::Base.extend(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
if
|
21
|
-
if result.
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
::ActiveRecord::Base.extend(
|
17
|
+
Module.new do
|
18
|
+
def find_by_sql(sql, binds = [], preparable: nil, &block)
|
19
|
+
result = super
|
20
|
+
if Bullet.start?
|
21
|
+
if result.is_a? Array
|
22
|
+
if result.size > 1
|
23
|
+
Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
|
24
|
+
Bullet::Detector::CounterCache.add_possible_objects(result)
|
25
|
+
elsif result.size == 1
|
26
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
|
27
|
+
Bullet::Detector::CounterCache.add_impossible_object(result.first)
|
28
|
+
end
|
29
|
+
elsif result.is_a? ::ActiveRecord::Base
|
30
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
|
31
|
+
Bullet::Detector::CounterCache.add_impossible_object(result)
|
27
32
|
end
|
28
|
-
elsif result.is_a? ::ActiveRecord::Base
|
29
|
-
Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
|
30
|
-
Bullet::Detector::CounterCache.add_impossible_object(result)
|
31
33
|
end
|
34
|
+
result
|
32
35
|
end
|
33
|
-
result
|
34
36
|
end
|
35
|
-
|
37
|
+
)
|
36
38
|
|
37
39
|
::ActiveRecord::Base.prepend(SaveWithBulletSupport)
|
38
40
|
|
39
|
-
::ActiveRecord::Relation.prepend(
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
if
|
46
|
-
if result.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
41
|
+
::ActiveRecord::Relation.prepend(
|
42
|
+
Module.new do
|
43
|
+
# if select a collection of objects, then these objects have possible to cause N+1 query.
|
44
|
+
# if select only one object, then the only one object has impossible to cause N+1 query.
|
45
|
+
def records
|
46
|
+
result = super
|
47
|
+
if Bullet.start?
|
48
|
+
if result.first.class.name !~ /^HABTM_/
|
49
|
+
if result.size > 1
|
50
|
+
Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
|
51
|
+
Bullet::Detector::CounterCache.add_possible_objects(result)
|
52
|
+
elsif result.size == 1
|
53
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
|
54
|
+
Bullet::Detector::CounterCache.add_impossible_object(result.first)
|
55
|
+
end
|
52
56
|
end
|
53
57
|
end
|
58
|
+
result
|
54
59
|
end
|
55
|
-
result
|
56
60
|
end
|
57
|
-
|
58
|
-
|
59
|
-
::ActiveRecord::Associations::Preloader.prepend(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
records.
|
65
|
-
Bullet::Detector::Association.add_object_associations(record, association)
|
61
|
+
)
|
62
|
+
|
63
|
+
::ActiveRecord::Associations::Preloader.prepend(
|
64
|
+
Module.new do
|
65
|
+
def preloaders_for_one(association, records, scope)
|
66
|
+
if Bullet.start?
|
67
|
+
records.compact!
|
68
|
+
if records.first.class.name !~ /^HABTM_/
|
69
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
|
70
|
+
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
|
66
71
|
end
|
67
|
-
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
|
68
72
|
end
|
73
|
+
super
|
69
74
|
end
|
70
|
-
super
|
71
75
|
end
|
72
|
-
|
76
|
+
)
|
73
77
|
|
74
|
-
::ActiveRecord::FinderMethods.prepend(
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
+
::ActiveRecord::FinderMethods.prepend(
|
79
|
+
Module.new do
|
80
|
+
# add includes in scope
|
81
|
+
def find_with_associations
|
82
|
+
return super { |r| yield r } if block_given?
|
78
83
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
Bullet::Detector::
|
84
|
+
records = super
|
85
|
+
if Bullet.start?
|
86
|
+
associations = (eager_load_values + includes_values).uniq
|
87
|
+
records.each { |record| Bullet::Detector::Association.add_object_associations(record, associations) }
|
88
|
+
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, associations)
|
84
89
|
end
|
85
|
-
|
90
|
+
records
|
86
91
|
end
|
87
|
-
records
|
88
92
|
end
|
89
|
-
|
93
|
+
)
|
90
94
|
|
91
|
-
::ActiveRecord::Associations::JoinDependency.prepend(
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
95
|
+
::ActiveRecord::Associations::JoinDependency.prepend(
|
96
|
+
Module.new do
|
97
|
+
if ::ActiveRecord::Associations::JoinDependency.instance_method(:instantiate).parameters.last[0] == :block
|
98
|
+
# ActiveRecord >= 5.1.5
|
99
|
+
def instantiate(result_set, &block)
|
100
|
+
@bullet_eager_loadings = {}
|
101
|
+
records = super
|
97
102
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
103
|
+
if Bullet.start?
|
104
|
+
@bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
|
105
|
+
objects = eager_loadings_hash.keys
|
106
|
+
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
|
107
|
+
objects,
|
108
|
+
eager_loadings_hash[objects.first].to_a
|
109
|
+
)
|
110
|
+
end
|
102
111
|
end
|
112
|
+
records
|
103
113
|
end
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
@bullet_eager_loadings = {}
|
110
|
-
records = super
|
114
|
+
else
|
115
|
+
# ActiveRecord <= 5.1.4
|
116
|
+
def instantiate(result_set, aliases)
|
117
|
+
@bullet_eager_loadings = {}
|
118
|
+
records = super
|
111
119
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
120
|
+
if Bullet.start?
|
121
|
+
@bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
|
122
|
+
objects = eager_loadings_hash.keys
|
123
|
+
Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
|
124
|
+
objects,
|
125
|
+
eager_loadings_hash[objects.first].to_a
|
126
|
+
)
|
127
|
+
end
|
116
128
|
end
|
129
|
+
records
|
117
130
|
end
|
118
|
-
records
|
119
131
|
end
|
120
|
-
end
|
121
132
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
133
|
+
def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
|
134
|
+
if Bullet.start?
|
135
|
+
unless ar_parent.nil?
|
136
|
+
parent.children.each do |node|
|
137
|
+
key = aliases.column_alias(node, node.primary_key)
|
138
|
+
id = row[key]
|
139
|
+
next unless id.nil?
|
140
|
+
|
141
|
+
associations = node.reflection.name
|
142
|
+
Bullet::Detector::Association.add_object_associations(ar_parent, associations)
|
143
|
+
Bullet::Detector::NPlusOneQuery.call_association(ar_parent, associations)
|
144
|
+
@bullet_eager_loadings[ar_parent.class] ||= {}
|
145
|
+
@bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
|
146
|
+
@bullet_eager_loadings[ar_parent.class][ar_parent] << associations
|
147
|
+
end
|
136
148
|
end
|
137
149
|
end
|
150
|
+
|
151
|
+
super
|
138
152
|
end
|
139
153
|
|
140
|
-
|
141
|
-
|
154
|
+
# call join associations
|
155
|
+
def construct_model(record, node, row, model_cache, id, aliases)
|
156
|
+
result = super
|
142
157
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
@bullet_eager_loadings[record.class] ||= {}
|
152
|
-
@bullet_eager_loadings[record.class][record] ||= Set.new
|
153
|
-
@bullet_eager_loadings[record.class][record] << associations
|
154
|
-
end
|
158
|
+
if Bullet.start?
|
159
|
+
associations = node.reflection.name
|
160
|
+
Bullet::Detector::Association.add_object_associations(record, associations)
|
161
|
+
Bullet::Detector::NPlusOneQuery.call_association(record, associations)
|
162
|
+
@bullet_eager_loadings[record.class] ||= {}
|
163
|
+
@bullet_eager_loadings[record.class][record] ||= Set.new
|
164
|
+
@bullet_eager_loadings[record.class][record] << associations
|
165
|
+
end
|
155
166
|
|
156
|
-
|
167
|
+
result
|
168
|
+
end
|
157
169
|
end
|
158
|
-
|
159
|
-
|
160
|
-
::ActiveRecord::Associations::CollectionAssociation.prepend(Module.new do
|
161
|
-
def load_target
|
162
|
-
records = super
|
163
|
-
|
164
|
-
if Bullet.start?
|
165
|
-
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
166
|
-
refl = reflection.through_reflection
|
167
|
-
Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
|
168
|
-
association = owner.association refl.name
|
169
|
-
Array(association.target).each do |through_record|
|
170
|
-
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
171
|
-
end
|
170
|
+
)
|
172
171
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
172
|
+
::ActiveRecord::Associations::CollectionAssociation.prepend(
|
173
|
+
Module.new do
|
174
|
+
def load_target
|
175
|
+
records = super
|
177
176
|
|
177
|
+
if Bullet.start?
|
178
|
+
if is_a? ::ActiveRecord::Associations::ThroughAssociation
|
179
|
+
refl = reflection.through_reflection
|
178
180
|
Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
|
181
|
+
association = owner.association refl.name
|
182
|
+
Array(association.target).each do |through_record|
|
183
|
+
Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
|
184
|
+
end
|
185
|
+
|
186
|
+
if refl.through_reflection?
|
187
|
+
refl = refl.through_reflection while refl.through_reflection?
|
188
|
+
|
189
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, refl.name)
|
190
|
+
end
|
179
191
|
end
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
192
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) unless @inversed
|
193
|
+
if records.first.class.name !~ /^HABTM_/
|
194
|
+
if records.size > 1
|
195
|
+
Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
|
196
|
+
Bullet::Detector::CounterCache.add_possible_objects(records)
|
197
|
+
elsif records.size == 1
|
198
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(records.first)
|
199
|
+
Bullet::Detector::CounterCache.add_impossible_object(records.first)
|
200
|
+
end
|
189
201
|
end
|
190
202
|
end
|
203
|
+
records
|
191
204
|
end
|
192
|
-
records
|
193
|
-
end
|
194
205
|
|
195
|
-
|
196
|
-
|
197
|
-
|
206
|
+
def empty?
|
207
|
+
if Bullet.start? && !reflection.has_cached_counter?
|
208
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
209
|
+
end
|
210
|
+
super
|
198
211
|
end
|
199
|
-
super
|
200
|
-
end
|
201
212
|
|
202
|
-
|
203
|
-
|
204
|
-
|
213
|
+
def include?(object)
|
214
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name) if Bullet.start?
|
215
|
+
super
|
205
216
|
end
|
206
|
-
super
|
207
217
|
end
|
208
|
-
|
209
|
-
|
210
|
-
::ActiveRecord::Associations::SingularAssociation.prepend(
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
if
|
218
|
-
Bullet::Detector::NPlusOneQuery.
|
219
|
-
|
220
|
-
Bullet::Detector::NPlusOneQuery.
|
218
|
+
)
|
219
|
+
|
220
|
+
::ActiveRecord::Associations::SingularAssociation.prepend(
|
221
|
+
Module.new do
|
222
|
+
# call has_one and belongs_to associations
|
223
|
+
def target
|
224
|
+
result = super()
|
225
|
+
|
226
|
+
if Bullet.start?
|
227
|
+
if owner.class.name !~ /^HABTM_/ && !@inversed
|
228
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
229
|
+
|
230
|
+
if Bullet::Detector::NPlusOneQuery.impossible?(owner)
|
231
|
+
Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
|
232
|
+
else
|
233
|
+
Bullet::Detector::NPlusOneQuery.add_possible_objects(result) if result
|
234
|
+
end
|
221
235
|
end
|
222
236
|
end
|
237
|
+
result
|
223
238
|
end
|
224
|
-
result
|
225
239
|
end
|
226
|
-
|
240
|
+
)
|
227
241
|
|
228
|
-
::ActiveRecord::Associations::HasManyAssociation.prepend(
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
Bullet
|
242
|
+
::ActiveRecord::Associations::HasManyAssociation.prepend(
|
243
|
+
Module.new do
|
244
|
+
def empty?
|
245
|
+
result = super
|
246
|
+
if Bullet.start? && !reflection.has_cached_counter?
|
247
|
+
Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
|
248
|
+
end
|
249
|
+
result
|
233
250
|
end
|
234
|
-
result
|
235
|
-
end
|
236
251
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
252
|
+
def count_records
|
253
|
+
result = reflection.has_cached_counter?
|
254
|
+
if Bullet.start? && !result && !is_a?(::ActiveRecord::Associations::ThroughAssociation)
|
255
|
+
Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
|
256
|
+
end
|
257
|
+
super
|
241
258
|
end
|
242
|
-
super
|
243
|
-
end
|
244
|
-
end)
|
245
|
-
|
246
|
-
::ActiveRecord::Associations::BelongsToAssociation.prepend(Module.new do
|
247
|
-
def writer(record)
|
248
|
-
Bullet::Detector::Association.add_object_associations(owner, reflection.name) if Bullet.start?
|
249
|
-
super
|
250
259
|
end
|
251
|
-
|
260
|
+
)
|
252
261
|
end
|
253
262
|
end
|
254
263
|
end
|