mixed_gauge 0.1.3 → 0.1.4

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: 4dc2c3036f197760c0c28b3fe7f6dd28519a2076
4
- data.tar.gz: f2098922ed048918a03ade6b860447bbe2eb519a
3
+ metadata.gz: 1287ac868f8d04e5a084973b66d9cb3592ec1658
4
+ data.tar.gz: 096992dc8eb46a2fb67bd6cfad16ce348ce3ae27
5
5
  SHA512:
6
- metadata.gz: 7ff5439bd44a28a0a15f6ec630bdd3d3afb46fb3d3437c64b6e8a8acc98815fa78b983f4a1c7213a143a89196b646e93e9de395ad8e0d34e5c5150e26b73bbef
7
- data.tar.gz: 7161650054c1a237bd7b9e12418afaef05d886b837cd60c88fa86d4b1c9d07df73bf30798c213e4b8fd958c24eafb5daa6155c6fe20ac9ab10da2f3f268fd6c0
6
+ metadata.gz: a0d19dc2806f36b88c851da29e77eefa0f63466ff320a2c246c9801b7f60ee80161dedd7c5b20ae9bd8fc46ec1f619c688c2a58019091aa99f0803341bbf5fa8
7
+ data.tar.gz: fb370f43a0a9231fac9b35009460b53917cb86fb89c70b58e6511ced16268eeed8392580cc271133170adacd0bd5c9e4a913982cc95810d0cebf7b94045ea0fe
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # CHANGELOG for mixed_gauge
2
2
 
3
+ ## 0.1.4
4
+ - Support executing queries in parallel.
5
+
3
6
  ## 0.1.3
4
7
  - Rake tasks to setup database cluster.
5
8
 
data/README.md CHANGED
@@ -65,6 +65,7 @@ end
65
65
 
66
66
  Use `.get` to retrive single model class which is connected to proper
67
67
  database node. Use `.put!` to create new record to proper database node.
68
+
68
69
  `.all_shards` enables you to all model class which is connected to all
69
70
  database nodes in the cluster.
70
71
 
@@ -78,6 +79,15 @@ alice.save!
78
79
  User.all_shards.flat_map {|m| m.find_by(name: 'alice') }.compact
