activerecord-shard_for 0.4.1 → 0.5.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 +4 -4
- data/.rubocop.yml +4 -0
- data/.travis.yml +8 -4
- data/CHANGELOG.md +4 -0
- data/activerecord-shard_for.gemspec +2 -6
- data/lib/activerecord/shard_for.rb +3 -0
- data/lib/activerecord/shard_for/abstract_shard_repository.rb +37 -0
- data/lib/activerecord/shard_for/model.rb +7 -0
- data/lib/activerecord/shard_for/shard_repogitory.rb +5 -33
- data/lib/activerecord/shard_for/sti.rb +12 -0
- data/lib/activerecord/shard_for/sti_shard_repository.rb +40 -0
- data/lib/activerecord/shard_for/version.rb +1 -1
- metadata +11 -64
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7598d89f3c2df373c8936c3df0e9e77e6b1f96f6
|
|
4
|
+
data.tar.gz: f9b9a4405849837c138184f68ad12e8374340c8f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1f95be02a5787e073cb98f04059633cfb629c00e6c9854e22e0a590408162e0abd1299f5039f0f3710e1b79c7963f3d7c799094fe1e052668bbb848394df9089
|
|
7
|
+
data.tar.gz: 5f56d475a656397f86282a5930bbc2b0ab9c5aa2609bf453ca28ad92432251421331683041be42381ef9d57e5b438d23adc7f3a18f95807d44149882bb5b293d
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
|
@@ -3,18 +3,20 @@ sudo: false
|
|
|
3
3
|
rvm:
|
|
4
4
|
- 2.2.4
|
|
5
5
|
- 2.3.1
|
|
6
|
+
- 2.4.0
|
|
6
7
|
branches:
|
|
7
8
|
only:
|
|
8
9
|
- master
|
|
9
|
-
before_install:
|
|
10
|
+
before_install:
|
|
11
|
+
- gem update --system
|
|
12
|
+
- gem update --remote bundler
|
|
10
13
|
cache: bundler
|
|
11
14
|
script:
|
|
12
|
-
- CODECLIMATE_REPO_TOKEN=dfc951e2d70b56ee62ffe989eb6286a6f21bf57209ccbd111bd336c372d8d06e bundle exec rspec
|
|
13
15
|
- bundle exec rubocop
|
|
14
16
|
- bundle exec ruby spec/performance_test.rb
|
|
17
|
+
- bundle exec rspec
|
|
18
|
+
- CODECLIMATE_REPO_TOKEN=dfc951e2d70b56ee62ffe989eb6286a6f21bf57209ccbd111bd336c372d8d06e bundle exec codeclimate-test-reporter
|
|
15
19
|
gemfile:
|
|
16
|
-
- gemfiles/ar_4.1.0.gemfile
|
|
17
|
-
- gemfiles/ar_4.1.7.gemfile
|
|
18
20
|
- gemfiles/ar_4.1.8.gemfile
|
|
19
21
|
- gemfiles/ar_4.2.gemfile
|
|
20
22
|
- gemfiles/ar_5.0.gemfile
|
|
@@ -27,6 +29,8 @@ matrix:
|
|
|
27
29
|
gemfile: gemfiles/rails_edge.gemfile
|
|
28
30
|
- rvm: 2.1.9
|
|
29
31
|
gemfile: gemfiles/ar_5.0.gemfile
|
|
32
|
+
- rvm: 2.4.0
|
|
33
|
+
gemfile: gemfiles/ar_4.1.8.gemfile
|
|
30
34
|
notifications:
|
|
31
35
|
slack:
|
|
32
36
|
secure: S1W/Lw+dH3wb8FfkMIWPZmr6M4Q6S2WMkSlanpKva1HM7K5QL7hXdmUl2yBUxJE26BHSsb1ScozMEzadyda2+i/W34UvZ7LXgKeHkUKEdjy/AmsSJPK1ZjMfgnv10tVgbEIusNb4bF/sSuChdZKK3ILwOlqIPDlQNdMwF1xRA2xt5J7tb26UgyIzoCI4P3bJYMULWsEkk+UwHiJH0YO9ulkTZI/j0N+hLXQLJTZPjmKtMk/tE0NbBmFVL4md89hUcR5gKTGGrNzEMJ58K+zqeDG/DubkcIbA5ZuqKv+oE5m0pDODZExxnC+oeENTvq/VfYwOfD0pTDrBNYjj+Bm3YiyGDzQAgov9XPDG8g/fKEs/LNAT79UZXkZlFO99Yn/vrYH9o5DKpOE9smENUXylb55MgLTUiYe17CTp7pB3trbJl3wwIbLjSmTjAdSUNgPv8qDP4uk3K4U32mknXCDDkU9EI7f6F731ocdoxsGarEBcPcgjs73Y84iwDteQp847Gigtgo4Y4TCWH657uzLolR2O8NSw+vWT0VNI9qtR5PZD7iVYtSp1qHtPAKowCztodewY2Nu+Ds9Z95udf4GPUkFg/SNEJPTPrQFLiiJZ8UYP8NJEuA+IP1tc2zG3zU/ADrjenRC1ZiupQG7OMH82y11408U6PcHFSlF+7NuDkac=
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# CHANGELOG for activerecord-shard_for
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
- Support Single Table Inheritance. [#14](https://github.com/yuemori/activerecord-shard_for/pull/14)
|
|
6
|
+
|
|
3
7
|
## 0.4.1
|
|
4
8
|
|
|
5
9
|
- Fix defined_enums is empty. [#11](https://github.com/yuemori/activerecord-shard_for/pull/11)
|
|
@@ -26,14 +26,10 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
|
27
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
|
28
28
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
29
|
-
spec.add_development_dependency 'pry'
|
|
30
|
-
spec.add_development_dependency 'pry-doc'
|
|
31
|
-
spec.add_development_dependency 'pry-stack_explorer'
|
|
32
|
-
spec.add_development_dependency 'pry-inline'
|
|
33
|
-
spec.add_development_dependency 'pry-rescue'
|
|
29
|
+
spec.add_development_dependency 'pry-byebug'
|
|
34
30
|
spec.add_development_dependency 'rubocop'
|
|
35
31
|
spec.add_development_dependency 'appraisal'
|
|
36
32
|
spec.add_development_dependency 'sqlite3'
|
|
37
33
|
spec.add_development_dependency 'rspec-parameterized'
|
|
38
|
-
spec.add_development_dependency 'codeclimate-test-reporter'
|
|
34
|
+
spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0.0'
|
|
39
35
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'active_record'
|
|
2
2
|
require 'expeditor'
|
|
3
3
|
require 'activerecord/shard_for/version'
|
|
4
|
+
require 'activerecord/shard_for/abstract_shard_repository'
|
|
4
5
|
require 'activerecord/shard_for/config'
|
|
5
6
|
require 'activerecord/shard_for/cluster_config'
|
|
6
7
|
require 'activerecord/shard_for/model'
|
|
@@ -14,6 +15,8 @@ require 'activerecord/shard_for/all_shards_in_parallel'
|
|
|
14
15
|
require 'activerecord/shard_for/replication_mapping'
|
|
15
16
|
require 'activerecord/shard_for/railtie' if defined?(Rails)
|
|
16
17
|
require 'activerecord/shard_for/patch'
|
|
18
|
+
require 'activerecord/shard_for/sti'
|
|
19
|
+
require 'activerecord/shard_for/sti_shard_repository'
|
|
17
20
|
|
|
18
21
|
module ActiveRecord
|
|
19
22
|
module ShardFor
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ShardFor
|
|
3
|
+
class AbstractShardRepository
|
|
4
|
+
attr_reader :shards
|
|
5
|
+
|
|
6
|
+
# @param [Symbol] connection_name
|
|
7
|
+
# @return [Class] A model class for this shard
|
|
8
|
+
def fetch(connection_name)
|
|
9
|
+
shards.fetch(connection_name)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# @param [Object] key sharding key object for connection
|
|
13
|
+
# @return [Class, nil] A AR model class.
|
|
14
|
+
def fetch_by_key(key)
|
|
15
|
+
shards.values.find do |model|
|
|
16
|
+
case model.assigned_key
|
|
17
|
+
when Range then model.assigned_key.include?(key)
|
|
18
|
+
else model.assigned_key == key
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @return [Array<Class>]
|
|
24
|
+
def all
|
|
25
|
+
shards.values
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# @param [Symbol] connection_name
|
|
31
|
+
# @return [String]
|
|
32
|
+
def generate_class_name(connection_name)
|
|
33
|
+
"ShardFor#{connection_name.to_s.tr('-', '_').classify}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -44,6 +44,13 @@ module ActiveRecord
|
|
|
44
44
|
shard_repository.fetch(connection_name)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
+
# Evaluate block in all shard instances.
|
|
48
|
+
def shard_eval(&block)
|
|
49
|
+
all_shards.each do |shard|
|
|
50
|
+
shard.class_eval(&block)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
47
54
|
# Create new record with given attributes in proper shard for given key.
|
|
48
55
|
# When distkey value is empty, raises ActiveRecord::ShardFor::MissingDistkeyAttribute
|
|
49
56
|
# error.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ShardFor
|
|
3
|
-
class ShardRepogitory
|
|
3
|
+
class ShardRepogitory < AbstractShardRepository
|
|
4
4
|
attr_reader :base_class
|
|
5
5
|
|
|
6
6
|
# @param [ClusterConfig] cluster_config
|
|
@@ -8,33 +8,11 @@ module ActiveRecord
|
|
|
8
8
|
def initialize(cluster_config, base_class)
|
|
9
9
|
@base_class = base_class
|
|
10
10
|
|
|
11
|
-
shards = cluster_config.connection_registry.
|
|
12
|
-
|
|
11
|
+
@shards = cluster_config.connection_registry.each_with_object({}) do |(key, connection_name), hash|
|
|
12
|
+
model = generate_model_for_shard(connection_name, key)
|
|
13
|
+
base_class.const_set(:"#{generate_class_name(connection_name)}", model)
|
|
14
|
+
hash[connection_name] = model
|
|
13
15
|
end
|
|
14
|
-
|
|
15
|
-
@shards = Hash[shards]
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# @param [Symbol] connection_name
|
|
19
|
-
# @return [Class] A model class for this shard
|
|
20
|
-
def fetch(connection_name)
|
|
21
|
-
@shards.fetch(connection_name)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# @param [Object] key sharding key object for connection
|
|
25
|
-
# @return [Class, nil] A AR model class.
|
|
26
|
-
def fetch_by_key(key)
|
|
27
|
-
@shards.values.find do |model|
|
|
28
|
-
case model.assigned_key
|
|
29
|
-
when Range then model.assigned_key.include?(key)
|
|
30
|
-
else model.assigned_key == key
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
# @return [Array<Class>]
|
|
36
|
-
def all
|
|
37
|
-
@shards.values
|
|
38
16
|
end
|
|
39
17
|
|
|
40
18
|
private
|
|
@@ -63,12 +41,6 @@ module ActiveRecord
|
|
|
63
41
|
model.class_eval { establish_connection(connection_name) }
|
|
64
42
|
model
|
|
65
43
|
end
|
|
66
|
-
|
|
67
|
-
# @param [Symbol] connection_name
|
|
68
|
-
# @return [String]
|
|
69
|
-
def generate_class_name(connection_name)
|
|
70
|
-
"ShardFor#{connection_name.to_s.tr('-', '_').classify}"
|
|
71
|
-
end
|
|
72
44
|
end
|
|
73
45
|
end
|
|
74
46
|
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ShardFor
|
|
3
|
+
class STIShardRepository < AbstractShardRepository
|
|
4
|
+
attr_reader :inherited_class
|
|
5
|
+
|
|
6
|
+
# @param [Class] A sub class of AR model.
|
|
7
|
+
# @base_shards [Array<Class>] An array of shard models.
|
|
8
|
+
def initialize(inherited_class, base_shards)
|
|
9
|
+
@inherited_class = inherited_class
|
|
10
|
+
|
|
11
|
+
@shards = base_shards.each_with_object({}) do |(connection_name, base_model), hash|
|
|
12
|
+
model = generate_model_from_shard(connection_name, base_model)
|
|
13
|
+
inherited_class.const_set(:"#{generate_class_name(connection_name)}", model)
|
|
14
|
+
hash[connection_name] = model
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# @param [Symbol] connection_name
|
|
21
|
+
# @param [Class] A class of shard model.
|
|
22
|
+
# @return [Class] A sub class of given model.
|
|
23
|
+
def generate_model_from_shard(connection_name, base_model)
|
|
24
|
+
class_name = generate_class_name(connection_name)
|
|
25
|
+
module_name = inherited_class.name
|
|
26
|
+
|
|
27
|
+
model = Class.new(base_model) do
|
|
28
|
+
@assigned_key = base_model.assigned_key
|
|
29
|
+
|
|
30
|
+
module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
31
|
+
def self.name
|
|
32
|
+
"#{module_name}::#{class_name}"
|
|
33
|
+
end
|
|
34
|
+
RUBY
|
|
35
|
+
end
|
|
36
|
+
model
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord-shard_for
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- yuemori
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-01-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|
|
@@ -95,63 +95,7 @@ dependencies:
|
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '3.0'
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name: pry
|
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
|
100
|
-
requirements:
|
|
101
|
-
- - ">="
|
|
102
|
-
- !ruby/object:Gem::Version
|
|
103
|
-
version: '0'
|
|
104
|
-
type: :development
|
|
105
|
-
prerelease: false
|
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - ">="
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: pry-doc
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - ">="
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0'
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
|
-
- !ruby/object:Gem::Dependency
|
|
126
|
-
name: pry-stack_explorer
|
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
|
128
|
-
requirements:
|
|
129
|
-
- - ">="
|
|
130
|
-
- !ruby/object:Gem::Version
|
|
131
|
-
version: '0'
|
|
132
|
-
type: :development
|
|
133
|
-
prerelease: false
|
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
-
requirements:
|
|
136
|
-
- - ">="
|
|
137
|
-
- !ruby/object:Gem::Version
|
|
138
|
-
version: '0'
|
|
139
|
-
- !ruby/object:Gem::Dependency
|
|
140
|
-
name: pry-inline
|
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
|
142
|
-
requirements:
|
|
143
|
-
- - ">="
|
|
144
|
-
- !ruby/object:Gem::Version
|
|
145
|
-
version: '0'
|
|
146
|
-
type: :development
|
|
147
|
-
prerelease: false
|
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
-
requirements:
|
|
150
|
-
- - ">="
|
|
151
|
-
- !ruby/object:Gem::Version
|
|
152
|
-
version: '0'
|
|
153
|
-
- !ruby/object:Gem::Dependency
|
|
154
|
-
name: pry-rescue
|
|
98
|
+
name: pry-byebug
|
|
155
99
|
requirement: !ruby/object:Gem::Requirement
|
|
156
100
|
requirements:
|
|
157
101
|
- - ">="
|
|
@@ -224,16 +168,16 @@ dependencies:
|
|
|
224
168
|
name: codeclimate-test-reporter
|
|
225
169
|
requirement: !ruby/object:Gem::Requirement
|
|
226
170
|
requirements:
|
|
227
|
-
- - "
|
|
171
|
+
- - "~>"
|
|
228
172
|
- !ruby/object:Gem::Version
|
|
229
|
-
version:
|
|
173
|
+
version: 1.0.0
|
|
230
174
|
type: :development
|
|
231
175
|
prerelease: false
|
|
232
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
233
177
|
requirements:
|
|
234
|
-
- - "
|
|
178
|
+
- - "~>"
|
|
235
179
|
- !ruby/object:Gem::Version
|
|
236
|
-
version:
|
|
180
|
+
version: 1.0.0
|
|
237
181
|
description: Database sharding library for ActiveRecord
|
|
238
182
|
email:
|
|
239
183
|
- yuemori@aiming-inc.com
|
|
@@ -263,6 +207,7 @@ files:
|
|
|
263
207
|
- gemfiles/ar_5.0.gemfile
|
|
264
208
|
- gemfiles/rails_edge.gemfile
|
|
265
209
|
- lib/activerecord/shard_for.rb
|
|
210
|
+
- lib/activerecord/shard_for/abstract_shard_repository.rb
|
|
266
211
|
- lib/activerecord/shard_for/all_shards_in_parallel.rb
|
|
267
212
|
- lib/activerecord/shard_for/cluster_config.rb
|
|
268
213
|
- lib/activerecord/shard_for/config.rb
|
|
@@ -276,6 +221,8 @@ files:
|
|
|
276
221
|
- lib/activerecord/shard_for/railtie.rb
|
|
277
222
|
- lib/activerecord/shard_for/replication_mapping.rb
|
|
278
223
|
- lib/activerecord/shard_for/shard_repogitory.rb
|
|
224
|
+
- lib/activerecord/shard_for/sti.rb
|
|
225
|
+
- lib/activerecord/shard_for/sti_shard_repository.rb
|
|
279
226
|
- lib/activerecord/shard_for/version.rb
|
|
280
227
|
- lib/activerecord/tasks/activerecord_shard_for.rake
|
|
281
228
|
homepage: https://github.com/yuemori/activerecord-shard_for
|
|
@@ -298,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
298
245
|
version: '0'
|
|
299
246
|
requirements: []
|
|
300
247
|
rubyforge_project:
|
|
301
|
-
rubygems_version: 2.
|
|
248
|
+
rubygems_version: 2.6.10
|
|
302
249
|
signing_key:
|
|
303
250
|
specification_version: 4
|
|
304
251
|
summary: Database sharding library for ActiveRecord
|