Module: Switchman::ActiveRecord::StatementCache
- Defined in:
- lib/switchman/active_record/statement_cache.rb
Defined Under Namespace
Modules: BindMap, ClassMethods
Instance Method Summary
collapse
Instance Method Details
#execute(*args) ⇒ Object
since the StatememtCache is only implemented for basic relations in AR::Base#find, AR::Base#find_by and AR::Association#get_records, we can make some assumptions about the shard source (e.g. infer from the primary key or use the current shard)
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/switchman/active_record/statement_cache.rb', line 31
def execute(*args)
if ::Rails.version >= '5.2'
params, connection = args
klass = @klass
else
params, klass, connection = args
end
target_shard = nil
if primary_index = bind_map.primary_value_index
primary_value = params[primary_index]
target_shard = Shard.local_id_for(primary_value)[1]
end
current_shard = Shard.current(klass.shard_category)
target_shard ||= current_shard
bind_values = bind_map.bind(params, current_shard, target_shard)
target_shard.activate(klass.shard_category) do
if connection.use_qualified_names?
sql = qualified_query_builder(target_shard, klass).sql_for(bind_values, connection)
klass.find_by_sql(sql, bind_values)
else
sql = generic_query_builder(connection).sql_for(bind_values, connection)
klass.find_by_sql(sql, bind_values)
end
end
end
|
#generic_query_builder(connection) ⇒ Object
60
61
62
|
# File 'lib/switchman/active_record/statement_cache.rb', line 60
def generic_query_builder(connection)
@query_builder ||= connection.cacheable_query(@arel)
end
|
#initialize(arel, bind_map, klass = nil) ⇒ Object
19
20
21
22
23
24
|
# File 'lib/switchman/active_record/statement_cache.rb', line 19
def initialize(arel, bind_map, klass=nil)
@arel = arel
@bind_map = bind_map
@klass = klass
@qualified_query_builders = {}
end
|
#qualified_query_builder(shard, klass) ⇒ Object
64
65
66
|
# File 'lib/switchman/active_record/statement_cache.rb', line 64
def qualified_query_builder(shard, klass)
@qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(@arel)
end
|