{"version":3,"file":"processDataFrame.cjs","sources":["../../../src/dataframe/processDataFrame.ts"],"sourcesContent":["// Libraries\nimport { isArray, isBoolean, isNumber, isString } from 'lodash';\n\nimport { isDateTime } from '../datetime/moment_wrapper';\nimport { fieldIndexComparer } from '../field/fieldComparers';\nimport { getFieldDisplayName } from '../field/fieldState';\nimport { Column, LoadingState, TableData, TimeSeries, TimeSeriesValue } from '../types/data';\nimport {\n  DataFrame,\n  FieldType,\n  TIME_SERIES_TIME_FIELD_NAME,\n  TIME_SERIES_VALUE_FIELD_NAME,\n  Field,\n  DataFrameWithValue,\n  DataFrameDTO,\n  FieldDTO,\n  FieldConfig,\n} from '../types/dataFrame';\nimport { DataQueryResponseData } from '../types/datasource';\nimport { GraphSeriesXY, GraphSeriesValue } from '../types/graph';\nimport { PanelData } from '../types/panel';\n\nimport { arrayToDataFrame } from './ArrayDataFrame';\nimport { dataFrameFromJSON } from './DataFrameJSON';\n\nfunction convertTableToDataFrame(table: TableData): DataFrame {\n  const fields = table.columns.map((c) => {\n    // TODO: should be Column but type does not exists there so not sure whats up here.\n    const { text, type, ...disp } = c as Column & { type?: FieldType };\n    const values: unknown[] = [];\n    return {\n      name: text ?? c, // rename 'text' to the 'name' field\n      config: disp || {},\n      values,\n      type: type && Object.values(FieldType).includes(type) ? type : FieldType.other,\n    };\n  });\n\n  if (!isArray(table.rows)) {\n    throw new Error(`Expected table rows to be array, got ${typeof table.rows}.`);\n  }\n\n  for (const row of table.rows) {\n    for (let i = 0; i < fields.length; i++) {\n      fields[i].values.push(row[i]);\n    }\n  }\n\n  for (const f of fields) {\n    if (f.type === FieldType.other) {\n      const t = guessFieldTypeForField(f);\n      if (t) {\n        f.type = t;\n      }\n    }\n  }\n\n  return {\n    fields,\n    refId: table.refId,\n    meta: table.meta,\n    name: table.name,\n    length: table.rows.length,\n  };\n}\n\nfunction convertTimeSeriesToDataFrame(timeSeries: TimeSeries): DataFrame {\n  const times: number[] = [];\n  const values: TimeSeriesValue[] = [];\n\n  // Sometimes the points are sent as datapoints\n  const points = timeSeries.datapoints || (timeSeries as any).points;\n  for (const point of points) {\n    values.push(point[0]);\n    times.push(point[1] as number);\n  }\n\n  const fields = [\n    {\n      name: TIME_SERIES_TIME_FIELD_NAME,\n      type: FieldType.time,\n      config: {},\n      values: times,\n    },\n    {\n      name: TIME_SERIES_VALUE_FIELD_NAME,\n      type: FieldType.number,\n      config: {\n        unit: timeSeries.unit,\n      },\n      values: values,\n      labels: timeSeries.tags,\n    },\n  ];\n\n  if (timeSeries.title) {\n    (fields[1].config as FieldConfig).displayNameFromDS = timeSeries.title;\n  }\n\n  return {\n    name: timeSeries.target || (timeSeries as any).name,\n    refId: timeSeries.refId,\n    meta: timeSeries.meta,\n    fields,\n    length: values.length,\n  };\n}\n\n/**\n * This is added temporarily while we convert the LogsModel\n * to DataFrame.  See: https://github.com/grafana/grafana/issues/18528\n */\nfunction convertGraphSeriesToDataFrame(graphSeries: GraphSeriesXY): DataFrame {\n  const x: GraphSeriesValue[] = [];\n  const y: GraphSeriesValue[] = [];\n\n  for (let i = 0; i < graphSeries.data.length; i++) {\n    const row = graphSeries.data[i];\n    x.push(row[1]);\n    y.push(row[0]);\n  }\n\n  return {\n    name: graphSeries.label,\n    fields: [\n      {\n        name: graphSeries.label || TIME_SERIES_VALUE_FIELD_NAME,\n        type: FieldType.number,\n        config: {},\n        values: x,\n      },\n      {\n        name: TIME_SERIES_TIME_FIELD_NAME,\n        type: FieldType.time,\n        config: {\n          unit: 'dateTimeAsIso',\n        },\n        values: y,\n      },\n    ],\n    length: x.length,\n  };\n}\n\nfunction convertJSONDocumentDataToDataFrame(timeSeries: TimeSeries): DataFrame {\n  const fields: Field[] = [\n    {\n      name: timeSeries.target,\n      type: FieldType.other,\n      labels: timeSeries.tags,\n      config: {\n        unit: timeSeries.unit,\n        filterable: (timeSeries as any).filterable,\n      },\n      values: [],\n    },\n  ];\n\n  for (const point of timeSeries.datapoints) {\n    fields[0].values.push(point);\n  }\n\n  return {\n    name: timeSeries.target,\n    refId: timeSeries.target,\n    meta: { json: true },\n    fields,\n    length: timeSeries.datapoints.length,\n  };\n}\n\n// PapaParse Dynamic Typing regex:\n// https://github.com/mholt/PapaParse/blob/master/papaparse.js#L998\nconst NUMBER = /^\\s*(-?(\\d*\\.?\\d+|\\d+\\.?\\d*)(e[-+]?\\d+)?|NAN)\\s*$/i;\n\n/**\n * Given a name and value, this will pick a reasonable field type\n */\nexport function guessFieldTypeFromNameAndValue(name: string, v: unknown): FieldType {\n  if (name) {\n    name = name.toLowerCase();\n    if (name === 'date' || name === 'time') {\n      return FieldType.time;\n    }\n  }\n  return guessFieldTypeFromValue(v);\n}\n\n/**\n * Check the field type to see what the contents are\n */\nexport function getFieldTypeFromValue(v: unknown): FieldType {\n  if (v instanceof Date || isDateTime(v)) {\n    return FieldType.time;\n  }\n\n  if (isNumber(v)) {\n    return FieldType.number;\n  }\n\n  if (isString(v)) {\n    return FieldType.string;\n  }\n\n  if (isBoolean(v)) {\n    return FieldType.boolean;\n  }\n\n  return FieldType.other;\n}\n\n/**\n * Given a value this will guess the best column type\n *\n * NOTE: this is will try to see if string values can be mapped to other types (like number)\n */\nexport function guessFieldTypeFromValue(v: unknown): FieldType {\n  if (v instanceof Date || isDateTime(v)) {\n    return FieldType.time;\n  }\n\n  if (isNumber(v)) {\n    return FieldType.number;\n  }\n\n  if (isString(v)) {\n    if (NUMBER.test(v)) {\n      return FieldType.number;\n    }\n\n    if (v === 'true' || v === 'TRUE' || v === 'True' || v === 'false' || v === 'FALSE' || v === 'False') {\n      return FieldType.boolean;\n    }\n\n    return FieldType.string;\n  }\n\n  if (isBoolean(v)) {\n    return FieldType.boolean;\n  }\n\n  return FieldType.other;\n}\n\n/**\n * Looks at the data to guess the column type.  This ignores any existing setting\n */\nexport function guessFieldTypeForField(field: Field): FieldType | undefined {\n  // 1. Use the column name to guess\n  if (field.name) {\n    const name = field.name.toLowerCase();\n    if (name === 'date' || name === 'time') {\n      return FieldType.time;\n    }\n  }\n\n  // 2. Check the first non-null value\n  for (let i = 0; i < field.values.length; i++) {\n    const v = field.values[i];\n    if (v != null) {\n      return guessFieldTypeFromValue(v);\n    }\n  }\n\n  // Could not find anything\n  return undefined;\n}\n\n/**\n * @returns A copy of the series with the best guess for each field type.\n * If the series already has field types defined, they will be used, unless `guessDefined` is true.\n * @param series The DataFrame whose field's types should be guessed\n * @param guessDefined Whether to guess types of fields with already defined types\n */\nexport const guessFieldTypes = (series: DataFrame, guessDefined = false): DataFrame => {\n  for (const field of series.fields) {\n    if (!field.type || field.type === FieldType.other || guessDefined) {\n      // Something is missing a type, return a modified copy\n      return {\n        ...series,\n        fields: series.fields.map((field) => {\n          if (field.type && field.type !== FieldType.other && !guessDefined) {\n            return field;\n          }\n          // Calculate a reasonable schema value\n          return {\n            ...field,\n            type: guessFieldTypeForField(field) || FieldType.other,\n          };\n        }),\n      };\n    }\n  }\n  // No changes necessary\n  return series;\n};\n\nexport const isTableData = (data: unknown): data is DataFrame => Boolean(data && data.hasOwnProperty('columns'));\n\nexport const isDataFrame = (data: unknown): data is DataFrame => Boolean(data && data.hasOwnProperty('fields'));\n\nexport const isDataFrameWithValue = (data: unknown): data is DataFrameWithValue =>\n  Boolean(isDataFrame(data) && data.hasOwnProperty('value'));\n\n/**\n * Inspect any object and return the results as a DataFrame\n */\nexport function toDataFrame(data: any): DataFrame {\n  if ('fields' in data) {\n    // DataFrameDTO does not have length\n    if ('length' in data && data.fields[0]?.values?.get) {\n      return data;\n    }\n\n    // This will convert the array values into Vectors\n    return createDataFrame(data);\n  }\n\n  // Handle legacy docs/json type\n  if (data.hasOwnProperty('type') && data.type === 'docs') {\n    return convertJSONDocumentDataToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('datapoints') || data.hasOwnProperty('points')) {\n    return convertTimeSeriesToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('data')) {\n    if (data.hasOwnProperty('schema')) {\n      return dataFrameFromJSON(data);\n    }\n    return convertGraphSeriesToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('columns')) {\n    return convertTableToDataFrame(data);\n  }\n\n  if (Array.isArray(data)) {\n    return arrayToDataFrame(data);\n  }\n\n  console.warn('Can not convert', data);\n  throw new Error('Unsupported data format');\n}\n\nexport const toLegacyResponseData = (frame: DataFrame): TimeSeries | TableData => {\n  const { fields } = frame;\n\n  const rowCount = frame.length;\n  const rows: unknown[][] = [];\n\n  if (fields.length === 2) {\n    const { timeField, timeIndex } = getTimeField(frame);\n    if (timeField) {\n      const valueIndex = timeIndex === 0 ? 1 : 0;\n      const valueField = fields[valueIndex];\n      const timeField = fields[timeIndex!];\n\n      // Make sure it is [value,time]\n      for (let i = 0; i < rowCount; i++) {\n        rows.push([\n          valueField.values[i], // value\n          timeField.values[i], // time\n        ]);\n      }\n\n      return {\n        alias: frame.name,\n        target: getFieldDisplayName(valueField, frame),\n        datapoints: rows,\n        unit: fields[0].config ? fields[0].config.unit : undefined,\n        refId: frame.refId,\n        meta: frame.meta,\n      } as TimeSeries;\n    }\n  }\n\n  for (let i = 0; i < rowCount; i++) {\n    const row: unknown[] = [];\n    for (let j = 0; j < fields.length; j++) {\n      row.push(fields[j].values[i]);\n    }\n    rows.push(row);\n  }\n\n  if (frame.meta && frame.meta.json) {\n    return {\n      alias: fields[0].name || frame.name,\n      target: fields[0].name || frame.name,\n      datapoints: fields[0].values,\n      filterable: fields[0].config ? fields[0].config.filterable : undefined,\n      type: 'docs',\n    } as TimeSeries;\n  }\n\n  return {\n    columns: fields.map((f) => {\n      const { name, config } = f;\n      if (config) {\n        // keep unit etc\n        const { ...column } = config;\n        const result = column as Column;\n        result.text = name;\n        return result;\n      }\n      return { text: name };\n    }),\n    type: 'table',\n    refId: frame.refId,\n    meta: frame.meta,\n    rows,\n  };\n};\n\nexport function sortDataFrame(data: DataFrame, sortIndex?: number, reverse = false): DataFrame {\n  const field = data.fields[sortIndex!];\n  if (!field) {\n    return data;\n  }\n\n  // Natural order\n  const index: number[] = [];\n  for (let i = 0; i < data.length; i++) {\n    index.push(i);\n  }\n\n  const fieldComparer = fieldIndexComparer(field, reverse);\n  index.sort(fieldComparer);\n\n  return {\n    ...data,\n    fields: data.fields.map((field) => {\n      const newValues = Array.from({ length: field.values.length }, (_, i) => field.values[index[i]]);\n\n      const newField = {\n        ...field,\n        values: newValues,\n      };\n\n      // only add .nanos if it exists\n      const { nanos } = field;\n      if (nanos !== undefined) {\n        newField.nanos = Array.from({ length: nanos.length }, (_, i) => nanos[index[i]]);\n      }\n      return newField;\n    }),\n  };\n}\n\n/**\n * Returns a copy with all values reversed\n */\nexport function reverseDataFrame(data: DataFrame): DataFrame {\n  return {\n    ...data,\n    fields: data.fields.map((f) => {\n      const values = [...f.values];\n      values.reverse();\n\n      const newF = {\n        ...f,\n        values,\n      };\n\n      // only add .nanos if it exists\n      const { nanos } = f;\n      if (nanos !== undefined) {\n        const revNanos = [...nanos];\n        revNanos.reverse();\n        newF.nanos = revNanos;\n      }\n      return newF;\n    }),\n  };\n}\n\n/**\n * Wrapper to get an array from each field value\n */\nexport function getDataFrameRow(data: DataFrame, row: number): unknown[] {\n  const values: unknown[] = [];\n  for (const field of data.fields) {\n    values.push(field.values[row]);\n  }\n  return values;\n}\n\n/**\n * Returns a copy that does not include functions\n */\nexport function toDataFrameDTO(data: DataFrame): DataFrameDTO {\n  return toFilteredDataFrameDTO(data);\n}\n\nexport function toFilteredDataFrameDTO(data: DataFrame, fieldPredicate?: (f: Field) => boolean): DataFrameDTO {\n  const filteredFields = fieldPredicate ? data.fields.filter(fieldPredicate) : data.fields;\n  const fields: FieldDTO[] = filteredFields.map((f) => {\n    let values = f.values;\n    return {\n      name: f.name,\n      type: f.type,\n      config: f.config,\n      values,\n      labels: f.labels,\n    };\n  });\n\n  return {\n    fields,\n    refId: data.refId,\n    meta: data.meta,\n    name: data.name,\n  };\n}\n\nexport const getTimeField = (series: DataFrame): { timeField?: Field; timeIndex?: number } => {\n  for (let i = 0; i < series.fields.length; i++) {\n    if (series.fields[i].type === FieldType.time) {\n      return {\n        timeField: series.fields[i],\n        timeIndex: i,\n      };\n    }\n  }\n  return {};\n};\n\nfunction getProcessedDataFrame(data: DataQueryResponseData): DataFrame {\n  const dataFrame = guessFieldTypes(toDataFrame(data));\n\n  if (dataFrame.fields && dataFrame.fields.length) {\n    // clear out the cached info\n    for (const field of dataFrame.fields) {\n      field.state = null;\n    }\n  }\n\n  return dataFrame;\n}\n\n/**\n * Given data request results, will return data frames with field types set\n *\n * This is also used by PanelChrome for snapshot support\n */\nexport function getProcessedDataFrames(results?: DataQueryResponseData[]): DataFrame[] {\n  if (!results || !isArray(results)) {\n    return [];\n  }\n\n  return results.map((data) => getProcessedDataFrame(data));\n}\n\n/**\n * Will process the panel data frames and in case of loading state with no data, will return the last result data but with loading state\n * This is to have panels not flicker temporarily with \"no data\" while loading\n */\nexport function preProcessPanelData(data: PanelData, lastResult?: PanelData): PanelData {\n  const { series, annotations } = data;\n\n  //  for loading states with no data, use last result\n  if (data.state === LoadingState.Loading && series.length === 0) {\n    if (!lastResult) {\n      lastResult = data;\n    }\n\n    return {\n      ...lastResult,\n      state: LoadingState.Loading,\n      request: data.request,\n    };\n  }\n\n  // Make sure the data frames are properly formatted\n  const STARTTIME = performance.now();\n  const processedDataFrames = series.map((data) => getProcessedDataFrame(data));\n  const annotationsProcessed = getProcessedDataFrames(annotations);\n  const STOPTIME = performance.now();\n\n  return {\n    ...data,\n    series: processedDataFrames,\n    annotations: annotationsProcessed,\n    timings: { dataProcessingTime: STOPTIME - STARTTIME },\n  };\n}\n\nexport interface PartialDataFrame extends Omit<DataFrame, 'fields' | 'length'> {\n  fields: Array<Partial<Field>>;\n}\n\nexport function createDataFrame(input: PartialDataFrame): DataFrame {\n  let length = 0;\n  const fields = input.fields.map((p, idx) => {\n    const { state, ...field } = p;\n    if (!field.name) {\n      field.name = `Field ${idx + 1}`;\n    }\n    if (!field.config) {\n      field.config = {};\n    }\n    if (!field.values) {\n      field.values = new Array(length);\n    } else if (field.values.length > length) {\n      length = field.values.length;\n    }\n    if (!field.type) {\n      field.type = guessFieldTypeForField(field as Field) ?? FieldType.other;\n    }\n    return field as Field;\n  });\n\n  return {\n    ...input,\n    fields,\n    length,\n  };\n}\n"],"names":["FieldType","isArray","TIME_SERIES_TIME_FIELD_NAME","TIME_SERIES_VALUE_FIELD_NAME","isDateTime","isNumber","isString","isBoolean","field","dataFrameFromJSON","arrayToDataFrame","timeField","getFieldDisplayName","fieldIndexComparer","data","LoadingState"],"mappings":"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"}