in pkg/log/structure/merger/merged.go [77:133]
func (d *StrategicMergedStructureData) Keys() ([]string, error) {
prevKeys, err := d.prev.Keys()
if err != nil {
return nil, err
}
patchKeys, err := d.patch.Keys()
if err != nil {
return nil, err
}
ty, err := d.Type()
if err != nil {
return nil, err
}
patchAttr, err := d.readScalarAsString(d.patch, "$patch")
if patchAttr == "delete" {
return []string{""}, nil
}
switch ty {
case structuredata.StructuredTypeMap:
keydiff := NewKeyDiff(prevKeys, patchKeys)
strategicPatchKeys := splitPatchKeysByFieldsOrMergeAttributes(keydiff.OnlyInPatch)
if err == nil {
if patchAttr == "replace" {
return append(keydiff.Both, strategicPatchKeys.FieldKeys...), nil
}
}
result := []string{}
result = append(result, prevKeys...)
result = append(result, strategicPatchKeys.FieldKeys...)
retainKeysAttr, err := d.readStringArray(d.patch, "$retainKeys")
if err == nil {
retainKeysInMap := map[string]struct{}{}
for _, key := range retainKeysAttr {
retainKeysInMap[key] = struct{}{}
}
retainResult := []string{}
for _, key := range result {
if _, in := retainKeysInMap[key]; in {
retainResult = append(retainResult, key)
}
}
return retainResult, nil
}
return result, nil
case structuredata.StructuredTypeArray:
if d.arrayMergeResultSourceCache == nil {
err := d.buildArrayMergeResultSourceCache()
if err != nil {
return nil, err
}
}
return stringSequence(len(d.arrayMergeResultSourceCache.References)), nil
default:
return []string{""}, nil
}
}