hyper-pure-sys 0.0.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.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/bullet-8.1.3/CHANGELOG.md +374 -0
  3. data/bullet-8.1.3/MIT-LICENSE +20 -0
  4. data/bullet-8.1.3/README.md +525 -0
  5. data/bullet-8.1.3/lib/bullet/active_job.rb +13 -0
  6. data/bullet-8.1.3/lib/bullet/active_record4.rb +197 -0
  7. data/bullet-8.1.3/lib/bullet/active_record41.rb +191 -0
  8. data/bullet-8.1.3/lib/bullet/active_record42.rb +262 -0
  9. data/bullet-8.1.3/lib/bullet/active_record5.rb +294 -0
  10. data/bullet-8.1.3/lib/bullet/active_record52.rb +278 -0
  11. data/bullet-8.1.3/lib/bullet/active_record60.rb +310 -0
  12. data/bullet-8.1.3/lib/bullet/active_record61.rb +310 -0
  13. data/bullet-8.1.3/lib/bullet/active_record70.rb +319 -0
  14. data/bullet-8.1.3/lib/bullet/active_record71.rb +319 -0
  15. data/bullet-8.1.3/lib/bullet/active_record72.rb +319 -0
  16. data/bullet-8.1.3/lib/bullet/active_record80.rb +319 -0
  17. data/bullet-8.1.3/lib/bullet/active_record81.rb +321 -0
  18. data/bullet-8.1.3/lib/bullet/bullet_xhr.js +64 -0
  19. data/bullet-8.1.3/lib/bullet/dependency.rb +165 -0
  20. data/bullet-8.1.3/lib/bullet/detector/association.rb +92 -0
  21. data/bullet-8.1.3/lib/bullet/detector/base.rb +8 -0
  22. data/bullet-8.1.3/lib/bullet/detector/counter_cache.rb +69 -0
  23. data/bullet-8.1.3/lib/bullet/detector/n_plus_one_query.rb +148 -0
  24. data/bullet-8.1.3/lib/bullet/detector/unused_eager_loading.rb +100 -0
  25. data/bullet-8.1.3/lib/bullet/detector.rb +11 -0
  26. data/bullet-8.1.3/lib/bullet/ext/object.rb +37 -0
  27. data/bullet-8.1.3/lib/bullet/ext/string.rb +14 -0
  28. data/bullet-8.1.3/lib/bullet/mongoid4x.rb +59 -0
  29. data/bullet-8.1.3/lib/bullet/mongoid5x.rb +59 -0
  30. data/bullet-8.1.3/lib/bullet/mongoid6x.rb +59 -0
  31. data/bullet-8.1.3/lib/bullet/mongoid7x.rb +74 -0
  32. data/bullet-8.1.3/lib/bullet/mongoid8x.rb +61 -0
  33. data/bullet-8.1.3/lib/bullet/mongoid9x.rb +74 -0
  34. data/bullet-8.1.3/lib/bullet/notification/base.rb +92 -0
  35. data/bullet-8.1.3/lib/bullet/notification/counter_cache.rb +15 -0
  36. data/bullet-8.1.3/lib/bullet/notification/n_plus_one_query.rb +31 -0
  37. data/bullet-8.1.3/lib/bullet/notification/unused_eager_loading.rb +31 -0
  38. data/bullet-8.1.3/lib/bullet/notification.rb +13 -0
  39. data/bullet-8.1.3/lib/bullet/notification_collector.rb +25 -0
  40. data/bullet-8.1.3/lib/bullet/rack.rb +186 -0
  41. data/bullet-8.1.3/lib/bullet/registry/association.rb +16 -0
  42. data/bullet-8.1.3/lib/bullet/registry/base.rb +46 -0
  43. data/bullet-8.1.3/lib/bullet/registry/call_stack.rb +17 -0
  44. data/bullet-8.1.3/lib/bullet/registry/object.rb +18 -0
  45. data/bullet-8.1.3/lib/bullet/registry.rb +10 -0
  46. data/bullet-8.1.3/lib/bullet/stack_trace_filter.rb +67 -0
  47. data/bullet-8.1.3/lib/bullet/version.rb +5 -0
  48. data/bullet-8.1.3/lib/bullet.rb +289 -0
  49. data/bullet-8.1.3/lib/generators/bullet/install_generator.rb +47 -0
  50. data/bullet-8.1.3/tasks/bullet_tasks.rake +11 -0
  51. data/hyper-pure-sys.gemspec +12 -0
  52. metadata +91 -0
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bullet
4
+ module SaveWithBulletSupport
5
+ def _create_record(*)
6
+ super do
7
+ Bullet::Detector::NPlusOneQuery.update_inversed_object(self)
8
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
9
+ yield(self) if block_given?
10
+ end
11
+ end
12
+ end
13
+
14
+ module ActiveRecord
15
+ def self.enable
16
+ require 'active_record'
17
+ ::ActiveRecord::Base.extend(
18
+ Module.new do
19
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
20
+ result = super
21
+ if Bullet.start?
22
+ if result.is_a? Array
23
+ if result.size > 1
24
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
25
+ Bullet::Detector::CounterCache.add_possible_objects(result)
26
+ elsif result.size == 1
27
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
28
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
29
+ end
30
+ elsif result.is_a? ::ActiveRecord::Base
31
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
32
+ Bullet::Detector::CounterCache.add_impossible_object(result)
33
+ end
34
+ end
35
+ result
36
+ end
37
+ end
38
+ )
39
+
40
+ ::ActiveRecord::Base.prepend(SaveWithBulletSupport)
41
+
42
+ ::ActiveRecord::Relation.prepend(
43
+ Module.new do
44
+ # if select a collection of objects, then these objects have possible to cause N+1 query.
45
+ # if select only one object, then the only one object has impossible to cause N+1 query.
46
+ def records
47
+ result = super
48
+ if Bullet.start?
49
+ if result.first.class.name !~ /^HABTM_/
50
+ if result.size > 1
51
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
52
+ Bullet::Detector::CounterCache.add_possible_objects(result)
53
+ elsif result.size == 1
54
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
55
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
56
+ end
57
+ end
58
+ end
59
+ result
60
+ end
61
+ end
62
+ )
63
+
64
+ ::ActiveRecord::Associations::Preloader.prepend(
65
+ Module.new do
66
+ def preloaders_for_one(association, records, scope, polymorphic_parent)
67
+ if Bullet.start?
68
+ records.compact!
69
+ if records.first.class.name !~ /^HABTM_/
70
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
71
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
72
+ end
73
+ end
74
+ super
75
+ end
76
+
77
+ def preloaders_for_reflection(reflection, records, scope)
78
+ if Bullet.start?
79
+ records.compact!
80
+ if records.first.class.name !~ /^HABTM_/
81
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, reflection.name) }
82
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, reflection.name)
83
+ end
84
+ end
85
+ super
86
+ end
87
+ end
88
+ )
89
+
90
+ ::ActiveRecord::Associations::Preloader::ThroughAssociation.prepend(
91
+ Module.new do
92
+ def preloaded_records
93
+ if Bullet.start? && !defined?(@preloaded_records)
94
+ source_preloaders.each do |source_preloader|
95
+ reflection_name = source_preloader.send(:reflection).name
96
+ source_preloader.send(:owners).each do |owner|
97
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection_name)
98
+ end
99
+ end
100
+ end
101
+ super
102
+ end
103
+ end
104
+ )
105
+
106
+ ::ActiveRecord::Associations::JoinDependency.prepend(
107
+ Module.new do
108
+ def instantiate(result_set, &block)
109
+ @bullet_eager_loadings = {}
110
+ records = super
111
+
112
+ if Bullet.start?
113
+ @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
114
+ objects = eager_loadings_hash.keys
115
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
116
+ objects,
117
+ eager_loadings_hash[objects.first].to_a
118
+ )
119
+ end
120
+ end
121
+ records
122
+ end
123
+
124
+ def construct(ar_parent, parent, row, seen, model_cache)
125
+ if Bullet.start?
126
+ unless ar_parent.nil?
127
+ parent.children.each do |node|
128
+ key = aliases.column_alias(node, node.primary_key)
129
+ id = row[key]
130
+ next unless id.nil?
131
+
132
+ associations = [node.reflection.name]
133
+ if node.reflection.through_reflection?
134
+ associations << node.reflection.through_reflection.name
135
+ end
136
+ associations.each do |association|
137
+ Bullet::Detector::Association.add_object_associations(ar_parent, association)
138
+ Bullet::Detector::NPlusOneQuery.call_association(ar_parent, association)
139
+ @bullet_eager_loadings[ar_parent.class] ||= {}
140
+ @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
141
+ @bullet_eager_loadings[ar_parent.class][ar_parent] << association
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ super
148
+ end
149
+
150
+ # call join associations
151
+ def construct_model(record, node, row, model_cache, id)
152
+ result = super
153
+
154
+ if Bullet.start?
155
+ associations = [node.reflection.name]
156
+ if node.reflection.through_reflection?
157
+ associations << node.reflection.through_reflection.name
158
+ end
159
+ associations.each do |association|
160
+ Bullet::Detector::Association.add_object_associations(record, association)
161
+ Bullet::Detector::NPlusOneQuery.call_association(record, association)
162
+ @bullet_eager_loadings[record.class] ||= {}
163
+ @bullet_eager_loadings[record.class][record] ||= Set.new
164
+ @bullet_eager_loadings[record.class][record] << association
165
+ end
166
+ end
167
+
168
+ result
169
+ end
170
+ end
171
+ )
172
+
173
+ ::ActiveRecord::Associations::Association.prepend(
174
+ Module.new do
175
+ def inversed_from(record)
176
+ if Bullet.start?
177
+ Bullet::Detector::NPlusOneQuery.add_inversed_object(owner, reflection.name)
178
+ end
179
+ super
180
+ end
181
+ end
182
+ )
183
+
184
+ ::ActiveRecord::Associations::CollectionAssociation.prepend(
185
+ Module.new do
186
+ def load_target
187
+ records = super
188
+
189
+ if Bullet.start?
190
+ if is_a? ::ActiveRecord::Associations::ThroughAssociation
191
+ association = owner.association(reflection.through_reflection.name)
192
+ if association.loaded?
193
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
194
+ Array.wrap(association.target).each do |through_record|
195
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
196
+ end
197
+
198
+ if reflection.through_reflection != through_reflection
199
+ Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
200
+ end
201
+ end
202
+ end
203
+ if @inversed
204
+ Bullet::Detector::Association.add_call_object_associations(owner, reflection.name)
205
+ else
206
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
207
+ end
208
+ if records.first.class.name !~ /^HABTM_/
209
+ if records.size > 1
210
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
211
+ Bullet::Detector::CounterCache.add_possible_objects(records)
212
+ elsif records.size == 1
213
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(records.first)
214
+ Bullet::Detector::CounterCache.add_impossible_object(records.first)
215
+ end
216
+ end
217
+ end
218
+ records
219
+ end
220
+
221
+ def empty?
222
+ if Bullet.start? && !reflection.has_cached_counter?
223
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations)
224
+ end
225
+ super
226
+ end
227
+
228
+ def include?(object)
229
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations) if Bullet.start?
230
+ super
231
+ end
232
+ end
233
+ )
234
+
235
+ ::ActiveRecord::Associations::SingularAssociation.prepend(
236
+ Module.new do
237
+ # call has_one and belongs_to associations
238
+ def target
239
+ result = super()
240
+
241
+ if Bullet.start?
242
+ if owner.class.name !~ /^HABTM_/
243
+ unless @inversed
244
+ if is_a? ::ActiveRecord::Associations::ThroughAssociation
245
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
246
+ association = owner.association(reflection.through_reflection.name)
247
+ Array.wrap(association.target).each do |through_record|
248
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
249
+ end
250
+
251
+ if reflection.through_reflection != through_reflection
252
+ Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
253
+ end
254
+ end
255
+ end
256
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, inversed: @inversed)
257
+ unless @inversed
258
+ if Bullet::Detector::NPlusOneQuery.impossible?(owner)
259
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
260
+ else
261
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result) if result
262
+ end
263
+ end
264
+ end
265
+ end
266
+ result
267
+ end
268
+ end
269
+ )
270
+
271
+ ::ActiveRecord::Associations::HasManyAssociation.prepend(
272
+ Module.new do
273
+ def empty?
274
+ if Bullet.start? && !reflection.has_cached_counter?
275
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations)
276
+ end
277
+ super
278
+ end
279
+
280
+ def count_records
281
+ result = reflection.has_cached_counter?
282
+ if Bullet.start? && !result && !is_a?(::ActiveRecord::Associations::ThroughAssociation)
283
+ Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
284
+ end
285
+ super
286
+ end
287
+ end
288
+ )
289
+
290
+ ::ActiveRecord::Associations::CollectionProxy.prepend(
291
+ Module.new do
292
+ def count(column_name = nil)
293
+ if Bullet.start? && !proxy_association.is_a?(::ActiveRecord::Associations::ThroughAssociation)
294
+ Bullet::Detector::CounterCache.add_counter_cache(
295
+ proxy_association.owner,
296
+ proxy_association.reflection.name
297
+ )
298
+ Bullet::Detector::NPlusOneQuery.call_association(
299
+ proxy_association.owner,
300
+ proxy_association.reflection.name,
301
+ caller_locations
302
+ )
303
+ end
304
+ super(column_name)
305
+ end
306
+ end
307
+ )
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bullet
4
+ module SaveWithBulletSupport
5
+ def _create_record(*)
6
+ super do
7
+ Bullet::Detector::NPlusOneQuery.update_inversed_object(self)
8
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(self)
9
+ yield(self) if block_given?
10
+ end
11
+ end
12
+ end
13
+
14
+ module ActiveRecord
15
+ def self.enable
16
+ require 'active_record'
17
+ ::ActiveRecord::Base.extend(
18
+ Module.new do
19
+ def find_by_sql(sql, binds = [], preparable: nil, &block)
20
+ result = super
21
+ if Bullet.start?
22
+ if result.is_a? Array
23
+ if result.size > 1
24
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
25
+ Bullet::Detector::CounterCache.add_possible_objects(result)
26
+ elsif result.size == 1
27
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
28
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
29
+ end
30
+ elsif result.is_a? ::ActiveRecord::Base
31
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result)
32
+ Bullet::Detector::CounterCache.add_impossible_object(result)
33
+ end
34
+ end
35
+ result
36
+ end
37
+ end
38
+ )
39
+
40
+ ::ActiveRecord::Base.prepend(SaveWithBulletSupport)
41
+
42
+ ::ActiveRecord::Relation.prepend(
43
+ Module.new do
44
+ # if select a collection of objects, then these objects have possible to cause N+1 query.
45
+ # if select only one object, then the only one object has impossible to cause N+1 query.
46
+ def records
47
+ result = super
48
+ if Bullet.start?
49
+ if result.first.class.name !~ /^HABTM_/
50
+ if result.size > 1
51
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result)
52
+ Bullet::Detector::CounterCache.add_possible_objects(result)
53
+ elsif result.size == 1
54
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result.first)
55
+ Bullet::Detector::CounterCache.add_impossible_object(result.first)
56
+ end
57
+ end
58
+ end
59
+ result
60
+ end
61
+ end
62
+ )
63
+
64
+ ::ActiveRecord::Associations::Preloader.prepend(
65
+ Module.new do
66
+ def preloaders_for_one(association, records, scope, polymorphic_parent)
67
+ if Bullet.start?
68
+ records.compact!
69
+ if records.first.class.name !~ /^HABTM_/
70
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, association) }
71
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, association)
72
+ end
73
+ end
74
+ super
75
+ end
76
+
77
+ def preloaders_for_reflection(reflection, records, scope)
78
+ if Bullet.start?
79
+ records.compact!
80
+ if records.first.class.name !~ /^HABTM_/
81
+ records.each { |record| Bullet::Detector::Association.add_object_associations(record, reflection.name) }
82
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(records, reflection.name)
83
+ end
84
+ end
85
+ super
86
+ end
87
+ end
88
+ )
89
+
90
+ ::ActiveRecord::Associations::Preloader::ThroughAssociation.prepend(
91
+ Module.new do
92
+ def preloaded_records
93
+ if Bullet.start? && !defined?(@preloaded_records)
94
+ source_preloaders.each do |source_preloader|
95
+ reflection_name = source_preloader.send(:reflection).name
96
+ source_preloader.send(:owners).each do |owner|
97
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection_name)
98
+ end
99
+ end
100
+ end
101
+ super
102
+ end
103
+ end
104
+ )
105
+
106
+ ::ActiveRecord::Associations::JoinDependency.prepend(
107
+ Module.new do
108
+ def instantiate(result_set, strict_loading_value, &block)
109
+ @bullet_eager_loadings = {}
110
+ records = super
111
+
112
+ if Bullet.start?
113
+ @bullet_eager_loadings.each do |_klazz, eager_loadings_hash|
114
+ objects = eager_loadings_hash.keys
115
+ Bullet::Detector::UnusedEagerLoading.add_eager_loadings(
116
+ objects,
117
+ eager_loadings_hash[objects.first].to_a
118
+ )
119
+ end
120
+ end
121
+ records
122
+ end
123
+
124
+ def construct(ar_parent, parent, row, seen, model_cache, strict_loading_value)
125
+ if Bullet.start?
126
+ unless ar_parent.nil?
127
+ parent.children.each do |node|
128
+ key = aliases.column_alias(node, node.primary_key)
129
+ id = row[key]
130
+ next unless id.nil?
131
+
132
+ associations = [node.reflection.name]
133
+ if node.reflection.through_reflection?
134
+ associations << node.reflection.through_reflection.name
135
+ end
136
+ associations.each do |association|
137
+ Bullet::Detector::Association.add_object_associations(ar_parent, association)
138
+ Bullet::Detector::NPlusOneQuery.call_association(ar_parent, association)
139
+ @bullet_eager_loadings[ar_parent.class] ||= {}
140
+ @bullet_eager_loadings[ar_parent.class][ar_parent] ||= Set.new
141
+ @bullet_eager_loadings[ar_parent.class][ar_parent] << association
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+ super
148
+ end
149
+
150
+ # call join associations
151
+ def construct_model(record, node, row, model_cache, id, strict_loading_value)
152
+ result = super
153
+
154
+ if Bullet.start?
155
+ associations = [node.reflection.name]
156
+ if node.reflection.through_reflection?
157
+ associations << node.reflection.through_reflection.name
158
+ end
159
+ associations.each do |association|
160
+ Bullet::Detector::Association.add_object_associations(record, association)
161
+ Bullet::Detector::NPlusOneQuery.call_association(record, association)
162
+ @bullet_eager_loadings[record.class] ||= {}
163
+ @bullet_eager_loadings[record.class][record] ||= Set.new
164
+ @bullet_eager_loadings[record.class][record] << association
165
+ end
166
+ end
167
+
168
+ result
169
+ end
170
+ end
171
+ )
172
+
173
+ ::ActiveRecord::Associations::Association.prepend(
174
+ Module.new do
175
+ def inversed_from(record)
176
+ if Bullet.start?
177
+ Bullet::Detector::NPlusOneQuery.add_inversed_object(owner, reflection.name)
178
+ end
179
+ super
180
+ end
181
+ end
182
+ )
183
+
184
+ ::ActiveRecord::Associations::CollectionAssociation.prepend(
185
+ Module.new do
186
+ def load_target
187
+ records = super
188
+
189
+ if Bullet.start?
190
+ if is_a? ::ActiveRecord::Associations::ThroughAssociation
191
+ association = owner.association(reflection.through_reflection.name)
192
+ if association.loaded?
193
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
194
+ Array.wrap(association.target).each do |through_record|
195
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
196
+ end
197
+
198
+ if reflection.through_reflection != through_reflection
199
+ Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
200
+ end
201
+ end
202
+ end
203
+ if @inversed
204
+ Bullet::Detector::Association.add_call_object_associations(owner, reflection.name)
205
+ else
206
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name)
207
+ end
208
+ if records.first.class.name !~ /^HABTM_/
209
+ if records.size > 1
210
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(records)
211
+ Bullet::Detector::CounterCache.add_possible_objects(records)
212
+ elsif records.size == 1
213
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(records.first)
214
+ Bullet::Detector::CounterCache.add_impossible_object(records.first)
215
+ end
216
+ end
217
+ end
218
+ records
219
+ end
220
+
221
+ def empty?
222
+ if Bullet.start? && !reflection.has_cached_counter?
223
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations)
224
+ end
225
+ super
226
+ end
227
+
228
+ def include?(object)
229
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations) if Bullet.start?
230
+ super
231
+ end
232
+ end
233
+ )
234
+
235
+ ::ActiveRecord::Associations::SingularAssociation.prepend(
236
+ Module.new do
237
+ # call has_one and belongs_to associations
238
+ def target
239
+ result = super()
240
+
241
+ if Bullet.start?
242
+ if owner.class.name !~ /^HABTM_/
243
+ unless @inversed
244
+ if is_a? ::ActiveRecord::Associations::ThroughAssociation
245
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.through_reflection.name)
246
+ association = owner.association(reflection.through_reflection.name)
247
+ Array.wrap(association.target).each do |through_record|
248
+ Bullet::Detector::NPlusOneQuery.call_association(through_record, source_reflection.name)
249
+ end
250
+
251
+ if reflection.through_reflection != through_reflection
252
+ Bullet::Detector::NPlusOneQuery.call_association(owner, through_reflection.name)
253
+ end
254
+ end
255
+ end
256
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, inversed: @inversed)
257
+ unless @inversed
258
+ if Bullet::Detector::NPlusOneQuery.impossible?(owner)
259
+ Bullet::Detector::NPlusOneQuery.add_impossible_object(result) if result
260
+ else
261
+ Bullet::Detector::NPlusOneQuery.add_possible_objects(result) if result
262
+ end
263
+ end
264
+ end
265
+ end
266
+ result
267
+ end
268
+ end
269
+ )
270
+
271
+ ::ActiveRecord::Associations::HasManyAssociation.prepend(
272
+ Module.new do
273
+ def empty?
274
+ if Bullet.start? && !reflection.has_cached_counter?
275
+ Bullet::Detector::NPlusOneQuery.call_association(owner, reflection.name, caller_locations)
276
+ end
277
+ super
278
+ end
279
+
280
+ def count_records
281
+ result = reflection.has_cached_counter?
282
+ if Bullet.start? && !result && !is_a?(::ActiveRecord::Associations::ThroughAssociation)
283
+ Bullet::Detector::CounterCache.add_counter_cache(owner, reflection.name)
284
+ end
285
+ super
286
+ end
287
+ end
288
+ )
289
+
290
+ ::ActiveRecord::Associations::CollectionProxy.prepend(
291
+ Module.new do
292
+ def count(column_name = nil)
293
+ if Bullet.start? && !proxy_association.is_a?(::ActiveRecord::Associations::ThroughAssociation)
294
+ Bullet::Detector::CounterCache.add_counter_cache(
295
+ proxy_association.owner,
296
+ proxy_association.reflection.name
297
+ )
298
+ Bullet::Detector::NPlusOneQuery.call_association(
299
+ proxy_association.owner,
300
+ proxy_association.reflection.name,
301
+ caller_locations
302
+ )
303
+ end
304
+ super(column_name)
305
+ end
306
+ end
307
+ )
308
+ end
309
+ end
310
+ end