Fix percentile aggregation with $__range_series interval

This commit is contained in:
Alexander Zobnin
2022-04-27 15:26:48 +03:00
parent 13d89a0806
commit 8d35c6b297
2 changed files with 25 additions and 1 deletions

View File

@@ -307,6 +307,13 @@ func applyPercentileAgg(series []*timeseries.TimeSeriesData, params ...interface
if err != nil { if err != nil {
return nil, errParsingFunctionParam(err) return nil, errParsingFunctionParam(err)
} }
aggFunc := timeseries.AggPercentile(percentile)
if pInterval == RANGE_VARIABLE_VALUE {
aggregatedSeries := timeseries.AggregateByRange(series, aggFunc)
aggregatedSeries.Meta.Name = fmt.Sprintf("percentileAgg(%s, %v)", pInterval, percentile)
return []*timeseries.TimeSeriesData{aggregatedSeries}, nil
}
interval, err := gtime.ParseInterval(pInterval) interval, err := gtime.ParseInterval(pInterval)
if err != nil { if err != nil {
@@ -316,7 +323,6 @@ func applyPercentileAgg(series []*timeseries.TimeSeriesData, params ...interface
return series, nil return series, nil
} }
aggFunc := timeseries.AggPercentile(percentile)
aggregatedSeries := timeseries.AggregateBy(series, interval, aggFunc) aggregatedSeries := timeseries.AggregateBy(series, interval, aggFunc)
aggregatedSeries.Meta.Name = fmt.Sprintf("percentileAgg(%s, %v)", pInterval, percentile) aggregatedSeries.Meta.Name = fmt.Sprintf("percentileAgg(%s, %v)", pInterval, percentile)

View File

@@ -166,6 +166,24 @@ func AggregateBy(series []*TimeSeriesData, interval time.Duration, aggFunc AggFu
return aggregatedSeriesData return aggregatedSeriesData
} }
func AggregateByRange(series []*TimeSeriesData, aggFunc AggFunc) *TimeSeriesData {
aggregatedSeries := NewTimeSeries()
// Combine all points into one time series
for _, s := range series {
aggregatedSeries = append(aggregatedSeries, s.TS...)
}
value := aggFunc(aggregatedSeries)
aggregatedSeriesData := NewTimeSeriesData()
aggregatedSeriesData.TS = []TimePoint{
{Time: aggregatedSeries[0].Time, Value: value},
{Time: aggregatedSeries[aggregatedSeries.Len()-1].Time, Value: value},
}
return aggregatedSeriesData
}
func (ts TimeSeries) Sort() { func (ts TimeSeries) Sort() {
sorted := sort.SliceIsSorted(ts, ts.less()) sorted := sort.SliceIsSorted(ts, ts.less())
if !sorted { if !sorted {