From 09c91ccbe49e772ecf5a54cd7a9ebeaf695d4946 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 23 Sep 2021 17:44:02 +0300 Subject: [PATCH] Fix top() and bottom() functions by fixing sorting, closes #1313 --- pkg/timeseries/models.go | 3 +++ pkg/timeseries/sort.go | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/timeseries/models.go b/pkg/timeseries/models.go index 26b60c2..0b84dd7 100644 --- a/pkg/timeseries/models.go +++ b/pkg/timeseries/models.go @@ -49,6 +49,9 @@ type TimeSeriesMeta struct { // Item update interval. nil means not supported intervals (flexible, schedule, etc) Interval *time.Duration + + // AggValue is using for sorting purposes + AggValue *float64 } type AggFunc = func(points []TimePoint) *float64 diff --git a/pkg/timeseries/sort.go b/pkg/timeseries/sort.go index 4220ba8..0358bf8 100644 --- a/pkg/timeseries/sort.go +++ b/pkg/timeseries/sort.go @@ -7,16 +7,15 @@ import ( // SortBy sorts series by value calculated with provided aggFunc in given order func SortBy(series []*TimeSeriesData, order string, aggFunc AggFunc) []*TimeSeriesData { - aggregatedSeries := make([]TimeSeries, len(series)) - for i, s := range series { - aggregatedSeries[i] = s.TS.GroupByRange(aggFunc) + for _, s := range series { + s.Meta.AggValue = aggFunc(s.TS) } // Sort by aggregated value sort.Slice(series, func(i, j int) bool { - if len(aggregatedSeries[i]) > 0 && len(aggregatedSeries[j]) > 0 { - return *aggregatedSeries[i][0].Value < *aggregatedSeries[j][0].Value - } else if len(aggregatedSeries[j]) > 0 { + 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