Class: Querrel::Querreller

Inherits:
Object
  • Object
show all
Defined in:
lib/querrel/querreller.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dbs, db_names = false) ⇒ Querreller

Returns a new instance of Querreller.



7
8
9
# File 'lib/querrel/querreller.rb', line 7

def initialize(dbs, db_names = false)
  @connection_resolver = ConnectionResolver.new(dbs, db_names)
end

Instance Attribute Details

#connection_resolverObject

Returns the value of attribute connection_resolver.



5
6
7
# File 'lib/querrel/querreller.rb', line 5

def connection_resolver
  @connection_resolver
end

Instance Method Details

#map(scope, options = {}) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/querrel/querreller.rb', line 16

def map(scope, options = {})
  if options.key?(:on)
    resolver = ConnectionResolver.new(dbs, !!options[:db_names])
    dbs = resolver.configurations.keys
  else
    resolver = @connection_resolver
    dbs = @connection_resolver.configurations.keys
  end

  sql = scope.to_sql
  query_model = scope.model
  results = {}

  threads = []
  dbs.each do |db|
    threads << Thread.new do
      while_connected_to(db, resolver) do |conn|
        result_set = conn.select_all(sql, "Querrel Load")
        column_types = result_set.column_types

        results[db] = result_set.map { |record| query_model.instantiate(record, column_types).tap{ |r| r.readonly! } }
      end
    end
  end
  threads.each(&:join)

  results
end

#query(scope, options = {}) ⇒ Object



11
12
13
14
# File 'lib/querrel/querreller.rb', line 11

def query(scope, options = {})
  buckets = map(scope, options)
  reduce(buckets)
end

#reduce(buckets) ⇒ Object



45
46
47
# File 'lib/querrel/querreller.rb', line 45

def reduce(buckets)
  buckets.flat_map{ |db, results| results }
end

#while_connected_to(db, resolver, &b) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/querrel/querreller.rb', line 49

def while_connected_to(db, resolver, &b)
  conf = resolver.spec(db.to_sym)
  pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(conf)
  pool.with_connection(&b)
ensure
  pool.disconnect!
end