diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts index a254707bb44..92cad2a1986 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts @@ -46,11 +46,16 @@ const multiSeriesWithSingleField = [ }), ]; +let spyConsoleWarn: jest.SpyInstance; describe('FilterByValue transformer', () => { beforeAll(() => { mockTransformationsRegistry([filterByValueTransformer]); }); + beforeEach(() => { + spyConsoleWarn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + }); + it('should exclude values', async () => { const lower: MatcherConfig> = { id: ValueMatcherID.lower, @@ -92,7 +97,7 @@ describe('FilterByValue transformer', () => { }); }); - it('should not cross frame boundaries', async () => { + it('should not cross frame boundaries when equals 0', async () => { const cfg: DataTransformerConfig = { id: DataTransformerID.filterByValue, options: { @@ -151,6 +156,66 @@ describe('FilterByValue transformer', () => { state: {}, }, ]); + + expect(console.warn).toHaveBeenCalledTimes(2); + }); + + spyConsoleWarn.mockRestore(); + }); + + it('should not cross frame boundaries', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.filterByValue, + options: { + type: FilterByValueType.exclude, + match: FilterByValueMatch.any, + filters: [ + { + fieldName: 'A value', + config: { + id: ValueMatcherID.greater, + options: { value: 0 }, + }, + }, + ], + }, + }; + + await expect(transformDataFrame([cfg], multiSeriesWithSingleField)).toEmitValuesWith((received) => { + const processed = received[0]; + expect(processed.length).toEqual(2); + + expect(processed[0].fields).toEqual([ + { + name: 'time', + type: FieldType.time, + values: [2000], + state: {}, + }, + { + name: 'value', + type: FieldType.number, + values: [0], + state: {}, + }, + ]); + + expect(processed[1].fields).toEqual([ + { + name: 'time', + type: FieldType.time, + values: [5000, 6000, 7000], + state: {}, + }, + { + name: 'value', + type: FieldType.number, + values: [0, 1, 1], + state: {}, + }, + ]); + + expect(console.warn).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.ts index 3305547bd10..8bc0fd3b319 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.ts @@ -104,10 +104,9 @@ export const filterByValueTransformer: DataTransformerInfo(); + const fieldIndexByName = groupFieldIndexByName(frame, data); let matchers; if (transformationsVariableSupport()) { @@ -202,15 +201,13 @@ const createFilterValueMatchers = ( }); }; -const groupFieldIndexByName = (data: DataFrame[]) => { +const groupFieldIndexByName = (frame: DataFrame, data: DataFrame[]) => { const lookup: Record = {}; - for (const frame of data) { - frame.fields.forEach((field, fieldIndex) => { - const fieldName = getFieldDisplayName(field, frame, data); - lookup[fieldName] = fieldIndex; - }); - } + frame.fields.forEach((field, fieldIndex) => { + const fieldName = getFieldDisplayName(field, frame, data); + lookup[fieldName] = fieldIndex; + }); return lookup; };