64 lines
1.6 KiB
Go
64 lines
1.6 KiB
Go
|
package jti_openconfig_telemetry
|
||
|
|
||
|
import "sort"
|
||
|
|
||
|
type DataGroup struct {
|
||
|
numKeys int
|
||
|
tags map[string]string
|
||
|
data map[string]interface{}
|
||
|
}
|
||
|
|
||
|
// Sort the data groups by number of keys
|
||
|
type CollectionByKeys []DataGroup
|
||
|
|
||
|
func (a CollectionByKeys) Len() int { return len(a) }
|
||
|
func (a CollectionByKeys) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||
|
func (a CollectionByKeys) Less(i, j int) bool { return a[i].numKeys < a[j].numKeys }
|
||
|
|
||
|
// Checks to see if there is already a group with these tags and returns its index. Returns -1 if unavailable.
|
||
|
func (a CollectionByKeys) IsAvailable(tags map[string]string) *DataGroup {
|
||
|
sort.Sort(CollectionByKeys(a))
|
||
|
|
||
|
// Iterate through all the groups and see if we have group with these tags
|
||
|
for _, group := range a {
|
||
|
// Since already sorted, match with only groups with N keys
|
||
|
if group.numKeys < len(tags) {
|
||
|
continue
|
||
|
} else if group.numKeys > len(tags) {
|
||
|
break
|
||
|
}
|
||
|
|
||
|
matchFound := true
|
||
|
for k, v := range tags {
|
||
|
if val, ok := group.tags[k]; ok {
|
||
|
if val != v {
|
||
|
matchFound = false
|
||
|
break
|
||
|
}
|
||
|
} else {
|
||
|
matchFound = false
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if matchFound {
|
||
|
return &group
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Inserts into already existing group or creates a new group
|
||
|
func (a CollectionByKeys) Insert(tags map[string]string, data map[string]interface{}) CollectionByKeys {
|
||
|
// If there is already a group with this set of tags, insert into it. Otherwise create a new group and insert
|
||
|
if group := a.IsAvailable(tags); group != nil {
|
||
|
for k, v := range data {
|
||
|
group.data[k] = v
|
||
|
}
|
||
|
} else {
|
||
|
a = append(a, DataGroup{len(tags), tags, data})
|
||
|
}
|
||
|
|
||
|
return a
|
||
|
}
|