Module: Switchman::ActiveRecord::StatementCache
- Defined in:
- lib/switchman/active_record/statement_cache.rb
Defined Under Namespace
Modules: BindMap, ClassMethods
Instance Method Summary collapse
-
#execute(*args, &block) ⇒ 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).
- #initialize(arel, bind_map, klass = nil) ⇒ Object
- #qualified_query_builder(shard, klass) ⇒ Object
Instance Method Details
#execute(*args, &block) ⇒ 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)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/switchman/active_record/statement_cache.rb', line 28 def execute(*args, &block) params, connection = args klass = @klass 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.connection_class_for_self) target_shard ||= current_shard bind_values = bind_map.bind(params, current_shard, target_shard) target_shard.activate(klass.connection_class_for_self) do sql = qualified_query_builder(target_shard, klass).sql_for(bind_values, connection) klass.find_by_sql(sql, bind_values, &block) end end |
#initialize(arel, bind_map, klass = nil) ⇒ Object
16 17 18 19 20 21 |
# File 'lib/switchman/active_record/statement_cache.rb', line 16 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
47 48 49 |
# File 'lib/switchman/active_record/statement_cache.rb', line 47 def qualified_query_builder(shard, klass) @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(self.class, @arel).first end |