querrel 1.3.0 → 1.4.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 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