drizzle-cube 0.6.3 → 0.6.4

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 (56) hide show
  1. package/dist/adapters/compiler-DyyBaLry.cjs +166 -0
  2. package/dist/adapters/{compiler-LKTN9PTt.js → compiler-lG6eNsoI.js} +214 -210
  3. package/dist/adapters/express/index.cjs +1 -1
  4. package/dist/adapters/express/index.js +1 -1
  5. package/dist/adapters/fastify/index.cjs +1 -1
  6. package/dist/adapters/fastify/index.js +1 -1
  7. package/dist/adapters/hono/index.cjs +1 -1
  8. package/dist/adapters/hono/index.js +1 -1
  9. package/dist/adapters/nextjs/index.cjs +1 -1
  10. package/dist/adapters/nextjs/index.d.ts +10 -0
  11. package/dist/adapters/nextjs/index.js +13 -9
  12. package/dist/cjs/adapters/nextjs/index.d.ts +10 -0
  13. package/dist/cjs/client/components/AnalysisBuilder/utils/filterUtils.d.ts +4 -10
  14. package/dist/cjs/client/components/shared/utils.d.ts +2 -1
  15. package/dist/cjs/client/shared/filters/filterOperations.d.ts +95 -0
  16. package/dist/cjs/client/shared/filters/index.d.ts +10 -0
  17. package/dist/cjs/client/shared/filters/operators.d.ts +23 -0
  18. package/dist/cjs/client/shared/index.d.ts +3 -2
  19. package/dist/cjs/client/shared/types.d.ts +3 -10
  20. package/dist/cjs/client/shared/utils.d.ts +1 -59
  21. package/dist/cjs/client/utils/filterUtils.d.ts +2 -9
  22. package/dist/cjs/server/logical-plan/logical-plan-builder.d.ts +0 -5
  23. package/dist/cjs/server/logical-plan/schema-builder.d.ts +19 -0
  24. package/dist/client/chunks/{DashboardEditModal-CWurUU2B.js → DashboardEditModal-Cs1ig1_V.js} +1520 -1119
  25. package/dist/client/chunks/DashboardEditModal-Cs1ig1_V.js.map +1 -0
  26. package/dist/client/chunks/{analysis-builder-Uj_Fxv0-.js → analysis-builder-B64yaeDe.js} +73 -73
  27. package/dist/client/chunks/{analysis-builder-Uj_Fxv0-.js.map → analysis-builder-B64yaeDe.js.map} +1 -1
  28. package/dist/client/chunks/{analysis-builder-shared-AdAYIfj_.js → analysis-builder-shared-CD0n2Nb8.js} +948 -1023
  29. package/dist/client/chunks/analysis-builder-shared-CD0n2Nb8.js.map +1 -0
  30. package/dist/client/chunks/{useDirtyStateTracking-BY_IIG1n.js → useDirtyStateTracking-BT6zqCFl.js} +249 -590
  31. package/dist/client/chunks/useDirtyStateTracking-BT6zqCFl.js.map +1 -0
  32. package/dist/client/chunks/{useExplainAI-PjMBmj2p.js → useExplainAI-Dq_meKNN.js} +2 -2
  33. package/dist/client/chunks/{useExplainAI-PjMBmj2p.js.map → useExplainAI-Dq_meKNN.js.map} +1 -1
  34. package/dist/client/components/AnalysisBuilder/utils/filterUtils.d.ts +4 -10
  35. package/dist/client/components/shared/utils.d.ts +2 -1
  36. package/dist/client/components.js +2 -2
  37. package/dist/client/hooks.js +2 -2
  38. package/dist/client/index.js +13 -13
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/shared/filters/filterOperations.d.ts +95 -0
  41. package/dist/client/shared/filters/index.d.ts +10 -0
  42. package/dist/client/shared/filters/operators.d.ts +23 -0
  43. package/dist/client/shared/index.d.ts +3 -2
  44. package/dist/client/shared/types.d.ts +3 -10
  45. package/dist/client/shared/utils.d.ts +1 -59
  46. package/dist/client/utils/filterUtils.d.ts +2 -9
  47. package/dist/client-bundle-stats.html +1 -1
  48. package/dist/server/index.cjs +33 -33
  49. package/dist/server/index.js +1272 -1268
  50. package/dist/server/logical-plan/logical-plan-builder.d.ts +0 -5
  51. package/dist/server/logical-plan/schema-builder.d.ts +19 -0
  52. package/package.json +3 -3
  53. package/dist/adapters/compiler-ChGO4ZLU.cjs +0 -166
  54. package/dist/client/chunks/DashboardEditModal-CWurUU2B.js.map +0 -1
  55. package/dist/client/chunks/analysis-builder-shared-AdAYIfj_.js.map +0 -1
  56. package/dist/client/chunks/useDirtyStateTracking-BY_IIG1n.js.map +0 -1
