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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 612515b854cf998692cc121a1b5a04b802f6d287
4
- data.tar.gz: fdd24d5df16d9e4239013bba560f1f6ebeee6059
3
+ metadata.gz: eca89dc638bbbebd84f69ba52f731374496e4e34
4
+ data.tar.gz: 2126a1bb08e1a80439eb14f2d298d5f571dfce89
5
5
  SHA512:
6
- metadata.gz: f3514afa58d8942b0e506e6e1daeba465f6214f45fb89016bc98a22b8f5e27e15a7bf18fc0adb589072c07c608d3d9fd14a20dba790446c9534e76769a6f70e4
7
- data.tar.gz: 11b3e498bd08b46c9cadce50ad68f0a3ffcccc9df6aa9edc1625ec1bdb2f10fc709f23631d39c0523bd73acdc5507032cf689a5df1cf31069900f48da5a033ea
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.6)
5
- activerecord (~> 4.2)
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 (4.2.7.1)
12
- activesupport (= 4.2.7.1)
13
- builder (~> 3.1)
14
- activerecord (4.2.7.1)
15
- activemodel (= 4.2.7.1)
16
- activesupport (= 4.2.7.1)
17
- arel (~> 6.0)
18
- activesupport (4.2.7.1)
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 (6.0.3)
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.7.0)
30
- json (1.8.3)
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.5)
48
- tzinfo (1.2.2)
44
+ thread_safe (0.3.6)
45
+ tzinfo (1.2.3)
49
46
  thread_safe (~> 0.1)
50
47
 
51
48
  PLATFORMS
@@ -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", "~> 4.2"
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
- class ActiveRecord::Associations::CollectionAssociation
1
+ module JitPreloader
2
+ module ActiveRecordAssociationsCollectionAssociation
2
3
 
3
- def load_target_with_jit
4
- was_loaded = loaded?
4
+ def load_target
5
+ was_loaded = loaded?
5
6
 
6
- if !loaded? && owner.persisted? && owner.jit_preloader
7
- owner.jit_preloader.jit_preload(reflection.name)
8
- end
7
+ if !loaded? && owner.persisted? && owner.jit_preloader
8
+ owner.jit_preloader.jit_preload(reflection.name)
9
+ end
9
10
 
10
- jit_loaded = loaded?
11
+ jit_loaded = loaded?
11
12
 
12
- load_target_without_jit.tap do |records|
13
- # We should not act on non-persisted objects, or ones that are already loaded.
14
- if owner.persisted? && !was_loaded
15
- # If we went through a JIT preload, then we will have attached another JitPreloader elsewhere.
16
- JitPreloader::Preloader.attach(records) if records.any? && !jit_loaded && JitPreloader.globally_enabled?
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
- # If the records were not pre_loaded
19
- records.each{ |record| record.jit_n_plus_one_tracking = true }
19
+ # If the records were not pre_loaded
20
+ records.each{ |record| record.jit_n_plus_one_tracking = true }
20
21
 
21
- if !jit_loaded && owner.jit_n_plus_one_tracking
22
- ActiveSupport::Notifications.publish("n_plus_one_query",
23
- source: owner, association: reflection.name)
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
- class ActiveRecord::Associations::SingularAssociation
1
+ module JitPreloader
2
+ module ActiveRecordAssociationsSingularAssociation
2
3
 
3
- def load_target_with_jit
4
- was_loaded = loaded?
4
+ def load_target
5
+ was_loaded = loaded?
5
6
 
6
- if !loaded? && owner.persisted? && owner.jit_preloader
7
- owner.jit_preloader.jit_preload(reflection.name)
8
- end
7
+ if !loaded? && owner.persisted? && owner.jit_preloader
8
+ owner.jit_preloader.jit_preload(reflection.name)
9
+ end
9
10
 
10
- jit_loaded = loaded?
11
+ jit_loaded = loaded?
11
12
 
12
- load_target_without_jit.tap do |record|
13
- if owner.persisted? && !was_loaded
14
- # If the owner doesn't track N+1 queries, then we don't need to worry about
15
- # tracking it on the record. This is because you can do something like:
16
- # model.foo.bar (where foo and bar are singular associations) and that isn't
17
- # always an N+1 query.
18
- record.jit_n_plus_one_tracking ||= owner.jit_n_plus_one_tracking if record
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
- if !jit_loaded && owner.jit_n_plus_one_tracking
21
- ActiveSupport::Notifications.publish("n_plus_one_query",
22
- source: owner, association: reflection.name)
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
- self.jit_preload_aggregates = {}
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
- class ActiveRecord::Relation
1
+ module JitPreloader
2
+ module ActiveRecordRelation
2
3
 
3
- def calculate_with_jit(*args)
4
- if respond_to?(:proxy_association) && proxy_association.owner && proxy_association.owner.jit_n_plus_one_tracking
5
- ActiveSupport::Notifications.publish("n_plus_one_query",
6
- source: proxy_association.owner,
7
- association: "#{proxy_association.reflection.name}.#{args.first}")
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
- alias_method_chain :calculate, :jit
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
- def exec_queries_with_jit
15
- exec_queries_without_jit.tap do |records|
16
- if limit_value != 1
17
- records.each{ |record| record.jit_n_plus_one_tracking = true }
18
- if jit_preload? || JitPreloader.globally_enabled?
19
- JitPreloader::Preloader.attach(records)
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)
@@ -1,3 +1,3 @@
1
1
  module JitPreloader
2
- VERSION = "0.0.8"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -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.8
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-03-21 00:00:00.000000000 Z
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
@@ -1,16 +0,0 @@
1
- module ActiveRecord::QueryMethods
2
-
3
- def jit_preload(*args)
4
- spawn.jit_preload!(*args)
5
- end
6
-
7
- def jit_preload!(*args)
8
- @jit_preload = true
9
- self
10
- end
11
-
12
- def jit_preload?
13
- @jit_preload
14
- end
15
-
16
- end