{"version":3,"file":"operationUtils.cjs","sources":["../../../src/querybuilder/operationUtils.ts"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/operationUtils.ts\nimport { capitalize } from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { utf8Support } from '../utf8_support';\n\nimport {\n  type QueryBuilderLabelFilter,\n  type QueryBuilderOperation,\n  type QueryBuilderOperationDef,\n  type QueryBuilderOperationParamDef,\n  type QueryBuilderOperationParamValue,\n  type QueryWithOperations,\n} from './shared/types';\nimport { PromVisualQueryOperationCategory } from './types';\n\nexport function functionRendererLeft(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n  const params = renderParams(model, def, innerExpr);\n  const str = model.id + '(';\n\n  if (innerExpr) {\n    params.push(innerExpr);\n  }\n\n  return str + params.join(', ') + ')';\n}\n\nexport function functionRendererRight(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n  const params = renderParams(model, def, innerExpr);\n  const str = model.id + '(';\n\n  if (innerExpr) {\n    params.unshift(innerExpr);\n  }\n\n  return str + params.join(', ') + ')';\n}\n\nfunction rangeRendererWithParams(\n  model: QueryBuilderOperation,\n  def: QueryBuilderOperationDef,\n  innerExpr: string,\n  renderLeft: boolean\n) {\n  if (def.params.length < 2) {\n    throw `Cannot render a function with params of length [${def.params.length}]`;\n  }\n\n  let rangeVector = (model.params ?? [])[0] ?? '5m';\n\n  // Next frame the remaining parameters, but get rid of the first one because it's used to move the\n  // instant vector into a range vector.\n  const params = renderParams(\n    {\n      ...model,\n      params: model.params.slice(1),\n    },\n    {\n      ...def,\n      params: def.params.slice(1),\n      defaultParams: def.defaultParams.slice(1),\n    },\n    innerExpr\n  );\n\n  const str = model.id + '(';\n\n  // Depending on the renderLeft variable, render parameters to the left or right\n  // renderLeft === true (renderLeft) => (param1, param2, rangeVector[...])\n  // renderLeft === false (renderRight) => (rangeVector[...], param1, param2)\n  if (innerExpr) {\n    renderLeft ? params.push(`${innerExpr}[${rangeVector}]`) : params.unshift(`${innerExpr}[${rangeVector}]`);\n  }\n\n  // stick everything together\n  return str + params.join(', ') + ')';\n}\n\nexport function rangeRendererRightWithParams(\n  model: QueryBuilderOperation,\n  def: QueryBuilderOperationDef,\n  innerExpr: string\n) {\n  return rangeRendererWithParams(model, def, innerExpr, false);\n}\n\nexport function rangeRendererLeftWithParams(\n  model: QueryBuilderOperation,\n  def: QueryBuilderOperationDef,\n  innerExpr: string\n) {\n  return rangeRendererWithParams(model, def, innerExpr, true);\n}\n\nfunction renderParams(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n  return (model.params ?? []).map((value, index) => {\n    const paramDef = def.params[index];\n    if (paramDef?.type === 'string') {\n      return `\"${value}\"`;\n    }\n\n    return value;\n  });\n}\n\nexport function defaultAddOperationHandler<T extends QueryWithOperations>(def: QueryBuilderOperationDef, query: T) {\n  const newOperation: QueryBuilderOperation = {\n    id: def.id,\n    params: def.defaultParams,\n  };\n\n  return {\n    ...query,\n    operations: [...query.operations, newOperation],\n  };\n}\n\nexport function getPromOperationDisplayName(funcName: string) {\n  return capitalize(funcName.replace(/_/g, ' '));\n}\n\nexport function getRangeVectorParamDef(withRateInterval = false): QueryBuilderOperationParamDef {\n  /* eslint-disable @grafana/i18n/no-untranslated-strings */\n  const options: Array<SelectableValue<string>> = [\n    {\n      label: '$__interval',\n      value: '$__interval',\n      // tooltip: 'Dynamic interval based on max data points, scrape and min interval',\n    },\n    { label: '1m', value: '1m' },\n    { label: '5m', value: '5m' },\n    { label: '10m', value: '10m' },\n    { label: '1h', value: '1h' },\n    { label: '24h', value: '24h' },\n  ];\n\n  if (withRateInterval) {\n    options.unshift({\n      label: '$__rate_interval',\n      value: '$__rate_interval',\n      // tooltip: 'Always above 4x scrape interval',\n    });\n  }\n  /* eslint-enable @grafana/i18n/no-untranslated-strings */\n\n  const param: QueryBuilderOperationParamDef = {\n    name: 'Range',\n    type: 'string',\n    options,\n  };\n\n  return param;\n}\n\nexport function createAggregationOperation(\n  name: string,\n  overrides: Partial<QueryBuilderOperationDef> = {}\n): QueryBuilderOperationDef[] {\n  const operations: QueryBuilderOperationDef[] = [\n    {\n      id: name,\n      name: getPromOperationDisplayName(name),\n      params: [\n        {\n          name: 'By label',\n          type: 'string',\n          restParam: true,\n          optional: true,\n        },\n      ],\n      defaultParams: [],\n      alternativesKey: 'plain aggregations',\n      category: PromVisualQueryOperationCategory.Aggregations,\n      renderer: functionRendererLeft,\n      paramChangedHandler: getOnLabelAddedHandler(`__${name}_by`),\n      explainHandler: getAggregationExplainer(name, ''),\n      addOperationHandler: defaultAddOperationHandler,\n      ...overrides,\n    },\n    {\n      id: `__${name}_by`,\n      name: `${getPromOperationDisplayName(name)} by`,\n      params: [\n        {\n          name: 'Label',\n          type: 'string',\n          restParam: true,\n          optional: true,\n          editor: 'LabelParamEditor',\n        },\n      ],\n      defaultParams: [''],\n      alternativesKey: 'aggregations by',\n      category: PromVisualQueryOperationCategory.Aggregations,\n      renderer: getAggregationByRenderer(name),\n      paramChangedHandler: getLastLabelRemovedHandler(name),\n      explainHandler: getAggregationExplainer(name, 'by'),\n      addOperationHandler: defaultAddOperationHandler,\n      hideFromList: true,\n      ...overrides,\n    },\n    {\n      id: `__${name}_without`,\n      name: `${getPromOperationDisplayName(name)} without`,\n      params: [\n        {\n          name: 'Label',\n          type: 'string',\n          restParam: true,\n          optional: true,\n          editor: 'LabelParamEditor',\n        },\n      ],\n      defaultParams: [''],\n      alternativesKey: 'aggregations by',\n      category: PromVisualQueryOperationCategory.Aggregations,\n      renderer: getAggregationWithoutRenderer(name),\n      paramChangedHandler: getLastLabelRemovedHandler(name),\n      explainHandler: getAggregationExplainer(name, 'without'),\n      addOperationHandler: defaultAddOperationHandler,\n      hideFromList: true,\n      ...overrides,\n    },\n  ];\n\n  return operations;\n}\n\nexport function createAggregationOperationWithParam(\n  name: string,\n  paramsDef: { params: QueryBuilderOperationParamDef[]; defaultParams: QueryBuilderOperationParamValue[] },\n  overrides: Partial<QueryBuilderOperationDef> = {}\n): QueryBuilderOperationDef[] {\n  const operations = createAggregationOperation(name, overrides);\n  operations[0].params.unshift(...paramsDef.params);\n  operations[1].params.unshift(...paramsDef.params);\n  operations[2].params.unshift(...paramsDef.params);\n  operations[0].defaultParams = paramsDef.defaultParams;\n  operations[1].defaultParams = [...paramsDef.defaultParams, ''];\n  operations[2].defaultParams = [...paramsDef.defaultParams, ''];\n  operations[1].renderer = getAggregationByRendererWithParameter(name);\n  operations[2].renderer = getAggregationByRendererWithParameter(name);\n  return operations;\n}\n\nexport function getAggregationByRenderer(aggregation: string) {\n  return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n    return `${aggregation} by(${model.params.map((x) => (typeof x === 'string' ? utf8Support(x) : x)).join(', ')}) (${innerExpr})`;\n  };\n}\n\nfunction getAggregationWithoutRenderer(aggregation: string) {\n  return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n    return `${aggregation} without(${model.params.map((x) => (typeof x === 'string' ? utf8Support(x) : x)).join(', ')}) (${innerExpr})`;\n  };\n}\n\n/**\n * Very simple poc implementation, needs to be modified to support all aggregation operators\n */\nexport function getAggregationExplainer(aggregationName: string, mode: 'by' | 'without' | '') {\n  return function aggregationExplainer(model: QueryBuilderOperation) {\n    const labels = model.params.map((label) => `\\`${label}\\``).join(' and ');\n    const labelWord = pluralize('label', model.params.length);\n\n    switch (mode) {\n      case 'by':\n        return t(\n          'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-by',\n          'Calculates {{aggregationName}} over dimensions while preserving {{labelWord}} {{labels}}.',\n          { aggregationName, labelWord, labels }\n        );\n      case 'without':\n        return t(\n          'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-without',\n          'Calculates {{aggregationName}} over the dimensions {{labels}}. All other labels are preserved.',\n          { aggregationName, labels }\n        );\n      default:\n        return t(\n          'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-default',\n          'Calculates {{aggregationName}} over the dimensions.',\n          { aggregationName }\n        );\n    }\n  };\n}\n\nfunction getAggregationByRendererWithParameter(aggregation: string) {\n  return function aggregationRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {\n    const restParamIndex = def.params.findIndex((param) => param.restParam);\n    const params = model.params.slice(0, restParamIndex);\n    const restParams = model.params.slice(restParamIndex);\n\n    return `${aggregation} by(${restParams.map((x) => (typeof x === 'string' ? utf8Support(x) : x)).join(', ')}) (${params\n      .map((param, idx) => (def.params[idx].type === 'string' ? `\\\"${param}\\\"` : param))\n      .join(', ')}, ${innerExpr})`;\n  };\n}\n\n/**\n * This function will transform operations without labels to their plan aggregation operation\n */\nexport function getLastLabelRemovedHandler(changeToOperationId: string) {\n  return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDef) {\n    // If definition has more params then is defined there are no optional rest params anymore.\n    // We then transform this operation into a different one\n    if (op.params.length < def.params.length) {\n      return {\n        ...op,\n        id: changeToOperationId,\n      };\n    }\n\n    return op;\n  };\n}\n\nexport function getOnLabelAddedHandler(changeToOperationId: string) {\n  return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDef) {\n    // Check if we actually have the label param. As it's optional the aggregation can have one less, which is the\n    // case of just simple aggregation without label. When user adds the label it now has the same number of params\n    // as its definition, and now we can change it to its `_by` variant.\n    if (op.params.length === def.params.length) {\n      return {\n        ...op,\n        id: changeToOperationId,\n      };\n    }\n    return op;\n  };\n}\n\nexport function isConflictingSelector(\n  newLabel: Partial<QueryBuilderLabelFilter>,\n  labels: Array<Partial<QueryBuilderLabelFilter>>\n): boolean {\n  if (!newLabel.label || !newLabel.op || !newLabel.value) {\n    return false;\n  }\n\n  if (labels.length < 2) {\n    return false;\n  }\n\n  const operationIsNegative = newLabel.op.toString().startsWith('!');\n\n  const candidates = labels.filter(\n    (label) => label.label === newLabel.label && label.value === newLabel.value && label.op !== newLabel.op\n  );\n\n  const conflict = candidates.some((candidate) => {\n    if (operationIsNegative && candidate?.op?.toString().startsWith('!') === false) {\n      return true;\n    }\n    if (operationIsNegative === false && candidate?.op?.toString().startsWith('!')) {\n      return true;\n    }\n    return false;\n  });\n\n  return conflict;\n}\n"],"names":["capitalize","PromVisualQueryOperationCategory","utf8Support","pluralize","t"],"mappings":"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"}