Sha256: 137320c188a2e0d7d960b12435e936e4e0607b6310d0c608ccd4793e72687768

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

module Meibo
  class DataSet
    include Enumerable

    attr_reader :roster

    def initialize(data, roster:)
      @data = data
      @roster = roster
      @cache = {}
    end

    def <<(new_data)
      raise DataNotFoundError, "sourcedIdがありません" unless new_data.sourced_id
      raise SourcedIdDuplicatedError, 'sourcedIdが重複しています' if data_by_sourced_id.key?(new_data.sourced_id)

      @data << new_data
      @cache.clear
    end

    def check_semantically_consistent
      unless @data.size == data_by_sourced_id.size
        raise SourcedIdDuplicatedError, 'sourcedIdが重複しています'
      end

      unless data_by_sourced_id[nil].nil?
        raise DataNotFoundError, "sourcedIdがありません"
      end
    end

    def each(...)
      @data.each(...)
    end

    def empty?
      @data.empty?
    end

    def find(sourced_id)
      data_by_sourced_id.fetch(sourced_id)
    rescue KeyError
      raise DataNotFoundError, "sourcedId: #{sourced_id} が見つかりません"
    end

    def by_organization(org_sourced_id)
      data_by_org_sourced_id[org_sourced_id]
    end

    def by_user(user_sourced_id)
      data_by_user_sourced_id[user_sourced_id]
    end

    private

    def data_by_org_sourced_id
      @cache[:data_by_org_sourced_id] ||= @data.group_by(&:data_by_org_sourced_id).to_h do |org_sourced_id, data|
        [org_sourced_id, new(data)]
      end
    end

    def data_by_sourced_id
      @cache[:data_by_sourced_id] ||= @data.to_h {|datum| [datum.sourced_id, datum] }
    end

    def data_by_user_sourced_id
      @cache[:data_by_user_sourced_id] ||= @data.group_by(&:user_sourced_id).to_h do |user_sourced_id, data|
        [user_sourced_id, new(data)]
      end
    end

    def new(data)
      self.class.new(data, roster: roster)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
meibo-0.13.0 lib/meibo/data_set.rb