class MixedGauge::ShardRepository

Manages generated AR models

Attributes

assigned_slots[R]
base_class[R]

Public Class Methods

new(cluster_config, base_class) click to toggle source

@param [ClusterConfig] cluster_config @param [Class] base_class A AR Model

# File lib/mixed_gauge/shard_repository.rb, line 8
def initialize(cluster_config, base_class)
  @base_class = base_class

  shards = cluster_config.connection_registry.map do |slot_range, connection_name|
    [connection_name, generate_model_for_shard(connection_name, slot_range)]
  end
  @shards = Hash[shards]
end

Public Instance Methods

all() click to toggle source

@return [Array<Class>]

# File lib/mixed_gauge/shard_repository.rb, line 30
def all
  @shards.values
end
fetch(connection_name) click to toggle source

@param [Symbol] connection_name @return [Class] A model class for this shard

# File lib/mixed_gauge/shard_repository.rb, line 19
def fetch(connection_name)
  @shards.fetch(connection_name)
end
fetch_by_slots(assigned_slots) click to toggle source

@param [Range] slots @return [Class, nil] A AR model class.

# File lib/mixed_gauge/shard_repository.rb, line 25
def fetch_by_slots(assigned_slots)
  @shards.find { |_, model| model.assigned_slots == assigned_slots }[1]
end

Private Instance Methods

generate_class_name(connection_name) click to toggle source

@param [Symbol] connection_name @return [String]

# File lib/mixed_gauge/shard_repository.rb, line 63
def generate_class_name(connection_name)
  "ShardFor#{connection_name.to_s.tr('-', '_').classify}"
end
generate_model_for_shard(connection_name, slot_range) click to toggle source

@param [Symbol] connection_name @param [Range] slot_range @return [Class] A sub class of given AR model.

A sub class has connection setting for specific shard.
# File lib/mixed_gauge/shard_repository.rb, line 40
    def generate_model_for_shard(connection_name, slot_range)
      base_class_name = @base_class.name
      class_name = generate_class_name(connection_name)

      model = Class.new(base_class) do
        class << self
          attr_reader :assigned_slots
        end
        @assigned_slots = slot_range

        self.table_name = base_class.table_name
        module_eval <<-RUBY, __FILE__, __LINE__ + 1
          def self.name
            "#{base_class_name}::#{class_name}"
          end
        RUBY
      end
      model.class_eval { establish_connection(connection_name) }
      model
    end