jit_preloader 0.0.7 → 0.0.8
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/lib/jit_preloader/active_record/base.rb +14 -12
- data/lib/jit_preloader/version.rb +1 -1
- data/spec/lib/jit_preloader/preloader_spec.rb +25 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 612515b854cf998692cc121a1b5a04b802f6d287
|
4
|
+
data.tar.gz: fdd24d5df16d9e4239013bba560f1f6ebeee6059
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3514afa58d8942b0e506e6e1daeba465f6214f45fb89016bc98a22b8f5e27e15a7bf18fc0adb589072c07c608d3d9fd14a20dba790446c9534e76769a6f70e4
|
7
|
+
data.tar.gz: 11b3e498bd08b46c9cadce50ad68f0a3ffcccc9df6aa9edc1625ec1bdb2f10fc709f23631d39c0523bd73acdc5507032cf689a5df1cf31069900f48da5a033ea
|
@@ -6,6 +6,11 @@ module JitPreloadExtension
|
|
6
6
|
attr_accessor :jit_preloader
|
7
7
|
attr_accessor :jit_n_plus_one_tracking
|
8
8
|
attr_accessor :jit_preload_aggregates
|
9
|
+
|
10
|
+
def reload(*args)
|
11
|
+
self.jit_preload_aggregates = {}
|
12
|
+
super
|
13
|
+
end
|
9
14
|
end
|
10
15
|
|
11
16
|
class_methods do
|
@@ -14,10 +19,11 @@ module JitPreloadExtension
|
|
14
19
|
def has_many_aggregate(assoc, name, aggregate, field, default: 0)
|
15
20
|
method_name = "#{assoc}_#{name}"
|
16
21
|
|
17
|
-
define_method(method_name) do
|
22
|
+
define_method(method_name) do |conditions={}|
|
18
23
|
self.jit_preload_aggregates ||= {}
|
19
24
|
|
20
|
-
|
25
|
+
key = "#{method_name}|#{conditions.sort.hash}"
|
26
|
+
return jit_preload_aggregates[key] if jit_preload_aggregates.key?(key)
|
21
27
|
if jit_preloader
|
22
28
|
reflection = association(assoc).reflection
|
23
29
|
primary_ids = jit_preloader.records.collect{|r| r[reflection.active_record_primary_key] }
|
@@ -26,27 +32,23 @@ module JitPreloadExtension
|
|
26
32
|
association_scope = klass
|
27
33
|
association_scope = association_scope.instance_exec(&reflection.scope).reorder(nil) if reflection.scope
|
28
34
|
|
35
|
+
conditions[reflection.foreign_key] = primary_ids
|
36
|
+
|
29
37
|
preloaded_data = Hash[association_scope
|
30
|
-
.where(
|
38
|
+
.where(conditions)
|
31
39
|
.group(reflection.foreign_key)
|
32
40
|
.send(aggregate, field)
|
33
41
|
]
|
34
42
|
|
35
43
|
jit_preloader.records.each do |record|
|
36
44
|
record.jit_preload_aggregates ||= {}
|
37
|
-
record.jit_preload_aggregates[
|
45
|
+
record.jit_preload_aggregates[key] = preloaded_data[record.id] || default
|
38
46
|
end
|
39
47
|
else
|
40
|
-
self.jit_preload_aggregates[
|
48
|
+
self.jit_preload_aggregates[key] = send(assoc).where(conditions).send(aggregate, field) || default
|
41
49
|
end
|
42
|
-
jit_preload_aggregates[
|
50
|
+
jit_preload_aggregates[key]
|
43
51
|
end
|
44
|
-
|
45
|
-
def reload(*args)
|
46
|
-
self.jit_preload_aggregates = {}
|
47
|
-
super
|
48
|
-
end
|
49
|
-
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -5,7 +5,8 @@ RSpec.describe JitPreloader::Preloader do
|
|
5
5
|
let!(:contact1) do
|
6
6
|
addresses = [
|
7
7
|
Address.new(street: "123 Fake st", country: canada),
|
8
|
-
Address.new(street: "21 Jump st", country: usa)
|
8
|
+
Address.new(street: "21 Jump st", country: usa),
|
9
|
+
Address.new(street: "90210 Beverly Hills", country: usa)
|
9
10
|
]
|
10
11
|
phones = [
|
11
12
|
PhoneNumber.new(phone: "4445556666"),
|
@@ -40,9 +41,9 @@ RSpec.describe JitPreloader::Preloader do
|
|
40
41
|
end
|
41
42
|
|
42
43
|
context "when preloading an aggregate" do
|
43
|
-
let(:addresses_counts) { [
|
44
|
+
let(:addresses_counts) { [3, 0, 2] }
|
44
45
|
let(:phone_number_counts) { [2, 0, 1] }
|
45
|
-
let(:maxes) { [
|
46
|
+
let(:maxes) { [19, 0, 12] }
|
46
47
|
|
47
48
|
context "without jit_preload" do
|
48
49
|
it "generates N+1 query notifications for each one" do
|
@@ -60,7 +61,10 @@ RSpec.describe JitPreloader::Preloader do
|
|
60
61
|
end
|
61
62
|
|
62
63
|
context "with jit_preload" do
|
63
|
-
|
64
|
+
let(:usa_addresses_counts) { [2, 0, 1] }
|
65
|
+
let(:can_addresses_counts) { [1, 0, 1] }
|
66
|
+
|
67
|
+
it "does NOT generate N+1 query notifications" do
|
64
68
|
ActiveSupport::Notifications.subscribed(callback, "n_plus_one_query") do
|
65
69
|
Contact.jit_preload.each_with_index do |c, i|
|
66
70
|
expect(c.addresses_count).to eql addresses_counts[i]
|
@@ -71,6 +75,13 @@ RSpec.describe JitPreloader::Preloader do
|
|
71
75
|
|
72
76
|
expect(source_map).to eql({})
|
73
77
|
end
|
78
|
+
|
79
|
+
it "can handle dynamic queries" do
|
80
|
+
Contact.jit_preload.each_with_index do |c, i|
|
81
|
+
expect(c.addresses_count(country: usa)).to eql usa_addresses_counts[i]
|
82
|
+
expect(c.addresses_count(country: canada)).to eql can_addresses_counts[i]
|
83
|
+
end
|
84
|
+
end
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
@@ -193,6 +204,16 @@ RSpec.describe JitPreloader::Preloader do
|
|
193
204
|
expect(source_map).to eql({})
|
194
205
|
end
|
195
206
|
end
|
207
|
+
|
208
|
+
context "reload" do
|
209
|
+
it "clears the jit_preload_aggregates" do
|
210
|
+
contact = Contact.jit_preload.first
|
211
|
+
|
212
|
+
contact.addresses_count
|
213
|
+
|
214
|
+
expect { contact.reload }.to change{ contact.jit_preload_aggregates }.to({})
|
215
|
+
end
|
216
|
+
end
|
196
217
|
end
|
197
218
|
end
|
198
219
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jit_preloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle d'Oliveira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|