{"version":3,"file":"transpose.mjs","sources":["../../../../src/transformations/transformers/transpose.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nimport { cacheFieldDisplayNames } from '../../field/fieldState';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { DataTransformerInfo, SpecialValue } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\nimport { getSpecialValue } from './utils';\n\nexport interface TransposeTransformerOptions {\n  firstFieldName?: string;\n  restFieldsName?: string;\n  emptyValue?: SpecialValue;\n}\n\nexport const transposeTransformer: DataTransformerInfo<TransposeTransformerOptions> = {\n  id: DataTransformerID.transpose,\n  name: 'Transpose',\n  description: 'Transpose the data frame',\n  defaultOptions: {},\n\n  operator: (options) => (source) =>\n    source.pipe(\n      map((data) => {\n        if (data.length === 0) {\n          return data;\n        }\n        return transposeDataFrame(options, data);\n      })\n    ),\n};\n\nfunction transposeDataFrame(options: TransposeTransformerOptions, data: DataFrame[]): DataFrame[] {\n  cacheFieldDisplayNames(data);\n  const emptyValue = options.emptyValue ?? SpecialValue.Empty;\n\n  return data.map((frame) => {\n    const firstField = frame.fields[0];\n    const firstName = !options.firstFieldName ? 'Field' : options.firstFieldName;\n    const restName = !options.restFieldsName ? 'Value' : options.restFieldsName;\n    const useFirstFieldAsHeaders =\n      firstField.type === FieldType.string || firstField.type === FieldType.time || firstField.type === FieldType.enum;\n    const headers = useFirstFieldAsHeaders\n      ? [firstName, ...fieldValuesAsStrings(firstField, firstField.values, emptyValue)]\n      : [firstName, ...firstField.values.map((_, i) => restName)];\n    const rows = useFirstFieldAsHeaders\n      ? frame.fields\n          .map((field) => {\n            return field.state?.displayName ?? field.name;\n          })\n          .slice(1)\n      : frame.fields.map((field) => field.state?.displayName ?? field.name);\n    const fieldType = determineFieldType(\n      useFirstFieldAsHeaders\n        ? frame.fields.map((field) => field.type).slice(1)\n        : frame.fields.map((field) => field.type)\n    );\n\n    const newFields = headers.map((fieldName, index) => {\n      if (index === 0) {\n        return {\n          name: firstName,\n          type: FieldType.string,\n          config: {},\n          values: rows,\n        };\n      }\n\n      const values = frame.fields.map((field) => {\n        if (fieldType === FieldType.string) {\n          return fieldValuesAsStrings(field, [field.values[index - 1]], emptyValue)[0];\n        }\n        return field.values[index - 1];\n      });\n\n      const labelName = useFirstFieldAsHeaders ? firstField.name : 'row';\n      const labelValue = useFirstFieldAsHeaders ? fieldName : index;\n\n      return {\n        name: useFirstFieldAsHeaders ? restName : fieldName,\n        labels: {\n          [labelName]: labelValue,\n        },\n        type: fieldType,\n        config: {},\n        values: useFirstFieldAsHeaders ? values.slice(1) : values,\n      };\n    });\n    return {\n      ...frame,\n      fields: newFields,\n      length: Math.max(...newFields.map((field) => field.values.length)),\n      refId: `${DataTransformerID.transpose}-${frame.refId}`,\n    };\n  });\n}\n\nfunction determineFieldType(fieldTypes: FieldType[]): FieldType {\n  const uniqueFieldTypes = new Set(fieldTypes);\n  return uniqueFieldTypes.size === 1 ? [...uniqueFieldTypes][0] : FieldType.string;\n}\n\nfunction fieldValuesAsStrings(field: Field, values: unknown[], emptyValue: SpecialValue) {\n  switch (field.type) {\n    case FieldType.time:\n    case FieldType.number:\n    case FieldType.boolean:\n    case FieldType.string:\n      return values.map((v) => (v != null ? `${v}` : getSpecialValue(emptyValue)));\n    case FieldType.enum:\n      // @ts-ignore\n      return values.map((v) => field.config.type!.enum!.text![v] ?? getSpecialValue(emptyValue));\n    default:\n      return values.map((v) => (v != null ? JSON.stringify(v) : getSpecialValue(emptyValue)));\n  }\n}\n"],"names":["_a"],"mappings":"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"}