activerecord-turntable 2.4.0 → 2.5.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: 1d9d385f15413261bc87c1e2444193c53a9ee657
4
- data.tar.gz: '009577b936eded2be655a3b850787a14dfd03cbf'
3
+ metadata.gz: 7bae4fd19e4b7b55c12f1793b954e711e0c9693b
4
+ data.tar.gz: b5da25ad60b9b02b3d6483f59d940a87a832d65f
5
5
  SHA512:
6
- metadata.gz: ce1c55a07c1b94377e206d4cf97b2fbb961bb0bf1025d0150c540771eff0fa56df3f0360741b4102aaef698c5913da463fc459c23016b7c28c699fac79e5c548
7
- data.tar.gz: e74cfd821f2c84ddeec7a950335a017f8cc058cece9daee3ce2f5c3a67a3969009a5486714cd822eef412c6f01f595e001f8685f1bce4cdb82f750951ea008e5
6
+ metadata.gz: 7bef5cc2a9020bfb5f7158cef8c6935359c3bc77d8e9f7b28dfc88375eccdb9dfde5f7ae2becbf48fc07af6fd793b492f3c13735c982cfab9f1e501939c6550a
7
+ data.tar.gz: 3fda72ec78a460652cd460426f04a35bdb473f96f3bcd1241e594fc5ba401e5c619789dbe28d16652dd649eb78b98bb60ebd98919a691bee43eab4c25c8814c8
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## activerecord-turntable 2.5.0 ##
2
+
3
+ ### Improvement
4
+
5
+ * Fix to propagate shard conditions to `AssociationRelation` too
6
+
1
7
  ## activerecord-turntable 2.4.0 ##
2
8
 
3
9
  ### Incompatible Change
@@ -38,6 +38,7 @@ module ActiveRecord::Turntable
38
38
  autoload :Mixer
39
39
  autoload :PoolProxy
40
40
  autoload :Shard
41
+ autoload :ShardingCondition
41
42
  autoload :SeqShard
42
43
  autoload :Sequencer
43
44
  end
@@ -31,7 +31,7 @@ module ActiveRecord::Turntable
31
31
  include ConnectionHandlerExtension
32
32
  end
33
33
  ActiveRecord::Associations::Preloader::Association.send(:include, AssociationPreloader)
34
- ActiveRecord::Associations::Association.send(:include, Association)
34
+ ActiveRecord::Associations::Association.send(:prepend, Association)
35
35
  require 'active_record/turntable/active_record_ext/fixtures'
36
36
  require 'active_record/turntable/active_record_ext/migration_proxy'
37
37
  require 'active_record/turntable/active_record_ext/activerecord_import_ext'
@@ -1,139 +1,32 @@
1
- require 'active_record/associations'
1
+ require "active_record/associations"
2
2
 
3
3
  module ActiveRecord::Turntable
4
4
  module ActiveRecordExt
5
5
  module Association
6
- extend ActiveSupport::Concern
6
+ include ShardingCondition
7
7
 
8
- included do
9
- ActiveRecord::Associations::SingularAssociation.send(:include, SingularAssociationExt)
10
- ActiveRecord::Associations::CollectionAssociation.send(:include, CollectionAssociationExt)
11
- ActiveRecord::Associations::Builder::Association.valid_options += [:foreign_shard_key]
8
+ def self.prepended(mod)
9
+ ActiveRecord::Associations::Builder::Association.valid_options << :foreign_shard_key
12
10
  end
13
11
 
14
- private
15
-
16
- def turntable_scope(scope, bind = nil)
17
- if should_use_shard_key?
18
- scope = scope.where(klass.turntable_shard_key => owner.send(foreign_shard_key))
19
- end
20
- scope
21
- end
22
-
23
- module SingularAssociationExt
24
- extend ActiveSupport::Concern
25
-
26
- included do
27
- if Util.ar42_or_later?
28
- alias_method_chain :get_records, :turntable
29
- else
30
- alias_method_chain :find_target, :turntable
31
- end
32
- end
33
-
34
- # @note Override to add sharding condition for singular association
35
- if Util.ar42_or_later?
36
- def get_records_with_turntable
37
- if reflection.scope_chain.any?(&:any?) ||
38
- scope.eager_loading? ||
39
- klass.current_scope ||
40
- klass.default_scopes.any? ||
41
- should_use_shard_key? # OPTIMIZE: Use bind values if cachable scope
42
-
43
- return turntable_scope(scope).limit(1).to_a
44
- end
45
-
46
- conn = klass.connection
47
- sc = reflection.association_scope_cache(conn, owner) do
48
- ActiveRecord::StatementCache.create(conn) { |params|
49
- as = ActiveRecord::Associations::AssociationScope.create { params.bind }
50
- target_scope.merge(as.scope(self, conn)).limit(1)
51
- }
52
- end
53
-
54
- binds = ActiveRecord::Associations::AssociationScope.get_bind_values(owner, reflection.chain)
55
- sc.execute binds, klass, klass.connection
56
- end
57
- elsif Util.ar41_or_later?
58
- def find_target_with_turntable
59
- if record = turntable_scope(scope).take
60
- set_inverse_instance record
61
- end
62
- end
63
- else
64
- def find_target_with_turntable
65
- turntable_scope(scope).take.tap { |record| set_inverse_instance(record) }
66
- end
67
- end
68
- end
12
+ protected
69
13
 
