class FMCache::Encoder::Itemizer

Attributes

items[R]
{ String => <Hash> }

Public Class Methods

new(value, field_mask) click to toggle source

@param [Hash] value @param [FieldMaskParser::Node] field_mask

# File lib/fmcache/encoder/itemizer.rb, line 6
def initialize(value, field_mask)
  @value      = value
  @field_mask = field_mask
  @items      = {}
end

Public Instance Methods

run!() click to toggle source
# File lib/fmcache/encoder/itemizer.rb, line 15
def run!
  traverse!(value: @value, field_mask: @field_mask, prefix: [], p_id: nil)
end

Private Instance Methods

traverse!(value:, field_mask:, prefix:, p_id:) click to toggle source
# File lib/fmcache/encoder/itemizer.rb, line 21
def traverse!(value:, field_mask:, prefix:, p_id:)
  id = value[:id]

  field_mask.attrs.each do |attr|
    f = Field.to_s(prefix: prefix, attr: attr)
    v = value[attr]
    @items[f] ||= []
    @items[f] << { value: v, id: id, p_id: p_id }
  end

  field_mask.has_ones.each do |assoc|
    v = value[assoc.name]
    if v  # NOTE: Proceed only when value exists
      p = prefix + [assoc.name]
      traverse!(value: v, field_mask: assoc, prefix: p, p_id: id)
    end
  end

  field_mask.has_manies.each do |assoc|
    values = value[assoc.name] || []
    p      = prefix + [assoc.name]

    values.each do |v|
      traverse!(value: v, field_mask: assoc, prefix: p, p_id: id)
     end
  end
end