drizzle-cube 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +4 -0
  2. package/dist/adapters/express/index.cjs +1 -1
  3. package/dist/adapters/express/index.js +4 -4
  4. package/dist/adapters/fastify/index.cjs +1 -1
  5. package/dist/adapters/fastify/index.js +4 -4
  6. package/dist/adapters/{handler-3LGcjLtr.js → handler-BC3nFNxV.js} +2 -2
  7. package/dist/adapters/{handler-BzzbVpcl.cjs → handler-Cqf-CqAS.cjs} +2 -2
  8. package/dist/adapters/hono/index.cjs +1 -1
  9. package/dist/adapters/hono/index.js +4 -4
  10. package/dist/adapters/locale-BoiA6WiV.cjs +198 -0
  11. package/dist/adapters/{locale-DTnJrxm1.js → locale-D9VQkLXt.js} +442 -404
  12. package/dist/adapters/mcp-tools.cjs +1 -1
  13. package/dist/adapters/mcp-tools.js +2 -2
  14. package/dist/adapters/mcp-transport-B0mgxRnJ.js +579 -0
  15. package/dist/adapters/mcp-transport-irsahKmD.cjs +39 -0
  16. package/dist/adapters/nextjs/index.cjs +1 -1
  17. package/dist/adapters/nextjs/index.js +4 -4
  18. package/dist/adapters/{openai-C4BD8xnN.cjs → openai-B4N3KfTG.cjs} +1 -1
  19. package/dist/adapters/{openai-CaSQEduB.js → openai-BWdm0JvG.js} +1 -1
  20. package/dist/adapters/openai-CoqT_FM5.cjs +16 -0
  21. package/dist/{server/openai-CqZg6zYL.js → adapters/openai-D0Nsvc9L.js} +824 -720
  22. package/dist/adapters/{utils-DOg9oGdt.js → utils-CTYvfZ3I.js} +711 -713
  23. package/dist/adapters/{utils-DNrj-ryp.cjs → utils-XPOzzMdY.cjs} +5 -5
  24. package/dist/adapters/utils.cjs +1 -1
  25. package/dist/adapters/utils.js +1 -1
  26. package/dist/cli/index.cjs +2 -2
  27. package/dist/client/charts.js +10 -10
  28. package/dist/client/chunks/{DashboardEditModal-cSSIAZGy.js → DashboardEditModal-IU_0dgfC.js} +12 -12
  29. package/dist/client/chunks/{DashboardEditModal-cSSIAZGy.js.map → DashboardEditModal-IU_0dgfC.js.map} +1 -1
  30. package/dist/client/chunks/{FieldSearchModal-CZNo4pNK.js → FieldSearchModal-BCWanpPX.js} +3 -3
  31. package/dist/client/chunks/{FieldSearchModal-CZNo4pNK.js.map → FieldSearchModal-BCWanpPX.js.map} +1 -1
  32. package/dist/client/chunks/KpiDelta-_igN6cJa.js +2 -0
  33. package/dist/client/chunks/KpiNumber-t5n8PtRU.js +2 -0
  34. package/dist/client/chunks/KpiText-BCZJJ6a0.js +2 -0
  35. package/dist/client/chunks/{RetentionCombinedChart-BD8tGeM_.js → RetentionCombinedChart-CQMBODsK.js} +2 -2
  36. package/dist/client/chunks/{RetentionCombinedChart-BD8tGeM_.js.map → RetentionCombinedChart-CQMBODsK.js.map} +1 -1
  37. package/dist/client/chunks/SchemaVisualization-BUUhlOvG.js +2 -0
  38. package/dist/client/chunks/SchemaVisualizationLazy-CwaPCUL0.js +2 -0
  39. package/dist/client/chunks/{analysis-builder-BeVZhiQ5.js → analysis-builder-Dm6eD_AX.js} +6 -6
  40. package/dist/client/chunks/{analysis-builder-BeVZhiQ5.js.map → analysis-builder-Dm6eD_AX.js.map} +1 -1
  41. package/dist/client/chunks/{analysis-builder-shared-BWc7ZZnG.js → analysis-builder-shared-DT5bXwCA.js} +6 -6
  42. package/dist/client/chunks/{analysis-builder-shared-BWc7ZZnG.js.map → analysis-builder-shared-DT5bXwCA.js.map} +1 -1
  43. package/dist/client/chunks/{chart-area-D63kG8OT.js → chart-area-DDti9Qtp.js} +2 -2
  44. package/dist/client/chunks/{chart-area-D63kG8OT.js.map → chart-area-DDti9Qtp.js.map} +1 -1
  45. package/dist/client/chunks/{chart-bar-BEfsCLjl.js → chart-bar-B3s9qDlh.js} +2 -2
  46. package/dist/client/chunks/{chart-bar-BEfsCLjl.js.map → chart-bar-B3s9qDlh.js.map} +1 -1
  47. package/dist/client/chunks/{chart-data-table-C3Xh9jwL.js → chart-data-table-Qrt6EAno.js} +17 -17
  48. package/dist/client/chunks/{chart-data-table-C3Xh9jwL.js.map → chart-data-table-Qrt6EAno.js.map} +1 -1
  49. package/dist/client/chunks/{chart-kpi-delta-CYE0S1x_.js → chart-kpi-delta-CgldZ7zO.js} +3 -3
  50. package/dist/client/chunks/{chart-kpi-delta-CYE0S1x_.js.map → chart-kpi-delta-CgldZ7zO.js.map} +1 -1
  51. package/dist/client/chunks/{chart-kpi-number-BlZ79xHW.js → chart-kpi-number-ByfuX1ki.js} +5 -5
  52. package/dist/client/chunks/{chart-kpi-number-BlZ79xHW.js.map → chart-kpi-number-ByfuX1ki.js.map} +1 -1
  53. package/dist/client/chunks/{chart-kpi-text-DY1BnxPe.js → chart-kpi-text-DeNuDraJ.js} +2 -2
  54. package/dist/client/chunks/{chart-kpi-text-DY1BnxPe.js.map → chart-kpi-text-DeNuDraJ.js.map} +1 -1
  55. package/dist/client/chunks/{chart-line-CBsTThTv.js → chart-line-RdZwtk27.js} +2 -2
  56. package/dist/client/chunks/{chart-line-CBsTThTv.js.map → chart-line-RdZwtk27.js.map} +1 -1
  57. package/dist/client/chunks/{chart-markdown-BWaWVkuz.js → chart-markdown-CiGRZdJj.js} +1203 -1139
  58. package/dist/client/chunks/chart-markdown-CiGRZdJj.js.map +1 -0
  59. package/dist/client/chunks/{chart-measure-profile-B41qCTBG.js → chart-measure-profile-Ckjw9bX6.js} +2 -2
  60. package/dist/client/chunks/{chart-measure-profile-B41qCTBG.js.map → chart-measure-profile-Ckjw9bX6.js.map} +1 -1
  61. package/dist/client/chunks/{chart-pie-Djbu8x2v.js → chart-pie-BvY4FY__.js} +2 -2
  62. package/dist/client/chunks/{chart-pie-Djbu8x2v.js.map → chart-pie-BvY4FY__.js.map} +1 -1
  63. package/dist/client/chunks/{chart-radar-BsTcKV0K.js → chart-radar-DjiiEAmc.js} +2 -2
  64. package/dist/client/chunks/{chart-radar-BsTcKV0K.js.map → chart-radar-DjiiEAmc.js.map} +1 -1
  65. package/dist/client/chunks/{chart-radial-bar-Du7XNnwE.js → chart-radial-bar-lla_JEYu.js} +2 -2
  66. package/dist/client/chunks/{chart-radial-bar-Du7XNnwE.js.map → chart-radial-bar-lla_JEYu.js.map} +1 -1
  67. package/dist/client/chunks/{chart-scatter-D8krEYsA.js → chart-scatter-DwXnI0rr.js} +2 -2
  68. package/dist/client/chunks/{chart-scatter-D8krEYsA.js.map → chart-scatter-DwXnI0rr.js.map} +1 -1
  69. package/dist/client/chunks/{chart-tree-map-C5C2iaWM.js → chart-tree-map-DJHoA26f.js} +2 -2
  70. package/dist/client/chunks/{chart-tree-map-C5C2iaWM.js.map → chart-tree-map-DJHoA26f.js.map} +1 -1
  71. package/dist/client/chunks/{chart-waterfall-BGdPrJ5Y.js → chart-waterfall-Y7c8csO5.js} +2 -2
  72. package/dist/client/chunks/{chart-waterfall-BGdPrJ5Y.js.map → chart-waterfall-Y7c8csO5.js.map} +1 -1
  73. package/dist/client/chunks/{core-DcfMGTVa.js → core-Dk6z6kC0.js} +2 -2
  74. package/dist/client/chunks/{core-DcfMGTVa.js.map → core-Dk6z6kC0.js.map} +1 -1
  75. package/dist/client/chunks/{exceljs.min-CcjgM-qg.js → exceljs.min-DaJsLlWM.js} +24 -24
  76. package/dist/client/chunks/{exceljs.min-CcjgM-qg.js.map → exceljs.min-DaJsLlWM.js.map} +1 -1
  77. package/dist/client/chunks/{schema-visualization-Xp60Ff2W.js → schema-visualization-DWwJukK7.js} +8 -8
  78. package/dist/client/chunks/{schema-visualization-Xp60Ff2W.js.map → schema-visualization-DWwJukK7.js.map} +1 -1
  79. package/dist/client/chunks/{syntaxHighlighting-CnDujqwg.js → syntaxHighlighting-D8J6Yt9j.js} +2 -2
  80. package/dist/client/chunks/{syntaxHighlighting-CnDujqwg.js.map → syntaxHighlighting-D8J6Yt9j.js.map} +1 -1
  81. package/dist/client/chunks/{useDebounce-CfmUMFau.js → useDebounce-DyJVREop.js} +2 -2
  82. package/dist/client/chunks/{useDebounce-CfmUMFau.js.map → useDebounce-DyJVREop.js.map} +1 -1
  83. package/dist/client/chunks/{useExplainAI-BKGmejIj.js → useExplainAI-CxSkjocM.js} +4 -4
  84. package/dist/client/chunks/{useExplainAI-BKGmejIj.js.map → useExplainAI-CxSkjocM.js.map} +1 -1
  85. package/dist/client/chunks/{utils-BldkcRHv.js → utils-BHZdKxua.js} +2 -2
  86. package/dist/client/chunks/{utils-BldkcRHv.js.map → utils-BHZdKxua.js.map} +1 -1
  87. package/dist/client/chunks/{vendor-ClXpIiea.js → vendor-CBD_Olr0.js} +8 -8
  88. package/dist/client/chunks/{vendor-ClXpIiea.js.map → vendor-CBD_Olr0.js.map} +1 -1
  89. package/dist/client/components.js +3 -3
  90. package/dist/client/hooks.js +3 -3
  91. package/dist/client/icons.js +1 -1
  92. package/dist/client/index.js +11 -11
  93. package/dist/client/providers.js +1 -1
  94. package/dist/client/schema.js +1 -1
  95. package/dist/client/utils.js +5 -5
  96. package/dist/client-bundle-stats.html +1 -1
  97. package/dist/mcp-app/mcp-app.html +21 -21
  98. package/dist/server/index.cjs +42 -42
  99. package/dist/server/index.js +1009 -971
  100. package/dist/server/{openai-D9Zjuby1.cjs → openai-BfiZU0rG.cjs} +1 -1
  101. package/dist/server/openai-BwsBio1K.cjs +16 -0
  102. package/dist/server/{openai-rwauPzCT.js → openai-CLWSwD-D.js} +1 -1
  103. package/dist/{adapters/openai-BAnEZgKZ.js → server/openai-zpXlGbbF.js} +824 -720
  104. package/package.json +2 -2
  105. package/dist/adapters/locale-DueXjqMh.cjs +0 -198
  106. package/dist/adapters/mcp-transport-C7VLf4T5.js +0 -579
  107. package/dist/adapters/mcp-transport-poPHl_2j.cjs +0 -39
  108. package/dist/adapters/openai-4JP2B6pB.cjs +0 -16
  109. package/dist/client/chunks/KpiDelta-Dll_eCV1.js +0 -2
  110. package/dist/client/chunks/KpiNumber-BPlR92hI.js +0 -2
  111. package/dist/client/chunks/KpiText-BIxq7Jso.js +0 -2
  112. package/dist/client/chunks/SchemaVisualization-CCICjhvv.js +0 -2
  113. package/dist/client/chunks/SchemaVisualizationLazy-DraGsMx6.js +0 -2
  114. package/dist/client/chunks/chart-markdown-BWaWVkuz.js.map +0 -1
  115. package/dist/server/openai-DmuEbFd6.cjs +0 -16
