Files
grafana-zabbix/pkg/timeseries/sort.go

64 lines
1.4 KiB
Go

package timeseries
import (
"sort"
"strconv"
)
// SortBy sorts series by value calculated with provided aggFunc in given order
func SortBy(series []*TimeSeriesData, order string, aggFunc AggFunc) []*TimeSeriesData {
for _, s := range series {
s.Meta.AggValue = aggFunc(s.TS)
}
// Sort by aggregated value
sort.Slice(series, func(i, j int) bool {
if series[i].Meta.AggValue != nil && series[j].Meta.AggValue != nil {
return *series[i].Meta.AggValue < *series[j].Meta.AggValue
} else if series[j].Meta.AggValue != nil {
return true
}
return false
})
if order == "desc" {
reverseSeries := make([]*TimeSeriesData, len(series))
for i := 0; i < len(series); i++ {
reverseSeries[i] = series[len(series)-1-i]
}
series = reverseSeries
}
return series
}
func SortByItem(series []*TimeSeriesData) []*TimeSeriesData {
sort.Slice(series, func(i, j int) bool {
itemIDi, err := strconv.Atoi(series[i].Meta.Item.ID)
if err != nil {
return false
}
itemIDj, err := strconv.Atoi(series[j].Meta.Item.ID)
if err != nil {
return false
}
return itemIDi < itemIDj
})
return series
}
func SortByName(series []*TimeSeriesData, order string) []*TimeSeriesData {
sort.Slice(series, func(i, j int) bool {
if order == "desc" {
return series[i].Meta.Name > series[j].Meta.Name
} else {
return series[i].Meta.Name < series[j].Meta.Name
}
})
return series
}