jit_preloader 0.0.8 → 0.1.0

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 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