70
- module CollectionAssociationExt
71
- extend ActiveSupport::Concern
14
+ # @note Override to pass shard key conditions
15
+ def target_scope
16
+ return super unless should_use_shard_key?
72
17
 
73
- included do
74
- if Util.ar42_or_later?
75
- alias_method_chain :get_records, :turntable
76
- else
77
- alias_method_chain :find_target, :turntable
78
- end
18
+ scope = klass.where(
19
+ klass.turntable_shard_key =>
20
+ owner.send(foreign_shard_key)
21
+ )
22
+ super.merge!(scope)
79
23
  end
80
24
 
81
- private
82
-
83
- if Util.ar42_or_later?
84
- def get_records_with_turntable
85
- if reflection.scope_chain.any?(&:any?) ||
86
- scope.eager_loading? ||
87
- klass.current_scope ||
88
- klass.default_scopes.any? ||
89
- should_use_shard_key? # OPTIMIZE: Use bind values if cachable scope
90
-
91
- return turntable_scope(scope).to_a
92
- end
93
-
94
- conn = klass.connection
95
- sc = reflection.association_scope_cache(conn, owner) do
96
- ActiveRecord::StatementCache.create(conn) { |params|
97
- as = ActiveRecord::Associations::AssociationScope.create { params.bind }
98
- target_scope.merge as.scope(self, conn)
99
- }
100
- end
101
-
102
- binds = ActiveRecord::Associations::AssociationScope.get_bind_values(owner, reflection.chain)
103
- sc.execute binds, klass, klass.connection
104
- end
105
- else
106
- # @note Override to add sharding condition for collection association
107
- def find_target_with_turntable
108
- records =
109
- if options[:finder_sql]
110
- reflection.klass.find_by_sql(custom_finder_sql)
111
- else
112
- current_scope = scope
113
- if should_use_shard_key?
114
- current_scope = current_scope.where(klass.turntable_shard_key => owner.send(foreign_shard_key))
115
- end
116
- current_scope.to_a
117
- end
118
- records.each { |record| set_inverse_instance(record) }
119
- records
120
- end
121
- end
122
- end
123
-
124
25
  private
125
26
 
126
- def foreign_shard_key
127
- options[:foreign_shard_key] || owner.turntable_shard_key
128
- end
129
-
130
- def should_use_shard_key?
131
- same_association_shard_key? || !!options[:foreign_shard_key]
132
- end
133
-
134
- def same_association_shard_key?
135
- owner.class.turntable_enabled? && klass.turntable_enabled? && foreign_shard_key == klass.turntable_shard_key
136
- end
27
+ def skip_statement_cache?
28
+ super || should_use_shard_key?
29
+ end
137
30
  end
138
31
  end
139
32
  end
@@ -0,0 +1,23 @@
1
+ module ActiveRecord::Turntable
2
+ module ShardingCondition
3
+ private
4
+
5
+ def foreign_shard_key
6
+ options[:foreign_shard_key] || foreign_target_model.turntable_shard_key
7
+ end
8
+
9
+ def foreign_target_model
10
+ respond_to?(:model) ? model : owner
11
+ end
12
+
13
+ def should_use_shard_key?
14
+ sharded_by_same_key? || !!options[:foreign_shard_key]
15
+ end
16
+
17
+ def sharded_by_same_key?
18
+ foreign_target_model.turntable_enabled? &&
19
+ klass.turntable_enabled? &&
20
+ foreign_shard_key == klass.turntable_shard_key
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Turntable
3
- VERSION = "2.4.0"
3
+ VERSION = "2.5.0"
4
4
  end
5
5
  end
@@ -47,11 +47,20 @@ describe ActiveRecord::Turntable::ActiveRecordExt::Association do
47
47
  ActiveRecord::Base.turntable_config.instance_variable_get(:@config)[:raise_on_not_specified_shard_query] = true
48
48
  end
49
49
  let(:cards_user) { CardsUser.where(user: user).first }
50
+ let(:cards_users_history) { cards_users_histories.find { |history| history.user_id == user.id } }
50
51
 
51
52
  context "associated objects has same turntable_key" do
52
- subject { cards_user.cards_users_histories.to_a }
53
- it { expect { subject }.to_not raise_error }
54
- it { is_expected.to include(*cards_users_histories.select { |history| history.cards_user_id == cards_user.id }) }
53
+ context "AssociationRelation#to_a" do
54
+ subject { cards_user.cards_users_histories.to_a }
55
+ it { expect { subject }.to_not raise_error }
56
+ it { is_expected.to include(*cards_users_histories.select { |history| history.cards_user_id == cards_user.id }) }
57
+ end
58
+
59
+ context "AssociationRelation#where" do
60
+ subject { cards_user.cards_users_histories.where(id: cards_users_history.id).to_a }
61
+ it { expect { subject }.to_not raise_error }
62
+ it { is_expected.to include(cards_users_history) }
63
+ end
55
64
  end
56
65
 
57
66
  context "associated objects has different turntable_key" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-turntable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - gussan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-02 00:00:00.000000000 Z
12
+ date: 2017-01-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -412,6 +412,7 @@ files:
412
412
  - lib/active_record/turntable/sequencer/barrage.rb
413
413
  - lib/active_record/turntable/sequencer/mysql.rb
414
414
  - lib/active_record/turntable/shard.rb
415
+ - lib/active_record/turntable/sharding_condition.rb
415
416
  - lib/active_record/turntable/sql_tree_patch.rb
416
417
  - lib/active_record/turntable/util.rb
417
418
  - lib/active_record/turntable/version.rb