@@ -0,0 +1,198 @@
1
+ const e=require(`./utils-XPOzzMdY.cjs`);var t=Symbol.for(`drizzle:entityKind`);function n(e,n){if(!e||typeof e!=`object`)return!1;if(e instanceof n)return!0;if(!Object.prototype.hasOwnProperty.call(n,t))throw Error(`Class "${n.name??`<unknown>`}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);let r=Object.getPrototypeOf(e).constructor;if(r)for(;r;){if(t in r&&r[t]===n[t])return!0;r=Object.getPrototypeOf(r)}return!1}var r=class{constructor(e,t){this.table=e,this.config=t,this.name=t.name,this.keyAsName=t.keyAsName,this.notNull=t.notNull,this.default=t.default,this.defaultFn=t.defaultFn,this.onUpdateFn=t.onUpdateFn,this.hasDefault=t.hasDefault,this.primary=t.primaryKey,this.isUnique=t.isUnique,this.uniqueName=t.uniqueName,this.uniqueType=t.uniqueType,this.dataType=t.dataType,this.columnType=t.columnType,this.generated=t.generated,this.generatedIdentity=t.generatedIdentity}static[t]=`Column`;name;keyAsName;primary;notNull;default;defaultFn;onUpdateFn;hasDefault;isUnique;uniqueName;uniqueType;dataType;columnType;enumValues=void 0;generated=void 0;generatedIdentity=void 0;config;mapFromDriverValue(e){return e}mapToDriverValue(e){return e}shouldDisableInsert(){return this.config.generated!==void 0&&this.config.generated.type!==`byDefault`}},i=Symbol.for(`drizzle:Name`),a=Symbol.for(`drizzle:isPgEnum`);function o(e){return!!e&&typeof e==`function`&&a in e&&e[a]===!0}var s=class{static[t]=`Subquery`;constructor(e,t,n,r=!1,i=[]){this._={brand:`Subquery`,sql:e,selectedFields:t,alias:n,isWith:r,usedTables:i}}},c={startActiveSpan(e,t){return t()}},l=Symbol.for(`drizzle:ViewBaseConfig`),u=Symbol.for(`drizzle:Schema`),d=Symbol.for(`drizzle:Columns`),f=Symbol.for(`drizzle:ExtraConfigColumns`),p=Symbol.for(`drizzle:OriginalName`),m=Symbol.for(`drizzle:BaseName`),h=Symbol.for(`drizzle:IsAlias`),g=Symbol.for(`drizzle:ExtraConfigBuilder`),_=Symbol.for(`drizzle:IsDrizzleTable`),v=class{static[t]=`Table`;static Symbol={Name:i,Schema:u,OriginalName:p,Columns:d,ExtraConfigColumns:f,BaseName:m,IsAlias:h,ExtraConfigBuilder:g};[i];[p];[u];[d];[f];[m];[h]=!1;[_]=!0;[g]=void 0;constructor(e,t,n){this[i]=this[p]=e,this[u]=t,this[m]=n}};function y(e){return e!=null&&typeof e.getSQL==`function`}function b(e){let t={sql:``,params:[]};for(let n of e)t.sql+=n.sql,t.params.push(...n.params),n.typings?.length&&(t.typings||=[],t.typings.push(...n.typings));return t}var x=class{static[t]=`StringChunk`;value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new S([this])}},S=class e{constructor(e){this.queryChunks=e;for(let t of e)if(n(t,v)){let e=t[v.Symbol.Schema];this.usedTables.push(e===void 0?t[v.Symbol.Name]:e+`.`+t[v.Symbol.Name])}}static[t]=`SQL`;decoder=T;shouldInlineParams=!1;usedTables=[];append(e){return this.queryChunks.push(...e.queryChunks),this}toQuery(e){return c.startActiveSpan(`drizzle.buildSQL`,t=>{let n=this.buildQueryFromSourceParams(this.queryChunks,e);return t?.setAttributes({"drizzle.query.text":n.sql,"drizzle.query.params":JSON.stringify(n.params)}),n})}buildQueryFromSourceParams(t,i){let a=Object.assign({},i,{inlineParams:i.inlineParams||this.shouldInlineParams,paramStartIndex:i.paramStartIndex||{value:0}}),{casing:c,escapeName:u,escapeParam:d,prepareTyping:f,inlineParams:p,paramStartIndex:m}=a;return b(t.map(t=>{if(n(t,x))return{sql:t.value.join(``),params:[]};if(n(t,C))return{sql:u(t.value),params:[]};if(t===void 0)return{sql:``,params:[]};if(Array.isArray(t)){let e=[new x(`(`)];for(let[n,r]of t.entries())e.push(r),n<t.length-1&&e.push(new x(`, `));return e.push(new x(`)`)),this.buildQueryFromSourceParams(e,a)}if(n(t,e))return this.buildQueryFromSourceParams(t.queryChunks,{...a,inlineParams:p||t.shouldInlineParams});if(n(t,v)){let e=t[v.Symbol.Schema],n=t[v.Symbol.Name];return{sql:e===void 0||t[h]?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,r)){let e=c.getColumnCasing(t);if(i.invokeSource===`indexes`)return{sql:u(e),params:[]};let n=t.table[v.Symbol.Schema];return{sql:t.table[h]||n===void 0?u(t.table[v.Symbol.Name])+`.`+u(e):u(n)+`.`+u(t.table[v.Symbol.Name])+`.`+u(e),params:[]}}if(n(t,j)){let e=t[l].schema,n=t[l].name;return{sql:e===void 0||t[l].isAlias?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,D)){if(n(t.value,k))return{sql:d(m.value++,t),params:[t],typings:[`none`]};let r=t.value===null?null:t.encoder.mapToDriverValue(t.value);if(n(r,e))return this.buildQueryFromSourceParams([r],a);if(p)return{sql:this.mapInlineParam(r,a),params:[]};let i=[`none`];return f&&(i=[f(t.encoder)]),{sql:d(m.value++,r),params:[r],typings:i}}return n(t,k)?{sql:d(m.value++,t),params:[t],typings:[`none`]}:n(t,e.Aliased)&&t.fieldAlias!==void 0?{sql:u(t.fieldAlias),params:[]}:n(t,s)?t._.isWith?{sql:u(t._.alias),params:[]}:this.buildQueryFromSourceParams([new x(`(`),t._.sql,new x(`) `),new C(t._.alias)],a):o(t)?t.schema?{sql:u(t.schema)+`.`+u(t.enumName),params:[]}:{sql:u(t.enumName),params:[]}:y(t)?t.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([t.getSQL()],a):this.buildQueryFromSourceParams([new x(`(`),t.getSQL(),new x(`)`)],a):p?{sql:this.mapInlineParam(t,a),params:[]}:{sql:d(m.value++,t),params:[t],typings:[`none`]}}))}mapInlineParam(e,{escapeString:t}){if(e===null)return`null`;if(typeof e==`number`||typeof e==`boolean`)return e.toString();if(typeof e==`string`)return t(e);if(typeof e==`object`){let n=e.toString();return t(n===`[object Object]`?JSON.stringify(e):n)}throw Error(`Unexpected param value: `+e)}getSQL(){return this}as(t){return t===void 0?this:new e.Aliased(this,t)}mapWith(e){return this.decoder=typeof e==`function`?{mapFromDriverValue:e}:e,this}inlineParams(){return this.shouldInlineParams=!0,this}if(e){return e?this:void 0}},C=class{constructor(e){this.value=e}static[t]=`Name`;brand;getSQL(){return new S([this])}};function w(e){return typeof e==`object`&&!!e&&`mapToDriverValue`in e&&typeof e.mapToDriverValue==`function`}var T={mapFromDriverValue:e=>e},E={mapToDriverValue:e=>e};({...T,...E});var D=class{constructor(e,t=E){this.value=e,this.encoder=t}static[t]=`Param`;brand;getSQL(){return new S([this])}};function O(e,...t){let n=[];(t.length>0||e.length>0&&e[0]!==``)&&n.push(new x(e[0]));for(let[r,i]of t.entries())n.push(i,new x(e[r+1]));return new S(n)}(e=>{function t(){return new S([])}e.empty=t;function n(e){return new S(e)}e.fromList=n;function r(e){return new S([new x(e)])}e.raw=r;function i(e,t){let n=[];for(let[r,i]of e.entries())r>0&&t!==void 0&&n.push(t),n.push(i);return new S(n)}e.join=i;function a(e){return new C(e)}e.identifier=a;function o(e){return new k(e)}e.placeholder=o;function s(e,t){return new D(e,t)}e.param=s})(O||={}),(e=>{class n{constructor(e,t){this.sql=e,this.fieldAlias=t}static[t]=`SQL.Aliased`;isSelectionField=!1;getSQL(){return this.sql}clone(){return new n(this.sql,this.fieldAlias)}}e.Aliased=n})(S||={});var k=class{constructor(e){this.name=e}static[t]=`Placeholder`;getSQL(){return new S([this])}},A=Symbol.for(`drizzle:IsDrizzleView`),j=class{static[t]=`View`;[l];[A]=!0;constructor({name:e,schema:t,selectedFields:n,query:r}){this[l]={name:e,originalName:e,schema:t,selectedFields:n,query:r,isExisting:!r,isAlias:!1}}getSQL(){return new S([this])}};r.prototype.getSQL=function(){return new S([this])},v.prototype.getSQL=function(){return new S([this])},s.prototype.getSQL=function(){return new S([this])};function M(e,t){return w(t)&&!y(e)&&!n(e,D)&&!n(e,k)&&!n(e,r)&&!n(e,v)&&!n(e,j)?new D(e,t):e}var N=(e,t)=>O`${e} = ${M(t,e)}`,P=(e,t)=>O`${e} <> ${M(t,e)}`;function F(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new S(t):new S([new x(`(`),O.join(t,new x(` and `)),new x(`)`)])}function I(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new S(t):new S([new x(`(`),O.join(t,new x(` or `)),new x(`)`)])}var ee=(e,t)=>O`${e} > ${M(t,e)}`,L=(e,t)=>O`${e} >= ${M(t,e)}`,te=(e,t)=>O`${e} < ${M(t,e)}`,R=(e,t)=>O`${e} <= ${M(t,e)}`;function ne(e,t){return Array.isArray(t)?t.length===0?O`false`:O`${e} in ${t.map(t=>M(t,e))}`:O`${e} in ${M(t,e)}`}function re(e,t){return Array.isArray(t)?t.length===0?O`true`:O`${e} not in ${t.map(t=>M(t,e))}`:O`${e} not in ${M(t,e)}`}function ie(e){return O`${e} is null`}function ae(e){return O`${e} is not null`}function oe(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContains requires at least one value`);return O`${e} @> ${O`${M(t,e)}`}`}return O`${e} @> ${M(t,e)}`}function se(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContained requires at least one value`);return O`${e} <@ ${O`${M(t,e)}`}`}return O`${e} <@ ${M(t,e)}`}function ce(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayOverlaps requires at least one value`);return O`${e} && ${O`${M(t,e)}`}`}return O`${e} && ${M(t,e)}`}function le(e){return O`${e} asc`}function ue(e){return O`${e} desc`}function de(e){return O`count(${e||O.raw(`*`)})`.mapWith(Number)}function fe(e){return O`count(distinct ${e})`.mapWith(Number)}function z(e){return O`sum(${e})`.mapWith(String)}function B(e){return O`max(${e})`.mapWith(n(e,r)?e:String)}function V(e){return O`min(${e})`.mapWith(n(e,r)?e:String)}var H=class{preprocessCalculatedTemplate(e){return e}buildPattern(e,t){switch(e){case`contains`:case`notContains`:return`%${t}%`;case`startsWith`:return`${t}%`;case`endsWith`:return`%${t}`;default:return t}}parseISODuration(e){let t={years:0,months:0,days:0,hours:0,minutes:0,seconds:0},n=e.match(/^P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/);if(!n)throw Error(`Invalid ISO 8601 duration format: ${e}`);return t.years=parseInt(n[1]||`0`,10),t.months=parseInt(n[2]||`0`,10),t.days=parseInt(n[3]||`0`,10),t.hours=parseInt(n[4]||`0`,10),t.minutes=parseInt(n[5]||`0`,10),t.seconds=parseFloat(n[6]||`0`),t}durationToSeconds(e){let t=this.parseISODuration(e);return t.years*365*24*60*60+t.months*30*24*60*60+t.days*24*60*60+t.hours*60*60+t.minutes*60+t.seconds}},pe=class extends H{getEngineType(){return`postgres`}supportsLateralJoins(){return!0}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];t.years&&n.push(`${t.years} years`),t.months&&n.push(`${t.months} months`),t.days&&n.push(`${t.days} days`),t.hours&&n.push(`${t.hours} hours`),t.minutes&&n.push(`${t.minutes} minutes`),t.seconds&&n.push(`${t.seconds} seconds`);let r=n.join(` `)||`0 seconds`;return O`INTERVAL '${O.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return O`EXTRACT(EPOCH FROM (${e} - ${t}))`}buildDateAddInterval(e,t){return O`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`COUNT(*) FILTER (WHERE ${n})`:O`${O.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return O`(${t}::date - ${e}::date)`;case`week`:return O`FLOOR((${t}::date - ${e}::date) / 7)`;case`month`:return O`(EXTRACT(YEAR FROM AGE(${t}::timestamp, ${e}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${t}::timestamp, ${e}::timestamp)))::integer`;default:throw Error(`Unsupported date diff unit: ${n}`)}}buildPeriodSeriesSubquery(e){return O`(SELECT generate_series(0, ${e}) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return O`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return O`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return O`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return O`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return O`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return O`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return O`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return O`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`${e} ILIKE ${`%${n}%`}`;case`notContains`:return O`${e} NOT ILIKE ${`%${n}%`}`;case`startsWith`:return O`${e} ILIKE ${`${n}%`}`;case`endsWith`:return O`${e} ILIKE ${`%${n}`}`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`${e} ILIKE ${n}`;case`regex`:return O`${e} ~* ${n}`;case`notRegex`:return O`${e} !~* ${n}`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`${e}::timestamp`;case`decimal`:return O`${e}::decimal`;case`integer`:return O`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`TRUE`:O`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!0,supportsVariance:!0,supportsPercentile:!0,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsDerivedTablesInCTE:!0,supportsLateralSubqueriesInCTE:!0}}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildPercentile(e,t){return O`PERCENTILE_CONT(${t/100}) WITHIN GROUP (ORDER BY ${e})`}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},me=class extends H{getEngineType(){return`mysql`}supportsLateralJoins(){return!0}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];return t.years&&n.push(`${t.years} YEAR`),t.months&&n.push(`${t.months} MONTH`),t.days&&n.push(`${t.days} DAY`),t.hours&&n.push(`${t.hours} HOUR`),t.minutes&&n.push(`${t.minutes} MINUTE`),t.seconds&&n.push(`${t.seconds} SECOND`),O`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return O`TIMESTAMPDIFF(SECOND, ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=O`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`),n.months&&(r=O`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`),n.days&&(r=O`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`),n.hours&&(r=O`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`),n.minutes&&(r=O`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`),n.seconds&&(r=O`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`),r}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`COUNT(CASE WHEN ${n} THEN 1 END)`:O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return O`TIMESTAMPDIFF(${O.raw(r)}, ${e}, ${t})`}buildPeriodSeriesSubquery(e){return O`(
2
+ WITH RECURSIVE periods(period_number) AS (
3
+ SELECT 0
4
+ UNION ALL
5
+ SELECT period_number + 1 FROM periods WHERE period_number < ${e}
6
+ )
7
+ SELECT period_number FROM periods
8
+ ) p`}buildTimeDimension(e,t){let n={year:`%Y-01-01 00:00:00`,quarter:`%Y-%q-01 00:00:00`,month:`%Y-%m-01 00:00:00`,week:`%Y-%u-01 00:00:00`,day:`%Y-%m-%d 00:00:00`,hour:`%Y-%m-%d %H:00:00`,minute:`%Y-%m-%d %H:%i:00`,second:`%Y-%m-%d %H:%i:%s`};switch(e){case`quarter`:return O`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;case`week`:return O`DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY)`;default:{let r=n[e];return r?O`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')`:t}}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;case`notContains`:return O`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;case`startsWith`:return O`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;case`endsWith`:return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`LOWER(${e}) LIKE ${n.toLowerCase()}`;case`regex`:return O`${e} REGEXP ${n}`;case`notRegex`:return O`${e} NOT REGEXP ${n}`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`CAST(${e} AS DATETIME)`;case`decimal`:return O`CAST(${e} AS DECIMAL(10,2))`;case`integer`:return O`CAST(${e} AS SIGNED INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`IFNULL(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`TRUE`:O`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!0,supportsVariance:!0,supportsPercentile:!1,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!1,supportsDerivedTablesInCTE:!0,supportsLateralSubqueriesInCTE:!0}}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return O`IFNULL(${O.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return O`IFNULL(${O.raw(n)}(${e}), 0)`}buildPercentile(e,t){return null}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},he=class extends H{getEngineType(){return`sqlite`}supportsLateralJoins(){return!1}buildIntervalFromISO(e){return O`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return O`(${e} - ${t})`}buildDateAddInterval(e,t){return O`(${e} + ${this.durationToSeconds(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`COUNT(CASE WHEN ${n} THEN 1 END)`:O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return O`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;case`week`:return O`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;case`month`:return O`((CAST(strftime('%Y', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%Y', datetime(${e}, 'unixepoch')) AS INTEGER)) * 12 + (CAST(strftime('%m', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%m', datetime(${e}, 'unixepoch')) AS INTEGER)))`;default:throw Error(`Unsupported date diff unit for SQLite: ${n}`)}}buildPeriodSeriesSubquery(e){return O`(
9
+ WITH RECURSIVE periods(period_number) AS (
10
+ SELECT 0
11
+ UNION ALL
12
+ SELECT period_number + 1 FROM periods WHERE period_number < ${e}
13
+ )
14
+ SELECT period_number FROM periods
15
+ ) p`}buildTimeDimension(e,t){switch(e){case`year`:return O`datetime(${t}, 'unixepoch', 'start of year')`;case`quarter`:{let e=O`datetime(${t}, 'unixepoch')`;return O`datetime(${e}, 'start of year',
16
+ '+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`}case`month`:return O`datetime(${t}, 'unixepoch', 'start of month')`;case`week`:return O`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;case`day`:return O`datetime(${t}, 'unixepoch', 'start of day')`;case`hour`:return O`datetime(strftime('%Y-%m-%d %H:00:00', ${O`datetime(${t}, 'unixepoch')`}))`;case`minute`:return O`datetime(strftime('%Y-%m-%d %H:%M:00', ${O`datetime(${t}, 'unixepoch')`}))`;case`second`:return O`datetime(strftime('%Y-%m-%d %H:%M:%S', ${O`datetime(${t}, 'unixepoch')`}))`;default:return O`datetime(${t}, 'unixepoch')`}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}%`}`;case`notContains`:return O`LOWER(${e}) NOT LIKE ${`%${n.toLowerCase()}%`}`;case`startsWith`:return O`LOWER(${e}) LIKE ${`${n.toLowerCase()}%`}`;case`endsWith`:return O`LOWER(${e}) LIKE ${`%${n.toLowerCase()}`}`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`LOWER(${e}) LIKE ${n.toLowerCase()}`;case`regex`:return O`${e} GLOB ${n}`;case`notRegex`:return O`${e} NOT GLOB ${n}`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`datetime(${e} / 1000, 'unixepoch')`;case`decimal`:return O`CAST(${e} AS REAL)`;case`integer`:return O`CAST(${e} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`IFNULL(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>e.then&&typeof e.then==`object`&&(e.then.queryChunks||e.then._||e.then.sql)?O`WHEN ${e.when} THEN ${O.raw(`(`)}${e.then}${O.raw(`)`)}`:O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:t&&typeof t==`object`&&(t.queryChunks||t._||t.sql)?O`CASE ${n} ELSE ${O.raw(`(`)}${t}${O.raw(`)`)} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`1`:O`0`}preprocessCalculatedTemplate(e){return e.length>1e3?e:e.replace(/(\{[^}]+\})\s*\/\s*/g,(e,t)=>`${t.replace(/\{([^}]+)\}/,`CAST({$1} AS REAL)`)} / `)}convertFilterValue(e){return typeof e==`boolean`?+!!e:e instanceof Date?e.getTime():Array.isArray(e)?e.map(e=>this.convertFilterValue(e)):e}prepareDateValue(e){if(!(e instanceof Date)){if(typeof e==`number`)return e;if(typeof e==`string`)return new Date(e).getTime();throw Error(`prepareDateValue expects a Date object, got ${typeof e}`)}return e.getTime()}isTimestampInteger(){return!0}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!1,supportsVariance:!1,supportsPercentile:!1,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsDerivedTablesInCTE:!0,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){return null}buildVariance(e,t=!1){return null}buildPercentile(e,t){return null}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},ge=class extends me{getEngineType(){return`singlestore`}},_e=class extends H{getEngineType(){return`duckdb`}supportsLateralJoins(){return!1}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];t.years&&n.push(`${t.years} years`),t.months&&n.push(`${t.months} months`),t.days&&n.push(`${t.days} days`),t.hours&&n.push(`${t.hours} hours`),t.minutes&&n.push(`${t.minutes} minutes`),t.seconds&&n.push(`${t.seconds} seconds`);let r=n.join(` `)||`0 seconds`;return O`INTERVAL '${O.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return O`(EPOCH(${e}) - EPOCH(${t}))`}buildDateAddInterval(e,t){return O`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`COUNT(*) FILTER (WHERE ${n})`:O`${O.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){return O`DATE_DIFF('${O.raw(n)}', ${e}::timestamp, ${t}::timestamp)`}buildPeriodSeriesSubquery(e){return O`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return O`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return O`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return O`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return O`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return O`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return O`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return O`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return O`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`${e} ILIKE ${`%${n}%`}`;case`notContains`:return O`${e} NOT ILIKE ${`%${n}%`}`;case`startsWith`:return O`${e} ILIKE ${`${n}%`}`;case`endsWith`:return O`${e} ILIKE ${`%${n}`}`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`${e} ILIKE ${n}`;case`regex`:return O`regexp_matches(${e}, ${n})`;case`notRegex`:return O`NOT regexp_matches(${e}, ${n})`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`${e}::timestamp`;case`decimal`:return O`${e}::decimal`;case`integer`:return O`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`TRUE`:O`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!0,supportsVariance:!0,supportsPercentile:!0,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsDerivedTablesInCTE:!0,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildPercentile(e,t){return O`QUANTILE_CONT(${e}, ${t/100})`}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},ve=class extends H{getEngineType(){return`databend`}supportsLateralJoins(){return!1}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];if(t.years&&n.push(`${t.years} YEAR`),t.months&&n.push(`${t.months} MONTH`),t.days&&n.push(`${t.days} DAY`),t.hours&&n.push(`${t.hours} HOUR`),t.minutes&&n.push(`${t.minutes} MINUTE`),t.seconds&&n.push(`${t.seconds} SECOND`),n.length===0)return O`INTERVAL 0 SECOND`;if(n.length===1)return O`INTERVAL ${O.raw(n[0])}`;let r=n.map(e=>`INTERVAL ${e}`);return O`(${O.raw(r.join(` + `))})`}buildTimeDifferenceSeconds(e,t){return O`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`}buildDateAddInterval(e,t){return O`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`${O.raw(r)}(CASE WHEN ${n} THEN 1 END)`:O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){return O`DATE_DIFF('${O.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return O`(SELECT number as period_number FROM numbers(${e+1})) p`}buildTimeDimension(e,t){switch(e){case`year`:return O`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;case`quarter`:return O`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;case`month`:return O`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;case`week`:return O`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;case`day`:return O`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return O`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;case`minute`:return O`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;case`second`:return O`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`LOWER(${e}) LIKE LOWER(${`%${n}%`})`;case`notContains`:return O`LOWER(${e}) NOT LIKE LOWER(${`%${n}%`})`;case`startsWith`:return O`LOWER(${e}) LIKE LOWER(${`${n}%`})`;case`endsWith`:return O`LOWER(${e}) LIKE LOWER(${`%${n}`})`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`LOWER(${e}) LIKE LOWER(${n})`;case`regex`:return O`${e} REGEXP ${n}`;case`notRegex`:return O`NOT (${e} REGEXP ${n})`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`${e}::TIMESTAMP`;case`decimal`:return O`${e}::DECIMAL`;case`integer`:return O`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`TRUE`:O`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!0,supportsVariance:!0,supportsPercentile:!1,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsDerivedTablesInCTE:!1,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`COVAR_SAMP`:`COVAR_POP`;return O`COALESCE(${O.raw(n)}(${e}, ${e}), 0)`}buildPercentile(e,t){throw Error(`Percentile functions are not yet supported for Databend`)}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},ye=class extends H{getEngineType(){return`snowflake`}supportsLateralJoins(){return!0}buildIntervalFromISO(e){return O`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return O`DATEDIFF('SECOND', ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=O`DATEADD('YEAR', ${n.years}, ${r})`),n.months&&(r=O`DATEADD('MONTH', ${n.months}, ${r})`),n.days&&(r=O`DATEADD('DAY', ${n.days}, ${r})`),n.hours&&(r=O`DATEADD('HOUR', ${n.hours}, ${r})`),n.minutes&&(r=O`DATEADD('MINUTE', ${n.minutes}, ${r})`),n.seconds&&(r=O`DATEADD('SECOND', ${n.seconds}, ${r})`),r}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?O`${O.raw(r)}(CASE WHEN ${n} THEN 1 END)`:O`${O.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return O`DATEDIFF('${O.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return O`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e+1}))) p`}buildTimeDimension(e,t){switch(e){case`year`:return O`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;case`quarter`:return O`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;case`month`:return O`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;case`week`:return O`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;case`day`:return O`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return O`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;case`minute`:return O`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;case`second`:return O`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return O`${e} ILIKE ${`%${n}%`}`;case`notContains`:return O`${e} NOT ILIKE ${`%${n}%`}`;case`startsWith`:return O`${e} ILIKE ${`${n}%`}`;case`endsWith`:return O`${e} ILIKE ${`%${n}`}`;case`like`:return O`${e} LIKE ${n}`;case`notLike`:return O`${e} NOT LIKE ${n}`;case`ilike`:return O`${e} ILIKE ${n}`;case`regex`:return O`REGEXP_LIKE(${e}, ${n})`;case`notRegex`:return O`NOT REGEXP_LIKE(${e}, ${n})`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return O`${e}::TIMESTAMP`;case`decimal`:return O`${e}::DECIMAL`;case`integer`:return O`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return O`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>O`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>O`${e} ${t}`);return t===void 0?O`CASE ${n} END`:O`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?O`TRUE`:O`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}getCapabilities(){return{supportsStddev:!0,supportsVariance:!0,supportsPercentile:!0,supportsWindowFunctions:!0,supportsFrameClause:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsDerivedTablesInCTE:!0,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return O`COALESCE(${O.raw(n)}(${e}), 0)`}buildPercentile(e,t){let n=(t/100).toString();return O`PERCENTILE_CONT(${O.raw(n)}) WITHIN GROUP (ORDER BY ${e})`}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?O`PARTITION BY ${O.join(n,O`, `)}`:O``,o=r&&r.length>0?O`ORDER BY ${O.join(r.map(e=>e.direction===`desc`?O`${e.field} DESC`:O`${e.field} ASC`),O`, `)}`:O``,s=O``;if(i?.frame){let{type:e,start:t,end:n}=i.frame,r=e.toUpperCase(),a=t===`unbounded`?`UNBOUNDED PRECEDING`:typeof t==`number`?`${t} PRECEDING`:`CURRENT ROW`,o=n===`unbounded`?`UNBOUNDED FOLLOWING`:n===`current`?`CURRENT ROW`:typeof n==`number`?`${n} FOLLOWING`:`CURRENT ROW`;s=O`${O.raw(r)} BETWEEN ${O.raw(a)} AND ${O.raw(o)}`}let c=[];n&&n.length>0&&c.push(a),r&&r.length>0&&c.push(o),i?.frame&&c.push(s);let l=O`OVER (${c.length>0?O.join(c,O` `):O``})`;switch(e){case`lag`:return O`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`lead`:return O`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?O``:O`, ${i.defaultValue}`}) ${l}`;case`rank`:return O`RANK() ${l}`;case`denseRank`:return O`DENSE_RANK() ${l}`;case`rowNumber`:return O`ROW_NUMBER() ${l}`;case`ntile`:return O`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return O`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return O`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return O`AVG(${t}) ${l}`;case`movingSum`:return O`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}};function be(e){switch(e){case`postgres`:return new pe;case`mysql`:return new me;case`sqlite`:return new he;case`singlestore`:return new ge;case`duckdb`:return new _e;case`databend`:return new ve;case`snowflake`:return new ye;default:throw Error(`Unsupported database engine: ${e}`)}}var U=class{databaseAdapter;constructor(e,t,n){this.db=e,this.schema=t,this.databaseAdapter=be(n||this.getEngineType())}};function xe(e,t){let n=[],r=[],i=!1,a,o,s,c=[];for(let t of e){let e=t.match(/Planning Time:\s*([\d.]+)\s*ms/i);if(e){a=parseFloat(e[1]);continue}let l=t.match(/Execution Time:\s*([\d.]+)\s*ms/i);if(l){o=parseFloat(l[1]);continue}let u=Se(t);if(u){u.type.includes(`Seq Scan`)&&(i=!0),u.index&&r.push(u.index),n.length===0&&u.estimatedCost!==void 0&&(s=u.estimatedCost);let e=t.search(/\S/);for(;c.length>0&&c[c.length-1].indent>=e;)c.pop();if(c.length===0)n.push(u);else{let e=c[c.length-1].op;e.children||=[],e.children.push(u)}c.push({indent:e,op:u})}}return{operations:n,summary:{database:`postgres`,planningTime:a,executionTime:o,totalCost:s,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
17
+ `),sql:t}}function Se(e){let t=e.replace(/^[\s->]+/,``).trim();if(!t)return null;let n=t.match(/^([A-Za-z][A-Za-z0-9 ]+?)(?:\s+using\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\w+)?(?:\s+\(cost=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)(?:\s+width=\d+)?\))?(?:\s+\(actual time=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)\s+loops=(\d+)\))?/i);if(!n)return t.match(/^Filter:\s*(.+)$/i)||t.match(/^(Hash Cond|Join Filter|Index Cond):\s*(.+)$/i),null;let r=n[1].trim(),i=n[2]||void 0,a=n[3]||void 0,o=n[5]?parseFloat(n[5]):void 0,s=n[6]?parseInt(n[6],10):void 0,c=n[9]?parseInt(n[9],10):void 0,l={type:r,table:a,index:i,estimatedRows:s,estimatedCost:o};c!==void 0&&(l.actualRows=c);let u=e.match(/Filter:\s*(.+?)(?:\)|$)/i);return u&&(l.filter=u[1].trim()),l}function Ce(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`rows`in e&&Array.isArray(e.rows)?e.rows:[]}var we=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);let n=await this.db.execute(e),r=Ce(n);return r.length>0?r.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}if(e.constructor?.name===`Numeric`||e.constructor?.name===`Decimal`||`digits`in e||`sign`in e){let t=e.toString();return parseFloat(t)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`postgres`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);let i=await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g,(e,n)=>{let r=t[parseInt(n,10)-1];return r===null?`NULL`:typeof r==`number`?String(r):typeof r==`boolean`?r?`TRUE`:`FALSE`:r instanceof Date?`'${r.toISOString()}'`:`'${String(r).replace(/'/g,`''`)}'`}))}`),a=[];for(let e of Ce(i))if(e&&typeof e==`object`){let t=e[`QUERY PLAN`]||e[`query plan`]||e.queryplan;typeof t==`string`&&a.push(t)}return xe(a,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=Ce(await this.db.execute(O`
18
+ SELECT
19
+ t.relname as table_name,
20
+ i.relname as index_name,
21
+ array_to_string(array_agg(a.attname ORDER BY k.n), ',') as columns,
22
+ ix.indisunique as is_unique,
23
+ ix.indisprimary as is_primary
24
+ FROM pg_index ix
25
+ JOIN pg_class t ON t.oid = ix.indrelid
26
+ JOIN pg_class i ON i.oid = ix.indexrelid
27
+ JOIN pg_namespace n ON n.oid = t.relnamespace
28
+ JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
29
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
30
+ WHERE n.nspname = 'public'
31
+ AND t.relname IN (${O.raw(t)})
32
+ GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
33
+ ORDER BY t.relname, i.relname
34
+ `));return n.length===0?[]:n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:e.is_unique,is_primary:e.is_primary}))}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Te(e,t){return new we(e,t,`postgres`)}function Ee(e,t){let n=t?.toLowerCase()||``;switch(e.toLowerCase()){case`all`:return`Seq Scan`;case`index`:return n.includes(`using index`)?`Index Only Scan`:`Index Scan`;case`range`:return`Index Range Scan`;case`ref`:case`eq_ref`:return`Index Lookup`;case`const`:case`system`:return`Const Lookup`;case`null`:return`No Table`;default:return`MySQL ${e}`}}function De(e,t){let n=[],r=[],i=!1,a=0;for(let t of e){let e=Ee(t.type,t.Extra);t.type.toLowerCase()===`all`&&(i=!0),t.key&&r.push(t.key);let o={type:e,table:t.table||void 0,index:t.key||void 0,estimatedRows:t.rows,estimatedCost:t.rows};if(t.Extra){let e=[];t.Extra.includes(`Using where`)&&e.push(`WHERE filter applied`),t.Extra.includes(`Using filesort`)&&e.push(`Filesort required`),t.Extra.includes(`Using temporary`)&&e.push(`Temporary table required`),t.Extra.includes(`Using join buffer`)&&e.push(`Join buffer used`),e.length>0&&(o.details=e.join(`; `)),o.filter=t.Extra}n.push(o),a+=t.rows}return{operations:n,summary:{database:`mysql`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id select_type table type possible_keys key rows Extra`,...e.map(e=>`${e.id}\t${e.select_type}\t${e.table||`NULL`}\t${e.type}\t${e.possible_keys||`NULL`}\t${e.key||`NULL`}\t${e.rows}\t${e.Extra||``}`)].join(`
35
+ `),sql:t}}var Oe=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`mysql`}async explainQuery(e,t,n){let r=e,i=0;r=r.replace(/\?/g,()=>{let e=t[i++];return e===null?`NULL`:typeof e==`number`?String(e):typeof e==`boolean`?e?`1`:`0`:e instanceof Date?`'${e.toISOString().slice(0,19).replace(`T`,` `)}'`:`'${String(e).replace(/'/g,`''`)}'`});let a=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);let o=await this.db.execute(O.raw(`${a} ${r}`)),s=[];if(Array.isArray(o))for(let e of o)e&&typeof e==`object`&&s.push({id:e.id||1,select_type:e.select_type||`SIMPLE`,table:e.table||null,partitions:e.partitions||null,type:e.type||`ALL`,possible_keys:e.possible_keys||null,key:e.key||null,key_len:e.key_len||null,ref:e.ref||null,rows:Number(e.rows)||0,filtered:Number(e.filtered)||100,Extra:e.Extra||null});return De(s,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(O`
36
+ SELECT
37
+ TABLE_NAME as table_name,
38
+ INDEX_NAME as index_name,
39
+ GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
40
+ CASE WHEN NON_UNIQUE = 0 THEN TRUE ELSE FALSE END as is_unique,
41
+ CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
42
+ FROM INFORMATION_SCHEMA.STATISTICS
43
+ WHERE TABLE_SCHEMA = DATABASE()
44
+ AND LOWER(TABLE_NAME) IN (${O.raw(t)})
45
+ GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
46
+ ORDER BY TABLE_NAME, INDEX_NAME
47
+ `);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function ke(e,t){return new Oe(e,t,`mysql`)}function Ae(e){let t=e.toLowerCase(),n=e.match(/^SCAN\s+(\S+)/i);if(n)return{type:`Seq Scan`,table:n[1]};let r=e.match(/^SEARCH\s+(\S+)\s+USING\s+(?:COVERING\s+)?INDEX\s+(\S+)(?:\s+\((.+)\))?/i);if(r)return{type:`Index Scan`,table:r[1],index:r[2],filter:r[3]};let i=e.match(/^SEARCH\s+(\S+)\s+USING\s+INTEGER\s+PRIMARY\s+KEY\s+\((.+)\)/i);if(i)return{type:`Primary Key Lookup`,table:i[1],filter:i[2]};let a=e.match(/^SEARCH\s+(\S+)/i);return a?{type:`Search`,table:a[1]}:t.includes(`temp b-tree`)?t.includes(`order by`)?{type:`Sort`}:t.includes(`group by`)?{type:`Group`}:t.includes(`distinct`)?{type:`Distinct`}:{type:`Temp B-Tree`}:t.includes(`compound`)?{type:`Compound Query`}:t.includes(`subquery`)?{type:`Subquery`}:t.includes(`co-routine`)?{type:`Coroutine`}:{type:e}}function je(e,t){let n=[],r=[],i=!1,a=new Map;for(let t of e){let e=Ae(t.detail);e.type===`Seq Scan`&&(i=!0),e.index&&r.push(e.index);let o={type:e.type,table:e.table,index:e.index,filter:e.filter,details:t.detail};if(a.set(t.id,o),t.parent===0)n.push(o);else{let e=a.get(t.parent);e?(e.children||=[],e.children.push(o)):n.push(o)}}return{operations:n,summary:{database:`sqlite`,planningTime:void 0,executionTime:void 0,totalCost:void 0,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id parent detail`,...e.map(e=>`${e.id}\t${e.parent}\t${e.detail}`)].join(`
48
+ `),sql:t}}var Me=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}try{if(this.db.all){let n=this.db.all(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}else if(this.db.run)return this.db.run(e);else throw Error(`SQLite database instance must have an all() or run() method`)}catch(e){throw Error(`SQLite execution failed: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`sqlite`}async explainQuery(e,t,n){let r=e,i=0;r=r.replace(/\?/g,()=>{let e=t[i++];return e===null?`NULL`:typeof e==`number`?String(e):typeof e==`boolean`?e?`1`:`0`:e instanceof Date?`'${e.toISOString()}'`:`'${String(e).replace(/'/g,`''`)}'`});let a=`EXPLAIN QUERY PLAN ${r}`,o;if(this.db.all)o=this.db.all(O.raw(a));else throw Error(`SQLite database instance must have an all() method for EXPLAIN`);let s=[];if(Array.isArray(o))for(let e of o)e&&typeof e==`object`&&s.push({id:Number(e.id)||0,parent:Number(e.parent)||0,notused:Number(e.notused)||0,detail:String(e.detail||``)});return je(s,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.all)throw Error(`SQLite database instance must have an all() method`);try{let t=[];for(let n of e){let e=this.db.all(O.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));if(Array.isArray(e))for(let r of e){let e=r.name,i=!!r.unique,a=r.origin,o=this.db.all(O.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)),s=[];if(Array.isArray(o))for(let e of o){let t=e.name;typeof t==`string`&&s.push(t)}t.push({table_name:n.toLowerCase(),index_name:e,columns:s,is_unique:i,is_primary:a===`pk`})}}return t}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Ne(e,t){return new Me(e,t,`sqlite`)}var Pe=class extends Oe{getEngineType(){return`singlestore`}};function Fe(e,t){return new Pe(e,t)}function Ie(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(/^[┌├└│─┐┤┘]+$/.test(t.trim())||/EXPLANATION|QUERY PLAN/i.test(t))continue;let e=Re(t);if(e){(e.type.includes(`SEQ_SCAN`)||e.type.includes(`TABLE_SCAN`))&&(i=!0),e.type.includes(`INDEX_SCAN`)&&e.index&&r.push(e.index),n.length===0&&e.estimatedCost!==void 0&&(a=e.estimatedCost);let s=Le(t);for(;o.length>0&&o[o.length-1].indent>=s;)o.pop();if(o.length===0)n.push(e);else{let t=o[o.length-1].op;t.children||=[],t.children.push(e)}o.push({indent:s,op:e})}}return{operations:n,summary:{database:`duckdb`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
49
+ `),sql:t}}function Le(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function Re(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i))return null;let n=t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);if(!n){let e=t.match(/^FILTER\s+(.+)$/i);return e?{type:`FILTER`,filter:e[1]}:null}let r=n[1].toUpperCase(),i=n[2]||void 0,a=n[3]||void 0,o=n[4]?parseFloat(n[4]):void 0,s=n[5]?parseInt(n[5],10):void 0;if(r===`INDEX_SCAN`){let e=i,t=a;a=e,i=t}return{type:r,table:i,index:a,estimatedRows:s,estimatedCost:o}}var ze=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`duckdb`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);let i=await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g,(e,n)=>{let r=t[parseInt(n,10)-1];return r===null?`NULL`:typeof r==`number`?String(r):typeof r==`boolean`?r?`TRUE`:`FALSE`:r instanceof Date?`'${r.toISOString()}'`:`'${String(r).replace(/'/g,`''`)}'`}))}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain_value||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return Ie(a,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(O`
50
+ SELECT
51
+ table_name,
52
+ index_name,
53
+ LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY index_oid) as columns,
54
+ is_unique,
55
+ is_primary
56
+ FROM duckdb_indexes()
57
+ WHERE LOWER(table_name) IN (${O.raw(t)})
58
+ GROUP BY table_name, index_name, is_unique, is_primary
59
+ ORDER BY table_name, index_name
60
+ `);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:typeof e.columns==`string`?e.columns.split(`,`):[],is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Be(e,t){return new ze(e,t,`duckdb`)}function Ve(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=Ue(t);if(e){(e.type.includes(`TableScan`)||e.type.includes(`SCAN`))&&(i=!0),e.type.includes(`IndexScan`)&&e.index&&r.push(e.index),n.length===0&&e.estimatedCost!==void 0&&(a=e.estimatedCost);let s=He(t);for(;o.length>0&&o[o.length-1].indent>=s;)o.pop();if(o.length===0)n.push(e);else{let t=o[o.length-1].op;t.children||=[],t.children.push(e)}o.push({indent:s,op:e})}}return{operations:n,summary:{database:`databend`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
61
+ `),sql:t}}function He(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function Ue(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||/^(filters|table|estimated rows|output columns|push downs):/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var We=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`databend`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);let i=await this.db.execute(O`${O.raw(r)} ${O.raw(e.replace(/\$(\d+)/g,(e,n)=>{let r=t[parseInt(n,10)-1];return r===null?`NULL`:typeof r==`number`?String(r):typeof r==`boolean`?r?`TRUE`:`FALSE`:r instanceof Date?`'${r.toISOString()}'`:`'${String(r).replace(/'/g,`''`)}'`}))}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return Ve(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function Ge(e,t){return new We(e,t,`databend`)}function Ke(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=Je(t);if(e){(e.type.includes(`TableScan`)||e.type.includes(`SCAN`))&&(i=!0),n.length===0&&e.estimatedCost!==void 0&&(a=e.estimatedCost);let r=qe(t);for(;o.length>0&&o[o.length-1].indent>=r;)o.pop();if(o.length===0)n.push(e);else{let t=o[o.length-1].op;t.children||=[],t.children.push(e)}o.push({indent:r,op:e})}}return{operations:n,summary:{database:`snowflake`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
62
+ `),sql:t}}function qe(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function Je(e){let t=e.replace(/^[\s\d:]*->/,``).trim();if(!t||/^(GlobalStats|partitions|bytes):/i.test(t)||/^\w+=\d+/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Ye=class extends U{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`snowflake`}async explainQuery(e,t,n){if(n?.analyze,!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);let r=await this.db.execute(O`${O.raw(`EXPLAIN`)} ${O.raw(e.replace(/\?/g,()=>{let e=t.shift();return e===null?`NULL`:typeof e==`number`?String(e):typeof e==`boolean`?e?`TRUE`:`FALSE`:e instanceof Date?`'${e.toISOString()}'`:`'${String(e).replace(/'/g,`''`)}'`}))}`),i=[];if(Array.isArray(r)){for(let e of r)if(e&&typeof e==`object`){let t=e.content||e[`QUERY PLAN`]||e.plan||Object.values(e)[0];typeof t==`string`&&i.push(t)}}return Ke(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Xe(e,t){return new Ye(e,t,`snowflake`)}function Ze(e,t,n){if(n)switch(n){case`postgres`:return Te(e,t);case`mysql`:return ke(e,t);case`sqlite`:return Ne(e,t);case`singlestore`:return Fe(e,t);case`duckdb`:return Be(e,t);case`databend`:return Ge(e,t);case`snowflake`:return Xe(e,t)}if(e.all&&e.run)return Ne(e,t);if(e.execute)return Te(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function W(e,t){return typeof e==`string`?t?t.get(e)||(console.warn(`[drizzle-cube] Cannot resolve cube reference '${e}': no cube with that name is registered. Registered cubes: ${Array.from(t.keys()).join(`, `)||`(none)`}. Join will be skipped.`),null):(console.warn(`[drizzle-cube] Cannot resolve string cube reference '${e}': no cube registry provided. Join will be skipped.`),null):typeof e==`function`?e():e}function Qe(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function $e(e,t){if(t)return t;switch(e){case`belongsTo`:return`inner`;case`hasOne`:return`left`;case`hasMany`:return`left`;case`belongsToMany`:return`left`;default:return`left`}}function et(e){return e&&typeof e==`object`?O`${O`${e}`}`:e}function tt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function G(e,t){return et(typeof e==`function`?e(t):e)}function nt(e,t){if(e.relationship!==`belongsToMany`||!e.through)throw Error(`expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration`);let{table:n,sourceKey:r,targetKey:i,securitySql:a}=e.through,o=[];for(let e of r){let t=e.as||N;o.push(t(e.source,e.target))}let s=[];for(let e of i){let t=e.as||N;s.push(t(e.source,e.target))}let c;if(a){let e=a(t);c=Array.isArray(e)?e:[e]}let l=$e(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:l,table:n,condition:F(...o)},{joinType:l,table:n,condition:F(...s)}],junctionSecurityConditions:c}}function K(e){if(`and`in e)return`and:[${e.and.map(K).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(K).sort().join(`,`)}]`;let t=e,n=JSON.stringify(Array.isArray(t.values)?[...t.values].sort():t.values),r=t.dateRange?`:dr:${JSON.stringify(t.dateRange)}`:``;return`${t.member}:${t.operator}:${n}${r}`}function rt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var q=class{cache=new Map;stats={hits:0,misses:0};getOrBuild(e,t){let n=this.cache.get(e);if(n!==void 0)return this.stats.hits++,n;let r=t();return r&&this.cache.set(e,r),this.stats.misses++,r}has(e){return this.cache.has(e)}get(e){let t=this.cache.get(e);return t!==void 0&&this.stats.hits++,t}preload(e){for(let{key:t,sql:n}of e)this.cache.has(t)||this.cache.set(t,n)}set(e,t){this.cache.set(e,t)}getStats(){return{...this.stats,cacheSize:this.cache.size}}clear(){this.cache.clear(),this.stats={hits:0,misses:0}}};function it(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...it(n.and)):`or`in n&&n.or?t.push(...it(n.or)):`member`in n&&t.push(n);return t}function at(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=ot(e),a=`${r}query:${dt(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=dt(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(Y(t)));a+=`:ctx:${e}`}return a}function ot(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?J(e.filters):void 0,timeDimensions:e.timeDimensions?ut(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?Y(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?st(e.funnel):void 0,flow:e.flow?ct(e.flow):void 0,retention:e.retention?lt(e.retention):void 0}}function st(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?J(e.filter):J([e.filter])[0]:void 0,timeToConvert:e.timeToConvert};return`cube`in e&&e.cube&&(t.cube=e.cube),t}),includeTimeMetrics:e.includeTimeMetrics,globalTimeWindow:e.globalTimeWindow}}function ct(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?J(e.startingStep.filter):J([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function lt(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?J(e.cohortFilters):J([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?J(e.activityFilters):J([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function J(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:J(e.and)};if(`or`in e&&e.or)return{or:J(e.or)};let t=e;return{...t,values:t.values?[...t.values].sort():t.values}}).sort((e,t)=>JSON.stringify(e).localeCompare(JSON.stringify(t)))}function ut(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function Y(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Y):Object.keys(e).sort().reduce((t,n)=>(t[n]=Y(e[n]),t),{})}function dt(e){let t=2166136261,n=Math.min(e.length,65536);for(let r=0;r<n;r++)t^=e.charCodeAt(r),t=t*16777619>>>0;return t.toString(16).padStart(8,`0`)}var X=class{constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=G(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof S?r:O`${r}`}buildDateRangeCondition(e,t){if(!t)return null;if(Array.isArray(t)&&t.length>=2){let n=this.normalizeDate(t[0]),r=this.normalizeDate(t[1]);if(!n||!r)return null;if(typeof t[1]==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(t[1].trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return F(L(e,n),R(e,r))}if(typeof t==`string`){let n=this.parseRelativeDateRange(t);if(n){let t,r;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(t=Math.floor(n.start.getTime()/1e3),r=Math.floor(n.end.getTime()/1e3)):(t=n.start.getTime(),r=n.end.getTime()):(t=n.start.toISOString(),r=n.end.toISOString()),F(L(e,t),R(e,r))}let r=this.normalizeDate(t);if(!r)return null;let i=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);o.setUTCHours(23,59,59,999);let s,c;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(s=Math.floor(a.getTime()/1e3),c=Math.floor(o.getTime()/1e3)):(s=a.getTime(),c=o.getTime()):(s=a.toISOString(),c=o.toISOString()),F(L(e,s),R(e,c))}return null}parseRelativeDateRange(e){let t=new Date,n=e.toLowerCase().trim(),r=t.getUTCFullYear(),i=t.getUTCMonth(),a=t.getUTCDate(),o=t.getUTCDay();if(n===`today`){let e=new Date(t);e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`yesterday`){let e=new Date(t);e.setUTCDate(a-1),e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCDate(a-1),n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`this week`){let e=o===0?-6:1-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`this month`)return{start:new Date(Date.UTC(r,i,1,0,0,0,0)),end:new Date(Date.UTC(r,i+1,0,23,59,59,999))};if(n===`this quarter`){let e=Math.floor(i/3);return{start:new Date(Date.UTC(r,e*3,1,0,0,0,0)),end:new Date(Date.UTC(r,e*3+3,0,23,59,59,999))}}if(n===`this year`)return{start:new Date(Date.UTC(r,0,1,0,0,0,0)),end:new Date(Date.UTC(r,11,31,23,59,59,999))};let s=n.match(/^last\s+(\d+)\s+days?$/);if(s){let e=parseInt(s[1],10),n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}let c=n.match(/^last\s+(\d+)\s+weeks?$/);if(c){let e=parseInt(c[1],10)*7,n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last week`){let e=o===0?-13:-6-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last month`)return{start:new Date(Date.UTC(r,i-1,1,0,0,0,0)),end:new Date(Date.UTC(r,i,0,23,59,59,999))};if(n===`last quarter`){let e=Math.floor(i/3),t=e===0?3:e-1,n=e===0?r-1:r;return{start:new Date(Date.UTC(n,t*3,1,0,0,0,0)),end:new Date(Date.UTC(n,t*3+3,0,23,59,59,999))}}if(n===`last year`)return{start:new Date(Date.UTC(r-1,0,1,0,0,0,0)),end:new Date(Date.UTC(r-1,11,31,23,59,59,999))};if(n===`last 12 months`){let e=new Date(Date.UTC(r,i-11,1,0,0,0,0)),n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}let l=n.match(/^last\s+(\d+)\s+months?$/);if(l){let e=parseInt(l[1],10),n=new Date(Date.UTC(r,i-e+1,1,0,0,0,0)),a=new Date(t);return a.setUTCHours(23,59,59,999),{start:n,end:a}}let u=n.match(/^last\s+(\d+)\s+years?$/);if(u){let e=parseInt(u[1],10),n=new Date(Date.UTC(r-e,0,1,0,0,0,0)),i=new Date(t);return i.setUTCHours(23,59,59,999),{start:n,end:i}}return null}normalizeDate(e){if(!e)return null;if(e instanceof Date)return isNaN(e.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(e.getTime()/1e3):e.getTime():e.toISOString();if(typeof e==`number`){let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t/1e3):t:n.toISOString()}if(typeof e==`string`){if(/^\d{4}-\d{2}-\d{2}$/.test(e.trim())){let t=new Date(e+`T00:00:00Z`);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}},ft=class{constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(e,t,n,r,i){if(i!==void 0){if(t!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${t}'. Use explicit date values in the 'values' array for other date operators.`);if(r&&r.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${r.name||`unknown`}' has type '${r.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(e,i)}if(!n||n.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let a=n.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(a.length===0&&![`set`,`notSet`].includes(t))return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=a[0];switch(t){case`equals`:return a.length>1?r?.type===`time`?ne(e,a.map(e=>this.dateTimeBuilder.normalizeDate(e)||e)):ne(e,a):a.length===1?N(e,r?.type===`time`&&this.dateTimeBuilder.normalizeDate(o)||o):this.databaseAdapter.buildBooleanLiteral(!1);case`notEquals`:return a.length>1?re(e,a):a.length===1?P(e,o):null;case`contains`:return this.databaseAdapter.buildStringCondition(e,`contains`,o);case`notContains`:return this.databaseAdapter.buildStringCondition(e,`notContains`,o);case`startsWith`:return this.databaseAdapter.buildStringCondition(e,`startsWith`,o);case`endsWith`:return this.databaseAdapter.buildStringCondition(e,`endsWith`,o);case`gt`:return ee(e,o);case`gte`:return L(e,o);case`lt`:return te(e,o);case`lte`:return R(e,o);case`set`:return ae(e);case`notSet`:return ie(e);case`inDateRange`:if(a.length>=2){let t=this.dateTimeBuilder.normalizeDate(a[0]),r=this.dateTimeBuilder.normalizeDate(a[1]);if(t&&r){let i=n[1];if(typeof i==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(i.trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return F(L(e,t),R(e,r))}}return null;case`beforeDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?te(e,t):null}case`afterDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?ee(e,t):null}case`between`:return a.length>=2?F(L(e,a[0]),R(e,a[1])):null;case`notBetween`:return a.length>=2?I(te(e,a[0]),ee(e,a[1])):null;case`in`:return a.length>0?ne(e,a):null;case`notIn`:return a.length>0?re(e,a):null;case`like`:return this.databaseAdapter.buildStringCondition(e,`like`,o);case`notLike`:return this.databaseAdapter.buildStringCondition(e,`notLike`,o);case`ilike`:return this.databaseAdapter.buildStringCondition(e,`ilike`,o);case`regex`:return this.databaseAdapter.buildStringCondition(e,`regex`,o);case`notRegex`:return this.databaseAdapter.buildStringCondition(e,`notRegex`,o);case`isEmpty`:return I(ie(e),N(e,``));case`isNotEmpty`:return F(ae(e),P(e,``));case`arrayContains`:return this.databaseAdapter.getEngineType()===`postgres`?oe(e,a):null;case`arrayOverlaps`:return this.databaseAdapter.getEngineType()===`postgres`?ce(e,a):null;case`arrayContained`:return this.databaseAdapter.getEngineType()===`postgres`?se(e,a):null;default:return null}}buildLogicalFilter(e,t,n){if(`and`in e&&e.and){let r=e.and.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:F(...r):null}if(`or`in e&&e.or){let r=e.or.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:I(...r):null}return null}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=e,[i,a]=r.member.split(`.`),o=t.get(i);if(!o)return null;let s=o.dimensions?.[a];if(!s)return null;let c=s.type===`time`?G(s.sql,n):typeof s.sql==`function`?s.sql(n):s.sql;return this.buildFilterCondition(c,r.operator,r.values,s,r.dateRange)}},Z=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=new Map,n=[],r=[];for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}for(let[e,r]of t)r.inDegree===0&&n.push(e);for(;n.length>0;){let e=n.shift();r.push(e);for(let[r,i]of t)i.dependencies.has(e)&&(i.inDegree--,i.inDegree===0&&n.push(r))}if(r.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return r}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function pt(t,n){let{cube:r,allCubes:i,resolvedMeasures:a}=n,o=mt(t),s=new Map;for(let t of o){let{originalRef:n,cubeName:o,fieldName:c}=t,l=o||r.name;if(!i.get(l))throw Error(e._(`server.validation.template.substituteTargetCubeNotFound`,{ref:`{${n}}`,cubeName:l}));let u=`${l}.${c}`,d=a.get(u);if(!d)throw Error(e._(`server.validation.template.substituteMeasureNotResolved`,{ref:`{${n}}`,measureName:u}));let f=O`${d()}`;s.set(n,f)}let c=[],l=[],u=0;for(let e of o){let n=`{${e.originalRef}}`,r=t.indexOf(n,u);if(r>=0){c.push(t.substring(u,r));let i=s.get(e.originalRef);i&&l.push(i),u=r+n.length}}if(c.push(t.substring(u)),l.length===0)return O.raw(t);let d=[];for(let e=0;e<c.length;e++)c[e]&&d.push(new x(c[e])),e<l.length&&d.push(l[e]);return O.join(d,O.raw(``))}function mt(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`).map(e=>e.trim());n.push({originalRef:t,cubeName:e,fieldName:r})}else n.push({originalRef:t,cubeName:null,fieldName:t})}return n}function ht(t){let n=[],r=0;for(let i=0;i<t.length;i++)if(t[i]===`{`)r++;else if(t[i]===`}`&&(r--,r<0)){n.push(e._(`server.validation.template.unmatchedClosingBrace`,{position:i}));break}r>0&&n.push(e._(`server.validation.template.unmatchedOpeningBrace`)),/\{\s*\}/.test(t)&&n.push(e._(`server.validation.template.emptyReference`)),/\{[^}]*\{/.test(t)&&n.push(e._(`server.validation.template.nestedBraces`));let i=mt(t);for(let t of i){let r=t.cubeName?`${t.cubeName}.${t.fieldName}`:t.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(r)||n.push(e._(`server.validation.template.invalidMemberReference`,{ref:`{${t.originalRef}}`})),r.split(`.`).length>2&&n.push(e._(`server.validation.template.multipleDots`,{ref:`{${t.originalRef}}`}))}return{isValid:n.length===0,errors:n}}function gt(e,t){let n=mt(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Q=class e{constructor(e){this.databaseAdapter=e}buildResolvedMeasures(t,n,r,i){let a=new Map,o=[],s=[],c=new Set(t),l=new Z(n);for(let e of n.values())l.buildGraph(e);let u=[];for(let r of t){let[t,i]=r.split(`.`),a=n.get(t);if(a&&a.measures&&a.measures[i]){let d=a.measures[i];if(e.isPostAggregationWindow(d)){u.push(r);let n=e.getWindowBaseMeasure(d,t);n&&c.add(n);continue}Z.isCalculatedMeasure(d)?(s.push(r),gt(d.calculatedSql,t).forEach(e=>c.add(e)),l.getAllDependencies(r).forEach(e=>{let[t,r]=e.split(`.`),i=n.get(t);if(i&&i.measures[r]){let e=i.measures[r];Z.isCalculatedMeasure(e)&&gt(e.calculatedSql,t).forEach(e=>c.add(e))}})):o.push(r)}}for(let t of c){let[r,i]=t.split(`.`),a=n.get(r);if(a&&a.measures&&a.measures[i]){let n=a.measures[i];if(e.isPostAggregationWindow(n))continue;Z.isCalculatedMeasure(n)?s.includes(t)||s.push(t):o.includes(t)||o.push(t)}}for(let e of o){let[t,o]=e.split(`.`),s=n.get(t),c=s.measures[o];if(i){let t=i(e,c,s);a.set(e,()=>t)}else a.set(e,()=>this.buildMeasureExpression(c,r,s))}if(s.length>0){let e=l.topologicalSort(s);for(let t of e){let[e,i]=t.split(`.`),o=n.get(e),s=o.measures[i];a.set(t,()=>this.buildCalculatedMeasure(s,o,n,a,r))}}return a}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return pt(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql),{cube:t,allCubes:n,resolvedMeasures:r,queryContext:i})}buildCTECalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name||`unknown`}' missing calculatedSql property`);let a=new Map,o=gt(e.calculatedSql,t.name);for(let e of o){let[t,i]=e.split(`.`),o=r.get(t);if(o&&o.measures[i]){let t=o.measures[i];if(n.measures.includes(e)){let r=O`${O.identifier(n.cteAlias)}.${O.identifier(i)}`,o;switch(t.type){case`count`:case`countDistinct`:case`sum`:o=z(r);break;case`avg`:o=this.databaseAdapter.buildAvg(r);break;case`min`:o=V(r);break;case`max`:o=B(r);break;case`number`:o=z(r);break;default:o=z(r)}a.set(e,()=>o)}}}return this.buildCalculatedMeasure(e,t,r,a,i)}buildHavingMeasureExpression(e,t,n,r,i){if(i&&i.preAggregationCTEs){let a=i.preAggregationCTEs.find(t=>t.cube.name===e);if(a&&a.measures.includes(`${e}.${t}`))if(n.type===`calculated`&&n.calculatedSql){let t=i.primaryCube.name===e?i.primaryCube:i.joinCubes?.find(t=>t.cube.name===e)?.cube;if(!t)throw Error(`Cube ${e} not found in query plan`);let o=new Map([[i.primaryCube.name,i.primaryCube]]);if(i.joinCubes)for(let e of i.joinCubes)o.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(n,t,a,o,r)}else{let e=O`${O.identifier(a.cteAlias)}.${O.identifier(t)}`;switch(n.type){case`count`:case`countDistinct`:case`sum`:return z(e);case`avg`:return this.databaseAdapter.buildAvg(e);case`min`:return V(e);case`max`:return B(e);case`number`:return z(e);default:return z(e)}}}return this.buildMeasureExpression(n,r)}buildMeasureExpression(t,n,r){if(t.type===`calculated`)throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);if(e.isPostAggregationWindow(t))throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!t.sql)throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let i=G(t.sql,n);if(n.ungrouped)return i;if(t.filters&&t.filters.length>0){let e=t.filters.map(e=>{let t=e(n);return t?O`(${t})`:void 0}).filter(Boolean);if(e.length>0){let t=e.length===1?e[0]:F(...e);i=this.databaseAdapter.buildCaseWhen([{when:t,then:i}])}}switch(t.type){case`count`:return de(i);case`countDistinct`:return fe(i);case`sum`:return z(i);case`avg`:return this.databaseAdapter.buildAvg(i);case`min`:return V(i);case`max`:return B(i);case`number`:return i;case`stddev`:case`stddevSamp`:{let e=t.type===`stddevSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildStddev(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),O`MAX(NULL)`):n}case`variance`:case`varianceSamp`:{let e=t.type===`varianceSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildVariance(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),O`MAX(NULL)`):n}case`percentile`:case`median`:case`p95`:case`p99`:{let e;switch(t.type){case`median`:e=50;break;case`p95`:e=95;break;case`p99`:e=99;break;default:e=t.statisticalConfig?.percentile??50}let n=this.databaseAdapter.buildPercentile(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),O`MAX(NULL)`):n}case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:{let e=t.windowConfig||{},a;if(e.partitionBy&&e.partitionBy.length>0&&r){let t=e.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,i=r.dimensions?.[t];return i?G(i.sql,n):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(a=t)}let o;if(e.orderBy&&e.orderBy.length>0&&r){let t=e.orderBy.map(e=>{let t=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=r.dimensions?.[t];if(i)return{field:G(i.sql,n),direction:e.direction};let a=r.measures?.[t];return a&&a.sql?{field:G(a.sql,n),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(o=t)}let s=this.databaseAdapter.buildWindowFunction(t.type,[`rank`,`denseRank`,`rowNumber`].includes(t.type)?null:i,a,o,{offset:e.offset,defaultValue:e.defaultValue,nTile:e.nTile,frame:e.frame});return s===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),O`NULL`):s}default:return de(i)}}static WINDOW_FUNCTION_TYPES=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];static isWindowFunction(t){return e.WINDOW_FUNCTION_TYPES.includes(t)}static categorizeMeasures(t,n){let r=[],i=[];for(let a of t){let[t,o]=a.split(`.`),s=n.get(t);if(s?.measures?.[o]){let t=s.measures[o];e.isWindowFunction(t.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(t,n){let{windowMeasures:r}=e.categorizeMeasures(t,n);return r.length>0}static isPostAggregationWindow(t){return e.isWindowFunction(t.type)&&t.windowConfig?.measure!==void 0}static getWindowBaseMeasure(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}static getDefaultWindowOperation(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}static categorizeForPostAggregation(t,n){let r=[],i=[],a=new Set;for(let o of t){let[t,s]=o.split(`.`),c=n.get(t);if(c?.measures?.[s]){let n=c.measures[s];if(e.isPostAggregationWindow(n)){i.push(o);let r=e.getWindowBaseMeasure(n,t);r&&a.add(r)}else e.isWindowFunction(n.type)||r.push(o)}}return{aggregateMeasures:r,postAggWindowMeasures:i,requiredBaseMeasures:a}}static hasPostAggregationWindows(t,n){let{postAggWindowMeasures:r}=e.categorizeForPostAggregation(t,n);return r.length>0}},_t=class{constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s,l=!1;for(let e of t.measures||[]){let[t,n]=e.split(`.`),r=a.get(t);if(r&&r.measures&&r.measures[n]){let e=r.measures[n];if(this.isAggregateFunctionType(e.type)||e.type===`calculated`){l=!0;break}if(Q.isPostAggregationWindow(e)){let n=Q.getWindowBaseMeasure(e,t);if(n){let[e,t]=n.split(`.`),r=a.get(e)?.measures?.[t];if(r&&this.isAggregateFunctionType(r.type)){l=!0;break}}}}}if(!l&&!c)return[];if(t.dimensions)for(let e of t.dimensions){let[t,o]=e.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let e=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(e){let t=e.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj)i.push(t.sourceColumnObj);else{let t=O`${O.identifier(e.cteAlias)}.${O.identifier(o)}`;i.push(t)}}else{let e=s.dimensions[o],t=G(e.sql,n);i.push(t)}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,o]=e.dimension.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let a=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(a){let t=a.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj){let r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,n);i.push(r)}else{let e=O`${O.identifier(a.cteAlias)}.${O.identifier(o)}`;i.push(e)}}else{let t=s.dimensions[o],r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);i.push(r)}}}return i}},vt=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new X(e),this.filterBuilder=new ft(e,this.dateTimeBuilder),this.groupByBuilder=new _t(this.dateTimeBuilder),this.measureBuilder=new Q(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,n){let r={},i=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,a]=e.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a];r[e]=O`${G(t.sql,n)}`.as(e)}}if(t.measures){let e=this.buildResolvedMeasures(t.measures,i,n);for(let n of t.measures){let t=e.get(n);t&&typeof t==`function`&&(r[n]=O`${t()}`.as(n))}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,a]=e.dimension.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a],i=this.buildTimeDimensionExpression(t.sql,e.granularity,n);r[e.dimension]=O`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=de()),r}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters){if(i&&`member`in e){let[t]=e.member.split(`.`),n=o.has(t);if(r?.preAggregationCTEs&&r.preAggregationCTEs.some(e=>e.cube.name===t))continue;if(n&&i.has(t)&&!s.has(t)){let e=i.get(t);a.push(...e),s.add(t);continue}else if(s.has(t))continue}let t=this.processFilter(e,o,n,`where`,r);t&&a.push(t)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),s=o.get(t);if(s&&s.dimensions[i]&&e.dateRange){if(r?.preAggregationCTEs&&r.preAggregationCTEs.some(e=>e.cube.name===t))continue;if(n.filterCache){let t=rt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){a.push(r);continue}}let o=s.dimensions[i],c=G(o.sql,n),l=this.buildDateRangeCondition(c,e.dateRange);l&&a.push(l)}}return a}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(e,t,n,r,i){if(`and`in e||`or`in e){let a=e;if(a.and){let e=a.and.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?F(...e):null}if(a.or){let e=a.or.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?I(...e):null}}let a=e,[o,s]=a.member.split(`.`),c=t.get(o);if(!c)return null;let l=c.dimensions[s],u=c.measures[s],d=l||u;if(!d)return null;if(r===`where`&&l){if(i?.preAggregationCTEs&&i.preAggregationCTEs.some(e=>e.cube.name===o))return null;let t=l.type===`time`;if(n.filterCache){let t=K(e),r=n.filterCache.get(t);if(r)return r}let r=t?G(l.sql,n):typeof l.sql==`function`?l.sql(n):l.sql;return this.buildFilterCondition(r,a.operator,a.values,d,a.dateRange)}else if(r===`where`&&u)return null;else if(r===`having`&&u){let e=this.buildHavingMeasureExpression(o,s,u,n,i);return this.buildFilterCondition(e,a.operator,a.values,d,a.dateRange)}return null}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(e,t){let n=[],r=t||[...e.measures||[],...e.dimensions||[],...e.timeDimensions?.map(e=>e.dimension)||[]];if(e.order&&Object.keys(e.order).length>0)for(let[t,i]of Object.entries(e.order)){if(!r.includes(t))throw Error(`Cannot order by '${t}': field is not selected in the query`);let e=i===`desc`?ue(O.identifier(t)):le(O.identifier(t));n.push(e)}if(e.timeDimensions&&e.timeDimensions.length>0){let t=new Set(Object.keys(e.order||{})),r=[...e.timeDimensions].sort((e,t)=>e.dimension.localeCompare(t.dimension));for(let e of r)t.has(e.dimension)||n.push(le(O.identifier(e.dimension)))}return n}collectNumericFields(e,t){let n=[],r=e instanceof Map?e:new Map([[e.name,e]]);if(t.measures&&n.push(...t.measures),t.dimensions)for(let e of t.dimensions){let[t,i]=e.split(`.`),a=r.get(t);if(a){let t=a.dimensions[i];t&&t.type===`number`&&n.push(e)}}return n}applyLimitAndOffset(e,t){let n=t.limit;t.offset!==void 0&&t.offset>0&&n===void 0&&(n=50);let r=e;if(n!==void 0){if(n<0)throw Error(`Limit must be non-negative`);r=r.limit(n)}if(t.offset!==void 0){if(t.offset<0)throw Error(`Offset must be non-negative`);r=r.offset(t.offset)}return r}buildFilterConditionPublic(e,t,n,r,i){return this.buildFilterCondition(e,t,n,r,i)}buildLogicalFilter(e,t,n){return this.filterBuilder.buildLogicalFilter(e,t,n)}},yt=class{cubes;connectivityCache=new Map;reverseIndex;constructor(e){this.cubes=e,this.reverseIndex=this.buildReverseIndex()}buildReverseIndex(){let e=new Map;for(let[t,n]of this.cubes)if(n.joins)for(let[,r]of Object.entries(n.joins)){if(r.relationship===`belongsToMany`)continue;let n=W(r.targetCube,this.cubes);if(!n)continue;let i=n.name,a=e.get(i);a||(a=[],e.set(i,a)),a.push({definingCube:t,joinDef:r})}return e}findPath(e,t,n=new Set){if(e===t)return[];let r=this.getCacheKey(e,t,n),i=this.getFromCache(r);if(i!==void 0)return i;let a=[{cube:e,path:[]}],o=new Set([e,...n]);for(;a.length>0;){let{cube:e,path:n}=a.shift(),i=this.cubes.get(e);if(i?.joins)for(let[,s]of Object.entries(i.joins)){let i=W(s.targetCube,this.cubes);if(!i)continue;let c=i.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:s}];if(c===t)return this.setInCache(r,l),l;o.add(c),a.push({cube:c,path:l})}let s=this.reverseIndex.get(e)||[];for(let{definingCube:i,joinDef:c}of s){if(o.has(i))continue;let s=[...n,{fromCube:e,toCube:i,joinDef:c,reversed:!0}];if(i===t)return this.setInCache(r,s),s;o.add(i),a.push({cube:i,path:s})}}return this.setInCache(r,null),null}findPathPreferring(e,t,n,r=new Set){return this.findPathPreferringDetailed(e,t,n,r).selectedPath}findPathPreferringDetailed(e,t,n,r=new Set){let i=this.findAllPaths(e,t,new Set);if(i.length===0){let i=this.findPath(e,t,r),a=i?[{path:i,score:0,usesPreferredJoin:!1,preferredCubesInPath:0,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:0,preferredCubeBonus:0,lengthPenalty:0}}]:[];return{strategy:`fallbackShortest`,preferredCubes:Array.from(n).sort(),selectedIndex:i?0:-1,candidates:a,selectedPath:i}}let a=i.map(i=>{let a=0,o=i.some((n,r)=>r===0?n.reversed?n.joinDef.preferredFor?.includes(e)??!1:n.joinDef.preferredFor?.includes(t)??!1:!1);o&&(a=10);let s=i.filter(e=>n.has(e.toCube)).length,c=s,l=i.length-1;return{path:i,score:a+c-l,usesPreferredJoin:o,preferredCubesInPath:s,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:a,preferredCubeBonus:c,lengthPenalty:l}}});return a.sort((e,t)=>t.score===e.score?e.usesProcessed===t.usesProcessed?e.path.length-t.path.length:e.usesProcessed?-1:1:t.score-e.score),{strategy:`preferred`,preferredCubes:Array.from(n).sort(),selectedIndex:a.length>0?0:-1,candidates:a,selectedPath:a[0]?.path??null}}findAllPaths(e,t,n,r=4){if(e===t)return[[]];let i=[],a=[{cube:e,path:[],visited:new Set([e,...n])}];for(;a.length>0;){let{cube:e,path:n,visited:o}=a.shift();if(n.length>=r)continue;let s=this.cubes.get(e);if(s?.joins)for(let[,r]of Object.entries(s.joins)){let s=W(r.targetCube,this.cubes);if(!s)continue;let c=s.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:r}];if(c===t)i.push(l);else{let e=new Set(o);e.add(c),a.push({cube:c,path:l,visited:e})}}let c=this.reverseIndex.get(e)||[];for(let{definingCube:r,joinDef:s}of c){if(o.has(r))continue;let c=[...n,{fromCube:e,toCube:r,joinDef:s,reversed:!0}];if(r===t)i.push(c);else{let e=new Set(o);e.add(r),a.push({cube:r,path:c,visited:e})}}}return i}canReachAll(e,t){let n=t.filter(t=>t!==e);for(let t of n){let n=this.findForwardOnlyPath(e,t,new Set);if(!n||n.length===0)return!1}return!0}findForwardOnlyPath(e,t,n){if(e===t)return[];let r=[{cube:e,path:[]}],i=new Set([e,...n]);for(;r.length>0;){let{cube:e,path:n}=r.shift(),a=this.cubes.get(e);if(a?.joins)for(let[,o]of Object.entries(a.joins)){let a=W(o.targetCube,this.cubes);if(!a)continue;let s=a.name;if(i.has(s))continue;let c=[...n,{fromCube:e,toCube:s,joinDef:o}];if(s===t)return c;i.add(s),r.push({cube:s,path:c})}}return null}buildJoinCondition(e,t,n){let r=[];for(let i of e.on){let e=t?O`${O.identifier(t)}.${O.identifier(i.source.name)}`:et(i.source),a=n?O`${O.identifier(n)}.${O.identifier(i.target.name)}`:et(i.target),o=i.as||N;r.push(o(e,a))}return F(...r)}getReachableCubes(e){let t=new Set([e]),n=[e];for(;n.length>0;){let e=n.shift(),r=this.cubes.get(e);if(r?.joins)for(let[,e]of Object.entries(r.joins)){let r=W(e.targetCube,this.cubes);if(!r)continue;let i=r.name;t.has(i)||(t.add(i),n.push(i))}let i=this.reverseIndex.get(e)||[];for(let{definingCube:e}of i)t.has(e)||(t.add(e),n.push(e))}return t}getCacheKey(e,t,n){return`${e}:${t}:${Array.from(n).sort().join(`,`)}`}getFromCache(e){let t=this.connectivityCache.get(e);if(t)return t.path}setInCache(e,t){this.connectivityCache.set(e,{path:t})}},bt=class{resolverCache=new WeakMap;getResolver(e){let t=this.resolverCache.get(e);return t||(t=new yt(e),this.resolverCache.set(e,t)),t}analyzeCubeUsage(e){let t=new Set;if(e.measures)for(let n of e.measures){let[e]=n.split(`.`);t.add(e)}if(e.dimensions)for(let n of e.dimensions){let[e]=n.split(`.`);t.add(e)}if(e.timeDimensions)for(let n of e.timeDimensions){let[e]=n.dimension.split(`.`);t.add(e)}if(e.filters)for(let n of e.filters)this.extractCubeNamesFromFilter(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}collectPathHintCubes(e){return this.analyzeCubeUsage(e)}extractCubeNamesFromFilter(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)this.extractCubeNamesFromFilter(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}extractMeasuresFromFilters(e,t){let n=[];if(!e.filters)return n;for(let r of e.filters)this.extractMeasuresFromFilter(r,t,n);return n}extractMeasuresFromFilter(e,t,n){if(`and`in e||`or`in e){let r=e.and||e.or||[];for(let e of r)this.extractMeasuresFromFilter(e,t,n);return}if(`member`in e){let r=e.member,[i,a]=r.split(`.`);i===t.name&&t.measures&&t.measures[a]&&n.push(r)}}choosePrimaryCube(e,t,n){return e.length===1?e[0]:n?this.analyzePrimaryCubeSelection(e,t,n).selectedCube:[...e].sort()[0]}analyzePrimaryCube(e,t,n){return this.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.generateWarnings(e,t)}buildJoinPlan(t,n,r,i,a){let o=this.getResolver(t),s=[],c=new Set([n.name]),l=new Set;if(a.measures)for(let e of a.measures){let[t]=e.split(`.`);l.add(t)}let u=this.collectPathHintCubes(a),d=new Set;for(let e of l)e!==n.name&&this.findHasManyJoinDef(n,e,t)&&d.add(e);let f=r.filter(e=>e!==n.name);for(let r of f){if(c.has(r))continue;let a=new Set([...c].filter(e=>!d.has(e))),l=o.findPathPreferring(n.name,r,u,a);if(!l||l.length===0)throw Error(e._(`server.errors.noJoinPath`,{fromCube:n.name,toCube:r}));for(let{fromCube:n,toCube:r,joinDef:a,reversed:u}of l){if(c.has(r))continue;let l=t.get(r);if(!l)throw Error(e._(`server.errors.cubeNotFound`,{cubeName:r}));let d=u?Qe(a.relationship):a.relationship;if(d===`belongsToMany`&&a.through){let e=nt(a,i.securityContext);s.push({cube:l,alias:`${r.toLowerCase()}_cube`,joinType:e.junctionJoins[1].joinType,joinCondition:e.junctionJoins[1].condition,relationship:`belongsToMany`,junctionTable:{table:a.through.table,alias:`junction_${r.toLowerCase()}`,joinType:e.junctionJoins[0].joinType,joinCondition:e.junctionJoins[0].condition,securitySql:a.through.securitySql,sourceCubeName:n}})}else{let e=o.buildJoinCondition(a,null,null),t=$e(d,a.sqlJoinType);s.push({cube:l,alias:`${r.toLowerCase()}_cube`,joinType:t,joinCondition:e,relationship:d})}c.add(r)}}return s}planPreAggregationCTEs(e,t,n,r,i){let a=[];if(!r.measures||r.measures.length===0)return a;let o=this.computeCTEReasons(t,n,r);if(o.size===0)return a;for(let s of n){let n=o.get(s.cube.name);if(!n)continue;let c=s.cube,l=s.alias,u=r.measures.filter(e=>e.startsWith(c.name+`.`)),d=this.extractMeasuresFromFilters(r,c),f=[...new Set([...u,...d])];if(f.length===0)continue;let p=this.analyzeJoinPathToPrimary(e,t,c.name,i,r),m,h;if(p?.hasIntermediateHasMany&&p.intermediateJoins.length>0)m=p.correctJoinKeys,h=p.intermediateJoins;else{let n=(p?.path&&p.path.length>0?(()=>{let t=p.path[p.path.length-1],n=e.get(t.fromCube);return n?{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}:null})():null)??this.findJoinInfoForCube(e,t,c.name);if(!n)continue;m=n.joinDef.relationship===`belongsToMany`&&n.joinDef.through?n.sourceCube?.name===t.name&&!(`reversed`in n&&n.reversed)?n.joinDef.through.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.joinDef.through.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):`reversed`in n&&n.reversed?n.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):n.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),h=void 0}let g=this.findPropagatingFilters(r,c,e),_=new Map([[c.name,c]]),{aggregateMeasures:v,requiredBaseMeasures:y}=Q.categorizeForPostAggregation(f,_),b=[...new Set([...v,...Array.from(y).filter(e=>e.startsWith(c.name+`.`))])];if(b.length>0){let t=this.expandCalculatedMeasureDependencies(c,b),i=this.findDownstreamJoinKeys(c,r,e);a.push({cube:c,alias:l,cteAlias:`${c.name.toLowerCase()}_agg`,joinKeys:m,measures:t,propagatingFilters:g.length>0?g:void 0,downstreamJoinKeys:i.length>0?i:void 0,intermediateJoins:h&&h.length>0?h:void 0,cteType:`aggregate`,cteReason:n})}}return a}findJoinInfoToCube(e,t){for(let[,n]of e)if(n.name!==t&&n.joins)for(let[,r]of Object.entries(n.joins)){let i=W(r.targetCube,e);if(i&&i.name===t)return{sourceCube:n,joinDef:r}}return null}analyzeJoinPathToPrimary(e,t,n,r,i){let a=this.getResolver(e),o=this.collectPathHintCubes(i),s=o.size>0?a.findPathPreferring(t.name,n,o,new Set):a.findPath(t.name,n);if(!s||s.length===0)return null;let c=s.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!c.slice(0,-1).some(e=>(e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:c,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let l=[];for(let t=0;t<c.length-1;t++){let n=c[t],i=c[t+1],a=e.get(n.toCube);if(!a)continue;let o=a.sql(r).where,s=i.joinDef.on[0]?.source,u=n.joinDef.on[0]?.target;l.push({cube:a,joinDef:i.joinDef,securityFilter:o,primaryJoinColumn:u,cteJoinColumn:s})}return{path:c,hasIntermediateHasMany:!0,intermediateJoins:l,correctJoinKeys:c[0].joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}}computeCTEReasons(e,t,n){let r=new Map,i=new Set,a=new Set,o=new Set;if(n.measures)for(let e of n.measures){let[t]=e.split(`.`);o.add(t)}for(let e of t)e.relationship===`hasMany`||e.relationship===`belongsToMany`?i.add(e.cube.name):e.relationship===`belongsTo`&&o.has(e.cube.name)&&a.add(e.cube.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.cube.name)&&(i.has(e.cube.name)?r.set(e.cube.name,`hasMany`):(a.has(e.cube.name)||i.size>0)&&r.set(e.cube.name,`fanOutPrevention`));return r}findJoinInfoForCube(e,t,n){if(t.joins)for(let[,r]of Object.entries(t.joins)){let i=W(r.targetCube,e);if(i&&i.name===n)return{sourceCube:t,joinDef:r}}let r=e.get(n);if(r?.joins)for(let[,n]of Object.entries(r.joins)){let i=W(n.targetCube,e);if(i&&i.name===t.name)return{sourceCube:r,joinDef:n,reversed:!0}}for(let[,r]of e)if(!(r.name===t.name||r.name===n)&&r.joins)for(let[,t]of Object.entries(r.joins)){let i=W(t.targetCube,e);if(i&&i.name===n)return{sourceCube:r,joinDef:t}}return null}findDownstreamJoinKeys(e,t,n){let r=[],i=new Set;if(t.dimensions)for(let n of t.dimensions){let[t]=n.split(`.`);t!==e.name&&i.add(t)}if(t.timeDimensions)for(let n of t.timeDimensions){let[t]=n.dimension.split(`.`);t!==e.name&&i.add(t)}if(t.filters){for(let e of t.filters)this.extractCubeNamesFromFilter(e,i);i.delete(e.name)}if(e.joins)for(let[,t]of Object.entries(e.joins)){let e=W(t.targetCube,n);if(!e)continue;let a=e.name;if(i.has(a)){let e;e=t.relationship===`belongsToMany`&&t.through?t.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):t.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),r.push({targetCubeName:a,joinKeys:e})}}return r}expandCalculatedMeasureDependencies(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();if(n.has(t))continue;n.add(t);let[,i]=t.split(`.`);if(!e.measures||!e.measures[i])continue;let a=e.measures[i];if(a.type===`calculated`&&a.calculatedSql){let t=this.extractDependenciesFromTemplate(a.calculatedSql,e.name);for(let e of t)n.has(e)||r.push(e)}}return Array.from(n)}extractDependenciesFromTemplate(e,t){if(e.length>1e3)return[];let n=e.matchAll(/\{([^}]+)\}/g),r=[];for(let e of n){let n=e[1].trim();n.includes(`.`)?r.push(n):r.push(`${t}.${n}`)}return r}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=W(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=new Set;if(this.extractFilterCubeNamesToSet(e.filters,i),e.timeDimensions){for(let t of e.timeDimensions)if(t.dateRange){let[e]=t.dimension.split(`.`);e&&i.add(e)}}for(let a of i){if(a===t.name)continue;let i=n.get(a);if(i?.joins)for(let[,o]of Object.entries(i.joins)){let s=W(o.targetCube,n);if(s&&s.name===t.name&&o.relationship===`hasMany`){let t=this.extractFiltersForCube(e.filters,a),n=this.extractTimeDimensionFiltersForCube(e,a),s=[...t,...n];s.length>0&&o.on.length>0&&r.push({sourceCube:i,filters:s,joinConditions:o.on.map(e=>({source:e.source,target:e.target}))})}}}return r}extractFilterCubeNamesToSet(e,t){for(let n of e){if(`and`in n||`or`in n){let e=n.and||n.or||[];this.extractFilterCubeNamesToSet(e,t);continue}if(`member`in n){let[e]=n.member.split(`.`);e&&t.add(e)}}}extractFiltersForCube(e,t){let n=[];for(let r of e){if(`and`in r){let e=this.extractFiltersForCube(r.and||[],t);e.length>0&&n.push({and:e});continue}if(`or`in r){let e=r.or||[];if(this.allFiltersFromCube(e,t)){let r=this.extractFiltersForCube(e,t);r.length>0&&n.push({or:r})}continue}if(`member`in r){let[e]=r.member.split(`.`);e===t&&n.push(r)}}return n}allFiltersFromCube(e,t){for(let n of e){if(`and`in n){if(!this.allFiltersFromCube(n.and||[],t))return!1;continue}if(`or`in n){if(!this.allFiltersFromCube(n.or||[],t))return!1;continue}if(`member`in n){let[e]=n.member.split(`.`);if(e!==t)return!1}}return!0}extractTimeDimensionFiltersForCube(e,t){let n=[];if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e===t&&r.dateRange&&n.push({member:r.dimension,operator:`inDateRange`,values:Array.isArray(r.dateRange)?r.dateRange:[r.dateRange]})}return n}analyzePrimaryCubeSelection(e,t,n){if(e.length===1)return{selectedCube:e[0],reason:`single_cube`,explanation:`Only one cube is used in this query`};let r=[],i=(t.dimensions||[]).map(e=>e.split(`.`)[0]),a=new Map;for(let e of i)a.set(e,(a.get(e)||0)+1);let o=this.getResolver(n);for(let t of e){let i=n.get(t),s=a.get(t)||0,c=i?.joins?Object.keys(i.joins).length:0,l=o.canReachAll(t,e);r.push({cubeName:t,dimensionCount:s,joinCount:c,canReachAll:l})}if(t.dimensions&&t.dimensions.length>0){let e=Math.max(...r.map(e=>e.dimensionCount));if(e>0){let t=r.filter(t=>t.dimensionCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of t)if(e.canReachAll)return{selectedCube:e.cubeName,reason:`most_dimensions`,explanation:`Selected because it has ${e.dimensionCount} dimension${e.dimensionCount===1?``:`s`} in the query (defines the analytical grain)`,candidates:r}}}let s=r.filter(e=>e.canReachAll);if(s.length>0){let e=Math.max(...s.map(e=>e.joinCount)),t=s.filter(t=>t.joinCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:t.cubeName,reason:`most_connected`,explanation:`Selected because it has ${t.joinCount} join relationship${t.joinCount===1?``:`s`} and can reach all other cubes`,candidates:r}}return{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}analyzeJoinPath(e,t,n,r){let i=this.getResolver(e),a=r?this.collectPathHintCubes(r):new Set,o=a.size>0?i.findPathPreferringDetailed(t,n,a):null,s=o?.selectedPath??i.findPath(t,n),c=[t];if(s)for(let e of s)c.push(e.toCube);if(!s||s.length===0)return{targetCube:n,pathFound:!1,error:`No join path found from '${t}' to '${n}'. Ensure the target cube has a relationship defined (belongsTo, hasOne, hasMany, or belongsToMany).`,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)};let l=this.convertInternalPathToJoinPathSteps(s);return{targetCube:n,pathFound:!0,path:l,pathLength:l.length,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)}}convertInternalPathToJoinPathSteps(e){return e.map(e=>{let t=e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship,n=$e(t,e.joinDef.sqlJoinType),r=e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name})),i={fromCube:e.fromCube,toCube:e.toCube,relationship:t,joinType:n,joinColumns:r};if(e.reversed&&(i.reversed=!0),t===`belongsToMany`&&e.joinDef.through){let t=e.joinDef.through;i.junctionTable={tableName:t.table[Symbol.for(`drizzle:Name`)]||`junction_table`,sourceColumns:t.sourceKey.map(e=>e.target.name),targetColumns:t.targetKey.map(e=>e.source.name)}}return i})}buildJoinPathSelectionAnalysis(e){if(!e)return{strategy:`shortest`};let t=e.candidates.map((e,t)=>this.mapPreferredCandidate(e,t+1));return{strategy:e.strategy,preferredCubes:e.preferredCubes,selectedRank:e.selectedIndex>=0?e.selectedIndex+1:void 0,selectedScore:e.selectedIndex>=0?e.candidates[e.selectedIndex]?.score:void 0,candidates:t}}mapPreferredCandidate(e,t){return{rank:t,score:e.score,usesPreferredJoin:e.usesPreferredJoin,preferredCubesInPath:e.preferredCubesInPath,usesProcessed:e.usesProcessed,scoreBreakdown:e.scoreBreakdown,path:this.convertInternalPathToJoinPathSteps(e.path)}}generateWarnings(e,t){let n=[],r=this.checkFanOutNoDimensions(e,t);return r&&n.push(r),n}checkFanOutNoDimensions(e,t){if(!t||t.length===0||!e.measures||e.measures.length===0)return null;let n=new Set;for(let t of e.measures){let[e]=t.split(`.`);n.add(e)}if(n.size<2)return null;let r=e.dimensions&&e.dimensions.length>0,i=e.timeDimensions?.some(e=>e.granularity);return r||i?null:{code:`FAN_OUT_NO_DIMENSIONS`,message:`Query combines measures from multiple cubes with hasMany relationships but has no dimensions. Results are aggregated at the join key level, which may produce unexpected totals.`,severity:`warning`,cubes:[...n].sort(),measures:e.measures,suggestion:`Add a dimension to see per-group breakdowns, or add a time dimension with granularity.`}}};function xt(e,t){if(!t.joins)return e;for(let n of t.joins)switch(n.type||`left`){case`left`:e=e.leftJoin(n.table,n.on);break;case`inner`:e=e.innerJoin(n.table,n.on);break;case`right`:e=e.rightJoin(n.table,n.on);break;case`full`:e=e.fullJoin(n.table,n.on);break}return e}var St=class{constructor(e){this.queryBuilder=e}buildPreAggregationCTE(e,t,n,r,i){let a=e.cube,o=a.sql(n),s=e.intermediateJoins&&e.intermediateJoins.length>0,c={};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0].primaryJoinColumn;if(t){let e=t.name;c[e]=t}}else for(let t of e.joinKeys)if(t.targetColumnObj){c[t.targetColumn]=t.targetColumnObj;for(let[e,n]of Object.entries(a.dimensions||{}))n.sql===t.targetColumnObj&&e!==t.targetColumn&&(c[e]=O`${t.targetColumnObj}`.as(e))}if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&(c[e.sourceColumn]=e.sourceColumnObj);let l=a.name,u=new Map([[l,a]]),d=this.queryBuilder.buildResolvedMeasures(e.measures,u,n);for(let t of e.measures){let[,e]=t.split(`.`),n=d.get(t);n&&(c[e]=O`${n()}`.as(e))}if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r];c[r]=O`${this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n)}`.as(r)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r];c[r]=O`${this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n)}`.as(r)}}if(Object.keys(c).length===0)return null;let f=n.db.select(c).from(o.from);if(f=xt(f,o),s&&e.intermediateJoins){let t=[...e.intermediateJoins].reverse();for(let e of t){let t=e.cube.sql(n),r=[N(e.cteJoinColumn,e.joinDef.on[0]?.target)];e.securityFilter&&r.push(e.securityFilter),f=f.leftJoin(t.from,F(...r))}}let p=r?{...r,preAggregationCTEs:r.preAggregationCTEs?.filter(e=>e.cube.name!==a.name)}:void 0,m=this.queryBuilder.buildWhereConditions(a,t,n,p,i),h=[];if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]&&e.dateRange){let t=a.dimensions[r],i=this.queryBuilder.buildMeasureExpression({sql:t.sql,type:`number`},n),o=this.queryBuilder.buildDateRangeCondition(i,e.dateRange);o&&h.push(o)}}if(t.filters){for(let e of t.filters)if(!(`and`in e)&&!(`or`in e)&&`member`in e&&`operator`in e){let t=e,[r,i]=t.member.split(`.`);if(r===l&&a.dimensions&&a.dimensions[i]){let e=a.dimensions[i];if(t.operator===`inDateRange`){let r=this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n),i=this.queryBuilder.buildDateRangeCondition(r,t.values);i&&h.push(i)}}}}if(e.propagatingFilters&&e.propagatingFilters.length>0)for(let t of e.propagatingFilters){let e=this.buildPropagatingFilterSubquery(t,n);e&&h.push(e)}let g=[];if(o.where&&g.push(o.where),g.push(...m,...h),g.length>0){let e=g.length===1?g[0]:F(...g);f=f.where(e)}let _=[],v=new Set,y=e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!v.has(t)?(v.add(t),_.push(e)):t||_.push(e)};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0];t.primaryJoinColumn&&y(t.primaryJoinColumn)}else for(let t of e.joinKeys)t.targetColumnObj&&y(t.targetColumnObj);if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&y(e.sourceColumnObj);if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r],t=G(e.sql,n);_.push(t)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r],i=this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);_.push(i)}}return _.length>0&&(f=f.groupBy(..._)),n.db.$with(e.cteAlias).as(f)}buildCTEJoinCondition(e,t,n){let r=n.preAggregationCTEs?.find(t=>t.cube.name===e.cube.name);if(!r)throw Error(`CTE info not found for cube ${e.cube.name}`);let i=[];if(r.intermediateJoins&&r.intermediateJoins.length>0){let e=r.intermediateJoins[0],a=this.resolveCTEJoinSourceColumn(r.joinKeys[0],r,n),o=O`${O.identifier(t)}.${O.identifier(e.primaryJoinColumn.name)}`;i.push(N(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=O`${O.identifier(t)}.${O.identifier(e.targetColumn)}`;i.push(N(a,o))}return i.length===1?i[0]:F(...i)}resolveCTEJoinSourceColumn(e,t,n){if(!e)throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);let r=e.sourceColumnObj||O.identifier(e.sourceColumn);if(!e.sourceColumnObj||!n.preAggregationCTEs)return r;for(let r of n.preAggregationCTEs)if(r.cube.name!==t.cube.name){for(let[t,n]of Object.entries(r.cube.dimensions||{}))if(typeof n.sql!=`function`&&n.sql===e.sourceColumnObj)return O`${O.identifier(r.cteAlias)}.${O.identifier(t)}`}return r}buildPropagatingFilterSubquery(e,t){let n=e.sourceCube,r=n.sql(t),i=[];if(r.where&&i.push(r.where),e.preBuiltFilterSQL)i.push(e.preBuiltFilterSQL);else{let r={filters:e.filters},a=new Map([[n.name,n]]),o=this.queryBuilder.buildWhereConditions(a,r,t);i.push(...o)}if(i.length===0)return null;let a=i.length===1?i[0]:F(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0],i=t.db.select({pk:e}).from(r.from);return i=xt(i,r),i=i.where(a),O`${n} IN ${i}`}else{let e=F(...o.map(e=>N(e.source,e.target)),a),n=t.db.select({one:O`1`}).from(r.from);return n=xt(n,r),n=n.where(e),O`EXISTS ${n}`}}};function Ct(e){let t=new Date,n=e.toLowerCase().trim(),r=t.getUTCFullYear(),i=t.getUTCMonth(),a=t.getUTCDate(),o=t.getUTCDay();if(n===`today`){let e=new Date(t);e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`yesterday`){let e=new Date(t);e.setUTCDate(a-1),e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCDate(a-1),n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`this week`){let e=o===0?-6:1-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`this month`)return{start:new Date(Date.UTC(r,i,1,0,0,0,0)),end:new Date(Date.UTC(r,i+1,0,23,59,59,999))};if(n===`this quarter`){let e=Math.floor(i/3);return{start:new Date(Date.UTC(r,e*3,1,0,0,0,0)),end:new Date(Date.UTC(r,e*3+3,0,23,59,59,999))}}if(n===`this year`)return{start:new Date(Date.UTC(r,0,1,0,0,0,0)),end:new Date(Date.UTC(r,11,31,23,59,59,999))};let s=n.match(/^last\s+(\d+)\s+days?$/);if(s){let e=parseInt(s[1],10),n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}let c=n.match(/^last\s+(\d+)\s+weeks?$/);if(c){let e=parseInt(c[1],10)*7,n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last week`){let e=o===0?-13:-6-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last month`)return{start:new Date(Date.UTC(r,i-1,1,0,0,0,0)),end:new Date(Date.UTC(r,i,0,23,59,59,999))};if(n===`last quarter`){let e=Math.floor(i/3),t=e===0?3:e-1,n=e===0?r-1:r;return{start:new Date(Date.UTC(n,t*3,1,0,0,0,0)),end:new Date(Date.UTC(n,t*3+3,0,23,59,59,999))}}if(n===`last year`)return{start:new Date(Date.UTC(r-1,0,1,0,0,0,0)),end:new Date(Date.UTC(r-1,11,31,23,59,59,999))};if(n===`last 12 months`){let e=new Date(Date.UTC(r,i-11,1,0,0,0,0)),n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}let l=n.match(/^last\s+(\d+)\s+months?$/);if(l){let e=parseInt(l[1],10),n=new Date(Date.UTC(r,i-e+1,1,0,0,0,0)),a=new Date(t);return a.setUTCHours(23,59,59,999),{start:n,end:a}}let u=n.match(/^last\s+(\d+)\s+years?$/);if(u){let e=parseInt(u[1],10),n=new Date(Date.UTC(r-e,0,1,0,0,0,0)),i=new Date(t);return i.setUTCHours(23,59,59,999),{start:n,end:i}}return null}function wt(e,t,n){let r=[],i=Tt(new Date(e),n),a=Tt(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=Et(i,n);return r}function Tt(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCMilliseconds(0);break;case`minute`:n.setUTCSeconds(0,0);break;case`hour`:n.setUTCMinutes(0,0,0);break;case`day`:n.setUTCHours(0,0,0,0);break;case`week`:{let e=n.getUTCDay(),t=e===0?6:e-1;n.setUTCDate(n.getUTCDate()-t),n.setUTCHours(0,0,0,0);break}case`month`:n.setUTCDate(1),n.setUTCHours(0,0,0,0);break;case`quarter`:{let e=Math.floor(n.getUTCMonth()/3)*3;n.setUTCMonth(e,1),n.setUTCHours(0,0,0,0);break}case`year`:n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0);break}return n}function Et(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCSeconds(n.getUTCSeconds()+1);break;case`minute`:n.setUTCMinutes(n.getUTCMinutes()+1);break;case`hour`:n.setUTCHours(n.getUTCHours()+1);break;case`day`:n.setUTCDate(n.getUTCDate()+1);break;case`week`:n.setUTCDate(n.getUTCDate()+7);break;case`month`:n.setUTCMonth(n.getUTCMonth()+1);break;case`quarter`:n.setUTCMonth(n.getUTCMonth()+3);break;case`year`:n.setUTCFullYear(n.getUTCFullYear()+1);break}return n}function Dt(e){if(e instanceof Date)return e.toISOString();if(typeof e==`string`){let t=new Date(e);if(!isNaN(t.getTime()))return t.toISOString()}return String(e)}function Ot(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function kt(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,fillValue:a,measures:o,dimensions:s}=t,c=wt(i[0],i[1],r);if(c.length===0)return e;let l=new Map;for(let t of e){let e=Ot(t,s),r=Dt(t[n]);l.has(e)||l.set(e,new Map),l.get(e).set(r,t)}l.size===0&&s.length===0&&l.set(`__all__`,new Map);let u=[];for(let[e,t]of l){let e=t.size>0?t.values().next().value:null;for(let r of c){let i=r.toISOString(),c=t.get(i);if(c)u.push(c);else{let t={[n]:i};if(e)for(let n of s)t[n]=e[n];for(let e of o)t[e]=a;u.push(t)}}}return u}function At(e){if(!e)return null;if(Array.isArray(e)){if(e.length<2)return null;let t=new Date(e[0]),n=new Date(e[1]);return isNaN(t.getTime())||isNaN(n.getTime())?null:[t,n]}let t=Ct(e);if(t)return[t.start,t.end];let n=new Date(e);return isNaN(n.getTime())?null:[n,n]}function jt(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let n=e.fillMissingDates!==!1,r=!!e.granularity,i=e.dateRange||Mt(e.dimension,t.filters);return n&&r&&i});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let r=At(e.dateRange)||Nt(e.dimension,t.filters);if(!r)continue;let a={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:i,measures:n,dimensions:o};s=kt(s,a)}return s}function Mt(e,t){if(!t)return null;for(let n of t){if(`member`in n&&`operator`in n&&n.member===e&&n.operator===`inDateRange`)return n;if(`and`in n&&n.and){let t=Mt(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=Mt(e,n.or);if(t)return t}}return null}function Nt(e,t){let n=Mt(e,t);if(!n)return null;if(n.dateRange){let e=At(n.dateRange);if(e)return e}let r=n.values;if(!r||r.length===0)return null;if(r.length===1&&typeof r[0]==`string`){let e=Ct(r[0]);return e?[e.start,e.end]:At(r)}return r.length>=2?At(r):null}var Pt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new X(e)}hasComparison(e){return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)??!1}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/(1e3*60));case`hour`:return Math.floor((a-i)/(1e3*60*60));case`day`:return Math.floor((a-i)/(1e3*60*60*24));case`week`:return Math.floor((a-i)/(1e3*60*60*24*7));case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/(1e3*60*60*24))}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},Ft=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new X(e),this.filterBuilder=new ft(e,this.dateTimeBuilder)}hasFunnel(e){return e.funnel!==void 0&&e.funnel.steps.length>=2}validateConfig(t,n){let r=[];if(t.steps.length<2&&r.push(e._(`server.validation.funnel.minSteps`)),typeof t.bindingKey==`string`){let[i,a]=t.bindingKey.split(`.`);if(!i||!a)r.push(e._(`server.validation.funnel.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.funnel.bindingKeyCubeNotFound`,{cubeName:i}))}}else if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t)r.push(e._(`server.validation.funnel.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));else{let[,n]=i.dimension.split(`.`);t.dimensions?.[n]||r.push(e._(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:n,cubeName:i.cube}))}}if(typeof t.timeDimension==`string`){let[i,a]=t.timeDimension.split(`.`);if(!i||!a)r.push(e._(`server.validation.funnel.invalidTimeDimFormat`,{timeDimension:t.timeDimension}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.funnel.timeDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.funnel.timeDimCubeNotFound`,{cubeName:i}))}}for(let i=0;i<t.steps.length;i++){let a=t.steps[i];if(a.name||r.push(e._(`server.validation.funnel.stepMustHaveName`,{step:i})),`cube`in a&&a.cube&&(n.get(a.cube)||r.push(e._(`server.validation.funnel.stepCubeNotFound`,{step:i,cube:a.cube}))),a.filter){let o;`cube`in a&&a.cube?o=a.cube:typeof t.bindingKey==`string`&&([o]=t.bindingKey.split(`.`));let s=o?new yt(n):null,c=Array.isArray(a.filter)?a.filter:[a.filter];for(let t of c)if(`member`in t){let[a,c]=t.member.split(`.`),l=n.get(a);if(!l)r.push(e._(`server.validation.funnel.stepFilterCubeNotFound`,{step:i,cubeName:a}));else if(l.dimensions?.[c]||(l.measures?.[c]?r.push(e._(`server.validation.funnel.stepFilterIsMeasure`,{step:i,member:`${a}.${c}`})):r.push(e._(`server.validation.funnel.stepFilterMemberNotFound`,{step:i,field:c,cubeName:a}))),o&&a!==o&&s){let t=s.findPath(o,a);(!t||t.length===0)&&r.push(e._(`server.validation.funnel.stepFilterNoJoinPath`,{step:i,member:`${a}.${c}`,stepCube:o}))}}}a.timeToConvert&&i>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(a.timeToConvert)||r.push(e._(`server.validation.funnel.stepTimeToConvertFormat`,{step:i,value:a.timeToConvert})))}return{isValid:r.length===0,errors:r}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&(c.avgSecondsToConvert=n[`step_${e}_avg_seconds`]===null?null:Number(n[`step_${e}_avg_seconds`]),c.minSecondsToConvert=n[`step_${e}_min_seconds`]===null?null:Number(n[`step_${e}_min_seconds`]),c.maxSecondsToConvert=n[`step_${e}_max_seconds`]===null?null:Number(n[`step_${e}_max_seconds`]),n[`step_${e}_median_seconds`]!==void 0&&(c.medianSecondsToConvert=n[`step_${e}_median_seconds`]===null?null:Number(n[`step_${e}_median_seconds`])),n[`step_${e}_p90_seconds`]!==void 0&&(c.p90SecondsToConvert=n[`step_${e}_p90_seconds`]===null?null:Number(n[`step_${e}_p90_seconds`]))),r.push(c)}return r}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(`type`in e&&`filters`in e){let t=e;for(let e of t.filters||[])r(e)}else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(e,t,n){let r=new yt(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(t,n,r){if(`cube`in t&&t.cube){let n=r.get(t.cube);if(!n)throw Error(e._(`server.errors.funnel.cubeNotFoundForStep`,{cube:t.cube}));return n}if(typeof n.bindingKey==`string`){let[t]=n.bindingKey.split(`.`),i=r.get(t);if(!i)throw Error(e._(`server.errors.funnel.cubeNotFoundForBindingKey`,{bindingKey:n.bindingKey}));return i}throw Error(e._(`server.errors.funnel.cannotResolveCubeForStep`))}resolveBindingKey(t,n,r){if(typeof t.bindingKey==`string`){let[,i]=t.bindingKey.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e._(`server.errors.funnel.bindingKeyDimNotFound`,{bindingKey:t.bindingKey}));return G(a.sql,r)}let i=t.bindingKey.find(e=>e.cube===n.name);if(!i)throw Error(e._(`server.errors.funnel.noBindingKeyMapping`,{cubeName:n.name}));let[,a]=i.dimension.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e._(`server.errors.funnel.bindingKeyMappingDimNotFound`,{dimension:i.dimension}));return G(o.sql,r)}resolveTimeDimension(t,n,r){if(typeof t.timeDimension==`string`){let[,i]=t.timeDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e._(`server.errors.funnel.timeDimNotFound`,{timeDimension:t.timeDimension}));return G(a.sql,r)}let i=t.timeDimension.find(e=>e.cube===n.name);if(!i)throw Error(e._(`server.errors.funnel.noTimeDimMapping`,{cubeName:n.name}));let[,a]=i.dimension.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e._(`server.errors.funnel.timeDimMappingNotFound`,{dimension:i.dimension}));return G(o.sql,r)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=`type`in e&&`filters`in e&&(e.type===`and`||e.type===`or`);if(i||a){let i=[],o;if(a){let a=e;o=a.type===`and`;for(let e of a.filters||[]){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}else{let a=e;o=`and`in a&&!!a.and;let s=a.and||a.or||[];for(let e of s){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}return i.length===0?null:i.length===1?i[0]:o?F(...i):O`(${O.join(i,O` OR `)})`}let o=e,[s,c]=o.member.split(`.`),l=o.dateRange!==void 0;if(o.operator!==`set`&&o.operator!==`notSet`&&!l&&(!o.values||o.values.length===0||o.values[0]===void 0||o.values[0]===``))return null;let u=n.get(s);if(!u)return null;if(s!==t.name){let e=new yt(n).findPath(t.name,s);if(!e||e.length===0)return console.warn(`Funnel filter: Cannot filter by '${String(s).replace(/\n|\r/g,``)}.${String(c).replace(/\n|\r/g,``)}' in step using '${String(t.name).replace(/\n|\r/g,``)}'. No join path found. Filter will be skipped.`),null}let d=u.dimensions?.[c];if(!d)return null;let f=d.type===`time`?G(d.sql,r):typeof d.sql==`function`?d.sql(r):d.sql;return this.filterBuilder.buildFilterCondition(f,o.operator,o.values||[],d,o.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(e,t){let n=`step_${e.index}`,r=e.cube.sql(t),i=[];r.where&&i.push(r.where),i.push(...e.filterConditions);let a=t.db.select({binding_key:O`${e.bindingKeyExpr}`.as(`binding_key`),step_time:O`MIN(${e.timeExpr})`.as(`step_time`)}).from(r.from);if(a=this.addCrossJoinsToQuery(a,e,t,i),i.length>0){let e=i.length===1?i[0]:F(...i);a=a.where(e)}return a=a.groupBy(e.bindingKeyExpr),t.db.$with(n).as(a)}buildSubsequentStepCTE(e,t,n){let r=`step_${e.index}`,i=`step_${e.index-1}`,a=e.cube.sql(t),o=[];a.where&&o.push(a.where),o.push(...e.filterConditions);let s=O`${O.identifier(i)}.step_time`,c=O`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=O`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:O`${e.bindingKeyExpr}`.as(`binding_key`),step_time:O`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,O`${e.bindingKeyExpr} = ${O.identifier(i)}.binding_key`);if(l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0){let e=o.length===1?o[0]:F(...o);l=l.where(e)}return l=l.groupBy(e.bindingKeyExpr),t.db.$with(r).as(l)}addCrossJoinsToQuery(e,t,n,r){if(t.joinedCubes.length===0)return e;for(let i of t.joinedCubes)for(let t of i.joinPath){let a=t.joinDef,o=[];for(let e of a.on)e.as?o.push(e.as(e.source,e.target)):o.push(N(e.source,e.target));let s=o.length===1?o[0]:F(...o),c=i.cube.sql(n);e=e.leftJoin(c.from,s),c.where&&r.push(c.where)}return e}buildFunnelResultsCTE(e,t,n,r){let i={binding_key:O`s0.binding_key`,step_0_time:O`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=O`s${O.raw(String(e))}.step_time`;let a=O`${O.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=O`${a}
63
+ LEFT JOIN ${O.identifier(`step_${e}`)} s${O.raw(String(e))} ON s0.binding_key = s${O.raw(String(e))}.binding_key`;let o=Object.entries(i).map(([e,t])=>O`${t} AS ${O.identifier(e)}`),s=O`SELECT ${O.join(o,O`, `)} FROM ${a}`;return r.db.$with(`funnel_joined`).as(s)}buildAggregationCTE(e,t,n,r,i){let a={};a.step_0_count=O`COUNT(*)`.as(`step_0_count`);for(let e=1;e<n.length;e++)a[`step_${e}_count`]=O`COUNT(${O.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(r.includeTimeMetrics)for(let e=1;e<n.length;e++){let t=O.identifier(`step_${e}_time`),n=O.identifier(`step_${e-1}_time`),r=this.databaseAdapter.buildTimeDifferenceSeconds(O`${t}`,O`${n}`),i=O`${t} IS NOT NULL`;if(a[`step_${e}_avg_seconds`]=this.databaseAdapter.buildConditionalAggregation(`avg`,r,i).as(`step_${e}_avg_seconds`),a[`step_${e}_min_seconds`]=this.databaseAdapter.buildConditionalAggregation(`min`,r,i).as(`step_${e}_min_seconds`),a[`step_${e}_max_seconds`]=this.databaseAdapter.buildConditionalAggregation(`max`,r,i).as(`step_${e}_max_seconds`),this.databaseAdapter.getCapabilities().supportsPercentileSubqueries){let n=this.databaseAdapter.buildPercentile(r,50);n&&(a[`step_${e}_median_seconds`]=O`(SELECT ${n} FROM ${O.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));let i=this.databaseAdapter.buildPercentile(r,90);i&&(a[`step_${e}_p90_seconds`]=O`(SELECT ${i} FROM ${O.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`))}}let o=i.db.select(a).from(e);return i.db.$with(`funnel_metrics`).as(o)}},It=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new X(e),this.filterBuilder=new ft(e,this.dateTimeBuilder)}hasFlow(e){return e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0}validateConfig(t,n){let r=[],i=[],a=this.databaseAdapter.getEngineType(),o=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;if(a===`sqlite`)return r.push(e._(`server.validation.flow.sqliteNotSupported`)),{isValid:!1,errors:r,warnings:i};if(typeof t.bindingKey==`string`){let[i,a]=t.bindingKey.split(`.`);if(!i||!a)r.push(e._(`server.validation.flow.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.flow.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.flow.bindingKeyCubeNotFound`,{cubeName:i}))}}else if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t)r.push(e._(`server.validation.flow.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));else{let[,n]=i.dimension.split(`.`);t.dimensions?.[n]||r.push(e._(`server.validation.flow.bindingKeyDimNotFound`,{dimName:n,cubeName:i.cube}))}}if(typeof t.timeDimension==`string`){let[i,a]=t.timeDimension.split(`.`);if(!i||!a)r.push(e._(`server.validation.flow.invalidTimeDimFormat`,{timeDimension:t.timeDimension}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.flow.timeDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.flow.timeDimCubeNotFound`,{cubeName:i}))}}if(t.eventDimension){let[i,a]=t.eventDimension.split(`.`);if(!i||!a)r.push(e._(`server.validation.flow.invalidEventDimFormat`,{eventDimension:t.eventDimension}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.flow.eventDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.flow.eventDimCubeNotFound`,{cubeName:i}))}}else r.push(e._(`server.validation.flow.eventDimRequired`));return t.startingStep?(t.startingStep.filter||r.push(e._(`server.validation.flow.startingStepFilterRequired`)),t.startingStep.name||i.push(e._(`server.validation.flow.startingStepNameMissing`))):r.push(e._(`server.validation.flow.startingStepRequired`)),(t.stepsBefore<0||t.stepsBefore>5)&&r.push(e._(`server.validation.flow.stepsBeforeRange`,{value:t.stepsBefore})),(t.stepsAfter<0||t.stepsAfter>5)&&r.push(e._(`server.validation.flow.stepsAfterRange`,{value:t.stepsAfter})),(t.stepsBefore>=4||t.stepsAfter>=4)&&i.push(e._(`server.validation.flow.highStepDepthWarning`)),t.joinStrategy&&![`auto`,`lateral`,`window`].includes(t.joinStrategy)?r.push(e._(`server.validation.flow.invalidJoinStrategy`,{joinStrategy:t.joinStrategy})):t.joinStrategy===`lateral`&&!o&&r.push(e._(`server.validation.flow.lateralNotSupported`)),{isValid:r.length===0,errors:r,warnings:i}}buildFlowQuery(t,n,r){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(e._(`server.validation.flow.sqliteNotSupported`));let i=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,a=t.joinStrategy??`auto`,o=a===`lateral`||a===`auto`&&i;if(a===`lateral`&&!i)throw Error(e._(`server.validation.flow.lateralNotSupportedExec`));let s={...t,stepsBefore:t.outputMode===`sunburst`?0:t.stepsBefore},c=this.resolveFlowConfig(s,n,r),l=[],u=this.buildStartingEntitiesCTE(s,c,r);l.push(u);let d=o?this.buildBeforeCTEsLateral(s,c,r):this.buildBeforeCTEsWindow(s,c,r);l.push(...d);let f=o?this.buildAfterCTEsLateral(s,c,r):this.buildAfterCTEsWindow(s,c,r);l.push(...f);let p=this.buildNodesAggregationCTE(s,r);l.push(p);let m=this.buildLinksAggregationCTE(s,r);l.push(m);let h=this.buildFinalResultCTE(r);return l.push(h),r.db.with(...l).select().from(h)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(t,n){let r;if(typeof t.bindingKey==`string`)[r]=t.bindingKey.split(`.`);else if(Array.isArray(t.bindingKey)&&t.bindingKey.length>0)r=t.bindingKey[0].cube;else throw Error(e._(`server.errors.flow.cannotResolveCube`));let i=n.get(r);if(!i)throw Error(e._(`server.errors.flow.cubeNotFound`,{cubeName:r}));return i}resolveBindingKey(t,n,r){if(typeof t.bindingKey==`string`){let[,i]=t.bindingKey.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e._(`server.errors.flow.bindingKeyDimNotFound`,{bindingKey:t.bindingKey}));return G(a.sql,r)}let i=t.bindingKey.find(e=>e.cube===n.name);if(!i)throw Error(e._(`server.errors.flow.noBindingKeyMapping`,{cubeName:n.name}));let[,a]=i.dimension.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e._(`server.errors.flow.bindingKeyMappingDimNotFound`,{dimension:i.dimension}));return G(o.sql,r)}resolveTimeDimension(t,n,r){if(typeof t.timeDimension==`string`){let[,i]=t.timeDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e._(`server.errors.flow.timeDimNotFound`,{timeDimension:t.timeDimension}));return G(a.sql,r)}let i=t.timeDimension.find(e=>e.cube===n.name);if(!i)throw Error(e._(`server.errors.flow.noTimeDimMapping`,{cubeName:n.name}));let[,a]=i.dimension.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e._(`server.errors.flow.timeDimMappingNotFound`,{dimension:i.dimension}));return G(o.sql,r)}resolveEventDimension(t,n,r){let[,i]=t.eventDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e._(`server.errors.flow.eventDimNotFound`,{eventDimension:t.eventDimension}));return G(a.sql,r)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(e,t,n){if(`and`in e||`or`in e){let r=e,i=[],a=r.and||r.or||[];for(let e of a){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i.length===0?null:i.length===1?i[0]:`and`in e?F(...i):O`(${O.join(i,O` OR `)})`}if(`type`in e&&`filters`in e){let r=e,i=[];for(let e of r.filters||[]){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i.length===0?null:i.length===1?i[0]:r.type===`and`?F(...i):O`(${O.join(i,O` OR `)})`}let r=e,[,i]=r.member.split(`.`),a=t.dimensions?.[i];if(!a)return null;let o=a.type===`time`?G(a.sql,n):typeof a.sql==`function`?a.sql(n):a.sql;return this.filterBuilder.buildFilterCondition(o,r.operator,r.values||[],a,r.dateRange)}buildStartingEntitiesCTE(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o,startingStepFilters:s}=t,c=[];r.where&&c.push(r.where),c.push(...s);let l=n.db.select({binding_key:O`${i}`.as(`binding_key`),start_time:O`MIN(${a})`.as(`start_time`),event_type:O`${o}`.as(`event_type`),event_path:O`${o}`.as(`event_path`)}).from(r.from);if(c.length>0){let e=c.length===1?c[0]:F(...c);l=l.where(e)}return l=l.groupBy(i,o),e.entityLimit&&(l=l.limit(e.entityLimit)),n.db.$with(`starting_entities`).as(l)}buildBeforeCTEsLateral(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsBefore;t++){let e=t===1?`starting_entities`:`before_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`before_step_${t}`,d=[];r.where&&d.push(r.where),d.push(O`${i} = ${O.identifier(e)}.binding_key`,O`${a} < ${O.identifier(e)}.${O.identifier(l)}`);let f=d.length===1?d[0]:F(...d),p=c?O`${o} || ${`→`} || ${O.identifier(e)}.event_path`:O`${o}`,m=n.db.select({binding_key:O`${i}`.as(`binding_key`),step_time:O`${a}`.as(`step_time`),event_type:O`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(O`${a} DESC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:O`e.binding_key`.as(`binding_key`),step_time:O`e.step_time`.as(`step_time`),event_type:O`e.event_type`.as(`event_type`),event_path:O`e.event_path`.as(`event_path`)}).from(O`${O.identifier(e)}`).crossJoinLateral(m.as(`e`)));s.push(h)}return s}buildAfterCTEsLateral(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsAfter;t++){let e=t===1?`starting_entities`:`after_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`after_step_${t}`,d=[];r.where&&d.push(r.where),d.push(O`${i} = ${O.identifier(e)}.binding_key`,O`${a} > ${O.identifier(e)}.${O.identifier(l)}`);let f=d.length===1?d[0]:F(...d),p=c?O`${O.identifier(e)}.event_path || ${`→`} || ${o}`:O`${o}`,m=n.db.select({binding_key:O`${i}`.as(`binding_key`),step_time:O`${a}`.as(`step_time`),event_type:O`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(O`${a} ASC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:O`e.binding_key`.as(`binding_key`),step_time:O`e.step_time`.as(`step_time`),event_type:O`e.event_type`.as(`event_type`),event_path:O`e.event_path`.as(`event_path`)}).from(O`${O.identifier(e)}`).crossJoinLateral(m.as(`e`)));s.push(h)}return s}buildBeforeCTEsWindow(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsBefore;t++){let e=t===1?`starting_entities`:`before_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`before_step_${t}`,d=[];r.where&&d.push(r.where),d.push(O`${a} < ${O.identifier(e)}.${O.identifier(l)}`);let f=d.length===1?d[0]:F(...d),p=c?O`${o} || ${`→`} || ${O.identifier(e)}.event_path`:O`${o}`,m=n.db.select({binding_key:O`${i}`.as(`binding_key`),step_time:O`${a}`.as(`step_time`),event_type:O`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:O`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as(`rn`)}).from(r.from).innerJoin(O`${O.identifier(e)}`,O`${i} = ${O.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:O`binding_key`.as(`binding_key`),step_time:O`step_time`.as(`step_time`),event_type:O`event_type`.as(`event_type`),event_path:O`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(O`rn = 1`);s.push(n.db.$with(u).as(h))}return s}buildAfterCTEsWindow(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsAfter;t++){let e=t===1?`starting_entities`:`after_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`after_step_${t}`,d=[];r.where&&d.push(r.where),d.push(O`${a} > ${O.identifier(e)}.${O.identifier(l)}`);let f=d.length===1?d[0]:F(...d),p=c?O`${O.identifier(e)}.event_path || ${`→`} || ${o}`:O`${o}`,m=n.db.select({binding_key:O`${i}`.as(`binding_key`),step_time:O`${a}`.as(`step_time`),event_type:O`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:O`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as(`rn`)}).from(r.from).innerJoin(O`${O.identifier(e)}`,O`${i} = ${O.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:O`binding_key`.as(`binding_key`),step_time:O`step_time`.as(`step_time`),event_type:O`event_type`.as(`event_type`),event_path:O`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(O`rn = 1`);s.push(n.db.$with(u).as(h))}return s}buildNodesAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=1;t--){let e=-t,i=`before_step_${t}`;r?n.push(O`
64
+ SELECT
65
+ ${O.raw(`'before_${t}_'`)} || event_path AS node_id,
66
+ event_type AS name,
67
+ ${O.raw(String(e))} AS layer,
68
+ COUNT(*) AS value
69
+ FROM ${O.identifier(i)}
70
+ GROUP BY event_path, event_type
71
+ `):n.push(O`
72
+ SELECT
73
+ ${O.raw(`'before_${t}_'`)} || event_type AS node_id,
74
+ event_type AS name,
75
+ ${O.raw(String(e))} AS layer,
76
+ COUNT(*) AS value
77
+ FROM ${O.identifier(i)}
78
+ GROUP BY event_type
79
+ `)}n.push(O`
80
+ SELECT
81
+ ${O.raw(`'start_'`)} || event_type AS node_id,
82
+ event_type AS name,
83
+ 0 AS layer,
84
+ COUNT(*) AS value
85
+ FROM starting_entities
86
+ GROUP BY event_type
87
+ `);for(let t=1;t<=e.stepsAfter;t++){let e=t,i=`after_step_${t}`;r?n.push(O`
88
+ SELECT
89
+ ${O.raw(`'after_${t}_'`)} || event_path AS node_id,
90
+ event_type AS name,
91
+ ${O.raw(String(e))} AS layer,
92
+ COUNT(*) AS value
93
+ FROM ${O.identifier(i)}
94
+ GROUP BY event_path, event_type
95
+ `):n.push(O`
96
+ SELECT
97
+ ${O.raw(`'after_${t}_'`)} || event_type AS node_id,
98
+ event_type AS name,
99
+ ${O.raw(String(e))} AS layer,
100
+ COUNT(*) AS value
101
+ FROM ${O.identifier(i)}
102
+ GROUP BY event_type
103
+ `)}let i=O.join(n,O` UNION ALL `),a=t.db.select({node_id:O`node_id`.as(`node_id`),name:O`name`.as(`name`),layer:O`layer`.as(`layer`),value:O`value`.as(`value`)}).from(O`(${i}) AS nodes_union`);return t.db.$with(`nodes_agg`).as(a)}buildLinksAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=2;t--){let e=`before_step_${t}`,i=`before_step_${t-1}`;r?n.push(O`
104
+ SELECT
105
+ ${O.raw(`'before_${t}_'`)} || f.event_path AS source_id,
106
+ ${O.raw(`'before_${t-1}_'`)} || t.event_path AS target_id,
107
+ COUNT(*) AS value
108
+ FROM ${O.identifier(e)} f
109
+ INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
110
+ GROUP BY f.event_path, t.event_path
111
+ `):n.push(O`
112
+ SELECT
113
+ ${O.raw(`'before_${t}_'`)} || f.event_type AS source_id,
114
+ ${O.raw(`'before_${t-1}_'`)} || t.event_type AS target_id,
115
+ COUNT(*) AS value
116
+ FROM ${O.identifier(e)} f
117
+ INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
118
+ GROUP BY f.event_type, t.event_type
119
+ `)}e.stepsBefore>=1&&(r?n.push(O`
120
+ SELECT
121
+ ${O.raw(`'before_1_'`)} || b.event_path AS source_id,
122
+ ${O.raw(`'start_'`)} || s.event_type AS target_id,
123
+ COUNT(*) AS value
124
+ FROM before_step_1 b
125
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
126
+ GROUP BY b.event_path, s.event_type
127
+ `):n.push(O`
128
+ SELECT
129
+ ${O.raw(`'before_1_'`)} || b.event_type AS source_id,
130
+ ${O.raw(`'start_'`)} || s.event_type AS target_id,
131
+ COUNT(*) AS value
132
+ FROM before_step_1 b
133
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
134
+ GROUP BY b.event_type, s.event_type
135
+ `)),e.stepsAfter>=1&&(r?n.push(O`
136
+ SELECT
137
+ ${O.raw(`'start_'`)} || s.event_type AS source_id,
138
+ ${O.raw(`'after_1_'`)} || a.event_path AS target_id,
139
+ COUNT(*) AS value
140
+ FROM starting_entities s
141
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
142
+ GROUP BY s.event_type, a.event_path
143
+ `):n.push(O`
144
+ SELECT
145
+ ${O.raw(`'start_'`)} || s.event_type AS source_id,
146
+ ${O.raw(`'after_1_'`)} || a.event_type AS target_id,
147
+ COUNT(*) AS value
148
+ FROM starting_entities s
149
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
150
+ GROUP BY s.event_type, a.event_type
151
+ `));for(let t=1;t<e.stepsAfter;t++){let e=`after_step_${t}`,i=`after_step_${t+1}`;r?n.push(O`
152
+ SELECT
153
+ ${O.raw(`'after_${t}_'`)} || f.event_path AS source_id,
154
+ ${O.raw(`'after_${t+1}_'`)} || t.event_path AS target_id,
155
+ COUNT(*) AS value
156
+ FROM ${O.identifier(e)} f
157
+ INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
158
+ GROUP BY f.event_path, t.event_path
159
+ `):n.push(O`
160
+ SELECT
161
+ ${O.raw(`'after_${t}_'`)} || f.event_type AS source_id,
162
+ ${O.raw(`'after_${t+1}_'`)} || t.event_type AS target_id,
163
+ COUNT(*) AS value
164
+ FROM ${O.identifier(e)} f
165
+ INNER JOIN ${O.identifier(i)} t ON f.binding_key = t.binding_key
166
+ GROUP BY f.event_type, t.event_type
167
+ `)}if(n.length===0){let e=t.db.select({source_id:O`NULL`.as(`source_id`),target_id:O`NULL`.as(`target_id`),value:O`0`.as(`value`)}).from(O`(SELECT 1) AS empty`).where(O`1 = 0`);return t.db.$with(`links_agg`).as(e)}let i=O.join(n,O` UNION ALL `),a=t.db.select({source_id:O`source_id`.as(`source_id`),target_id:O`target_id`.as(`target_id`),value:O`value`.as(`value`)}).from(O`(${i}) AS links_union`);return t.db.$with(`links_agg`).as(a)}buildFinalResultCTE(e){let t=O`
168
+ SELECT
169
+ 'node' AS record_type,
170
+ node_id AS id,
171
+ name AS name,
172
+ layer AS layer,
173
+ value AS value,
174
+ NULL AS source_id,
175
+ NULL AS target_id
176
+ FROM nodes_agg
177
+ UNION ALL
178
+ SELECT
179
+ 'link' AS record_type,
180
+ NULL AS id,
181
+ NULL AS name,
182
+ NULL AS layer,
183
+ value AS value,
184
+ source_id AS source_id,
185
+ target_id AS target_id
186
+ FROM links_agg
187
+ WHERE source_id IS NOT NULL
188
+ `,n=e.db.select({record_type:O`record_type`.as(`record_type`),id:O`id`.as(`id`),name:O`name`.as(`name`),layer:O`layer`.as(`layer`),value:O`value`.as(`value`),source_id:O`source_id`.as(`source_id`),target_id:O`target_id`.as(`target_id`)}).from(O`(${t}) AS final_union`);return e.db.$with(`final_result`).as(n)}};function Lt(e){return Array.isArray(e)}function Rt(e){return typeof e==`object`&&!!e&&`cube`in e}function zt(e){if(Rt(e))return e.cube;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(0,t)}function Bt(e){if(Rt(e))return e.dimension;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(t+1)}var Vt=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new X(e),this.filterBuilder=new ft(e,this.dateTimeBuilder)}hasRetention(e){return e.retention!==void 0&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null}validateConfig(t,n){let r=[];try{let i=zt(t.timeDimension),a=Bt(t.timeDimension),o=n.get(i);o?o.dimensions?.[a]||r.push(e._(`server.validation.retention.timeDimNotFound`,{dimName:a})):r.push(e._(`server.validation.retention.cubeNotFound`,{cubeName:i}))}catch{r.push(e._(`server.validation.retention.invalidTimeDimFormat`,{timeDimension:t.timeDimension}))}if(Lt(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t)r.push(e._(`server.validation.retention.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));else{let n=this.extractDimensionName(i.dimension);t.dimensions?.[n]||r.push(e._(`server.validation.retention.bindingKeyDimNotFound`,{dimName:n,cubeName:i.cube}))}}else{let[i,a]=t.bindingKey.split(`.`);if(!i||!a)r.push(e._(`server.validation.retention.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));else{let t=n.get(i);t?t.dimensions?.[a]||r.push(e._(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e._(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:i}))}}if(t.breakdownDimensions&&t.breakdownDimensions.length>0)for(let i of t.breakdownDimensions){let[t,a]=i.split(`.`);if(!t||!a)r.push(e._(`server.validation.retention.invalidBreakdownDimFormat`,{dimension:i}));else{let i=n.get(t);i?i.dimensions?.[a]||r.push(e._(`server.validation.retention.breakdownDimNotFound`,{dimName:a,cubeName:t})):r.push(e._(`server.validation.retention.breakdownDimCubeNotFound`,{cubeName:t}))}}if(t.periods<1&&r.push(e._(`server.validation.retention.periodsMin`)),t.periods>52&&r.push(e._(`server.validation.retention.periodsMax`)),[`day`,`week`,`month`].includes(t.granularity)||r.push(e._(`server.validation.retention.invalidGranularity`,{granularity:t.granularity})),[`classic`,`rolling`].includes(t.retentionType)||r.push(e._(`server.validation.retention.invalidRetentionType`,{retentionType:t.retentionType})),!t.dateRange)r.push(e._(`server.validation.retention.dateRangeRequired`));else{if(!t.dateRange.start)r.push(e._(`server.validation.retention.dateRangeStartRequired`));else{let n=new Date(t.dateRange.start);isNaN(n.getTime())&&r.push(e._(`server.validation.retention.dateRangeInvalidStart`))}if(!t.dateRange.end)r.push(e._(`server.validation.retention.dateRangeEndRequired`));else{let n=new Date(t.dateRange.end);isNaN(n.getTime())&&r.push(e._(`server.validation.retention.dateRangeInvalidEnd`))}if(t.dateRange.start&&t.dateRange.end){let n=new Date(t.dateRange.start),i=new Date(t.dateRange.end);!isNaN(n.getTime())&&!isNaN(i.getTime())&&n>i&&r.push(e._(`server.validation.retention.dateRangeStartBeforeEnd`))}}return{isValid:r.length===0,errors:r}}buildRetentionQuery(e,t,n){let r=this.resolveConfig(e,t,n),i=r.breakdowns.length,a=this.buildCohortBaseCTE(e,r,n),o=this.buildActivityPeriodsCTE(e,r,n),s=this.buildCohortSizesCTE(e,n,i),c=this.buildRetentionCountsCTE(e,n,i),l=r.breakdowns.length>0,u={period:O`rc.period_number`.as(`period`),cohort_size:O`cs.cohort_size`.as(`cohort_size`),retained_users:O`rc.retained_users`.as(`retained_users`),retention_rate:O`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as(`retention_rate`)};for(let e=0;e<r.breakdowns.length;e++)u[`breakdown_${e}`]=O.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);let d=n.db.with(a,o,s,c).select(u).from(O`retention_counts rc`);if(l){let e=r.breakdowns.map((e,t)=>O`COALESCE(CAST(rc.breakdown_${O.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${O.raw(String(t))} AS TEXT), '')`),t=e.length===1?e[0]:O.join(e,O` AND `);d=d.innerJoin(O`cohort_sizes cs`,t)}else d=d.innerJoin(O`cohort_sizes cs`,O`1 = 1`);let f=[];for(let e=0;e<r.breakdowns.length;e++)f.push(O.raw(`rc.breakdown_${e}`));return f.push(O`rc.period_number`),d=d.orderBy(...f),d}transformResult(e,t){let n=t.breakdownDimensions||[],r=Math.min(n.length,100),i=r>0;return e.map(e=>{let t={period:Number(e.period),cohortSize:Number(e.cohort_size),retainedUsers:Number(e.retained_users),retentionRate:e.retention_rate===null?0:Number(e.retention_rate)};if(i){let i={};for(let t=0;t<r;t++){let r=n[t],a=e[`breakdown_${t}`];i[r]=a===void 0?null:String(a)}t.breakdownValues=i}return t})}resolveConfig(t,n,r){let i=zt(t.timeDimension),a=Bt(t.timeDimension),o=n.get(i);if(!o)throw Error(e._(`server.validation.retention.cubeNotFound`,{cubeName:i}));let s=o.dimensions?.[a];if(!s)throw Error(e._(`server.validation.retention.timeDimNotFound`,{dimName:a}));let c=G(s.sql,r),l=this.resolveBindingKey(t.bindingKey,o,n,r),u=this.buildFilterConditions(t.cohortFilters,o,n,r),d=this.buildFilterConditions(t.activityFilters,o,n,r),f=[];if(t.breakdownDimensions&&t.breakdownDimensions.length>0)for(let e of t.breakdownDimensions){let[t,i]=e.split(`.`),a=n.get(t);if(a&&a.dimensions?.[i]){let t=G(a.dimensions[i].sql,r);f.push({dimension:e,expr:t})}}return{cube:o,bindingKeyExpr:l,timeExpr:c,cohortFilterConditions:u,activityFilterConditions:d,breakdowns:f}}resolveBindingKey(t,n,r,i){if(Lt(t)){let a=t.find(e=>e.cube===n.name);if(!a)throw Error(e._(`server.validation.retention.noBindingKeyMapping`,{cubeName:n.name}));let o=this.extractDimensionName(a.dimension),s=r.get(a.cube);if(!s)throw Error(e._(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:a.cube}));let c=s.dimensions?.[o];if(!c)throw Error(e._(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a.dimension,cubeName:a.cube}));return G(c.sql,i)}let[a,o]=t.split(`.`),s=r.get(a);if(!s)throw Error(e._(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:a}));let c=s.dimensions?.[o];if(!c)throw Error(e._(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:a}));return G(c.sql,i)}buildFilterConditions(e,t,n,r){if(!e)return[];let i=Array.isArray(e)?e:[e],a=[];for(let e of i){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildSingleFilterCondition(e,t,n,r){if(`and`in e||`or`in e){let i=e,a=[],o=`and`in i&&!!i.and,s=i.and||i.or||[];for(let e of s){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a.length===0?null:a.length===1?a[0]:o?F(...a):O`(${O.join(a,O` OR `)})`}let i=e,[a,o]=i.member.split(`.`),s=n.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=c.type===`time`?G(c.sql,r):typeof c.sql==`function`?c.sql(r):c.sql;return this.filterBuilder.buildFilterCondition(l,i.operator,i.values||[],c,i.dateRange)}buildCohortBaseCTE(e,t,n){let r=t.cube.sql(n),i=[];if(r.where&&i.push(r.where),i.push(...t.cohortFilterConditions),e.dateRange){let n=this.buildDateRangeCondition(t.timeExpr,e.dateRange);i.push(n)}let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o={binding_key:O`${t.bindingKeyExpr}`.as(`binding_key`),cohort_entry:O`MIN(${a})`.as(`cohort_entry`)};for(let e=0;e<t.breakdowns.length;e++){let{expr:n}=t.breakdowns[e];o[`breakdown_${e}`]=O`MIN(${n})`.as(`breakdown_${e}`)}let s=n.db.select(o).from(r.from);if(i.length>0){let e=i.length===1?i[0]:F(...i);s=s.where(e)}let c=[t.bindingKeyExpr];for(let e=0;e<t.breakdowns.length;e++)c.push(t.breakdowns[e].expr);if(s=s.groupBy(...c),e.dateRange){let t=this.buildDateRangeHavingCondition(a,e.dateRange);s=s.having(t)}return n.db.$with(`cohort_base`).as(s)}buildDateRangeCondition(e,t){return O`${e} >= ${t.start}::date AND ${e} < (${t.end}::date + interval '1 day')`}buildDateRangeHavingCondition(e,t){return O`MIN(${e}) >= ${t.start}::date AND MIN(${e}) < (${t.end}::date + interval '1 day')`}buildActivityPeriodsCTE(e,t,n){let r=t.cube.sql(n),i=[];r.where&&i.push(r.where),i.push(...t.activityFilterConditions),i.push(O`${t.timeExpr} >= cohort_base.cohort_entry`);let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o=this.buildPeriodNumberExpression(O`cohort_base.cohort_entry`,a,e.granularity),s={binding_key:O`cohort_base.binding_key`.as(`binding_key`),period_number:o.as(`period_number`)};for(let e=0;e<t.breakdowns.length;e++)s[`breakdown_${e}`]=O.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);let c=n.db.select(s).from(r.from).innerJoin(O`cohort_base`,O`${t.bindingKeyExpr} = cohort_base.binding_key`);if(i.length>0){let e=i.length===1?i[0]:F(...i);c=c.where(e)}let l=[O`cohort_base.binding_key`,o];for(let e=0;e<t.breakdowns.length;e++)l.push(O.raw(`cohort_base.breakdown_${e}`));return c=c.groupBy(...l),n.db.$with(`activity_periods`).as(c)}buildCohortSizesCTE(e,t,n){if(n>0){let e={cohort_size:O`COUNT(*)`.as(`cohort_size`)},r=[];for(let t=0;t<n;t++)e[`breakdown_${t}`]=O.raw(`breakdown_${t}`).as(`breakdown_${t}`),r.push(O.raw(`breakdown_${t}`));let i=t.db.select(e).from(O`cohort_base`).groupBy(...r);return t.db.$with(`cohort_sizes`).as(i)}let r=t.db.select({cohort_size:O`COUNT(*)`.as(`cohort_size`)}).from(O`cohort_base`);return t.db.$with(`cohort_sizes`).as(r)}buildRetentionCountsCTE(e,t,n){let r;if(e.retentionType===`rolling`)r=this.buildRollingRetentionCountsQuery(e,t,n);else{let i={period_number:O`period_number`.as(`period_number`),retained_users:O`COUNT(DISTINCT binding_key)`.as(`retained_users`)},a=[O`period_number`];for(let e=0;e<n;e++)i[`breakdown_${e}`]=O.raw(`breakdown_${e}`).as(`breakdown_${e}`),a.push(O.raw(`breakdown_${e}`));let o=Math.min(e.periods,52);r=t.db.select(i).from(O`activity_periods`).where(O`period_number >= 0 AND period_number <= ${o}`).groupBy(...a)}return t.db.$with(`retention_counts`).as(r)}buildRollingRetentionCountsQuery(e,t,n){let r=[];for(let e=0;e<n;e++)r.push(`breakdown_${e}`);let i=r.length>0?`, ${r.join(`, `)}`:``,a=O`(
189
+ SELECT
190
+ binding_key,
191
+ ${O.raw(r.map(e=>`${e}`).join(`, `)+(r.length>0?`,`:``))}
192
+ MAX(period_number) as max_period
193
+ FROM activity_periods
194
+ WHERE period_number >= 0 AND period_number <= ${e.periods}
195
+ GROUP BY binding_key${O.raw(i)}
196
+ )`,o=this.databaseAdapter.buildPeriodSeriesSubquery(e.periods),s={period_number:O`p.period_number`.as(`period_number`),retained_users:O`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},c=[O`p.period_number`];for(let e=0;e<n;e++)s[`breakdown_${e}`]=O.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),c.push(O.raw(`ump.breakdown_${e}`));return t.db.select(s).from(O`${a} ump`).innerJoin(o,O`TRUE`).groupBy(...c)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}extractDimensionName(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}},Ht=class{constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(t,n,r){let i=Array.from(this.queryPlanner.analyzeCubeUsage(n));if(i.length===0)throw Error(e._(`server.errors.noCubesInQuery`));let a=this.queryPlanner.analyzePrimaryCube(i,n,t),o=a.selectedCube,s=t.get(o);if(!s)throw Error(e._(`server.errors.primaryCubeNotFound`,{cubeName:o}));let c=i.filter(e=>e!==o).map(e=>this.queryPlanner.analyzeJoinPathForTarget(t,o,e,n)),l=i.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,s,i,r,n):[],u=i.length>1?this.queryPlanner.buildPreAggregationCTEs(t,s,l,n,r)??[]:[],d=this.queryPlanner.buildWarnings(n,u),f=this.buildSourceFromPhases(s,l,u,t,n,r),p=f.source,m=this.buildQueryNode(p,n,t,d),h=this.buildPreAggregationAnalysis(u),g=new Map;for(let e of i){let n=t.get(e);n&&g.set(e,n)}let _=Q.hasPostAggregationWindows(n.measures??[],g),v=[...c.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...d.map(e=>e.message)];return{plan:m,analysis:{timestamp:new Date().toISOString(),cubeCount:i.length,cubesInvolved:[...i].sort(),primaryCube:a,joinPaths:c,preAggregations:h,querySummary:{queryType:u.length>0?`multi_cube_cte`:i.length>1?`multi_cube_join`:`single_cube`,measureStrategy:f.strategy,joinCount:l.length,cteCount:u.length,hasPreAggregation:u.length>0,hasWindowFunctions:_},warnings:v.length>0?v:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${i.length} cube${i.length===1?``:`s`} from query members`,details:{cubesInvolved:[...i].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${a.selectedCube}' as primary cube (${a.reason})`,details:{selectedCube:a.selectedCube,reason:a.reason,candidates:a.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${l.length} join${l.length===1?``:`s`}`,details:{joinCount:l.length,joinTargets:l.map(e=>e.cube.name),pathSelection:c.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${u.length} pre-aggregation CTE${u.length===1?``:`s`}`,details:{cteCount:u.length,cubes:u.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${f.strategy}' measure strategy`,details:{strategy:f.strategy,regularMeasures:f.classification.regular.map(e=>e.name),multipliedMeasures:f.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:f.classification.deduplicationSafe.map(e=>e.name),sourceType:p.type}},{phase:`warnings`,decision:d.length>0?`Generated ${d.length} planning warning${d.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:d.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t.map(e=>({target:this.toCubeRef(e.cube),alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,relationship:e.relationship,junctionTable:e.junctionTable})),u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=W(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildMeasureRefs(t,n){return t.measures?t.measures.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e._(`server.errors.cubeNotFoundForMeasure`,{cubeName:r,measure:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildDimensionRefs(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e._(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildTimeDimensionRefs(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e._(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:this.toCubeRef(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},Ut=class{name=`identity`;optimise(e){return e}};function Wt(e,t,n,r){let i=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0){for(let t of e.preAggregationCTEs)if(t.propagatingFilters&&t.propagatingFilters.length>0)for(let e of t.propagatingFilters){let t=e.sourceCube.name;if(!i.has(t)){let a={filters:e.filters},o=new Map([[t,e.sourceCube]]),s=r.queryBuilder.buildWhereConditions(o,a,n);i.set(t,s)}let a=i.get(t);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:F(...a))}}let a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);if(l&&(a.push(l),o.set(c.cube.name,c.cteAlias),c.downstreamJoinKeys))for(let e of c.downstreamJoinKeys)s.set(e.targetCubeName,{cteAlias:c.cteAlias,joinKeys:e.joinKeys})}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function Gt(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Q.isPostAggregationWindow(u))continue;let d=Q.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?O`sum(${O`${O.identifier(g.cteAlias)}.${O.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=O`${_}`.as(d));let v=Kt(u,_,n,r,l,t,a);v&&(e[o]=O`${v}`.as(o))}}function Kt(e,t,n,r,i,a,o){let s=e.windowConfig||{},c=(e,t)=>{if(!a.preAggregationCTEs)return null;let n=a.preAggregationCTEs.find(t=>t.cube?.name===e);return n&&n.cteAlias?O`${O.identifier(n.cteAlias)}.${O.identifier(t)}`:null},l;if(s.orderBy&&s.orderBy.length>0)l=s.orderBy.map(e=>{let a=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field;if(n.timeDimensions)for(let t of n.timeDimensions){let[n,s]=t.dimension.split(`.`);if(s===a){let l=c(n,a);if(l)return{field:l,direction:e.direction};let u=i.dimensions?.[s];if(u)return{field:o.queryBuilder.buildTimeDimensionExpression(u.sql,t.granularity,r),direction:e.direction}}}let l=i.dimensions?.[a];return l?{field:G(l.sql,r),direction:e.direction}:a===(s.measure?.includes(`.`)?s.measure.split(`.`)[1]:s.measure)||e.field===s.measure?{field:t,direction:e.direction}:null}).filter(e=>e!==null);else if(n.timeDimensions&&n.timeDimensions.length>0){let e=n.timeDimensions[0],[t,a]=e.dimension.split(`.`),s=c(t,a);if(s)l=[{field:s,direction:`asc`}];else{let n=i.name===t?i:void 0;if(n?.dimensions?.[a]){let t=n.dimensions[a];l=[{field:o.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,r),direction:`asc`}]}}}let u;s.partitionBy&&s.partitionBy.length>0&&(u=s.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,n=i.dimensions?.[t];return n?G(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Q.getDefaultWindowOperation(e.type)){case`difference`:return O`${t} - ${d}`;case`ratio`:return O`${t} / NULLIF(${d}, 0)`;case`percentChange`:return O`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function qt(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs){let e=o.cube.name;for(let s of o.measures){if(!a[s])continue;let[,c]=s.split(`.`),l=r.get(e);if(!l?.measures?.[c])continue;let u=l.measures[c],d=O`${O.identifier(o.cteAlias)}.${O.identifier(c)}`,f;if(u.type===`calculated`&&u.calculatedSql)f=i.queryBuilder.buildCTECalculatedMeasure(u,l,o,r,n);else{let e=o.cteReason===`fanOutPrevention`,n=Jt(o,t,r),a=e||n;switch(u.type){case`count`:case`countDistinct`:case`sum`:f=a?B(d):z(d);break;case`avg`:f=a?B(d):i.databaseAdapter.buildAvg(d);break;case`min`:f=V(d);break;case`max`:f=B(d);break;case`number`:f=B(d);break;default:f=a?B(d):z(d)}}a[s]=O`${f}`.as(s)}for(let t in a){let[n,i]=t.split(`.`);if(n!==e)continue;let s=r.get(e),c=s&&s.dimensions?.[i],l=t.startsWith(e+`.`);if(!c&&!l)continue;let u=o.joinKeys.find(e=>e.targetColumn===i);if(!u&&s?.dimensions?.[i]){let e=s.dimensions[i].sql;u=o.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[i])&&(a[t]=O`${O.identifier(o.cteAlias)}.${O.identifier(i)}`.as(t))}}return Gt(a,e,t,n,r,i),a}function Jt(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&Yt(e.sourceColumnObj,t,n))}function Yt(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function Xt(e,t,n,r,i,a){let o=[],s=t.db.select(r).from(n.from);if(i.ctes.length>0&&(s=t.db.with(...i.ctes).select(r).from(n.from)),n.joins)for(let e of n.joins)switch(e.type||`left`){case`left`:s=s.leftJoin(e.table,e.on);break;case`inner`:s=s.innerJoin(e.table,e.on);break;case`right`:s=s.rightJoin(e.table,e.on);break;case`full`:s=s.fullJoin(e.table,e.on);break}let c=new Set,l=new Set;if(e.preAggregationCTEs){for(let t of e.preAggregationCTEs)if(t.intermediateJoins&&t.intermediateJoins.length>0)for(let e of t.intermediateJoins)l.add(e.cube.name)}if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;if(l.has(r)&&!i.cteAliasMap.has(r))continue;let u=i.cteAliasMap.get(n.cube.name);if(n.junctionTable){let r=n.junctionTable,a=r.joinCondition,c=r.sourceCubeName?i.cteAliasMap.get(r.sourceCubeName):void 0;if(c){let t=(e.preAggregationCTEs?.find(e=>e.cube.name===r.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===n.cube.name);if(t&&t.joinKeys.length>0){let e=[];for(let n of t.joinKeys){let t=O`${O.identifier(c)}.${O.identifier(n.sourceColumn)}`,r=n.targetColumnObj;r&&e.push(N(r,t))}e.length>0&&(a=F(...e))}}let l=[];if(r.securitySql){let e=r.securitySql(t.securityContext);Array.isArray(e)?l.push(...e):l.push(e)}try{switch(r.joinType||`left`){case`left`:s=s.leftJoin(r.table,a);break;case`inner`:s=s.innerJoin(r.table,a);break;case`right`:s=s.rightJoin(r.table,a);break;case`full`:s=s.fullJoin(r.table,a);break}l.length>0&&o.push(...l)}catch{}}let d,f,p,m;if(u)d=O`${O.identifier(u)}`,f=a.cteBuilder.buildCTEJoinCondition(n,u,e),p=void 0;else{let e=i.downstreamCubeMap.get(n.cube.name);if(m=n.cube.sql(t),d=m.from,p=m.where,e&&!n.junctionTable){let t=[];for(let n of e.joinKeys){let r=O`${O.identifier(e.cteAlias)}.${O.identifier(n.sourceColumn)}`,i=n.targetColumnObj||O.identifier(n.targetColumn);t.push(N(r,i))}f=t.length===1?t[0]:F(...t)}else f=n.joinCondition}let h=n.joinType||`left`,g=h!==`inner`&&p?F(f,p):f;try{switch(h){case`left`:s=s.leftJoin(d,g),p&&c.add(n.cube.name);break;case`inner`:s=s.innerJoin(d,f);break;case`right`:s=s.rightJoin(d,g),p&&c.add(n.cube.name);break;case`full`:s=s.fullJoin(d,g),p&&c.add(n.cube.name);break}if(m?.joins)for(let e of m.joins)switch(e.type||`left`){case`left`:s=s.leftJoin(e.table,e.on);break;case`inner`:s=s.innerJoin(e.table,e.on);break;case`right`:s=s.rightJoin(e.table,e.on);break;case`full`:s=s.fullJoin(e.table,e.on);break}}catch{}}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function Zt(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);l.length>0&&c.push(...l);let u=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:F(...c);u=u.where(e)}let d=s.queryBuilder.buildGroupByFields(e.joinCubes.length>0?r:e.primaryCube,t,n,e);if(d.length>0&&(u=u.groupBy(...d)),!t.ungrouped){let i=s.queryBuilder.buildHavingConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e);if(i.length>0){let e=i.length===1?i[0]:F(...i);u=u.having(e)}}let f=s.queryBuilder.buildOrderBy(t);return f.length>0&&(u=u.orderBy(...f)),u=s.queryBuilder.applyLimitAndOffset(u,t),u}function Qt(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}var $t=class{constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>({cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:e.joinCondition,junctionTable:e.junctionTable})),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=this.tryBuildMultiFactMergeQuery(e,t,n,r);if(i)return i;let a=this.tryBuildKeysDeduplicationQuery(e,t,n,r);if(a)return a;let o=Wt(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?Qt(e):new Map([[e.primaryCube.name,e.primaryCube]]);return Zt(e,t,n,c,s,o,Xt(e,n,s,qt(e,t,n,c,r),o,r),r)}tryBuildKeysDeduplicationQuery(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?Qt(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!this.canExecuteKeysDeduplication(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:this.getPrimaryKeyDimensions(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u={},d=[];if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`),i=a.get(t),o=i?.dimensions?.[r];if(!i||!o)return null;let s=G(o.sql,n);u[e]=O`${s}`.as(e),d.push(s)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),o=a.get(t),s=o?.dimensions?.[i];if(!o||!s)return null;let c=r.queryBuilder.buildTimeDimensionExpression(s.sql,e.granularity,n);u[e.dimension]=O`${c}`.as(e.dimension),d.push(c)}let f=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=G(t.sql,n),i=`__pk__${e}`;u[i]=O`${r}`.as(i),d.push(r),f.push(i)}let p=i.regularMeasures??[],m=new Set(p),h=t.measures.filter(e=>!m.has(e));if(p.length>0){let e=r.queryBuilder.buildResolvedMeasures(p,a,n);for(let t of p){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;u[r]=O`${n()}`.as(r)}}let g=e.primaryCube.sql(n),_=[];g.where&&_.push(g.where);let v=n.db.select(u).from(g.from);if(g.joins)for(let e of g.joins)v=this.applyJoinByType(v,e.type??`left`,e.table,e.on);for(let t of e.joinCubes){if(t.junctionTable&&(v=this.applyJoinByType(v,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),t.junctionTable.securitySql)){let e=t.junctionTable.securitySql(n.securityContext);Array.isArray(e)?_.push(...e):_.push(e)}let e=t.cube.sql(n);if(v=this.applyJoinByType(v,t.joinType??`left`,e.from,t.joinCondition),e.joins)for(let t of e.joins)v=this.applyJoinByType(v,t.type??`left`,t.table,t.on);e.where&&_.push(e.where)}_.push(...r.queryBuilder.buildWhereConditions(a,t,n)),_.length>0&&(v=v.where(_.length===1?_[0]:F(..._))),d.length>0&&(v=v.groupBy(...d));let y=n.db.$with(c).as(v),b=o.sql(n),x={},S=[];for(let e of s){let t=o.dimensions?.[e];if(!t)return null;let r=G(t.sql,n);x[e]=O`${r}`.as(e),S.push(r)}let C=new Set;for(let e of h){let[,t]=e.split(`.`);o.measures?.[t]?.type===`avg`&&C.add(t)}let w=h.filter(e=>{let[,t]=e.split(`.`);return!C.has(t)});if(w.length>0){let e=r.queryBuilder.buildResolvedMeasures(w,new Map([[o.name,o]]),n);for(let t of w){let[,n]=t.split(`.`),r=e.get(t);if(!r||typeof r!=`function`)return null;x[n]=O`${r()}`.as(n)}}for(let e of h){let[,t]=e.split(`.`);if(!C.has(t))continue;let r=o.measures?.[t];if(!r?.sql)return null;let i=G(r.sql,n),a=`__avg_sum__${t}`,s=`__avg_count__${t}`;x[a]=O`sum(${i})`.as(a),x[s]=O`count(${i})`.as(s)}let T=n.db.select(x).from(b.from);if(b.joins)for(let e of b.joins)T=this.applyJoinByType(T,e.type??`left`,e.table,e.on);let E=[];b.where&&E.push(b.where),E.push(...r.queryBuilder.buildWhereConditions(o,t,n)),E.length>0&&(T=T.where(E.length===1?E[0]:F(...E))),S.length>0&&(T=T.groupBy(...S));let D=n.db.$with(l).as(T),k={};for(let e of t.dimensions??[])k[e]=O`${O.identifier(c)}.${O.identifier(e)}`.as(e);for(let e of t.timeDimensions??[])k[e.dimension]=O`${O.identifier(c)}.${O.identifier(e.dimension)}`.as(e.dimension);for(let e of h){let[,t]=e.split(`.`),n=o.measures?.[t];k[e]=this.buildKeysOuterAggregation(n?.type??`sum`,l,t,e)}for(let e of p){let[t,n]=e.split(`.`),r=a.get(t)?.measures?.[n],i=`__reg__${e.replace(`.`,`__`)}`;k[e]=this.buildKeysOuterAggregation(r?.type??`sum`,c,i,e)}let A=n.db.with(y,D).select(k).from(O`${O.identifier(c)}`),j=f.map((e,t)=>N(O`${O.identifier(c)}.${O.identifier(e)}`,O`${O.identifier(l)}.${O.identifier(s[t])}`)),M=j.length===1?j[0]:F(...j);A=A.leftJoin(O`${O.identifier(l)}`,M);let P=[...(t.dimensions??[]).map(e=>O`${O.identifier(c)}.${O.identifier(e)}`),...(t.timeDimensions??[]).map(e=>O`${O.identifier(c)}.${O.identifier(e.dimension)}`)];P.length>0&&(A=A.groupBy(...P));let I=r.queryBuilder.buildOrderBy(t,Object.keys(k));return I.length>0&&(A=A.orderBy(...I)),A=r.queryBuilder.applyLimitAndOffset(A,t),A}tryBuildMultiFactMergeQuery(e,t,n,r){let i=e.multiFactMerge;if(!i||i.groups.length<2)return null;let a=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],o=Array.from(new Set(a)),s=o.length>0&&i.mergeStrategy===`fullJoin`&&!this.supportsFullOuterJoin(),c=this.selectRuntimeMergeStrategy(i.mergeStrategy,o.length>0),l=i.groups.map(e=>{let t=this.build(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});if(s)return this.buildMultiFactUnionKeysFallbackQuery(t,n,r,i,l,o);let u=i.groups[0].alias,d=i.groups.map(e=>e.alias),f={};if(o.length>0)for(let e of o)f[e]=O`${this.coalesceQualifiedColumn(d,e)}`.as(e);for(let e of i.groups)for(let t of e.measures)f[t]=O`coalesce(${O`${O.identifier(e.alias)}.${O.identifier(t)}`}, 0)`.as(t);let p=n.db.with(...l).select(f).from(O`${O.identifier(u)}`),m=new Map;for(let e of o)m.set(e,O`${O.identifier(u)}.${O.identifier(e)}`);for(let e=1;e<i.groups.length;e++){let t=i.groups[e].alias,n;if(o.length===0)n=O`1 = 1`;else{let e=o.map(e=>N(m.get(e),O`${O.identifier(t)}.${O.identifier(e)}`));n=e.length===1?e[0]:F(...e)}if(p=this.applyJoinByType(p,c,O`${O.identifier(t)}`,n),o.length>0&&c===`full`)for(let e of o)m.set(e,O`coalesce(${m.get(e)}, ${O`${O.identifier(t)}.${O.identifier(e)}`})`)}let h=r.queryBuilder.buildOrderBy(t,Object.keys(f));return h.length>0&&(p=p.orderBy(...h)),r.queryBuilder.applyLimitAndOffset(p,t)}buildMultiFactUnionKeysFallbackQuery(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>O`select ${this.buildSharedKeySelection(e.alias,a)} from ${O.identifier(e.alias)}`),c=O`${O.join(s,O` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=O`${O.identifier(o)}.${O.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=O`coalesce(${O`${O.identifier(e.alias)}.${O.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(O`${O.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>N(O`${O.identifier(o)}.${O.identifier(t)}`,O`${O.identifier(e.alias)}.${O.identifier(t)}`)),n=t.length===1?t[0]:F(...t);d=d.leftJoin(O`${O.identifier(e.alias)}`,n)}let f=n.queryBuilder.buildOrderBy(e,Object.keys(u));return f.length>0&&(d=d.orderBy(...f)),n.queryBuilder.applyLimitAndOffset(d,e)}buildSharedKeySelection(e,t){let n=t.map(t=>O`${O.identifier(e)}.${O.identifier(t)} as ${O.identifier(t)}`);return O.join(n,O`, `)}selectRuntimeMergeStrategy(e,t){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:this.supportsFullOuterJoin()?`full`:`left`}supportsFullOuterJoin(){let e=this.databaseAdapter.getEngineType();return e===`postgres`||e===`duckdb`}coalesceQualifiedColumn(e,t){if(e.length===1)return O`${O.identifier(e[0])}.${O.identifier(t)}`;let n=e.map(e=>O`${O.identifier(e)}.${O.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=O`coalesce(${r}, ${n[e]})`;return r}canExecuteKeysDeduplication(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryContainsMeasureFilter(e,t,n)}queryContainsMeasureFilter(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}getPrimaryKeyDimensions(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}buildKeysOuterAggregation(e,t,n,r){switch(e){case`min`:return O`min(${O`${O.identifier(t)}.${O.identifier(n)}`})`.as(r);case`max`:return O`max(${O`${O.identifier(t)}.${O.identifier(n)}`})`.as(r);case`avg`:return O`sum(${O`${O.identifier(t)}.${O.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${O`${O.identifier(t)}.${O.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return O`coalesce(sum(${O`${O.identifier(t)}.${O.identifier(n)}`}), 0)`.as(r)}}applyJoinByType(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}};function $(e,t){if(!(typeof process>`u`||!process.env?.DC_DEBUG))try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var en=class{queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;cacheConfig;logicalPlanBuilder;planOptimiser;rlsSetup;constructor(t,n,r){if(this.dbExecutor=t,this.databaseAdapter=t.databaseAdapter,!this.databaseAdapter)throw Error(e._(`server.errors.dbAdapterRequired`));this.queryBuilder=new vt(this.databaseAdapter);let i=new bt,a=new St(this.queryBuilder);this.drizzlePlanBuilder=new $t(this.queryBuilder,a,this.databaseAdapter),this.comparisonQueryBuilder=new Pt(this.databaseAdapter),this.funnelQueryBuilder=new Ft(this.databaseAdapter),this.flowQueryBuilder=new It(this.databaseAdapter),this.retentionQueryBuilder=new Vt(this.databaseAdapter),this.logicalPlanBuilder=new Ht(i),this.planOptimiser=new Ut,this.cacheConfig=n,this.rlsSetup=r}async withRLSContext(t,n){if(!this.rlsSetup)return n();let r=this.dbExecutor.db;if(!r.transaction)throw Error(e._(`server.errors.rlsRequiresTransactions`));let i=this.rlsSetup;return r.transaction(async e=>{await i(e,t);let r=Object.create(this.dbExecutor);return r.db=e,this.dbExecutor=r,n()})}async execute(t,n,r,i){try{let e=this.resolveQueryMode(n);this.validateQueryForMode(e,t,n);let a;if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)if(a=at(n,r,this.cacheConfig),i?.skipCache)this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:0});else try{let e=Date.now(),t=await this.cacheConfig.provider.get(a);if(t)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:a,durationMs:Date.now()-e}),{...t.value,cache:t.metadata?{hit:!0,cachedAt:new Date(t.metadata.cachedAt).toISOString(),ttlMs:t.metadata.ttlMs,ttlRemainingMs:t.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:a,durationMs:Date.now()-e})}catch(e){this.cacheConfig.onError?.(e,`get`)}return await this.withRLSContext(r,()=>this.executeQueryByModeWithCache(e,t,n,r,a))}catch(t){if(t instanceof Error){let n=t;for(;n.cause instanceof Error;)n=n.cause;let r=n.message,i=n;throw i.code&&(r+=` [${i.code}]`),i.detail&&(r+=` Detail: ${i.detail}`),i.hint&&(r+=` Hint: ${i.hint}`),t.message=e._(`server.errors.queryExecutionFailed`,{message:r}),t}throw Error(e._(`server.errors.queryExecutionUnknown`),{cause:t})}}buildLogicalPlan(e,t,n){let r=new q,i=this.createQueryContext(n,r,t);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r,t);return this.preloadFilterCache(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.cacheResult(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(t){let n=this.comparisonQueryBuilder.getComparisonTimeDimension(t);if(!n||!n.compareDateRange)throw Error(e._(`server.errors.noCompareDateRange`));let r=this.comparisonQueryBuilder.normalizePeriods(n.compareDateRange);if(r.length<2)throw Error(e._(`server.errors.compareDateRangeInvalid`));let i=r.map(e=>this.comparisonQueryBuilder.createPeriodQuery(t,e));return{timeDimension:n,granularity:n.granularity||`day`,periods:r,periodQueries:i}}async executeFunnelQueryWithCache(e,t,n,r){let i=await this.executeFunnelQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFunnelQuery(t,n,r){let i=n.funnel,a=this.funnelQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.funnelValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.funnelQueryBuilder.buildFunnelQuery(i,t,o);$(`funnel query`,s);let c=await s,l=this.funnelQueryBuilder.transformResult(c,i),u={measures:{},dimensions:{},segments:{},timeDimensions:{}};return u.funnel={config:i,steps:i.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:l,annotation:u}}async executeFlowQueryWithCache(e,t,n,r){let i=await this.executeFlowQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeFlowQuery(t,n,r){let i=n.flow,a=this.flowQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.flowValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.flowQueryBuilder.buildFlowQuery(i,t,o);$(`flow query`,s);let c=await s,l=this.flowQueryBuilder.transformResult(c),u={measures:{},dimensions:{},segments:{},timeDimensions:{}};return u.flow={config:i,startingStep:{name:i.startingStep.name},stepsBefore:i.stepsBefore,stepsAfter:i.stepsAfter},{data:[l],annotation:u}}async executeRetentionQueryWithCache(e,t,n,r){let i=await this.executeRetentionQuery(e,t,n);return await this.cacheResult(r,i),{...i,cache:{hit:!1}}}async executeRetentionQuery(t,n,r){let i=n.retention,a=this.retentionQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.retentionValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.retentionQueryBuilder.buildRetentionQuery(i,t,o);$(`retention query`,s);let c=await s,l=this.retentionQueryBuilder.transformResult(c,i),u={measures:{},dimensions:{},segments:{},timeDimensions:{}};return u.retention={config:i,granularity:i.granularity,periods:i.periods,retentionType:i.retentionType,breakdownDimensions:i.breakdownDimensions},{data:l,annotation:u}}async executeStandardQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r,t);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i);$(`query`,s);let c=this.queryBuilder.collectNumericFields(e,t),l=await this.dbExecutor.execute(s,c);return{data:jt(Array.isArray(l)?l.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[l],t,t.measures||[]),annotation:this.generateAnnotations(o,t)}}createQueryContext(e,t,n){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t,ungrouped:n?.ungrouped}}getOptimiserEngineType(){let e=this.dbExecutor.getEngineType?.();return e===`singlestore`?`mysql`:e??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(t,n,r){if(!this.funnelQueryBuilder.hasFunnel(n))throw Error(e._(`server.errors.invalidFunnelConfig`));let i=n.funnel,a=this.funnelQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.funnelValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.funnelQueryBuilder.buildFunnelQuery(i,t,o).toSQL();return{sql:s.sql,params:s.params}}async dryRunFlow(t,n,r){if(!this.flowQueryBuilder.hasFlow(n))throw Error(e._(`server.errors.invalidFlowConfig`));let i=n.flow,a=this.flowQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.flowValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.flowQueryBuilder.buildFlowQuery(i,t,o).toSQL();return{sql:s.sql,params:s.params}}async dryRunRetention(t,n,r){if(!this.retentionQueryBuilder.hasRetention(n))throw Error(e._(`server.errors.invalidRetentionConfig`));let i=n.retention,a=this.retentionQueryBuilder.validateConfig(i,t);if(!a.isValid)throw Error(e._(`server.errors.retentionValidationFailed`,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:r},s=this.retentionQueryBuilder.buildRetentionQuery(i,t,o).toSQL();return{sql:s.sql,params:s.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.resolveQueryMode(t);return this.validateQueryForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new q,i=this.createQueryContext(n,r,t);this.preloadFilterCache(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.build(o,t,i).toSQL();return{sql:s.sql,params:s.params}}resolveQueryMode(t){let n=[];if(this.comparisonQueryBuilder.hasComparison(t)&&n.push(`comparison`),this.funnelQueryBuilder.hasFunnel(t)&&n.push(`funnel`),this.flowQueryBuilder.hasFlow(t)&&n.push(`flow`),this.retentionQueryBuilder.hasRetention(t)&&n.push(`retention`),n.length===0)return`regular`;if(n.length>1)throw Error(e._(`server.errors.queryContainsMultipleModes`,{modes:n.join(`, `)}));return n[0]}validateQueryForMode(t,n,r){let i=()=>{let t=rn(n,r);if(!t.isValid)throw Error(e._(`server.errors.queryValidationFailed`,{errors:t.errors.join(`, `)}))};({regular:i,comparison:i,funnel:()=>{let t=this.funnelQueryBuilder.validateConfig(r.funnel,n);if(!t.isValid)throw Error(e._(`server.errors.funnelValidationFailed`,{errors:t.errors.join(`, `)}))},flow:()=>{let t=this.flowQueryBuilder.validateConfig(r.flow,n);if(!t.isValid)throw Error(e._(`server.errors.flowValidationFailed`,{errors:t.errors.join(`, `)}))},retention:()=>{let t=this.retentionQueryBuilder.validateConfig(r.retention,n);if(!t.isValid)throw Error(e._(`server.errors.retentionValidationFailed`,{errors:t.errors.join(`, `)}))}})[tt(t)]()}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeRegularQueryWithCache(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeFunnelQueryWithCache(t,n,r,i),flow:()=>this.executeFlowQueryWithCache(t,n,r,i),retention:()=>this.executeRetentionQueryWithCache(t,n,r,i)}[tt(e)]()}async executeRegularQueryWithCache(e,t,n,r){let i=new q,a=this.createQueryContext(n,i,t);this.preloadFilterCache(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o);this.validateSecurityContext(s,a);let c=this.drizzlePlanBuilder.build(s,t,a);$(`query`,c);let l=this.queryBuilder.collectNumericFields(e,t),u=await this.dbExecutor.execute(c,l),d={data:jt(Array.isArray(u)?u.map(e=>{let n={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in n){let t=n[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=this.databaseAdapter.convertTimeDimensionResult(t),n[e.dimension]=t}}return n}):[u],t,t.measures||[]),annotation:this.generateAnnotations(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.cacheResult(r,d),d}async cacheResult(e,t){if(!(!e||!this.cacheConfig?.provider))try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}async generateSqlForMode(e,t,n,r){return{regular:()=>this.generateUnifiedSQL(t,n,r),comparison:()=>this.generateComparisonSQL(t,n,r),funnel:()=>this.dryRunFunnel(t,n,r),flow:()=>this.dryRunFlow(t,n,r),retention:()=>this.dryRunRetention(t,n,r)}[tt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}generateAnnotations(e,t){let n={},r={},i={},a=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&a.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let t of e.multiFactMerge.groups)t.queryPlan.primaryCube&&a.push(t.queryPlan.primaryCube),t.queryPlan.joinCubes?.length&&a.push(...t.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));if(t.measures)for(let e of t.measures){let[t,r]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.measures[r]){let t=i.measures[r];n[e]={title:t.title||r,shortTitle:t.title||r,type:t.type}}}if(t.dimensions)for(let e of t.dimensions){let[t,n]=e.split(`.`),i=a.find(e=>e?.name===t);if(i&&i.dimensions?.[n]){let t=i.dimensions[n];r[e]={title:t.title||n,shortTitle:t.title||n,type:t.type}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,n]=e.dimension.split(`.`),r=a.find(e=>e?.name===t);if(r&&r.dimensions?.[n]){let t=r.dimensions[n];i[e.dimension]={title:t.title||n,shortTitle:t.title||n,type:t.type,granularity:e.granularity}}}return{measures:n,dimensions:r,segments:{},timeDimensions:i}}preloadFilterCache(e,t,n,r){if(e.filters&&e.filters.length>0){let i=it(e.filters);for(let e of i){let i=K(e);if(t.has(i))continue;let[a,o]=e.member.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))continue;let l=c.type===`time`?G(c.sql,r):typeof c.sql==`function`?c.sql(r):c.sql,u=this.queryBuilder.buildFilterConditionPublic(l,e.operator,e.values,c,e.dateRange);u&&t.set(i,u)}}if(e.timeDimensions){for(let i of e.timeDimensions)if(i.dateRange){let e=rt(i.dimension,i.dateRange);if(t.has(e))continue;let[a,o]=i.dimension.split(`.`),s=n.get(a);if(!s)continue;let c=s.dimensions?.[o];if(!c)continue;let l=G(c.sql,r),u=this.queryBuilder.buildDateRangeCondition(l,i.dateRange);u&&t.set(e,u)}}}},tn=class t{cubes=new Map;metadataCache;cacheConfig;rlsSetup;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(e._(`server.errors.dbNotConfigured`));return Ze(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new en(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.s(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new Z(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let t=[];for(let[n,r]of this.cubes)if(r.joins)for(let[i,a]of Object.entries(r.joins))typeof a.targetCube==`string`&&!this.cubes.has(a.targetCube)&&t.push(e._(`server.errors.cubeRefUnresolved`,{cubeName:n,joinName:i,targetCube:a.targetCube}));if(t.length>0)throw Error(e._(`server.errors.unresolvedCubeRefs`,{details:t.map(e=>` - ${e}`).join(`
197
+ `)}))}validateCalculatedMeasures(t){let n=[];for(let[r,i]of Object.entries(t.measures))if(i.type===`calculated`){if(!i.calculatedSql){n.push(e._(`server.validation.calculatedMeasure.mustHaveCalculatedSql`,{cubeName:t.name,fieldName:r}));continue}let a=ht(i.calculatedSql);if(!a.isValid){n.push(e._(`server.validation.calculatedMeasure.invalidSyntax`,{cubeName:t.name,fieldName:r,errors:a.errors.join(`, `)}));continue}let o=new Map(this.cubes);o.set(t.name,t);let s=new Z(o);try{s.validateDependencies(t)}catch(e){n.push(e instanceof Error?e.message:String(e))}}if(n.length===0){let r=new Map(this.cubes);r.set(t.name,t);let i=new Z(r);i.buildGraph(t);let a=i.detectCycle();a&&n.push(e._(`server.validation.calculatedMeasure.circularDependency`,{cycle:a.join(` -> `)}))}if(n.length>0)throw Error(e._(`server.errors.calculatedMeasureValidation`,{cubeName:t.name,details:n.join(`
198
+ `)}))}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.cubes.get(t))throw Error(e._(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(){return this.metadataCache||=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}static DEFAULT_TIME_GRANULARITIES=[`year`,`quarter`,`month`,`week`,`day`,`hour`];generateCubeMetadata(e){let n=Object.keys(e.measures),r=Object.keys(e.dimensions),i=Array(n.length),a=Array(r.length);for(let t=0;t<n.length;t++){let r=n[t],a=e.measures[r],o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>t.includes(`.`)?t:`${e.name}.${t}`)),i[t]={name:`${e.name}.${r}`,title:a.title||r,shortTitle:a.title||r,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o}}for(let n=0;n<r.length;n++){let i=r[n],o=e.dimensions[i],s;o.type===`time`&&(s=o.granularities||t.DEFAULT_TIME_GRANULARITIES),a[n]={name:`${e.name}.${i}`,title:o.title||i,shortTitle:o.title||i,type:o.type,format:void 0,description:o.description,synonyms:o.synonyms,granularities:s}}let o=[];if(e.joins)for(let[,t]of Object.entries(e.joins)){let e=W(t.targetCube,this.cubes);e&&o.push({targetCube:e.name,relationship:t.relationship,joinFields:t.on.map(e=>({sourceField:this.getColumnName(e.source),targetField:this.getColumnName(e.target)}))})}let s=[];if(e.hierarchies)for(let[,t]of Object.entries(e.hierarchies))s.push({name:t.name,title:t.title||t.name,cubeName:e.name,levels:t.levels.map(t=>t.includes(`.`)?t:`${e.name}.${t}`)});return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:i,dimensions:a,segments:[],relationships:o.length>0?o:void 0,hierarchies:s.length>0?s:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t);if(!i)throw Error(e._(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return rn(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};function nn(e){let t=[];return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)&&t.push(`comparison`),e.funnel!==void 0&&e.funnel.steps?.length>=2&&t.push(`funnel`),e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0&&t.push(`flow`),e.retention!==void 0&&e.retention.timeDimension!=null&&e.retention.bindingKey!=null&&t.push(`retention`),t.length===0?[]:t}function rn(t,n){let r=[],i=nn(n);if(i.length>1)return r.push(e._(`server.validation.query.multipleQueryModes`,{modes:i.join(`, `)})),{isValid:!1,errors:r};let a={funnel:()=>{let i=n.funnel.bindingKey;if(typeof i==`string`){let[n]=i.split(`.`);n&&!t.has(n)&&r.push(e._(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:n}))}else if(Array.isArray(i))for(let n of i)t.has(n.cube)||r.push(e._(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:n.cube}))},flow:()=>{let i=n.flow.bindingKey;if(typeof i==`string`){let[n]=i.split(`.`);n&&!t.has(n)&&r.push(e._(`server.validation.query.flowBindingKeyCubeNotFound`,{cubeName:n}))}},retention:()=>{let i=n.retention,a=on(i.timeDimension);a&&!t.has(a)&&r.push(e._(`server.validation.query.retentionCubeNotFound`,{cubeName:a}));let o=i.bindingKey;if(typeof o==`string`){let[n]=o.split(`.`);n&&!t.has(n)&&r.push(e._(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:n}))}else if(Array.isArray(o))for(let n of o)t.has(n.cube)||r.push(e._(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:n.cube}));if(i.breakdownDimensions&&Array.isArray(i.breakdownDimensions))for(let n of i.breakdownDimensions){let[i]=n.split(`.`);i&&!t.has(i)&&r.push(e._(`server.validation.query.retentionBreakdownCubeNotFound`,{cubeName:i}))}}};if(i.length===1&&i[0]!==`comparison`)return a[i[0]](),{isValid:r.length===0,errors:r};let o=new Set;if(n.measures)for(let i of n.measures){let[n,a]=i.split(`.`);if(!n||!a){r.push(e._(`server.validation.query.invalidMeasureFormat`,{measure:i}));continue}o.add(n);let s=t.get(n);if(!s){r.push(e._(`server.validation.query.cubeNotFoundForMeasure`,{cubeName:n,measure:i}));continue}if(!s.measures[a]){let t=a===n?`. Did you mean one of: ${Object.keys(s.measures).slice(0,5).map(e=>`'${n}.${e}'`).join(`, `)}?`:``;r.push(e._(`server.validation.query.measureNotFound`,{fieldName:a,cubeName:n,hint:t}))}}if(n.dimensions)for(let i of n.dimensions){let[n,a]=i.split(`.`);if(!n||!a){r.push(e._(`server.validation.query.invalidDimensionFormat`,{dimension:i}));continue}o.add(n);let s=t.get(n);if(!s){r.push(e._(`server.validation.query.cubeNotFoundForDimension`,{cubeName:n,dimension:i}));continue}if(!s.dimensions[a]){let t=a===n?`. Did you mean one of: ${Object.keys(s.dimensions).slice(0,5).map(e=>`'${n}.${e}'`).join(`, `)}?`:``;r.push(e._(`server.validation.query.dimensionNotFound`,{fieldName:a,cubeName:n,hint:t}))}}if(n.timeDimensions)for(let i of n.timeDimensions){let[n,a]=i.dimension.split(`.`);if(!n||!a){r.push(e._(`server.validation.query.invalidTimeDimensionFormat`,{dimension:i.dimension}));continue}o.add(n);let s=t.get(n);if(!s){r.push(e._(`server.validation.query.cubeNotFoundForTimeDimension`,{cubeName:n,dimension:i.dimension}));continue}s.dimensions[a]||r.push(e._(`server.validation.query.timeDimensionNotFound`,{fieldName:a,cubeName:n}))}if(n.filters)for(let e of n.filters)an(e,t,r,o);if(o.size===0&&r.push(e._(`server.validation.query.mustReferenceAtLeastOneCube`)),n.ungrouped){n.dimensions&&n.dimensions.length>0||n.timeDimensions&&n.timeDimensions.length>0||r.push(e._(`server.validation.query.ungroupedRequiresDimension`)),n.funnel&&r.push(e._(`server.validation.query.ungroupedIncompatibleFunnel`)),n.flow&&r.push(e._(`server.validation.query.ungroupedIncompatibleFlow`)),n.retention&&r.push(e._(`server.validation.query.ungroupedIncompatibleRetention`)),n.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>0)&&r.push(e._(`server.validation.query.ungroupedIncompatibleCompareDateRange`)),n.timeDimensions?.some(e=>e.fillMissingDates===!0)&&r.push(e._(`server.validation.query.ungroupedIncompatibleFillMissingDates`));let i=new Set([`sum`,`avg`,`min`,`max`,`number`]),a=new Set([`count`,`countDistinct`,`countDistinctApprox`,`calculated`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`]);if(n.measures)for(let e of n.measures){let[n,o]=e.split(`.`),s=t.get(n);if(s&&s.measures[o]){let t=s.measures[o];a.has(t.type)&&r.push(`Measure '${e}' has type '${t.type}' which is incompatible with ungrouped queries. Only ${[...i].join(`, `)} types are allowed.`),t.filters&&t.filters.length>0&&r.push(`Measure '${e}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`)}}for(let e of o){let n=t.get(e);if(n&&n.joins){for(let[i,a]of Object.entries(n.joins))if(a.relationship===`hasMany`){let n=W(a.targetCube,t);n&&o.has(n.name)&&r.push(`Ungrouped queries are incompatible with hasMany relationships (${e} → ${i} is hasMany)`)}}}}return{isValid:r.length===0,errors:r}}function an(t,n,r,i){if(`and`in t||`or`in t){let e=t.and||t.or||[];for(let t of e)an(t,n,r,i);return}if(!(`member`in t)){r.push(e._(`server.validation.query.filterMustHaveMember`));return}let[a,o]=t.member.split(`.`);if(!a||!o){r.push(e._(`server.validation.query.invalidFilterMemberFormat`,{member:t.member}));return}i.add(a);let s=n.get(a);if(!s){r.push(e._(`server.validation.query.cubeNotFoundForFilter`,{cubeName:a,member:t.member}));return}if(!s.dimensions[o]&&!s.measures[o]){let t=o===a?`. Did you mean one of: ${[...Object.keys(s.dimensions),...Object.keys(s.measures)].slice(0,5).map(e=>`'${a}.${e}'`).join(`, `)}?`:``;r.push(e._(`server.validation.query.filterFieldNotFound`,{fieldName:o,cubeName:a,hint:t}))}}function on(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var sn=`x-dc-locale`;function cn(e){if(!e)return;let t=(Array.isArray(e)?e[0]:e).split(`,`)[0]?.trim();if(t&&/^[A-Za-z0-9-]{2,35}$/.test(t))return t}function ln(e){return cn(e(sn))}function un(e,t){let n=e&&typeof e==`object`?e:{},r=typeof n.locale==`string`?n.locale:void 0,i=t??r??`en-GB`;return r===i?n:{...n,locale:i}}function dn(e){let t=Array.isArray(e)?[...e]:(e??``).split(`,`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e.toLowerCase()===`x-dc-locale`)||t.push(`X-DC-Locale`),t}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return tn}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ln}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return un}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return dn}});