mirror of
https://github.com/grafana/grafana.git
synced 2025-09-23 13:43:09 +08:00

* comes from grafana/gel-app * remove transform plugin code * move __expr__ and -100 constants to expr pkg * set OrgID on request plugin context * use gtime for resample duration * in resample, rename "rule" to "window", use gtime for duration, parse duration before exec * remove gel entry from plugins-bundled/external.json which creates an empty array for plugins
182 lines
3.8 KiB
Go
182 lines
3.8 KiB
Go
package mathexp
|
|
|
|
import (
|
|
"math"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
|
)
|
|
|
|
// Common Test Constructor Utils and Types
|
|
type nullTimeTP struct {
|
|
t *time.Time
|
|
f *float64
|
|
}
|
|
|
|
type tp struct {
|
|
t time.Time
|
|
f *float64
|
|
}
|
|
|
|
type timeSecondTP struct {
|
|
f *float64
|
|
t time.Time
|
|
}
|
|
|
|
type noNullTP struct {
|
|
t time.Time
|
|
f float64
|
|
}
|
|
|
|
func makeSeriesNullableTime(name string, labels data.Labels, points ...nullTimeTP) Series {
|
|
newSeries := NewSeries(name, labels, 0, true, 1, true, len(points))
|
|
for idx, p := range points {
|
|
_ = newSeries.SetPoint(idx, p.t, p.f)
|
|
}
|
|
return newSeries
|
|
}
|
|
|
|
func makeSeries(name string, labels data.Labels, points ...tp) Series {
|
|
newSeries := NewSeries(name, labels, 0, false, 1, true, len(points))
|
|
for idx, p := range points {
|
|
err := newSeries.SetPoint(idx, &p.t, p.f)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
return newSeries
|
|
}
|
|
|
|
func makeNoNullSeries(name string, labels data.Labels, points ...noNullTP) Series {
|
|
newSeries := NewSeries(name, labels, 0, false, 1, false, len(points))
|
|
for idx, p := range points {
|
|
err := newSeries.SetPoint(idx, &p.t, &p.f)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
return newSeries
|
|
}
|
|
|
|
func makeSeriesTimeSecond(name string, labels data.Labels, points ...timeSecondTP) Series {
|
|
newSeries := NewSeries(name, labels, 1, false, 0, true, len(points))
|
|
for idx, p := range points {
|
|
err := newSeries.SetPoint(idx, &p.t, p.f)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
return newSeries
|
|
}
|
|
|
|
func makeNumber(name string, labels data.Labels, f *float64) Number {
|
|
newNumber := NewNumber(name, labels)
|
|
newNumber.SetValue(f)
|
|
return newNumber
|
|
}
|
|
|
|
func unixTimePointer(sec, nsec int64) *time.Time {
|
|
t := time.Unix(sec, nsec)
|
|
return &t
|
|
}
|
|
|
|
func float64Pointer(f float64) *float64 {
|
|
return &f
|
|
}
|
|
|
|
var aSeriesNullableTime = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeSeriesNullableTime("temp", nil, nullTimeTP{
|
|
unixTimePointer(5, 0), float64Pointer(2),
|
|
}, nullTimeTP{
|
|
unixTimePointer(10, 0), float64Pointer(1),
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
|
|
var aSeries = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeSeries("temp", nil, tp{
|
|
time.Unix(5, 0), float64Pointer(2),
|
|
}, tp{
|
|
time.Unix(10, 0), float64Pointer(1),
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
|
|
var aSeriesTimeSecond = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeSeriesTimeSecond("temp", nil, timeSecondTP{
|
|
float64Pointer(2), time.Unix(5, 0),
|
|
}, timeSecondTP{
|
|
float64Pointer(1), time.Unix(10, 0),
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
|
|
var aSeriesNoNull = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeNoNullSeries("temp", nil, noNullTP{
|
|
time.Unix(5, 0), 2,
|
|
}, noNullTP{
|
|
time.Unix(10, 0), 1,
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
|
|
var aSeriesbNumber = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeSeriesNullableTime("temp", nil, nullTimeTP{
|
|
unixTimePointer(5, 0), float64Pointer(2),
|
|
}, nullTimeTP{
|
|
unixTimePointer(10, 0), float64Pointer(1),
|
|
}),
|
|
},
|
|
},
|
|
"B": Results{
|
|
[]Value{
|
|
makeNumber("volt", data.Labels{"id": "1"}, float64Pointer(7)),
|
|
},
|
|
},
|
|
}
|
|
|
|
var twoSeriesSets = Vars{
|
|
"A": Results{
|
|
[]Value{
|
|
makeSeriesNullableTime("temp", data.Labels{"sensor": "a", "turbine": "1"}, nullTimeTP{
|
|
unixTimePointer(5, 0), float64Pointer(6),
|
|
}, nullTimeTP{
|
|
unixTimePointer(10, 0), float64Pointer(8),
|
|
}),
|
|
makeSeriesNullableTime("temp", data.Labels{"sensor": "b", "turbine": "1"}, nullTimeTP{
|
|
unixTimePointer(5, 0), float64Pointer(10),
|
|
}, nullTimeTP{
|
|
unixTimePointer(10, 0), float64Pointer(16),
|
|
}),
|
|
},
|
|
},
|
|
"B": Results{
|
|
[]Value{
|
|
makeSeriesNullableTime("efficiency", data.Labels{"turbine": "1"}, nullTimeTP{
|
|
unixTimePointer(5, 0), float64Pointer(.5),
|
|
}, nullTimeTP{
|
|
unixTimePointer(10, 0), float64Pointer(.2),
|
|
}),
|
|
},
|
|
},
|
|
}
|
|
|
|
// NaN is just to make the calls a little cleaner, the one
|
|
// call is not for any sort of equality side effect in tests.
|
|
// note: cmp.Equal must be used to test Equality for NaNs.
|
|
var NaN = float64Pointer(math.NaN())
|