Sha256: c44b380ea712d56e10a11150e595dfc039d2f4f9a92affa5f59b5f3cd81f4e70
Contents?: true
Size: 1.28 KB
Versions: 5
Compression:
Stored size: 1.28 KB
Contents
# -*- coding: utf-8 -*- require 'bsearch' module ActiveRecord::Turntable::Algorithm class RangeBsearchAlgorithm < Base def initialize(config) @config = config @config["shards"].sort_by! {|a| a["less_than"]} end def calculate(key) idx = calculate_idx(key) @config["shards"][idx]["connection"] rescue raise ActiveRecord::Turntable::CannotSpecifyShardError, "cannot specify shard for key:#{key}" end def calculate_idx(key) @config["shards"].bsearch_lower_boundary { |h| h["less_than"] <=> key } end # { connection_name => weight, ... } def calculate_used_shards_with_weight(sequence_value) idx = calculate_idx(sequence_value) last_connection = calculate(sequence_value) shards = @config["shards"][0..idx] weighted_hash = Hash.new {|h,k| h[k]=0} prev_max = 0 shards.each_with_index do |h,idx| weighted_hash[h["connection"]] += if idx < shards.size - 1 h["less_than"] - prev_max - 1 else sequence_value - prev_max end prev_max = h["less_than"] - 1 end return weighted_hash end end end
Version data entries
5 entries across 5 versions & 1 rubygems