helper/schema: Fix readSet implementation (DiffFieldReader)
This commit is contained in:
parent
c738c5a9a3
commit
917ad44cf0
|
@ -238,10 +238,60 @@ func (r *DiffFieldReader) readSet(
|
||||||
// Create the set that will be our result
|
// Create the set that will be our result
|
||||||
set := schema.ZeroValue().(*Set)
|
set := schema.ZeroValue().(*Set)
|
||||||
|
|
||||||
|
// Check if we're supposed to remove it
|
||||||
|
v, ok := r.Diff.Attributes[prefix+"#"]
|
||||||
|
if ok && v.New == "0" {
|
||||||
|
// I'm not entirely sure what's the point of
|
||||||
|
// returning empty set w/ Exists: true
|
||||||
|
return FieldReadResult{
|
||||||
|
Value: set,
|
||||||
|
Exists: true,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compose list of all keys (diff + source)
|
||||||
|
var keys []string
|
||||||
|
|
||||||
|
// Add keys from diff
|
||||||
|
diffContainsField := false
|
||||||
|
for k, _ := range r.Diff.Attributes {
|
||||||
|
if strings.HasPrefix(k, address[0]+".") {
|
||||||
|
diffContainsField = true
|
||||||
|
}
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
// Bail out if diff doesn't contain the given field at all
|
||||||
|
if !diffContainsField {
|
||||||
|
return FieldReadResult{
|
||||||
|
Value: set,
|
||||||
|
Exists: false,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
// Add keys from source
|
||||||
|
sourceResult, err := r.Source.ReadField(address)
|
||||||
|
if err == nil && sourceResult.Exists {
|
||||||
|
sourceSet := sourceResult.Value.(*Set)
|
||||||
|
sourceMap := sourceSet.Map()
|
||||||
|
|
||||||
|
for k, _ := range sourceMap {
|
||||||
|
key := prefix + k
|
||||||
|
_, ok := r.Diff.Attributes[key]
|
||||||
|
if !ok {
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep the order consistent for hashing functions
|
||||||
|
sort.Strings(keys)
|
||||||
|
|
||||||
// Go through the map and find all the set items
|
// Go through the map and find all the set items
|
||||||
for k, d := range r.Diff.Attributes {
|
// We are not iterating over the diff directly as some indexes
|
||||||
if d.NewRemoved {
|
// may be missing and we expect the whole set to be returned.
|
||||||
// If the field is removed, we always ignore it
|
for _, k := range keys {
|
||||||
|
d, ok := r.Diff.Attributes[k]
|
||||||
|
if ok && d.NewRemoved {
|
||||||
|
// If the field is being removed, we ignore it
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(k, prefix) {
|
if !strings.HasPrefix(k, prefix) {
|
||||||
|
|
|
@ -98,6 +98,10 @@ func (s *Set) List() []interface{} {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Set) Map() map[string]interface{} {
|
||||||
|
return s.m
|
||||||
|
}
|
||||||
|
|
||||||
// Difference performs a set difference of the two sets, returning
|
// Difference performs a set difference of the two sets, returning
|
||||||
// a new third set that has only the elements unique to this set.
|
// a new third set that has only the elements unique to this set.
|
||||||
func (s *Set) Difference(other *Set) *Set {
|
func (s *Set) Difference(other *Set) *Set {
|
||||||
|
|
Loading…
Reference in New Issue