79
80
  ```
80
81
 
82
+ When you want to execute queries in parallel, use `.all_shards_in_parallel`.
83
+ It returns `Mixedgauge::AllShardsInParallel` and it offers some collection
84
+ actions which runs in parallel. It is aliased to `.parallel`.
85
+
86
+ ```ruby
87
+ User.all_shards_in_parallel.map(&count) #=> 1
88
+ User.parallel.flat_map {|m| m.where(age: 1) }.size #=> 1
89
+ ```
90
+
81
91
  When you want find by non-distkey, not recomended though, you can define finder
82
92
  methods to model class.
83
93
 
@@ -89,7 +99,7 @@ class User < ActiveRecord::Base
89
99
 
90
100
  parent_methods do
91
101
  def find_from_all_by_name(name)
92
- all_shards.map {|m| m.find_by(name: name) }.compact.first
102
+ all_shards_in_parallel.map {|m| m.find_by(name: name) }.compact.first
93
103
  end
94
104
  end
95
105
  end
@@ -157,16 +167,6 @@ Or install it yourself as:
157
167
 
158
168
  $ gem install mixed_gauge
159
169
 
160
- ## Development
161
-
162
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
163
-
164
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
165
-
166
170
  ## Contributing
167
171
 
168
- 1. Fork it ( https://github.com/[my-github-username]/mixed_gauge/fork )
169
- 2. Create your feature branch (`git checkout -b my-new-feature`)
170
- 3. Commit your changes (`git commit -am 'Add some feature'`)
171
- 4. Push to the branch (`git push origin my-new-feature`)
172
- 5. Create a new Pull Request
172
+ Feel free to pull request and issue :)
data/lib/mixed_gauge.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'active_record'
2
+ require 'expeditor'
2
3
 
3
4
  require 'mixed_gauge/version'
4
5
  require 'mixed_gauge/errors'
@@ -6,6 +7,7 @@ require 'mixed_gauge/cluster_config'
6
7
  require 'mixed_gauge/config'
7
8
  require 'mixed_gauge/routing'
8
9
  require 'mixed_gauge/sub_model_repository'
10
+ require 'mixed_gauge/all_shards_in_parallel'
9
11
  require 'mixed_gauge/model'
10
12
 
11
13
  module MixedGauge
@@ -0,0 +1,39 @@
1
+ module MixedGauge
2
+ # Support parallel execution with each shard and deal with AR connection
3
+ # management in parallel execution.
4
+ class AllShardsInParallel
5
+ # @param [Array<Class>] An array of sub model class
6
+ def initialize(shards)
7
+ @shards = shards
8
+ end
9
+
10
+ # @yield [Class] A sub model class
11
+ # @return [Array] A result
12
+ # @example
13
+ # User.all_shards_in_parallel.map(&:count).reduce(&:+)
14
+ def map(&block)
15
+ commands = @shards.map do |m|
16
+ Expeditor::Command.new { m.connection_pool.with_connection { yield m } }
17
+ end
18
+ commands.each(&:start)
19
+ commands.map(&:get)
20
+ end
21
+
22
+ # @yield [Class] A sub model class
23
+ # @return [Array] A result
24
+ # @example
25
+ # User.all_shards_in_parallel.flat_map {|m| m.where(age: 1) }
26
+ def flat_map(&block)
27
+ map(&block).flatten
28
+ end
29
+
30
+ # @yield [Class] A sub model class
31
+ # @return [MixedGauge::AllShardsInParallel]
32
+ # @example
33
+ # User.all_shards_in_parallel.each {|m| puts m.count }
34
+ def each(&block)
35
+ map(&block) if block_given?
36
+ self
37
+ end
38
+ end
39
+ end
@@ -48,6 +48,7 @@ module MixedGauge
48
48
  # @return [ActiveRecord::Base] A sub class instance of included model
49
49
  # @raise [MixedGauge::MissingDistkeyAttribute]
50
50
  def put!(attributes)
51
+ raise '`distkey` is not defined. Use `def_distkey`.' unless distkey
51
52
  @before_put_callback.call(attributes) if @before_put_callback
52
53
 
53
54
  if key = attributes[distkey] || attributes[distkey.to_s]
@@ -110,6 +111,14 @@ module MixedGauge
110
111
  sub_model_repository.all
111
112
  end
112
113
 
114
+ # @return [Mixedgauge::AllShardsInParallel]
115
+ # @example
116
+ # User.all_shards_in_parallel.map {|m| m.where.find_by(name: 'Alice') }.compact
117
+ def all_shards_in_parallel
118
+ AllShardsInParallel.new(all_shards)
119
+ end
120
+ alias_method :parallel, :all_shards_in_parallel
121
+
113
122
  # Define utility methods which uses all shards or specific shard.
114
123
  # These methods can be called from included model class.
115
124
  # @example
@@ -119,11 +128,11 @@ module MixedGauge
119
128
  # def_distkey :name
120
129
  # parent_methods do
121
130
  # def all_count
122
- # all_shards.map {|m| m.count }.reduce(&:+)
131
+ # parallel.map {|m| m.count }.reduce(&:+)
123
132
  # end
124
133
  #
125
134
  # def find_from_all_by(condition)
126
- # all_shards.flat_map {|m m.find_by(condition) }.compact.first
135
+ # parallel.flat_map {|m m.find_by(condition) }.compact.first
127
136
  # end
128
137
  # end
129
138
  # end
@@ -1,3 +1,3 @@
1
1
  module MixedGauge
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.4'
3
3
  end
data/mixed_gauge.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.add_dependency 'activerecord', '>= 4.1.0'
23
+ spec.add_dependency 'expeditor', '>= 0.1.0'
23
24
  spec.add_development_dependency 'appraisal'
24
25
  spec.add_development_dependency 'coveralls'
25
26
  spec.add_development_dependency 'pry'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mixed_gauge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taiki Ono
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-29 00:00:00.000000000 Z
11
+ date: 2015-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 4.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: expeditor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: appraisal
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -177,6 +191,7 @@ files:
177
191
  - gemfiles/ar_4.2.gemfile
178
192
  - gemfiles/rails_edge.gemfile
179
193
  - lib/mixed_gauge.rb
194
+ - lib/mixed_gauge/all_shards_in_parallel.rb
180
195
  - lib/mixed_gauge/cluster_config.rb
181
196
  - lib/mixed_gauge/config.rb
182
197
  - lib/mixed_gauge/database_tasks.rb