{"version":3,"file":"labelsToFields.cjs","sources":["../../../../src/transformations/transformers/labelsToFields.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { SynchronousDataTransformerInfo } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\n\nexport enum LabelsToFieldsMode {\n  Columns = 'columns', // default mode\n  Rows = 'rows',\n}\n\nexport interface LabelsToFieldsOptions {\n  mode?: LabelsToFieldsMode;\n\n  /** When empty, this will keep all labels, otherwise it will keep only labels matching the value */\n  keepLabels?: string[];\n\n  /**\n   * When in column mode and if set this will use this label's value as the value field name.\n   */\n  valueLabel?: string;\n}\n\nexport const labelsToFieldsTransformer: SynchronousDataTransformerInfo<LabelsToFieldsOptions> = {\n  id: DataTransformerID.labelsToFields,\n  name: 'Labels to fields',\n  description: 'Extract time series labels to fields (columns or rows)',\n  defaultOptions: {},\n\n  operator: (options, ctx) => (source) =>\n    source.pipe(map((data) => labelsToFieldsTransformer.transformer(options, ctx)(data))),\n\n  transformer: (options: LabelsToFieldsOptions) => (data: DataFrame[]) => {\n    // Show each label as a field row\n    if (options.mode === LabelsToFieldsMode.Rows) {\n      return convertLabelsToRows(data, options.keepLabels);\n    }\n\n    const result: DataFrame[] = [];\n    const keepLabels = options.keepLabels?.length ? new Set(options.keepLabels) : undefined;\n\n    for (const frame of data) {\n      const newFields: Field[] = [];\n      const uniqueLabels: Record<string, Set<string>> = {};\n      for (const field of frame.fields) {\n        if (!field.labels) {\n          newFields.push(field);\n          continue;\n        }\n\n        const sansLabels = {\n          ...field,\n          config: {\n            ...field.config,\n            // we need to clear these for this transform as these can contain label names that we no longer want\n            displayName: undefined,\n            displayNameFromDS: undefined,\n          },\n          labels: undefined,\n        };\n        newFields.push(sansLabels);\n\n        for (const labelName of Object.keys(field.labels)) {\n          if (keepLabels && !keepLabels.has(labelName)) {\n            continue;\n          }\n\n          // if we should use this label as the value field name store it and skip adding this as a separate field\n          if (options.valueLabel === labelName) {\n            sansLabels.name = field.labels[labelName];\n            continue;\n          }\n\n          const uniqueValues = uniqueLabels[labelName] ?? (uniqueLabels[labelName] = new Set()); // (Safari 13.1 lacks ??= support)\n          uniqueValues.add(field.labels[labelName]);\n        }\n      }\n\n      for (const name in uniqueLabels) {\n        for (const value of uniqueLabels[name]) {\n          const values = new Array(frame.length).fill(value);\n          newFields.push({\n            name: name,\n            type: FieldType.string,\n            values: values,\n            config: {},\n          });\n        }\n      }\n\n      result.push({\n        ...frame,\n        fields: newFields,\n        length: frame.length,\n      });\n    }\n\n    return result;\n  },\n};\n\nfunction convertLabelsToRows(data: DataFrame[], keepLabels?: string[]): DataFrame[] {\n  const result: DataFrame[] = [];\n  for (const frame of data) {\n    for (const field of frame.fields) {\n      if (field.labels) {\n        const keys: string[] = [];\n        const vals: string[] = [];\n        if (keepLabels) {\n          for (const key of keepLabels) {\n            keys.push(key);\n            vals.push(field.labels[key]);\n          }\n        } else {\n          for (const [key, val] of Object.entries(field.labels)) {\n            keys.push(key);\n            vals.push(val);\n          }\n        }\n        if (vals.length) {\n          result.push({\n            ...frame,\n            name: getFieldDisplayName(field, frame, data),\n            fields: [\n              { name: 'label', type: FieldType.string, config: {}, values: keys },\n              { name: 'value', type: FieldType.string, config: {}, values: vals },\n            ],\n            length: vals.length,\n          });\n        }\n      }\n    }\n  }\n  return result;\n}\n"],"names":["LabelsToFieldsMode","DataTransformerID","map","FieldType","getFieldDisplayName"],"mappings":"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"}