activerecord-shard_for 0.1.2 → 0.2.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 +1 -0
- data/.travis.yml +29 -2
- data/CHANGELOG.md +10 -0
- data/Guardfile +1 -1
- data/README.md +104 -7
- data/activerecord-shard_for.gemspec +1 -0
- data/gemfiles/ar_4.1.0.gemfile.lock +10 -1
- data/gemfiles/ar_4.1.7.gemfile.lock +10 -1
- data/gemfiles/ar_4.1.8.gemfile.lock +10 -1
- data/gemfiles/ar_4.2.gemfile.lock +10 -1
- data/gemfiles/ar_5.0.gemfile.lock +11 -1
- data/gemfiles/rails_edge.gemfile.lock +11 -1
- data/lib/activerecord/shard_for/cluster_config.rb +6 -1
- data/lib/activerecord/shard_for/config.rb +4 -3
- data/lib/activerecord/shard_for/distkey_router.rb +11 -0
- data/lib/activerecord/shard_for/model.rb +3 -3
- data/lib/activerecord/shard_for/shard_repogitory.rb +6 -1
- data/lib/activerecord/shard_for/version.rb +1 -1
- data/lib/activerecord/shard_for.rb +5 -1
- metadata +18 -3
- data/CODE_OF_CONDUCT.md +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 511906085a601bbdbaf769215dbd7e471480ee8c
|
4
|
+
data.tar.gz: de31a223085a86f97315a259b32ed0e3a12e9f18
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 691b4787767101d7d36cf3227b93635fa6a340f6628a7a63376e2f94a5fa1f282d3882bc2a3945238d27ab5ca34a2323ad2f713741330f3161778f252fc67f91
|
7
|
+
data.tar.gz: e11f634a244d6e04bcf01541d37facde6d85026e4df76ce9490a08f68b1e6c7b1ba2d70e249551d93ac226aea4510a96dc1dedb98b83bfbb5b95792826ff9bc2
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,4 +1,31 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
rvm:
|
3
|
-
|
4
|
-
|
4
|
+
- 2.2.4
|
5
|
+
- 2.3.1
|
6
|
+
before_install: gem install bundler -v 1.12.5
|
7
|
+
cache: bundler
|
8
|
+
script:
|
9
|
+
- CODECLIMATE_REPO_TOKEN=dfc951e2d70b56ee62ffe989eb6286a6f21bf57209ccbd111bd336c372d8d06e bundle exec rspec
|
10
|
+
- bundle exec rubocop
|
11
|
+
- bundle exec ruby spec/performance_test.rb
|
12
|
+
gemfile:
|
13
|
+
- gemfiles/ar_4.1.0.gemfile
|
14
|
+
- gemfiles/ar_4.1.7.gemfile
|
15
|
+
- gemfiles/ar_4.1.8.gemfile
|
16
|
+
- gemfiles/ar_4.2.gemfile
|
17
|
+
- gemfiles/ar_5.0.gemfile
|
18
|
+
- gemfiles/rails_edge.gemfile
|
19
|
+
matrix:
|
20
|
+
allow_failures:
|
21
|
+
- gemfile: gemfiles/rails_edge.gemfile
|
22
|
+
exclude:
|
23
|
+
- rvm: 2.1.9
|
24
|
+
gemfile: gemfiles/rails_edge.gemfile
|
25
|
+
- rvm: 2.1.9
|
26
|
+
gemfile: gemfiles/ar_5.0.gemfile
|
27
|
+
notifications:
|
28
|
+
slack:
|
29
|
+
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=
|
30
|
+
on_success: never
|
31
|
+
on_failure: change
|
data/CHANGELOG.md
ADDED
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# ActiveRecord::ShardFor
|
2
2
|
|
3
|
+
[](https://travis-ci.org/yuemori/activerecord-shard_for) [](https://gemnasium.com/github.com/yuemori/activerecord-shard_for) [](https://codeclimate.com/github/yuemori/activerecord-shard_for) [](https://codeclimate.com/github/yuemori/activerecord-shard_for/coverage)
|
4
|
+
|
3
5
|
This is Sharding Library for ActiveRecord, inspire and import codes from [mixed_gauge](https://github.com/taiki45/mixed_gauge) and [activerecord-sharding](https://github.com/hirocaster/activerecord-sharding) (Thanks!).
|
4
6
|
|
5
7
|
## Concept
|
@@ -108,7 +110,6 @@ User.all_shards_in_parallel.map(&count) #=> 1
|
|
108
110
|
User.parallel.flat_map {|m| m.where(age: 1) }.size #=> 1
|
109
111
|
```
|
110
112
|
|
111
|
-
|
112
113
|
Sometimes you want to generates distkey value before validation. Since activerecord-shard_for generates sub class of your models, AR's callback is usesless for this usecase, so activerecord-shard_for offers its own callback method.
|
113
114
|
|
114
115
|
```ruby
|
@@ -134,6 +135,34 @@ access_token = AccessToken.put!
|
|
134
135
|
access_token.token #=> a generated token
|
135
136
|
```
|
136
137
|
|
138
|
+
If you want to range sharding, `Range` object set to cluster key.
|
139
|
+
|
140
|
+
```ruby
|
141
|
+
ActiveRecord::ShardFor.configure do |config|
|
142
|
+
config.define_cluster(:user) do |cluster|
|
143
|
+
# unique identifier, connection name
|
144
|
+
cluster.register(0...100, :production_user_001)
|
145
|
+
cluster.register(100...200, :production_user_002)
|
146
|
+
cluster.register(200...300, :production_user_003)
|
147
|
+
cluster.register(300..Float::INFINITY, :production_user_004)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class User < ActiveRecord::Base
|
152
|
+
include ActiveRecord::ShardFor::Model
|
153
|
+
use_cluster :user, :distkey
|
154
|
+
def_distkey :id
|
155
|
+
|
156
|
+
def self.generate_unique_id
|
157
|
+
# Implement to generate unique id
|
158
|
+
end
|
159
|
+
|
160
|
+
before_put do |attributes|
|
161
|
+
attributes[:id] = generate_unique_id unless attributes[:id]
|
162
|
+
end
|
163
|
+
end
|
164
|
+
```
|
165
|
+
|
137
166
|
## Sharding with Replication
|
138
167
|
|
139
168
|
activerecord-shard_for also supports replication.
|
@@ -187,7 +216,7 @@ You can split read/write by defining AR model class for each connection:
|
|
187
216
|
```ruby
|
188
217
|
class User < ActiveRecord::Base
|
189
218
|
include ActiveRecord::ShardFor::Model
|
190
|
-
use_cluster :user
|
219
|
+
use_cluster :user, :hash_modulo
|
191
220
|
def_distkey :email
|
192
221
|
end
|
193
222
|
|
@@ -195,7 +224,7 @@ class UserReadonly < ActiveRecord::Base
|
|
195
224
|
self.table_name = 'users'
|
196
225
|
|
197
226
|
include ActiveRecord::ShardFor::Model
|
198
|
-
use_cluster :user_readonly
|
227
|
+
use_cluster :user_readonly, :hash_modulo
|
199
228
|
def_distkey :email
|
200
229
|
end
|
201
230
|
|
@@ -236,11 +265,38 @@ UserReadonly.all_shards do |readonly|
|
|
236
265
|
end
|
237
266
|
```
|
238
267
|
|
239
|
-
## Plugin of
|
268
|
+
## Plugin of connection router
|
269
|
+
|
270
|
+
If you need to advanced connection routing, implement router class and register this.
|
271
|
+
|
272
|
+
### Embeded
|
240
273
|
|
241
|
-
|
274
|
+
Embeded routers:
|
242
275
|
|
243
|
-
|
276
|
+
|name|class|description|
|
277
|
+
|:---:|:---:|:---|
|
278
|
+
|:hash_modulo|[HashModuloRouter](https://github.com/yuemori/activerecord-shard_for/blob/master/lib/activerecord/shard_for/hash_modulo_router.rb)|use `hash(key) mod connection_count`|
|
279
|
+
|:distkey|[DistkeyRouter](https://github.com/yuemori/activerecord-shard_for/blob/master/lib/activerecord/shard_for/distkey_router.rb)|use `distkey` at it is|
|
280
|
+
|
281
|
+
Connection Routers specific with cluster in AR model.
|
282
|
+
|
283
|
+
```ruby
|
284
|
+
class User < ActiveRecord::Base
|
285
|
+
include ActiveRecord::ShardFor::Model
|
286
|
+
use_cluster :user, :hash_modulo # use hash_modulo
|
287
|
+
def_distkey :email
|
288
|
+
end
|
289
|
+
|
290
|
+
class Character < ActiveRecord::Base
|
291
|
+
include ActiveRecord::ShardFor::Model
|
292
|
+
use_cluster :character, :distkey # use distkey at it is
|
293
|
+
def_distkey :shard_no
|
294
|
+
end
|
295
|
+
```
|
296
|
+
|
297
|
+
### Implement
|
298
|
+
|
299
|
+
Reference a interface to [HashModuloRouter](https://github.com/yuemori/activerecord-shard_for/blob/master/lib/activerecord/shard_for/hash_modulo_router.rb), [DistkeyRouter](https://github.com/yuemori/activerecord-shard_for/blob/master/lib/activerecord/shard_for/distkey_router.rb) and [ConnectionRouter](https://github.com/yuemori/activerecord-shard_for/blob/master/lib/activerecord/shard_for/connection_router.rb).
|
244
300
|
|
245
301
|
Example, simple modulo router:
|
246
302
|
|
@@ -256,7 +312,7 @@ Your initializer for activerecord-shard_for might be like this:
|
|
256
312
|
|
257
313
|
```ruby
|
258
314
|
ActiveRecord::ShardFor.configure do |config|
|
259
|
-
config.
|
315
|
+
config.register_connection_router(:modulo, SimpleModuloRouter)
|
260
316
|
end
|
261
317
|
```
|
262
318
|
|
@@ -278,6 +334,47 @@ class User < ActiveRecord::Base
|
|
278
334
|
end
|
279
335
|
```
|
280
336
|
|
337
|
+
## Advanced
|
338
|
+
|
339
|
+
More example, sharding key is String:
|
340
|
+
|
341
|
+
```ruby
|
342
|
+
ActiveRecord::ShardFor.configure do |config|
|
343
|
+
config.define_cluster(:user) do |cluster|
|
344
|
+
# unique identifier, connection name
|
345
|
+
cluster.register('a'..'z', :production_user_001)
|
346
|
+
cluster.register('A'..'Z', :production_user_002)
|
347
|
+
cluster.register('0'..'9', :production_user_003)
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
class InitialStringRouter < ActiveRecord::ShardFor::ConnectionRouter
|
352
|
+
def route(key)
|
353
|
+
key.to_s.first
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
ActiveRecord::ShardFor.configure do |config|
|
358
|
+
config.register_connection_router(:initial_string, InitialStringRouter)
|
359
|
+
end
|
360
|
+
|
361
|
+
class User < ActiveRecord::Base
|
362
|
+
include ActiveRecord::ShardFor::Model
|
363
|
+
use_cluster :user, :initial_string
|
364
|
+
def_distkey :id
|
365
|
+
|
366
|
+
def self.generate_unique_id
|
367
|
+
SecureRandom.uuid
|
368
|
+
end
|
369
|
+
|
370
|
+
before_put do |attributes|
|
371
|
+
attributes[:id] = generate_unique_id unless attributes[:id]
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
```
|
376
|
+
|
377
|
+
|
281
378
|
## Contributing with ActiveRecord::ShardFor
|
282
379
|
|
283
380
|
Contributors are welcome! This is what you need to setup your Octopus development environment:
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
activerecord-shard_for (0.1.
|
4
|
+
activerecord-shard_for (0.1.2)
|
5
5
|
activerecord (>= 4.1.0)
|
6
6
|
activesupport (>= 4.1.0)
|
7
7
|
expeditor (>= 0.1.0)
|
@@ -35,6 +35,8 @@ GEM
|
|
35
35
|
binding_of_caller (0.7.2)
|
36
36
|
debug_inspector (>= 0.0.1)
|
37
37
|
builder (3.2.2)
|
38
|
+
codeclimate-test-reporter (0.6.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.1)
|
39
41
|
concord (0.1.5)
|
40
42
|
adamantium (~> 0.2.0)
|
@@ -44,6 +46,7 @@ GEM
|
|
44
46
|
concurrent-ruby (~> 1.0.2)
|
45
47
|
debug_inspector (0.0.2)
|
46
48
|
diff-lcs (1.2.5)
|
49
|
+
docile (1.1.5)
|
47
50
|
equalizer (0.0.11)
|
48
51
|
expeditor (0.4.0)
|
49
52
|
concurrent-ruby (~> 1.0.0)
|
@@ -143,6 +146,11 @@ GEM
|
|
143
146
|
ruby-progressbar (1.8.1)
|
144
147
|
ruby_dep (1.3.1)
|
145
148
|
shellany (0.0.1)
|
149
|
+
simplecov (0.12.0)
|
150
|
+
docile (~> 1.1.0)
|
151
|
+
json (>= 1.8, < 3)
|
152
|
+
simplecov-html (~> 0.10.0)
|
153
|
+
simplecov-html (0.10.0)
|
146
154
|
slop (3.6.0)
|
147
155
|
sqlite3 (1.3.11)
|
148
156
|
thor (0.19.1)
|
@@ -169,6 +177,7 @@ DEPENDENCIES
|
|
169
177
|
activerecord-shard_for!
|
170
178
|
appraisal
|
171
179
|
bundler (~> 1.11)
|
180
|
+
codeclimate-test-reporter
|
172
181
|
guard-rspec
|
173
182
|
guard-rubocop
|
174
183
|
pry
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
activerecord-shard_for (0.1.
|
4
|
+
activerecord-shard_for (0.1.2)
|
5
5
|
activerecord (>= 4.1.0)
|
6
6
|
activesupport (>= 4.1.0)
|
7
7
|
expeditor (>= 0.1.0)
|
@@ -35,6 +35,8 @@ GEM
|
|
35
35
|
binding_of_caller (0.7.2)
|
36
36
|
debug_inspector (>= 0.0.1)
|
37
37
|
builder (3.2.2)
|
38
|
+
codeclimate-test-reporter (0.6.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.1)
|
39
41
|
concord (0.1.5)
|
40
42
|
adamantium (~> 0.2.0)
|
@@ -44,6 +46,7 @@ GEM
|
|
44
46
|
concurrent-ruby (~> 1.0.2)
|
45
47
|
debug_inspector (0.0.2)
|
46
48
|
diff-lcs (1.2.5)
|
49
|
+
docile (1.1.5)
|
47
50
|
equalizer (0.0.11)
|
48
51
|
expeditor (0.4.0)
|
49
52
|
concurrent-ruby (~> 1.0.0)
|
@@ -143,6 +146,11 @@ GEM
|
|
143
146
|
ruby-progressbar (1.8.1)
|
144
147
|
ruby_dep (1.3.1)
|
145
148
|
shellany (0.0.1)
|
149
|
+
simplecov (0.12.0)
|
150
|
+
docile (~> 1.1.0)
|
151
|
+
json (>= 1.8, < 3)
|
152
|
+
simplecov-html (~> 0.10.0)
|
153
|
+
simplecov-html (0.10.0)
|
146
154
|
slop (3.6.0)
|
147
155
|
sqlite3 (1.3.11)
|
148
156
|
thor (0.19.1)
|
@@ -169,6 +177,7 @@ DEPENDENCIES
|
|
169
177
|
activerecord-shard_for!
|
170
178
|
appraisal
|
171
179
|
bundler (~> 1.11)
|
180
|
+
codeclimate-test-reporter
|
172
181
|
guard-rspec
|
173
182
|
guard-rubocop
|
174
183
|
pry
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
activerecord-shard_for (0.1.
|
4
|
+
activerecord-shard_for (0.1.2)
|
5
5
|
activerecord (>= 4.1.0)
|
6
6
|
activesupport (>= 4.1.0)
|
7
7
|
expeditor (>= 0.1.0)
|
@@ -35,6 +35,8 @@ GEM
|
|
35
35
|
binding_of_caller (0.7.2)
|
36
36
|
debug_inspector (>= 0.0.1)
|
37
37
|
builder (3.2.2)
|
38
|
+
codeclimate-test-reporter (0.6.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.1)
|
39
41
|
concord (0.1.5)
|
40
42
|
adamantium (~> 0.2.0)
|
@@ -44,6 +46,7 @@ GEM
|
|
44
46
|
concurrent-ruby (~> 1.0.2)
|
45
47
|
debug_inspector (0.0.2)
|
46
48
|
diff-lcs (1.2.5)
|
49
|
+
docile (1.1.5)
|
47
50
|
equalizer (0.0.11)
|
48
51
|
expeditor (0.4.0)
|
49
52
|
concurrent-ruby (~> 1.0.0)
|
@@ -143,6 +146,11 @@ GEM
|
|
143
146
|
ruby-progressbar (1.8.1)
|
144
147
|
ruby_dep (1.3.1)
|
145
148
|
shellany (0.0.1)
|
149
|
+
simplecov (0.12.0)
|
150
|
+
docile (~> 1.1.0)
|
151
|
+
json (>= 1.8, < 3)
|
152
|
+
simplecov-html (~> 0.10.0)
|
153
|
+
simplecov-html (0.10.0)
|
146
154
|
slop (3.6.0)
|
147
155
|
sqlite3 (1.3.11)
|
148
156
|
thor (0.19.1)
|
@@ -169,6 +177,7 @@ DEPENDENCIES
|
|
169
177
|
activerecord-shard_for!
|
170
178
|
appraisal
|
171
179
|
bundler (~> 1.11)
|
180
|
+
codeclimate-test-reporter
|
172
181
|
guard-rspec
|
173
182
|
guard-rubocop
|
174
183
|
pry
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
activerecord-shard_for (0.1.
|
4
|
+
activerecord-shard_for (0.1.2)
|
5
5
|
activerecord (>= 4.1.0)
|
6
6
|
activesupport (>= 4.1.0)
|
7
7
|
expeditor (>= 0.1.0)
|
@@ -35,6 +35,8 @@ GEM
|
|
35
35
|
binding_of_caller (0.7.2)
|
36
36
|
debug_inspector (>= 0.0.1)
|
37
37
|
builder (3.2.2)
|
38
|
+
codeclimate-test-reporter (0.6.0)
|
39
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
38
40
|
coderay (1.1.1)
|
39
41
|
concord (0.1.5)
|
40
42
|
adamantium (~> 0.2.0)
|
@@ -44,6 +46,7 @@ GEM
|
|
44
46
|
concurrent-ruby (~> 1.0.2)
|
45
47
|
debug_inspector (0.0.2)
|
46
48
|
diff-lcs (1.2.5)
|
49
|
+
docile (1.1.5)
|
47
50
|
equalizer (0.0.11)
|
48
51
|
expeditor (0.4.0)
|
49
52
|
concurrent-ruby (~> 1.0.0)
|
@@ -143,6 +146,11 @@ GEM
|
|
143
146
|
ruby-progressbar (1.8.1)
|
144
147
|
ruby_dep (1.3.1)
|
145
148
|
shellany (0.0.1)
|
149
|
+
simplecov (0.12.0)
|
150
|
+
docile (~> 1.1.0)
|
151
|
+
json (>= 1.8, < 3)
|
152
|
+
simplecov-html (~> 0.10.0)
|
153
|
+
simplecov-html (0.10.0)
|
146
154
|
slop (3.6.0)
|
147
155
|
sqlite3 (1.3.11)
|
148
156
|
thor (0.19.1)
|
@@ -169,6 +177,7 @@ DEPENDENCIES
|
|
169
177
|
activerecord-shard_for!
|
170
178
|
appraisal
|
171
179
|
bundler (~> 1.11)
|
180
|
+
codeclimate-test-reporter
|
172
181
|
guard-rspec
|
173
182
|
guard-rubocop
|
174
183
|
pry
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../
|
3
3
|
specs:
|
4
|
-
activerecord-shard_for (0.1.
|
4
|
+
activerecord-shard_for (0.1.2)
|
5
5
|
activerecord (>= 4.1.0)
|
6
6
|
activesupport (>= 4.1.0)
|
7
7
|
expeditor (>= 0.1.0)
|
@@ -32,6 +32,8 @@ GEM
|
|
32
32
|
ast (2.3.0)
|
33
33
|
binding_of_caller (0.7.2)
|
34
34
|
debug_inspector (>= 0.0.1)
|
35
|
+
codeclimate-test-reporter (0.6.0)
|
36
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
35
37
|
coderay (1.1.1)
|
36
38
|
concord (0.1.5)
|
37
39
|
adamantium (~> 0.2.0)
|
@@ -41,6 +43,7 @@ GEM
|
|
41
43
|
concurrent-ruby (~> 1.0.2)
|
42
44
|
debug_inspector (0.0.2)
|
43
45
|
diff-lcs (1.2.5)
|
46
|
+
docile (1.1.5)
|
44
47
|
equalizer (0.0.11)
|
45
48
|
expeditor (0.4.0)
|
46
49
|
concurrent-ruby (~> 1.0.0)
|
@@ -68,6 +71,7 @@ GEM
|
|
68
71
|
i18n (0.7.0)
|
69
72
|
ice_nine (0.11.2)
|
70
73
|
interception (0.5)
|
74
|
+
json (2.0.2)
|
71
75
|
listen (3.1.5)
|
72
76
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
73
77
|
rb-inotify (~> 0.9, >= 0.9.7)
|
@@ -139,6 +143,11 @@ GEM
|
|
139
143
|
ruby-progressbar (1.8.1)
|
140
144
|
ruby_dep (1.3.1)
|
141
145
|
shellany (0.0.1)
|
146
|
+
simplecov (0.12.0)
|
147
|
+
docile (~> 1.1.0)
|
148
|
+
json (>= 1.8, < 3)
|
149
|
+
simplecov-html (~> 0.10.0)
|
150
|
+
simplecov-html (0.10.0)
|
142
151
|
slop (3.6.0)
|
143
152
|
sqlite3 (1.3.11)
|
144
153
|
thor (0.19.1)
|
@@ -165,6 +174,7 @@ DEPENDENCIES
|
|
165
174
|
activerecord-shard_for!
|
166
175
|
appraisal
|
167
176
|
bundler (~> 1.11)
|
177
|
+
codeclimate-test-reporter
|
168
178
|
guard-rspec
|
169
179
|
guard-rubocop
|
170
180
|
pry
|
@@ -23,7 +23,7 @@ GIT
|
|
23
23
|
PATH
|
24
24
|
remote: ../
|
25
25
|
specs:
|
26
|
-
activerecord-shard_for (0.1.
|
26
|
+
activerecord-shard_for (0.1.2)
|
27
27
|
activerecord (>= 4.1.0)
|
28
28
|
activesupport (>= 4.1.0)
|
29
29
|
expeditor (>= 0.1.0)
|
@@ -42,6 +42,8 @@ GEM
|
|
42
42
|
ast (2.3.0)
|
43
43
|
binding_of_caller (0.7.2)
|
44
44
|
debug_inspector (>= 0.0.1)
|
45
|
+
codeclimate-test-reporter (0.6.0)
|
46
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
45
47
|
coderay (1.1.1)
|
46
48
|
concord (0.1.5)
|
47
49
|
adamantium (~> 0.2.0)
|
@@ -51,6 +53,7 @@ GEM
|
|
51
53
|
concurrent-ruby (~> 1.0.2)
|
52
54
|
debug_inspector (0.0.2)
|
53
55
|
diff-lcs (1.2.5)
|
56
|
+
docile (1.1.5)
|
54
57
|
equalizer (0.0.11)
|
55
58
|
expeditor (0.4.0)
|
56
59
|
concurrent-ruby (~> 1.0.0)
|
@@ -78,6 +81,7 @@ GEM
|
|
78
81
|
i18n (0.7.0)
|
79
82
|
ice_nine (0.11.2)
|
80
83
|
interception (0.5)
|
84
|
+
json (2.0.2)
|
81
85
|
listen (3.1.5)
|
82
86
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
83
87
|
rb-inotify (~> 0.9, >= 0.9.7)
|
@@ -149,6 +153,11 @@ GEM
|
|
149
153
|
ruby-progressbar (1.8.1)
|
150
154
|
ruby_dep (1.3.1)
|
151
155
|
shellany (0.0.1)
|
156
|
+
simplecov (0.12.0)
|
157
|
+
docile (~> 1.1.0)
|
158
|
+
json (>= 1.8, < 3)
|
159
|
+
simplecov-html (~> 0.10.0)
|
160
|
+
simplecov-html (0.10.0)
|
152
161
|
slop (3.6.0)
|
153
162
|
sqlite3 (1.3.11)
|
154
163
|
thor (0.19.1)
|
@@ -176,6 +185,7 @@ DEPENDENCIES
|
|
176
185
|
appraisal
|
177
186
|
arel!
|
178
187
|
bundler (~> 1.11)
|
188
|
+
codeclimate-test-reporter
|
179
189
|
guard-rspec
|
180
190
|
guard-rubocop
|
181
191
|
pry
|
@@ -25,7 +25,12 @@ module ActiveRecord
|
|
25
25
|
# @param [Object] key
|
26
26
|
# @return [Symbol] registered connection name
|
27
27
|
def fetch(key)
|
28
|
-
connection_registry.
|
28
|
+
connection_registry.find do |connection_key, _connection|
|
29
|
+
case connection_key
|
30
|
+
when Range then connection_key.include?(key)
|
31
|
+
else connection_key == key
|
32
|
+
end
|
33
|
+
end.second
|
29
34
|
end
|
30
35
|
end
|
31
36
|
end
|
@@ -35,10 +35,11 @@ module ActiveRecord
|
|
35
35
|
connection_routers[router_name] = router_class
|
36
36
|
end
|
37
37
|
|
38
|
-
# @param [Symbol]
|
38
|
+
# @param [Symbol] connection_router_name
|
39
39
|
# @return [Class] registered class by [#register_router]
|
40
|
-
|
41
|
-
|
40
|
+
# @raise [KeyError] when not registerd router_name given
|
41
|
+
def fetch_connection_router(connection_router_name)
|
42
|
+
connection_routers.fetch(connection_router_name)
|
42
43
|
end
|
43
44
|
end
|
44
45
|
end
|
@@ -43,7 +43,7 @@ module ActiveRecord
|
|
43
43
|
key = attributes[distkey]
|
44
44
|
raise ActiveRecord::ShardFor::MissingDistkeyAttribute unless key || attributes[distkey.to_s]
|
45
45
|
|
46
|
-
@before_put_callback.call(attributes) if @before_put_callback
|
46
|
+
@before_put_callback.call(attributes) if defined?(@before_put_callback) && @before_put_callback
|
47
47
|
|
48
48
|
shard_for(key).create!(attributes)
|
49
49
|
end
|
@@ -85,8 +85,8 @@ module ActiveRecord
|
|
85
85
|
raise ActiveRecord::ShardFor::RecordNotFound
|
86
86
|
end
|
87
87
|
|
88
|
-
# Distkey is a column. activerecord-shard_for gave to
|
89
|
-
# and
|
88
|
+
# Distkey is a column. activerecord-shard_for gave to connection_router that value
|
89
|
+
# and connection_router determine which shard to store.
|
90
90
|
# @param [Symbol] column
|
91
91
|
def def_distkey(column)
|
92
92
|
self.distkey = column.to_sym
|
@@ -24,7 +24,12 @@ module ActiveRecord
|
|
24
24
|
# @param [Object] key sharding key object for connection
|
25
25
|
# @return [Class, nil] A AR model class.
|
26
26
|
def fetch_by_key(key)
|
27
|
-
@shards.find
|
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
|
28
33
|
end
|
29
34
|
|
30
35
|
# @return [Array<Class>]
|
@@ -7,6 +7,7 @@ require 'activerecord/shard_for/model'
|
|
7
7
|
require 'activerecord/shard_for/errors'
|
8
8
|
require 'activerecord/shard_for/connection_router'
|
9
9
|
require 'activerecord/shard_for/hash_modulo_router'
|
10
|
+
require 'activerecord/shard_for/distkey_router'
|
10
11
|
require 'activerecord/shard_for/database_tasks'
|
11
12
|
require 'activerecord/shard_for/shard_repogitory'
|
12
13
|
require 'activerecord/shard_for/all_shards_in_parallel'
|
@@ -29,4 +30,7 @@ module ActiveRecord
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
|
-
ActiveRecord::ShardFor.config
|
33
|
+
ActiveRecord::ShardFor.configure do |config|
|
34
|
+
config.register_connection_router(:hash_modulo, ActiveRecord::ShardFor::HashModuloRouter)
|
35
|
+
config.register_connection_router(:distkey, ActiveRecord::ShardFor::DistkeyRouter)
|
36
|
+
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.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yuemori
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -248,6 +248,20 @@ dependencies:
|
|
248
248
|
- - ">="
|
249
249
|
- !ruby/object:Gem::Version
|
250
250
|
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: codeclimate-test-reporter
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :development
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
251
265
|
description: Database sharding library for ActiveRecord
|
252
266
|
email:
|
253
267
|
- yuemori@aiming-inc.com
|
@@ -260,7 +274,7 @@ files:
|
|
260
274
|
- ".rubocop.yml"
|
261
275
|
- ".travis.yml"
|
262
276
|
- Appraisals
|
263
|
-
-
|
277
|
+
- CHANGELOG.md
|
264
278
|
- Gemfile
|
265
279
|
- Guardfile
|
266
280
|
- LICENSE.txt
|
@@ -288,6 +302,7 @@ files:
|
|
288
302
|
- lib/activerecord/shard_for/config.rb
|
289
303
|
- lib/activerecord/shard_for/connection_router.rb
|
290
304
|
- lib/activerecord/shard_for/database_tasks.rb
|
305
|
+
- lib/activerecord/shard_for/distkey_router.rb
|
291
306
|
- lib/activerecord/shard_for/errors.rb
|
292
307
|
- lib/activerecord/shard_for/hash_modulo_router.rb
|
293
308
|
- lib/activerecord/shard_for/model.rb
|
data/CODE_OF_CONDUCT.md
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
# Contributor Code of Conduct
|
2
|
-
|
3
|
-
As contributors and maintainers of this project, and in the interest of
|
4
|
-
fostering an open and welcoming community, we pledge to respect all people who
|
5
|
-
contribute through reporting issues, posting feature requests, updating
|
6
|
-
documentation, submitting pull requests or patches, and other activities.
|
7
|
-
|
8
|
-
We are committed to making participation in this project a harassment-free
|
9
|
-
experience for everyone, regardless of level of experience, gender, gender
|
10
|
-
identity and expression, sexual orientation, disability, personal appearance,
|
11
|
-
body size, race, ethnicity, age, religion, or nationality.
|
12
|
-
|
13
|
-
Examples of unacceptable behavior by participants include:
|
14
|
-
|
15
|
-
* The use of sexualized language or imagery
|
16
|
-
* Personal attacks
|
17
|
-
* Trolling or insulting/derogatory comments
|
18
|
-
* Public or private harassment
|
19
|
-
* Publishing other's private information, such as physical or electronic
|
20
|
-
addresses, without explicit permission
|
21
|
-
* Other unethical or unprofessional conduct
|
22
|
-
|
23
|
-
Project maintainers have the right and responsibility to remove, edit, or
|
24
|
-
reject comments, commits, code, wiki edits, issues, and other contributions
|
25
|
-
that are not aligned to this Code of Conduct, or to ban temporarily or
|
26
|
-
permanently any contributor for other behaviors that they deem inappropriate,
|
27
|
-
threatening, offensive, or harmful.
|
28
|
-
|
29
|
-
By adopting this Code of Conduct, project maintainers commit themselves to
|
30
|
-
fairly and consistently applying these principles to every aspect of managing
|
31
|
-
this project. Project maintainers who do not follow or enforce the Code of
|
32
|
-
Conduct may be permanently removed from the project team.
|
33
|
-
|
34
|
-
This code of conduct applies both within project spaces and in public spaces
|
35
|
-
when an individual is representing the project or its community.
|
36
|
-
|
37
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
38
|
-
reported by contacting a project maintainer at yuemori@aiming-inc.com. All
|
39
|
-
complaints will be reviewed and investigated and will result in a response that
|
40
|
-
is deemed necessary and appropriate to the circumstances. Maintainers are
|
41
|
-
obligated to maintain confidentiality with regard to the reporter of an
|
42
|
-
incident.
|
43
|
-
|
44
|
-
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
45
|
-
version 1.3.0, available at
|
46
|
-
[http://contributor-covenant.org/version/1/3/0/][version]
|
47
|
-
|
48
|
-
[homepage]: http://contributor-covenant.org
|
49
|
-
[version]: http://contributor-covenant.org/version/1/3/0/
|