Class: FMCache::Decoder::FieldsChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/fmcache/decoder/fields_checker.rb

Defined Under Namespace

Classes: CheckResult

Instance Method Summary collapse

Instance Method Details

#check(list, field_mask) ⇒ CheckResult

Parameters:

  • list (<Hash>)
  • field_mask (FieldMaskParser::Node)

Returns:



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/fmcache/decoder/fields_checker.rb', line 17

def check(list, field_mask)
  l              = []
  incomplete_l   = []
  missing_fields = Set.new

  list.each do |d|
    _, m_fields = check_fields(d, field_mask)
    if m_fields.size == 0
      l << d
    else
      incomplete_l << d
      missing_fields |= m_fields
    end
  end

  CheckResult.new(
    list:            l,
    incomplete_list: incomplete_l,
    missing_fields:  missing_fields,
  )
end

#check_fields(data, field_mask, prefix = []) ⇒ Object

Parameters:

  • data (Hash)
  • field_mask (FieldMaskParser::Node)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/fmcache/decoder/fields_checker.rb', line 41

def check_fields(data, field_mask, prefix = [])
  fields         = []
  missing_fields = []

  id_exists = false
  field_mask.attrs.each do |attr|
    f = Field.to_s(prefix: prefix, attr: attr)
    if data.fetch(f)
      fields << f
      id_exists = true if attr == :id
    else  # NOTE: When nil, cache of the field does not exist
      missing_fields << f
    end
  end

  if id_exists
    field_mask.assocs.each do |assoc|
      f, m_f = check_fields(data, assoc, (prefix + [assoc.name]))
      fields         += f
      missing_fields += m_f
    end
  else
    # NOTE: When the cache of id does not exist, treat current and lower
    # layer as missing fields
    # TODO(south37) Improve performance
    missing_fields += fields
    fields         = []

    field_mask.assocs.each do |assoc|
      missing_fields += Helper.to_fields(assoc, prefix: prefix + [assoc.name])
    end
  end

  [fields, missing_fields]
end