Sha256: 29b75b532310c4fc3e8573bb64d3786e8178723f3fa891a2b8eceb014d171974

Contents?: true

Size: 1.05 KB

Versions: 1

Compression:

Stored size: 1.05 KB

Contents

require 'perforated/rebuilder'
require 'perforated/strategy'
require 'perforated/compatibility/fetch_multi'

module Perforated
  class Cache
    attr_accessor :enumerable, :strategy

    def initialize(enumerable, strategy = Perforated::Strategy)
      @enumerable = enumerable
      @strategy   = strategy
    end

    def to_json(rooted: false, batch_size: 1000, &block)
      results = []

      enumerable.each_slice(batch_size) do |subset|
        keyed = key_mapped(subset)

        results << fetch_multi(keyed) do |key|
          if block_given?
            (yield keyed[key]).to_json
          else
            keyed[key].to_json
          end
        end.values
      end

      Perforated::Rebuilder.new(results).rebuild(rooted: rooted)
    end

    private

    def key_mapped(subset)
      subset.each_with_object({}) do |object, memo|
        memo[strategy.expand_cache_key(object)] = object
      end
    end

    def fetch_multi(keyed, &block)
      keys = keyed.keys.map(&:dup)

      Perforated::Compatibility.fetch_multi(*keys, &block)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
perforated-0.9.1 lib/perforated/cache.rb