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
# 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