class FMCache::Decoder::FieldsChecker
Public Instance Methods
check(list, field_mask)
click to toggle source
@param [<Hash>] list @param [FieldMaskParser::Node] field_mask @return [CheckResult]
# 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 = [])
click to toggle source
@param [Hash] data @param [FieldMaskParser::Node] field_mask
# 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