querrel 1.3.0 → 1.4.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: ac00fa1731878f9644eeef4cba1df54454b70d3c
4
- data.tar.gz: 3333ac82975cc0ab9a9359ea254db41c97330ded
3
+ metadata.gz: d04075453f43a4ab89ca79243a30a178f4aff083
4
+ data.tar.gz: 78b50fabae36322f9081f11af4d48f7958a4b7c8
5
5
  SHA512:
6
- metadata.gz: fa8d8b12c96c966a0b5e755749a175902f4ba5b1808f94d3cdb70179250d6f624eba73d69f754a9e0e642bc10c02960455ac1bafb25fccb69dd44e8980daaef3
7
- data.tar.gz: a65135e0097d7ccdad1d7f276ab77adc0cc48f1787db0a413c12afa93920795558157ccda86737eb51a85e589ab86c6f2ed7910b771cb0155a89063e567f41e6
6
+ metadata.gz: 2fcdfb519bb2715c5e025cbca6487d323be1bb9aa1dade7677f39fad3c6b77b9501f73b7c8d48be8ed7c3e49a96de4ed2230be6385e21e015c9171c07bb269f7
7
+ data.tar.gz: 4934643a60e57b9dde67119c236922a81e102d0722b43af0610e1d305f1a0bcccc20bca4d0109a8c74b42134777e44e2a87b061d2c6b87c51fb49fe4eeda1311
data/README.md CHANGED
@@ -40,23 +40,21 @@ all_brand_names = q.query(Brand.all) do |s|
40
40
  end
41
41
  ```
42
42
 
43
- There is also a `run` method which instead of running a preprescribed scope and merging, will yield the `ConnectedModelFactory` class which allows you to wrap any ActiveRecord class so that you can query it in the thread, for instance:
43
+ There is also a `run` method which instead of running a preprescribed scope and merging, will take a block which allows you do anything you want with the specified database connection, for instance:
44
44
 
45
45
  ```ruby
46
46
  require 'thread'
47
- all_brands = Brand.all
47
+ all_brands = []
48
48
  b_s = Mutex.new
49
- all_products = Product.all
49
+ all_products = []
50
50
  p_s = Mutex.new
51
51
 
52
- Querrel.run(on: dbs) do |q|
53
- b_s.synchronize { all_brands += q[Brand].all.to_a }
54
- p_s.synchronize { all_products += q[Product].all.to_a }
52
+ Querrel.run(on: dbs) do |db|
53
+ b_s.synchronize { all_brands += Brand.all.to_a }
54
+ p_s.synchronize { all_products += Product.all.to_a }
55
55
  end
