Return results in a stable order
This commit is contained in:
33
pkg/timeseries/sort.go
Normal file
33
pkg/timeseries/sort.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package timeseries
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 {
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -145,33 +145,6 @@ func Filter(series []*TimeSeriesData, n int, order string, aggFunc AggFunc) []*T
|
|||||||
return filteredSeries
|
return filteredSeries
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
|
||||||
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 AggregateBy(series []*TimeSeriesData, interval time.Duration, aggFunc AggFunc) *TimeSeriesData {
|
func AggregateBy(series []*TimeSeriesData, interval time.Duration, aggFunc AggFunc) *TimeSeriesData {
|
||||||
aggregatedSeries := NewTimeSeries()
|
aggregatedSeries := NewTimeSeries()
|
||||||
|
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
|||||||
.pipe(
|
.pipe(
|
||||||
map((rsp: any) => {
|
map((rsp: any) => {
|
||||||
const resp = toDataQueryResponse(rsp);
|
const resp = toDataQueryResponse(rsp);
|
||||||
|
this.sortByRefId(resp);
|
||||||
this.applyFrontendFunctions(resp, request);
|
this.applyFrontendFunctions(resp, request);
|
||||||
return resp;
|
return resp;
|
||||||
}),
|
}),
|
||||||
@@ -369,6 +370,17 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
|||||||
return timeseries;
|
return timeseries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sortByRefId(response: DataQueryResponse) {
|
||||||
|
response.data.sort((a, b) => {
|
||||||
|
if (a.refId < b.refId) {
|
||||||
|
return -1;
|
||||||
|
} else if (a.refId > b.refId) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
applyFrontendFunctions(response: DataQueryResponse, request: DataQueryRequest<any>) {
|
applyFrontendFunctions(response: DataQueryResponse, request: DataQueryRequest<any>) {
|
||||||
for (let i = 0; i < response.data.length; i++) {
|
for (let i = 0; i < response.data.length; i++) {
|
||||||
const frame: DataFrame = response.data[i];
|
const frame: DataFrame = response.data[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user