From 21b3bcabe706a22abd03d1e76f23a213075f35f2 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 14 Aug 2016 17:32:03 +0100 Subject: [PATCH] in target.Merge(arg), always merge arg into target That way, as the top-level target.Merge(arg) on Report recursively descends into the data structure, all component Merge operations are invoked as target_component.Merge(arg_component). Merge is commutative, so semantically this does not matter. But it is easier to reason about and debug Merge code this way. Moreover, the merge order matters for performance since some merges, in particular LatestMap.Merge, are faster when the entries in the target are younger than the entries in the arg. So this change allows high-level code to invoke Report.Merge in the optimal order, in the knowledge that the order is preserved for component merges. Most of the Merge functions were already preserving order. Of the four that didn't, Nodes.Merge is the most significant - it is the only one that affects LatestMap.Merge order. --- report/edge_metadatas.go | 2 +- report/sets.go | 2 +- report/table.go | 2 +- report/topology.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/report/edge_metadatas.go b/report/edge_metadatas.go index 67dc95587..3c2705658 100644 --- a/report/edge_metadatas.go +++ b/report/edge_metadatas.go @@ -79,7 +79,7 @@ func (c EdgeMetadatas) Merge(other EdgeMetadatas) EdgeMetadatas { } iter.ForEach(func(key string, otherVal interface{}) { if val, ok := output.Lookup(key); ok { - output = output.Set(key, otherVal.(EdgeMetadata).Merge(val.(EdgeMetadata))) + output = output.Set(key, val.(EdgeMetadata).Merge(otherVal.(EdgeMetadata))) } else { output = output.Set(key, otherVal) } diff --git a/report/sets.go b/report/sets.go index 582899c48..b81918bee 100644 --- a/report/sets.go +++ b/report/sets.go @@ -92,7 +92,7 @@ func (s Sets) Merge(other Sets) Sets { iter.ForEach(func(key string, value interface{}) { set := value.(StringSet) if existingSet, ok := result.Lookup(key); ok { - set = set.Merge(existingSet.(StringSet)) + set = existingSet.(StringSet).Merge(set) } result = result.Set(key, set) }) diff --git a/report/table.go b/report/table.go index 10d4aa40c..675477148 100644 --- a/report/table.go +++ b/report/table.go @@ -163,7 +163,7 @@ func (t TableTemplates) Merge(other TableTemplates) TableTemplates { } for k, v := range other { if existing, ok := result[k]; ok { - result[k] = v.Merge(existing) + result[k] = existing.Merge(v) } else { result[k] = v } diff --git a/report/topology.go b/report/topology.go index 1beba4f79..ddfb4a859 100644 --- a/report/topology.go +++ b/report/topology.go @@ -181,7 +181,7 @@ func (n Nodes) Merge(other Nodes) Nodes { } for k, v := range other { if n, ok := cp[k]; ok { // don't overwrite - cp[k] = v.Merge(n) + cp[k] = n.Merge(v) } else { cp[k] = v }