{"version":3,"file":"concat.mjs","sources":["../../../../src/transformations/transformers/concat.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nimport { DataFrame, Field, TIME_SERIES_VALUE_FIELD_NAME } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\n\nexport enum ConcatenateFrameNameMode {\n  /**\n   * Ignore the source frame name when moving to the destination\n   */\n  Drop = 'drop',\n\n  /**\n   * Copy the source frame name to the destination field.  The final field will contain\n   * both the frame and field name\n   */\n  FieldName = 'field',\n\n  /**\n   * Copy the source frame name to a label on the field.  The label key is controlled\n   * by frameNameLabel\n   */\n  Label = 'label',\n}\n\nexport interface ConcatenateTransformerOptions {\n  frameNameMode?: ConcatenateFrameNameMode;\n  frameNameLabel?: string;\n}\n\nexport const concatenateTransformer: DataTransformerInfo<ConcatenateTransformerOptions> = {\n  id: DataTransformerID.concatenate,\n  name: 'Concatenate fields',\n  description:\n    'Combine all fields into a single frame.  Values will be appended with undefined values if not the same length.',\n  defaultOptions: {\n    frameNameMode: ConcatenateFrameNameMode.FieldName,\n    frameNameLabel: 'frame',\n  },\n  operator: (options) => (source) =>\n    source.pipe(\n      map((dataFrames) => {\n        if (!Array.isArray(dataFrames) || dataFrames.length < 2) {\n          return dataFrames; // noop with single frame\n        }\n        return [concatenateFields(dataFrames, options)];\n      })\n    ),\n};\n\n/**\n * @internal only exported for tests\n */\nexport function concatenateFields(data: DataFrame[], opts: ConcatenateTransformerOptions): DataFrame {\n  let sameLength = true;\n  let maxLength = data[0].length;\n  const frameNameLabel = opts.frameNameLabel ?? 'frame';\n  let fields: Field[] = [];\n\n  for (const frame of data) {\n    if (maxLength !== frame.length) {\n      sameLength = false;\n      maxLength = Math.max(maxLength, frame.length);\n    }\n\n    for (const f of frame.fields) {\n      const copy = { ...f };\n      copy.state = undefined;\n      if (frame.name) {\n        if (opts.frameNameMode === ConcatenateFrameNameMode.Drop) {\n          // nothing -- skip the name\n        } else if (opts.frameNameMode === ConcatenateFrameNameMode.Label) {\n          copy.labels = { ...f.labels };\n          copy.labels[frameNameLabel] = frame.name;\n        } else if (!copy.name || copy.name === TIME_SERIES_VALUE_FIELD_NAME) {\n          copy.name = frame.name;\n        } else {\n          copy.name = `${frame.name} · ${f.name}`;\n        }\n      }\n      fields.push(copy);\n    }\n  }\n\n  // Make sure all fields have the same length\n  if (!sameLength) {\n    fields = fields.map((f) => {\n      if (f.values.length === maxLength) {\n        return f;\n      }\n      const values = f.values.slice();\n      values.length = maxLength;\n      return {\n        ...f,\n        values: values,\n      };\n    });\n  }\n\n  return {\n    fields,\n    length: maxLength,\n  };\n}\n"],"names":["ConcatenateFrameNameMode"],"mappings":"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"}