Sha256: a23cb7688070a458d4360a97672250a52836b3122990af0ff4bf53377575b4a5

Contents?: true

Size: 1.21 KB

Versions: 6

Compression:

Stored size: 1.21 KB

Contents

module ActiveRecord::Turntable::Algorithm
  class RangeBsearchAlgorithm < Base
    def choose(shard_maps, key)
      shard_map = shard_maps.bsearch { |shard| key <= shard.range.max }
      raise ActiveRecord::Turntable::CannotSpecifyShardError, "cannot specify shard for key:#{key.inspect}" unless shard_map
      shard_map.shard
    end

    def choose_index(shard_maps, key)
      (0...shard_maps.size).bsearch { |idx| key <= shard_maps[idx].range.max } or
        raise ActiveRecord::Turntable::CannotSpecifyShardError, "cannot specify shard for key:#{key.inspect}"
    end

    def shard_weights(shard_maps, current_sequence_value)
      current_shard_index = choose_index(shard_maps, current_sequence_value)
      shard_maps = shard_maps[0..current_shard_index]
      weights_hash = Hash.new { |h, k| h[k] = 0 }
      shard_maps.each_with_index do |shard_map, idx|
        weights_hash[shard_map.shard] += if idx < current_shard_index
                                           shard_map.range.size
                                         else
                                           current_sequence_value - shard_map.range.min + 1
                                         end
      end
      weights_hash
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
activerecord-turntable-4.4.1 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb
activerecord-turntable-4.4.0 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb
activerecord-turntable-4.3.0 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb
activerecord-turntable-4.2.0 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb
activerecord-turntable-4.1.0 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb
activerecord-turntable-4.0.0 lib/active_record/turntable/algorithm/range_bsearch_algorithm.rb