drizzle-cube 0.4.36 → 0.4.38

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 (80) hide show
  1. package/dist/adapters/express/index.cjs +1 -1
  2. package/dist/adapters/express/index.js +3 -3
  3. package/dist/adapters/fastify/index.cjs +1 -1
  4. package/dist/adapters/fastify/index.js +3 -3
  5. package/dist/adapters/{handler-DzUX7CBs.cjs → handler-dHHEEbG9.cjs} +1 -1
  6. package/dist/adapters/{handler-J55KQKe5.js → handler-fto6TSVn.js} +1 -1
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +3 -3
  9. package/dist/adapters/{mcp-transport-CjA5_6G_.cjs → mcp-transport-ro4OL4BW.cjs} +4 -4
  10. package/dist/adapters/{mcp-transport-x_A7Q5OL.js → mcp-transport-tB5a7Het.js} +70 -17
  11. package/dist/adapters/nextjs/index.cjs +1 -1
  12. package/dist/adapters/nextjs/index.js +3 -3
  13. package/dist/adapters/{utils-CDExg9uP.cjs → utils-2MwxiQ2o.cjs} +1 -1
  14. package/dist/adapters/{utils-DkKcpkx5.js → utils-_2o905Fi.js} +2 -1
  15. package/dist/adapters/utils.cjs +1 -1
  16. package/dist/adapters/utils.d.ts +2 -0
  17. package/dist/adapters/utils.js +1 -1
  18. package/dist/client/charts.js +3 -3
  19. package/dist/client/chunks/{DashboardEditModal-kWEk4KJC.js → DashboardEditModal-DrjEsyoO.js} +7 -7
  20. package/dist/client/chunks/DashboardEditModal-DrjEsyoO.js.map +1 -0
  21. package/dist/client/chunks/{FieldSearchModal-rB26lhBD.js → FieldSearchModal-BxQ5JhWz.js} +2 -2
  22. package/dist/client/chunks/{FieldSearchModal-rB26lhBD.js.map → FieldSearchModal-BxQ5JhWz.js.map} +1 -1
  23. package/dist/client/chunks/{analysis-builder-CdDPUAEU.js → analysis-builder-CmJhXXc7.js} +1863 -2554
  24. package/dist/client/chunks/analysis-builder-CmJhXXc7.js.map +1 -0
  25. package/dist/client/chunks/{analysis-builder-shared-3V70XUNW.js → analysis-builder-shared-BxHYfTzo.js} +1516 -722
  26. package/dist/client/chunks/analysis-builder-shared-BxHYfTzo.js.map +1 -0
  27. package/dist/client/chunks/{chart-data-table-BlkFWPhF.js → chart-data-table-CW_qZDpt.js} +11 -1
  28. package/dist/client/chunks/chart-data-table-CW_qZDpt.js.map +1 -0
  29. package/dist/client/chunks/{chart-kpi-delta-CUIjCDS3.js → chart-kpi-delta-BPexzOe7.js} +2 -2
  30. package/dist/client/chunks/{chart-kpi-delta-CUIjCDS3.js.map → chart-kpi-delta-BPexzOe7.js.map} +1 -1
  31. package/dist/client/chunks/{chart-kpi-number-CxlpSKYh.js → chart-kpi-number-BBtGBtZL.js} +3 -3
  32. package/dist/client/chunks/{chart-kpi-number-CxlpSKYh.js.map → chart-kpi-number-BBtGBtZL.js.map} +1 -1
  33. package/dist/client/chunks/{chart-kpi-text-C16fwohp.js → chart-kpi-text-BqHhmJEB.js} +2 -2
  34. package/dist/client/chunks/{chart-kpi-text-C16fwohp.js.map → chart-kpi-text-BqHhmJEB.js.map} +1 -1
  35. package/dist/client/chunks/{charts-loader-BFhQWB_d.js → charts-loader-gZjOqZwG.js} +5 -5
  36. package/dist/client/chunks/{charts-loader-BFhQWB_d.js.map → charts-loader-gZjOqZwG.js.map} +1 -1
  37. package/dist/client/chunks/{schema-visualization-qmLI8MGQ.js → schema-visualization-XLFzV_7p.js} +2 -2
  38. package/dist/client/chunks/{schema-visualization-qmLI8MGQ.js.map → schema-visualization-XLFzV_7p.js.map} +1 -1
  39. package/dist/client/chunks/{useDebounce-xfPFr2fi.js → useDebounce-C_wstEud.js} +2 -2
  40. package/dist/client/chunks/{useDebounce-xfPFr2fi.js.map → useDebounce-C_wstEud.js.map} +1 -1
  41. package/dist/client/chunks/{useExplainAI-6COjssus.js → useExplainAI-C9ytXRIC.js} +21 -18
  42. package/dist/client/chunks/{useExplainAI-6COjssus.js.map → useExplainAI-C9ytXRIC.js.map} +1 -1
  43. package/dist/client/chunks/{utils-nCeVL-Hm.js → utils-3FNmeZJR.js} +2 -2
  44. package/dist/client/chunks/{utils-nCeVL-Hm.js.map → utils-3FNmeZJR.js.map} +1 -1
  45. package/dist/client/chunks/{vendor-WzXX36hd.js → vendor-BPRWulB7.js} +2 -2
  46. package/dist/client/chunks/{vendor-WzXX36hd.js.map → vendor-BPRWulB7.js.map} +1 -1
  47. package/dist/client/components/AIAssistant/utils.d.ts +1 -1
  48. package/dist/client/components/AnalysisBuilder/LimitSection.d.ts +14 -0
  49. package/dist/client/components/AnalysisBuilder/types.d.ts +7 -0
  50. package/dist/client/components/AnalysisBuilder/utils/queryUtils.d.ts +1 -1
  51. package/dist/client/components/DataBrowser/DataBrowserSidebar.d.ts +16 -0
  52. package/dist/client/components/DataBrowser/DataBrowserTable.d.ts +16 -0
  53. package/dist/client/components/DataBrowser/DataBrowserToolbar.d.ts +22 -0
  54. package/dist/client/components/DataBrowser/index.d.ts +28 -0
  55. package/dist/client/components.js +3 -3
  56. package/dist/client/hooks/useAnalysisBuilderHook.d.ts +1 -0
  57. package/dist/client/hooks/useDataBrowser.d.ts +67 -0
  58. package/dist/client/hooks.js +3 -3
  59. package/dist/client/icons/types.d.ts +1 -0
  60. package/dist/client/icons.js +1 -1
  61. package/dist/client/index.d.ts +3 -0
  62. package/dist/client/index.js +774 -192
  63. package/dist/client/index.js.map +1 -1
  64. package/dist/client/providers/CubeApiProvider.d.ts +1 -0
  65. package/dist/client/providers.js +1 -1
  66. package/dist/client/stores/analysisBuilderStore.d.ts +2 -0
  67. package/dist/client/stores/dataBrowserStore.d.ts +34 -0
  68. package/dist/client/stores/slices/querySlice.d.ts +1 -0
  69. package/dist/client/styles.css +1 -1
  70. package/dist/client/types.d.ts +2 -0
  71. package/dist/client/utils.js +3 -3
  72. package/dist/client-bundle-stats.html +1 -1
  73. package/dist/server/index.cjs +3 -3
  74. package/dist/server/index.d.ts +18 -0
  75. package/dist/server/index.js +68 -15
  76. package/package.json +1 -1
  77. package/dist/client/chunks/DashboardEditModal-kWEk4KJC.js.map +0 -1
  78. package/dist/client/chunks/analysis-builder-CdDPUAEU.js.map +0 -1
  79. package/dist/client/chunks/analysis-builder-shared-3V70XUNW.js.map +0 -1
  80. package/dist/client/chunks/chart-data-table-BlkFWPhF.js.map +0 -1