@@ -0,0 +1,166 @@
1
+ const e=require("./utils-_whV4fXL.cjs");var t=Symbol.for(`drizzle:entityKind`);function n(e,n){if(!e||typeof e!=`object`)return!1;if(e instanceof n)return!0;if(!Object.prototype.hasOwnProperty.call(n,t))throw Error(`Class "${n.name??`<unknown>`}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);let r=Object.getPrototypeOf(e).constructor;if(r)for(;r;){if(t in r&&r[t]===n[t])return!0;r=Object.getPrototypeOf(r)}return!1}var r=class{constructor(e,t){this.table=e,this.config=t,this.name=t.name,this.keyAsName=t.keyAsName,this.notNull=t.notNull,this.default=t.default,this.defaultFn=t.defaultFn,this.onUpdateFn=t.onUpdateFn,this.hasDefault=t.hasDefault,this.primary=t.primaryKey,this.isUnique=t.isUnique,this.uniqueName=t.uniqueName,this.uniqueType=t.uniqueType,this.dataType=t.dataType,this.columnType=t.columnType,this.generated=t.generated,this.generatedIdentity=t.generatedIdentity}static[t]=`Column`;name;keyAsName;primary;notNull;default;defaultFn;onUpdateFn;hasDefault;isUnique;uniqueName;uniqueType;dataType;columnType;enumValues=void 0;generated=void 0;generatedIdentity=void 0;config;mapFromDriverValue(e){return e}mapToDriverValue(e){return e}shouldDisableInsert(){return this.config.generated!==void 0&&this.config.generated.type!==`byDefault`}},i=Symbol.for(`drizzle:Name`),a=Symbol.for(`drizzle:isPgEnum`);function o(e){return!!e&&typeof e==`function`&&a in e&&e[a]===!0}var s=class{static[t]=`Subquery`;constructor(e,t,n,r=!1,i=[]){this._={brand:`Subquery`,sql:e,selectedFields:t,alias:n,isWith:r,usedTables:i}}},c={startActiveSpan(e,t){return t()}},l=Symbol.for(`drizzle:ViewBaseConfig`),u=Symbol.for(`drizzle:Schema`),d=Symbol.for(`drizzle:Columns`),f=Symbol.for(`drizzle:ExtraConfigColumns`),p=Symbol.for(`drizzle:OriginalName`),m=Symbol.for(`drizzle:BaseName`),h=Symbol.for(`drizzle:IsAlias`),g=Symbol.for(`drizzle:ExtraConfigBuilder`),_=Symbol.for(`drizzle:IsDrizzleTable`),v=class{static[t]=`Table`;static Symbol={Name:i,Schema:u,OriginalName:p,Columns:d,ExtraConfigColumns:f,BaseName:m,IsAlias:h,ExtraConfigBuilder:g};[i];[p];[u];[d];[f];[m];[h]=!1;[_]=!0;[g]=void 0;constructor(e,t,n){this[i]=this[p]=e,this[u]=t,this[m]=n}};function y(e){return e!=null&&typeof e.getSQL==`function`}function ee(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 b=class{static[t]=`StringChunk`;value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new x([this])}},x=class e{constructor(e){this.queryChunks=e;for(let t of e)if(n(t,v)){let e=t[v.Symbol.Schema];this.usedTables.push(e===void 0?t[v.Symbol.Name]:e+`.`+t[v.Symbol.Name])}}static[t]=`SQL`;decoder=re;shouldInlineParams=!1;usedTables=[];append(e){return this.queryChunks.push(...e.queryChunks),this}toQuery(e){return c.startActiveSpan(`drizzle.buildSQL`,t=>{let n=this.buildQueryFromSourceParams(this.queryChunks,e);return t?.setAttributes({"drizzle.query.text":n.sql,"drizzle.query.params":JSON.stringify(n.params)}),n})}buildQueryFromSourceParams(t,i){let a=Object.assign({},i,{inlineParams:i.inlineParams||this.shouldInlineParams,paramStartIndex:i.paramStartIndex||{value:0}}),{casing:c,escapeName:u,escapeParam:d,prepareTyping:f,inlineParams:p,paramStartIndex:m}=a;return ee(t.map(t=>{if(n(t,b))return{sql:t.value.join(``),params:[]};if(n(t,te))return{sql:u(t.value),params:[]};if(t===void 0)return{sql:``,params:[]};if(Array.isArray(t)){let e=[new b(`(`)];for(let[n,r]of t.entries())e.push(r),n<t.length-1&&e.push(new b(`, `));return e.push(new b(`)`)),this.buildQueryFromSourceParams(e,a)}if(n(t,e))return this.buildQueryFromSourceParams(t.queryChunks,{...a,inlineParams:p||t.shouldInlineParams});if(n(t,v)){let e=t[v.Symbol.Schema],n=t[v.Symbol.Name];return{sql:e===void 0||t[h]?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,r)){let e=c.getColumnCasing(t);if(i.invokeSource===`indexes`)return{sql:u(e),params:[]};let n=t.table[v.Symbol.Schema];return{sql:t.table[h]||n===void 0?u(t.table[v.Symbol.Name])+`.`+u(e):u(n)+`.`+u(t.table[v.Symbol.Name])+`.`+u(e),params:[]}}if(n(t,oe)){let e=t[l].schema,n=t[l].name;return{sql:e===void 0||t[l].isAlias?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,S)){if(n(t.value,w))return{sql:d(m.value++,t),params:[t],typings:[`none`]};let r=t.value===null?null:t.encoder.mapToDriverValue(t.value);if(n(r,e))return this.buildQueryFromSourceParams([r],a);if(p)return{sql:this.mapInlineParam(r,a),params:[]};let i=[`none`];return f&&(i=[f(t.encoder)]),{sql:d(m.value++,r),params:[r],typings:i}}return n(t,w)?{sql:d(m.value++,t),params:[t],typings:[`none`]}:n(t,e.Aliased)&&t.fieldAlias!==void 0?{sql:u(t.fieldAlias),params:[]}:n(t,s)?t._.isWith?{sql:u(t._.alias),params:[]}:this.buildQueryFromSourceParams([new b(`(`),t._.sql,new b(`) `),new te(t._.alias)],a):o(t)?t.schema?{sql:u(t.schema)+`.`+u(t.enumName),params:[]}:{sql:u(t.enumName),params:[]}:y(t)?t.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([t.getSQL()],a):this.buildQueryFromSourceParams([new b(`(`),t.getSQL(),new b(`)`)],a):p?{sql:this.mapInlineParam(t,a),params:[]}:{sql:d(m.value++,t),params:[t],typings:[`none`]}}))}mapInlineParam(e,{escapeString:t}){if(e===null)return`null`;if(typeof e==`number`||typeof e==`boolean`)return e.toString();if(typeof e==`string`)return t(e);if(typeof e==`object`){let n=e.toString();return t(n===`[object Object]`?JSON.stringify(e):n)}throw Error(`Unexpected param value: `+e)}getSQL(){return this}as(t){return t===void 0?this:new e.Aliased(this,t)}mapWith(e){return this.decoder=typeof e==`function`?{mapFromDriverValue:e}:e,this}inlineParams(){return this.shouldInlineParams=!0,this}if(e){return e?this:void 0}},te=class{constructor(e){this.value=e}static[t]=`Name`;brand;getSQL(){return new x([this])}};function ne(e){return typeof e==`object`&&!!e&&`mapToDriverValue`in e&&typeof e.mapToDriverValue==`function`}var re={mapFromDriverValue:e=>e},ie={mapToDriverValue:e=>e};({...re,...ie});var S=class{constructor(e,t=ie){this.value=e,this.encoder=t}static[t]=`Param`;brand;getSQL(){return new x([this])}};function C(e,...t){let n=[];(t.length>0||e.length>0&&e[0]!==``)&&n.push(new b(e[0]));for(let[r,i]of t.entries())n.push(i,new b(e[r+1]));return new x(n)}(e=>{function t(){return new x([])}e.empty=t;function n(e){return new x(e)}e.fromList=n;function r(e){return new x([new b(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 x(n)}e.join=i;function a(e){return new te(e)}e.identifier=a;function o(e){return new w(e)}e.placeholder=o;function s(e,t){return new S(e,t)}e.param=s})(C||={}),(e=>{class n{constructor(e,t){this.sql=e,this.fieldAlias=t}static[t]=`SQL.Aliased`;isSelectionField=!1;getSQL(){return this.sql}clone(){return new n(this.sql,this.fieldAlias)}}e.Aliased=n})(x||={});var w=class{constructor(e){this.name=e}static[t]=`Placeholder`;getSQL(){return new x([this])}},ae=Symbol.for(`drizzle:IsDrizzleView`),oe=class{static[t]=`View`;[l];[ae]=!0;constructor({name:e,schema:t,selectedFields:n,query:r}){this[l]={name:e,originalName:e,schema:t,selectedFields:n,query:r,isExisting:!r,isAlias:!1}}getSQL(){return new x([this])}};r.prototype.getSQL=function(){return new x([this])},v.prototype.getSQL=function(){return new x([this])},s.prototype.getSQL=function(){return new x([this])};function T(e,t){return ne(t)&&!y(e)&&!n(e,S)&&!n(e,w)&&!n(e,r)&&!n(e,v)&&!n(e,oe)?new S(e,t):e}var E=(e,t)=>C`${e} = ${T(t,e)}`,se=(e,t)=>C`${e} <> ${T(t,e)}`;function D(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new x(t):new x([new b(`(`),C.join(t,new b(` and `)),new b(`)`)])}function ce(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new x(t):new x([new b(`(`),C.join(t,new b(` or `)),new b(`)`)])}var le=(e,t)=>C`${e} > ${T(t,e)}`,O=(e,t)=>C`${e} >= ${T(t,e)}`,ue=(e,t)=>C`${e} < ${T(t,e)}`,k=(e,t)=>C`${e} <= ${T(t,e)}`;function de(e,t){return Array.isArray(t)?t.length===0?C`false`:C`${e} in ${t.map(t=>T(t,e))}`:C`${e} in ${T(t,e)}`}function fe(e,t){return Array.isArray(t)?t.length===0?C`true`:C`${e} not in ${t.map(t=>T(t,e))}`:C`${e} not in ${T(t,e)}`}function pe(e){return C`${e} is null`}function me(e){return C`${e} is not null`}function he(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContains requires at least one value`);return C`${e} @> ${C`${T(t,e)}`}`}return C`${e} @> ${T(t,e)}`}function ge(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContained requires at least one value`);return C`${e} <@ ${C`${T(t,e)}`}`}return C`${e} <@ ${T(t,e)}`}function _e(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayOverlaps requires at least one value`);return C`${e} && ${C`${T(t,e)}`}`}return C`${e} && ${T(t,e)}`}function ve(e){return C`${e} asc`}function ye(e){return C`${e} desc`}function be(e){return C`count(${e||C.raw(`*`)})`.mapWith(Number)}function xe(e){return C`count(distinct ${e})`.mapWith(Number)}function A(e){return C`sum(${e})`.mapWith(String)}function j(e){return C`max(${e})`.mapWith(n(e,r)?e:String)}function Se(e){return C`min(${e})`.mapWith(n(e,r)?e:String)}function Ce(e){return e&&e.length>0?C`PARTITION BY ${C.join(e,C`, `)}`:C``}function we(e){return e&&e.length>0?C`ORDER BY ${C.join(e.map(e=>e.direction===`desc`?C`${e.field} DESC`:C`${e.field} ASC`),C`, `)}`:C``}function Te(e){return e===`unbounded`?`UNBOUNDED PRECEDING`:typeof e==`number`?`${e} PRECEDING`:`CURRENT ROW`}function Ee(e){return e===`unbounded`?`UNBOUNDED FOLLOWING`:e===`current`?`CURRENT ROW`:typeof e==`number`?`${e} FOLLOWING`:`CURRENT ROW`}function De(e){if(!e)return C``;let t=e.type.toUpperCase(),n=Te(e.start),r=Ee(e.end);return C`${C.raw(t)} BETWEEN ${C.raw(n)} AND ${C.raw(r)}`}function Oe(e,t,n){let r=[];return e&&e.length>0&&r.push(Ce(e)),t&&t.length>0&&r.push(we(t)),n?.frame&&r.push(De(n.frame)),C`OVER (${r.length>0?C.join(r,C` `):C``})`}function ke(e,t,n,r){let i=r?.defaultValue===void 0?C``:C`, ${r.defaultValue}`;return C`${C.raw(e)}(${t}, ${r?.offset??1}${i}) ${n}`}var Ae={rank:`RANK`,denseRank:`DENSE_RANK`,rowNumber:`ROW_NUMBER`},je={firstValue:`FIRST_VALUE`,lastValue:`LAST_VALUE`,movingAvg:`AVG`,movingSum:`SUM`};function Me(e,t,n,r){if(e===`lag`||e===`lead`)return ke(e===`lag`?`LAG`:`LEAD`,t,n,r);if(e===`ntile`)return C`NTILE(${r?.nTile??4}) ${n}`;let i=Ae[e];if(i)return C`${C.raw(i)}() ${n}`;let a=je[e];if(a)return C`${C.raw(a)}(${t}) ${n}`;throw Error(`Unsupported window function: ${e}`)}var M=class{preprocessCalculatedTemplate(e){return e}nullToZero(e){return C`COALESCE(${e}, 0)`}caseInsensitiveLike(e,t,n){return n?C`${e} NOT ILIKE ${t}`:C`${e} ILIKE ${t}`}regexCondition(e,t,n){return n?C`${e} !~* ${t}`:C`${e} ~* ${t}`}buildStringCondition(e,t,n){switch(t){case`contains`:return this.caseInsensitiveLike(e,`%${n}%`,!1);case`notContains`:return this.caseInsensitiveLike(e,`%${n}%`,!0);case`startsWith`:return this.caseInsensitiveLike(e,`${n}%`,!1);case`endsWith`:return this.caseInsensitiveLike(e,`%${n}`,!1);case`like`:return C`${e} LIKE ${n}`;case`notLike`:return C`${e} NOT LIKE ${n}`;case`ilike`:return this.caseInsensitiveLike(e,n,!1);case`regex`:return this.regexCondition(e,n,!1);case`notRegex`:return this.regexCondition(e,n,!0);default:throw Error(`Unsupported string operator: ${t}`)}}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`${C.raw(r)}(CASE WHEN ${n} THEN 1 END)`:C`${C.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildAvg(e){return this.nullToZero(C`AVG(${e})`)}buildCaseWhen(e,t){let n=e.map(e=>C`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>C`${e} ${t}`);return t===void 0?C`CASE ${n} END`:C`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?C`TRUE`:C`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return this.nullToZero(C`${C.raw(n)}(${e})`)}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return this.nullToZero(C`${C.raw(n)}(${e})`)}buildWindowFunction(e,t,n,r,i){return Me(e,t,Oe(n,r,i),i)}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}},Ne=class extends M{getEngineType(){return`postgres`}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 C`INTERVAL '${C.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return C`EXTRACT(EPOCH FROM (${e} - ${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`COUNT(*) FILTER (WHERE ${n})`:C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return C`(${t}::date - ${e}::date)`;case`week`:return C`FLOOR((${t}::date - ${e}::date) / 7)`;case`month`:return C`(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 C`(SELECT generate_series(0, ${e}) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return C`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return C`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return C`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return C`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return C`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return C`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}castToType(e,t){switch(t){case`timestamp`:return C`${e}::timestamp`;case`decimal`:return C`${e}::decimal`;case`integer`:return C`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!0}}buildPercentile(e,t){return C`PERCENTILE_CONT(${t/100}) WITHIN GROUP (ORDER BY ${e})`}},Pe=class extends M{getEngineType(){return`mysql`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`TIMESTAMPDIFF(SECOND, ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=C`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`),n.months&&(r=C`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`),n.days&&(r=C`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`),n.hours&&(r=C`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`),n.minutes&&(r=C`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`),n.seconds&&(r=C`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`),r}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return C`TIMESTAMPDIFF(${C.raw(r)}, ${e}, ${t})`}buildPeriodSeriesSubquery(e){return C`(
2
+ WITH RECURSIVE periods(period_number) AS (
3
+ SELECT 0
4
+ UNION ALL
5
+ SELECT period_number + 1 FROM periods WHERE period_number < ${e}
6
+ )
7
+ SELECT period_number FROM periods
8
+ ) p`}buildTimeDimension(e,t){let n={year:`%Y-01-01 00:00:00`,quarter:`%Y-%q-01 00:00:00`,month:`%Y-%m-01 00:00:00`,week:`%Y-%u-01 00:00:00`,day:`%Y-%m-%d 00:00:00`,hour:`%Y-%m-%d %H:00:00`,minute:`%Y-%m-%d %H:%i:00`,second:`%Y-%m-%d %H:%i:%s`};switch(e){case`quarter`:return C`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;case`week`:return C`STR_TO_DATE(DATE_FORMAT(DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY), '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s')`;default:{let r=n[e];return r?C`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')`:t}}}caseInsensitiveLike(e,t,n){let r=t.toLowerCase();return n?C`LOWER(${e}) NOT LIKE ${r}`:C`LOWER(${e}) LIKE ${r}`}regexCondition(e,t,n){return n?C`${e} NOT REGEXP ${t}`:C`${e} REGEXP ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`CAST(${e} AS DATETIME)`;case`decimal`:return C`CAST(${e} AS DECIMAL(10,2))`;case`integer`:return C`CAST(${e} AS SIGNED INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}nullToZero(e){return C`IFNULL(${e}, 0)`}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!0,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!0}}buildPercentile(e,t){return null}},Fe=class extends M{getEngineType(){return`sqlite`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`(${e} - ${t})`}buildDateAddInterval(e,t){return C`(${e} + ${this.durationToSeconds(t)})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;case`week`:return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;case`month`:return C`((CAST(strftime('%Y', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%Y', datetime(${e}, 'unixepoch')) AS INTEGER)) * 12 + (CAST(strftime('%m', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%m', datetime(${e}, 'unixepoch')) AS INTEGER)))`;default:throw Error(`Unsupported date diff unit for SQLite: ${n}`)}}buildPeriodSeriesSubquery(e){return C`(
9
+ WITH RECURSIVE periods(period_number) AS (
10
+ SELECT 0
11
+ UNION ALL
12
+ SELECT period_number + 1 FROM periods WHERE period_number < ${e}
13
+ )
14
+ SELECT period_number FROM periods
15
+ ) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`datetime(${t}, 'unixepoch', 'start of year')`;case`quarter`:{let e=C`datetime(${t}, 'unixepoch')`;return C`datetime(${e}, 'start of year',
16
+ '+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`}case`month`:return C`datetime(${t}, 'unixepoch', 'start of month')`;case`week`:return C`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;case`day`:return C`datetime(${t}, 'unixepoch', 'start of day')`;case`hour`:return C`datetime(strftime('%Y-%m-%d %H:00:00', ${C`datetime(${t}, 'unixepoch')`}))`;case`minute`:return C`datetime(strftime('%Y-%m-%d %H:%M:00', ${C`datetime(${t}, 'unixepoch')`}))`;case`second`:return C`datetime(strftime('%Y-%m-%d %H:%M:%S', ${C`datetime(${t}, 'unixepoch')`}))`;default:return C`datetime(${t}, 'unixepoch')`}}caseInsensitiveLike(e,t,n){let r=t.toLowerCase();return n?C`LOWER(${e}) NOT LIKE ${r}`:C`LOWER(${e}) LIKE ${r}`}regexCondition(e,t,n){return n?C`${e} NOT GLOB ${t}`:C`${e} GLOB ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`datetime(${e} / 1000, 'unixepoch')`;case`decimal`:return C`CAST(${e} AS REAL)`;case`integer`:return C`CAST(${e} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}nullToZero(e){return C`IFNULL(${e}, 0)`}buildCaseWhen(e,t){let n=e.map(e=>e.then&&typeof e.then==`object`&&(e.then.queryChunks||e.then._||e.then.sql)?C`WHEN ${e.when} THEN ${C.raw(`(`)}${e.then}${C.raw(`)`)}`:C`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>C`${e} ${t}`);return t===void 0?C`CASE ${n} END`:t&&typeof t==`object`&&(t.queryChunks||t._||t.sql)?C`CASE ${n} ELSE ${C.raw(`(`)}${t}${C.raw(`)`)} END`:C`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?C`1`:C`0`}preprocessCalculatedTemplate(e){return e.length>1e3?e:e.replace(/(\{[^}]+\})\s*\/\s*/g,(e,t)=>`${t.replace(/\{([^}]+)\}/,`CAST({$1} AS REAL)`)} / `)}convertFilterValue(e){return typeof e==`boolean`?+!!e:e instanceof Date?e.getTime():Array.isArray(e)?e.map(e=>this.convertFilterValue(e)):e}prepareDateValue(e){if(!(e instanceof Date)){if(typeof e==`number`)return e;if(typeof e==`string`)return new Date(e).getTime();throw Error(`prepareDateValue expects a Date object, got ${typeof e}`)}return e.getTime()}isTimestampInteger(){return!0}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){return null}buildVariance(e,t=!1){return null}buildPercentile(e,t){return null}},Ie=class extends Pe{getEngineType(){return`singlestore`}},Le=class extends M{getEngineType(){return`duckdb`}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 C`INTERVAL '${C.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return C`(EPOCH(${e}) - EPOCH(${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`COUNT(*) FILTER (WHERE ${n})`:C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){return C`DATE_DIFF('${C.raw(n)}', ${e}::timestamp, ${t}::timestamp)`}buildPeriodSeriesSubquery(e){return C`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return C`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return C`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return C`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return C`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return C`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return C`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}regexCondition(e,t,n){return n?C`NOT regexp_matches(${e}, ${t})`:C`regexp_matches(${e}, ${t})`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::timestamp`;case`decimal`:return C`${e}::decimal`;case`integer`:return C`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildPercentile(e,t){return C`QUANTILE_CONT(${e}, ${t/100})`}},Re=class extends M{getEngineType(){return`databend`}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];if(t.years&&n.push(`${t.years} YEAR`),t.months&&n.push(`${t.months} MONTH`),t.days&&n.push(`${t.days} DAY`),t.hours&&n.push(`${t.hours} HOUR`),t.minutes&&n.push(`${t.minutes} MINUTE`),t.seconds&&n.push(`${t.seconds} SECOND`),n.length===0)return C`INTERVAL 0 SECOND`;if(n.length===1)return C`INTERVAL ${C.raw(n[0])}`;let r=n.map(e=>`INTERVAL ${e}`);return C`(${C.raw(r.join(` + `))})`}buildTimeDifferenceSeconds(e,t){return C`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildDateDiffPeriods(e,t,n){return C`DATE_DIFF('${C.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return C`(SELECT number as period_number FROM numbers(${e+1})) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;case`quarter`:return C`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;case`month`:return C`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;case`week`:return C`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;case`day`:return C`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return C`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;case`minute`:return C`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;case`second`:return C`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;default:return t}}caseInsensitiveLike(e,t,n){return n?C`LOWER(${e}) NOT LIKE LOWER(${t})`:C`LOWER(${e}) LIKE LOWER(${t})`}regexCondition(e,t,n){return n?C`NOT (${e} REGEXP ${t})`:C`${e} REGEXP ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::TIMESTAMP`;case`decimal`:return C`${e}::DECIMAL`;case`integer`:return C`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildVariance(e,t=!1){let n=t?`COVAR_SAMP`:`COVAR_POP`;return C`COALESCE(${C.raw(n)}(${e}, ${e}), 0)`}buildPercentile(e,t){throw Error(`Percentile functions are not yet supported for Databend`)}},ze=class extends M{getEngineType(){return`snowflake`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`DATEDIFF('SECOND', ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=C`DATEADD('YEAR', ${n.years}, ${r})`),n.months&&(r=C`DATEADD('MONTH', ${n.months}, ${r})`),n.days&&(r=C`DATEADD('DAY', ${n.days}, ${r})`),n.hours&&(r=C`DATEADD('HOUR', ${n.hours}, ${r})`),n.minutes&&(r=C`DATEADD('MINUTE', ${n.minutes}, ${r})`),n.seconds&&(r=C`DATEADD('SECOND', ${n.seconds}, ${r})`),r}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return C`DATEDIFF('${C.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return C`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e+1}))) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;case`quarter`:return C`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;case`month`:return C`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;case`week`:return C`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;case`day`:return C`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return C`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;case`minute`:return C`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;case`second`:return C`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;default:return t}}regexCondition(e,t,n){return n?C`NOT REGEXP_LIKE(${e}, ${t})`:C`REGEXP_LIKE(${e}, ${t})`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::TIMESTAMP`;case`decimal`:return C`${e}::DECIMAL`;case`integer`:return C`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!1}}buildPercentile(e,t){let n=(t/100).toString();return C`PERCENTILE_CONT(${C.raw(n)}) WITHIN GROUP (ORDER BY ${e})`}};function Be(e){switch(e){case`postgres`:return new Ne;case`mysql`:return new Pe;case`sqlite`:return new Fe;case`singlestore`:return new Ie;case`duckdb`:return new Le;case`databend`:return new Re;case`snowflake`:return new ze;default:throw Error(`Unsupported database engine: ${e}`)}}var N=class{db;schema;databaseAdapter;constructor(e,t,n){this.db=e,this.schema=t;let r=n||this.getEngineType();this.databaseAdapter=Be(r)}};function Ve(e,t,n,r){for(;e.length>0&&e[e.length-1].indent>=r;)e.pop();if(e.length===0)t.push(n);else{let t=e[e.length-1].op;t.children||=[],t.children.push(n)}e.push({indent:r,op:n})}function He(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function Ue(e,t){let n=e.match(/Planning Time:\s*([\d.]+)\s*ms/i);if(n){t.planningTime=parseFloat(n[1]);return}let r=e.match(/Execution Time:\s*([\d.]+)\s*ms/i);if(r){t.executionTime=parseFloat(r[1]);return}let i=Ge(e);if(!i)return;i.type.includes(`Seq Scan`)&&(t.hasSequentialScans=!0),i.index&&t.usedIndexes.push(i.index),t.operations.length===0&&i.estimatedCost!==void 0&&(t.totalCost=i.estimatedCost);let a=e.search(/\S/);Ve(t.stack,t.operations,i,a)}function We(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,planningTime:void 0,executionTime:void 0,totalCost:void 0,stack:[]};for(let t of e)Ue(t,n);let r={database:`postgres`,planningTime:n.planningTime,executionTime:n.executionTime,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
17
+ `),sql:t}}function Ge(e){let t=e.replace(/^[\s->]+/,``).trim();if(!t)return null;let n=t.match(/^([A-Za-z][A-Za-z0-9 ]+?)(?:\s+using\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\w+)?(?:\s+\(cost=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)(?:\s+width=\d+)?\))?(?:\s+\(actual time=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)\s+loops=(\d+)\))?/i);if(!n)return t.match(/^Filter:\s*(.+)$/i)||t.match(/^(Hash Cond|Join Filter|Index Cond):\s*(.+)$/i),null;let r=n[1].trim(),i=n[2]||void 0,a=n[3]||void 0,o=n[5]?parseFloat(n[5]):void 0,s=n[6]?parseInt(n[6],10):void 0,c=n[9]?parseInt(n[9],10):void 0,l={type:r,table:a,index:i,estimatedRows:s,estimatedCost:o};c!==void 0&&(l.actualRows=c);let u=e.match(/Filter:\s*(.+?)(?:\)|$)/i);return u&&(l.filter=u[1].trim()),l}function P(e,t,n){let r=[];if(n===`question`){let n=e.split(`?`);r.push(C.raw(n[0]));for(let e=1;e<n.length;e++)r.push(C`${t[e-1]}`),r.push(C.raw(n[e]))}else{let n=/\$(\d+)/g,i=0,a;for(;(a=n.exec(e))!==null;){r.push(C.raw(e.slice(i,a.index)));let n=parseInt(a[1],10)-1;r.push(C`${t[n]}`),i=a.index+a[0].length}r.push(C.raw(e.slice(i)))}return C.join(r)}function Ke(e){return e&&typeof e==`object`?e:null}function qe(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ke(n);e&&t.push({id:e.id||1,select_type:e.select_type||`SIMPLE`,table:e.table||null,partitions:e.partitions||null,type:e.type||`ALL`,possible_keys:e.possible_keys||null,key:e.key||null,key_len:e.key_len||null,ref:e.ref||null,rows:Number(e.rows)||0,filtered:Number(e.filtered)||100,Extra:e.Extra||null})}return t}function Je(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ke(n);e&&t.push({id:Number(e.id)||0,parent:Number(e.parent)||0,notused:Number(e.notused)||0,detail:String(e.detail||``)})}return t}function Ye(e){let t=[];for(let n of e){let e=Ke(n);if(!e)continue;let r=e[`QUERY PLAN`]||e[`query plan`]||e.queryplan;typeof r==`string`&&t.push(r)}return t}function Xe(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`rows`in e&&Array.isArray(e.rows)?e.rows:[]}function Ze(e){return/^-?\d+(\.\d+)?$/.test(e)?e.includes(`.`)?parseFloat(e):parseInt(e,10):!isNaN(parseFloat(e))&&isFinite(parseFloat(e))?parseFloat(e):e}function Qe(e){switch(typeof e){case`number`:return e;case`bigint`:return Number(e);case`object`:return $e(e);case`string`:return Ze(e);default:return e}}function $e(e){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e.constructor?.name===`Numeric`||e.constructor?.name===`Decimal`||`digits`in e||`sign`in e?parseFloat(e.toString()):e}var et=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);let n=await this.db.execute(e),r=Xe(n);return r.length>0?r.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){return e==null?e:Qe(e)}getEngineType(){return`postgres`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);return We(Ye(Xe(await this.db.execute(C`${C.raw(r)} ${P(e,t,`dollar`)}`))),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=Xe(await this.db.execute(C`
18
+ SELECT
19
+ t.relname as table_name,
20
+ i.relname as index_name,
21
+ array_to_string(array_agg(a.attname ORDER BY k.n), ',') as columns,
22
+ ix.indisunique as is_unique,
23
+ ix.indisprimary as is_primary
24
+ FROM pg_index ix
25
+ JOIN pg_class t ON t.oid = ix.indrelid
26
+ JOIN pg_class i ON i.oid = ix.indexrelid
27
+ JOIN pg_namespace n ON n.oid = t.relnamespace
28
+ JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
29
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
30
+ WHERE n.nspname = 'public'
31
+ AND t.relname IN (${C.raw(t)})
32
+ GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
33
+ ORDER BY t.relname, i.relname
34
+ `));return n.length===0?[]:n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:e.is_unique,is_primary:e.is_primary}))}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function tt(e,t){return new et(e,t,`postgres`)}function nt(e,t){let n=t?.toLowerCase()||``;switch(e.toLowerCase()){case`all`:return`Seq Scan`;case`index`:return n.includes(`using index`)?`Index Only Scan`:`Index Scan`;case`range`:return`Index Range Scan`;case`ref`:case`eq_ref`:return`Index Lookup`;case`const`:case`system`:return`Const Lookup`;case`null`:return`No Table`;default:return`MySQL ${e}`}}function rt(e,t){let n=[],r=[],i=!1,a=0;for(let t of e){let e=nt(t.type,t.Extra);t.type.toLowerCase()===`all`&&(i=!0),t.key&&r.push(t.key);let o={type:e,table:t.table||void 0,index:t.key||void 0,estimatedRows:t.rows,estimatedCost:t.rows};if(t.Extra){let e=[];t.Extra.includes(`Using where`)&&e.push(`WHERE filter applied`),t.Extra.includes(`Using filesort`)&&e.push(`Filesort required`),t.Extra.includes(`Using temporary`)&&e.push(`Temporary table required`),t.Extra.includes(`Using join buffer`)&&e.push(`Join buffer used`),e.length>0&&(o.details=e.join(`; `)),o.filter=t.Extra}n.push(o),a+=t.rows}return{operations:n,summary:{database:`mysql`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id select_type table type possible_keys key rows Extra`,...e.map(e=>`${e.id}\t${e.select_type}\t${e.table||`NULL`}\t${e.type}\t${e.possible_keys||`NULL`}\t${e.key||`NULL`}\t${e.rows}\t${e.Extra||``}`)].join(`
35
+ `),sql:t}}var it=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`mysql`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);return rt(qe(await this.db.execute(C`${C.raw(r)} ${P(e,t,`question`)}`)),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(C`
36
+ SELECT
37
+ TABLE_NAME as table_name,
38
+ INDEX_NAME as index_name,
39
+ GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
40
+ CASE WHEN NON_UNIQUE = 0 THEN TRUE ELSE FALSE END as is_unique,
41
+ CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
42
+ FROM INFORMATION_SCHEMA.STATISTICS
43
+ WHERE TABLE_SCHEMA = DATABASE()
44
+ AND LOWER(TABLE_NAME) IN (${C.raw(t)})
45
+ GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
46
+ ORDER BY TABLE_NAME, INDEX_NAME
47
+ `);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function at(e,t){return new it(e,t,`mysql`)}function ot(e){let t=e.toLowerCase(),n=e.match(/^SCAN\s+(\S+)/i);if(n)return{type:`Seq Scan`,table:n[1]};let r=e.match(/^SEARCH\s+(\S+)\s+USING\s+(?:COVERING\s+)?INDEX\s+(\S+)(?:\s+\((.+)\))?/i);if(r)return{type:`Index Scan`,table:r[1],index:r[2],filter:r[3]};let i=e.match(/^SEARCH\s+(\S+)\s+USING\s+INTEGER\s+PRIMARY\s+KEY\s+\((.+)\)/i);if(i)return{type:`Primary Key Lookup`,table:i[1],filter:i[2]};let a=e.match(/^SEARCH\s+(\S+)/i);return a?{type:`Search`,table:a[1]}:t.includes(`temp b-tree`)?t.includes(`order by`)?{type:`Sort`}:t.includes(`group by`)?{type:`Group`}:t.includes(`distinct`)?{type:`Distinct`}:{type:`Temp B-Tree`}:t.includes(`compound`)?{type:`Compound Query`}:t.includes(`subquery`)?{type:`Subquery`}:t.includes(`co-routine`)?{type:`Coroutine`}:{type:e}}function st(e,t){let n=[],r=[],i=!1,a=new Map;for(let t of e){let e=ot(t.detail);e.type===`Seq Scan`&&(i=!0),e.index&&r.push(e.index);let o={type:e.type,table:e.table,index:e.index,filter:e.filter,details:t.detail};if(a.set(t.id,o),t.parent===0)n.push(o);else{let e=a.get(t.parent);e?(e.children||=[],e.children.push(o)):n.push(o)}}return{operations:n,summary:{database:`sqlite`,planningTime:void 0,executionTime:void 0,totalCost:void 0,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id parent detail`,...e.map(e=>`${e.id}\t${e.parent}\t${e.detail}`)].join(`
48
+ `),sql:t}}var ct=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}try{if(this.db.all){let n=this.db.all(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}else if(this.db.run)return this.db.run(e);else throw Error(`SQLite database instance must have an all() or run() method`)}catch(e){throw Error(`SQLite execution failed: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`sqlite`}async explainQuery(e,t,n){let r;if(this.db.all)r=this.db.all(C`EXPLAIN QUERY PLAN ${P(e,t,`question`)}`);else throw Error(`SQLite database instance must have an all() method for EXPLAIN`);return st(Je(r),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.all)throw Error(`SQLite database instance must have an all() method`);try{let t=[];for(let n of e){let e=this.db.all(C.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));if(Array.isArray(e))for(let r of e){let e=r.name,i=!!r.unique,a=r.origin,o=this.db.all(C.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)),s=[];if(Array.isArray(o))for(let e of o){let t=e.name;typeof t==`string`&&s.push(t)}t.push({table_name:n.toLowerCase(),index_name:e,columns:s,is_unique:i,is_primary:a===`pk`})}}return t}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function lt(e,t){return new ct(e,t,`sqlite`)}var ut=class extends it{getEngineType(){return`singlestore`}};function dt(e,t){return new ut(e,t)}function ft(e,t){if(/^[┌├└│─┐┤┘]+$/.test(e.trim())||/EXPLANATION|QUERY PLAN/i.test(e))return;let n=mt(e);if(!n)return;(n.type.includes(`SEQ_SCAN`)||n.type.includes(`TABLE_SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`INDEX_SCAN`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=He(e);Ve(t.stack,t.operations,n,r)}function pt(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)ft(t,n);let r={database:`duckdb`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
49
+ `),sql:t}}function mt(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i))return null;let n=t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);if(!n){let e=t.match(/^FILTER\s+(.+)$/i);return e?{type:`FILTER`,filter:e[1]}:null}let r=n[1].toUpperCase(),i=n[2]||void 0,a=n[3]||void 0,o=n[4]?parseFloat(n[4]):void 0,s=n[5]?parseInt(n[5],10):void 0;if(r===`INDEX_SCAN`){let e=i,t=a;a=e,i=t}return{type:r,table:i,index:a,estimatedRows:s,estimatedCost:o}}var ht=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`duckdb`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);let i=await this.db.execute(C`${C.raw(r)} ${P(e,t,`dollar`)}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain_value||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return pt(a,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(C`
50
+ SELECT
51
+ table_name,
52
+ index_name,
53
+ LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY index_oid) as columns,
54
+ is_unique,
55
+ is_primary
56
+ FROM duckdb_indexes()
57
+ WHERE LOWER(table_name) IN (${C.raw(t)})
58
+ GROUP BY table_name, index_name, is_unique, is_primary
59
+ ORDER BY table_name, index_name
60
+ `);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:typeof e.columns==`string`?e.columns.split(`,`):[],is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function gt(e,t){return new ht(e,t,`duckdb`)}function _t(e,t){if(!e.trim())return;let n=yt(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`IndexScan`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=He(e);Ve(t.stack,t.operations,n,r)}function vt(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)_t(t,n);let r={database:`databend`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
61
+ `),sql:t}}function yt(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 bt=class extends N{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(C`${C.raw(r)} ${P(e,t,`dollar`)}`),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 vt(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function xt(e,t){return new bt(e,t,`databend`)}function St(e,t){if(!e.trim())return;let n=Tt(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=wt(e);Ve(t.stack,t.operations,n,r)}function Ct(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)St(t,n);let r={database:`snowflake`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
62
+ `),sql:t}}function wt(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function Tt(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 Et=class extends N{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(C`${C.raw(`EXPLAIN`)} ${P(e,t,`question`)}`),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 Ct(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Dt(e,t){return new Et(e,t,`snowflake`)}function Ot(e,t,n){if(n)switch(n){case`postgres`:return tt(e,t);case`mysql`:return at(e,t);case`sqlite`:return lt(e,t);case`singlestore`:return dt(e,t);case`duckdb`:return gt(e,t);case`databend`:return xt(e,t);case`snowflake`:return Dt(e,t)}if(e.all&&e.run)return lt(e,t);if(e.execute)return tt(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function F(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 kt(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function I(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 L(e){return e&&typeof e==`object`?C`${C`${e}`}`:e}function At(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function R(e,t){return L(typeof e==`function`?e(t):e)}function z(e,t){return e.type===`time`?R(e.sql,t):typeof e.sql==`function`?e.sql(t):e.sql}function jt(e){let t=[];for(let n of e.on){let e=L(n.source),r=L(n.target),i=n.as||E;t.push(i(e,r))}return D(...t)}function Mt(e){if(e.relationship!==`belongsToMany`||!e.through)throw Error(`expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration`);let{table:t,sourceKey:n,targetKey:r}=e.through,i=[];for(let e of n){let t=e.as||E;i.push(t(e.source,e.target))}let a=[];for(let e of r){let t=e.as||E;a.push(t(e.source,e.target))}let o=I(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:o,table:t,condition:D(...i)},{joinType:o,table:t,condition:D(...a)}]}}function B(e){if(`and`in e)return`and:[${e.and.map(B).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(B).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 Nt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var Pt=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 Ft(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...Ft(n.and)):`or`in n&&n.or?t.push(...Ft(n.or)):`member`in n&&t.push(n);return t}function It(e,t){return e.isTimestampInteger()?e.getEngineType()===`sqlite`?Math.floor(t/1e3):t:new Date(t).toISOString()}function V(e,t){return It(e,t.getTime())}function Lt(e,t){return typeof t==`number`?new Date(t*(e.getEngineType()===`sqlite`?1e3:1)):new Date(t)}function Rt(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e.trim())}function zt(e){if(e instanceof Date)return isNaN(e.getTime())?null:e;if(typeof e==`number`){let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:n}if(typeof e==`string`){let t=Rt(e)?new Date(e+`T00:00:00Z`):new Date(e);return isNaN(t.getTime())?null:t}let t=new Date(e);return isNaN(t.getTime())?null:t}function Bt(e,t){if(!t)return null;let n=zt(t);return n?V(e,n):null}var Vt=e=>{let t=new Date(e);return t.setUTCHours(0,0,0,0),t},H=e=>{let t=new Date(e);return t.setUTCHours(23,59,59,999),t},Ht={today:({now:e})=>({start:Vt(e),end:H(e)}),yesterday:({now:e,utcDate:t})=>{let n=new Date(e);n.setUTCDate(t-1),n.setUTCHours(0,0,0,0);let r=new Date(e);return r.setUTCDate(t-1),r.setUTCHours(23,59,59,999),{start:n,end:r}},"this week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-6:1-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"this month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t,1,0,0,0,0)),end:new Date(Date.UTC(e,t+1,0,23,59,59,999))}),"this quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3);return{start:new Date(Date.UTC(e,n*3,1,0,0,0,0)),end:new Date(Date.UTC(e,n*3+3,0,23,59,59,999))}},"this year":({utcYear:e})=>({start:new Date(Date.UTC(e,0,1,0,0,0,0)),end:new Date(Date.UTC(e,11,31,23,59,59,999))}),"last week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-13:-6-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"last month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t-1,1,0,0,0,0)),end:new Date(Date.UTC(e,t,0,23,59,59,999))}),"last quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3),r=n===0?3:n-1,i=n===0?e-1:e;return{start:new Date(Date.UTC(i,r*3,1,0,0,0,0)),end:new Date(Date.UTC(i,r*3+3,0,23,59,59,999))}},"last year":({utcYear:e})=>({start:new Date(Date.UTC(e-1,0,1,0,0,0,0)),end:new Date(Date.UTC(e-1,11,31,23,59,59,999))}),"last 12 months":({now:e,utcYear:t,utcMonth:n})=>({start:new Date(Date.UTC(t,n-11,1,0,0,0,0)),end:H(e)})},Ut=[{re:/^last\s+(\d+)\s+days?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e+1),r.setUTCHours(0,0,0,0),{start:r,end:H(t)}}},{re:/^last\s+(\d+)\s+weeks?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e*7+1),r.setUTCHours(0,0,0,0),{start:r,end:H(t)}}},{re:/^last\s+(\d+)\s+months?$/,build:(e,{now:t,utcYear:n,utcMonth:r})=>({start:new Date(Date.UTC(n,r-e+1,1,0,0,0,0)),end:H(t)})},{re:/^last\s+(\d+)\s+years?$/,build:(e,{now:t,utcYear:n})=>({start:new Date(Date.UTC(n-e,0,1,0,0,0,0)),end:H(t)})}];function Wt(e){let t=new Date,n=e.toLowerCase().trim(),r={now:t,utcYear:t.getUTCFullYear(),utcMonth:t.getUTCMonth(),utcDate:t.getUTCDate(),utcDay:t.getUTCDay()},i=Ht[n];if(i)return i(r);for(let{re:e,build:t}of Ut){let i=n.match(e);if(i)return t(parseInt(i[1],10),r)}return null}var U=class{databaseAdapter;constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=R(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof x?r:C`${r}`}buildDateRangeCondition(e,t){return t?Array.isArray(t)?this.buildArrayDateRangeCondition(e,t):typeof t==`string`?this.buildStringDateRangeCondition(e,t):null:null}rangeBetween(e,t,n){return D(O(e,t),k(e,n))}endOfDayValue(e){let t=Lt(this.databaseAdapter,e);return t.setUTCHours(23,59,59,999),V(this.databaseAdapter,t)}buildArrayDateRangeCondition(e,t){if(t.length<2)return null;let n=this.normalizeDate(t[0]),r=this.normalizeDate(t[1]);return!n||!r?null:(Rt(t[1])&&(r=this.endOfDayValue(r)),this.rangeBetween(e,n,r))}buildStringDateRangeCondition(e,t){let n=this.parseRelativeDateRange(t);if(n){let t=V(this.databaseAdapter,n.start),r=V(this.databaseAdapter,n.end);return this.rangeBetween(e,t,r)}let r=this.normalizeDate(t);if(!r)return null;let i=Lt(this.databaseAdapter,r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);return o.setUTCHours(23,59,59,999),this.rangeBetween(e,V(this.databaseAdapter,a),V(this.databaseAdapter,o))}parseRelativeDateRange(e){return Wt(e)}normalizeDate(e){return Bt(this.databaseAdapter,e)}},Gt=e=>{let{fieldExpr:t,filteredValues:n,value:r,field:i,databaseAdapter:a,dateTimeBuilder:o}=e;return n.length>1?i?.type===`time`?de(t,n.map(e=>o.normalizeDate(e)||e)):de(t,n):n.length===1?E(t,i?.type===`time`&&o.normalizeDate(r)||r):a.buildBooleanLiteral(!1)},Kt=e=>{let{fieldExpr:t,filteredValues:n,value:r}=e;return n.length>1?fe(t,n):n.length===1?se(t,r):null},W=e=>({fieldExpr:t,value:n,databaseAdapter:r})=>r.buildStringCondition(t,e,n),qt=({fieldExpr:e,value:t})=>le(e,t),Jt=({fieldExpr:e,value:t})=>O(e,t),Yt=({fieldExpr:e,value:t})=>ue(e,t),Xt=({fieldExpr:e,value:t})=>k(e,t),Zt=({fieldExpr:e})=>me(e),Qt=({fieldExpr:e})=>pe(e),$t=e=>{let{fieldExpr:t,values:n,filteredValues:r,databaseAdapter:i,dateTimeBuilder:a}=e;if(r.length<2)return null;let o=a.normalizeDate(r[0]),s=a.normalizeDate(r[1]);if(!o||!s)return null;let c=n[1];if(typeof c==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(c.trim())){let e=typeof s==`number`?new Date(s*(i.getEngineType()===`sqlite`?1e3:1)):new Date(s),t=new Date(e);t.setUTCHours(23,59,59,999),s=i.isTimestampInteger()?i.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return D(O(t,o),k(t,s))},en=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?ue(e,r):null},tn=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?le(e,r):null},nn=({fieldExpr:e,filteredValues:t})=>t.length>=2?D(O(e,t[0]),k(e,t[1])):null,rn=({fieldExpr:e,filteredValues:t})=>t.length>=2?ce(ue(e,t[0]),le(e,t[1])):null,an=({fieldExpr:e,filteredValues:t})=>t.length>0?de(e,t):null,on=({fieldExpr:e,filteredValues:t})=>t.length>0?fe(e,t):null,sn=({fieldExpr:e})=>ce(pe(e),E(e,``)),cn=({fieldExpr:e})=>D(me(e),se(e,``)),ln=e=>({fieldExpr:t,filteredValues:n,databaseAdapter:r})=>r.getEngineType()===`postgres`?e(t,n):null,un={equals:Gt,notEquals:Kt,contains:W(`contains`),notContains:W(`notContains`),startsWith:W(`startsWith`),endsWith:W(`endsWith`),gt:qt,gte:Jt,lt:Yt,lte:Xt,set:Zt,notSet:Qt,inDateRange:$t,beforeDate:en,afterDate:tn,between:nn,notBetween:rn,in:an,notIn:on,like:W(`like`),notLike:W(`notLike`),ilike:W(`ilike`),regex:W(`regex`),notRegex:W(`notRegex`),isEmpty:sn,isNotEmpty:cn,arrayContains:ln(he),arrayOverlaps:ln(_e),arrayContained:ln(ge)};function dn(e,t){let n=un[e];return n?n(t):null}function G(e){if(e.length!==0)return e.length===1?e[0]:D(...e)}function K(e){if(`type`in e&&`filters`in e){let t=e;if(t.type===`and`||t.type===`or`)return{isAnd:t.type===`and`,filters:t.filters??[]}}return null}function fn(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}function pn(t){return{noMapping:({cubeName:n})=>e.O(`${t}.noBindingKeyMapping`,{cubeName:n}),keyDimNotFound:({bindingKey:n})=>e.O(`${t}.bindingKeyDimNotFound`,{bindingKey:n}),mappingDimNotFound:({dimension:n})=>e.O(`${t}.bindingKeyMappingDimNotFound`,{dimension:n})}}function mn(e,t,n,r){if(!n)return e;let i=n.get(t);if(!i)throw Error(r.cubeNotFound({cubeName:t}));return i}function hn(e,t,n,r,i){if(typeof e==`string`){let[a]=e.split(`.`),o=fn(e),s=mn(t,a,i,r).dimensions?.[o];if(!s)throw Error(r.keyDimNotFound({bindingKey:e,cubeName:a,dimName:o}));return R(s.sql,n)}let a=e.find(e=>e.cube===t.name);if(!a)throw Error(r.noMapping({cubeName:t.name}));let o=fn(a.dimension),s=mn(t,a.cube,i,r).dimensions?.[o];if(!s)throw Error(r.mappingDimNotFound({dimension:a.dimension,cubeName:a.cube,dimName:o}));return R(s.sql,n)}function gn(t,n,r,i){if(typeof t==`string`){let[,a]=t.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e.O(`${i}.timeDimNotFound`,{timeDimension:t}));return R(o.sql,r)}let a=t.find(e=>e.cube===n.name);if(!a)throw Error(e.O(`${i}.noTimeDimMapping`,{cubeName:n.name}));let[,o]=a.dimension.split(`.`),s=n.dimensions?.[o];if(!s)throw Error(e.O(`${i}.timeDimMappingNotFound`,{dimension:a.dimension}));return R(s.sql,r)}var q=class{databaseAdapter;dateTimeBuilder;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];return dn(t,{fieldExpr:e,values:n,filteredValues:a,value:o,field:r,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder})}buildLogicalFilter(e,t,n){return`and`in e&&e.and?this.combineFilters(e.and,!0,t,n):`or`in e&&e.or?this.combineFilters(e.or,!1,t,n):null}combineFilters(e,t,n,r){let i=e.map(e=>this.buildSingleFilter(e,n,r)).filter(e=>e!==null);return i.length===0?null:i.length===1?i[0]:t?D(...i):ce(...i)}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=K(e);if(r)return this.combineFilters(r.filters,r.isAnd,t,n);let i=e,[a,o]=i.member.split(`.`),s=t.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=z(c,n);return this.buildFilterCondition(l,i.operator,i.values,c,i.dateRange)}},_n=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];function vn(e){return _n.includes(e)}function yn(e){return vn(e.type)&&e.windowConfig?.measure!==void 0}function bn(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}function xn(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}function Sn(e,t){let n=[],r=[],i=new Set;for(let a of e){let[e,o]=a.split(`.`),s=t.get(e);if(s?.measures?.[o]){let t=s.measures[o];if(yn(t)){r.push(a);let n=bn(t,e);n&&i.add(n)}else vn(t.type)||n.push(a)}}return{aggregateMeasures:n,postAggWindowMeasures:r,requiredBaseMeasures:i}}function Cn(e,t){return Sn(e,t).postAggWindowMeasures.length>0}function wn(e){let t=[],n=[];for(let[n,r]of e)r.inDegree===0&&t.push(n);for(;t.length>0;){let r=t.shift();n.push(r);for(let[n,i]of e)i.dependencies.has(r)&&(i.inDegree--,i.inDegree===0&&t.push(n))}return n}var J=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=this.buildSubgraph(e),n=wn(t);if(n.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return n}buildSubgraph(e){let t=new Map;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}return t}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 Tn(t,n){let{cube:r,allCubes:i,resolvedMeasures:a}=n,o=En(t),s=new Map;for(let t of o){let{originalRef:n,cubeName:o,fieldName:c}=t,l=o||r.name;if(!i.get(l))throw Error(e.O(`server.validation.template.substituteTargetCubeNotFound`,{ref:`{${n}}`,cubeName:l}));let u=`${l}.${c}`,d=a.get(u);if(!d)throw Error(e.O(`server.validation.template.substituteMeasureNotResolved`,{ref:`{${n}}`,measureName:u}));let f=C`${d()}`;s.set(n,f)}let c=[],l=[],u=0;for(let e of o){let n=`{${e.originalRef}}`,r=t.indexOf(n,u);if(r>=0){c.push(t.substring(u,r));let i=s.get(e.originalRef);i&&l.push(i),u=r+n.length}}if(c.push(t.substring(u)),l.length===0)return C.raw(t);let d=[];for(let e=0;e<c.length;e++)c[e]&&d.push(new b(c[e])),e<l.length&&d.push(l[e]);return C.join(d,C.raw(``))}function En(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 Dn(t){let n=[],r=0;for(let i=0;i<t.length;i++)if(t[i]===`{`)r++;else if(t[i]===`}`&&(r--,r<0)){n.push(e.O(`server.validation.template.unmatchedClosingBrace`,{position:i}));break}r>0&&n.push(e.O(`server.validation.template.unmatchedOpeningBrace`)),/\{\s*\}/.test(t)&&n.push(e.O(`server.validation.template.emptyReference`)),/\{[^}]*\{/.test(t)&&n.push(e.O(`server.validation.template.nestedBraces`));let i=En(t);for(let t of i){let r=t.cubeName?`${t.cubeName}.${t.fieldName}`:t.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(r)||n.push(e.O(`server.validation.template.invalidMemberReference`,{ref:`{${t.originalRef}}`})),r.split(`.`).length>2&&n.push(e.O(`server.validation.template.multipleDots`,{ref:`{${t.originalRef}}`}))}return{isValid:n.length===0,errors:n}}function On(e,t){let n=En(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Y=class e{databaseAdapter;constructor(e){this.databaseAdapter=e}buildResolvedMeasures(e,t,n,r){let i=new Map,a=[],o=[],s=new Set(e),c=new J(t);for(let e of t.values())c.buildGraph(e);for(let n of e)this.classifyRequestedMeasure(n,t,c,a,o,s);for(let e of s)this.classifyDependencyMeasure(e,t,a,o);for(let e of a){let[a,o]=e.split(`.`),s=t.get(a),c=s.measures[o];if(r){let t=r(e,c,s);i.set(e,()=>t)}else i.set(e,()=>this.buildMeasureExpression(c,n,s))}if(o.length>0){let e=c.topologicalSort(o);for(let r of e){let[e,a]=r.split(`.`),o=t.get(e),s=o.measures[a];i.set(r,()=>this.buildCalculatedMeasure(s,o,t,i,n))}}return i}classifyRequestedMeasure(t,n,r,i,a,o){let[s,c]=t.split(`.`),l=n.get(s)?.measures?.[c];if(l){if(e.isPostAggregationWindow(l)){let t=e.getWindowBaseMeasure(l,s);t&&o.add(t);return}if(!J.isCalculatedMeasure(l)){i.push(t);return}a.push(t),this.collectCalculatedDependencies(t,l,s,n,r,o)}}collectCalculatedDependencies(e,t,n,r,i,a){On(t.calculatedSql,n).forEach(e=>a.add(e));for(let t of i.getAllDependencies(e)){let[e,n]=t.split(`.`),i=r.get(e)?.measures?.[n];i&&J.isCalculatedMeasure(i)&&On(i.calculatedSql,e).forEach(e=>a.add(e))}}classifyDependencyMeasure(t,n,r,i){let[a,o]=t.split(`.`),s=n.get(a)?.measures?.[o];s&&(e.isPostAggregationWindow(s)||(J.isCalculatedMeasure(s)?i.includes(t)||i.push(t):r.includes(t)||r.push(t)))}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return Tn(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=On(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=C`${C.identifier(n.cteAlias)}.${C.identifier(i)}`,o=this.reAggregateCteColumn(t.type,r);a.set(e,()=>o)}}}return this.buildCalculatedMeasure(e,t,r,a,i)}reAggregateCteColumn(e,t){switch(e){case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);default:return A(t)}}buildHavingMeasureExpression(e,t,n,r,i){let a=i?.preAggregationCTEs?.find(t=>t.cube.name===e);return a&&a.measures.includes(`${e}.${t}`)&&i?this.buildHavingCteMeasure(e,t,n,r,i,a):this.buildMeasureExpression(n,r)}buildHavingCteMeasure(e,t,n,r,i,a){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)}let o=C`${C.identifier(a.cteAlias)}.${C.identifier(t)}`;return this.reAggregateCteColumn(n.type,o)}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=R(t.sql,n);if(n.ungrouped)return i;let a=this.applyMeasureFilters(t,i,n);return this.applyAggregation(t,a,n,r)}applyMeasureFilters(e,t,n){if(!e.filters||e.filters.length===0)return t;let r=e.filters.map(e=>{let t=e(n);return t?C`(${t})`:void 0}).filter(Boolean);if(r.length===0)return t;let i=r.length===1?r[0]:D(...r);return this.databaseAdapter.buildCaseWhen([{when:i,then:t}])}applyAggregation(e,t,n,r){switch(e.type){case`count`:return be(t);case`countDistinct`:return xe(t);case`sum`:return A(t);case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);case`number`:return t;case`stddev`:case`stddevSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildStddev(t,e.type===`stddevSamp`||e.statisticalConfig?.useSample));case`variance`:case`varianceSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildVariance(t,e.type===`varianceSamp`||e.statisticalConfig?.useSample));case`percentile`:case`median`:case`p95`:case`p99`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildPercentile(t,this.resolvePercentile(e)));case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:return this.buildWindowMeasure(e,t,n,r);default:return be(t)}}buildStatistical(e,t,n){let r=n();return r===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),C`MAX(NULL)`):r}resolvePercentile(e){switch(e.type){case`median`:return 50;case`p95`:return 95;case`p99`:return 99;default:return e.statisticalConfig?.percentile??50}}buildWindowMeasure(e,t,n,r){let i=e.windowConfig||{},a=this.resolveWindowPartitions(i,n,r),o=this.resolveWindowOrder(i,n,r),s=this.databaseAdapter.buildWindowFunction(e.type,[`rank`,`denseRank`,`rowNumber`].includes(e.type)?null:t,a,o,{offset:i.offset,defaultValue:i.defaultValue,nTile:i.nTile,frame:i.frame});return s===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),C`NULL`):s}resolveWindowPartitions(e,t,n){if(!e.partitionBy||e.partitionBy.length===0||!n)return;let r=e.partitionBy.map(e=>{let r=e.includes(`.`)?e.split(`.`)[1]:e,i=n.dimensions?.[r];return i?R(i.sql,t):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}resolveWindowOrder(e,t,n){if(!e.orderBy||e.orderBy.length===0||!n)return;let r=e.orderBy.map(e=>{let r=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=n.dimensions?.[r];if(i)return{field:R(i.sql,t),direction:e.direction};let a=n.measures?.[r];return a&&a.sql?{field:R(a.sql,t),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}static WINDOW_FUNCTION_TYPES=_n;static isWindowFunction(e){return vn(e)}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(e){return yn(e)}static getWindowBaseMeasure(e,t){return bn(e,t)}static getDefaultWindowOperation(e){return xn(e)}static categorizeForPostAggregation(e,t){return Sn(e,t)}static hasPostAggregationWindows(e,t){return Cn(e,t)}},kn=class{dateTimeBuilder;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;if(!this.hasAggregateMeasures(t,a)&&!c)return[];for(let e of t.dimensions||[]){let t=this.resolveDimensionGroupField(e,a,n,r);t&&i.push(t)}for(let e of t.timeDimensions||[]){let t=this.resolveTimeDimensionGroupField(e,a,n,r);t&&i.push(t)}return i}hasAggregateMeasures(e,t){for(let n of e.measures||[]){let[e,r]=n.split(`.`),i=t.get(e)?.measures?.[r];if(i&&(this.isAggregateFunctionType(i.type)||i.type===`calculated`||this.isWindowOverAggregate(i,e,t)))return!0}return!1}isWindowOverAggregate(e,t,n){if(!Y.isPostAggregationWindow(e))return!1;let r=Y.getWindowBaseMeasure(e,t);if(!r)return!1;let[i,a]=r.split(`.`),o=n.get(i)?.measures?.[a];return!!o&&this.isAggregateFunctionType(o.type)}resolveDimensionGroupField(e,t,n,r){let[i,a]=e.split(`.`),o=t.get(i);if(!o?.dimensions?.[a])return null;let s=r?.preAggregationCTEs?.find(e=>e.cube.name===i);if(s){let e=s.joinKeys.find(e=>e.targetColumn===a);return e&&e.sourceColumnObj?e.sourceColumnObj:C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`}return R(o.dimensions[a].sql,n)}resolveTimeDimensionGroupField(e,t,n,r){let[i,a]=e.dimension.split(`.`),o=t.get(i);if(!o?.dimensions?.[a])return null;let s=r?.preAggregationCTEs?.find(e=>e.cube.name===i);if(s){let t=s.joinKeys.find(e=>e.targetColumn===a);return t&&t.sourceColumnObj?this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,n):C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`}return this.dateTimeBuilder.buildTimeDimensionExpression(o.dimensions[a].sql,e.granularity,n)}},An=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new U(e),this.filterBuilder=new q(e,this.dateTimeBuilder),this.groupByBuilder=new kn(this.dateTimeBuilder),this.measureBuilder=new Y(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]=C`${R(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]=C`${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]=C`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=be()),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)this.appendWhereFilter(e,o,n,r,i,s,a);if(t.timeDimensions)for(let e of t.timeDimensions)this.appendTimeDimensionWhere(e,o,n,r,a);return a}appendWhereFilter(e,t,n,r,i,a,o){if(i&&`member`in e){let[n]=e.member.split(`.`);if(this.cubeIsInCTE(n,r))return;if(t.has(n)&&i.has(n)&&!a.has(n)){o.push(...i.get(n)),a.add(n);return}else if(a.has(n))return}let s=this.processFilter(e,t,n,`where`,r);s&&o.push(s)}appendTimeDimensionWhere(e,t,n,r,i){let[a,o]=e.dimension.split(`.`),s=t.get(a);if(!s||!s.dimensions[o]||!e.dateRange||this.cubeIsInCTE(a,r))return;if(n.filterCache){let t=Nt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){i.push(r);return}}let c=s.dimensions[o],l=R(c.sql,n),u=this.buildDateRangeCondition(l,e.dateRange);u&&i.push(u)}cubeIsInCTE(e,t){return!!t?.preAggregationCTEs?.some(t=>t.cube.name===e)}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?D(...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?ce(...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)return this.processWhereDimensionFilter(e,a,l,d,o,n,i);if(r===`where`&&u)return null;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}processWhereDimensionFilter(e,t,n,r,i,a,o){if(this.cubeIsInCTE(i,o))return null;let s=n.type===`time`;if(a.filterCache){let t=B(e),n=a.filterCache.get(t);if(n)return n}let c=s?R(n.sql,a):typeof n.sql==`function`?n.sql(a):n.sql;return this.buildFilterCondition(c,t.operator,t.values,r,t.dateRange)}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`?ye(C.identifier(t)):ve(C.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(ve(C.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)}},X=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=F(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();for(let{nextCube:i,step:s}of this.neighbourSteps(e,!1)){if(o.has(i))continue;let e=[...n,s];if(i===t)return this.setInCache(r,e),e;o.add(i),a.push({cube:i,path:e})}}return this.setInCache(r,null),null}neighbourSteps(e,t){let n=[],r=this.cubes.get(e);if(r?.joins)for(let[,t]of Object.entries(r.joins)){let r=F(t.targetCube,this.cubes);if(!r)continue;let i=r.name;n.push({nextCube:i,step:{fromCube:e,toCube:i,joinDef:t}})}if(t)return n;let i=this.reverseIndex.get(e)||[];for(let{definingCube:t,joinDef:r}of i)n.push({nextCube:t,step:{fromCube:e,toCube:t,joinDef:r,reversed:!0}});return n}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))for(let{nextCube:r,step:s}of this.neighbourSteps(e,!1)){if(o.has(r))continue;let e=[...n,s];if(r===t)i.push(e);else{let t=new Set(o);t.add(r),a.push({cube:r,path:e,visited:t})}}}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();for(let{nextCube:a,step:o}of this.neighbourSteps(e,!0)){if(i.has(a))continue;let e=[...n,o];if(a===t)return e;i.add(a),r.push({cube:a,path:e})}}return null}buildJoinCondition(e,t,n){let r=[];for(let i of e.on){let e=t?C`${C.identifier(t)}.${C.identifier(i.source.name)}`:L(i.source),a=n?C`${C.identifier(n)}.${C.identifier(i.target.name)}`:L(i.target),o=i.as||E;r.push(o(e,a))}return D(...r)}getReachableCubes(e){let t=new Set([e]),n=[e];for(;n.length>0;){let e=n.shift();for(let{nextCube:r}of this.neighbourSteps(e,!1))t.has(r)||(t.add(r),n.push(r))}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})}},jn=class{cache=new WeakMap;get(e){let t=this.cache.get(e);return t||(t=new X(e),this.cache.set(e,t)),t}};function Mn(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)Nn(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}function Nn(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)Nn(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}var Pn=class{resolverCache;constructor(e){this.resolverCache=e}buildJoinPlan(t,n,r,i,a){let o=this.resolverCache.get(t),s=[],c=new Set([n.name]),l=new Set;if(a.measures)for(let e of a.measures){let[t]=e.split(`.`);l.add(t)}let u=Mn(a),d=new Set;for(let e of l)e!==n.name&&this.findHasManyJoinDef(n,e,t)&&d.add(e);let f=r.filter(e=>e!==n.name);for(let r of f){if(c.has(r))continue;let i=new Set([...c].filter(e=>!d.has(e))),a=o.findPathPreferring(n.name,r,u,i);if(!a||a.length===0)throw Error(e.O(`server.errors.noJoinPath`,{fromCube:n.name,toCube:r}));for(let{fromCube:n,toCube:r,joinDef:i,reversed:o}of a){if(c.has(r))continue;let a=t.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:r}));s.push(this.buildJoinRef(a,r,n,i,o)),c.add(r)}}return s}buildJoinRef(e,t,n,r,i){let a=i?kt(r.relationship):r.relationship;if(a===`belongsToMany`&&r.through){let i=I(`belongsToMany`,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:i,joinDef:r,relationship:`belongsToMany`,junctionTable:{table:r.through.table,alias:`junction_${t.toLowerCase()}`,joinType:i,sourceCubeName:n}}}let o=I(a,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:o,joinDef:r,relationship:a}}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=F(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}};function Fn(e,t){let n=e.joinDef.through;return e.sourceCube?.name===t.name&&!e.reversed?n.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source}))}function In(e,t){return e.joinDef.relationship===`belongsToMany`&&e.joinDef.through?Fn(e,t):e.reversed?e.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function Ln(e){return e.relationship===`belongsToMany`&&e.through?e.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):e.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function Rn(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=F(r.targetCube,n);if(e&&e.name===t)return r}return null}function zn(e,t,n){let r=Rn(t,n,e);if(r)return{sourceCube:t,joinDef:r};let i=e.get(n);if(i){let n=Rn(i,t.name,e);if(n)return{sourceCube:i,joinDef:n,reversed:!0}}for(let[,r]of e){if(r.name===t.name||r.name===n)continue;let i=Rn(r,n,e);if(i)return{sourceCube:r,joinDef:i}}return null}function Bn(e,t){let n=new Set;if(e.dimensions)for(let r of e.dimensions){let[e]=r.split(`.`);e!==t&&n.add(e)}if(e.timeDimensions)for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e!==t&&n.add(e)}if(e.filters){for(let t of e.filters)Nn(t,n);n.delete(t)}return n}var Vn=class{resolverCache;filterPropagation;constructor(e,t){this.resolverCache=e,this.filterPropagation=t}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 i of n){let n=o.get(i.target.name);if(!n)continue;let s=this.buildCTEForJoinCube(i,n,e,t,r);s&&a.push(s)}return a}buildCTEForJoinCube(e,t,n,r,i){let a=e.target.cube,o=e.alias,s=(i.measures??[]).filter(e=>e.startsWith(a.name+`.`)),c=this.extractMeasuresFromFilters(i,a),l=[...new Set([...s,...c])];if(l.length===0)return null;let u=this.resolveCTEJoinKeys(n,r,a,i);if(!u)return null;let{joinKeys:d,intermediateJoins:f}=u,p=this.filterPropagation.findPropagatingFilters(i,a,n),{aggregateMeasures:m,requiredBaseMeasures:h}=Sn(l,new Map([[a.name,a]])),g=[...new Set([...m,...Array.from(h).filter(e=>e.startsWith(a.name+`.`))])];if(g.length===0)return null;let _=this.expandCalculatedMeasureDependencies(a,g),v=this.findDownstreamJoinKeys(a,i,n);return{cube:a,alias:o,cteAlias:`${a.name.toLowerCase()}_agg`,joinKeys:d,measures:_,propagatingFilters:p.length>0?p:void 0,downstreamJoinKeys:v.length>0?v:void 0,intermediateJoins:f&&f.length>0?f:void 0,cteType:`aggregate`,cteReason:t}}resolveCTEJoinKeys(e,t,n,r){let i=this.analyzeJoinPathToPrimary(e,t,n.name,r);if(i?.hasIntermediateHasMany&&i.intermediateJoins.length>0)return{joinKeys:i.correctJoinKeys,intermediateJoins:i.intermediateJoins};let a=this.locateJoinInfo(e,t,n,i);return a?{joinKeys:In(a,t),intermediateJoins:void 0}:null}locateJoinInfo(e,t,n,r){if(r?.path&&r.path.length>0){let t=r.path[r.path.length-1],n=e.get(t.fromCube);if(n)return{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}}return zn(e,t,n.name)}analyzeJoinPathToPrimary(e,t,n,r){let i=this.resolverCache.get(e),a=Mn(r),o=a.size>0?i.findPathPreferring(t.name,n,a,new Set):i.findPath(t.name,n);if(!o||o.length===0)return null;let s=o.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!s.slice(0,-1).some(e=>(e.reversed?kt(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:s,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let c=[];for(let t=0;t<s.length-1;t++){let n=s[t],r=s[t+1],i=e.get(n.toCube);if(!i)continue;let a=r.joinDef.on[0]?.source,o=n.joinDef.on[0]?.target;c.push({cube:i,joinDef:r.joinDef,primaryJoinColumn:o,cteJoinColumn:a})}return{path:s,hasIntermediateHasMany:!0,intermediateJoins:c,correctJoinKeys:s[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.target.name):e.relationship===`belongsTo`&&o.has(e.target.name)&&a.add(e.target.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.target.name)&&(i.has(e.target.name)?r.set(e.target.name,`hasMany`):(a.has(e.target.name)||i.size>0)&&r.set(e.target.name,`fanOutPrevention`));return r}findDownstreamJoinKeys(e,t,n){let r=[],i=Bn(t,e.name);if(!e.joins)return r;for(let[,t]of Object.entries(e.joins)){let e=F(t.targetCube,n);if(!e)continue;let a=e.name;i.has(a)&&r.push({targetCubeName:a,joinKeys:Ln(t)})}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}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)}}},Hn=class{findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=this.collectFilterCubeNames(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=F(o.targetCube,n);if(!s||s.name!==t.name||o.relationship!==`hasMany`)continue;let c=this.buildPropagatingFilter(e,i,a,o);c&&r.push(c)}}return r}collectFilterCubeNames(e){let t=new Set;if(e.filters&&this.extractFilterCubeNamesToSet(e.filters,t),e.timeDimensions){for(let n of e.timeDimensions)if(n.dateRange){let[e]=n.dimension.split(`.`);e&&t.add(e)}}return t}buildPropagatingFilter(e,t,n,r){let i=this.extractFiltersForCube(e.filters??[],n),a=this.extractTimeDimensionFiltersForCube(e,n),o=[...i,...a];return o.length===0||r.on.length===0?null:{sourceCube:t,filters:o,joinConditions:r.on.map(e=>({source:e.source,target:e.target}))}}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}},Un=class{resolverCache;constructor(e){this.resolverCache=e}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=this.buildPrimaryCubeCandidates(e,t,n);return this.selectByDimensions(t,r)||this.selectByConnectivity(r)||{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}buildPrimaryCubeCandidates(e,t,n){let r=new Map;for(let e of t.dimensions||[]){let t=e.split(`.`)[0];r.set(t,(r.get(t)||0)+1)}let i=this.resolverCache.get(n);return e.map(t=>{let a=n.get(t);return{cubeName:t,dimensionCount:r.get(t)||0,joinCount:a?.joins?Object.keys(a.joins).length:0,canReachAll:i.canReachAll(t,e)}})}selectByDimensions(e,t){if(!e.dimensions||e.dimensions.length===0)return null;let n=Math.max(...t.map(e=>e.dimensionCount));if(n===0)return null;let r=t.filter(e=>e.dimensionCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of r)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:t};return null}selectByConnectivity(e){let t=e.filter(e=>e.canReachAll);if(t.length===0)return null;let n=Math.max(...t.map(e=>e.joinCount)),r=t.filter(e=>e.joinCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:r.cubeName,reason:`most_connected`,explanation:`Selected because it has ${r.joinCount} join relationship${r.joinCount===1?``:`s`} and can reach all other cubes`,candidates:e}}analyzeJoinPath(e,t,n,r){let i=this.resolverCache.get(e),a=r?Mn(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?kt(e.joinDef.relationship):e.joinDef.relationship,n=I(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.`}}},Wn=class{resolverCache=new jn;joinPlanner=new Pn(this.resolverCache);ctePlanner=new Vn(this.resolverCache,new Hn);reporter=new Un(this.resolverCache);analyzeCubeUsage(e){return Mn(e)}analyzePrimaryCube(e,t,n){return this.reporter.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.reporter.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.joinPlanner.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.ctePlanner.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.reporter.generateWarnings(e,t)}};function Gn(e,t){if(!t.joins)return e;for(let n of t.joins)switch(n.type||`left`){case`left`:e=e.leftJoin(n.table,n.on);break;case`inner`:e=e.innerJoin(n.table,n.on);break;case`right`:e=e.rightJoin(n.table,n.on);break;case`full`:e=e.fullJoin(n.table,n.on);break}return e}var Kn=class{queryBuilder;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=this.buildCTESelections(e,a,t,n,s);if(Object.keys(c).length===0)return null;let l=n.db.select(c).from(o.from);l=Gn(l,o),l=this.applyIntermediateJoins(l,e,n,s);let u=this.buildCTEWhereConditions(e,a,t,n,r,i,o);if(u.length>0){let e=u.length===1?u[0]:D(...u);l=l.where(e)}let d=this.buildCTEGroupByFields(e,a,t,n,s);return d.length>0&&(l=l.groupBy(...d)),n.db.$with(e.cteAlias).as(l)}buildCTESelections(e,t,n,r,i){let a={};return this.addJoinKeySelections(a,e,t,i),this.addDownstreamKeySelections(a,e),this.addMeasureSelections(a,e,t,r),this.addDimensionSelections(a,t,n,r),a}addJoinKeySelections(e,t,n,r){if(r&&t.intermediateJoins){let n=t.intermediateJoins[0].primaryJoinColumn;n&&(e[n.name]=n);return}for(let r of t.joinKeys)if(r.targetColumnObj){e[r.targetColumn]=r.targetColumnObj;for(let[t,i]of Object.entries(n.dimensions||{}))i.sql===r.targetColumnObj&&t!==r.targetColumn&&(e[t]=C`${r.targetColumnObj}`.as(t))}}addDownstreamKeySelections(e,t){if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&(e[t.sourceColumn]=t.sourceColumnObj)}addMeasureSelections(e,t,n,r){let i=new Map([[n.name,n]]),a=this.queryBuilder.buildResolvedMeasures(t.measures,i,r);for(let n of t.measures){let[,t]=n.split(`.`),r=a.get(n);r&&(e[t]=C`${r()}`.as(t))}}addDimensionSelections(e,t,n,r){let i=t.name;for(let a of n.dimensions||[]){let[n,o]=a.split(`.`);n===i&&t.dimensions?.[o]&&(e[o]=C`${this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r)}`.as(o))}for(let a of n.timeDimensions||[]){let[n,o]=a.dimension.split(`.`);n===i&&t.dimensions?.[o]&&(e[o]=C`${this.queryBuilder.buildTimeDimensionExpression(t.dimensions[o].sql,a.granularity,r)}`.as(o))}}applyIntermediateJoins(e,t,n,r){if(!r||!t.intermediateJoins)return e;let i=[...t.intermediateJoins].reverse();for(let t of i){let r=t.cube.sql(n),i=[E(t.cteJoinColumn,t.joinDef.on[0]?.target)];r.where&&i.push(r.where),e=e.leftJoin(r.from,D(...i))}return e}buildCTEWhereConditions(e,t,n,r,i,a,o){let s=i?{...i,preAggregationCTEs:i.preAggregationCTEs?.filter(e=>e.cube.name!==t.name)}:void 0,c=this.queryBuilder.buildWhereConditions(t,n,r,s,a),l=this.buildCTETimeFilters(e,t,n,r),u=[];return o.where&&u.push(o.where),u.push(...c,...l),u}buildCTETimeFilters(e,t,n,r){let i=t.name,a=[];for(let e of n.timeDimensions||[]){let[n,o]=e.dimension.split(`.`);if(n===i&&t.dimensions?.[o]&&e.dateRange){let n=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(n,e.dateRange);i&&a.push(i)}}for(let e of n.filters||[]){if(`and`in e||`or`in e||!(`member`in e)||!(`operator`in e))continue;let n=e,[o,s]=n.member.split(`.`);if(o===i&&t.dimensions?.[s]&&n.operator===`inDateRange`){let e=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[s].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(e,n.values);i&&a.push(i)}}for(let t of e.propagatingFilters||[]){let e=this.buildPropagatingFilterSubquery(t,r);e&&a.push(e)}return a}buildCTEGroupByFields(e,t,n,r,i){let a=t.name,o=[],s=new Set;this.addJoinKeyGroupBy(e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!s.has(t)?(s.add(t),o.push(e)):t||o.push(e)},e,i);for(let e of n.dimensions||[]){let[n,i]=e.split(`.`);n===a&&t.dimensions?.[i]&&o.push(R(t.dimensions[i].sql,r))}for(let e of n.timeDimensions||[]){let[n,i]=e.dimension.split(`.`);n===a&&t.dimensions?.[i]&&o.push(this.queryBuilder.buildTimeDimensionExpression(t.dimensions[i].sql,e.granularity,r))}return o}addJoinKeyGroupBy(e,t,n){if(n&&t.intermediateJoins){let n=t.intermediateJoins[0];n.primaryJoinColumn&&e(n.primaryJoinColumn)}else for(let n of t.joinKeys)n.targetColumnObj&&e(n.targetColumnObj);if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&e(t.sourceColumnObj)}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=C`${C.identifier(t)}.${C.identifier(e.primaryJoinColumn.name)}`;i.push(E(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=C`${C.identifier(t)}.${C.identifier(e.targetColumn)}`;i.push(E(a,o))}return i.length===1?i[0]:D(...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||C.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 C`${C.identifier(r.cteAlias)}.${C.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]:D(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0],i=t.db.select({pk:e}).from(r.from);return i=Gn(i,r),i=i.where(a),C`${n} IN ${i}`}else{let e=D(...o.map(e=>E(e.source,e.target)),a),n=t.db.select({one:C`1`}).from(r.from);return n=Gn(n,r),n=n.where(e),C`EXISTS ${n}`}}};function qn(e,t){let n=Jn(e);return{measures:Xn(t,n),dimensions:Zn(t,n),segments:{},timeDimensions:Qn(t,n)}}function Jn(e){let t=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&t.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let n of e.multiFactMerge.groups)n.queryPlan.primaryCube&&t.push(n.queryPlan.primaryCube),n.queryPlan.joinCubes?.length&&t.push(...n.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));return t}function Yn(e,t,n){return e.find(e=>e?.name===t)?.dimensions?.[n]}function Xn(e,t){let n={};if(!e.measures)return n;for(let r of e.measures){let[e,i]=r.split(`.`),a=t.find(t=>t?.name===e)?.measures?.[i];a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Zn(e,t){let n={};if(!e.dimensions)return n;for(let r of e.dimensions){let[e,i]=r.split(`.`),a=Yn(t,e,i);a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Qn(e,t){let n={};if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e,i]=r.dimension.split(`.`),a=Yn(t,e,i);a&&(n[r.dimension]={title:a.title||i,shortTitle:a.title||i,type:a.type,granularity:r.granularity})}return n}function $n(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}var er=1e4;function tr(e,t,n){let r=[],i=nr(new Date(e),n),a=nr(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=rr(i,n);return r}function nr(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 rr(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 ir(e,t){let n=null;if(e instanceof Date)n=e;else if(typeof e==`string`){let t=new Date(e);isNaN(t.getTime())||(n=t)}return!n||isNaN(n.getTime())?null:nr(n,t).toISOString()}function ar(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function or(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,dimensions:a}=t,o=tr(i[0],i[1],r);if(o.length===0)return e;if(o.length>=1e4)return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${er}-bucket limit. Returning unfilled data.`),e;let s=sr(e,n,r,a),c=[];for(let[e,n]of s){let e=n.size>0?n.values().next().value:null;for(let r of o){let i=r.toISOString(),a=n.get(i);c.push(a??cr(i,e??null,t))}}return c}function sr(e,t,n,r){let i=new Map;for(let a of e){let e=ar(a,r),o=ir(a[t],n)??String(a[t]),s=i.get(e);s||(s=new Map,i.set(e,s)),s.set(o,a)}return i.size===0&&r.length===0&&i.set(`__all__`,new Map),i}function cr(e,t,n){let{timeDimensionKey:r,fillValue:i,measures:a,dimensions:o}=n,s={[r]:e};if(t)for(let e of o)s[e]=t[e];for(let e of a)s[e]=i;return s}function lr(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=$n(e);if(t)return[t.start,t.end];let n=new Date(e);return isNaN(n.getTime())?null:[n,n]}function ur(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let n=e.fillMissingDates!==!1,r=!!e.granularity,i=e.dateRange||dr(e.dimension,t.filters);return n&&r&&i});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let r=lr(e.dateRange)||fr(e.dimension,t.filters);if(!r)continue;let a={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:i,measures:n,dimensions:o};s=or(s,a)}return s}function dr(e,t){if(!t)return null;for(let n of t){if(`member`in n&&`operator`in n&&n.member===e&&n.operator===`inDateRange`)return n;if(`and`in n&&n.and){let t=dr(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=dr(e,n.or);if(t)return t}}return null}function fr(e,t){let n=dr(e,t);if(!n)return null;if(n.dateRange){let e=lr(n.dateRange);if(e)return e}let r=n.values;if(!r||r.length===0)return null;if(r.length===1&&typeof r[0]==`string`){let e=$n(r[0]);return e?[e.start,e.end]:lr(r)}return r.length>=2?lr(r):null}function pr(e,t,n){return ur(Array.isArray(e)?e.map(e=>{let r={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in r){let t=r[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=n.convertTimeDimensionResult(t),r[e.dimension]=t}}return r}):[e],t,t.measures||[])}var mr=class{queryBuilder;constructor(e){this.queryBuilder=e}preload(e,t,n,r){if(e.filters&&e.filters.length>0)for(let i of Ft(e.filters))this.preloadRegularFilter(i,t,n,r);if(e.timeDimensions)for(let i of e.timeDimensions)this.preloadTimeDimensionFilter(i,t,n,r)}resolveMemberDimension(e,t){let[n,r]=e.split(`.`),i=t.get(n);return i?i.dimensions?.[r]??null:null}preloadRegularFilter(e,t,n,r){let i=B(e);if(t.has(i))return;let a=this.resolveMemberDimension(e.member,n);if(!a||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))return;let o=z(a,r),s=this.queryBuilder.buildFilterConditionPublic(o,e.operator,e.values,a,e.dateRange);s&&t.set(i,s)}preloadTimeDimensionFilter(e,t,n,r){if(!e.dateRange)return;let i=Nt(e.dimension,e.dateRange);if(t.has(i))return;let a=this.resolveMemberDimension(e.dimension,n);if(!a)return;let o=R(a.sql,r),s=this.queryBuilder.buildDateRangeCondition(o,e.dateRange);s&&t.set(i,s)}};function hr(t){return e.C(t)}function gr(t,n){let r=[],i=hr(n);if(i.length>1)return r.push(e.O(`server.validation.query.multipleQueryModes`,{modes:i.join(`, `)})),{isValid:!1,errors:r};if(i.length===1&&i[0]!==`comparison`)return _r(i[0],n,t,r),{isValid:r.length===0,errors:r};let a=new Set;if(Sr(n,t,r,a),Cr(n,t,r,a),wr(n,t,r,a),n.filters)for(let e of n.filters)Ar(e,t,r,a);return a.size===0&&r.push(e.O(`server.validation.query.mustReferenceAtLeastOneCube`)),n.ungrouped&&Dr(n,t,r,a),{isValid:r.length===0,errors:r}}function _r(e,t,n,r){e!==`comparison`&&(e===`funnel`?vr(t,n,r):e===`flow`?yr(t,n,r):e===`retention`&&br(t,n,r))}function vr(t,n,r){let i=t.funnel.bindingKey;if(typeof i==`string`){let[t]=i.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:t}))}else if(Array.isArray(i))for(let t of i)n.has(t.cube)||r.push(e.O(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:t.cube}))}function yr(t,n,r){let i=t.flow.bindingKey;if(typeof i==`string`){let[t]=i.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.flowBindingKeyCubeNotFound`,{cubeName:t}))}}function br(t,n,r){let i=t.retention,a=jr(i.timeDimension);a&&!n.has(a)&&r.push(e.O(`server.validation.query.retentionCubeNotFound`,{cubeName:a}));let o=i.bindingKey;if(typeof o==`string`){let[t]=o.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:t}))}else if(Array.isArray(o))for(let t of o)n.has(t.cube)||r.push(e.O(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:t.cube}));if(i.breakdownDimensions&&Array.isArray(i.breakdownDimensions))for(let t of i.breakdownDimensions){let[i]=t.split(`.`);i&&!n.has(i)&&r.push(e.O(`server.validation.query.retentionBreakdownCubeNotFound`,{cubeName:i}))}}function xr(e,t,n){return e===t?`. Did you mean one of: ${n.slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``}function Sr(t,n,r,i){if(t.measures)for(let a of t.measures){let[t,o]=a.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidMeasureFormat`,{measure:a}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForMeasure`,{cubeName:t,measure:a}));continue}if(!s.measures[o]){let n=xr(o,t,Object.keys(s.measures));r.push(e.O(`server.validation.query.measureNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function Cr(t,n,r,i){if(t.dimensions)for(let a of t.dimensions){let[t,o]=a.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidDimensionFormat`,{dimension:a}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForDimension`,{cubeName:t,dimension:a}));continue}if(!s.dimensions[o]){let n=xr(o,t,Object.keys(s.dimensions));r.push(e.O(`server.validation.query.dimensionNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function wr(t,n,r,i){if(t.timeDimensions)for(let a of t.timeDimensions){let[t,o]=a.dimension.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidTimeDimensionFormat`,{dimension:a.dimension}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForTimeDimension`,{cubeName:t,dimension:a.dimension}));continue}s.dimensions[o]||r.push(e.O(`server.validation.query.timeDimensionNotFound`,{fieldName:o,cubeName:t}))}}var Tr=new Set([`count`,`countDistinct`,`countDistinctApprox`,`calculated`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`]),Er=[`sum`,`avg`,`min`,`max`,`number`];function Dr(t,n,r,i){t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0||r.push(e.O(`server.validation.query.ungroupedRequiresDimension`)),t.funnel&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFunnel`)),t.flow&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFlow`)),t.retention&&r.push(e.O(`server.validation.query.ungroupedIncompatibleRetention`)),t.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>0)&&r.push(e.O(`server.validation.query.ungroupedIncompatibleCompareDateRange`)),t.timeDimensions?.some(e=>e.fillMissingDates===!0)&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFillMissingDates`)),Or(t,n,r),kr(n,r,i)}function Or(e,t,n){if(e.measures)for(let r of e.measures){let[e,i]=r.split(`.`),a=t.get(e)?.measures[i];a&&(Tr.has(a.type)&&n.push(`Measure '${r}' has type '${a.type}' which is incompatible with ungrouped queries. Only ${Er.join(`, `)} types are allowed.`),a.filters&&a.filters.length>0&&n.push(`Measure '${r}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`))}}function kr(e,t,n){for(let r of n){let i=e.get(r);if(i?.joins)for(let[a,o]of Object.entries(i.joins)){if(o.relationship!==`hasMany`)continue;let i=F(o.targetCube,e);i&&n.has(i.name)&&t.push(`Ungrouped queries are incompatible with hasMany relationships (${r} → ${a} is hasMany)`)}}}function Ar(t,n,r,i){if(`and`in t||`or`in t){let e=t.and||t.or||[];for(let t of e)Ar(t,n,r,i);return}if(!(`member`in t)){r.push(e.O(`server.validation.query.filterMustHaveMember`));return}let[a,o]=t.member.split(`.`);if(!a||!o){r.push(e.O(`server.validation.query.invalidFilterMemberFormat`,{member:t.member}));return}i.add(a);let s=n.get(a);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForFilter`,{cubeName:a,member:t.member}));return}if(!s.dimensions[o]&&!s.measures[o]){let t=o===a?`. Did you mean one of: ${[...Object.keys(s.dimensions),...Object.keys(s.measures)].slice(0,5).map(e=>`'${a}.${e}'`).join(`, `)}?`:``;r.push(e.O(`server.validation.query.filterFieldNotFound`,{fieldName:o,cubeName:a,hint:t}))}}function jr(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var Mr=class{builders;constructor(e){this.builders=e}resolveMode(t){let n=[];if(this.builders.comparison.hasComparison(t)&&n.push(`comparison`),this.builders.funnel.hasFunnel(t)&&n.push(`funnel`),this.builders.flow.hasFlow(t)&&n.push(`flow`),this.builders.retention.hasRetention(t)&&n.push(`retention`),n.length===0)return`regular`;if(n.length>1)throw Error(e.O(`server.errors.queryContainsMultipleModes`,{modes:n.join(`, `)}));return n[0]}validateForMode(t,n,r){let i=()=>{let t=gr(n,r);if(!t.isValid)throw Error(e.O(`server.errors.queryValidationFailed`,{errors:t.errors.join(`, `)}))};({regular:i,comparison:i,funnel:()=>{let t=this.builders.funnel.validateConfig(r.funnel,n);if(!t.isValid)throw Error(e.O(`server.errors.funnelValidationFailed`,{errors:t.errors.join(`, `)}))},flow:()=>{let t=this.builders.flow.validateConfig(r.flow,n);if(!t.isValid)throw Error(e.O(`server.errors.flowValidationFailed`,{errors:t.errors.join(`, `)}))},retention:()=>{let t=this.builders.retention.validateConfig(r.retention,n);if(!t.isValid)throw Error(e.O(`server.errors.retentionValidationFailed`,{errors:t.errors.join(`, `)}))}})[At(t)]()}};function Nr(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=Pr(e),a=`${r}query:${Br(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=Br(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(zr(t)));a+=`:ctx:${e}`}return a}function Pr(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?Z(e.filters):void 0,timeDimensions:e.timeDimensions?Rr(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?zr(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?Fr(e.funnel):void 0,flow:e.flow?Ir(e.flow):void 0,retention:e.retention?Lr(e.retention):void 0}}function Fr(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)?Z(e.filter):Z([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 Ir(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)?Z(e.startingStep.filter):Z([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function Lr(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)?Z(e.cohortFilters):Z([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?Z(e.activityFilters):Z([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function Z(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:Z(e.and)};if(`or`in e&&e.or)return{or:Z(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 Rr(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 zr(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(zr):Object.keys(e).sort().reduce((t,n)=>(t[n]=zr(e[n]),t),{})}function Br(e){let t=2166136261,n=2246822519,r=3266489917,i=668265263,a=16777619;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=Math.imul(t^s,a)>>>0,n=Math.imul(n^s+o&65535,a)>>>0,r=Math.imul(r^(s^o&255),a)>>>0,i=Math.imul(i^s+Math.imul(o,131)&65535,a)>>>0}return t=(t^e.length)>>>0,t.toString(16).padStart(8,`0`)+n.toString(16).padStart(8,`0`)+r.toString(16).padStart(8,`0`)+i.toString(16).padStart(8,`0`)}var Vr=class{cacheConfig;constructor(e){this.cacheConfig=e}generateKey(e,t){if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)return Nr(e,t,this.cacheConfig)}async lookup(e,t){if(!(!e||!this.cacheConfig?.provider)){if(t){this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:0});return}try{let t=Date.now(),n=await this.cacheConfig.provider.get(e);if(n)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:e,durationMs:Date.now()-t}),{...n.value,cache:n.metadata?{hit:!0,cachedAt:new Date(n.metadata.cachedAt).toISOString(),ttlMs:n.metadata.ttlMs,ttlRemainingMs:n.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:Date.now()-t})}catch(e){this.cacheConfig.onError?.(e,`get`)}}}async store(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`)}}},Hr=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new U(e)}hasComparison(t){return e.w(t)}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})}},Ur=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new U(e),this.filterBuilder=new q(e,this.dateTimeBuilder)}hasFunnel(t){return e.E(t)}validateConfig(t,n){let r=[];t.steps.length<2&&r.push(e.O(`server.validation.funnel.minSteps`)),this.validateBindingKey(t,n,r),this.validateTimeDimension(t,n,r);for(let e=0;e<t.steps.length;e++)this.validateStep(t,t.steps[e],e,n,r);return{isValid:r.length===0,errors:r}}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.O(`server.validation.funnel.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.funnel.bindingKeyCubeNotFound`,{cubeName:i}));return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.funnel.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.O(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateTimeDimension(t,n,r){if(typeof t.timeDimension!=`string`)return;let[i,a]=t.timeDimension.split(`.`);if(!i||!a){r.push(e.O(`server.validation.funnel.invalidTimeDimFormat`,{timeDimension:t.timeDimension}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.funnel.timeDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.funnel.timeDimCubeNotFound`,{cubeName:i}))}validateStep(t,n,r,i,a){n.name||a.push(e.O(`server.validation.funnel.stepMustHaveName`,{step:r})),`cube`in n&&n.cube&&!i.get(n.cube)&&a.push(e.O(`server.validation.funnel.stepCubeNotFound`,{step:r,cube:n.cube})),n.filter&&this.validateStepFilters(t,n,r,i,a),n.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(n.timeToConvert)||a.push(e.O(`server.validation.funnel.stepTimeToConvertFormat`,{step:r,value:n.timeToConvert})))}validateStepFilters(t,n,r,i,a){let o;`cube`in n&&n.cube?o=n.cube:typeof t.bindingKey==`string`&&([o]=t.bindingKey.split(`.`));let s=o?new X(i):null,c=Array.isArray(n.filter)?n.filter:[n.filter];for(let t of c){if(!(`member`in t))continue;let[n,c]=t.member.split(`.`),l=i.get(n);if(!l){a.push(e.O(`server.validation.funnel.stepFilterCubeNotFound`,{step:r,cubeName:n}));continue}if(l.dimensions?.[c]||(l.measures?.[c]?a.push(e.O(`server.validation.funnel.stepFilterIsMeasure`,{step:r,member:`${n}.${c}`})):a.push(e.O(`server.validation.funnel.stepFilterMemberNotFound`,{step:r,field:c,cubeName:n}))),o&&n!==o&&s){let t=s.findPath(o,n);(!t||t.length===0)&&a.push(e.O(`server.validation.funnel.stepFilterNoJoinPath`,{step:r,member:`${n}.${c}`,stepCube:o}))}}}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&&this.applyTimeMetrics(c,n,e),r.push(c)}return r}applyTimeMetrics(e,t,n){let r=e=>t[e]===null?null:Number(t[e]);e.avgSecondsToConvert=r(`step_${n}_avg_seconds`),e.minSecondsToConvert=r(`step_${n}_min_seconds`),e.maxSecondsToConvert=r(`step_${n}_max_seconds`),t[`step_${n}_median_seconds`]!==void 0&&(e.medianSecondsToConvert=r(`step_${n}_median_seconds`)),t[`step_${n}_p90_seconds`]!==void 0&&(e.p90SecondsToConvert=r(`step_${n}_p90_seconds`))}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{let n=K(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(n)for(let e of n.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 X(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(t,n,r){if(`cube`in t&&t.cube){let n=r.get(t.cube);if(!n)throw Error(e.O(`server.errors.funnel.cubeNotFoundForStep`,{cube:t.cube}));return n}if(typeof n.bindingKey==`string`){let[t]=n.bindingKey.split(`.`),i=r.get(t);if(!i)throw Error(e.O(`server.errors.funnel.cubeNotFoundForBindingKey`,{bindingKey:n.bindingKey}));return i}throw Error(e.O(`server.errors.funnel.cannotResolveCubeForStep`))}resolveBindingKey(e,t,n){return hn(e.bindingKey,t,n,pn(`server.errors.funnel`))}resolveTimeDimension(e,t,n){return gn(e.timeDimension,t,n,`server.errors.funnel`)}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=K(e);return i||a?this.buildLogicalFilterCondition(e,a,t,n,r):this.buildSimpleFilterCondition(e,t,n,r)}buildLogicalFilterCondition(e,t,n,r,i){let a,o;if(t)a=t.isAnd,o=t.filters;else{let t=e;a=`and`in t&&!!t.and,o=t.and||t.or||[]}let s=[];for(let e of o){let t=this.buildFilterCondition(e,n,r,i);t&&s.push(t)}return s.length===0?null:s.length===1?s[0]:a?D(...s):C`(${C.join(s,C` OR `)})`}buildSimpleFilterCondition(e,t,n,r){let[i,a]=e.member.split(`.`),o=e.dateRange!==void 0;if(e.operator!==`set`&&e.operator!==`notSet`&&!o&&(!e.values||e.values.length===0||e.values[0]===void 0||e.values[0]===``))return null;let s=n.get(i);if(!s)return null;if(i!==t.name){let e=new X(n).findPath(t.name,i);if(!e||e.length===0)return null}let c=s.dimensions?.[a];if(!c)return null;let l=z(c,r);return this.filterBuilder.buildFilterCondition(l,e.operator,e.values||[],c,e.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:C`${e.bindingKeyExpr}`.as(`binding_key`),step_time:C`MIN(${e.timeExpr})`.as(`step_time`)}).from(r.from);return a=this.addCrossJoinsToQuery(a,e,t,i),i.length>0&&(a=a.where(G(i))),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=C`${C.identifier(i)}.step_time`,c=C`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=C`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:C`${e.bindingKeyExpr}`.as(`binding_key`),step_time:C`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,C`${e.bindingKeyExpr} = ${C.identifier(i)}.binding_key`);return l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0&&(l=l.where(G(o))),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(E(e.source,e.target));let s=G(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:C`s0.binding_key`,step_0_time:C`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=C`s${C.raw(String(e))}.step_time`;let a=C`${C.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=C`${a}
63
+ LEFT JOIN ${C.identifier(`step_${e}`)} s${C.raw(String(e))} ON s0.binding_key = s${C.raw(String(e))}.binding_key`;let o=Object.entries(i).map(([e,t])=>C`${t} AS ${C.identifier(e)}`),s=C`SELECT ${C.join(o,C`, `)} FROM ${a}`;return r.db.$with(`funnel_joined`).as(s)}buildAggregationCTE(e,t,n,r,i){let a={};a.step_0_count=C`COUNT(*)`.as(`step_0_count`);for(let e=1;e<n.length;e++)a[`step_${e}_count`]=C`COUNT(${C.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(r.includeTimeMetrics)for(let e=1;e<n.length;e++){let t=C.identifier(`step_${e}_time`),n=C.identifier(`step_${e-1}_time`),r=this.databaseAdapter.buildTimeDifferenceSeconds(C`${t}`,C`${n}`),i=C`${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`]=C`(SELECT ${n} FROM ${C.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`]=C`(SELECT ${i} FROM ${C.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)}},Wr=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new U(e),this.filterBuilder=new q(e,this.dateTimeBuilder)}hasFlow(t){return e.T(t)}validateConfig(t,n){let r=[],i=[],a=this.databaseAdapter.getEngineType(),o=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;return a===`sqlite`?(r.push(e.O(`server.validation.flow.sqliteNotSupported`)),{isValid:!1,errors:r,warnings:i}):(this.validateBindingKey(t,n,r),typeof t.timeDimension==`string`&&this.validateMemberDimension(t.timeDimension,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidTimeDimFormat`,{timeDimension:t.timeDimension}),cubeNotFound:t=>e.O(`server.validation.flow.timeDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.timeDimNotFound`,{dimName:t,cubeName:n})}),t.eventDimension?this.validateMemberDimension(t.eventDimension,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidEventDimFormat`,{eventDimension:t.eventDimension}),cubeNotFound:t=>e.O(`server.validation.flow.eventDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.eventDimNotFound`,{dimName:t,cubeName:n})}):r.push(e.O(`server.validation.flow.eventDimRequired`)),this.validateStartingStep(t,r,i),this.validateDepthBounds(t,r,i),this.validateJoinStrategy(t,o,r),{isValid:r.length===0,errors:r,warnings:i})}validateMemberDimension(e,t,n,r){let[i,a]=e.split(`.`);if(!i||!a){n.push(r.invalidFormat());return}let o=t.get(i);o?o.dimensions?.[a]||n.push(r.dimNotFound(a,i)):n.push(r.cubeNotFound(i))}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){this.validateMemberDimension(t.bindingKey,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}),cubeNotFound:t=>e.O(`server.validation.flow.bindingKeyCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.bindingKeyDimNotFound`,{dimName:t,cubeName:n})});return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.flow.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.O(`server.validation.flow.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateStartingStep(t,n,r){if(!t.startingStep){n.push(e.O(`server.validation.flow.startingStepRequired`));return}t.startingStep.filter||n.push(e.O(`server.validation.flow.startingStepFilterRequired`)),t.startingStep.name||r.push(e.O(`server.validation.flow.startingStepNameMissing`))}validateDepthBounds(t,n,r){(t.stepsBefore<0||t.stepsBefore>5)&&n.push(e.O(`server.validation.flow.stepsBeforeRange`,{value:t.stepsBefore})),(t.stepsAfter<0||t.stepsAfter>5)&&n.push(e.O(`server.validation.flow.stepsAfterRange`,{value:t.stepsAfter})),(t.stepsBefore>=4||t.stepsAfter>=4)&&r.push(e.O(`server.validation.flow.highStepDepthWarning`))}validateJoinStrategy(t,n,r){t.joinStrategy&&![`auto`,`lateral`,`window`].includes(t.joinStrategy)?r.push(e.O(`server.validation.flow.invalidJoinStrategy`,{joinStrategy:t.joinStrategy})):t.joinStrategy===`lateral`&&!n&&r.push(e.O(`server.validation.flow.lateralNotSupported`))}buildFlowQuery(t,n,r){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(e.O(`server.validation.flow.sqliteNotSupported`));let i=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,a=t.joinStrategy??`auto`,o=a===`lateral`||a===`auto`&&i;if(a===`lateral`&&!i)throw Error(e.O(`server.validation.flow.lateralNotSupportedExec`));let s={...t,stepsBefore:t.outputMode===`sunburst`?0:t.stepsBefore},c=this.resolveFlowConfig(s,n,r),l=[],u=this.buildStartingEntitiesCTE(s,c,r);l.push(u);let d=o?this.buildDirectionalCTEsLateral(`before`,s,c,r):this.buildDirectionalCTEsWindow(`before`,s,c,r);l.push(...d);let f=o?this.buildDirectionalCTEsLateral(`after`,s,c,r):this.buildDirectionalCTEsWindow(`after`,s,c,r);l.push(...f);let p=this.buildNodesAggregationCTE(s,r);l.push(p);let m=this.buildLinksAggregationCTE(s,r);l.push(m);let h=this.buildFinalResultCTE(r);return l.push(h),r.db.with(...l).select().from(h)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(t,n){let r;if(typeof t.bindingKey==`string`)[r]=t.bindingKey.split(`.`);else if(Array.isArray(t.bindingKey)&&t.bindingKey.length>0)r=t.bindingKey[0].cube;else throw Error(e.O(`server.errors.flow.cannotResolveCube`));let i=n.get(r);if(!i)throw Error(e.O(`server.errors.flow.cubeNotFound`,{cubeName:r}));return i}resolveBindingKey(e,t,n){return hn(e.bindingKey,t,n,pn(`server.errors.flow`))}resolveTimeDimension(e,t,n){return gn(e.timeDimension,t,n,`server.errors.flow`)}resolveEventDimension(t,n,r){let[,i]=t.eventDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e.O(`server.errors.flow.eventDimNotFound`,{eventDimension:t.eventDimension}));return R(a.sql,r)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(e,t,n){if(`and`in e||`or`in e){let r=e,i=r.and||r.or||[],a=this.buildSubConditions(i,t,n);return this.combineConditions(a,`and`in e)}let r=K(e);if(r){let e=this.buildSubConditions(r.filters,t,n);return this.combineConditions(e,r.isAnd)}let i=e,[,a]=i.member.split(`.`),o=t.dimensions?.[a];if(!o)return null;let s=z(o,n);return this.filterBuilder.buildFilterCondition(s,i.operator,i.values||[],o,i.dateRange)}buildSubConditions(e,t,n){let r=[];for(let i of e){let e=this.buildFilterCondition(i,t,n);e&&r.push(e)}return r}combineConditions(e,t){return e.length===0?null:e.length===1?e[0]:t?D(...e):C`(${C.join(e,C` OR `)})`}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:C`${i}`.as(`binding_key`),start_time:C`MIN(${a})`.as(`start_time`),event_type:C`${o}`.as(`event_type`),event_path:C`${o}`.as(`event_path`)}).from(r.from);return c.length>0&&(l=l.where(G(c))),l=l.groupBy(i,o),e.entityLimit&&(l=l.limit(e.entityLimit)),n.db.$with(`starting_entities`).as(l)}buildDirectionalCTEsLateral(e,t,n,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s}=n,c=[],l=t.outputMode===`sunburst`,u=e===`before`,d=u?t.stepsBefore:t.stepsAfter,f=u?C`<`:C`>`,p=u?C`DESC`:C`ASC`;for(let t=1;t<=d;t++){let n=t===1?`starting_entities`:`${e}_step_${t-1}`,d=t===1?`start_time`:`step_time`,m=`${e}_step_${t}`,h=[];i.where&&h.push(i.where),h.push(C`${a} = ${C.identifier(n)}.binding_key`,C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);let g=G(h),_=l?u?C`${s} || ${`→`} || ${C.identifier(n)}.event_path`:C`${C.identifier(n)}.event_path || ${`→`} || ${s}`:C`${s}`,v=r.db.select({binding_key:C`${a}`.as(`binding_key`),step_time:C`${o}`.as(`step_time`),event_type:C`${s}`.as(`event_type`),event_path:_.as(`event_path`)}).from(i.from).where(g).orderBy(C`${o} ${p}`).limit(1),y=r.db.$with(m).as(r.db.select({binding_key:C`e.binding_key`.as(`binding_key`),step_time:C`e.step_time`.as(`step_time`),event_type:C`e.event_type`.as(`event_type`),event_path:C`e.event_path`.as(`event_path`)}).from(C`${C.identifier(n)}`).crossJoinLateral(v.as(`e`)));c.push(y)}return c}buildDirectionalCTEsWindow(e,t,n,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s}=n,c=[],l=t.outputMode===`sunburst`,u=e===`before`,d=u?t.stepsBefore:t.stepsAfter,f=u?C`<`:C`>`,p=u?C`DESC`:C`ASC`;for(let t=1;t<=d;t++){let n=t===1?`starting_entities`:`${e}_step_${t-1}`,d=t===1?`start_time`:`step_time`,m=`${e}_step_${t}`,h=[];i.where&&h.push(i.where),h.push(C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);let g=G(h),_=l?u?C`${s} || ${`→`} || ${C.identifier(n)}.event_path`:C`${C.identifier(n)}.event_path || ${`→`} || ${s}`:C`${s}`,v=r.db.select({binding_key:C`${a}`.as(`binding_key`),step_time:C`${o}`.as(`step_time`),event_type:C`${s}`.as(`event_type`),event_path:_.as(`event_path`),rn:C`ROW_NUMBER() OVER (PARTITION BY ${a} ORDER BY ${o} ${p})`.as(`rn`)}).from(i.from).innerJoin(C`${C.identifier(n)}`,C`${a} = ${C.identifier(n)}.binding_key`).where(g),y=r.db.select({binding_key:C`binding_key`.as(`binding_key`),step_time:C`step_time`.as(`step_time`),event_type:C`event_type`.as(`event_type`),event_path:C`event_path`.as(`event_path`)}).from(v.as(`ranked`)).where(C`rn = 1`);c.push(r.db.$with(m).as(y))}return c}buildNodeArm(e,t,n,r){let i=C.raw(`'${e}_'`),a=C.raw(String(t)),o=C.identifier(n);return r?C`
64
+ SELECT
65
+ ${i} || event_path AS node_id,
66
+ event_type AS name,
67
+ ${a} AS layer,
68
+ COUNT(*) AS value
69
+ FROM ${o}
70
+ GROUP BY event_path, event_type
71
+ `:C`
72
+ SELECT
73
+ ${i} || event_type AS node_id,
74
+ event_type AS name,
75
+ ${a} AS layer,
76
+ COUNT(*) AS value
77
+ FROM ${o}
78
+ GROUP BY event_type
79
+ `}buildAdjacentLinkArm(e,t,n,r,i){let a=C.raw(`'${e}_'`),o=C.raw(`'${t}_'`),s=C.identifier(n),c=C.identifier(r);return i?C`
80
+ SELECT
81
+ ${a} || f.event_path AS source_id,
82
+ ${o} || t.event_path AS target_id,
83
+ COUNT(*) AS value
84
+ FROM ${s} f
85
+ INNER JOIN ${c} t ON f.binding_key = t.binding_key
86
+ GROUP BY f.event_path, t.event_path
87
+ `:C`
88
+ SELECT
89
+ ${a} || f.event_type AS source_id,
90
+ ${o} || t.event_type AS target_id,
91
+ COUNT(*) AS value
92
+ FROM ${s} f
93
+ INNER JOIN ${c} t ON f.binding_key = t.binding_key
94
+ GROUP BY f.event_type, t.event_type
95
+ `}buildNodesAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=1;t--)n.push(this.buildNodeArm(`before_${t}`,-t,`before_step_${t}`,r));n.push(C`
96
+ SELECT
97
+ ${C.raw(`'start_'`)} || event_type AS node_id,
98
+ event_type AS name,
99
+ 0 AS layer,
100
+ COUNT(*) AS value
101
+ FROM starting_entities
102
+ GROUP BY event_type
103
+ `);for(let t=1;t<=e.stepsAfter;t++)n.push(this.buildNodeArm(`after_${t}`,t,`after_step_${t}`,r));let i=C.join(n,C` UNION ALL `),a=t.db.select({node_id:C`node_id`.as(`node_id`),name:C`name`.as(`name`),layer:C`layer`.as(`layer`),value:C`value`.as(`value`)}).from(C`(${i}) AS nodes_union`);return t.db.$with(`nodes_agg`).as(a)}buildLinksAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=2;t--)n.push(this.buildAdjacentLinkArm(`before_${t}`,`before_${t-1}`,`before_step_${t}`,`before_step_${t-1}`,r));e.stepsBefore>=1&&(r?n.push(C`
104
+ SELECT
105
+ ${C.raw(`'before_1_'`)} || b.event_path AS source_id,
106
+ ${C.raw(`'start_'`)} || s.event_type AS target_id,
107
+ COUNT(*) AS value
108
+ FROM before_step_1 b
109
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
110
+ GROUP BY b.event_path, s.event_type
111
+ `):n.push(C`
112
+ SELECT
113
+ ${C.raw(`'before_1_'`)} || b.event_type AS source_id,
114
+ ${C.raw(`'start_'`)} || s.event_type AS target_id,
115
+ COUNT(*) AS value
116
+ FROM before_step_1 b
117
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
118
+ GROUP BY b.event_type, s.event_type
119
+ `)),e.stepsAfter>=1&&(r?n.push(C`
120
+ SELECT
121
+ ${C.raw(`'start_'`)} || s.event_type AS source_id,
122
+ ${C.raw(`'after_1_'`)} || a.event_path AS target_id,
123
+ COUNT(*) AS value
124
+ FROM starting_entities s
125
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
126
+ GROUP BY s.event_type, a.event_path
127
+ `):n.push(C`
128
+ SELECT
129
+ ${C.raw(`'start_'`)} || s.event_type AS source_id,
130
+ ${C.raw(`'after_1_'`)} || a.event_type AS target_id,
131
+ COUNT(*) AS value
132
+ FROM starting_entities s
133
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
134
+ GROUP BY s.event_type, a.event_type
135
+ `));for(let t=1;t<e.stepsAfter;t++)n.push(this.buildAdjacentLinkArm(`after_${t}`,`after_${t+1}`,`after_step_${t}`,`after_step_${t+1}`,r));if(n.length===0){let e=t.db.select({source_id:C`NULL`.as(`source_id`),target_id:C`NULL`.as(`target_id`),value:C`0`.as(`value`)}).from(C`(SELECT 1) AS empty`).where(C`1 = 0`);return t.db.$with(`links_agg`).as(e)}let i=C.join(n,C` UNION ALL `),a=t.db.select({source_id:C`source_id`.as(`source_id`),target_id:C`target_id`.as(`target_id`),value:C`value`.as(`value`)}).from(C`(${i}) AS links_union`);return t.db.$with(`links_agg`).as(a)}buildFinalResultCTE(e){let t=C`
136
+ SELECT
137
+ 'node' AS record_type,
138
+ node_id AS id,
139
+ name AS name,
140
+ layer AS layer,
141
+ value AS value,
142
+ NULL AS source_id,
143
+ NULL AS target_id
144
+ FROM nodes_agg
145
+ UNION ALL
146
+ SELECT
147
+ 'link' AS record_type,
148
+ NULL AS id,
149
+ NULL AS name,
150
+ NULL AS layer,
151
+ value AS value,
152
+ source_id AS source_id,
153
+ target_id AS target_id
154
+ FROM links_agg
155
+ WHERE source_id IS NOT NULL
156
+ `,n=e.db.select({record_type:C`record_type`.as(`record_type`),id:C`id`.as(`id`),name:C`name`.as(`name`),layer:C`layer`.as(`layer`),value:C`value`.as(`value`),source_id:C`source_id`.as(`source_id`),target_id:C`target_id`.as(`target_id`)}).from(C`(${t}) AS final_union`);return e.db.$with(`final_result`).as(n)}};function Gr(e){return Array.isArray(e)}function Kr(e){return typeof e==`object`&&!!e&&`cube`in e}function qr(e){if(Kr(e))return e.cube;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(0,t)}function Jr(e){if(Kr(e))return e.dimension;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(t+1)}var Yr={noMapping:({cubeName:t})=>e.O(`server.validation.retention.noBindingKeyMapping`,{cubeName:t}),cubeNotFound:({cubeName:t})=>e.O(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:t}),keyDimNotFound:({bindingKey:t,cubeName:n})=>e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n}),mappingDimNotFound:({dimension:t,cubeName:n})=>e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n})},Xr=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new U(e),this.filterBuilder=new q(e,this.dateTimeBuilder)}hasRetention(t){return e.D(t)}validateConfig(t,n){let r=[],i=this.databaseAdapter.getEngineType();return(i===`sqlite`||i===`mysql`||i===`singlestore`)&&r.push(e.O(`server.validation.retention.engineNotSupported`,{engine:i})),this.validateTimeDimension(t,n,r),this.validateBindingKey(t,n,r),this.validateBreakdownDimensions(t,n,r),this.validatePeriodsAndEnums(t,r),this.validateDateRange(t,r),{isValid:r.length===0,errors:r}}validateTimeDimension(t,n,r){try{let i=qr(t.timeDimension),a=Jr(t.timeDimension),o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.timeDimNotFound`,{dimName:a})):r.push(e.O(`server.validation.retention.cubeNotFound`,{cubeName:i}))}catch{r.push(e.O(`server.validation.retention.invalidTimeDimFormat`,{timeDimension:t.timeDimension}))}}validateBindingKey(t,n,r){if(Gr(t.bindingKey)){for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.retention.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let a=fn(i.dimension);t.dimensions?.[a]||r.push(e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}return}let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.O(`server.validation.retention.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:i}))}validateBreakdownDimensions(t,n,r){if(!(!t.breakdownDimensions||t.breakdownDimensions.length===0))for(let i of t.breakdownDimensions){let[t,a]=i.split(`.`);if(!t||!a){r.push(e.O(`server.validation.retention.invalidBreakdownDimFormat`,{dimension:i}));continue}let o=n.get(t);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.breakdownDimNotFound`,{dimName:a,cubeName:t})):r.push(e.O(`server.validation.retention.breakdownDimCubeNotFound`,{cubeName:t}))}}validatePeriodsAndEnums(t,n){t.periods<1&&n.push(e.O(`server.validation.retention.periodsMin`)),t.periods>52&&n.push(e.O(`server.validation.retention.periodsMax`)),[`day`,`week`,`month`].includes(t.granularity)||n.push(e.O(`server.validation.retention.invalidGranularity`,{granularity:t.granularity})),[`classic`,`rolling`].includes(t.retentionType)||n.push(e.O(`server.validation.retention.invalidRetentionType`,{retentionType:t.retentionType}))}validateDateRange(t,n){if(!t.dateRange){n.push(e.O(`server.validation.retention.dateRangeRequired`));return}if(t.dateRange.start?isNaN(new Date(t.dateRange.start).getTime())&&n.push(e.O(`server.validation.retention.dateRangeInvalidStart`)):n.push(e.O(`server.validation.retention.dateRangeStartRequired`)),t.dateRange.end?isNaN(new Date(t.dateRange.end).getTime())&&n.push(e.O(`server.validation.retention.dateRangeInvalidEnd`)):n.push(e.O(`server.validation.retention.dateRangeEndRequired`)),t.dateRange.start&&t.dateRange.end){let r=new Date(t.dateRange.start),i=new Date(t.dateRange.end);!isNaN(r.getTime())&&!isNaN(i.getTime())&&r>i&&n.push(e.O(`server.validation.retention.dateRangeStartBeforeEnd`))}}buildRetentionQuery(e,t,n){let r=this.resolveConfig(e,t,n),i=r.breakdowns.length,a=this.buildCohortBaseCTE(e,r,n),o=this.buildActivityPeriodsCTE(e,r,n),s=this.buildCohortSizesCTE(e,n,i),c=this.buildRetentionCountsCTE(e,n,i),l=r.breakdowns.length>0,u={period:C`rc.period_number`.as(`period`),cohort_size:C`cs.cohort_size`.as(`cohort_size`),retained_users:C`rc.retained_users`.as(`retained_users`),retention_rate:C`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as(`retention_rate`)};for(let e=0;e<r.breakdowns.length;e++)u[`breakdown_${e}`]=C.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);let d=n.db.with(a,o,s,c).select(u).from(C`retention_counts rc`);if(l){let e=r.breakdowns.map((e,t)=>C`COALESCE(CAST(rc.breakdown_${C.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${C.raw(String(t))} AS TEXT), '')`),t=e.length===1?e[0]:C.join(e,C` AND `);d=d.innerJoin(C`cohort_sizes cs`,t)}else d=d.innerJoin(C`cohort_sizes cs`,C`1 = 1`);let f=[];for(let e=0;e<r.breakdowns.length;e++)f.push(C.raw(`rc.breakdown_${e}`));return f.push(C`rc.period_number`),d=d.orderBy(...f),d}transformResult(e,t){let n=t.breakdownDimensions||[],r=Math.min(n.length,100),i=r>0;return e.map(e=>{let t={period:Number(e.period),cohortSize:Number(e.cohort_size),retainedUsers:Number(e.retained_users),retentionRate:e.retention_rate===null?0:Number(e.retention_rate)};if(i){let i={};for(let t=0;t<r;t++){let r=n[t],a=e[`breakdown_${t}`];i[r]=a===void 0?null:String(a)}t.breakdownValues=i}return t})}resolveConfig(t,n,r){let i=qr(t.timeDimension),a=Jr(t.timeDimension),o=n.get(i);if(!o)throw Error(e.O(`server.validation.retention.cubeNotFound`,{cubeName:i}));let s=o.dimensions?.[a];if(!s)throw Error(e.O(`server.validation.retention.timeDimNotFound`,{dimName:a}));let c=R(s.sql,r),l=hn(t.bindingKey,o,r,Yr,n),u=this.buildFilterConditions(t.cohortFilters,o,n,r),d=this.buildFilterConditions(t.activityFilters,o,n,r),f=[];if(t.breakdownDimensions&&t.breakdownDimensions.length>0)for(let e of t.breakdownDimensions){let[t,i]=e.split(`.`),a=n.get(t);if(a&&a.dimensions?.[i]){let t=R(a.dimensions[i].sql,r);f.push({dimension:e,expr:t})}}return{cube:o,bindingKeyExpr:l,timeExpr:c,cohortFilterConditions:u,activityFilterConditions:d,breakdowns:f}}buildFilterConditions(e,t,n,r){if(!e)return[];let i=Array.isArray(e)?e:[e],a=[];for(let e of i){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildSingleFilterCondition(e,t,n,r){if(`and`in e||`or`in e){let i=e,a=[],o=`and`in i&&!!i.and,s=i.and||i.or||[];for(let e of s){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a.length===0?null:a.length===1?a[0]:o?D(...a):C`(${C.join(a,C` OR `)})`}let i=e,[a,o]=i.member.split(`.`),s=n.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=z(c,r);return this.filterBuilder.buildFilterCondition(l,i.operator,i.values||[],c,i.dateRange)}buildCohortBaseCTE(e,t,n){let r=t.cube.sql(n),i=[];if(r.where&&i.push(r.where),i.push(...t.cohortFilterConditions),e.dateRange){let n=this.buildDateRangeCondition(t.timeExpr,e.dateRange);i.push(n)}let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o={binding_key:C`${t.bindingKeyExpr}`.as(`binding_key`),cohort_entry:C`MIN(${a})`.as(`cohort_entry`)};for(let e=0;e<t.breakdowns.length;e++){let{expr:n}=t.breakdowns[e];o[`breakdown_${e}`]=C`MIN(${n})`.as(`breakdown_${e}`)}let s=n.db.select(o).from(r.from);i.length>0&&(s=s.where(G(i)));let c=[t.bindingKeyExpr];for(let e=0;e<t.breakdowns.length;e++)c.push(t.breakdowns[e].expr);if(s=s.groupBy(...c),e.dateRange){let t=this.buildDateRangeHavingCondition(a,e.dateRange);s=s.having(t)}return n.db.$with(`cohort_base`).as(s)}buildDateRangeCondition(e,t){return C`${e} >= ${this.databaseAdapter.castToType(C`${t.start}`,`timestamp`)} AND ${e} < ${this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`,`timestamp`),`P1D`)}`}buildDateRangeHavingCondition(e,t){return C`MIN(${e}) >= ${this.databaseAdapter.castToType(C`${t.start}`,`timestamp`)} AND MIN(${e}) < ${this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`,`timestamp`),`P1D`)}`}buildActivityPeriodsCTE(e,t,n){let r=t.cube.sql(n),i=[];r.where&&i.push(r.where),i.push(...t.activityFilterConditions),i.push(C`${t.timeExpr} >= cohort_base.cohort_entry`);let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o=this.buildPeriodNumberExpression(C`cohort_base.cohort_entry`,a,e.granularity),s={binding_key:C`cohort_base.binding_key`.as(`binding_key`),period_number:o.as(`period_number`)};for(let e=0;e<t.breakdowns.length;e++)s[`breakdown_${e}`]=C.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);let c=n.db.select(s).from(r.from).innerJoin(C`cohort_base`,C`${t.bindingKeyExpr} = cohort_base.binding_key`);i.length>0&&(c=c.where(G(i)));let l=[C`cohort_base.binding_key`,o];for(let e=0;e<t.breakdowns.length;e++)l.push(C.raw(`cohort_base.breakdown_${e}`));return c=c.groupBy(...l),n.db.$with(`activity_periods`).as(c)}buildCohortSizesCTE(e,t,n){if(n>0){let e={cohort_size:C`COUNT(*)`.as(`cohort_size`)},r=[];for(let t=0;t<n;t++)e[`breakdown_${t}`]=C.raw(`breakdown_${t}`).as(`breakdown_${t}`),r.push(C.raw(`breakdown_${t}`));let i=t.db.select(e).from(C`cohort_base`).groupBy(...r);return t.db.$with(`cohort_sizes`).as(i)}let r=t.db.select({cohort_size:C`COUNT(*)`.as(`cohort_size`)}).from(C`cohort_base`);return t.db.$with(`cohort_sizes`).as(r)}buildRetentionCountsCTE(e,t,n){let r;if(e.retentionType===`rolling`)r=this.buildRollingRetentionCountsQuery(e,t,n);else{let i={period_number:C`period_number`.as(`period_number`),retained_users:C`COUNT(DISTINCT binding_key)`.as(`retained_users`)},a=[C`period_number`];for(let e=0;e<n;e++)i[`breakdown_${e}`]=C.raw(`breakdown_${e}`).as(`breakdown_${e}`),a.push(C.raw(`breakdown_${e}`));let o=Math.min(e.periods,52);r=t.db.select(i).from(C`activity_periods`).where(C`period_number >= 0 AND period_number <= ${o}`).groupBy(...a)}return t.db.$with(`retention_counts`).as(r)}buildRollingRetentionCountsQuery(e,t,n){let r=[];for(let e=0;e<n;e++)r.push(`breakdown_${e}`);let i=r.length>0?`, ${r.join(`, `)}`:``,a=Math.min(e.periods,52),o=C`(
157
+ SELECT
158
+ binding_key,
159
+ ${C.raw(r.map(e=>`${e}`).join(`, `)+(r.length>0?`,`:``))}
160
+ MAX(period_number) as max_period
161
+ FROM activity_periods
162
+ WHERE period_number >= 0 AND period_number <= ${a}
163
+ GROUP BY binding_key${C.raw(i)}
164
+ )`,s=this.databaseAdapter.buildPeriodSeriesSubquery(a),c={period_number:C`p.period_number`.as(`period_number`),retained_users:C`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},l=[C`p.period_number`];for(let e=0;e<n;e++)c[`breakdown_${e}`]=C.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),l.push(C.raw(`ump.breakdown_${e}`));return t.db.select(c).from(C`${o} ump`).innerJoin(s,C`TRUE`).groupBy(...l)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}};function Q(e){return{name:e.name,cube:e}}function Zr(t,n){return t.measures?t.measures.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForMeasure`,{cubeName:r,measure:t}));return{name:t,cube:Q(a),localName:i}}):[]}function Qr(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:Q(a),localName:i}}):[]}function $r(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:Q(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}function ei(e,t){return{measures:Zr(e,t),dimensions:Qr(e,t),timeDimensions:$r(e,t)}}function ti(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:[]}}var ni=class{queryPlanner;constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(t,n,r){let i=Array.from(this.queryPlanner.analyzeCubeUsage(n));if(i.length===0)throw Error(e.O(`server.errors.noCubesInQuery`));let a=this.queryPlanner.analyzePrimaryCube(i,n,t),o=a.selectedCube,s=t.get(o);if(!s)throw Error(e.O(`server.errors.primaryCubeNotFound`,{cubeName:o}));let c=i.filter(e=>e!==o).map(e=>this.queryPlanner.analyzeJoinPathForTarget(t,o,e,n)),l=i.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,s,i,r,n):[],u=i.length>1?this.queryPlanner.buildPreAggregationCTEs(t,s,l,n,r)??[]:[],d=this.queryPlanner.buildWarnings(n,u),f=this.buildSourceFromPhases(s,l,u,t,n,r),p=f.source,m=this.buildQueryNode(p,n,t,d),h=this.buildPreAggregationAnalysis(u),g=new Map;for(let e of i){let n=t.get(e);n&&g.set(e,n)}let _=Cn(n.measures??[],g),v=[...c.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...d.map(e=>e.message)];return{plan:m,analysis:{timestamp:new Date().toISOString(),cubeCount:i.length,cubesInvolved:[...i].sort(),primaryCube:a,joinPaths:c,preAggregations:h,querySummary:{queryType:u.length>0?`multi_cube_cte`:i.length>1?`multi_cube_join`:`single_cube`,measureStrategy:f.strategy,joinCount:l.length,cteCount:u.length,hasPreAggregation:u.length>0,hasWindowFunctions:_},warnings:v.length>0?v:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${i.length} cube${i.length===1?``:`s`} from query members`,details:{cubesInvolved:[...i].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${a.selectedCube}' as primary cube (${a.reason})`,details:{selectedCube:a.selectedCube,reason:a.reason,candidates:a.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${l.length} join${l.length===1?``:`s`}`,details:{joinCount:l.length,joinTargets:l.map(e=>e.target.name),pathSelection:c.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${u.length} pre-aggregation CTE${u.length===1?``:`s`}`,details:{cteCount:u.length,cubes:u.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${f.strategy}' measure strategy`,details:{strategy:f.strategy,regularMeasures:f.classification.regular.map(e=>e.name),multipliedMeasures:f.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:f.classification.deduplicationSafe.map(e=>e.name),sourceType:p.type}},{phase:`warnings`,decision:d.length>0?`Generated ${d.length} planning warning${d.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:d.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:Zr(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=Q(e),o=t,s=n.map(e=>{let t=Q(e.cube);return{type:`ctePreAggregate`,schema:ti(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:ei(i,r),primaryCube:a,joins:o,ctes:s}}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=Qr(e,t),c=$r(e,t),l={measures:Zr(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=F(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=ei(t,n),{measures:a,dimensions:o,timeDimensions:s}=i,c=this.buildOrderByRefs(t);return{type:`query`,schema:i,source:e,dimensions:o,measures:a,filters:t.filters??[],timeDimensions:s,orderBy:c,limit:t.limit,offset:t.offset,ungrouped:t.ungrouped,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}))}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}},ri=class{name=`identity`;optimise(e){return e}};function ii(e,t,n,r){let i=ai(e,n,r),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);l&&(a.push(l),o.set(c.cube.name,c.cteAlias),oi(c,s))}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function ai(e,t,n){let r=new Map;if(!e.preAggregationCTEs||e.preAggregationCTEs.length===0)return r;for(let i of e.preAggregationCTEs)if(!(!i.propagatingFilters||i.propagatingFilters.length===0))for(let e of i.propagatingFilters){let i=e.sourceCube.name;if(!r.has(i)){let a={filters:e.filters},o=new Map([[i,e.sourceCube]]),s=n.queryBuilder.buildWhereConditions(o,a,t);r.set(i,s)}let a=r.get(i);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:D(...a))}return r}function oi(e,t){if(e.downstreamJoinKeys)for(let n of e.downstreamJoinKeys)t.set(n.targetCubeName,{cteAlias:e.cteAlias,joinKeys:n.joinKeys})}function si(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(!Y.isPostAggregationWindow(u))continue;let d=Y.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?C`sum(${C`${C.identifier(g.cteAlias)}.${C.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=C`${_}`.as(d));let v=ci(u,_,n,r,l,t,a);v&&(e[o]=C`${v}`.as(o))}}function ci(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?C`${C.identifier(n.cteAlias)}.${C.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:R(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?R(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||Y.getDefaultWindowOperation(e.type)){case`difference`:return C`${t} - ${d}`;case`ratio`:return C`${t} / NULLIF(${d}, 0)`;case`percentChange`:return C`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function li(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)ui(a,o,t,n,r,i),fi(a,o,r);return si(a,e,t,n,r,i),a}function ui(e,t,n,r,i,a){let o=t.cube.name;for(let s of t.measures){if(!e[s])continue;let[,c]=s.split(`.`),l=i.get(o);if(!l?.measures?.[c])continue;let u=l.measures[c],d=C`${C.identifier(t.cteAlias)}.${C.identifier(c)}`,f;f=u.type===`calculated`&&u.calculatedSql?a.queryBuilder.buildCTECalculatedMeasure(u,l,t,i,r):di(u,d,t,n,i,a),e[s]=C`${f}`.as(s)}}function di(e,t,n,r,i,a){let o=n.cteReason===`fanOutPrevention`,s=pi(n,r,i),c=o||s;switch(e.type){case`count`:case`countDistinct`:case`sum`:return c?j(t):A(t);case`avg`:return c?j(t):a.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);case`number`:return j(t);default:return c?j(t):A(t)}}function fi(e,t,n){let r=t.cube.name;for(let i in e){let[a,o]=i.split(`.`);if(a!==r)continue;let s=n.get(r),c=s&&s.dimensions?.[o],l=i.startsWith(r+`.`);if(!c&&!l)continue;let u=t.joinKeys.find(e=>e.targetColumn===o);if(!u&&s?.dimensions?.[o]){let e=s.dimensions[o].sql;u=t.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[o])&&(e[i]=C`${C.identifier(t.cteAlias)}.${C.identifier(o)}`.as(i))}}function pi(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&&mi(e.sourceColumnObj,t,n))}function mi(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 $(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 hi(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}function gi(e,t,n,r,i,a){let o=[],s=_i(t,n,r,i);s=vi(s,n.joins);let c=new Set,l=yi(e);if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;l.has(r)&&!i.cteAliasMap.has(r)||(s=bi(s,n,e,i,t,o),s=Ci(s,n,e,i,t,a,c))}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function _i(e,t,n,r){return r.ctes.length>0?e.db.with(...r.ctes).select(n).from(t.from):e.db.select(n).from(t.from)}function vi(e,t){if(!t)return e;let n=e;for(let e of t)n=$(n,e.type??`left`,e.table,e.on);return n}function yi(e){let t=new Set;if(e.preAggregationCTEs){for(let n of e.preAggregationCTEs)if(n.intermediateJoins&&n.intermediateJoins.length>0)for(let e of n.intermediateJoins)t.add(e.cube.name)}return t}function bi(e,t,n,r,i,a){let o=t.junctionTable;if(!o)return e;let s=xi(o,t,n,r),c=[];if(o.securitySql){let e=o.securitySql(i.securityContext);Array.isArray(e)?c.push(...e):c.push(e)}try{let t=$(e,o.joinType??`left`,o.table,s);return c.length>0&&a.push(...c),t}catch{return e}}function xi(e,t,n,r){let i=e.joinCondition,a=e.sourceCubeName?r.cteAliasMap.get(e.sourceCubeName):void 0;if(!a)return i;let o=(n.preAggregationCTEs?.find(t=>t.cube.name===e.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===t.cube.name);if(o&&o.joinKeys.length>0){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(a)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj;r&&e.push(E(r,n))}e.length>0&&(i=D(...e))}return i}function Si(e,t,n,r,i,a){if(t)return{joinTarget:C`${C.identifier(t)}`,joinCondition:a.cteBuilder.buildCTEJoinCondition(e,t,r),securityCondition:void 0,joinCubeBase:void 0};let o=n.downstreamCubeMap.get(e.cube.name),s=e.cube.sql(i),c;if(o&&!e.junctionTable){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(o.cteAlias)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj||C.identifier(t.targetColumn);e.push(E(n,r))}c=e.length===1?e[0]:D(...e)}else c=e.joinCondition;return{joinTarget:s.from,joinCondition:c,securityCondition:s.where,joinCubeBase:s}}function Ci(e,t,n,r,i,a,o){let{joinTarget:s,joinCondition:c,securityCondition:l,joinCubeBase:u}=Si(t,r.cteAliasMap.get(t.cube.name),r,n,i,a),d=t.joinType||`left`,f=d!==`inner`&&l?D(c,l):c;try{let n;return d===`inner`?n=e.innerJoin(s,c):(n=$(e,d,s,f),l&&o.add(t.cube.name)),vi(n,u?.joins)}catch{return e}}function wi(e,t,n,r,i,a,o,s){let c=Ti(e,t,n,r,i,a,o,s),l=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:D(...c);l=l.where(e)}return Ei(l,e,t,n,r,s)}function Ti(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);return l.length>0&&c.push(...l),c}function Ei(e,t,n,r,i,a){let o=t.joinCubes.length>0?i:t.primaryCube,s=e,c=a.queryBuilder.buildGroupByFields(o,n,r,t);if(c.length>0&&(s=s.groupBy(...c)),!n.ungrouped){let e=a.queryBuilder.buildHavingConditions(o,n,r,t);if(e.length>0){let t=e.length===1?e[0]:D(...e);s=s.having(t)}}let l=a.queryBuilder.buildOrderBy(n);return l.length>0&&(s=s.orderBy(...l)),a.queryBuilder.applyLimitAndOffset(s,n)}function Di(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?hi(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!Ii(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:Ri(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u=i.regularMeasures??[],d=Oi(t,n,r,a,o,s,u);if(!d)return null;let f=ki(e,t,n,r,a,c,d.keysSelections,d.keyGroupBy),p=Mi(t,n,r,o,s,d.multipliedMeasures,l);return p?Fi(t,n,r,a,o,{keysAlias:c,aggAlias:l,keysCte:f,aggCte:p,pkDimensions:s,pkAliases:d.pkAliases,multipliedMeasures:d.multipliedMeasures,regularMeasureNames:u}):null}function Oi(e,t,n,r,i,a,o){let s={},c=[];if(e.dimensions)for(let n of e.dimensions){let[e,i]=n.split(`.`),a=r.get(e),o=a?.dimensions?.[i];if(!a||!o)return null;let l=R(o.sql,t);s[n]=C`${l}`.as(n),c.push(l)}if(e.timeDimensions)for(let i of e.timeDimensions){let[e,a]=i.dimension.split(`.`),o=r.get(e),l=o?.dimensions?.[a];if(!o||!l)return null;let u=n.queryBuilder.buildTimeDimensionExpression(l.sql,i.granularity,t);s[i.dimension]=C`${u}`.as(i.dimension),c.push(u)}let l=[];for(let e of a){let n=i.dimensions?.[e];if(!n)return null;let r=R(n.sql,t),a=`__pk__${e}`;s[a]=C`${r}`.as(a),c.push(r),l.push(a)}let u=new Set(o),d=e.measures.filter(e=>!u.has(e));if(o.length>0){let e=n.queryBuilder.buildResolvedMeasures(o,r,t);for(let t of o){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;s[r]=C`${n()}`.as(r)}}return{keysSelections:s,keyGroupBy:c,pkAliases:l,multipliedMeasures:d}}function ki(e,t,n,r,i,a,o,s){let c=e.primaryCube.sql(n),l=[];c.where&&l.push(c.where);let u=n.db.select(o).from(c.from);if(c.joins)for(let e of c.joins)u=$(u,e.type??`left`,e.table,e.on);for(let t of e.joinCubes)u=Ai(u,t,n,l);return l.push(...r.queryBuilder.buildWhereConditions(i,t,n)),u=Pi(u,l),s.length>0&&(u=u.groupBy(...s)),n.db.$with(a).as(u)}function Ai(e,t,n,r){let i=e;t.junctionTable&&(i=$(i,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),ji(t.junctionTable.securitySql,n,r));let a=t.cube.sql(n);if(i=$(i,t.joinType??`left`,a.from,t.joinCondition),a.joins)for(let e of a.joins)i=$(i,e.type??`left`,e.table,e.on);return a.where&&r.push(a.where),i}function ji(e,t,n){if(!e)return;let r=e(t.securityContext);Array.isArray(r)?n.push(...r):n.push(r)}function Mi(e,t,n,r,i,a,o){let s=r.sql(t),c=Ni(t,n,r,i,a);if(!c)return null;let l=t.db.select(c.aggSelections).from(s.from);if(s.joins)for(let e of s.joins)l=$(l,e.type??`left`,e.table,e.on);let u=[];return s.where&&u.push(s.where),u.push(...n.queryBuilder.buildWhereConditions(r,e,t)),l=Pi(l,u),c.aggGroupBy.length>0&&(l=l.groupBy(...c.aggGroupBy)),t.db.$with(o).as(l)}function Ni(e,t,n,r,i){let a={},o=[];for(let t of r){let r=n.dimensions?.[t];if(!r)return null;let i=R(r.sql,e);a[t]=C`${i}`.as(t),o.push(i)}let s=new Set;for(let e of i){let[,t]=e.split(`.`);n.measures?.[t]?.type===`avg`&&s.add(t)}let c=i.filter(e=>{let[,t]=e.split(`.`);return!s.has(t)});if(c.length>0){let r=t.queryBuilder.buildResolvedMeasures(c,new Map([[n.name,n]]),e);for(let e of c){let[,t]=e.split(`.`),n=r.get(e);if(!n||typeof n!=`function`)return null;a[t]=C`${n()}`.as(t)}}for(let t of i){let[,r]=t.split(`.`);if(!s.has(r))continue;let i=n.measures?.[r];if(!i?.sql)return null;let o=R(i.sql,e),c=`__avg_sum__${r}`,l=`__avg_count__${r}`;a[c]=C`sum(${o})`.as(c),a[l]=C`count(${o})`.as(l)}return{aggSelections:a,aggGroupBy:o}}function Pi(e,t){return t.length===0?e:e.where(t.length===1?t[0]:D(...t))}function Fi(e,t,n,r,i,a){let{keysAlias:o,aggAlias:s,keysCte:c,aggCte:l,pkDimensions:u,pkAliases:d,multipliedMeasures:f,regularMeasureNames:p}=a,m={};for(let t of e.dimensions??[])m[t]=C`${C.identifier(o)}.${C.identifier(t)}`.as(t);for(let t of e.timeDimensions??[])m[t.dimension]=C`${C.identifier(o)}.${C.identifier(t.dimension)}`.as(t.dimension);for(let e of f){let[,t]=e.split(`.`),n=i.measures?.[t];m[e]=zi(n?.type??`sum`,s,t,e)}for(let e of p){let[t,n]=e.split(`.`),i=r.get(t)?.measures?.[n],a=`__reg__${e.replace(`.`,`__`)}`;m[e]=zi(i?.type??`sum`,o,a,e)}let h=t.db.with(c,l).select(m).from(C`${C.identifier(o)}`),g=d.map((e,t)=>E(C`${C.identifier(o)}.${C.identifier(e)}`,C`${C.identifier(s)}.${C.identifier(u[t])}`)),_=g.length===1?g[0]:D(...g);h=h.leftJoin(C`${C.identifier(s)}`,_);let v=[...(e.dimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e)}`),...(e.timeDimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e.dimension)}`)];v.length>0&&(h=h.groupBy(...v));let y=n.queryBuilder.buildOrderBy(e,Object.keys(m));return y.length>0&&(h=h.orderBy(...y)),n.queryBuilder.applyLimitAndOffset(h,e)}function Ii(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!Li(e,t,n)}function Li(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)}function Ri(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}function zi(e,t,n,r){switch(e){case`min`:return C`min(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`max`:return C`max(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`avg`:return C`sum(${C`${C.identifier(t)}.${C.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${C`${C.identifier(t)}.${C.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return C`coalesce(sum(${C`${C.identifier(t)}.${C.identifier(n)}`}), 0)`.as(r)}}function Bi(e,t,n,r,i){let a=e.multiFactMerge;if(!a||a.groups.length<2)return null;let o=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],s=Array.from(new Set(o)),c=s.length>0,l=qi(r),u=c&&a.mergeStrategy===`fullJoin`&&!l,d=a.groups.map(e=>{let t=i(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});return u?Wi(t,n,r,a,d,s):Ui(t,n,r,a,d,s,Ki(a.mergeStrategy,c,l))}function Vi(e,t,n){let r={};for(let e of t)r[e]=C`${Ji(n,e)}`.as(e);for(let t of e.groups)for(let e of t.measures)r[e]=C`coalesce(${C`${C.identifier(t.alias)}.${C.identifier(e)}`}, 0)`.as(e);return r}function Hi(e,t,n){if(t.length===0)return C`1 = 1`;let r=t.map(t=>E(n.get(t),C`${C.identifier(e)}.${C.identifier(t)}`));return r.length===1?r[0]:D(...r)}function Ui(e,t,n,r,i,a,o){let s=r.groups[0].alias,c=Vi(r,a,r.groups.map(e=>e.alias)),l=t.db.with(...i).select(c).from(C`${C.identifier(s)}`),u=new Map;for(let e of a)u.set(e,C`${C.identifier(s)}.${C.identifier(e)}`);for(let e=1;e<r.groups.length;e++){let t=r.groups[e].alias,n=Hi(t,a,u);if(l=$(l,o,C`${C.identifier(t)}`,n),a.length>0&&o===`full`)for(let e of a)u.set(e,C`coalesce(${u.get(e)}, ${C`${C.identifier(t)}.${C.identifier(e)}`})`)}let d=n.queryBuilder.buildOrderBy(e,Object.keys(c));return d.length>0&&(l=l.orderBy(...d)),n.queryBuilder.applyLimitAndOffset(l,e)}function Wi(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>C`select ${Gi(e.alias,a)} from ${C.identifier(e.alias)}`),c=C`${C.join(s,C` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=C`${C.identifier(o)}.${C.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=C`coalesce(${C`${C.identifier(e.alias)}.${C.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(C`${C.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>E(C`${C.identifier(o)}.${C.identifier(t)}`,C`${C.identifier(e.alias)}.${C.identifier(t)}`)),n=t.length===1?t[0]:D(...t);d=d.leftJoin(C`${C.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)}function Gi(e,t){let n=t.map(t=>C`${C.identifier(e)}.${C.identifier(t)} as ${C.identifier(t)}`);return C.join(n,C`, `)}function Ki(e,t,n){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:n?`full`:`left`}function qi(e){let t=e.databaseAdapter.getEngineType();return t===`postgres`||t===`duckdb`}function Ji(e,t){if(e.length===1)return C`${C.identifier(e[0])}.${C.identifier(t)}`;let n=e.map(e=>C`${C.identifier(e)}.${C.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=C`coalesce(${r}, ${n[e]})`;return r}var Yi=class{queryBuilder;cteBuilder;databaseAdapter;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=>this.materializeJoin(e)),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}}materializeJoin(e){if(e.junctionTable){let t=Mt(e.joinDef);return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:t.junctionJoins[1].condition,relationship:e.relationship,junctionTable:{table:e.junctionTable.table,alias:e.junctionTable.alias,joinType:e.junctionTable.joinType,joinCondition:t.junctionJoins[0].condition,securitySql:e.joinDef.through?.securitySql,sourceCubeName:e.junctionTable.sourceCubeName}}}return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:jt(e.joinDef),relationship:e.relationship}}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,ungrouped:e.ungrouped}}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=Bi(e,t,n,r,(e,t,n)=>this.build(e,t,n));if(i)return i;let a=Di(e,t,n,r);if(a)return a;let o=ii(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?hi(e):new Map([[e.primaryCube.name,e.primaryCube]]);return wi(e,t,n,c,s,o,gi(e,n,s,li(e,t,n,c,r),o,r),r)}};function Xi(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 Zi=class{dbExecutor;queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;logicalPlanBuilder;planOptimiser;modeRouter;resultCache;filterCachePreloader;rlsSetup;constructor(t,n,r,i){if(this.dbExecutor=t,this.databaseAdapter=t.databaseAdapter,!this.databaseAdapter)throw Error(e.O(`server.errors.dbAdapterRequired`));this.queryBuilder=new An(this.databaseAdapter);let a=new Wn,o=new Kn(this.queryBuilder);this.drizzlePlanBuilder=new Yi(this.queryBuilder,o,this.databaseAdapter),this.comparisonQueryBuilder=new Hr(this.databaseAdapter),this.funnelQueryBuilder=new Ur(this.databaseAdapter),this.flowQueryBuilder=new Wr(this.databaseAdapter),this.retentionQueryBuilder=new Xr(this.databaseAdapter),this.logicalPlanBuilder=new ni(a),this.planOptimiser=i??new ri,this.rlsSetup=r,this.modeRouter=new Mr({comparison:this.comparisonQueryBuilder,funnel:this.funnelQueryBuilder,flow:this.flowQueryBuilder,retention:this.retentionQueryBuilder}),this.resultCache=new Vr(n),this.filterCachePreloader=new mr(this.queryBuilder)}async withRLSContext(t,n){if(!this.rlsSetup)return n();let r=this.dbExecutor.db;if(!r.transaction)throw Error(e.O(`server.errors.rlsRequiresTransactions`));let i=this.rlsSetup;return r.transaction(async e=>{await i(e,t);let r=Object.create(this.dbExecutor);return r.db=e,this.dbExecutor=r,n()})}async execute(t,n,r,i){try{let e=this.modeRouter.resolveMode(n);this.modeRouter.validateForMode(e,t,n);let a=this.resultCache.generateKey(n,r);return await this.resultCache.lookup(a,i?.skipCache??!1)||await this.withRLSContext(r,()=>this.executeQueryByModeWithCache(e,t,n,r,a))}catch(t){if(t instanceof Error){let n=t;for(;n.cause instanceof Error;)n=n.cause;let r=n.message,i=n;throw i.code&&(r+=` [${i.code}]`),i.detail&&(r+=` Detail: ${i.detail}`),i.hint&&(r+=` Hint: ${i.hint}`),t.message=e.O(`server.errors.queryExecutionFailed`,{message:r}),t}throw Error(e.O(`server.errors.queryExecutionUnknown`),{cause:t})}}buildLogicalPlan(e,t,n){let r=new Pt,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new Pt,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(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.resultCache.store(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(t){let n=this.comparisonQueryBuilder.getComparisonTimeDimension(t);if(!n||!n.compareDateRange)throw Error(e.O(`server.errors.noCompareDateRange`));let r=this.comparisonQueryBuilder.normalizePeriods(n.compareDateRange);if(r.length<2)throw Error(e.O(`server.errors.compareDateRangeInvalid`));let i=r.map(e=>this.comparisonQueryBuilder.createPeriodQuery(t,e));return{timeDimension:n,granularity:n.granularity||`day`,periods:r,periodQueries:i}}async executeAnalysisQueryWithCache(e,t){let n=await e();return await this.resultCache.store(t,n),n}async executeFunnelQuery(e,t,n){let r=t.funnel,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.funnelQueryBuilder.buildFunnelQuery(r,e,i);Xi(`funnel query`,a);let o=await a,s=this.funnelQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:s,annotation:c}}async executeFlowQuery(e,t,n){let r=t.flow,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.flowQueryBuilder.buildFlowQuery(r,e,i);Xi(`flow query`,a);let o=await a,s=this.flowQueryBuilder.transformResult(o),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[s],annotation:c}}async executeRetentionQuery(e,t,n){let r=t.retention,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.retentionQueryBuilder.buildRetentionQuery(r,e,i);Xi(`retention query`,a);let o=await a,s=this.retentionQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:s,annotation:c}}async executeStandardQuery(e,t,n,r){let i=new Pt,a=this.createQueryContext(n,i,t);this.filterCachePreloader.preload(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o),c=this.drizzlePlanBuilder.toSemanticQuery(o);this.validateSecurityContext(s,a);let l=this.drizzlePlanBuilder.build(s,c,a);Xi(`query`,l);let u=this.queryBuilder.collectNumericFields(e,t),d={data:pr(await this.dbExecutor.execute(l,u),t,this.databaseAdapter),annotation:qn(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.resultCache.store(r,d),d}createQueryContext(e,t,n){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t,ungrouped:n?.ungrouped}}getOptimiserEngineType(){return this.dbExecutor.getEngineType?.()??`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){return this.dryRunAnalysis(t,n,{has:e=>this.funnelQueryBuilder.hasFunnel(e),invalidConfigKey:`server.errors.invalidFunnelConfig`,getConfig:e=>e.funnel,validate:t=>this.funnelQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.funnelValidationFailed`,build:(t,n)=>this.funnelQueryBuilder.buildFunnelQuery(t,e,n)})}async dryRunFlow(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.flowQueryBuilder.hasFlow(e),invalidConfigKey:`server.errors.invalidFlowConfig`,getConfig:e=>e.flow,validate:t=>this.flowQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.flowValidationFailed`,build:(t,n)=>this.flowQueryBuilder.buildFlowQuery(t,e,n)})}async dryRunRetention(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.retentionQueryBuilder.hasRetention(e),invalidConfigKey:`server.errors.invalidRetentionConfig`,getConfig:e=>e.retention,validate:t=>this.retentionQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.retentionValidationFailed`,build:(t,n)=>this.retentionQueryBuilder.buildRetentionQuery(t,e,n)})}async dryRunAnalysis(t,n,r){if(!r.has(t))throw Error(e.O(r.invalidConfigKey));let i=r.getConfig(t),a=r.validate(i);if(!a.isValid)throw Error(e.O(r.validationFailedKey,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},s=r.build(i,o).toSQL();return{sql:s.sql,params:s.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.modeRouter.resolveMode(t);return this.modeRouter.validateForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new Pt,i=this.createQueryContext(n,r,t);this.filterCachePreloader.preload(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.toSemanticQuery(a),c=this.drizzlePlanBuilder.build(o,s,i).toSQL();return{sql:c.sql,params:c.params}}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeStandardQuery(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeAnalysisQueryWithCache(()=>this.executeFunnelQuery(t,n,r),i),flow:()=>this.executeAnalysisQueryWithCache(()=>this.executeFlowQuery(t,n,r),i),retention:()=>this.executeAnalysisQueryWithCache(()=>this.executeRetentionQuery(t,n,r),i)}[At(e)]()}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)}[At(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}},Qi=[`year`,`quarter`,`month`,`week`,`day`,`hour`];function $i(e,t){return t.includes(`.`)?t:`${e}.${t}`}function ea(e){let t=Object.keys(e.measures),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.measures[i],o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>$i(e.name,t))),n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o}}return n}function ta(e){let t=Object.keys(e.dimensions),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.dimensions[i],o=a.type===`time`?a.granularities||Qi:void 0;n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,granularities:o}}return n}function na(e,t,n){let r=[];if(!e.joins)return r;for(let[,i]of Object.entries(e.joins)){let e=F(i.targetCube,t);e&&r.push({targetCube:e.name,relationship:i.relationship,joinFields:i.on.map(e=>({sourceField:n(e.source),targetField:n(e.target)}))})}return r}function ra(e){let t=[];if(!e.hierarchies)return t;for(let[,n]of Object.entries(e.hierarchies))t.push({name:n.name,title:n.title||n.name,cubeName:e.name,levels:n.levels.map(t=>$i(e.name,t))});return t}var ia=class{cubes=new Map;metadataCache;cacheConfig;rlsSetup;planOptimiser;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,this.planOptimiser=e?.planOptimiser}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(e.O(`server.errors.dbNotConfigured`));return Ot(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new Zi(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup,this.planOptimiser)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.S(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new J(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let t=[];for(let[n,r]of this.cubes)if(r.joins)for(let[i,a]of Object.entries(r.joins))typeof a.targetCube==`string`&&!this.cubes.has(a.targetCube)&&t.push(e.O(`server.errors.cubeRefUnresolved`,{cubeName:n,joinName:i,targetCube:a.targetCube}));if(t.length>0)throw Error(e.O(`server.errors.unresolvedCubeRefs`,{details:t.map(e=>` - ${e}`).join(`
165
+ `)}))}validateCalculatedMeasures(t){let n=[];for(let[r,i]of Object.entries(t.measures))if(i.type===`calculated`){if(!i.calculatedSql){n.push(e.O(`server.validation.calculatedMeasure.mustHaveCalculatedSql`,{cubeName:t.name,fieldName:r}));continue}let a=Dn(i.calculatedSql);if(!a.isValid){n.push(e.O(`server.validation.calculatedMeasure.invalidSyntax`,{cubeName:t.name,fieldName:r,errors:a.errors.join(`, `)}));continue}let o=new Map(this.cubes);o.set(t.name,t);let s=new J(o);try{s.validateDependencies(t)}catch(e){n.push(e instanceof Error?e.message:String(e))}}if(n.length===0){let r=new Map(this.cubes);r.set(t.name,t);let i=new J(r);i.buildGraph(t);let a=i.detectCycle();a&&n.push(e.O(`server.validation.calculatedMeasure.circularDependency`,{cycle:a.join(` -> `)}))}if(n.length>0)throw Error(e.O(`server.errors.calculatedMeasureValidation`,{cubeName:t.name,details:n.join(`
166
+ `)}))}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.cubes.get(t))throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(){return this.metadataCache||=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}generateCubeMetadata(e){let t=ea(e),n=ta(e),r=na(e,this.cubes,e=>this.getColumnName(e)),i=ra(e);return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:t,dimensions:n,segments:[],relationships:r.length>0?r:void 0,hierarchies:i.length>0?i:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t);if(!i)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return gr(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ia}});