Transformers: Fix Labels to fields duplicates (#40779)
This commit is contained in:
@@ -145,6 +145,68 @@ describe('Labels as Columns', () => {
|
||||
`);
|
||||
});
|
||||
});
|
||||
|
||||
it('data frame with labels and multiple fields', async () => {
|
||||
const cfg: DataTransformerConfig<LabelsToFieldsOptions> = {
|
||||
id: DataTransformerID.labelsToFields,
|
||||
options: {},
|
||||
};
|
||||
|
||||
const source = toDataFrame({
|
||||
name: 'A',
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [1000, 2000] },
|
||||
{ name: 'a', type: FieldType.number, values: [1, 3], labels: { name: 'thing' } },
|
||||
{ name: 'b', type: FieldType.number, values: [2, 4], labels: { name: 'thing' } },
|
||||
],
|
||||
});
|
||||
|
||||
await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => {
|
||||
const data = received[0];
|
||||
const result = toDataFrameDTO(data[0]);
|
||||
|
||||
const expected: FieldDTO[] = [
|
||||
{ name: 'time', type: FieldType.time, values: [1000, 2000], config: {} },
|
||||
{ name: 'a', type: FieldType.number, values: [1, 3], config: {} },
|
||||
{ name: 'b', type: FieldType.number, values: [2, 4], config: {} },
|
||||
{ name: 'name', type: FieldType.string, values: ['thing', 'thing'], config: {} },
|
||||
];
|
||||
|
||||
expect(result.fields).toEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
it('data frame with labels and multiple fields with different labels', async () => {
|
||||
const cfg: DataTransformerConfig<LabelsToFieldsOptions> = {
|
||||
id: DataTransformerID.labelsToFields,
|
||||
options: {},
|
||||
};
|
||||
|
||||
const source = toDataFrame({
|
||||
name: 'A',
|
||||
fields: [
|
||||
{ name: 'time', type: FieldType.time, values: [1000, 2000] },
|
||||
{ name: 'a', type: FieldType.number, values: [1, 3], labels: { name: 'thing', field: 'a' } },
|
||||
{ name: 'b', type: FieldType.number, values: [2, 4], labels: { name: 'thing', field: 'b' } },
|
||||
],
|
||||
});
|
||||
|
||||
await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => {
|
||||
const data = received[0];
|
||||
const result = toDataFrameDTO(data[0]);
|
||||
|
||||
const expected: FieldDTO[] = [
|
||||
{ name: 'time', type: FieldType.time, values: [1000, 2000], config: {} },
|
||||
{ name: 'a', type: FieldType.number, values: [1, 3], config: {} },
|
||||
{ name: 'b', type: FieldType.number, values: [2, 4], config: {} },
|
||||
{ name: 'name', type: FieldType.string, values: ['thing', 'thing'], config: {} },
|
||||
{ name: 'field', type: FieldType.string, values: ['a', 'a'], config: {} },
|
||||
{ name: 'field', type: FieldType.string, values: ['b', 'b'], config: {} },
|
||||
];
|
||||
|
||||
expect(result.fields).toEqual(expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function toSimpleObject(frame: DataFrame) {
|
||||
|
||||
@@ -24,6 +24,7 @@ export const labelsToFieldsTransformer: SynchronousDataTransformerInfo<LabelsToF
|
||||
|
||||
for (const frame of data) {
|
||||
const newFields: Field[] = [];
|
||||
const uniqueLabels: Record<string, Set<string>> = {};
|
||||
|
||||
for (const field of frame.fields) {
|
||||
if (!field.labels) {
|
||||
@@ -50,9 +51,16 @@ export const labelsToFieldsTransformer: SynchronousDataTransformerInfo<LabelsToF
|
||||
continue;
|
||||
}
|
||||
|
||||
const values = new Array(frame.length).fill(field.labels[labelName]);
|
||||
const uniqueValues = (uniqueLabels[labelName] ||= new Set());
|
||||
uniqueValues.add(field.labels[labelName]);
|
||||
}
|
||||
}
|
||||
|
||||
for (const name in uniqueLabels) {
|
||||
for (const value of uniqueLabels[name]) {
|
||||
const values = new Array(frame.length).fill(value);
|
||||
newFields.push({
|
||||
name: labelName,
|
||||
name: name,
|
||||
type: FieldType.string,
|
||||
values: new ArrayVector(values),
|
||||
config: {},
|
||||
|
||||
Reference in New Issue
Block a user