@@ -1,4 +1,4 @@
1
- const e=require(`./utils-CDExg9uP.cjs`),t=require(`./mcp-prompts-DsAkafVn.cjs`);var n=Symbol.for(`drizzle:entityKind`);function r(e,t){if(!e||typeof e!=`object`)return!1;if(e instanceof t)return!0;if(!Object.prototype.hasOwnProperty.call(t,n))throw Error(`Class "${t.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(n in r&&r[n]===t[n])return!0;r=Object.getPrototypeOf(r)}return!1}var i=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[n]=`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`}},a=class{static[n]=`ColumnBuilder`;config;constructor(e,t,n){this.config={name:e,keyAsName:e===``,notNull:!1,default:void 0,hasDefault:!1,primaryKey:!1,isUnique:!1,uniqueName:void 0,uniqueType:void 0,dataType:t,columnType:n,generated:void 0}}$type(){return this}notNull(){return this.config.notNull=!0,this}default(e){return this.config.default=e,this.config.hasDefault=!0,this}$defaultFn(e){return this.config.defaultFn=e,this.config.hasDefault=!0,this}$default=this.$defaultFn;$onUpdateFn(e){return this.config.onUpdateFn=e,this.config.hasDefault=!0,this}$onUpdate=this.$onUpdateFn;primaryKey(){return this.config.primaryKey=!0,this.config.notNull=!0,this}setName(e){this.config.name===``&&(this.config.name=e)}},o=Symbol.for(`drizzle:Name`),s=class{static[n]=`PgForeignKeyBuilder`;reference;_onUpdate=`no action`;_onDelete=`no action`;constructor(e,t){this.reference=()=>{let{name:t,columns:n,foreignColumns:r}=e();return{name:t,columns:n,foreignTable:r[0].table,foreignColumns:r}},t&&(this._onUpdate=t.onUpdate,this._onDelete=t.onDelete)}onUpdate(e){return this._onUpdate=e===void 0?`no action`:e,this}onDelete(e){return this._onDelete=e===void 0?`no action`:e,this}build(e){return new c(e,this)}},c=class{constructor(e,t){this.table=e,this.reference=t.reference,this.onUpdate=t._onUpdate,this.onDelete=t._onDelete}static[n]=`PgForeignKey`;reference;onUpdate;onDelete;getName(){let{name:e,columns:t,foreignColumns:n}=this.reference(),r=t.map(e=>e.name),i=n.map(e=>e.name),a=[this.table[o],...r,n[0].table[o],...i];return e??`${a.join(`_`)}_fk`}};function l(e,...t){return e(...t)}function u(e,t){return`${e[o]}_${t.join(`_`)}_unique`}function d(e,t,n){for(let r=t;r<e.length;r++){let i=e[r];if(i===`\\`){r++;continue}if(i===`"`)return[e.slice(t,r).replace(/\\/g,``),r+1];if(!n&&(i===`,`||i===`}`))return[e.slice(t,r).replace(/\\/g,``),r]}return[e.slice(t).replace(/\\/g,``),e.length]}function f(e,t=0){let n=[],r=t,i=!1;for(;r<e.length;){let a=e[r];if(a===`,`){(i||r===t)&&n.push(``),i=!0,r++;continue}if(i=!1,a===`\\`){r+=2;continue}if(a===`"`){let[t,i]=d(e,r+1,!0);n.push(t),r=i;continue}if(a===`}`)return[n,r+1];if(a===`{`){let[t,i]=f(e,r+1);n.push(t),r=i;continue}let[o,s]=d(e,r,!1);n.push(o),r=s}return[n,r]}function p(e){let[t]=f(e,1);return t}function m(e){return`{${e.map(e=>Array.isArray(e)?m(e):typeof e==`string`?`"${e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:`${e}`).join(`,`)}}`}var h=class extends a{foreignKeyConfigs=[];static[n]=`PgColumnBuilder`;array(e){return new v(this.config.name,this,e)}references(e,t={}){return this.foreignKeyConfigs.push({ref:e,actions:t}),this}unique(e,t){return this.config.isUnique=!0,this.config.uniqueName=e,this.config.uniqueType=t?.nulls,this}generatedAlwaysAs(e){return this.config.generated={as:e,type:`always`,mode:`stored`},this}buildForeignKeys(e,t){return this.foreignKeyConfigs.map(({ref:n,actions:r})=>l((n,r)=>{let i=new s(()=>{let t=n();return{columns:[e],foreignColumns:[t]}});return r.onUpdate&&i.onUpdate(r.onUpdate),r.onDelete&&i.onDelete(r.onDelete),i.build(t)},n,r))}buildExtraConfigColumn(e){return new _(e,this.config)}},g=class extends i{constructor(e,t){t.uniqueName||=u(e,[t.name]),super(e,t),this.table=e}static[n]=`PgColumn`},_=class extends g{static[n]=`ExtraConfigColumn`;getSQLType(){return this.getSQLType()}indexConfig={order:this.config.order??`asc`,nulls:this.config.nulls??`last`,opClass:this.config.opClass};defaultConfig={order:`asc`,nulls:`last`,opClass:void 0};asc(){return this.indexConfig.order=`asc`,this}desc(){return this.indexConfig.order=`desc`,this}nullsFirst(){return this.indexConfig.nulls=`first`,this}nullsLast(){return this.indexConfig.nulls=`last`,this}op(e){return this.indexConfig.opClass=e,this}},v=class extends h{static[n]=`PgArrayBuilder`;constructor(e,t,n){super(e,`array`,`PgArray`),this.config.baseBuilder=t,this.config.size=n}build(e){let t=this.config.baseBuilder.build(e);return new y(e,this.config,t)}},y=class e extends g{constructor(e,t,n,r){super(e,t),this.baseColumn=n,this.range=r,this.size=t.size}size;static[n]=`PgArray`;getSQLType(){return`${this.baseColumn.getSQLType()}[${typeof this.size==`number`?this.size:``}]`}mapFromDriverValue(e){return typeof e==`string`&&(e=p(e)),e.map(e=>this.baseColumn.mapFromDriverValue(e))}mapToDriverValue(t,n=!1){let i=t.map(t=>t===null?null:r(this.baseColumn,e)?this.baseColumn.mapToDriverValue(t,!0):this.baseColumn.mapToDriverValue(t));return n?i:m(i)}},b=Symbol.for(`drizzle:isPgEnum`);function x(e){return!!e&&typeof e==`function`&&b in e&&e[b]===!0}var S=class{static[n]=`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()}},w=Symbol.for(`drizzle:ViewBaseConfig`),T=Symbol.for(`drizzle:Schema`),E=Symbol.for(`drizzle:Columns`),ee=Symbol.for(`drizzle:ExtraConfigColumns`),D=Symbol.for(`drizzle:OriginalName`),O=Symbol.for(`drizzle:BaseName`),k=Symbol.for(`drizzle:IsAlias`),te=Symbol.for(`drizzle:ExtraConfigBuilder`),ne=Symbol.for(`drizzle:IsDrizzleTable`),A=class{static[n]=`Table`;static Symbol={Name:o,Schema:T,OriginalName:D,Columns:E,ExtraConfigColumns:ee,BaseName:O,IsAlias:k,ExtraConfigBuilder:te};[o];[D];[T];[E];[ee];[O];[k]=!1;[ne]=!0;[te]=void 0;constructor(e,t,n){this[o]=this[D]=e,this[T]=t,this[O]=n}};function re(e){return e!=null&&typeof e.getSQL==`function`}function ie(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 j=class{static[n]=`StringChunk`;value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new M([this])}},M=class e{constructor(e){this.queryChunks=e;for(let t of e)if(r(t,A)){let e=t[A.Symbol.Schema];this.usedTables.push(e===void 0?t[A.Symbol.Name]:e+`.`+t[A.Symbol.Name])}}static[n]=`SQL`;decoder=se;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,n){let a=Object.assign({},n,{inlineParams:n.inlineParams||this.shouldInlineParams,paramStartIndex:n.paramStartIndex||{value:0}}),{casing:o,escapeName:s,escapeParam:c,prepareTyping:l,inlineParams:u,paramStartIndex:d}=a;return ie(t.map(t=>{if(r(t,j))return{sql:t.value.join(``),params:[]};if(r(t,ae))return{sql:s(t.value),params:[]};if(t===void 0)return{sql:``,params:[]};if(Array.isArray(t)){let e=[new j(`(`)];for(let[n,r]of t.entries())e.push(r),n<t.length-1&&e.push(new j(`, `));return e.push(new j(`)`)),this.buildQueryFromSourceParams(e,a)}if(r(t,e))return this.buildQueryFromSourceParams(t.queryChunks,{...a,inlineParams:u||t.shouldInlineParams});if(r(t,A)){let e=t[A.Symbol.Schema],n=t[A.Symbol.Name];return{sql:e===void 0||t[k]?s(n):s(e)+`.`+s(n),params:[]}}if(r(t,i)){let e=o.getColumnCasing(t);if(n.invokeSource===`indexes`)return{sql:s(e),params:[]};let r=t.table[A.Symbol.Schema];return{sql:t.table[k]||r===void 0?s(t.table[A.Symbol.Name])+`.`+s(e):s(r)+`.`+s(t.table[A.Symbol.Name])+`.`+s(e),params:[]}}if(r(t,ue)){let e=t[w].schema,n=t[w].name;return{sql:e===void 0||t[w].isAlias?s(n):s(e)+`.`+s(n),params:[]}}if(r(t,N)){if(r(t.value,F))return{sql:c(d.value++,t),params:[t],typings:[`none`]};let n=t.value===null?null:t.encoder.mapToDriverValue(t.value);if(r(n,e))return this.buildQueryFromSourceParams([n],a);if(u)return{sql:this.mapInlineParam(n,a),params:[]};let i=[`none`];return l&&(i=[l(t.encoder)]),{sql:c(d.value++,n),params:[n],typings:i}}return r(t,F)?{sql:c(d.value++,t),params:[t],typings:[`none`]}:r(t,e.Aliased)&&t.fieldAlias!==void 0?{sql:s(t.fieldAlias),params:[]}:r(t,S)?t._.isWith?{sql:s(t._.alias),params:[]}:this.buildQueryFromSourceParams([new j(`(`),t._.sql,new j(`) `),new ae(t._.alias)],a):x(t)?t.schema?{sql:s(t.schema)+`.`+s(t.enumName),params:[]}:{sql:s(t.enumName),params:[]}:re(t)?t.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([t.getSQL()],a):this.buildQueryFromSourceParams([new j(`(`),t.getSQL(),new j(`)`)],a):u?{sql:this.mapInlineParam(t,a),params:[]}:{sql:c(d.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}},ae=class{constructor(e){this.value=e}static[n]=`Name`;brand;getSQL(){return new M([this])}};function oe(e){return typeof e==`object`&&!!e&&`mapToDriverValue`in e&&typeof e.mapToDriverValue==`function`}var se={mapFromDriverValue:e=>e},ce={mapToDriverValue:e=>e};({...se,...ce});var N=class{constructor(e,t=ce){this.value=e,this.encoder=t}static[n]=`Param`;brand;getSQL(){return new M([this])}};function P(e,...t){let n=[];(t.length>0||e.length>0&&e[0]!==``)&&n.push(new j(e[0]));for(let[r,i]of t.entries())n.push(i,new j(e[r+1]));return new M(n)}(e=>{function t(){return new M([])}e.empty=t;function n(e){return new M(e)}e.fromList=n;function r(e){return new M([new j(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 M(n)}e.join=i;function a(e){return new ae(e)}e.identifier=a;function o(e){return new F(e)}e.placeholder=o;function s(e,t){return new N(e,t)}e.param=s})(P||={}),(e=>{class t{constructor(e,t){this.sql=e,this.fieldAlias=t}static[n]=`SQL.Aliased`;isSelectionField=!1;getSQL(){return this.sql}clone(){return new t(this.sql,this.fieldAlias)}}e.Aliased=t})(M||={});var F=class{constructor(e){this.name=e}static[n]=`Placeholder`;getSQL(){return new M([this])}},le=Symbol.for(`drizzle:IsDrizzleView`),ue=class{static[n]=`View`;[w];[le]=!0;constructor({name:e,schema:t,selectedFields:n,query:r}){this[w]={name:e,originalName:e,schema:t,selectedFields:n,query:r,isExisting:!r,isAlias:!1}}getSQL(){return new M([this])}};i.prototype.getSQL=function(){return new M([this])},A.prototype.getSQL=function(){return new M([this])},S.prototype.getSQL=function(){return new M([this])};function I(e,t){return oe(t)&&!re(e)&&!r(e,N)&&!r(e,F)&&!r(e,i)&&!r(e,A)&&!r(e,ue)?new N(e,t):e}var L=(e,t)=>P`${e} = ${I(t,e)}`,de=(e,t)=>P`${e} <> ${I(t,e)}`;function R(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new M(t):new M([new j(`(`),P.join(t,new j(` and `)),new j(`)`)])}function fe(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new M(t):new M([new j(`(`),P.join(t,new j(` or `)),new j(`)`)])}var pe=(e,t)=>P`${e} > ${I(t,e)}`,z=(e,t)=>P`${e} >= ${I(t,e)}`,me=(e,t)=>P`${e} < ${I(t,e)}`,B=(e,t)=>P`${e} <= ${I(t,e)}`;function he(e,t){return Array.isArray(t)?t.length===0?P`false`:P`${e} in ${t.map(t=>I(t,e))}`:P`${e} in ${I(t,e)}`}function ge(e,t){return Array.isArray(t)?t.length===0?P`true`:P`${e} not in ${t.map(t=>I(t,e))}`:P`${e} not in ${I(t,e)}`}function _e(e){return P`${e} is null`}function ve(e){return P`${e} is not null`}function ye(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContains requires at least one value`);return P`${e} @> ${P`${I(t,e)}`}`}return P`${e} @> ${I(t,e)}`}function be(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContained requires at least one value`);return P`${e} <@ ${P`${I(t,e)}`}`}return P`${e} <@ ${I(t,e)}`}function xe(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayOverlaps requires at least one value`);return P`${e} && ${P`${I(t,e)}`}`}return P`${e} && ${I(t,e)}`}function Se(e){return P`${e} asc`}function Ce(e){return P`${e} desc`}function we(e){return P`count(${e||P.raw(`*`)})`.mapWith(Number)}function Te(e){return P`count(distinct ${e})`.mapWith(Number)}function V(e){return P`sum(${e})`.mapWith(String)}function H(e){return P`max(${e})`.mapWith(r(e,i)?e:String)}function Ee(e){return P`min(${e})`.mapWith(r(e,i)?e:String)}var U=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}},De=class extends U{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 P`INTERVAL '${P.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return P`EXTRACT(EPOCH FROM (${e} - ${t}))`}buildDateAddInterval(e,t){return P`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?P`COUNT(*) FILTER (WHERE ${n})`:P`${P.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return P`(${t}::date - ${e}::date)`;case`week`:return P`FLOOR((${t}::date - ${e}::date) / 7)`;case`month`:return P`(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 P`(SELECT generate_series(0, ${e}) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return P`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return P`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return P`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return P`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return P`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return P`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return P`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return P`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return P`${e} ILIKE ${`%${n}%`}`;case`notContains`:return P`${e} NOT ILIKE ${`%${n}%`}`;case`startsWith`:return P`${e} ILIKE ${`${n}%`}`;case`endsWith`:return P`${e} ILIKE ${`%${n}`}`;case`like`:return P`${e} LIKE ${n}`;case`notLike`:return P`${e} NOT LIKE ${n}`;case`ilike`:return P`${e} ILIKE ${n}`;case`regex`:return P`${e} ~* ${n}`;case`notRegex`:return P`${e} !~* ${n}`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return P`${e}::timestamp`;case`decimal`:return P`${e}::decimal`;case`integer`:return P`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return P`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>P`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>P`${e} ${t}`);return t===void 0?P`CASE ${n} END`:P`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?P`TRUE`:P`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 P`COALESCE(${P.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return P`COALESCE(${P.raw(n)}(${e}), 0)`}buildPercentile(e,t){return P`PERCENTILE_CONT(${t/100}) WITHIN GROUP (ORDER BY ${e})`}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?P`PARTITION BY ${P.join(n,P`, `)}`:P``,o=r&&r.length>0?P`ORDER BY ${P.join(r.map(e=>e.direction===`desc`?P`${e.field} DESC`:P`${e.field} ASC`),P`, `)}`:P``,s=P``;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=P`${P.raw(r)} BETWEEN ${P.raw(a)} AND ${P.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=P`OVER (${c.length>0?P.join(c,P` `):P``})`;switch(e){case`lag`:return P`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?P``:P`, ${i.defaultValue}`}) ${l}`;case`lead`:return P`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?P``:P`, ${i.defaultValue}`}) ${l}`;case`rank`:return P`RANK() ${l}`;case`denseRank`:return P`DENSE_RANK() ${l}`;case`rowNumber`:return P`ROW_NUMBER() ${l}`;case`ntile`:return P`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return P`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return P`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return P`AVG(${t}) ${l}`;case`movingSum`:return P`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},Oe=class extends U{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`),P`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return P`TIMESTAMPDIFF(SECOND, ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=P`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`),n.months&&(r=P`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`),n.days&&(r=P`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`),n.hours&&(r=P`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`),n.minutes&&(r=P`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`),n.seconds&&(r=P`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`),r}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?P`COUNT(CASE WHEN ${n} THEN 1 END)`:P`${P.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return P`TIMESTAMPDIFF(${P.raw(r)}, ${e}, ${t})`}buildPeriodSeriesSubquery(e){return P`(
1
+ const e=require(`./utils-2MwxiQ2o.cjs`),t=require(`./mcp-prompts-DsAkafVn.cjs`);var n=Symbol.for(`drizzle:entityKind`);function r(e,t){if(!e||typeof e!=`object`)return!1;if(e instanceof t)return!0;if(!Object.prototype.hasOwnProperty.call(t,n))throw Error(`Class "${t.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(n in r&&r[n]===t[n])return!0;r=Object.getPrototypeOf(r)}return!1}var i=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[n]=`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`}},a=class{static[n]=`ColumnBuilder`;config;constructor(e,t,n){this.config={name:e,keyAsName:e===``,notNull:!1,default:void 0,hasDefault:!1,primaryKey:!1,isUnique:!1,uniqueName:void 0,uniqueType:void 0,dataType:t,columnType:n,generated:void 0}}$type(){return this}notNull(){return this.config.notNull=!0,this}default(e){return this.config.default=e,this.config.hasDefault=!0,this}$defaultFn(e){return this.config.defaultFn=e,this.config.hasDefault=!0,this}$default=this.$defaultFn;$onUpdateFn(e){return this.config.onUpdateFn=e,this.config.hasDefault=!0,this}$onUpdate=this.$onUpdateFn;primaryKey(){return this.config.primaryKey=!0,this.config.notNull=!0,this}setName(e){this.config.name===``&&(this.config.name=e)}},o=Symbol.for(`drizzle:Name`),s=class{static[n]=`PgForeignKeyBuilder`;reference;_onUpdate=`no action`;_onDelete=`no action`;constructor(e,t){this.reference=()=>{let{name:t,columns:n,foreignColumns:r}=e();return{name:t,columns:n,foreignTable:r[0].table,foreignColumns:r}},t&&(this._onUpdate=t.onUpdate,this._onDelete=t.onDelete)}onUpdate(e){return this._onUpdate=e===void 0?`no action`:e,this}onDelete(e){return this._onDelete=e===void 0?`no action`:e,this}build(e){return new c(e,this)}},c=class{constructor(e,t){this.table=e,this.reference=t.reference,this.onUpdate=t._onUpdate,this.onDelete=t._onDelete}static[n]=`PgForeignKey`;reference;onUpdate;onDelete;getName(){let{name:e,columns:t,foreignColumns:n}=this.reference(),r=t.map(e=>e.name),i=n.map(e=>e.name),a=[this.table[o],...r,n[0].table[o],...i];return e??`${a.join(`_`)}_fk`}};function l(e,...t){return e(...t)}function u(e,t){return`${e[o]}_${t.join(`_`)}_unique`}function d(e,t,n){for(let r=t;r<e.length;r++){let i=e[r];if(i===`\\`){r++;continue}if(i===`"`)return[e.slice(t,r).replace(/\\/g,``),r+1];if(!n&&(i===`,`||i===`}`))return[e.slice(t,r).replace(/\\/g,``),r]}return[e.slice(t).replace(/\\/g,``),e.length]}function f(e,t=0){let n=[],r=t,i=!1;for(;r<e.length;){let a=e[r];if(a===`,`){(i||r===t)&&n.push(``),i=!0,r++;continue}if(i=!1,a===`\\`){r+=2;continue}if(a===`"`){let[t,i]=d(e,r+1,!0);n.push(t),r=i;continue}if(a===`}`)return[n,r+1];if(a===`{`){let[t,i]=f(e,r+1);n.push(t),r=i;continue}let[o,s]=d(e,r,!1);n.push(o),r=s}return[n,r]}function p(e){let[t]=f(e,1);return t}function m(e){return`{${e.map(e=>Array.isArray(e)?m(e):typeof e==`string`?`"${e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:`${e}`).join(`,`)}}`}var h=class extends a{foreignKeyConfigs=[];static[n]=`PgColumnBuilder`;array(e){return new v(this.config.name,this,e)}references(e,t={}){return this.foreignKeyConfigs.push({ref:e,actions:t}),this}unique(e,t){return this.config.isUnique=!0,this.config.uniqueName=e,this.config.uniqueType=t?.nulls,this}generatedAlwaysAs(e){return this.config.generated={as:e,type:`always`,mode:`stored`},this}buildForeignKeys(e,t){return this.foreignKeyConfigs.map(({ref:n,actions:r})=>l((n,r)=>{let i=new s(()=>{let t=n();return{columns:[e],foreignColumns:[t]}});return r.onUpdate&&i.onUpdate(r.onUpdate),r.onDelete&&i.onDelete(r.onDelete),i.build(t)},n,r))}buildExtraConfigColumn(e){return new _(e,this.config)}},g=class extends i{constructor(e,t){t.uniqueName||=u(e,[t.name]),super(e,t),this.table=e}static[n]=`PgColumn`},_=class extends g{static[n]=`ExtraConfigColumn`;getSQLType(){return this.getSQLType()}indexConfig={order:this.config.order??`asc`,nulls:this.config.nulls??`last`,opClass:this.config.opClass};defaultConfig={order:`asc`,nulls:`last`,opClass:void 0};asc(){return this.indexConfig.order=`asc`,this}desc(){return this.indexConfig.order=`desc`,this}nullsFirst(){return this.indexConfig.nulls=`first`,this}nullsLast(){return this.indexConfig.nulls=`last`,this}op(e){return this.indexConfig.opClass=e,this}},v=class extends h{static[n]=`PgArrayBuilder`;constructor(e,t,n){super(e,`array`,`PgArray`),this.config.baseBuilder=t,this.config.size=n}build(e){let t=this.config.baseBuilder.build(e);return new y(e,this.config,t)}},y=class e extends g{constructor(e,t,n,r){super(e,t),this.baseColumn=n,this.range=r,this.size=t.size}size;static[n]=`PgArray`;getSQLType(){return`${this.baseColumn.getSQLType()}[${typeof this.size==`number`?this.size:``}]`}mapFromDriverValue(e){return typeof e==`string`&&(e=p(e)),e.map(e=>this.baseColumn.mapFromDriverValue(e))}mapToDriverValue(t,n=!1){let i=t.map(t=>t===null?null:r(this.baseColumn,e)?this.baseColumn.mapToDriverValue(t,!0):this.baseColumn.mapToDriverValue(t));return n?i:m(i)}},b=Symbol.for(`drizzle:isPgEnum`);function x(e){return!!e&&typeof e==`function`&&b in e&&e[b]===!0}var S=class{static[n]=`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()}},w=Symbol.for(`drizzle:ViewBaseConfig`),T=Symbol.for(`drizzle:Schema`),E=Symbol.for(`drizzle:Columns`),ee=Symbol.for(`drizzle:ExtraConfigColumns`),D=Symbol.for(`drizzle:OriginalName`),O=Symbol.for(`drizzle:BaseName`),k=Symbol.for(`drizzle:IsAlias`),te=Symbol.for(`drizzle:ExtraConfigBuilder`),ne=Symbol.for(`drizzle:IsDrizzleTable`),A=class{static[n]=`Table`;static Symbol={Name:o,Schema:T,OriginalName:D,Columns:E,ExtraConfigColumns:ee,BaseName:O,IsAlias:k,ExtraConfigBuilder:te};[o];[D];[T];[E];[ee];[O];[k]=!1;[ne]=!0;[te]=void 0;constructor(e,t,n){this[o]=this[D]=e,this[T]=t,this[O]=n}};function re(e){return e!=null&&typeof e.getSQL==`function`}function ie(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 j=class{static[n]=`StringChunk`;value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new M([this])}},M=class e{constructor(e){this.queryChunks=e;for(let t of e)if(r(t,A)){let e=t[A.Symbol.Schema];this.usedTables.push(e===void 0?t[A.Symbol.Name]:e+`.`+t[A.Symbol.Name])}}static[n]=`SQL`;decoder=se;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,n){let a=Object.assign({},n,{inlineParams:n.inlineParams||this.shouldInlineParams,paramStartIndex:n.paramStartIndex||{value:0}}),{casing:o,escapeName:s,escapeParam:c,prepareTyping:l,inlineParams:u,paramStartIndex:d}=a;return ie(t.map(t=>{if(r(t,j))return{sql:t.value.join(``),params:[]};if(r(t,ae))return{sql:s(t.value),params:[]};if(t===void 0)return{sql:``,params:[]};if(Array.isArray(t)){let e=[new j(`(`)];for(let[n,r]of t.entries())e.push(r),n<t.length-1&&e.push(new j(`, `));return e.push(new j(`)`)),this.buildQueryFromSourceParams(e,a)}if(r(t,e))return this.buildQueryFromSourceParams(t.queryChunks,{...a,inlineParams:u||t.shouldInlineParams});if(r(t,A)){let e=t[A.Symbol.Schema],n=t[A.Symbol.Name];return{sql:e===void 0||t[k]?s(n):s(e)+`.`+s(n),params:[]}}if(r(t,i)){let e=o.getColumnCasing(t);if(n.invokeSource===`indexes`)return{sql:s(e),params:[]};let r=t.table[A.Symbol.Schema];return{sql:t.table[k]||r===void 0?s(t.table[A.Symbol.Name])+`.`+s(e):s(r)+`.`+s(t.table[A.Symbol.Name])+`.`+s(e),params:[]}}if(r(t,ue)){let e=t[w].schema,n=t[w].name;return{sql:e===void 0||t[w].isAlias?s(n):s(e)+`.`+s(n),params:[]}}if(r(t,N)){if(r(t.value,F))return{sql:c(d.value++,t),params:[t],typings:[`none`]};let n=t.value===null?null:t.encoder.mapToDriverValue(t.value);if(r(n,e))return this.buildQueryFromSourceParams([n],a);if(u)return{sql:this.mapInlineParam(n,a),params:[]};let i=[`none`];return l&&(i=[l(t.encoder)]),{sql:c(d.value++,n),params:[n],typings:i}}return r(t,F)?{sql:c(d.value++,t),params:[t],typings:[`none`]}:r(t,e.Aliased)&&t.fieldAlias!==void 0?{sql:s(t.fieldAlias),params:[]}:r(t,S)?t._.isWith?{sql:s(t._.alias),params:[]}:this.buildQueryFromSourceParams([new j(`(`),t._.sql,new j(`) `),new ae(t._.alias)],a):x(t)?t.schema?{sql:s(t.schema)+`.`+s(t.enumName),params:[]}:{sql:s(t.enumName),params:[]}:re(t)?t.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([t.getSQL()],a):this.buildQueryFromSourceParams([new j(`(`),t.getSQL(),new j(`)`)],a):u?{sql:this.mapInlineParam(t,a),params:[]}:{sql:c(d.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}},ae=class{constructor(e){this.value=e}static[n]=`Name`;brand;getSQL(){return new M([this])}};function oe(e){return typeof e==`object`&&!!e&&`mapToDriverValue`in e&&typeof e.mapToDriverValue==`function`}var se={mapFromDriverValue:e=>e},ce={mapToDriverValue:e=>e};({...se,...ce});var N=class{constructor(e,t=ce){this.value=e,this.encoder=t}static[n]=`Param`;brand;getSQL(){return new M([this])}};function P(e,...t){let n=[];(t.length>0||e.length>0&&e[0]!==``)&&n.push(new j(e[0]));for(let[r,i]of t.entries())n.push(i,new j(e[r+1]));return new M(n)}(e=>{function t(){return new M([])}e.empty=t;function n(e){return new M(e)}e.fromList=n;function r(e){return new M([new j(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 M(n)}e.join=i;function a(e){return new ae(e)}e.identifier=a;function o(e){return new F(e)}e.placeholder=o;function s(e,t){return new N(e,t)}e.param=s})(P||={}),(e=>{class t{constructor(e,t){this.sql=e,this.fieldAlias=t}static[n]=`SQL.Aliased`;isSelectionField=!1;getSQL(){return this.sql}clone(){return new t(this.sql,this.fieldAlias)}}e.Aliased=t})(M||={});var F=class{constructor(e){this.name=e}static[n]=`Placeholder`;getSQL(){return new M([this])}},le=Symbol.for(`drizzle:IsDrizzleView`),ue=class{static[n]=`View`;[w];[le]=!0;constructor({name:e,schema:t,selectedFields:n,query:r}){this[w]={name:e,originalName:e,schema:t,selectedFields:n,query:r,isExisting:!r,isAlias:!1}}getSQL(){return new M([this])}};i.prototype.getSQL=function(){return new M([this])},A.prototype.getSQL=function(){return new M([this])},S.prototype.getSQL=function(){return new M([this])};function I(e,t){return oe(t)&&!re(e)&&!r(e,N)&&!r(e,F)&&!r(e,i)&&!r(e,A)&&!r(e,ue)?new N(e,t):e}var L=(e,t)=>P`${e} = ${I(t,e)}`,de=(e,t)=>P`${e} <> ${I(t,e)}`;function R(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new M(t):new M([new j(`(`),P.join(t,new j(` and `)),new j(`)`)])}function fe(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new M(t):new M([new j(`(`),P.join(t,new j(` or `)),new j(`)`)])}var pe=(e,t)=>P`${e} > ${I(t,e)}`,z=(e,t)=>P`${e} >= ${I(t,e)}`,me=(e,t)=>P`${e} < ${I(t,e)}`,B=(e,t)=>P`${e} <= ${I(t,e)}`;function he(e,t){return Array.isArray(t)?t.length===0?P`false`:P`${e} in ${t.map(t=>I(t,e))}`:P`${e} in ${I(t,e)}`}function ge(e,t){return Array.isArray(t)?t.length===0?P`true`:P`${e} not in ${t.map(t=>I(t,e))}`:P`${e} not in ${I(t,e)}`}function _e(e){return P`${e} is null`}function ve(e){return P`${e} is not null`}function ye(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContains requires at least one value`);return P`${e} @> ${P`${I(t,e)}`}`}return P`${e} @> ${I(t,e)}`}function be(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContained requires at least one value`);return P`${e} <@ ${P`${I(t,e)}`}`}return P`${e} <@ ${I(t,e)}`}function xe(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayOverlaps requires at least one value`);return P`${e} && ${P`${I(t,e)}`}`}return P`${e} && ${I(t,e)}`}function Se(e){return P`${e} asc`}function Ce(e){return P`${e} desc`}function we(e){return P`count(${e||P.raw(`*`)})`.mapWith(Number)}function Te(e){return P`count(distinct ${e})`.mapWith(Number)}function V(e){return P`sum(${e})`.mapWith(String)}function H(e){return P`max(${e})`.mapWith(r(e,i)?e:String)}function Ee(e){return P`min(${e})`.mapWith(r(e,i)?e:String)}var U=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}},De=class extends U{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 P`INTERVAL '${P.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return P`EXTRACT(EPOCH FROM (${e} - ${t}))`}buildDateAddInterval(e,t){return P`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?P`COUNT(*) FILTER (WHERE ${n})`:P`${P.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return P`(${t}::date - ${e}::date)`;case`week`:return P`FLOOR((${t}::date - ${e}::date) / 7)`;case`month`:return P`(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 P`(SELECT generate_series(0, ${e}) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return P`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return P`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return P`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return P`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return P`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return P`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return P`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return P`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}buildStringCondition(e,t,n){switch(t){case`contains`:return P`${e} ILIKE ${`%${n}%`}`;case`notContains`:return P`${e} NOT ILIKE ${`%${n}%`}`;case`startsWith`:return P`${e} ILIKE ${`${n}%`}`;case`endsWith`:return P`${e} ILIKE ${`%${n}`}`;case`like`:return P`${e} LIKE ${n}`;case`notLike`:return P`${e} NOT LIKE ${n}`;case`ilike`:return P`${e} ILIKE ${n}`;case`regex`:return P`${e} ~* ${n}`;case`notRegex`:return P`${e} !~* ${n}`;default:throw Error(`Unsupported string operator: ${t}`)}}castToType(e,t){switch(t){case`timestamp`:return P`${e}::timestamp`;case`decimal`:return P`${e}::decimal`;case`integer`:return P`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}buildAvg(e){return P`COALESCE(AVG(${e}), 0)`}buildCaseWhen(e,t){let n=e.map(e=>P`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>P`${e} ${t}`);return t===void 0?P`CASE ${n} END`:P`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?P`TRUE`:P`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 P`COALESCE(${P.raw(n)}(${e}), 0)`}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return P`COALESCE(${P.raw(n)}(${e}), 0)`}buildPercentile(e,t){return P`PERCENTILE_CONT(${t/100}) WITHIN GROUP (ORDER BY ${e})`}buildWindowFunction(e,t,n,r,i){let a=n&&n.length>0?P`PARTITION BY ${P.join(n,P`, `)}`:P``,o=r&&r.length>0?P`ORDER BY ${P.join(r.map(e=>e.direction===`desc`?P`${e.field} DESC`:P`${e.field} ASC`),P`, `)}`:P``,s=P``;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=P`${P.raw(r)} BETWEEN ${P.raw(a)} AND ${P.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=P`OVER (${c.length>0?P.join(c,P` `):P``})`;switch(e){case`lag`:return P`LAG(${t}, ${i?.offset??1}${i?.defaultValue===void 0?P``:P`, ${i.defaultValue}`}) ${l}`;case`lead`:return P`LEAD(${t}, ${i?.offset??1}${i?.defaultValue===void 0?P``:P`, ${i.defaultValue}`}) ${l}`;case`rank`:return P`RANK() ${l}`;case`denseRank`:return P`DENSE_RANK() ${l}`;case`rowNumber`:return P`ROW_NUMBER() ${l}`;case`ntile`:return P`NTILE(${i?.nTile??4}) ${l}`;case`firstValue`:return P`FIRST_VALUE(${t}) ${l}`;case`lastValue`:return P`LAST_VALUE(${t}) ${l}`;case`movingAvg`:return P`AVG(${t}) ${l}`;case`movingSum`:return P`SUM(${t}) ${l}`;default:throw Error(`Unsupported window function: ${e}`)}}},Oe=class extends U{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`),P`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return P`TIMESTAMPDIFF(SECOND, ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=P`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`),n.months&&(r=P`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`),n.days&&(r=P`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`),n.hours&&(r=P`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`),n.minutes&&(r=P`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`),n.seconds&&(r=P`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`),r}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?P`COUNT(CASE WHEN ${n} THEN 1 END)`:P`${P.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return P`TIMESTAMPDIFF(${P.raw(r)}, ${e}, ${t})`}buildPeriodSeriesSubquery(e){return P`(
2
2
  WITH RECURSIVE periods(period_number) AS (
3
3
  SELECT 0
4
4
  UNION ALL
@@ -59,7 +59,7 @@ const e=require(`./utils-CDExg9uP.cjs`),t=require(`./mcp-prompts-DsAkafVn.cjs`);
59
59
  ORDER BY table_name, index_name
60
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 $e(e,t){return new Qe(e,t,`duckdb`)}function et(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=nt(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=tt(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
61
  `),sql:t}}function tt(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function nt(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 rt=class extends W{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(P`${P.raw(r)} ${P.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 et(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function it(e,t){return new rt(e,t,`databend`)}function at(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=st(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=ot(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 ot(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function st(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 ct=class extends W{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(P`${P.raw(`EXPLAIN`)} ${P.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 at(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function lt(e,t){return new ct(e,t,`snowflake`)}function ut(e,t,n){if(n)switch(n){case`postgres`:return Re(e,t);case`mysql`:return He(e,t);case`sqlite`:return Ke(e,t);case`singlestore`:return Je(e,t);case`duckdb`:return $e(e,t);case`databend`:return it(e,t);case`snowflake`:return lt(e,t)}if(e.all&&e.run)return Ke(e,t);if(e.execute)return Re(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function G(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 dt(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function ft(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 pt(e){return e&&typeof e==`object`?P`${P`${e}`}`:e}function mt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function K(e,t){return pt(typeof e==`function`?e(t):e)}function ht(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||L;o.push(t(e.source,e.target))}let s=[];for(let e of i){let t=e.as||L;s.push(t(e.source,e.target))}let c;if(a){let e=a(t);c=Array.isArray(e)?e:[e]}let l=ft(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:l,table:n,condition:R(...o)},{joinType:l,table:n,condition:R(...s)}],junctionSecurityConditions:c}}function gt(e){if(`and`in e)return`and:[${e.and.map(gt).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(gt).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 _t(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 vt(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...vt(n.and)):`or`in n&&n.or?t.push(...vt(n.or)):`member`in n&&t.push(n);return t}function yt(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=bt(e),a=`${r}query:${Et(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=Et(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(Tt(t)));a+=`:ctx:${e}`}return a}function bt(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?wt(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?Tt(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?xt(e.funnel):void 0,flow:e.flow?St(e.flow):void 0,retention:e.retention?Ct(e.retention):void 0}}function xt(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 St(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 Ct(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 wt(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 Tt(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Tt):Object.keys(e).sort().reduce((t,n)=>(t[n]=Tt(e[n]),t),{})}function Et(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 Y=class{constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=K(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof M?r:P`${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 R(z(e,n),B(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()),R(z(e,t),B(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()),R(z(e,s),B(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()}},Dt=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`?he(e,a.map(e=>this.dateTimeBuilder.normalizeDate(e)||e)):he(e,a):a.length===1?L(e,r?.type===`time`&&this.dateTimeBuilder.normalizeDate(o)||o):this.databaseAdapter.buildBooleanLiteral(!1);case`notEquals`:return a.length>1?ge(e,a):a.length===1?de(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 pe(e,o);case`gte`:return z(e,o);case`lt`:return me(e,o);case`lte`:return B(e,o);case`set`:return ve(e);case`notSet`:return _e(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 R(z(e,t),B(e,r))}}return null;case`beforeDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?me(e,t):null}case`afterDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?pe(e,t):null}case`between`:return a.length>=2?R(z(e,a[0]),B(e,a[1])):null;case`notBetween`:return a.length>=2?fe(me(e,a[0]),pe(e,a[1])):null;case`in`:return a.length>0?he(e,a):null;case`notIn`:return a.length>0?ge(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 fe(_e(e),L(e,``));case`isNotEmpty`:return R(ve(e),de(e,``));case`arrayContains`:return this.databaseAdapter.getEngineType()===`postgres`?ye(e,a):null;case`arrayOverlaps`:return this.databaseAdapter.getEngineType()===`postgres`?xe(e,a):null;case`arrayContained`:return this.databaseAdapter.getEngineType()===`postgres`?be(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]:R(...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]:fe(...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`?K(s.sql,n):typeof s.sql==`function`?s.sql(n):s.sql;return this.buildFilterCondition(c,r.operator,r.values,s,r.dateRange)}},X=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 Ot(e,t){let{cube:n,allCubes:r,resolvedMeasures:i}=t,a=kt(e),o=new Map;for(let e of a){let{originalRef:t,cubeName:a,fieldName:s}=e,c=a||n.name;if(!r.get(c))throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);let l=`${c}.${s}`,u=i.get(l);if(!u)throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);let d=P`${u()}`;o.set(t,d)}let s=[],c=[],l=0;for(let t of a){let n=`{${t.originalRef}}`,r=e.indexOf(n,l);if(r>=0){s.push(e.substring(l,r));let i=o.get(t.originalRef);i&&c.push(i),l=r+n.length}}if(s.push(e.substring(l)),c.length===0)return P.raw(e);let u=[];for(let e=0;e<s.length;e++)s[e]&&u.push(new j(s[e])),e<c.length&&u.push(c[e]);return P.join(u,P.raw(``))}function kt(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 At(e){let t=[],n=0;for(let r=0;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n<0)){t.push(`Unmatched closing brace at position ${r}`);break}n>0&&t.push(`Unmatched opening brace in template`),/\{\s*\}/.test(e)&&t.push(`Empty member reference {} found in template`),/\{[^}]*\{/.test(e)&&t.push(`Nested braces are not allowed in member references`);let r=kt(e);for(let e of r){let n=e.cubeName?`${e.cubeName}.${e.fieldName}`:e.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n)||t.push(`Invalid member reference {${e.originalRef}}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`),n.split(`.`).length>2&&t.push(`Invalid member reference {${e.originalRef}}: only one dot allowed (Cube.measure format)`)}return{isValid:t.length===0,errors:t}}function jt(e,t){let n=kt(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Z=class e{constructor(e){this.databaseAdapter=e}buildResolvedMeasures(t,n,r,i){let a=new Map,o=[],s=[],c=new Set(t),l=new X(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}X.isCalculatedMeasure(d)?(s.push(r),jt(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];X.isCalculatedMeasure(e)&&jt(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;X.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 Ot(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=jt(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=P`${P.identifier(n.cteAlias)}.${P.identifier(i)}`,o;switch(t.type){case`count`:case`countDistinct`:case`sum`:o=V(r);break;case`avg`:o=this.databaseAdapter.buildAvg(r);break;case`min`:o=Ee(r);break;case`max`:o=H(r);break;case`number`:o=V(r);break;default:o=V(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=P`${P.identifier(a.cteAlias)}.${P.identifier(t)}`;switch(n.type){case`count`:case`countDistinct`:case`sum`:return V(e);case`avg`:return this.databaseAdapter.buildAvg(e);case`min`:return Ee(e);case`max`:return H(e);case`number`:return V(e);default:return V(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=K(t.sql,n);if(t.filters&&t.filters.length>0){let e=t.filters.map(e=>{let t=e(n);return t?P`(${t})`:void 0}).filter(Boolean);if(e.length>0){let t=e.length===1?e[0]:R(...e);i=this.databaseAdapter.buildCaseWhen([{when:t,then:i}])}}switch(t.type){case`count`:return we(i);case`countDistinct`:return Te(i);case`sum`:return V(i);case`avg`:return this.databaseAdapter.buildAvg(i);case`min`:return Ee(i);case`max`:return H(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`),P`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`),P`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`),P`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?K(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:K(i.sql,n),direction:e.direction};let a=r.measures?.[t];return a&&a.sql?{field:K(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`),P`NULL`):s}default:return we(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}},Mt=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){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(Z.isPostAggregationWindow(e)){let n=Z.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=P`${P.identifier(e.cteAlias)}.${P.identifier(o)}`;i.push(t)}}else{let e=s.dimensions[o],t=K(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=P`${P.identifier(a.cteAlias)}.${P.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}},Nt=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new Y(e),this.filterBuilder=new Dt(e,this.dateTimeBuilder),this.groupByBuilder=new Mt(this.dateTimeBuilder),this.measureBuilder=new Z(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]=P`${K(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]=P`${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]=P`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=we()),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(`.`);if(o.has(t)&&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=_t(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){a.push(r);continue}}let o=s.dimensions[i],c=K(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?R(...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?fe(...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=gt(e),r=n.filterCache.get(t);if(r)return r}let r=t?K(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`?Ce(P.identifier(t)):Se(P.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(Se(P.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)}},Pt=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=G(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=G(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=G(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=G(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?P`${P.identifier(t)}.${P.identifier(i.source.name)}`:pt(i.source),a=n?P`${P.identifier(n)}.${P.identifier(i.target.name)}`:pt(i.target),o=i.as||L;r.push(o(e,a))}return R(...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=G(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})}},Ft=class{resolverCache=new WeakMap;getResolver(e){let t=this.resolverCache.get(e);return t||(t=new Pt(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(e,t,n,r,i){let a=this.getResolver(e),o=[],s=new Set([t.name]),c=new Set;if(i.measures)for(let e of i.measures){let[t]=e.split(`.`);c.add(t)}let l=this.collectPathHintCubes(i),u=new Set;for(let n of c)n!==t.name&&this.findHasManyJoinDef(t,n,e)&&u.add(n);let d=n.filter(e=>e!==t.name);for(let n of d){if(s.has(n))continue;let i=new Set([...s].filter(e=>!u.has(e))),c=a.findPathPreferring(t.name,n,l,i);if(!c||c.length===0)throw Error(`No join path found from '${t.name}' to '${n}'`);for(let{fromCube:t,toCube:n,joinDef:i,reversed:l}of c){if(s.has(n))continue;let c=e.get(n);if(!c)throw Error(`Cube '${n}' not found`);let u=l?dt(i.relationship):i.relationship;if(u===`belongsToMany`&&i.through){let e=ht(i,r.securityContext);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:e.junctionJoins[1].joinType,joinCondition:e.junctionJoins[1].condition,relationship:`belongsToMany`,junctionTable:{table:i.through.table,alias:`junction_${n.toLowerCase()}`,joinType:e.junctionJoins[0].joinType,joinCondition:e.junctionJoins[0].condition,securitySql:i.through.securitySql,sourceCubeName:t}})}else{let e=a.buildJoinCondition(i,null,null),t=ft(u,i.sqlJoinType);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:t,joinCondition:e,relationship:u})}s.add(n)}}return o}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}=Z.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=G(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?dt(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=G(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=G(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=G(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=G(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=G(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=G(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?dt(e.joinDef.relationship):e.joinDef.relationship,n=ft(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.`}}},It=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]=P`${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]=P`${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]=P`${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]=P`${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(s&&e.intermediateJoins){let t=[...e.intermediateJoins].reverse();for(let e of t){let t=e.cube.sql(n),r=[L(e.cteJoinColumn,e.joinDef.on[0]?.target)];e.securityFilter&&r.push(e.securityFilter),f=f.leftJoin(t.from,R(...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]:R(...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=K(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=P`${P.identifier(t)}.${P.identifier(e.primaryJoinColumn.name)}`;i.push(L(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=P`${P.identifier(t)}.${P.identifier(e.targetColumn)}`;i.push(L(a,o))}return i.length===1?i[0]:R(...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||P.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 P`${P.identifier(r.cteAlias)}.${P.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]:R(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0];return P`${n} IN ${t.db.select({pk:e}).from(r.from).where(a)}`}else{let e=R(...o.map(e=>L(e.source,e.target)),a);return P`EXISTS ${t.db.select({one:P`1`}).from(r.from).where(e)}`}}};function Lt(e,t,n){let r=[],i=Rt(new Date(e),n),a=Rt(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=zt(i,n);return r}function Rt(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 zt(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 Bt(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 Vt(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function Ht(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,fillValue:a,measures:o,dimensions:s}=t,c=Lt(i[0],i[1],r);if(c.length===0)return e;let l=new Map;for(let t of e){let e=Vt(t,s),r=Bt(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 Ut(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=new Date(e);return isNaN(t.getTime())?null:[t,t]}function Wt(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let t=e.fillMissingDates!==!1,n=e.granularity&&e.dateRange;return t&&n});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 t=Ut(e.dateRange);if(!t)continue;let r={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:t,fillValue:i,measures:n,dimensions:o};s=Ht(s,r)}return s}var Gt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new Y(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})}},Kt=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new Dt(e,this.dateTimeBuilder)}hasFunnel(e){return e.funnel!==void 0&&e.funnel.steps.length>=2}validateConfig(e,t){let n=[];if(e.steps.length<2&&n.push(`Funnel must have at least 2 steps`),typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}for(let r=0;r<e.steps.length;r++){let i=e.steps[r];if(i.name||n.push(`Step ${r} must have a name`),`cube`in i&&i.cube&&(t.get(i.cube)||n.push(`Step ${r} cube not found: ${i.cube}`)),i.filter){let a;`cube`in i&&i.cube?a=i.cube:typeof e.bindingKey==`string`&&([a]=e.bindingKey.split(`.`));let o=a?new Pt(t):null,s=Array.isArray(i.filter)?i.filter:[i.filter];for(let e of s)if(`member`in e){let[i,s]=e.member.split(`.`),c=t.get(i);if(!c)n.push(`Step ${r} filter cube not found: ${i}`);else if(c.dimensions?.[s]||(c.measures?.[s]?n.push(`Step ${r} filter '${i}.${s}' is a measure. Funnel step filters only support dimensions, not measures.`):n.push(`Step ${r} filter member not found: ${s} in cube ${i}`)),a&&i!==a&&o){let e=o.findPath(a,i);(!e||e.length===0)&&n.push(`Step ${r} filter '${i}.${s}' requires a join from '${a}' but no join path was found. Define a join relationship between these cubes.`)}}}i.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(i.timeToConvert)||n.push(`Step ${r} timeToConvert must be ISO 8601 duration format: ${i.timeToConvert}`))}return{isValid:n.length===0,errors:n}}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 Pt(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(e,t,n){if(`cube`in e&&e.cube){let t=n.get(e.cube);if(!t)throw Error(`Cube not found for step: ${e.cube}`);return t}if(typeof t.bindingKey==`string`){let[e]=t.bindingKey.split(`.`),r=n.get(e);if(!r)throw Error(`Cube not found for binding key: ${t.bindingKey}`);return r}throw Error(`Cannot resolve cube for step - multi-cube funnel requires cube specification in each step`)}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return K(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return K(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return K(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return K(a.sql,n)}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?R(...i):P`(${P.join(i,P` 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 Pt(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`?K(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:P`${e.bindingKeyExpr}`.as(`binding_key`),step_time:P`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]:R(...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=P`${P.identifier(i)}.step_time`,c=P`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=P`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:P`${e.bindingKeyExpr}`.as(`binding_key`),step_time:P`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,P`${e.bindingKeyExpr} = ${P.identifier(i)}.binding_key`);if(l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0){let e=o.length===1?o[0]:R(...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(L(e.source,e.target));let s=o.length===1?o[0]:R(...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:P`s0.binding_key`,step_0_time:P`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=P`s${P.raw(String(e))}.step_time`;let a=P`${P.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=P`${a}
62
+ `),sql:t}}function ot(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function st(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 ct=class extends W{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(P`${P.raw(`EXPLAIN`)} ${P.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 at(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function lt(e,t){return new ct(e,t,`snowflake`)}function ut(e,t,n){if(n)switch(n){case`postgres`:return Re(e,t);case`mysql`:return He(e,t);case`sqlite`:return Ke(e,t);case`singlestore`:return Je(e,t);case`duckdb`:return $e(e,t);case`databend`:return it(e,t);case`snowflake`:return lt(e,t)}if(e.all&&e.run)return Ke(e,t);if(e.execute)return Re(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function G(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 dt(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function ft(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 pt(e){return e&&typeof e==`object`?P`${P`${e}`}`:e}function mt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function K(e,t){return pt(typeof e==`function`?e(t):e)}function ht(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||L;o.push(t(e.source,e.target))}let s=[];for(let e of i){let t=e.as||L;s.push(t(e.source,e.target))}let c;if(a){let e=a(t);c=Array.isArray(e)?e:[e]}let l=ft(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:l,table:n,condition:R(...o)},{joinType:l,table:n,condition:R(...s)}],junctionSecurityConditions:c}}function gt(e){if(`and`in e)return`and:[${e.and.map(gt).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(gt).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 _t(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 vt(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...vt(n.and)):`or`in n&&n.or?t.push(...vt(n.or)):`member`in n&&t.push(n);return t}function yt(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=bt(e),a=`${r}query:${Et(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=Et(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(Tt(t)));a+=`:ctx:${e}`}return a}function bt(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?wt(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?Tt(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?xt(e.funnel):void 0,flow:e.flow?St(e.flow):void 0,retention:e.retention?Ct(e.retention):void 0}}function xt(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 St(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 Ct(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 wt(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 Tt(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Tt):Object.keys(e).sort().reduce((t,n)=>(t[n]=Tt(e[n]),t),{})}function Et(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 Y=class{constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=K(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof M?r:P`${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 R(z(e,n),B(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()),R(z(e,t),B(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()),R(z(e,s),B(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()}},Dt=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`?he(e,a.map(e=>this.dateTimeBuilder.normalizeDate(e)||e)):he(e,a):a.length===1?L(e,r?.type===`time`&&this.dateTimeBuilder.normalizeDate(o)||o):this.databaseAdapter.buildBooleanLiteral(!1);case`notEquals`:return a.length>1?ge(e,a):a.length===1?de(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 pe(e,o);case`gte`:return z(e,o);case`lt`:return me(e,o);case`lte`:return B(e,o);case`set`:return ve(e);case`notSet`:return _e(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 R(z(e,t),B(e,r))}}return null;case`beforeDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?me(e,t):null}case`afterDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?pe(e,t):null}case`between`:return a.length>=2?R(z(e,a[0]),B(e,a[1])):null;case`notBetween`:return a.length>=2?fe(me(e,a[0]),pe(e,a[1])):null;case`in`:return a.length>0?he(e,a):null;case`notIn`:return a.length>0?ge(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 fe(_e(e),L(e,``));case`isNotEmpty`:return R(ve(e),de(e,``));case`arrayContains`:return this.databaseAdapter.getEngineType()===`postgres`?ye(e,a):null;case`arrayOverlaps`:return this.databaseAdapter.getEngineType()===`postgres`?xe(e,a):null;case`arrayContained`:return this.databaseAdapter.getEngineType()===`postgres`?be(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]:R(...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]:fe(...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`?K(s.sql,n):typeof s.sql==`function`?s.sql(n):s.sql;return this.buildFilterCondition(c,r.operator,r.values,s,r.dateRange)}},X=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 Ot(e,t){let{cube:n,allCubes:r,resolvedMeasures:i}=t,a=kt(e),o=new Map;for(let e of a){let{originalRef:t,cubeName:a,fieldName:s}=e,c=a||n.name;if(!r.get(c))throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);let l=`${c}.${s}`,u=i.get(l);if(!u)throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);let d=P`${u()}`;o.set(t,d)}let s=[],c=[],l=0;for(let t of a){let n=`{${t.originalRef}}`,r=e.indexOf(n,l);if(r>=0){s.push(e.substring(l,r));let i=o.get(t.originalRef);i&&c.push(i),l=r+n.length}}if(s.push(e.substring(l)),c.length===0)return P.raw(e);let u=[];for(let e=0;e<s.length;e++)s[e]&&u.push(new j(s[e])),e<c.length&&u.push(c[e]);return P.join(u,P.raw(``))}function kt(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 At(e){let t=[],n=0;for(let r=0;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n<0)){t.push(`Unmatched closing brace at position ${r}`);break}n>0&&t.push(`Unmatched opening brace in template`),/\{\s*\}/.test(e)&&t.push(`Empty member reference {} found in template`),/\{[^}]*\{/.test(e)&&t.push(`Nested braces are not allowed in member references`);let r=kt(e);for(let e of r){let n=e.cubeName?`${e.cubeName}.${e.fieldName}`:e.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n)||t.push(`Invalid member reference {${e.originalRef}}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`),n.split(`.`).length>2&&t.push(`Invalid member reference {${e.originalRef}}: only one dot allowed (Cube.measure format)`)}return{isValid:t.length===0,errors:t}}function jt(e,t){let n=kt(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Z=class e{constructor(e){this.databaseAdapter=e}buildResolvedMeasures(t,n,r,i){let a=new Map,o=[],s=[],c=new Set(t),l=new X(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}X.isCalculatedMeasure(d)?(s.push(r),jt(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];X.isCalculatedMeasure(e)&&jt(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;X.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 Ot(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=jt(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=P`${P.identifier(n.cteAlias)}.${P.identifier(i)}`,o;switch(t.type){case`count`:case`countDistinct`:case`sum`:o=V(r);break;case`avg`:o=this.databaseAdapter.buildAvg(r);break;case`min`:o=Ee(r);break;case`max`:o=H(r);break;case`number`:o=V(r);break;default:o=V(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=P`${P.identifier(a.cteAlias)}.${P.identifier(t)}`;switch(n.type){case`count`:case`countDistinct`:case`sum`:return V(e);case`avg`:return this.databaseAdapter.buildAvg(e);case`min`:return Ee(e);case`max`:return H(e);case`number`:return V(e);default:return V(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=K(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?P`(${t})`:void 0}).filter(Boolean);if(e.length>0){let t=e.length===1?e[0]:R(...e);i=this.databaseAdapter.buildCaseWhen([{when:t,then:i}])}}switch(t.type){case`count`:return we(i);case`countDistinct`:return Te(i);case`sum`:return V(i);case`avg`:return this.databaseAdapter.buildAvg(i);case`min`:return Ee(i);case`max`:return H(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`),P`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`),P`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`),P`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?K(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:K(i.sql,n),direction:e.direction};let a=r.measures?.[t];return a&&a.sql?{field:K(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`),P`NULL`):s}default:return we(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}},Mt=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(Z.isPostAggregationWindow(e)){let n=Z.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=P`${P.identifier(e.cteAlias)}.${P.identifier(o)}`;i.push(t)}}else{let e=s.dimensions[o],t=K(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=P`${P.identifier(a.cteAlias)}.${P.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}},Nt=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new Y(e),this.filterBuilder=new Dt(e,this.dateTimeBuilder),this.groupByBuilder=new Mt(this.dateTimeBuilder),this.measureBuilder=new Z(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]=P`${K(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]=P`${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]=P`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=we()),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(`.`);if(o.has(t)&&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=_t(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){a.push(r);continue}}let o=s.dimensions[i],c=K(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?R(...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?fe(...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=gt(e),r=n.filterCache.get(t);if(r)return r}let r=t?K(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`?Ce(P.identifier(t)):Se(P.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(Se(P.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)}},Pt=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=G(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=G(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=G(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=G(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?P`${P.identifier(t)}.${P.identifier(i.source.name)}`:pt(i.source),a=n?P`${P.identifier(n)}.${P.identifier(i.target.name)}`:pt(i.target),o=i.as||L;r.push(o(e,a))}return R(...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=G(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})}},Ft=class{resolverCache=new WeakMap;getResolver(e){let t=this.resolverCache.get(e);return t||(t=new Pt(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(e,t,n,r,i){let a=this.getResolver(e),o=[],s=new Set([t.name]),c=new Set;if(i.measures)for(let e of i.measures){let[t]=e.split(`.`);c.add(t)}let l=this.collectPathHintCubes(i),u=new Set;for(let n of c)n!==t.name&&this.findHasManyJoinDef(t,n,e)&&u.add(n);let d=n.filter(e=>e!==t.name);for(let n of d){if(s.has(n))continue;let i=new Set([...s].filter(e=>!u.has(e))),c=a.findPathPreferring(t.name,n,l,i);if(!c||c.length===0)throw Error(`No join path found from '${t.name}' to '${n}'`);for(let{fromCube:t,toCube:n,joinDef:i,reversed:l}of c){if(s.has(n))continue;let c=e.get(n);if(!c)throw Error(`Cube '${n}' not found`);let u=l?dt(i.relationship):i.relationship;if(u===`belongsToMany`&&i.through){let e=ht(i,r.securityContext);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:e.junctionJoins[1].joinType,joinCondition:e.junctionJoins[1].condition,relationship:`belongsToMany`,junctionTable:{table:i.through.table,alias:`junction_${n.toLowerCase()}`,joinType:e.junctionJoins[0].joinType,joinCondition:e.junctionJoins[0].condition,securitySql:i.through.securitySql,sourceCubeName:t}})}else{let e=a.buildJoinCondition(i,null,null),t=ft(u,i.sqlJoinType);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:t,joinCondition:e,relationship:u})}s.add(n)}}return o}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}=Z.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=G(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?dt(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=G(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=G(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=G(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=G(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=G(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=G(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?dt(e.joinDef.relationship):e.joinDef.relationship,n=ft(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.`}}},It=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]=P`${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]=P`${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]=P`${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]=P`${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(s&&e.intermediateJoins){let t=[...e.intermediateJoins].reverse();for(let e of t){let t=e.cube.sql(n),r=[L(e.cteJoinColumn,e.joinDef.on[0]?.target)];e.securityFilter&&r.push(e.securityFilter),f=f.leftJoin(t.from,R(...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]:R(...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=K(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=P`${P.identifier(t)}.${P.identifier(e.primaryJoinColumn.name)}`;i.push(L(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=P`${P.identifier(t)}.${P.identifier(e.targetColumn)}`;i.push(L(a,o))}return i.length===1?i[0]:R(...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||P.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 P`${P.identifier(r.cteAlias)}.${P.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]:R(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0];return P`${n} IN ${t.db.select({pk:e}).from(r.from).where(a)}`}else{let e=R(...o.map(e=>L(e.source,e.target)),a);return P`EXISTS ${t.db.select({one:P`1`}).from(r.from).where(e)}`}}};function Lt(e,t,n){let r=[],i=Rt(new Date(e),n),a=Rt(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=zt(i,n);return r}function Rt(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 zt(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 Bt(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 Vt(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function Ht(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,fillValue:a,measures:o,dimensions:s}=t,c=Lt(i[0],i[1],r);if(c.length===0)return e;let l=new Map;for(let t of e){let e=Vt(t,s),r=Bt(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 Ut(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=new Date(e);return isNaN(t.getTime())?null:[t,t]}function Wt(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let t=e.fillMissingDates!==!1,n=e.granularity&&e.dateRange;return t&&n});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 t=Ut(e.dateRange);if(!t)continue;let r={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:t,fillValue:i,measures:n,dimensions:o};s=Ht(s,r)}return s}var Gt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new Y(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})}},Kt=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new Dt(e,this.dateTimeBuilder)}hasFunnel(e){return e.funnel!==void 0&&e.funnel.steps.length>=2}validateConfig(e,t){let n=[];if(e.steps.length<2&&n.push(`Funnel must have at least 2 steps`),typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}for(let r=0;r<e.steps.length;r++){let i=e.steps[r];if(i.name||n.push(`Step ${r} must have a name`),`cube`in i&&i.cube&&(t.get(i.cube)||n.push(`Step ${r} cube not found: ${i.cube}`)),i.filter){let a;`cube`in i&&i.cube?a=i.cube:typeof e.bindingKey==`string`&&([a]=e.bindingKey.split(`.`));let o=a?new Pt(t):null,s=Array.isArray(i.filter)?i.filter:[i.filter];for(let e of s)if(`member`in e){let[i,s]=e.member.split(`.`),c=t.get(i);if(!c)n.push(`Step ${r} filter cube not found: ${i}`);else if(c.dimensions?.[s]||(c.measures?.[s]?n.push(`Step ${r} filter '${i}.${s}' is a measure. Funnel step filters only support dimensions, not measures.`):n.push(`Step ${r} filter member not found: ${s} in cube ${i}`)),a&&i!==a&&o){let e=o.findPath(a,i);(!e||e.length===0)&&n.push(`Step ${r} filter '${i}.${s}' requires a join from '${a}' but no join path was found. Define a join relationship between these cubes.`)}}}i.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(i.timeToConvert)||n.push(`Step ${r} timeToConvert must be ISO 8601 duration format: ${i.timeToConvert}`))}return{isValid:n.length===0,errors:n}}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 Pt(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(e,t,n){if(`cube`in e&&e.cube){let t=n.get(e.cube);if(!t)throw Error(`Cube not found for step: ${e.cube}`);return t}if(typeof t.bindingKey==`string`){let[e]=t.bindingKey.split(`.`),r=n.get(e);if(!r)throw Error(`Cube not found for binding key: ${t.bindingKey}`);return r}throw Error(`Cannot resolve cube for step - multi-cube funnel requires cube specification in each step`)}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return K(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return K(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return K(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return K(a.sql,n)}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?R(...i):P`(${P.join(i,P` 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 Pt(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`?K(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:P`${e.bindingKeyExpr}`.as(`binding_key`),step_time:P`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]:R(...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=P`${P.identifier(i)}.step_time`,c=P`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=P`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:P`${e.bindingKeyExpr}`.as(`binding_key`),step_time:P`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,P`${e.bindingKeyExpr} = ${P.identifier(i)}.binding_key`);if(l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0){let e=o.length===1?o[0]:R(...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(L(e.source,e.target));let s=o.length===1?o[0]:R(...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:P`s0.binding_key`,step_0_time:P`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=P`s${P.raw(String(e))}.step_time`;let a=P`${P.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=P`${a}
63
63
  LEFT JOIN ${P.identifier(`step_${e}`)} s${P.raw(String(e))} ON s0.binding_key = s${P.raw(String(e))}.binding_key`;let o=Object.entries(i).map(([e,t])=>P`${t} AS ${P.identifier(e)}`),s=P`SELECT ${P.join(o,P`, `)} FROM ${a}`;return r.db.$with(`funnel_joined`).as(s)}buildAggregationCTE(e,t,n,r,i){let a={};a.step_0_count=P`COUNT(*)`.as(`step_0_count`);for(let e=1;e<n.length;e++)a[`step_${e}_count`]=P`COUNT(${P.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(r.includeTimeMetrics)for(let e=1;e<n.length;e++){let t=P.identifier(`step_${e}_time`),n=P.identifier(`step_${e-1}_time`),r=this.databaseAdapter.buildTimeDifferenceSeconds(P`${t}`,P`${n}`),i=P`${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`]=P`(SELECT ${n} FROM ${P.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`]=P`(SELECT ${i} FROM ${P.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)}},qt=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new Dt(e,this.dateTimeBuilder)}hasFlow(e){return e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0}validateConfig(e,t){let n=[],r=[],i=this.databaseAdapter.getEngineType(),a=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;if(i===`sqlite`)return n.push(`Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.`),{isValid:!1,errors:n,warnings:r};if(typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}if(e.eventDimension){let[r,i]=e.eventDimension.split(`.`);if(!r||!i)n.push(`Invalid event dimension format: ${e.eventDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Event dimension not found: ${i} in cube ${r}`):n.push(`Event dimension cube not found: ${r}`)}}else n.push(`Event dimension is required for flow analysis`);return e.startingStep?(e.startingStep.filter||n.push(`Starting step must have at least one filter`),e.startingStep.name||r.push(`Starting step has no name - using default`)):n.push(`Starting step is required for flow analysis`),(e.stepsBefore<0||e.stepsBefore>5)&&n.push(`stepsBefore must be between 0 and 5, got: ${e.stepsBefore}`),(e.stepsAfter<0||e.stepsAfter>5)&&n.push(`stepsAfter must be between 0 and 5, got: ${e.stepsAfter}`),(e.stepsBefore>=4||e.stepsAfter>=4)&&r.push(`High step depth (4-5) may impact query performance on large datasets`),e.joinStrategy&&![`auto`,`lateral`,`window`].includes(e.joinStrategy)?n.push(`Invalid joinStrategy: ${e.joinStrategy}`):e.joinStrategy===`lateral`&&!a&&n.push(`Lateral joins are not supported on this database`),{isValid:n.length===0,errors:n,warnings:r}}buildFlowQuery(e,t,n){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(`Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.`);let r=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,i=e.joinStrategy??`auto`,a=i===`lateral`||i===`auto`&&r;if(i===`lateral`&&!r)throw Error(`Lateral joins with CTE references are not supported on this database`);let o={...e,stepsBefore:e.outputMode===`sunburst`?0:e.stepsBefore},s=this.resolveFlowConfig(o,t,n),c=[],l=this.buildStartingEntitiesCTE(o,s,n);c.push(l);let u=a?this.buildBeforeCTEsLateral(o,s,n):this.buildBeforeCTEsWindow(o,s,n);c.push(...u);let d=a?this.buildAfterCTEsLateral(o,s,n):this.buildAfterCTEsWindow(o,s,n);c.push(...d);let f=this.buildNodesAggregationCTE(o,n);c.push(f);let p=this.buildLinksAggregationCTE(o,n);c.push(p);let m=this.buildFinalResultCTE(n);return c.push(m),n.db.with(...c).select().from(m)}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(e,t){let n;if(typeof e.bindingKey==`string`)[n]=e.bindingKey.split(`.`);else if(Array.isArray(e.bindingKey)&&e.bindingKey.length>0)n=e.bindingKey[0].cube;else throw Error(`Cannot resolve cube for flow query`);let r=t.get(n);if(!r)throw Error(`Cube not found: ${n}`);return r}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return K(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return K(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return K(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return K(a.sql,n)}resolveEventDimension(e,t,n){let[,r]=e.eventDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Event dimension not found: ${e.eventDimension}`);return K(i.sql,n)}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?R(...i):P`(${P.join(i,P` 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`?R(...i):P`(${P.join(i,P` OR `)})`}let r=e,[,i]=r.member.split(`.`),a=t.dimensions?.[i];if(!a)return null;let o=a.type===`time`?K(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:P`${i}`.as(`binding_key`),start_time:P`MIN(${a})`.as(`start_time`),event_type:P`${o}`.as(`event_type`),event_path:P`${o}`.as(`event_path`)}).from(r.from);if(c.length>0){let e=c.length===1?c[0]:R(...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(P`${i} = ${P.identifier(e)}.binding_key`,P`${a} < ${P.identifier(e)}.${P.identifier(l)}`);let f=d.length===1?d[0]:R(...d),p=c?P`${o} || ${`→`} || ${P.identifier(e)}.event_path`:P`${o}`,m=n.db.select({binding_key:P`${i}`.as(`binding_key`),step_time:P`${a}`.as(`step_time`),event_type:P`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(P`${a} DESC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:P`e.binding_key`.as(`binding_key`),step_time:P`e.step_time`.as(`step_time`),event_type:P`e.event_type`.as(`event_type`),event_path:P`e.event_path`.as(`event_path`)}).from(P`${P.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(P`${i} = ${P.identifier(e)}.binding_key`,P`${a} > ${P.identifier(e)}.${P.identifier(l)}`);let f=d.length===1?d[0]:R(...d),p=c?P`${P.identifier(e)}.event_path || ${`→`} || ${o}`:P`${o}`,m=n.db.select({binding_key:P`${i}`.as(`binding_key`),step_time:P`${a}`.as(`step_time`),event_type:P`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(P`${a} ASC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:P`e.binding_key`.as(`binding_key`),step_time:P`e.step_time`.as(`step_time`),event_type:P`e.event_type`.as(`event_type`),event_path:P`e.event_path`.as(`event_path`)}).from(P`${P.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(P`${a} < ${P.identifier(e)}.${P.identifier(l)}`);let f=d.length===1?d[0]:R(...d),p=c?P`${o} || ${`→`} || ${P.identifier(e)}.event_path`:P`${o}`,m=n.db.select({binding_key:P`${i}`.as(`binding_key`),step_time:P`${a}`.as(`step_time`),event_type:P`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:P`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as(`rn`)}).from(r.from).innerJoin(P`${P.identifier(e)}`,P`${i} = ${P.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:P`binding_key`.as(`binding_key`),step_time:P`step_time`.as(`step_time`),event_type:P`event_type`.as(`event_type`),event_path:P`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(P`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(P`${a} > ${P.identifier(e)}.${P.identifier(l)}`);let f=d.length===1?d[0]:R(...d),p=c?P`${P.identifier(e)}.event_path || ${`→`} || ${o}`:P`${o}`,m=n.db.select({binding_key:P`${i}`.as(`binding_key`),step_time:P`${a}`.as(`step_time`),event_type:P`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:P`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as(`rn`)}).from(r.from).innerJoin(P`${P.identifier(e)}`,P`${i} = ${P.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:P`binding_key`.as(`binding_key`),step_time:P`step_time`.as(`step_time`),event_type:P`event_type`.as(`event_type`),event_path:P`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(P`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(P`
64
64
  SELECT
65
65
  ${P.raw(`'before_${t}_'`)} || event_path AS node_id,
@@ -193,9 +193,9 @@ const e=require(`./utils-CDExg9uP.cjs`),t=require(`./mcp-prompts-DsAkafVn.cjs`);
193
193
  FROM activity_periods
194
194
  WHERE period_number >= 0 AND period_number <= ${e.periods}
195
195
  GROUP BY binding_key${P.raw(i)}
196
- )`,o=this.databaseAdapter.buildPeriodSeriesSubquery(e.periods),s={period_number:P`p.period_number`.as(`period_number`),retained_users:P`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},c=[P`p.period_number`];for(let e=0;e<n;e++)s[`breakdown_${e}`]=P.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),c.push(P.raw(`ump.breakdown_${e}`));return t.db.select(s).from(P`${a} ump`).innerJoin(o,P`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]}},$t=class{constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(t));if(r.length===0)throw Error(`No cubes found in query`);let i=this.queryPlanner.analyzePrimaryCube(r,t,e),a=i.selectedCube,o=e.get(a);if(!o)throw Error(`Primary cube '${a}' not found`);let s=r.filter(e=>e!==a).map(n=>this.queryPlanner.analyzeJoinPathForTarget(e,a,n,t)),c=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(e,o,r,n,t):[],l=r.length>1?this.queryPlanner.buildPreAggregationCTEs(e,o,c,t,n)??[]:[],u=this.queryPlanner.buildWarnings(t,l),d=this.buildSourceFromPhases(o,c,l,e,t,n),f=d.source,p=this.buildQueryNode(f,t,e,u),m=this.buildPreAggregationAnalysis(l),h=new Map;for(let t of r){let n=e.get(t);n&&h.set(t,n)}let g=Z.hasPostAggregationWindows(t.measures??[],h),_=[...s.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...u.map(e=>e.message)];return{plan:p,analysis:{timestamp:new Date().toISOString(),cubeCount:r.length,cubesInvolved:[...r].sort(),primaryCube:i,joinPaths:s,preAggregations:m,querySummary:{queryType:l.length>0?`multi_cube_cte`:r.length>1?`multi_cube_join`:`single_cube`,measureStrategy:d.strategy,joinCount:c.length,cteCount:l.length,hasPreAggregation:l.length>0,hasWindowFunctions:g},warnings:_.length>0?_:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${r.length} cube${r.length===1?``:`s`} from query members`,details:{cubesInvolved:[...r].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${i.selectedCube}' as primary cube (${i.reason})`,details:{selectedCube:i.selectedCube,reason:i.reason,candidates:i.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${c.length} join${c.length===1?``:`s`}`,details:{joinCount:c.length,joinTargets:c.map(e=>e.cube.name),pathSelection:s.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${l.length} pre-aggregation CTE${l.length===1?``:`s`}`,details:{cteCount:l.length,cubes:l.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${d.strategy}' measure strategy`,details:{strategy:d.strategy,regularMeasures:d.classification.regular.map(e=>e.name),multipliedMeasures:d.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:d.classification.deduplicationSafe.map(e=>e.name),sourceType:f.type}},{phase:`warnings`,decision:u.length>0?`Generated ${u.length} planning warning${u.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:u.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=G(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(e,t){return e.measures?e.measures.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for measure '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildDimensionRefs(e,t){return e.dimensions?e.dimensions.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for dimension '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildTimeDimensionRefs(e,t){return e.timeDimensions?e.timeDimensions.map(e=>{let[n,r]=e.dimension.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for time dimension '${e.dimension}'`);return{name:e.dimension,cube:this.toCubeRef(i),localName:r,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.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:[]}}},en=class{name=`identity`;optimise(e){return e}};function tn(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]:R(...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 nn(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(!Z.isPostAggregationWindow(u))continue;let d=Z.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?P`sum(${P`${P.identifier(g.cteAlias)}.${P.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=P`${_}`.as(d));let v=rn(u,_,n,r,l,t,a);v&&(e[o]=P`${v}`.as(o))}}function rn(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?P`${P.identifier(n.cteAlias)}.${P.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:K(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?K(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||Z.getDefaultWindowOperation(e.type)){case`difference`:return P`${t} - ${d}`;case`ratio`:return P`${t} / NULLIF(${d}, 0)`;case`percentChange`:return P`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function an(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=P`${P.identifier(o.cteAlias)}.${P.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=on(o,t,r),a=e||n;switch(u.type){case`count`:case`countDistinct`:case`sum`:f=a?H(d):V(d);break;case`avg`:f=a?H(d):i.databaseAdapter.buildAvg(d);break;case`min`:f=Ee(d);break;case`max`:f=H(d);break;case`number`:f=H(d);break;default:f=a?H(d):V(d)}}a[s]=P`${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]=P`${P.identifier(o.cteAlias)}.${P.identifier(i)}`.as(t))}}return nn(a,e,t,n,r,i),a}function on(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&&sn(e.sourceColumnObj,t,n))}function sn(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 cn(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=P`${P.identifier(c)}.${P.identifier(n.sourceColumn)}`,r=n.targetColumnObj;r&&e.push(L(r,t))}e.length>0&&(a=R(...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;if(u)d=P`${P.identifier(u)}`,f=a.cteBuilder.buildCTEJoinCondition(n,u,e),p=void 0;else{let e=i.downstreamCubeMap.get(n.cube.name),r=n.cube.sql(t);if(d=r.from,p=r.where,e&&!n.junctionTable){let t=[];for(let n of e.joinKeys){let r=P`${P.identifier(e.cteAlias)}.${P.identifier(n.sourceColumn)}`,i=n.targetColumnObj||P.identifier(n.targetColumn);t.push(L(r,i))}f=t.length===1?t[0]:R(...t)}else f=n.joinCondition}let m=n.joinType||`left`,h=m!==`inner`&&p?R(f,p):f;try{switch(m){case`left`:s=s.leftJoin(d,h),p&&c.add(n.cube.name);break;case`inner`:s=s.innerJoin(d,f);break;case`right`:s=s.rightJoin(d,h),p&&c.add(n.cube.name);break;case`full`:s=s.fullJoin(d,h),p&&c.add(n.cube.name);break}}catch{}}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function ln(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]:R(...c);u=u.where(e)}let d=s.queryBuilder.buildGroupByFields(e.joinCubes.length>0?r:e.primaryCube,t,n,e);d.length>0&&(u=u.groupBy(...d));let f=s.queryBuilder.buildHavingConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e);if(f.length>0){let e=f.length===1?f[0]:R(...f);u=u.having(e)}let p=s.queryBuilder.buildOrderBy(t);return p.length>0&&(u=u.orderBy(...p)),u=s.queryBuilder.applyLimitAndOffset(u,t),u}function un(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 dn=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=tn(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]);return ln(e,t,n,c,s,o,cn(e,n,s,an(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?un(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=K(o.sql,n);u[e]=P`${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]=P`${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=K(t.sql,n),i=`__pk__${e}`;u[i]=P`${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]=P`${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);v=this.applyJoinByType(v,t.joinType??`left`,e.from,t.joinCondition),e.where&&_.push(e.where)}_.push(...r.queryBuilder.buildWhereConditions(a,t,n)),_.length>0&&(v=v.where(_.length===1?_[0]:R(..._))),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=K(t.sql,n);x[e]=P`${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]=P`${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=K(r.sql,n),a=`__avg_sum__${t}`,s=`__avg_count__${t}`;x[a]=P`sum(${i})`.as(a),x[s]=P`count(${i})`.as(s)}let T=n.db.select(x).from(b.from),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]:R(...E))),S.length>0&&(T=T.groupBy(...S));let ee=n.db.$with(l).as(T),D={};for(let e of t.dimensions??[])D[e]=P`${P.identifier(c)}.${P.identifier(e)}`.as(e);for(let e of t.timeDimensions??[])D[e.dimension]=P`${P.identifier(c)}.${P.identifier(e.dimension)}`.as(e.dimension);for(let e of h){let[,t]=e.split(`.`),n=o.measures?.[t];D[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(`.`,`__`)}`;D[e]=this.buildKeysOuterAggregation(r?.type??`sum`,c,i,e)}let O=n.db.with(y,ee).select(D).from(P`${P.identifier(c)}`),k=f.map((e,t)=>L(P`${P.identifier(c)}.${P.identifier(e)}`,P`${P.identifier(l)}.${P.identifier(s[t])}`)),te=k.length===1?k[0]:R(...k);O=O.leftJoin(P`${P.identifier(l)}`,te);let ne=[...(t.dimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e)}`),...(t.timeDimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e.dimension)}`)];ne.length>0&&(O=O.groupBy(...ne));let A=r.queryBuilder.buildOrderBy(t,Object.keys(D));return A.length>0&&(O=O.orderBy(...A)),O=r.queryBuilder.applyLimitAndOffset(O,t),O}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]=P`${this.coalesceQualifiedColumn(d,e)}`.as(e);for(let e of i.groups)for(let t of e.measures)f[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let p=n.db.with(...l).select(f).from(P`${P.identifier(u)}`),m=new Map;for(let e of o)m.set(e,P`${P.identifier(u)}.${P.identifier(e)}`);for(let e=1;e<i.groups.length;e++){let t=i.groups[e].alias,n;if(o.length===0)n=P`1 = 1`;else{let e=o.map(e=>L(m.get(e),P`${P.identifier(t)}.${P.identifier(e)}`));n=e.length===1?e[0]:R(...e)}if(p=this.applyJoinByType(p,c,P`${P.identifier(t)}`,n),o.length>0&&c===`full`)for(let e of o)m.set(e,P`coalesce(${m.get(e)}, ${P`${P.identifier(t)}.${P.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=>P`select ${this.buildSharedKeySelection(e.alias,a)} from ${P.identifier(e.alias)}`),c=P`${P.join(s,P` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=P`${P.identifier(o)}.${P.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(P`${P.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>L(P`${P.identifier(o)}.${P.identifier(t)}`,P`${P.identifier(e.alias)}.${P.identifier(t)}`)),n=t.length===1?t[0]:R(...t);d=d.leftJoin(P`${P.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=>P`${P.identifier(e)}.${P.identifier(t)} as ${P.identifier(t)}`);return P.join(n,P`, `)}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 P`${P.identifier(e[0])}.${P.identifier(t)}`;let n=e.map(e=>P`${P.identifier(e)}.${P.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=P`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 P`min(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`max`:return P`max(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`avg`:return P`sum(${P`${P.identifier(t)}.${P.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${P`${P.identifier(t)}.${P.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return P`coalesce(sum(${P`${P.identifier(t)}.${P.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 Q(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 fn=class{queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;cacheConfig;logicalPlanBuilder;planOptimiser;rlsSetup;constructor(e,t,n){if(this.dbExecutor=e,this.databaseAdapter=e.databaseAdapter,!this.databaseAdapter)throw Error(`DatabaseExecutor must have a databaseAdapter property`);this.queryBuilder=new Nt(this.databaseAdapter);let r=new Ft,i=new It(this.queryBuilder);this.drizzlePlanBuilder=new dn(this.queryBuilder,i,this.databaseAdapter),this.comparisonQueryBuilder=new Gt(this.databaseAdapter),this.funnelQueryBuilder=new Kt(this.databaseAdapter),this.flowQueryBuilder=new qt(this.databaseAdapter),this.retentionQueryBuilder=new Qt(this.databaseAdapter),this.logicalPlanBuilder=new $t(r),this.planOptimiser=new en,this.cacheConfig=t,this.rlsSetup=n}async withRLSContext(e,t){if(!this.rlsSetup)return t();let n=this.dbExecutor.db;if(!n.transaction)throw Error(`rlsSetup requires a database driver that supports transactions (db.transaction)`);let r=this.rlsSetup;return n.transaction(async n=>{await r(n,e);let i=Object.create(this.dbExecutor);return i.db=n,this.dbExecutor=i,t()})}async execute(e,t,n,r){try{let i=this.resolveQueryMode(t);this.validateQueryForMode(i,e,t);let a;if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)if(a=yt(t,n,this.cacheConfig),r?.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(n,()=>this.executeQueryByModeWithCache(i,e,t,n,a))}catch(e){if(e instanceof Error){let t=e;for(;t.cause instanceof Error;)t=t.cause;let n=t.message,r=t;throw r.code&&(n+=` [${r.code}]`),r.detail&&(n+=` Detail: ${r.detail}`),r.hint&&(n+=` Hint: ${r.hint}`),e.message=`Query execution failed: ${n}`,e}throw Error(`Query execution failed: Unknown error`,{cause:e})}}buildLogicalPlan(e,t,n){let r=new q,i=this.createQueryContext(n,r);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);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(e){let t=this.comparisonQueryBuilder.getComparisonTimeDimension(e);if(!t||!t.compareDateRange)throw Error(`No compareDateRange found in query`);let n=this.comparisonQueryBuilder.normalizePeriods(t.compareDateRange);if(n.length<2)throw Error(`compareDateRange requires at least 2 periods`);let r=n.map(t=>this.comparisonQueryBuilder.createPeriodQuery(e,t));return{timeDimension:t,granularity:t.granularity||`day`,periods:n,periodQueries:r}}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(e,t,n){let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a);Q(`funnel query`,o);let s=await o,c=this.funnelQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:c,annotation:l}}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(e,t,n){let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a);Q(`flow query`,o);let s=await o,c=this.flowQueryBuilder.transformResult(s),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[c],annotation:l}}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(e,t,n){let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a);Q(`retention query`,o);let s=await o,c=this.retentionQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:c,annotation:l}}async executeStandardQuery(e,t,n){let r=new q,i=this.createQueryContext(n,r);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);Q(`query`,s);let c=this.queryBuilder.collectNumericFields(e,t),l=await this.dbExecutor.execute(s,c);return{data:Wt(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){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t}}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(e,t,n){if(!this.funnelQueryBuilder.hasFunnel(t))throw Error(`Query does not contain a valid funnel configuration`);let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunFlow(e,t,n){if(!this.flowQueryBuilder.hasFlow(t))throw Error(`Query does not contain a valid flow configuration`);let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunRetention(e,t,n){if(!this.retentionQueryBuilder.hasRetention(t))throw Error(`Query does not contain a valid retention configuration`);let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a).toSQL();return{sql:o.sql,params:o.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);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(e){let t=[];if(this.comparisonQueryBuilder.hasComparison(e)&&t.push(`comparison`),this.funnelQueryBuilder.hasFunnel(e)&&t.push(`funnel`),this.flowQueryBuilder.hasFlow(e)&&t.push(`flow`),this.retentionQueryBuilder.hasRetention(e)&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}validateQueryForMode(e,t,n){let r=()=>{let e=hn(t,n);if(!e.isValid)throw Error(`Query validation failed: ${e.errors.join(`, `)}`)};({regular:r,comparison:r,funnel:()=>{let e=this.funnelQueryBuilder.validateConfig(n.funnel,t);if(!e.isValid)throw Error(`Funnel validation failed: ${e.errors.join(`, `)}`)},flow:()=>{let e=this.flowQueryBuilder.validateConfig(n.flow,t);if(!e.isValid)throw Error(`Flow validation failed: ${e.errors.join(`, `)}`)},retention:()=>{let e=this.retentionQueryBuilder.validateConfig(n.retention,t);if(!e.isValid)throw Error(`Retention validation failed: ${e.errors.join(`, `)}`)}})[mt(e)]()}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)}[mt(e)]()}async executeRegularQueryWithCache(e,t,n,r){let i=new q,a=this.createQueryContext(n,i);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);Q(`query`,c);let l=this.queryBuilder.collectNumericFields(e,t),u=await this.dbExecutor.execute(c,l),d={data:Wt(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)}[mt(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=vt(e.filters);for(let e of i){let i=gt(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`?K(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=_t(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=K(c.sql,r),u=this.queryBuilder.buildDateRangeCondition(l,i.dateRange);u&&t.set(e,u)}}}},pn=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(`Database executor not configured`);return ut(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new fn(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 X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let e=[];for(let[t,n]of this.cubes)if(n.joins)for(let[r,i]of Object.entries(n.joins))typeof i.targetCube==`string`&&!this.cubes.has(i.targetCube)&&e.push(`${t}.joins.${r}: target cube '${i.targetCube}' is not registered`);if(e.length>0)throw Error(`Unresolved cube references:\n${e.map(e=>` - ${e}`).join(`
196
+ )`,o=this.databaseAdapter.buildPeriodSeriesSubquery(e.periods),s={period_number:P`p.period_number`.as(`period_number`),retained_users:P`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},c=[P`p.period_number`];for(let e=0;e<n;e++)s[`breakdown_${e}`]=P.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),c.push(P.raw(`ump.breakdown_${e}`));return t.db.select(s).from(P`${a} ump`).innerJoin(o,P`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]}},$t=class{constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(t));if(r.length===0)throw Error(`No cubes found in query`);let i=this.queryPlanner.analyzePrimaryCube(r,t,e),a=i.selectedCube,o=e.get(a);if(!o)throw Error(`Primary cube '${a}' not found`);let s=r.filter(e=>e!==a).map(n=>this.queryPlanner.analyzeJoinPathForTarget(e,a,n,t)),c=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(e,o,r,n,t):[],l=r.length>1?this.queryPlanner.buildPreAggregationCTEs(e,o,c,t,n)??[]:[],u=this.queryPlanner.buildWarnings(t,l),d=this.buildSourceFromPhases(o,c,l,e,t,n),f=d.source,p=this.buildQueryNode(f,t,e,u),m=this.buildPreAggregationAnalysis(l),h=new Map;for(let t of r){let n=e.get(t);n&&h.set(t,n)}let g=Z.hasPostAggregationWindows(t.measures??[],h),_=[...s.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...u.map(e=>e.message)];return{plan:p,analysis:{timestamp:new Date().toISOString(),cubeCount:r.length,cubesInvolved:[...r].sort(),primaryCube:i,joinPaths:s,preAggregations:m,querySummary:{queryType:l.length>0?`multi_cube_cte`:r.length>1?`multi_cube_join`:`single_cube`,measureStrategy:d.strategy,joinCount:c.length,cteCount:l.length,hasPreAggregation:l.length>0,hasWindowFunctions:g},warnings:_.length>0?_:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${r.length} cube${r.length===1?``:`s`} from query members`,details:{cubesInvolved:[...r].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${i.selectedCube}' as primary cube (${i.reason})`,details:{selectedCube:i.selectedCube,reason:i.reason,candidates:i.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${c.length} join${c.length===1?``:`s`}`,details:{joinCount:c.length,joinTargets:c.map(e=>e.cube.name),pathSelection:s.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${l.length} pre-aggregation CTE${l.length===1?``:`s`}`,details:{cteCount:l.length,cubes:l.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${d.strategy}' measure strategy`,details:{strategy:d.strategy,regularMeasures:d.classification.regular.map(e=>e.name),multipliedMeasures:d.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:d.classification.deduplicationSafe.map(e=>e.name),sourceType:f.type}},{phase:`warnings`,decision:u.length>0?`Generated ${u.length} planning warning${u.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:u.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=G(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(e,t){return e.measures?e.measures.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for measure '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildDimensionRefs(e,t){return e.dimensions?e.dimensions.map(e=>{let[n,r]=e.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for dimension '${e}'`);return{name:e,cube:this.toCubeRef(i),localName:r}}):[]}buildTimeDimensionRefs(e,t){return e.timeDimensions?e.timeDimensions.map(e=>{let[n,r]=e.dimension.split(`.`),i=t.get(n);if(!i)throw Error(`Cube '${n}' not found for time dimension '${e.dimension}'`);return{name:e.dimension,cube:this.toCubeRef(i),localName:r,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.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:[]}}},en=class{name=`identity`;optimise(e){return e}};function tn(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]:R(...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 nn(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(!Z.isPostAggregationWindow(u))continue;let d=Z.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?P`sum(${P`${P.identifier(g.cteAlias)}.${P.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=P`${_}`.as(d));let v=rn(u,_,n,r,l,t,a);v&&(e[o]=P`${v}`.as(o))}}function rn(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?P`${P.identifier(n.cteAlias)}.${P.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:K(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?K(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||Z.getDefaultWindowOperation(e.type)){case`difference`:return P`${t} - ${d}`;case`ratio`:return P`${t} / NULLIF(${d}, 0)`;case`percentChange`:return P`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function an(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=P`${P.identifier(o.cteAlias)}.${P.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=on(o,t,r),a=e||n;switch(u.type){case`count`:case`countDistinct`:case`sum`:f=a?H(d):V(d);break;case`avg`:f=a?H(d):i.databaseAdapter.buildAvg(d);break;case`min`:f=Ee(d);break;case`max`:f=H(d);break;case`number`:f=H(d);break;default:f=a?H(d):V(d)}}a[s]=P`${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]=P`${P.identifier(o.cteAlias)}.${P.identifier(i)}`.as(t))}}return nn(a,e,t,n,r,i),a}function on(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&&sn(e.sourceColumnObj,t,n))}function sn(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 cn(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=P`${P.identifier(c)}.${P.identifier(n.sourceColumn)}`,r=n.targetColumnObj;r&&e.push(L(r,t))}e.length>0&&(a=R(...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;if(u)d=P`${P.identifier(u)}`,f=a.cteBuilder.buildCTEJoinCondition(n,u,e),p=void 0;else{let e=i.downstreamCubeMap.get(n.cube.name),r=n.cube.sql(t);if(d=r.from,p=r.where,e&&!n.junctionTable){let t=[];for(let n of e.joinKeys){let r=P`${P.identifier(e.cteAlias)}.${P.identifier(n.sourceColumn)}`,i=n.targetColumnObj||P.identifier(n.targetColumn);t.push(L(r,i))}f=t.length===1?t[0]:R(...t)}else f=n.joinCondition}let m=n.joinType||`left`,h=m!==`inner`&&p?R(f,p):f;try{switch(m){case`left`:s=s.leftJoin(d,h),p&&c.add(n.cube.name);break;case`inner`:s=s.innerJoin(d,f);break;case`right`:s=s.rightJoin(d,h),p&&c.add(n.cube.name);break;case`full`:s=s.fullJoin(d,h),p&&c.add(n.cube.name);break}}catch{}}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function ln(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]:R(...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]:R(...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 un(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 dn=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=tn(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?un(e):new Map([[e.primaryCube.name,e.primaryCube]]);return ln(e,t,n,c,s,o,cn(e,n,s,an(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?un(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=K(o.sql,n);u[e]=P`${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]=P`${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=K(t.sql,n),i=`__pk__${e}`;u[i]=P`${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]=P`${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);v=this.applyJoinByType(v,t.joinType??`left`,e.from,t.joinCondition),e.where&&_.push(e.where)}_.push(...r.queryBuilder.buildWhereConditions(a,t,n)),_.length>0&&(v=v.where(_.length===1?_[0]:R(..._))),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=K(t.sql,n);x[e]=P`${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]=P`${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=K(r.sql,n),a=`__avg_sum__${t}`,s=`__avg_count__${t}`;x[a]=P`sum(${i})`.as(a),x[s]=P`count(${i})`.as(s)}let T=n.db.select(x).from(b.from),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]:R(...E))),S.length>0&&(T=T.groupBy(...S));let ee=n.db.$with(l).as(T),D={};for(let e of t.dimensions??[])D[e]=P`${P.identifier(c)}.${P.identifier(e)}`.as(e);for(let e of t.timeDimensions??[])D[e.dimension]=P`${P.identifier(c)}.${P.identifier(e.dimension)}`.as(e.dimension);for(let e of h){let[,t]=e.split(`.`),n=o.measures?.[t];D[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(`.`,`__`)}`;D[e]=this.buildKeysOuterAggregation(r?.type??`sum`,c,i,e)}let O=n.db.with(y,ee).select(D).from(P`${P.identifier(c)}`),k=f.map((e,t)=>L(P`${P.identifier(c)}.${P.identifier(e)}`,P`${P.identifier(l)}.${P.identifier(s[t])}`)),te=k.length===1?k[0]:R(...k);O=O.leftJoin(P`${P.identifier(l)}`,te);let ne=[...(t.dimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e)}`),...(t.timeDimensions??[]).map(e=>P`${P.identifier(c)}.${P.identifier(e.dimension)}`)];ne.length>0&&(O=O.groupBy(...ne));let A=r.queryBuilder.buildOrderBy(t,Object.keys(D));return A.length>0&&(O=O.orderBy(...A)),O=r.queryBuilder.applyLimitAndOffset(O,t),O}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]=P`${this.coalesceQualifiedColumn(d,e)}`.as(e);for(let e of i.groups)for(let t of e.measures)f[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let p=n.db.with(...l).select(f).from(P`${P.identifier(u)}`),m=new Map;for(let e of o)m.set(e,P`${P.identifier(u)}.${P.identifier(e)}`);for(let e=1;e<i.groups.length;e++){let t=i.groups[e].alias,n;if(o.length===0)n=P`1 = 1`;else{let e=o.map(e=>L(m.get(e),P`${P.identifier(t)}.${P.identifier(e)}`));n=e.length===1?e[0]:R(...e)}if(p=this.applyJoinByType(p,c,P`${P.identifier(t)}`,n),o.length>0&&c===`full`)for(let e of o)m.set(e,P`coalesce(${m.get(e)}, ${P`${P.identifier(t)}.${P.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=>P`select ${this.buildSharedKeySelection(e.alias,a)} from ${P.identifier(e.alias)}`),c=P`${P.join(s,P` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=P`${P.identifier(o)}.${P.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=P`coalesce(${P`${P.identifier(e.alias)}.${P.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(P`${P.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>L(P`${P.identifier(o)}.${P.identifier(t)}`,P`${P.identifier(e.alias)}.${P.identifier(t)}`)),n=t.length===1?t[0]:R(...t);d=d.leftJoin(P`${P.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=>P`${P.identifier(e)}.${P.identifier(t)} as ${P.identifier(t)}`);return P.join(n,P`, `)}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 P`${P.identifier(e[0])}.${P.identifier(t)}`;let n=e.map(e=>P`${P.identifier(e)}.${P.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=P`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 P`min(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`max`:return P`max(${P`${P.identifier(t)}.${P.identifier(n)}`})`.as(r);case`avg`:return P`sum(${P`${P.identifier(t)}.${P.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${P`${P.identifier(t)}.${P.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return P`coalesce(sum(${P`${P.identifier(t)}.${P.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 Q(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 fn=class{queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;cacheConfig;logicalPlanBuilder;planOptimiser;rlsSetup;constructor(e,t,n){if(this.dbExecutor=e,this.databaseAdapter=e.databaseAdapter,!this.databaseAdapter)throw Error(`DatabaseExecutor must have a databaseAdapter property`);this.queryBuilder=new Nt(this.databaseAdapter);let r=new Ft,i=new It(this.queryBuilder);this.drizzlePlanBuilder=new dn(this.queryBuilder,i,this.databaseAdapter),this.comparisonQueryBuilder=new Gt(this.databaseAdapter),this.funnelQueryBuilder=new Kt(this.databaseAdapter),this.flowQueryBuilder=new qt(this.databaseAdapter),this.retentionQueryBuilder=new Qt(this.databaseAdapter),this.logicalPlanBuilder=new $t(r),this.planOptimiser=new en,this.cacheConfig=t,this.rlsSetup=n}async withRLSContext(e,t){if(!this.rlsSetup)return t();let n=this.dbExecutor.db;if(!n.transaction)throw Error(`rlsSetup requires a database driver that supports transactions (db.transaction)`);let r=this.rlsSetup;return n.transaction(async n=>{await r(n,e);let i=Object.create(this.dbExecutor);return i.db=n,this.dbExecutor=i,t()})}async execute(e,t,n,r){try{let i=this.resolveQueryMode(t);this.validateQueryForMode(i,e,t);let a;if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)if(a=yt(t,n,this.cacheConfig),r?.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(n,()=>this.executeQueryByModeWithCache(i,e,t,n,a))}catch(e){if(e instanceof Error){let t=e;for(;t.cause instanceof Error;)t=t.cause;let n=t.message,r=t;throw r.code&&(n+=` [${r.code}]`),r.detail&&(n+=` Detail: ${r.detail}`),r.hint&&(n+=` Hint: ${r.hint}`),e.message=`Query execution failed: ${n}`,e}throw Error(`Query execution failed: Unknown error`,{cause:e})}}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(e){let t=this.comparisonQueryBuilder.getComparisonTimeDimension(e);if(!t||!t.compareDateRange)throw Error(`No compareDateRange found in query`);let n=this.comparisonQueryBuilder.normalizePeriods(t.compareDateRange);if(n.length<2)throw Error(`compareDateRange requires at least 2 periods`);let r=n.map(t=>this.comparisonQueryBuilder.createPeriodQuery(e,t));return{timeDimension:t,granularity:t.granularity||`day`,periods:n,periodQueries:r}}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(e,t,n){let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a);Q(`funnel query`,o);let s=await o,c=this.funnelQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:c,annotation:l}}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(e,t,n){let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a);Q(`flow query`,o);let s=await o,c=this.flowQueryBuilder.transformResult(s),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[c],annotation:l}}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(e,t,n){let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a);Q(`retention query`,o);let s=await o,c=this.retentionQueryBuilder.transformResult(s,r),l={measures:{},dimensions:{},segments:{},timeDimensions:{}};return l.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:c,annotation:l}}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);Q(`query`,s);let c=this.queryBuilder.collectNumericFields(e,t),l=await this.dbExecutor.execute(s,c);return{data:Wt(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(e,t,n){if(!this.funnelQueryBuilder.hasFunnel(t))throw Error(`Query does not contain a valid funnel configuration`);let r=t.funnel,i=this.funnelQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Funnel validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.funnelQueryBuilder.buildFunnelQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunFlow(e,t,n){if(!this.flowQueryBuilder.hasFlow(t))throw Error(`Query does not contain a valid flow configuration`);let r=t.flow,i=this.flowQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Flow validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.flowQueryBuilder.buildFlowQuery(r,e,a).toSQL();return{sql:o.sql,params:o.params}}async dryRunRetention(e,t,n){if(!this.retentionQueryBuilder.hasRetention(t))throw Error(`Query does not contain a valid retention configuration`);let r=t.retention,i=this.retentionQueryBuilder.validateConfig(r,e);if(!i.isValid)throw Error(`Retention validation failed: ${i.errors.join(`, `)}`);let a={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},o=this.retentionQueryBuilder.buildRetentionQuery(r,e,a).toSQL();return{sql:o.sql,params:o.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(e){let t=[];if(this.comparisonQueryBuilder.hasComparison(e)&&t.push(`comparison`),this.funnelQueryBuilder.hasFunnel(e)&&t.push(`funnel`),this.flowQueryBuilder.hasFlow(e)&&t.push(`flow`),this.retentionQueryBuilder.hasRetention(e)&&t.push(`retention`),t.length===0)return`regular`;if(t.length>1)throw Error(`Query contains multiple query modes: ${t.join(`, `)}`);return t[0]}validateQueryForMode(e,t,n){let r=()=>{let e=hn(t,n);if(!e.isValid)throw Error(`Query validation failed: ${e.errors.join(`, `)}`)};({regular:r,comparison:r,funnel:()=>{let e=this.funnelQueryBuilder.validateConfig(n.funnel,t);if(!e.isValid)throw Error(`Funnel validation failed: ${e.errors.join(`, `)}`)},flow:()=>{let e=this.flowQueryBuilder.validateConfig(n.flow,t);if(!e.isValid)throw Error(`Flow validation failed: ${e.errors.join(`, `)}`)},retention:()=>{let e=this.retentionQueryBuilder.validateConfig(n.retention,t);if(!e.isValid)throw Error(`Retention validation failed: ${e.errors.join(`, `)}`)}})[mt(e)]()}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)}[mt(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);Q(`query`,c);let l=this.queryBuilder.collectNumericFields(e,t),u=await this.dbExecutor.execute(c,l),d={data:Wt(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)}[mt(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=vt(e.filters);for(let e of i){let i=gt(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`?K(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=_t(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=K(c.sql,r),u=this.queryBuilder.buildDateRangeCondition(l,i.dateRange);u&&t.set(e,u)}}}},pn=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(`Database executor not configured`);return ut(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new fn(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 X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let e=[];for(let[t,n]of this.cubes)if(n.joins)for(let[r,i]of Object.entries(n.joins))typeof i.targetCube==`string`&&!this.cubes.has(i.targetCube)&&e.push(`${t}.joins.${r}: target cube '${i.targetCube}' is not registered`);if(e.length>0)throw Error(`Unresolved cube references:\n${e.map(e=>` - ${e}`).join(`
197
197
  `)}`)}validateCalculatedMeasures(e){let t=[];for(let[n,r]of Object.entries(e.measures))if(r.type===`calculated`){if(!r.calculatedSql){t.push(`Calculated measure '${e.name}.${n}' must have calculatedSql property`);continue}let i=At(r.calculatedSql);if(!i.isValid){t.push(`Invalid calculatedSql syntax in '${e.name}.${n}': ${i.errors.join(`, `)}`);continue}let a=new Map(this.cubes);a.set(e.name,e);let o=new X(a);try{o.validateDependencies(e)}catch(e){t.push(e instanceof Error?e.message:String(e))}}if(t.length===0){let n=new Map(this.cubes);n.set(e.name,e);let r=new X(n);r.buildGraph(e);let i=r.detectCycle();i&&t.push(`Circular dependency detected in calculated measures: ${i.join(` -> `)}`)}if(t.length>0)throw Error(`Calculated measure validation failed for cube '${e.name}':\n${t.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(e,t,n){if(!this.cubes.get(e))throw Error(`Cube '${e}' not found`);return this.execute(t,n)}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=G(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(e,t,n){let r=this.getCube(e);if(!r)throw Error(`Cube '${e}' not found`);let i=await this.createQueryExecutor().generateSQL(r,t,n);return this.formatSqlResult(i)}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 hn(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};function mn(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 hn(e,t){let n=[],r=mn(t);if(r.length>1)return n.push(`Query contains multiple query modes: ${r.join(`, `)}`),{isValid:!1,errors:n};let i={funnel:()=>{let r=t.funnel.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Funnel binding key cube not found: ${t}`)}else if(Array.isArray(r))for(let t of r)e.has(t.cube)||n.push(`Funnel binding key cube not found: ${t.cube}`)},flow:()=>{let r=t.flow.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Flow binding key cube not found: ${t}`)}},retention:()=>{let r=t.retention,i=_n(r.timeDimension);i&&!e.has(i)&&n.push(`Retention cube not found: ${i}`);let a=r.bindingKey;if(typeof a==`string`){let[t]=a.split(`.`);t&&!e.has(t)&&n.push(`Retention binding key cube not found: ${t}`)}else if(Array.isArray(a))for(let t of a)e.has(t.cube)||n.push(`Retention binding key cube not found: ${t.cube}`);if(r.breakdownDimensions&&Array.isArray(r.breakdownDimensions))for(let t of r.breakdownDimensions){let[r]=t.split(`.`);r&&!e.has(r)&&n.push(`Retention breakdown cube not found: ${r}`)}}};if(r.length===1&&r[0]!==`comparison`)return i[r[0]](),{isValid:n.length===0,errors:n};let a=new Set;if(t.measures)for(let r of t.measures){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid measure format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in measure '${r}')`);continue}if(!o.measures[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.measures).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Measure '${i}' not found on cube '${t}'${e}`)}}if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid dimension format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in dimension '${r}')`);continue}if(!o.dimensions[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.dimensions).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Dimension '${i}' not found on cube '${t}'${e}`)}}if(t.timeDimensions)for(let r of t.timeDimensions){let[t,i]=r.dimension.split(`.`);if(!t||!i){n.push(`Invalid timeDimension format: ${r.dimension}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in timeDimension '${r.dimension}')`);continue}o.dimensions[i]||n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`)}if(t.filters)for(let r of t.filters)gn(r,e,n,a);return a.size===0&&n.push(`Query must reference at least one cube through measures, dimensions, or filters`),{isValid:n.length===0,errors:n}}function gn(e,t,n,r){if(`and`in e||`or`in e){let i=e.and||e.or||[];for(let e of i)gn(e,t,n,r);return}if(!(`member`in e)){n.push(`Filter must have a member field`);return}let[i,a]=e.member.split(`.`);if(!i||!a){n.push(`Invalid filter member format: ${e.member}. Expected format: 'CubeName.fieldName'`);return}r.add(i);let o=t.get(i);if(!o){n.push(`Cube '${i}' not found (referenced in filter '${e.member}')`);return}if(!o.dimensions[a]&&!o.measures[a]){let e=a===i?`. Did you mean one of: ${[...Object.keys(o.dimensions),...Object.keys(o.measures)].slice(0,5).map(e=>`'${i}.${e}'`).join(`, `)}?`:``;n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`)}}function _n(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var vn=[`2025-11-25`,`2025-06-18`,`2025-03-26`],yn=`2025-11-25`;function bn(e){let t=An(e[`mcp-protocol-version`])||`2025-11-25`;return{ok:vn.includes(t),negotiated:vn.includes(t)?t:null,supported:vn}}function xn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase()),n=t.includes(`text/event-stream`),r=t.includes(`application/json`);return n&&!r}var Sn=`mcp-session-id`;function Cn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase().split(`;`)[0]),n=t.some(e=>e===`application/json`),r=t.some(e=>e===`text/event-stream`);return n&&r}function wn(e,t={}){let{allowMissingOrigin:n=!0,allowedOrigins:r}=t;if(!e)return n?{valid:!0}:{valid:!1,reason:`Origin header is required`};if(!r||r.length===0)return{valid:!0};let i;try{i=new URL(e)}catch{return{valid:!1,reason:`Invalid Origin header format`}}return r.map(e=>{try{return new URL(e).origin}catch{return e}}).includes(i.origin)?{valid:!0}:{valid:!1,reason:`Origin not in allowed list`}}function Tn(e,t,n){let r=[];return t&&r.push(`id: ${t}`),n&&n>0&&r.push(`retry: ${n}`),r.push(`event: message`),r.push(`data: ${JSON.stringify(e)}`),r.push(``),r.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(e,t,n){if(!this.cubes.get(e))throw Error(`Cube '${e}' not found`);return this.execute(t,n)}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=G(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(e,t,n){let r=this.getCube(e);if(!r)throw Error(`Cube '${e}' not found`);let i=await this.createQueryExecutor().generateSQL(r,t,n);return this.formatSqlResult(i)}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 hn(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};function mn(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 hn(e,t){let n=[],r=mn(t);if(r.length>1)return n.push(`Query contains multiple query modes: ${r.join(`, `)}`),{isValid:!1,errors:n};let i={funnel:()=>{let r=t.funnel.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Funnel binding key cube not found: ${t}`)}else if(Array.isArray(r))for(let t of r)e.has(t.cube)||n.push(`Funnel binding key cube not found: ${t.cube}`)},flow:()=>{let r=t.flow.bindingKey;if(typeof r==`string`){let[t]=r.split(`.`);t&&!e.has(t)&&n.push(`Flow binding key cube not found: ${t}`)}},retention:()=>{let r=t.retention,i=_n(r.timeDimension);i&&!e.has(i)&&n.push(`Retention cube not found: ${i}`);let a=r.bindingKey;if(typeof a==`string`){let[t]=a.split(`.`);t&&!e.has(t)&&n.push(`Retention binding key cube not found: ${t}`)}else if(Array.isArray(a))for(let t of a)e.has(t.cube)||n.push(`Retention binding key cube not found: ${t.cube}`);if(r.breakdownDimensions&&Array.isArray(r.breakdownDimensions))for(let t of r.breakdownDimensions){let[r]=t.split(`.`);r&&!e.has(r)&&n.push(`Retention breakdown cube not found: ${r}`)}}};if(r.length===1&&r[0]!==`comparison`)return i[r[0]](),{isValid:n.length===0,errors:n};let a=new Set;if(t.measures)for(let r of t.measures){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid measure format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in measure '${r}')`);continue}if(!o.measures[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.measures).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Measure '${i}' not found on cube '${t}'${e}`)}}if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(!t||!i){n.push(`Invalid dimension format: ${r}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in dimension '${r}')`);continue}if(!o.dimensions[i]){let e=i===t?`. Did you mean one of: ${Object.keys(o.dimensions).slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``;n.push(`Dimension '${i}' not found on cube '${t}'${e}`)}}if(t.timeDimensions)for(let r of t.timeDimensions){let[t,i]=r.dimension.split(`.`);if(!t||!i){n.push(`Invalid timeDimension format: ${r.dimension}. Expected format: 'CubeName.fieldName'`);continue}a.add(t);let o=e.get(t);if(!o){n.push(`Cube '${t}' not found (referenced in timeDimension '${r.dimension}')`);continue}o.dimensions[i]||n.push(`TimeDimension '${i}' not found on cube '${t}' (must be a dimension with time type)`)}if(t.filters)for(let r of t.filters)gn(r,e,n,a);if(a.size===0&&n.push(`Query must reference at least one cube through measures, dimensions, or filters`),t.ungrouped){t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0||n.push(`Ungrouped queries require at least one dimension or time dimension`),t.funnel&&n.push(`Ungrouped queries are incompatible with funnel analysis`),t.flow&&n.push(`Ungrouped queries are incompatible with flow analysis`),t.retention&&n.push(`Ungrouped queries are incompatible with retention analysis`),t.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>0)&&n.push(`Ungrouped queries are incompatible with compareDateRange`),t.timeDimensions?.some(e=>e.fillMissingDates===!0)&&n.push(`Ungrouped queries are incompatible with fillMissingDates`);let r=new Set([`sum`,`avg`,`min`,`max`,`number`]),i=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(t.measures)for(let a of t.measures){let[t,o]=a.split(`.`),s=e.get(t);if(s&&s.measures[o]){let e=s.measures[o];i.has(e.type)&&n.push(`Measure '${a}' has type '${e.type}' which is incompatible with ungrouped queries. Only ${[...r].join(`, `)} types are allowed.`),e.filters&&e.filters.length>0&&n.push(`Measure '${a}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`)}}for(let t of a){let r=e.get(t);if(r&&r.joins){for(let[i,o]of Object.entries(r.joins))if(o.relationship===`hasMany`){let r=G(o.targetCube,e);r&&a.has(r.name)&&n.push(`Ungrouped queries are incompatible with hasMany relationships (${t} → ${i} is hasMany)`)}}}}return{isValid:n.length===0,errors:n}}function gn(e,t,n,r){if(`and`in e||`or`in e){let i=e.and||e.or||[];for(let e of i)gn(e,t,n,r);return}if(!(`member`in e)){n.push(`Filter must have a member field`);return}let[i,a]=e.member.split(`.`);if(!i||!a){n.push(`Invalid filter member format: ${e.member}. Expected format: 'CubeName.fieldName'`);return}r.add(i);let o=t.get(i);if(!o){n.push(`Cube '${i}' not found (referenced in filter '${e.member}')`);return}if(!o.dimensions[a]&&!o.measures[a]){let e=a===i?`. Did you mean one of: ${[...Object.keys(o.dimensions),...Object.keys(o.measures)].slice(0,5).map(e=>`'${i}.${e}'`).join(`, `)}?`:``;n.push(`Filter field '${a}' not found on cube '${i}' (must be a dimension or measure)${e}`)}}function _n(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var vn=[`2025-11-25`,`2025-06-18`,`2025-03-26`],yn=`2025-11-25`;function bn(e){let t=An(e[`mcp-protocol-version`])||`2025-11-25`;return{ok:vn.includes(t),negotiated:vn.includes(t)?t:null,supported:vn}}function xn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase()),n=t.includes(`text/event-stream`),r=t.includes(`application/json`);return n&&!r}var Sn=`mcp-session-id`;function Cn(e){if(!e)return!1;let t=e.split(`,`).map(e=>e.trim().toLowerCase().split(`;`)[0]),n=t.some(e=>e===`application/json`),r=t.some(e=>e===`text/event-stream`);return n&&r}function wn(e,t={}){let{allowMissingOrigin:n=!0,allowedOrigins:r}=t;if(!e)return n?{valid:!0}:{valid:!1,reason:`Origin header is required`};if(!r||r.length===0)return{valid:!0};let i;try{i=new URL(e)}catch{return{valid:!1,reason:`Invalid Origin header format`}}return r.map(e=>{try{return new URL(e).origin}catch{return e}}).includes(i.origin)?{valid:!0}:{valid:!1,reason:`Origin not in allowed list`}}function Tn(e,t,n){let r=[];return t&&r.push(`id: ${t}`),n&&n>0&&r.push(`retry: ${n}`),r.push(`event: message`),r.push(`data: ${JSON.stringify(e)}`),r.push(``),r.join(`
199
199
  `)}function En(e,t,n,r){return{jsonrpc:`2.0`,id:e??null,error:{code:t,message:n,...r===void 0?{}:{data:r}}}}function Dn(e,t){return{jsonrpc:`2.0`,id:e??null,result:t}}function On(e){if(!e||typeof e!=`object`)return null;let t=e;return t.jsonrpc!==`2.0`||typeof t.method!=`string`?null:{jsonrpc:`2.0`,method:t.method,id:t.id,params:t.params}}async function kn(t,n,r){let{semanticLayer:i,extractSecurityContext:a,rawRequest:o,rawResponse:s}=r,c=r.prompts??In,l=r.resources??Ln;switch(t){case`initialize`:{let e=n?.protocolVersion,t;return t=e&&vn.includes(e)?e:yn,{protocolVersion:t,capabilities:{tools:{listChanged:!1},resources:{listChanged:!1},prompts:{listChanged:!1},sampling:{}},sessionId:Mn(),serverInfo:{name:`drizzle-cube`,version:typeof process<`u`?process.env?.npm_package_version||`dev`:`worker`}}}case`list_tools`:case`tools/list`:return{tools:Nn(),nextCursor:``};case`call_tool`:case`tools/call`:return Pn(n,r);case`resources/list`:return{resources:l.map(({uri:e,name:t,description:n,mimeType:r})=>({uri:e,name:t,description:n,mimeType:r})),nextCursor:``};case`resources/templates/list`:return{resourceTemplates:[],nextCursor:``};case`resources/read`:{let e=n?.uri,t=l.find(t=>t.uri===e)||l[0];if(!t)throw $(-32602,`resource not found`);return{contents:[{uri:t.uri,mimeType:t.mimeType,text:t.text}]}}case`prompts/list`:return{prompts:c.map(({name:e,description:t})=>({name:e,description:t})),nextCursor:``};case`ping`:return{};case`notifications/initialized`:return{};case`prompts/get`:{let e=n?.name,t=c.find(t=>t.name===e)||c[0];if(!t)throw $(-32602,`prompt not found`);return{name:t.name,description:t.description,messages:t.messages}}case`discover`:return e.d(i,n||{});case`validate`:{let t=n||{};if(!t.query)throw $(-32602,`query is required`);return e.h(i,t)}case`load`:{let t=n||{};if(!t.query)throw $(-32602,`query is required`);return e.p(i,await a(o,s),t)}default:throw $(-32601,`Unknown MCP method: ${t}`)}}function $(e,t,n){let r=Error(t);return r.code=e,n!==void 0&&(r.data=n),r}function An(e){return e?Array.isArray(e)?e[0]||null:e:null}function jn(e){return e.id===void 0||e.id===null}function Mn(){return`evt-${e.c()}`}function Nn(){return[{name:`discover`,description:`Find relevant cubes based on topic or intent. Call this FIRST to understand available data.
200
200
 
201
201
  Returns cubes with: