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) ⇒ 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) ⇒ 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 |
# 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 sql = qualified_query_builder(target_shard, klass).sql_for(bind_values, connection) klass.find_by_sql(sql, bind_values) end 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
55 56 57 |
# File 'lib/switchman/active_record/statement_cache.rb', line 55 def qualified_query_builder(shard, klass) @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(self.class, @arel) end |