Transformers: Fix Labels to fields duplicates (#40779)

This commit is contained in:
Douglas Thrift
2021-10-22 09:25:37 -07:00
committed by GitHub
parent 814a78ba46
commit b78e563ab6
2 changed files with 72 additions and 2 deletions
@@ -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: {},