Transformations: Fix filterByValue being applied to the wrong series (#90512)

pull/90611/head
Adela Almasan 10 months ago committed by GitHub
parent 6a2a6b0fbc
commit 61d8910a5b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 67
      packages/grafana-data/src/transformations/transformers/filterByValue.test.ts
  2. 15
      packages/grafana-data/src/transformations/transformers/filterByValue.ts

@ -46,11 +46,16 @@ const multiSeriesWithSingleField = [
}), }),
]; ];
let spyConsoleWarn: jest.SpyInstance;
describe('FilterByValue transformer', () => { describe('FilterByValue transformer', () => {
beforeAll(() => { beforeAll(() => {
mockTransformationsRegistry([filterByValueTransformer]); mockTransformationsRegistry([filterByValueTransformer]);
}); });
beforeEach(() => {
spyConsoleWarn = jest.spyOn(console, 'warn').mockImplementation(() => {});
});
it('should exclude values', async () => { it('should exclude values', async () => {
const lower: MatcherConfig<BasicValueMatcherOptions<number>> = { const lower: MatcherConfig<BasicValueMatcherOptions<number>> = {
id: ValueMatcherID.lower, 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<FilterByValueTransformerOptions> = { const cfg: DataTransformerConfig<FilterByValueTransformerOptions> = {
id: DataTransformerID.filterByValue, id: DataTransformerID.filterByValue,
options: { options: {
@ -151,6 +156,66 @@ describe('FilterByValue transformer', () => {
state: {}, state: {},
}, },
]); ]);
expect(console.warn).toHaveBeenCalledTimes(2);
});
spyConsoleWarn.mockRestore();
});
it('should not cross frame boundaries', async () => {
const cfg: DataTransformerConfig<FilterByValueTransformerOptions> = {
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);
}); });
}); });

@ -104,10 +104,9 @@ export const filterByValueTransformer: DataTransformerInfo<FilterByValueTransfor
const processed: DataFrame[] = []; const processed: DataFrame[] = [];
const fieldIndexByName = groupFieldIndexByName(data);
for (const frame of data) { for (const frame of data) {
const rows = new Set<number>(); const rows = new Set<number>();
const fieldIndexByName = groupFieldIndexByName(frame, data);
let matchers; let matchers;
if (transformationsVariableSupport()) { if (transformationsVariableSupport()) {
@ -202,15 +201,13 @@ const createFilterValueMatchers = (
}); });
}; };
const groupFieldIndexByName = (data: DataFrame[]) => { const groupFieldIndexByName = (frame: DataFrame, data: DataFrame[]) => {
const lookup: Record<string, number> = {}; const lookup: Record<string, number> = {};
for (const frame of data) { frame.fields.forEach((field, fieldIndex) => {
frame.fields.forEach((field, fieldIndex) => { const fieldName = getFieldDisplayName(field, frame, data);
const fieldName = getFieldDisplayName(field, frame, data); lookup[fieldName] = fieldIndex;
lookup[fieldName] = fieldIndex; });
});
}
return lookup; return lookup;
}; };

Loading…
Cancel
Save