{"version":3,"file":"calculateField.cjs","sources":["../../../../src/transformations/transformers/calculateField.ts"],"sourcesContent":["import { defaults } from 'lodash';\nimport { map } from 'rxjs/operators';\n\nimport { getTimeField } from '../../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { NullValueMode } from '../../types/data';\nimport { DataFrame, FieldType, Field } from '../../types/dataFrame';\nimport { DataTransformContext, DataTransformerInfo } from '../../types/transformations';\nimport { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators';\nimport { UnaryOperationID, unaryOperators } from '../../utils/unaryOperators';\nimport { doStandardCalcs, fieldReducers, ReducerID } from '../fieldReducer';\nimport { getFieldMatcher } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\n\nimport { ensureColumnsTransformer } from './ensureColumns';\nimport { DataTransformerID } from './ids';\nimport { noopTransformer } from './noop';\n\nexport enum CalculateFieldMode {\n  ReduceRow = 'reduceRow',\n  CumulativeFunctions = 'cumulativeFunctions',\n  WindowFunctions = 'windowFunctions',\n  BinaryOperation = 'binary',\n  UnaryOperation = 'unary',\n  Index = 'index',\n}\n\nexport enum WindowSizeMode {\n  Percentage = 'percentage',\n  Fixed = 'fixed',\n}\n\nexport enum WindowAlignment {\n  Trailing = 'trailing',\n  Centered = 'centered',\n}\n\nexport interface ReduceOptions {\n  include?: string[]; // Assume all fields\n  reducer: ReducerID;\n  nullValueMode?: NullValueMode;\n}\n\nexport interface CumulativeOptions {\n  field?: string;\n  reducer: ReducerID;\n}\n\nexport interface WindowOptions extends CumulativeOptions {\n  windowSize?: number;\n  windowSizeMode?: WindowSizeMode;\n  windowAlignment?: WindowAlignment;\n}\n\nexport interface UnaryOptions {\n  operator: UnaryOperationID;\n  fieldName: string;\n}\n\nexport interface BinaryOptions {\n  left: BinaryValue;\n  operator: BinaryOperationID;\n  right: BinaryValue;\n}\n\nexport interface BinaryValue {\n  fixed?: string;\n  matcher?: { id?: FieldMatcherID; options?: string };\n}\n\ninterface IndexOptions {\n  asPercentile: boolean;\n}\n\nconst defaultNumericVizOptions: ReduceOptions = {\n  reducer: ReducerID.sum,\n};\n\nexport const defaultWindowOptions: WindowOptions = {\n  reducer: ReducerID.mean,\n  windowAlignment: WindowAlignment.Trailing,\n  windowSizeMode: WindowSizeMode.Percentage,\n  windowSize: 0.1,\n};\n\nconst defaultBinaryOptions: BinaryOptions = {\n  left: { fixed: '' },\n  operator: BinaryOperationID.Add,\n  right: { fixed: '' },\n};\n\nconst defaultUnaryOptions: UnaryOptions = {\n  operator: UnaryOperationID.Abs,\n  fieldName: '',\n};\n\nexport interface CalculateFieldTransformerOptions {\n  // True/False or auto\n  timeSeries?: boolean;\n  mode: CalculateFieldMode; // defaults to 'reduce'\n\n  // Only one should be filled\n  reduce?: ReduceOptions;\n  window?: WindowOptions;\n  cumulative?: CumulativeOptions;\n  binary?: BinaryOptions;\n  unary?: UnaryOptions;\n  index?: IndexOptions;\n\n  // Remove other fields\n  replaceFields?: boolean;\n\n  // Output field properties\n  alias?: string; // The output field name\n  // TODO: config?: FieldConfig; or maybe field overrides? since the UI exists\n}\n\ntype ValuesCreator = (data: DataFrame) => unknown[] | undefined;\n\nexport const calculateFieldTransformer: DataTransformerInfo<CalculateFieldTransformerOptions> = {\n  id: DataTransformerID.calculateField,\n  name: 'Add field from calculation',\n  description: 'Use the row values to calculate a new field',\n  defaultOptions: {\n    mode: CalculateFieldMode.ReduceRow,\n    reduce: {\n      reducer: ReducerID.sum,\n    },\n  },\n  operator: (options, ctx) => (outerSource) => {\n    const mode = options.mode ?? CalculateFieldMode.ReduceRow;\n\n    const asTimeSeries = options.timeSeries !== false;\n\n    const right = options.binary?.right;\n    const rightVal = typeof right === 'string' ? right : typeof right === 'object' ? right.fixed : undefined;\n    const isBinaryFixed = mode === CalculateFieldMode.BinaryOperation && !Number.isNaN(Number(rightVal));\n\n    const needsSingleFrame = asTimeSeries && !isBinaryFixed;\n\n    const operator = needsSingleFrame\n      ? ensureColumnsTransformer.operator(null, ctx)\n      : noopTransformer.operator({}, ctx);\n\n    return outerSource.pipe(\n      operator,\n      map((data) => {\n        let creator: ValuesCreator | undefined = undefined;\n\n        switch (mode) {\n          case CalculateFieldMode.ReduceRow:\n            creator = getReduceRowCreator(defaults(options.reduce, defaultNumericVizOptions), data);\n            break;\n          case CalculateFieldMode.CumulativeFunctions:\n            creator = getCumulativeCreator(defaults(options.cumulative, defaultNumericVizOptions), data);\n            break;\n          case CalculateFieldMode.WindowFunctions:\n            creator = getWindowCreator(defaults(options.window, defaultWindowOptions), data);\n            break;\n          case CalculateFieldMode.UnaryOperation:\n            creator = getUnaryCreator(defaults(options.unary, defaultUnaryOptions), data);\n            break;\n          case CalculateFieldMode.BinaryOperation:\n            const fieldNames: string[] = [];\n            data.map((frame) => {\n              frame.fields.map((field) => {\n                fieldNames.push(field.name);\n              });\n            });\n            const binaryOptions = {\n              left: checkBinaryValueType(options.binary?.left ?? '', fieldNames),\n              operator: options.binary?.operator ?? defaultBinaryOptions.operator,\n              right: checkBinaryValueType(options.binary?.right ?? '', fieldNames),\n            };\n            options.binary = binaryOptions;\n            if (binaryOptions.left?.matcher?.id && binaryOptions.left?.matcher.id === FieldMatcherID.byType) {\n              const fieldType = binaryOptions.left.matcher.options;\n              const operator = binaryOperators.getIfExists(binaryOptions.operator);\n              const outFrames = data.map((frame) => {\n                const { timeField } = getTimeField(frame);\n                const newFields: Field[] = [];\n                let didAddNewFields = false;\n                if (timeField && options.timeSeries !== false) {\n                  newFields.push(timeField);\n                }\n                // For each field of type match, apply operator\n                frame.fields.map((field, index) => {\n                  if (!options.replaceFields && !newFields.includes(field)) {\n                    newFields.push(field);\n                  }\n                  if (field.type === fieldType) {\n                    const left = field.values;\n                    // TODO consolidate common creator logic\n                    const right = findFieldValuesWithNameOrConstant(\n                      frame,\n                      binaryOptions.right ?? defaultBinaryOptions.right,\n                      data,\n                      ctx\n                    );\n                    if (!left || !right || !operator) {\n                      return undefined;\n                    }\n\n                    const arr = new Array(left.length);\n                    for (let i = 0; i < arr.length; i++) {\n                      arr[i] = operator.operation(left[i], right[i]);\n                    }\n                    const newField = {\n                      ...field,\n                      name: `${field.name} ${options.binary?.operator ?? ''} ${options.binary?.right.matcher?.options ?? options.binary?.right.fixed}`,\n                      values: arr,\n                    };\n                    delete newField.state;\n                    newFields.push(newField);\n                    didAddNewFields = true;\n                  }\n                });\n\n                if (options.replaceFields && !didAddNewFields) {\n                  return undefined;\n                }\n\n                return { ...frame, fields: newFields };\n              });\n\n              return outFrames.filter((frame) => frame != null);\n            } else {\n              creator = getBinaryCreator(defaults(binaryOptions, defaultBinaryOptions), data, ctx);\n            }\n            break;\n          case CalculateFieldMode.Index:\n            return data.map((frame) => {\n              const indexArr = [...Array(frame.length).keys()];\n\n              if (options.index?.asPercentile) {\n                for (let i = 0; i < indexArr.length; i++) {\n                  indexArr[i] = indexArr[i] / indexArr.length;\n                }\n              }\n\n              const f = {\n                name: options.alias ?? 'Row',\n                type: FieldType.number,\n                values: indexArr,\n                config: options.index?.asPercentile ? { unit: 'percentunit' } : {},\n              };\n              return {\n                ...frame,\n                fields: options.replaceFields ? [f] : [...frame.fields, f],\n              };\n            });\n        }\n\n        // Nothing configured\n        if (!creator) {\n          return data;\n        }\n\n        const outFrames = data.map((frame) => {\n          // delegate field creation to the specific function\n          const values = creator!(frame);\n          if (!values) {\n            // if nothing was done to frame, omit it when replacing fields\n            if (options.replaceFields) {\n              return undefined;\n            }\n            return frame;\n          }\n\n          const field: Field = {\n            name: getNameFromOptions(options),\n            type: FieldType.number,\n            config: {},\n            values,\n          };\n\n          if (options.alias?.length) {\n            // this prevents downstream auto-renames when there is an explicit alias\n            field.config.displayName = options.alias;\n          }\n\n          let fields: Field[] = [];\n\n          // Replace all fields with the single field\n          if (options.replaceFields) {\n            const { timeField } = getTimeField(frame);\n            if (timeField && options.timeSeries !== false) {\n              fields = [timeField, field];\n            } else {\n              fields = [field];\n            }\n          } else {\n            fields = [...frame.fields, field];\n          }\n          return {\n            ...frame,\n            fields,\n          };\n        });\n        return outFrames.filter((frame) => frame != null);\n      })\n    );\n  },\n};\n\nfunction getWindowCreator(options: WindowOptions, allFrames: DataFrame[]): ValuesCreator {\n  if (options.windowSize! <= 0) {\n    throw new Error('Add field from calculation transformation - Window size must be larger than 0');\n  }\n\n  let matcher = getFieldMatcher({\n    id: FieldMatcherID.numeric,\n  });\n\n  if (options.field) {\n    matcher = getFieldMatcher({\n      id: FieldMatcherID.byNames,\n      options: {\n        names: [options.field],\n      },\n    });\n  }\n\n  return (frame: DataFrame) => {\n    const window = Math.ceil(\n      options.windowSize! * (options.windowSizeMode === WindowSizeMode.Percentage ? frame.length : 1)\n    );\n\n    // Find the columns that should be examined\n    let selectedField: Field | null = null;\n    for (const field of frame.fields) {\n      if (matcher(field, frame, allFrames)) {\n        selectedField = field;\n        break;\n      }\n    }\n\n    if (!selectedField) {\n      return;\n    }\n\n    if (![ReducerID.mean, ReducerID.stdDev, ReducerID.variance].includes(options.reducer)) {\n      throw new Error(`Add field from calculation transformation - Unsupported reducer: ${options.reducer}`);\n    }\n\n    if (options.windowAlignment === WindowAlignment.Centered) {\n      return getCenteredWindowValues(frame, options.reducer, selectedField, window);\n    } else {\n      return getTrailingWindowValues(frame, options.reducer, selectedField, window);\n    }\n  };\n}\n\nfunction getTrailingWindowValues(frame: DataFrame, reducer: ReducerID, selectedField: Field, window: number) {\n  const vals: number[] = [];\n  let sum = 0;\n  let count = 0;\n  for (let i = 0; i < frame.length; i++) {\n    if (reducer === ReducerID.mean) {\n      const currentValue = selectedField.values[i];\n      if (currentValue !== null && currentValue !== undefined) {\n        count++;\n        sum += currentValue;\n\n        if (i > window - 1) {\n          const value = selectedField.values[i - window];\n          if (value != null) {\n            sum -= value;\n            count--;\n          }\n        }\n      }\n      vals.push(count === 0 ? 0 : sum / count);\n    } else if (reducer === ReducerID.variance) {\n      const start = Math.max(0, i - window + 1);\n      const end = i + 1;\n      vals.push(calculateVariance(selectedField.values.slice(start, end)));\n    } else if (reducer === ReducerID.stdDev) {\n      const start = Math.max(0, i - window + 1);\n      const end = i + 1;\n      vals.push(calculateStdDev(selectedField.values.slice(start, end)));\n    }\n  }\n  return vals;\n}\n\nfunction getCenteredWindowValues(frame: DataFrame, reducer: ReducerID, selectedField: Field, window: number) {\n  const vals: number[] = [];\n  let sum = 0;\n  let count = 0;\n  // Current value (i) is included in the leading part of the window. Which means if the window size is odd,\n  // the leading part of the window will be larger than the trailing part.\n  const leadingPartOfWindow = Math.ceil(window / 2) - 1;\n  const trailingPartOfWindow = Math.floor(window / 2);\n  for (let i = 0; i < frame.length; i++) {\n    const first = i - trailingPartOfWindow;\n    const last = i + leadingPartOfWindow;\n    if (reducer === ReducerID.mean) {\n      if (i === 0) {\n        // We're at the start and need to prime the leading part of the window\n        for (let x = 0; x < leadingPartOfWindow + 1 && x < selectedField.values.length; x++) {\n          if (selectedField.values[x] != null) {\n            sum += selectedField.values[x];\n            count++;\n          }\n        }\n      } else {\n        if (last < selectedField.values.length) {\n          // Last is inside the data and should be added.\n          if (selectedField.values[last] != null) {\n            sum += selectedField.values[last];\n            count++;\n          }\n        }\n        if (first > 0) {\n          // Remove values that have fallen outside of the window, if the start of the window isn't outside of the data.\n          if (selectedField.values[first - 1] != null) {\n            sum -= selectedField.values[first - 1];\n            count--;\n          }\n        }\n      }\n      vals.push(count === 0 ? 0 : sum / count);\n    } else if (reducer === ReducerID.variance) {\n      const windowVals = selectedField.values.slice(\n        Math.max(0, first),\n        Math.min(last + 1, selectedField.values.length)\n      );\n      vals.push(calculateVariance(windowVals));\n    } else if (reducer === ReducerID.stdDev) {\n      const windowVals = selectedField.values.slice(\n        Math.max(0, first),\n        Math.min(last + 1, selectedField.values.length)\n      );\n      vals.push(calculateStdDev(windowVals));\n    }\n  }\n  return vals;\n}\n\nfunction calculateVariance(vals: number[]): number {\n  if (vals.length < 1) {\n    return 0;\n  }\n  let squareSum = 0;\n  let runningMean = 0;\n  let nonNullCount = 0;\n  for (let i = 0; i < vals.length; i++) {\n    const currentValue = vals[i];\n    if (currentValue != null) {\n      nonNullCount++;\n      let _oldMean = runningMean;\n      runningMean += (currentValue - _oldMean) / nonNullCount;\n      squareSum += (currentValue - _oldMean) * (currentValue - runningMean);\n    }\n  }\n  if (nonNullCount === 0) {\n    return 0;\n  }\n  const variance = squareSum / nonNullCount;\n  return variance;\n}\n\nfunction calculateStdDev(vals: number[]): number {\n  return Math.sqrt(calculateVariance(vals));\n}\n\nfunction getCumulativeCreator(options: CumulativeOptions, allFrames: DataFrame[]): ValuesCreator {\n  let matcher = getFieldMatcher({\n    id: FieldMatcherID.numeric,\n  });\n\n  if (options.field) {\n    matcher = getFieldMatcher({\n      id: FieldMatcherID.byNames,\n      options: {\n        names: [options.field],\n      },\n    });\n  }\n\n  if (![ReducerID.mean, ReducerID.sum].includes(options.reducer)) {\n    throw new Error(`Add field from calculation transformation - Unsupported reducer: ${options.reducer}`);\n  }\n\n  return (frame: DataFrame) => {\n    // Find the columns that should be examined\n    let selectedField: Field | null = null;\n    for (const field of frame.fields) {\n      if (matcher(field, frame, allFrames)) {\n        selectedField = field;\n        break;\n      }\n    }\n\n    if (!selectedField) {\n      return;\n    }\n\n    const vals: number[] = [];\n\n    let total = 0;\n    for (let i = 0; i < frame.length; i++) {\n      total += selectedField.values[i] ?? 0;\n      if (options.reducer === ReducerID.sum) {\n        vals.push(total);\n      } else if (options.reducer === ReducerID.mean) {\n        vals.push(total / (i + 1));\n      }\n    }\n\n    return vals;\n  };\n}\n\nfunction getReduceRowCreator(options: ReduceOptions, allFrames: DataFrame[]): ValuesCreator {\n  let matcher = getFieldMatcher({\n    id: FieldMatcherID.numeric,\n  });\n\n  if (options.include && options.include.length) {\n    matcher = getFieldMatcher({\n      id: FieldMatcherID.byNames,\n      options: {\n        names: options.include,\n      },\n    });\n  }\n\n  const info = fieldReducers.get(options.reducer);\n\n  if (!info) {\n    throw new Error(`Unknown reducer: ${options.reducer}`);\n  }\n\n  const reducer = info.reduce ?? doStandardCalcs;\n  const ignoreNulls = options.nullValueMode === NullValueMode.Ignore;\n  const nullAsZero = options.nullValueMode === NullValueMode.AsZero;\n\n  return (frame: DataFrame) => {\n    // Find the columns that should be examined\n    const columns = [];\n    for (const field of frame.fields) {\n      if (matcher(field, frame, allFrames)) {\n        columns.push(field.values);\n      }\n    }\n\n    // Prepare a \"fake\" field for the row\n    const size = columns.length;\n    const row: Field = {\n      name: 'temp',\n      values: new Array(size),\n      type: FieldType.number,\n      config: {},\n    };\n    const vals: number[] = [];\n\n    for (let i = 0; i < frame.length; i++) {\n      for (let j = 0; j < size; j++) {\n        row.values[j] = columns[j][i];\n      }\n\n      vals.push(reducer(row, ignoreNulls, nullAsZero)[options.reducer]);\n    }\n\n    return vals;\n  };\n}\n\nfunction findFieldValuesWithNameOrConstant(\n  frame: DataFrame,\n  value: BinaryValue,\n  allFrames: DataFrame[],\n  ctx: DataTransformContext\n): number[] | undefined {\n  if (!value) {\n    return undefined;\n  }\n\n  if (value.matcher && value.matcher.id === FieldMatcherID.byName) {\n    const name = value.matcher.options ?? '';\n\n    for (const f of frame.fields) {\n      if (name === getFieldDisplayName(f, frame, allFrames)) {\n        if (f.type === FieldType.boolean) {\n          return f.values.map((v) => (v ? 1 : 0));\n        }\n        return f.values;\n      }\n    }\n  }\n\n  const v = parseFloat(value.fixed ?? value.matcher?.options ?? '');\n  if (!isNaN(v)) {\n    return new Array(frame.length).fill(v);\n  }\n\n  return undefined;\n}\n\nfunction getBinaryCreator(options: BinaryOptions, allFrames: DataFrame[], ctx: DataTransformContext): ValuesCreator {\n  const operator = binaryOperators.getIfExists(options.operator);\n\n  return (frame: DataFrame) => {\n    const left = findFieldValuesWithNameOrConstant(frame, options.left, allFrames, ctx);\n    const right = findFieldValuesWithNameOrConstant(frame, options.right, allFrames, ctx);\n    if (!left || !right || !operator) {\n      return undefined;\n    }\n\n    const arr = new Array(left.length);\n    for (let i = 0; i < arr.length; i++) {\n      arr[i] = operator.operation(left[i], right[i]);\n    }\n    return arr;\n  };\n}\n\nexport function checkBinaryValueType(value: BinaryValue | string, names: string[]): BinaryValue {\n  // Support old binary value structure\n  if (typeof value === 'string') {\n    if (isNaN(Number(value))) {\n      return { matcher: { id: FieldMatcherID.byName, options: value } };\n    } else {\n      // If it's a number, check if matches name, otherwise store as fixed number value\n      if (names.includes(value)) {\n        return { matcher: { id: FieldMatcherID.byName, options: value } };\n      } else {\n        return { fixed: value };\n      }\n    }\n  }\n  // Pass through new BinaryValue structure\n  return value;\n}\n\nfunction getUnaryCreator(options: UnaryOptions, allFrames: DataFrame[]): ValuesCreator {\n  const operator = unaryOperators.getIfExists(options.operator);\n\n  return (frame: DataFrame) => {\n    let value: number[] = [];\n\n    for (const f of frame.fields) {\n      if (options.fieldName === getFieldDisplayName(f, frame, allFrames) && f.type === FieldType.number) {\n        value = f.values;\n      }\n    }\n\n    if (!value.length || !operator) {\n      return undefined;\n    }\n\n    const arr = new Array(value.length);\n\n    let sum = 0;\n\n    if (options.operator === UnaryOperationID.Percent) {\n      for (let i = 0; i < value.length; i++) {\n        if (Number.isFinite(value[i])) {\n          sum += value[i];\n        }\n      }\n    }\n\n    for (let i = 0; i < arr.length; i++) {\n      arr[i] = operator.operation(value[i], sum);\n    }\n\n    return arr;\n  };\n}\n\nexport function getNameFromOptions(options: CalculateFieldTransformerOptions) {\n  if (options.alias?.length) {\n    return options.alias;\n  }\n\n  switch (options.mode) {\n    case CalculateFieldMode.CumulativeFunctions: {\n      const { cumulative } = options;\n      return `cumulative ${cumulative?.reducer ?? ''}${cumulative?.field ? `(${cumulative.field})` : ''}`;\n    }\n    case CalculateFieldMode.WindowFunctions: {\n      const { window } = options;\n      return `${window?.windowAlignment ?? ''} moving ${window?.reducer ?? ''}${\n        window?.field ? `(${window.field})` : ''\n      }`;\n    }\n    case CalculateFieldMode.UnaryOperation: {\n      const { unary } = options;\n      return `${unary?.operator ?? ''}${unary?.fieldName ? `(${unary.fieldName})` : ''}`;\n    }\n    case CalculateFieldMode.BinaryOperation: {\n      const { binary } = options;\n      const left = binary?.left?.matcher?.options ?? binary?.left?.fixed ?? '';\n      const right = binary?.right?.matcher?.options ?? binary?.right?.fixed ?? '';\n      // binary calculations with variables will be interpolated on the visualization but we don't want to do that here, so just give a blank placeholder\n      if (/\\$/.test(left) || /\\$/.test(right)) {\n        return '';\n      }\n\n      const operator = binary?.operator ?? BinaryOperationID.Add;\n      return left && right ? `${left} ${operator} ${right}` : '';\n    }\n    case CalculateFieldMode.ReduceRow:\n      {\n        const r = fieldReducers.getIfExists(options.reduce?.reducer);\n        if (r) {\n          return r.name;\n        }\n      }\n      break;\n    case CalculateFieldMode.Index:\n      return 'Row';\n  }\n\n  return 'math';\n}\n"],"names":["CalculateFieldMode","WindowSizeMode","WindowAlignment","ReducerID","BinaryOperationID","UnaryOperationID","DataTransformerID","ensureColumnsTransformer","noopTransformer","map","_a","_b","defaults","FieldMatcherID","operator","binaryOperators","outFrames","getTimeField","_c","_d","_e","_f","_g","right","FieldType","getFieldMatcher","fieldReducers","doStandardCalcs","NullValueMode","getFieldDisplayName","v","unaryOperators"],"mappings":"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"}