jit_preloader 0.0.8 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +16 -19
- data/jit_preloader.gemspec +1 -1
- data/lib/jit_preloader.rb +0 -1
- data/lib/jit_preloader/active_record/associations/collection_association.rb +21 -19
- data/lib/jit_preloader/active_record/associations/singular_association.rb +21 -19
- data/lib/jit_preloader/active_record/base.rb +10 -1
- data/lib/jit_preloader/active_record/relation.rb +32 -17
- data/lib/jit_preloader/version.rb +1 -1
- data/spec/lib/jit_preloader/preloader_spec.rb +5 -5
- metadata +10 -5
- data/lib/jit_preloader/active_record/query_methods.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eca89dc638bbbebd84f69ba52f731374496e4e34
|
4
|
+
data.tar.gz: 2126a1bb08e1a80439eb14f2d298d5f571dfce89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27df8fe13432a9026259fba55e00c7de531a619431e6cf803273c652dc9bd31d35062202a3081b6653d980b2c3a8fd160d0e6a60ad64b82930f04b027b718906
|
7
|
+
data.tar.gz: 8f1a8c01680f7a8c25532b7ecb4d80965dbea03c35149e9e25d2b7b08ab328fce139124ddbb151eedc677ff0fd57815a175de7841bafdc779fb7ad3d9e6a4e19
|
data/Gemfile.lock
CHANGED
@@ -1,34 +1,31 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
jit_preloader (0.0.
|
5
|
-
activerecord (
|
4
|
+
jit_preloader (0.0.8)
|
5
|
+
activerecord (> 4.2, < 6)
|
6
6
|
activesupport
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activemodel (
|
12
|
-
activesupport (=
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
activemodel (5.1.1)
|
12
|
+
activesupport (= 5.1.1)
|
13
|
+
activerecord (5.1.1)
|
14
|
+
activemodel (= 5.1.1)
|
15
|
+
activesupport (= 5.1.1)
|
16
|
+
arel (~> 8.0)
|
17
|
+
activesupport (5.1.1)
|
18
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
19
|
i18n (~> 0.7)
|
20
|
-
json (~> 1.7, >= 1.7.7)
|
21
20
|
minitest (~> 5.1)
|
22
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
23
21
|
tzinfo (~> 1.1)
|
24
|
-
arel (
|
25
|
-
builder (3.2.2)
|
22
|
+
arel (8.0.0)
|
26
23
|
byebug (9.0.6)
|
24
|
+
concurrent-ruby (1.0.5)
|
27
25
|
database_cleaner (1.5.3)
|
28
26
|
diff-lcs (1.2.5)
|
29
|
-
i18n (0.
|
30
|
-
|
31
|
-
minitest (5.10.1)
|
27
|
+
i18n (0.8.1)
|
28
|
+
minitest (5.10.2)
|
32
29
|
rake (10.5.0)
|
33
30
|
rspec (3.5.0)
|
34
31
|
rspec-core (~> 3.5.0)
|
@@ -44,8 +41,8 @@ GEM
|
|
44
41
|
rspec-support (~> 3.5.0)
|
45
42
|
rspec-support (3.5.0)
|
46
43
|
sqlite3 (1.3.12)
|
47
|
-
thread_safe (0.3.
|
48
|
-
tzinfo (1.2.
|
44
|
+
thread_safe (0.3.6)
|
45
|
+
tzinfo (1.2.3)
|
49
46
|
thread_safe (~> 0.1)
|
50
47
|
|
51
48
|
PLATFORMS
|
data/jit_preloader.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "activerecord", "
|
21
|
+
spec.add_dependency "activerecord", "> 4.2", "< 6"
|
22
22
|
spec.add_dependency "activesupport"
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.7"
|
data/lib/jit_preloader.rb
CHANGED
@@ -5,7 +5,6 @@ require 'active_record'
|
|
5
5
|
|
6
6
|
require "jit_preloader/version"
|
7
7
|
require 'jit_preloader/active_record/base'
|
8
|
-
require 'jit_preloader/active_record/query_methods'
|
9
8
|
require 'jit_preloader/active_record/relation'
|
10
9
|
require 'jit_preloader/active_record/associations/collection_association'
|
11
10
|
require 'jit_preloader/active_record/associations/singular_association'
|
@@ -1,30 +1,32 @@
|
|
1
|
-
|
1
|
+
module JitPreloader
|
2
|
+
module ActiveRecordAssociationsCollectionAssociation
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
def load_target
|
5
|
+
was_loaded = loaded?
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
if !loaded? && owner.persisted? && owner.jit_preloader
|
8
|
+
owner.jit_preloader.jit_preload(reflection.name)
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
+
jit_loaded = loaded?
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
super.tap do |records|
|
14
|
+
# We should not act on non-persisted objects, or ones that are already loaded.
|
15
|
+
if owner.persisted? && !was_loaded
|
16
|
+
# If we went through a JIT preload, then we will have attached another JitPreloader elsewhere.
|
17
|
+
JitPreloader::Preloader.attach(records) if records.any? && !jit_loaded && JitPreloader.globally_enabled?
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
# If the records were not pre_loaded
|
20
|
+
records.each{ |record| record.jit_n_plus_one_tracking = true }
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
if !jit_loaded && owner.jit_n_plus_one_tracking
|
23
|
+
ActiveSupport::Notifications.publish("n_plus_one_query",
|
24
|
+
source: owner, association: reflection.name)
|
25
|
+
end
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
28
|
-
alias_method_chain :load_target, :jit
|
29
|
-
|
30
30
|
end
|
31
|
+
|
32
|
+
ActiveRecord::Associations::CollectionAssociation.prepend(JitPreloader::ActiveRecordAssociationsCollectionAssociation)
|
@@ -1,29 +1,31 @@
|
|
1
|
-
|
1
|
+
module JitPreloader
|
2
|
+
module ActiveRecordAssociationsSingularAssociation
|
2
3
|
|
3
|
-
|
4
|
-
|
4
|
+
def load_target
|
5
|
+
was_loaded = loaded?
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
if !loaded? && owner.persisted? && owner.jit_preloader
|
8
|
+
owner.jit_preloader.jit_preload(reflection.name)
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
+
jit_loaded = loaded?
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
super.tap do |record|
|
14
|
+
if owner.persisted? && !was_loaded
|
15
|
+
# If the owner doesn't track N+1 queries, then we don't need to worry about
|
16
|
+
# tracking it on the record. This is because you can do something like:
|
17
|
+
# model.foo.bar (where foo and bar are singular associations) and that isn't
|
18
|
+
# always an N+1 query.
|
19
|
+
record.jit_n_plus_one_tracking ||= owner.jit_n_plus_one_tracking if record
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
if !jit_loaded && owner.jit_n_plus_one_tracking
|
22
|
+
ActiveSupport::Notifications.publish("n_plus_one_query",
|
23
|
+
source: owner, association: reflection.name)
|
24
|
+
end
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
27
|
-
alias_method_chain :load_target, :jit
|
28
|
-
|
29
29
|
end
|
30
|
+
|
31
|
+
ActiveRecord::Associations::SingularAssociation.prepend(JitPreloader::ActiveRecordAssociationsSingularAssociation)
|
@@ -8,9 +8,18 @@ module JitPreloadExtension
|
|
8
8
|
attr_accessor :jit_preload_aggregates
|
9
9
|
|
10
10
|
def reload(*args)
|
11
|
-
|
11
|
+
clear_jit_preloader!
|
12
12
|
super
|
13
13
|
end
|
14
|
+
|
15
|
+
def clear_jit_preloader!
|
16
|
+
self.jit_preload_aggregates = {}
|
17
|
+
if jit_preloader
|
18
|
+
jit_preloader.records.delete(self)
|
19
|
+
self.jit_preloader = nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
14
23
|
end
|
15
24
|
|
16
25
|
class_methods do
|
@@ -1,26 +1,41 @@
|
|
1
|
-
|
1
|
+
module JitPreloader
|
2
|
+
module ActiveRecordRelation
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
def jit_preload(*args)
|
5
|
+
spawn.jit_preload!(*args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def jit_preload!(*args)
|
9
|
+
@jit_preload = true
|
10
|
+
self
|
8
11
|
end
|
9
|
-
calculate_without_jit(*args)
|
10
|
-
end
|
11
12
|
|
12
|
-
|
13
|
+
def jit_preload?
|
14
|
+
@jit_preload
|
15
|
+
end
|
16
|
+
|
17
|
+
def calculate(*args)
|
18
|
+
if respond_to?(:proxy_association) && proxy_association.owner && proxy_association.owner.jit_n_plus_one_tracking
|
19
|
+
ActiveSupport::Notifications.publish("n_plus_one_query",
|
20
|
+
source: proxy_association.owner,
|
21
|
+
association: "#{proxy_association.reflection.name}.#{args.first}")
|
22
|
+
end
|
13
23
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
super(*args)
|
25
|
+
end
|
26
|
+
|
27
|
+
def exec_queries
|
28
|
+
super.tap do |records|
|
29
|
+
if limit_value != 1
|
30
|
+
records.each{ |record| record.jit_n_plus_one_tracking = true }
|
31
|
+
if jit_preload? || JitPreloader.globally_enabled?
|
32
|
+
JitPreloader::Preloader.attach(records)
|
33
|
+
end
|
20
34
|
end
|
21
35
|
end
|
22
36
|
end
|
23
|
-
end
|
24
|
-
alias_method_chain :exec_queries, :jit
|
25
37
|
|
38
|
+
end
|
26
39
|
end
|
40
|
+
|
41
|
+
ActiveRecord::Relation.prepend(JitPreloader::ActiveRecordRelation)
|
@@ -146,7 +146,7 @@ RSpec.describe JitPreloader::Preloader do
|
|
146
146
|
ActiveSupport::Notifications.subscribed(callback, "n_plus_one_query") do
|
147
147
|
Contact.find(contact1.id).tap{|c| c.addresses.collect(&:country); c.email_address }
|
148
148
|
end
|
149
|
-
address_queries = Address.where(contact_id: 1).product([[:country]])
|
149
|
+
address_queries = Address.where(contact_id: 1).to_a.product([[:country]])
|
150
150
|
expect(source_map).to eql(Hash[address_queries])
|
151
151
|
end
|
152
152
|
end
|
@@ -157,7 +157,7 @@ RSpec.describe JitPreloader::Preloader do
|
|
157
157
|
Contact.find(contact1.id, contact2.id).each{|c| c.addresses.collect(&:country); c.email_address }
|
158
158
|
end
|
159
159
|
contact_queries = [contact1,contact2].product([[:addresses, :email_address]])
|
160
|
-
address_queries = Address.where(contact_id: contact1.id).product([[:country]])
|
160
|
+
address_queries = Address.where(contact_id: contact1.id).to_a.product([[:country]])
|
161
161
|
|
162
162
|
expect(source_map).to eql(Hash[address_queries.concat(contact_queries)])
|
163
163
|
end
|
@@ -169,7 +169,7 @@ RSpec.describe JitPreloader::Preloader do
|
|
169
169
|
Contact.first.tap{|c| c.addresses.collect(&:country); c.email_address }
|
170
170
|
end
|
171
171
|
|
172
|
-
address_queries = Address.where(contact_id: contact1.id).product([[:country]])
|
172
|
+
address_queries = Address.where(contact_id: contact1.id).to_a.product([[:country]])
|
173
173
|
|
174
174
|
expect(source_map).to eql(Hash[address_queries])
|
175
175
|
end
|
@@ -181,7 +181,7 @@ RSpec.describe JitPreloader::Preloader do
|
|
181
181
|
Contact.all.each{|c| c.addresses.collect(&:country); c.email_address }
|
182
182
|
end
|
183
183
|
contact_queries = [contact1,contact2,contact3].product([[:addresses, :email_address]])
|
184
|
-
address_queries = Address.all.product([[:country]])
|
184
|
+
address_queries = Address.all.to_a.product([[:country]])
|
185
185
|
expect(source_map).to eql(Hash[address_queries.concat(contact_queries)])
|
186
186
|
end
|
187
187
|
|
@@ -191,7 +191,7 @@ RSpec.describe JitPreloader::Preloader do
|
|
191
191
|
Contact.preload(:addresses).each{|c| c.addresses.collect(&:country); c.email_address }
|
192
192
|
end
|
193
193
|
contact_queries = [contact1,contact2,contact3].product([[:email_address]])
|
194
|
-
address_queries = Address.all.product([[:country]])
|
194
|
+
address_queries = Address.all.to_a.product([[:country]])
|
195
195
|
expect(source_map).to eql(Hash[address_queries.concat(contact_queries)])
|
196
196
|
end
|
197
197
|
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
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.1.0
|
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-
|
11
|
+
date: 2017-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.2'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '6'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '4.2'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '6'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: activesupport
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,7 +151,6 @@ files:
|
|
145
151
|
- lib/jit_preloader/active_record/associations/preloader/singular_association.rb
|
146
152
|
- lib/jit_preloader/active_record/associations/singular_association.rb
|
147
153
|
- lib/jit_preloader/active_record/base.rb
|
148
|
-
- lib/jit_preloader/active_record/query_methods.rb
|
149
154
|
- lib/jit_preloader/active_record/relation.rb
|
150
155
|
- lib/jit_preloader/preloader.rb
|
151
156
|
- lib/jit_preloader/version.rb
|