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
 | |
| }
 |