56
56
  ```
57
57
 
58
- At the moment, any queries using `run` and the ConnectedModelFactory won't return objects of the class passed in, but an anonymous class instead. However, `query` can marshall the results back into the original class.
59
-
60
58
  ### Databases
61
59
 
62
60
  There are three ways in which you can instruct Querrel which databases to use:
@@ -23,7 +23,7 @@ module Querrel
23
23
  @resolver = ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver.new(specs)
24
24
  end
25
25
 
26
- [:configurations, :spec].each do |m|
26
+ [:configurations, :spec, :resolve].each do |m|
27
27
  define_method(m) do |*args, &block|
28
28
  @resolver.send(m, *args, &block)
29
29
  end
@@ -15,36 +15,23 @@ module Querrel
15
15
  dbs = @connection_resolver.configurations.keys
16
16
  end
17
17
 
18
- query_model = scope.model
19
18
  results = {}
20
19
  results_semaphore = Mutex.new
21
20
 
22
21
  pool = StaticPool.new(options[:threads] || 20)
23
22
  dbs.each do |db|
24
23
  pool.enqueue do
25
- Thread.current[:querrel_connected_models] = []
26
- con_spec = retrieve_connection_spec(db, resolver)
27
- Thread.current[:querrel_con_spec] = con_spec
28
- dynamic_class = ConnectedModelFactory[query_model, con_spec]
24
+ ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
25
+ con_config = retrieve_connection_config(db, resolver)
26
+ ActiveRecord::Base.establish_connection(con_config)
29
27
 
30
28
  begin
31
- local_scope = dynamic_class.all.merge(scope)
32
- local_results = if block_given?
33
- res = yield(local_scope, ConnectedModelFactory)
34
- res.to_a.each(&:readonly!) if res.is_a?(ActiveRecord::Relation)
35
- res
36
- else
37
- local_scope.to_a.map do |r|
38
- query_model.instantiate(r.attributes, {}).tap(&:readonly!)
39
- end
40
- end
29
+ local_results = block_given? ? yield(scope, db) : scope
30
+ local_results.to_a.each(&:readonly!) if local_results.is_a?(ActiveRecord::Relation)
41
31
 
42
32
  results_semaphore.synchronize { results[db] = local_results }
43
33
  ensure
44
- Thread.current[:querrel_connected_models].each do |m|
45
- m.connection_pool.release_connection
46
- end
47
- Thread.current[:querrel_connected_models] = nil
34
+ ActiveRecord::Base.connection_handler.clear_all_connections!
48
35
  end
49
36
  end
50
37
  end
@@ -1,4 +1,3 @@
1
- require 'querrel/connected_model_factory'
2
1
  require 'querrel/connection_resolver'
3
2
  require 'querrel/static_pool'
4
3
  require 'querrel/map_reduce'
@@ -27,15 +26,12 @@ module Querrel
27
26
  dbs.each do |db|
28
27
  pool.enqueue do
29
28
  begin
30
- Thread.current[:querrel_connected_models] = []
31
- con_spec = retrieve_connection_spec(db, resolver)
32
- Thread.current[:querrel_con_spec] = con_spec
33
- yield(ConnectedModelFactory)
29
+ ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
30
+ con_config = retrieve_connection_config(db, resolver)
31
+ ActiveRecord::Base.establish_connection(con_config)
32
+ yield(db)
34
33
  ensure
35
- Thread.current[:querrel_connected_models].each do |m|
36
- m.connection_pool.release_connection
37
- end
38
- Thread.current[:querrel_connected_models] = nil
34
+ ActiveRecord::Base.connection_handler.clear_all_connections!
39
35
  end
40
36
  end
41
37
  end
@@ -46,6 +42,10 @@ module Querrel
46
42
  resolver.spec(db.to_sym)
47
43
  end
48
44
 
45
+ def retrieve_connection_config(db, resolver)
46
+ resolver.resolve(db.to_sym)
47
+ end
48
+
49
49
  def while_connected_to(db, resolver, &b)
50
50
  conf = resolver.spec(db.to_sym)
51
51
  pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(conf)
@@ -1,3 +1,3 @@
1
1
  module Querrel
2
- VERSION = "1.3.0"
2
+ VERSION = "1.4.0"
3
3
  end
@@ -17,10 +17,10 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_runtime_dependency "activerecord", "~> 4.1"
20
+ spec.add_runtime_dependency "activerecord", ">= 4.0"
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.6"
23
- spec.add_development_dependency "rake", "~> 0"
23
+ spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "sqlite3", "~> 1.3.5"
25
25
  spec.add_development_dependency "database_rewinder", "~> 0"
26
26
  end
@@ -46,9 +46,9 @@ class InstanceTest < Querrel::Test
46
46
  s = Mutex.new
47
47
  configs_actual = []
48
48
 
49
- @q.run do |q|
49
+ @q.run do
50
50
  s.synchronize do
51
- configs_actual << q[Product].connection_config
51
+ configs_actual << Product.connection_config
52
52
  end
53
53
  end
54
54
 
@@ -46,9 +46,9 @@ class NonInstanceTest < Querrel::Test
46
46
  def test_runner
47
47
  s = Mutex.new
48
48
  configs_actual = []
49
- Querrel.run(on: @dbs) do |q|
49
+ Querrel.run(on: @dbs) do
50
50
  s.synchronize do
51
- configs_actual << q[Product].connection_config
51
+ configs_actual << Product.connection_config
52
52
  end
53
53
  end
54
54
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: querrel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Campbell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-22 00:00:00.000000000 Z
11
+ date: 2015-11-06 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
- version: '4.1'
19
+ version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.1'
26
+ version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
@@ -93,7 +93,6 @@ files:
93
93
  - README.md
94
94
  - Rakefile
95
95
  - lib/querrel.rb
96
- - lib/querrel/connected_model_factory.rb
97
96
  - lib/querrel/connection_resolver.rb
98
97
  - lib/querrel/map_reduce.rb
99
98
  - lib/querrel/querreller.rb
@@ -1,14 +0,0 @@
1
- module Querrel
2
- class ConnectedModelFactory
3
- def self.[](model, con_spec = nil)
4
- con_spec ||= Thread.current[:querrel_con_spec]
5
- dynamic_class_name = "#{model.name}#{Thread.current.object_id}"
6
- Class.new(model).tap do |m|
7
- m.send(:define_singleton_method, :name) { dynamic_class_name }
8
- m.establish_connection(con_spec.config)
9
-
10
- Thread.current[:querrel_connected_models] << m
11
- end
12
- end
13
- end
14
- end