diff --git a/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts b/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts index 19b9c4a18f2..99abb85cc01 100644 --- a/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts @@ -1,3 +1,4 @@ +import { reduceField, ReducerID } from '..'; import { DataFrame, FieldType } from '../types/dataFrame'; import { DataFrameJSON } from './DataFrameJSON'; import { StreamingDataFrame } from './StreamingDataFrame'; @@ -200,10 +201,14 @@ describe('Streaming JSON', () => { maxLength: 5, } ); + let val = reduceField({ field: stream.fields[0], reducers: [ReducerID.lastNotNull] })[ReducerID.lastNotNull]; + expect(val).toEqual(100); expect(stream.length).toEqual(1); stream.push({ data: { values: [[200]] }, }); + val = reduceField({ field: stream.fields[0], reducers: [ReducerID.lastNotNull] })[ReducerID.lastNotNull]; + expect(val).toEqual(200); expect(stream.length).toEqual(2); const copy = ({ ...stream } as any) as DataFrame; diff --git a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts b/packages/grafana-data/src/dataframe/StreamingDataFrame.ts index f87457c2111..94a19173321 100644 --- a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts +++ b/packages/grafana-data/src/dataframe/StreamingDataFrame.ts @@ -178,7 +178,11 @@ export class StreamingDataFrame implements DataFrame { let appended = circPush(curValues, values, this.options.maxLength, this.timeFieldIndex, this.options.maxDelta); appended.forEach((v, i) => { - this.fields[i].values.buffer = v; + const { state, values } = this.fields[i]; + values.buffer = v; + if (state) { + state.calcs = undefined; + } }); // Update the frame length diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index e23fdad4cb8..7e2d7cc5f49 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -46,6 +46,8 @@ interface ReduceFieldOptions { /** * @returns an object with a key for each selected stat + * NOTE: This will also modify the 'field.state' object, + * leaving values in a cache until cleared. */ export function reduceField(options: ReduceFieldOptions): FieldCalcs { const { field, reducers } = options;