class Upsert::Row

@private

Constants

OrderedHash

Attributes

hstore_delete_keys[R]
selector[R]
setter[R]

Public Class Methods

new(raw_selector, raw_setter, options) click to toggle source
# File lib/upsert/row.rb, line 19
def initialize(raw_selector, raw_setter, options)
  eager_nullify = (options.nil? || options.fetch(:eager_nullify, true))

  @selector = raw_selector.inject({}) do |memo, (k, v)|
    memo[k.to_s] = v
    memo
  end

  @hstore_delete_keys = {}
  @setter = raw_setter.inject({}) do |memo, (k, v)|
    k = k.to_s
    if v.is_a?(::Hash) and eager_nullify
      v.each do |kk, vv|
        if vv.nil?
          (@hstore_delete_keys[k] ||= []) << kk
        end
      end
    end
    memo[k] = v
    memo
  end

  (selector.keys - setter.keys).each do |missing|
    setter[missing] = selector[missing]
  end

  # there is probably a more clever way to incrementally sort these hashes
  @selector = sort_hash selector
  @setter = sort_hash setter
end

Private Instance Methods

sort_hash(original) click to toggle source
# File lib/upsert/row.rb, line 52
def sort_hash(original)
  original.keys.sort.inject(OrderedHash.new) do |memo, k|
    memo[k] = original[k]
    memo
  end
end