mirror of
https://github.com/grafana/grafana.git
synced 2025-08-02 06:12:59 +08:00
SQL: Fix SQL dataframe resampling (fill mode + time intervals) (#36937)
* Refactor resample logic * Adjust test to have one more timestamp out of range * adjust test + ensure filling * revert flag flip * Undo logic - should be timeseries only * change data calculation based on previous interval * fix the logics * fix typo * fix resample start time, to reuse what sql api returned * calculate the start point with from truncate by interval Co-authored-by: Will Browne <will.browne@grafana.com> Co-authored-by: Will Browne <wbrowne@users.noreply.github.com> Co-authored-by: Ying WANG <ying.wang@grafana.com>
This commit is contained in:
@ -486,6 +486,58 @@ func TestPostgres(t *testing.T) {
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("Given a table with one data point", func(t *testing.T) {
|
||||
type metric struct {
|
||||
Time time.Time
|
||||
Value int64
|
||||
}
|
||||
|
||||
startTime := time.Now().UTC().Add(-time.Minute * 5)
|
||||
series := []*metric{
|
||||
{
|
||||
Time: startTime,
|
||||
Value: 33,
|
||||
},
|
||||
}
|
||||
|
||||
_, err = sess.InsertMulti(series)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("querying with time group with default value", func(t *testing.T) {
|
||||
query := plugins.DataQuery{
|
||||
Queries: []plugins.DataSubQuery{
|
||||
{
|
||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||
"rawSql": "WITH data AS (SELECT now()-'3m'::interval AS ts, 42 AS n) SELECT $__timeGroup(ts, '1m', 0), n FROM data",
|
||||
"format": "time_series",
|
||||
}),
|
||||
RefID: "A",
|
||||
},
|
||||
},
|
||||
TimeRange: &plugins.DataTimeRange{
|
||||
From: fmt.Sprintf("%v", startTime.Unix()*1000),
|
||||
To: fmt.Sprintf("%v", startTime.Add(5*time.Minute).Unix()*1000),
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := exe.DataQuery(context.Background(), nil, query)
|
||||
require.NoError(t, err)
|
||||
queryResult := resp.Results["A"]
|
||||
require.NoError(t, queryResult.Error)
|
||||
|
||||
frames, _ := queryResult.Dataframes.Decoded()
|
||||
require.Equal(t, 1, len(frames))
|
||||
require.Equal(t, "Time", frames[0].Fields[0].Name)
|
||||
require.Equal(t, "n", frames[0].Fields[1].Name)
|
||||
require.Equal(t, float64(0), *frames[0].Fields[1].At(0).(*float64))
|
||||
require.Equal(t, float64(0), *frames[0].Fields[1].At(1).(*float64))
|
||||
require.Equal(t, float64(42), *frames[0].Fields[1].At(2).(*float64))
|
||||
require.Equal(t, float64(0), *frames[0].Fields[1].At(3).(*float64))
|
||||
require.Equal(t, float64(0), *frames[0].Fields[1].At(4).(*float64))
|
||||
require.Equal(t, float64(0), *frames[0].Fields[1].At(5).(*float64))
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("When doing a metric query using timeGroup with previous fill enabled", func(t *testing.T) {
|
||||
query := plugins.DataQuery{
|
||||
Queries: []plugins.DataSubQuery{
|
||||
|
Reference in New Issue
Block a user