64 lines
1.4 KiB
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
|
|
}
|