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)
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/switchman/active_record/statement_cache.rb', line 33 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
21 22 23 24 25 26 |
# File 'lib/switchman/active_record/statement_cache.rb', line 21 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
57 58 59 |
# File 'lib/switchman/active_record/statement_cache.rb', line 57 def qualified_query_builder(shard, klass) @qualified_query_builders[shard.id] ||= klass.connection.cacheable_query(self.class, @arel) end |