Sha256: b3916364990ce817175e4a323b805c106a82609ba24118aec6612479d9464ef3

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

module Terrestrial
  class DirtyMap
    def initialize(storage)
      @storage = storage
    end

    attr_reader :storage
    private     :storage

    def load_if_new(record)
      storage.fetch(hash_key(record)) { self.load(record) }
      record
    end

    def load(record)
      storage.store(hash_key(record), record.deep_clone)
      record
    end

    def dirty?(record)
      !same_as_loaded?(record) || deleted?(record)
    end

    def reject_unchanged_fields(record)
      record_as_loaded = storage.fetch(hash_key(record), {})

      record.reject { |field, value|
        value == record_as_loaded.fetch(field, NotFound)
      }
    end

    private

    NotFound = Module.new

    def same_as_loaded?(record)
      record_as_loaded = storage.fetch(hash_key(record), NotFound)

      if record_as_loaded == NotFound
        false
      else
        record.subset?(record_as_loaded)
      end
    end

    def deleted?(record)
      record.if_delete { return true }
      return false
    end

    def hash_key(record)
      [record.namespace, record.identity]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
terrestrial-0.5.0 lib/terrestrial/dirty_map.rb