{"version":3,"file":"query.cjs","sources":["../../../../../src/querybuilder/shared/rendering/query.ts"],"sourcesContent":["import { isValidLegacyName } from '../../../utf8_support';\nimport { type PrometheusVisualQuery, type QueryBuilderOperationDef, type VisualQueryBinary } from '../types';\n\nimport { renderLabels } from './labels';\nimport { hasBinaryOp, renderOperations } from './operations';\n\n/**\n * Renders binary queries\n */\nexport function renderBinaryQueries(\n  queryString: string,\n  binaryQueries?: Array<VisualQueryBinary<PrometheusVisualQuery>>\n): string {\n  if (binaryQueries) {\n    for (const binQuery of binaryQueries) {\n      queryString = `${renderBinaryQuery(queryString, binQuery)}`;\n    }\n  }\n  return queryString;\n}\n\n/**\n * Renders a binary query\n */\nfunction renderBinaryQuery(leftOperand: string, binaryQuery: VisualQueryBinary<PrometheusVisualQuery>): string {\n  let result = leftOperand + ` ${binaryQuery.operator} `;\n\n  if (binaryQuery.vectorMatches) {\n    result += `${binaryQuery.vectorMatchesType}(${binaryQuery.vectorMatches}) `;\n  }\n\n  return result + renderQuery(binaryQuery.query, true);\n}\n\n/**\n * Renders a full query\n */\nexport function renderQuery(\n  query: PrometheusVisualQuery,\n  nested?: boolean,\n  operationsRegistry?: Map<string, QueryBuilderOperationDef>\n): string {\n  // Handle empty query\n  if (!query.metric && query.labels.length === 0 && query.operations.length === 0) {\n    return '';\n  }\n\n  let queryString = '';\n  const labels = renderLabels(query.labels);\n\n  if (query.metric) {\n    if (isValidLegacyName(query.metric)) {\n      // This is a legacy metric, put outside the curl legacy_query{label=\"value\"}\n      queryString = `${query.metric}${labels}`;\n    } else {\n      // This is a utf8 metric, put inside the curly and quotes {\"utf8.metric\", label=\"value\"}\n      queryString = `{\"${query.metric}\"${labels.length > 0 ? `, ${labels.substring(1)}` : `}`}`;\n    }\n  } else if (query.labels.length > 0) {\n    // No metric just use labels {label=\"value\"}\n    queryString = labels;\n  } else if (query.operations.length > 0) {\n    // For query patterns, we want the operation to render as e.g. rate([$__rate_interval])\n    queryString = '';\n  }\n\n  // If we have operations and an operations registry, render the operations\n  if (query.operations.length > 0) {\n    if (operationsRegistry) {\n      queryString = renderOperations(queryString, query.operations, operationsRegistry);\n    } else {\n      // For cases like add_label_to_query, handle operations generically\n      for (const operation of query.operations) {\n        // Special case to handle basic operations like multiplication\n        if (operation.id === 'MultiplyBy' && operation.params && operation.params.length > 0) {\n          queryString = `${queryString} * ${operation.params[0]}`;\n        }\n      }\n    }\n  }\n\n  // Check if this query or child queries need parentheses\n  const hasNesting = Boolean(query.binaryQueries?.length);\n  const hasBinaryOperation = operationsRegistry ? hasBinaryOp(query, operationsRegistry) : false;\n\n  // Handle nested queries with binary operations\n  if (!nested && hasBinaryOperation && hasNesting) {\n    queryString = `(${queryString})`;\n  }\n\n  // Render any binary queries\n  if (hasNesting) {\n    for (const binQuery of query.binaryQueries!) {\n      const rightOperand = renderNestedPart(binQuery.query, operationsRegistry);\n\n      // Add vector matching if present\n      let vectorMatchingStr = '';\n      if (binQuery.vectorMatches) {\n        vectorMatchingStr = `${binQuery.vectorMatchesType}(${binQuery.vectorMatches}) `;\n      }\n\n      // Combine left and right operands with operator\n      queryString = `${queryString} ${binQuery.operator} ${vectorMatchingStr}${rightOperand}`;\n    }\n  }\n\n  // Add parentheses for nested queries when needed\n  if (nested && (hasBinaryOperation || hasNesting)) {\n    queryString = `(${queryString})`;\n  }\n\n  return queryString;\n}\n\n/**\n * Special helper for rendering a nested part of a binary query\n * This ensures we only add parentheses when needed\n */\nfunction renderNestedPart(\n  query: PrometheusVisualQuery,\n  operationsRegistry?: Map<string, QueryBuilderOperationDef>\n): string {\n  // First render the query itself\n  const renderedQuery = renderQuery(query, false, operationsRegistry);\n\n  const hasOps = query.operations.length > 0;\n  const hasNestedBinary = Boolean(query.binaryQueries?.length);\n\n  // If this is an operation-only query (no metric, no labels, no binaryQueries, at least one operation), do not add parentheses\n  if (hasOps && !hasNestedBinary && !query.metric && (!query.labels || query.labels.length === 0)) {\n    return renderedQuery;\n  }\n\n  // Keep the correct format for test expectations\n  if (hasOps || hasNestedBinary) {\n    return `(${renderedQuery})`;\n  }\n\n  return renderedQuery;\n}\n"],"names":["labels","renderLabels","isValidLegacyName","renderOperations","hasBinaryOp"],"mappings":";;;;;;;;;AASO,SAAS,mBAAA,CACd,aACA,aAAA,EACQ;AACR,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,MAAA,WAAA,GAAc,CAAA,EAAG,iBAAA,CAAkB,WAAA,EAAa,QAAQ,CAAC,CAAA,CAAA;AAAA,IAC3D;AAAA,EACF;AACA,EAAA,OAAO,WAAA;AACT;AAKA,SAAS,iBAAA,CAAkB,aAAqB,WAAA,EAA+D;AAC7G,EAAA,IAAI,MAAA,GAAS,WAAA,GAAc,CAAA,CAAA,EAAI,WAAA,CAAY,QAAQ,CAAA,CAAA,CAAA;AAEnD,EAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,IAAA,MAAA,IAAU,CAAA,EAAG,WAAA,CAAY,iBAAiB,CAAA,CAAA,EAAI,YAAY,aAAa,CAAA,EAAA,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,MAAA,GAAS,WAAA,CAAY,WAAA,CAAY,KAAA,EAAO,IAAI,CAAA;AACrD;AAKO,SAAS,WAAA,CACd,KAAA,EACA,MAAA,EACA,kBAAA,EACQ;AAzCV,EAAA,IAAA,EAAA;AA2CE,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,IAAK,KAAA,CAAM,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC/E,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,MAAMA,QAAA,GAASC,mBAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAExC,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,IAAIC,8BAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG;AAEnC,MAAA,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,EAAGF,QAAM,CAAA,CAAA;AAAA,IACxC,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,CAAA,EAAIA,QAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAKA,QAAA,CAAO,SAAA,CAAU,CAAC,CAAC,KAAK,CAAA,CAAA,CAAG,CAAA,CAAA;AAAA,IACzF;AAAA,EACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAElC,IAAA,WAAA,GAAcA,QAAA;AAAA,EAChB,CAAA,MAAA,IAAW,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAEtC,IAAA,WAAA,GAAc,EAAA;AAAA,EAChB;AAGA,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,WAAA,GAAcG,2BAAA,CAAiB,WAAA,EAAa,KAAA,CAAM,UAAA,EAAY,kBAAkB,CAAA;AAAA,IAClF,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,SAAA,IAAa,MAAM,UAAA,EAAY;AAExC,QAAA,IAAI,SAAA,CAAU,OAAO,YAAA,IAAgB,SAAA,CAAU,UAAU,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA,EAAG;AACpF,UAAA,WAAA,GAAc,GAAG,WAAW,CAAA,GAAA,EAAM,SAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAA,CAAQ,EAAA,GAAA,KAAA,CAAM,aAAA,KAAN,mBAAqB,MAAM,CAAA;AACtD,EAAA,MAAM,kBAAA,GAAqB,kBAAA,GAAqBC,sBAAA,CAAY,KAAA,EAAO,kBAAkB,CAAA,GAAI,KAAA;AAGzF,EAAA,IAAI,CAAC,MAAA,IAAU,kBAAA,IAAsB,UAAA,EAAY;AAC/C,IAAA,WAAA,GAAc,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,MAAW,QAAA,IAAY,MAAM,aAAA,EAAgB;AAC3C,MAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,QAAA,CAAS,KAAA,EAAO,kBAAkB,CAAA;AAGxE,MAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,MAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,QAAA,iBAAA,GAAoB,CAAA,EAAG,QAAA,CAAS,iBAAiB,CAAA,CAAA,EAAI,SAAS,aAAa,CAAA,EAAA,CAAA;AAAA,MAC7E;AAGA,MAAA,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,iBAAiB,GAAG,YAAY,CAAA,CAAA;AAAA,IACvF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,KAAW,sBAAsB,UAAA,CAAA,EAAa;AAChD,IAAA,WAAA,GAAc,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,WAAA;AACT;AAMA,SAAS,gBAAA,CACP,OACA,kBAAA,EACQ;AAzHV,EAAA,IAAA,EAAA;AA2HE,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO,kBAAkB,CAAA;AAElE,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAA;AACzC,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAA,CAAQ,EAAA,GAAA,KAAA,CAAM,aAAA,KAAN,mBAAqB,MAAM,CAAA;AAG3D,EAAA,IAAI,MAAA,IAAU,CAAC,eAAA,IAAmB,CAAC,KAAA,CAAM,MAAA,KAAW,CAAC,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,CAAA,EAAI;AAC/F,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAU,eAAA,EAAiB;AAC7B,IAAA,OAAO,IAAI,aAAa,CAAA,CAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,aAAA;AACT;;;;;"}