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
@@ -1,166 +0,0 @@
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 O(...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 ce=(e,t)=>C`${e} > ${T(t,e)}`,k=(e,t)=>C`${e} >= ${T(t,e)}`,le=(e,t)=>C`${e} < ${T(t,e)}`,A=(e,t)=>C`${e} <= ${T(t,e)}`;function ue(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 de(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 fe(e){return C`${e} is null`}function pe(e){return C`${e} is not null`}function me(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 he(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 ge(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 _e(e){return C`${e} asc`}function ve(e){return C`${e} desc`}function ye(e){return C`count(${e||C.raw(`*`)})`.mapWith(Number)}function be(e){return C`count(distinct ${e})`.mapWith(Number)}function xe(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 P(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 Ve(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function He(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=We(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/);P(t.stack,t.operations,i,a)}function Ue(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,planningTime:void 0,executionTime:void 0,totalCost:void 0,stack:[]};for(let t of e)He(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 We(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 F(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 Ge(e){return e&&typeof e==`object`?e:null}function Ke(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ge(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 qe(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ge(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 Je(e){let t=[];for(let n of e){let e=Ge(n);if(!e)continue;let r=e[`QUERY PLAN`]||e[`query plan`]||e.queryplan;typeof r==`string`&&t.push(r)}return t}function Ye(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`rows`in e&&Array.isArray(e.rows)?e.rows:[]}function Xe(e){return/^-?\d+(\.\d+)?$/.test(e)?e.includes(`.`)?parseFloat(e):parseInt(e,10):!isNaN(parseFloat(e))&&isFinite(parseFloat(e))?parseFloat(e):e}function Ze(e){switch(typeof e){case`number`:return e;case`bigint`:return Number(e);case`object`:return Qe(e);case`string`:return Xe(e);default:return e}}function Qe(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 $e=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=Ye(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:Ze(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 Ue(Je(Ye(await this.db.execute(C`${C.raw(r)} ${F(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=Ye(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 et(e,t){return new $e(e,t,`postgres`)}function tt(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 nt(e,t){let n=[],r=[],i=!1,a=0;for(let t of e){let e=tt(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 rt=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 nt(Ke(await this.db.execute(C`${C.raw(r)} ${F(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 it(e,t){return new rt(e,t,`mysql`)}function at(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 ot(e,t){let n=[],r=[],i=!1,a=new Map;for(let t of e){let e=at(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 st=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 ${F(e,t,`question`)}`);else throw Error(`SQLite database instance must have an all() method for EXPLAIN`);return ot(qe(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 ct(e,t){return new st(e,t,`sqlite`)}var lt=class extends rt{getEngineType(){return`singlestore`}};function ut(e,t){return new lt(e,t)}function dt(e,t){if(/^[┌├└│─┐┤┘]+$/.test(e.trim())||/EXPLANATION|QUERY PLAN/i.test(e))return;let n=pt(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=Ve(e);P(t.stack,t.operations,n,r)}function ft(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)dt(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 pt(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 mt=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)} ${F(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 ft(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 ht(e,t){return new mt(e,t,`duckdb`)}function gt(e,t){if(!e.trim())return;let n=vt(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=Ve(e);P(t.stack,t.operations,n,r)}function _t(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)gt(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 vt(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 yt=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)} ${F(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 _t(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function bt(e,t){return new yt(e,t,`databend`)}function xt(e,t){if(!e.trim())return;let n=wt(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=Ct(e);P(t.stack,t.operations,n,r)}function St(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)xt(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 Ct(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function wt(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 Tt=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`)} ${F(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 St(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Et(e,t){return new Tt(e,t,`snowflake`)}function Dt(e,t,n){if(n)switch(n){case`postgres`:return et(e,t);case`mysql`:return it(e,t);case`sqlite`:return ct(e,t);case`singlestore`:return ut(e,t);case`duckdb`:return ht(e,t);case`databend`:return bt(e,t);case`snowflake`:return Et(e,t)}if(e.all&&e.run)return ct(e,t);if(e.execute)return et(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function I(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 Ot(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function L(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 R(e){return e&&typeof e==`object`?C`${C`${e}`}`:e}function kt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function z(e,t){return R(typeof e==`function`?e(t):e)}function B(e,t){return e.type===`time`?z(e.sql,t):typeof e.sql==`function`?e.sql(t):e.sql}function At(e){let t=[];for(let n of e.on){let e=R(n.source),r=R(n.target),i=n.as||E;t.push(i(e,r))}return D(...t)}function jt(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=L(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:o,table:t,condition:D(...i)},{joinType:o,table:t,condition:D(...a)}]}}function V(e){if(`and`in e)return`and:[${e.and.map(V).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(V).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 Mt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var H=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 Nt(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...Nt(n.and)):`or`in n&&n.or?t.push(...Nt(n.or)):`member`in n&&t.push(n);return t}function Pt(e,t){return e.isTimestampInteger()?e.getEngineType()===`sqlite`?Math.floor(t/1e3):t:new Date(t).toISOString()}function U(e,t){return Pt(e,t.getTime())}function Ft(e,t){return typeof t==`number`?new Date(t*(e.getEngineType()===`sqlite`?1e3:1)):new Date(t)}function It(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e.trim())}function Lt(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=It(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 Rt(e,t){if(!t)return null;let n=Lt(t);return n?U(e,n):null}var zt=e=>{let t=new Date(e);return t.setUTCHours(0,0,0,0),t},W=e=>{let t=new Date(e);return t.setUTCHours(23,59,59,999),t},Bt={today:({now:e})=>({start:zt(e),end:W(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:W(e)})},Vt=[{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:W(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:W(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:W(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:W(t)})}];function Ht(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=Bt[n];if(i)return i(r);for(let{re:e,build:t}of Vt){let i=n.match(e);if(i)return t(parseInt(i[1],10),r)}return null}var G=class{databaseAdapter;constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=z(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(k(e,t),A(e,n))}endOfDayValue(e){let t=Ft(this.databaseAdapter,e);return t.setUTCHours(23,59,59,999),U(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:(It(t[1])&&(r=this.endOfDayValue(r)),this.rangeBetween(e,n,r))}buildStringDateRangeCondition(e,t){let n=this.parseRelativeDateRange(t);if(n){let t=U(this.databaseAdapter,n.start),r=U(this.databaseAdapter,n.end);return this.rangeBetween(e,t,r)}let r=this.normalizeDate(t);if(!r)return null;let i=Ft(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,U(this.databaseAdapter,a),U(this.databaseAdapter,o))}parseRelativeDateRange(e){return Ht(e)}normalizeDate(e){return Rt(this.databaseAdapter,e)}},Ut=e=>{let{fieldExpr:t,filteredValues:n,value:r,field:i,databaseAdapter:a,dateTimeBuilder:o}=e;return n.length>1?i?.type===`time`?ue(t,n.map(e=>o.normalizeDate(e)||e)):ue(t,n):n.length===1?E(t,i?.type===`time`&&o.normalizeDate(r)||r):a.buildBooleanLiteral(!1)},Wt=e=>{let{fieldExpr:t,filteredValues:n,value:r}=e;return n.length>1?de(t,n):n.length===1?se(t,r):null},K=e=>({fieldExpr:t,value:n,databaseAdapter:r})=>r.buildStringCondition(t,e,n),Gt=({fieldExpr:e,value:t})=>ce(e,t),Kt=({fieldExpr:e,value:t})=>k(e,t),qt=({fieldExpr:e,value:t})=>le(e,t),Jt=({fieldExpr:e,value:t})=>A(e,t),Yt=({fieldExpr:e})=>pe(e),Xt=({fieldExpr:e})=>fe(e),Zt=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(k(t,o),A(t,s))},Qt=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?le(e,r):null},$t=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?ce(e,r):null},en=({fieldExpr:e,filteredValues:t})=>t.length>=2?D(k(e,t[0]),A(e,t[1])):null,tn=({fieldExpr:e,filteredValues:t})=>t.length>=2?O(le(e,t[0]),ce(e,t[1])):null,nn=({fieldExpr:e,filteredValues:t})=>t.length>0?ue(e,t):null,rn=({fieldExpr:e,filteredValues:t})=>t.length>0?de(e,t):null,an=({fieldExpr:e})=>O(fe(e),E(e,``)),on=({fieldExpr:e})=>D(pe(e),se(e,``)),sn=e=>({fieldExpr:t,filteredValues:n,databaseAdapter:r})=>r.getEngineType()===`postgres`?e(t,n):null,cn={equals:Ut,notEquals:Wt,contains:K(`contains`),notContains:K(`notContains`),startsWith:K(`startsWith`),endsWith:K(`endsWith`),gt:Gt,gte:Kt,lt:qt,lte:Jt,set:Yt,notSet:Xt,inDateRange:Zt,beforeDate:Qt,afterDate:$t,between:en,notBetween:tn,in:nn,notIn:rn,like:K(`like`),notLike:K(`notLike`),ilike:K(`ilike`),regex:K(`regex`),notRegex:K(`notRegex`),isEmpty:an,isNotEmpty:on,arrayContains:sn(me),arrayOverlaps:sn(ge),arrayContained:sn(he)};function ln(e,t){let n=cn[e];return n?n(t):null}function q(e){if(e.length!==0)return e.length===1?e[0]:D(...e)}function J(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 un(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}function dn(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 fn(e,t,n,r){if(!n)return e;let i=n.get(t);if(!i)throw Error(r.cubeNotFound({cubeName:t}));return i}function pn(e,t,n,r,i){if(typeof e==`string`){let[a]=e.split(`.`),o=un(e),s=fn(t,a,i,r).dimensions?.[o];if(!s)throw Error(r.keyDimNotFound({bindingKey:e,cubeName:a,dimName:o}));return z(s.sql,n)}let a=e.find(e=>e.cube===t.name);if(!a)throw Error(r.noMapping({cubeName:t.name}));let o=un(a.dimension),s=fn(t,a.cube,i,r).dimensions?.[o];if(!s)throw Error(r.mappingDimNotFound({dimension:a.dimension,cubeName:a.cube,dimName:o}));return z(s.sql,n)}function mn(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 z(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 z(s.sql,r)}var Y=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 ln(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):O(...i)}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=J(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=B(c,n);return this.buildFilterCondition(l,i.operator,i.values,c,i.dateRange)}},hn=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];function gn(e){return hn.includes(e)}function _n(e){return gn(e.type)&&e.windowConfig?.measure!==void 0}function vn(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}function yn(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}function bn(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(_n(t)){r.push(a);let n=vn(t,e);n&&i.add(n)}else gn(t.type)||n.push(a)}}return{aggregateMeasures:n,postAggWindowMeasures:r,requiredBaseMeasures:i}}function xn(e,t){return bn(e,t).postAggWindowMeasures.length>0}function Sn(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 X=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=this.buildSubgraph(e),n=Sn(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 Cn(t,n){let{cube:r,allCubes:i,resolvedMeasures:a}=n,o=wn(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 wn(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 Tn(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=wn(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 En(e,t){let n=wn(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Z=class e{databaseAdapter;constructor(e){this.databaseAdapter=e}buildResolvedMeasures(e,t,n,r){let i=new Map,a=[],o=[],s=new Set(e),c=new X(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(!X.isCalculatedMeasure(l)){i.push(t);return}a.push(t),this.collectCalculatedDependencies(t,l,s,n,r,o)}}collectCalculatedDependencies(e,t,n,r,i,a){En(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&&X.isCalculatedMeasure(i)&&En(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)||(X.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 Cn(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=En(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 xe(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=z(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 ye(t);case`countDistinct`:return be(t);case`sum`:return xe(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 ye(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?z(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:z(i.sql,t),direction:e.direction};let a=n.measures?.[r];return a&&a.sql?{field:z(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=hn;static isWindowFunction(e){return gn(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 _n(e)}static getWindowBaseMeasure(e,t){return vn(e,t)}static getDefaultWindowOperation(e){return yn(e)}static categorizeForPostAggregation(e,t){return bn(e,t)}static hasPostAggregationWindows(e,t){return xn(e,t)}},Dn=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(!Z.isPostAggregationWindow(e))return!1;let r=Z.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 z(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)}},On=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(e,this.dateTimeBuilder),this.groupByBuilder=new Dn(this.dateTimeBuilder),this.measureBuilder=new Z(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,n){let r={},i=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,a]=e.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a];r[e]=C`${z(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=ye()),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=Mt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){i.push(r);return}}let c=s.dimensions[o],l=z(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?O(...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=V(e),n=a.filterCache.get(t);if(n)return n}let c=s?z(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`?ve(C.identifier(t)):_e(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(_e(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)}},kn=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=I(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=I(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)}`:R(i.source),a=n?C`${C.identifier(n)}.${C.identifier(i.target.name)}`:R(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})}},An=class{cache=new WeakMap;get(e){let t=this.cache.get(e);return t||(t=new kn(e),this.cache.set(e,t)),t}};function jn(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)Mn(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}function Mn(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)Mn(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}var Nn=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=jn(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?Ot(r.relationship):r.relationship;if(a===`belongsToMany`&&r.through){let i=L(`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=L(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=I(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}};function Pn(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 Fn(e,t){return e.joinDef.relationship===`belongsToMany`&&e.joinDef.through?Pn(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 In(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 Ln(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(e&&e.name===t)return r}return null}function Rn(e,t,n){let r=Ln(t,n,e);if(r)return{sourceCube:t,joinDef:r};let i=e.get(n);if(i){let n=Ln(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=Ln(r,n,e);if(i)return{sourceCube:r,joinDef:i}}return null}function zn(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)Mn(t,n);n.delete(t)}return n}var Bn=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}=bn(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:Fn(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 Rn(e,t,n.name)}analyzeJoinPathToPrimary(e,t,n,r){let i=this.resolverCache.get(e),a=jn(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?Ot(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=zn(t,e.name);if(!e.joins)return r;for(let[,t]of Object.entries(e.joins)){let e=I(t.targetCube,n);if(!e)continue;let a=e.name;i.has(a)&&r.push({targetCubeName:a,joinKeys:In(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)}}},Vn=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=I(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}},Hn=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?jn(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?Ot(e.joinDef.relationship):e.joinDef.relationship,n=L(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.`}}},Un=class{resolverCache=new An;joinPlanner=new Nn(this.resolverCache);ctePlanner=new Bn(this.resolverCache,new Vn);reporter=new Hn(this.resolverCache);analyzeCubeUsage(e){return jn(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 Wn(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 Gn=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=Wn(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(z(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=Wn(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=Wn(n,r),n=n.where(e),C`EXISTS ${n}`}}};function Kn(e,t){let n=qn(e);return{measures:Yn(t,n),dimensions:Xn(t,n),segments:{},timeDimensions:Zn(t,n)}}function qn(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 Jn(e,t,n){return e.find(e=>e?.name===t)?.dimensions?.[n]}function Yn(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 Xn(e,t){let n={};if(!e.dimensions)return n;for(let r of e.dimensions){let[e,i]=r.split(`.`),a=Jn(t,e,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.timeDimensions)return n;for(let r of e.timeDimensions){let[e,i]=r.dimension.split(`.`),a=Jn(t,e,i);a&&(n[r.dimension]={title:a.title||i,shortTitle:a.title||i,type:a.type,granularity:r.granularity})}return n}function Qn(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 $n=1e4;function er(e,t,n){let r=[],i=tr(new Date(e),n),a=tr(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=nr(i,n);return r}function tr(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 nr(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 rr(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:tr(n,t).toISOString()}function ir(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function ar(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,dimensions:a}=t,o=er(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 ${$n}-bucket limit. Returning unfilled data.`),e;let s=or(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??sr(i,e??null,t))}}return c}function or(e,t,n,r){let i=new Map;for(let a of e){let e=ir(a,r),o=rr(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 sr(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 cr(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=Qn(e);if(t)return[t.start,t.end];let n=new Date(e);return isNaN(n.getTime())?null:[n,n]}function lr(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||ur(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=cr(e.dateRange)||dr(e.dimension,t.filters);if(!r)continue;let a={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:i,measures:n,dimensions:o};s=ar(s,a)}return s}function ur(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=ur(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=ur(e,n.or);if(t)return t}}return null}function dr(e,t){let n=ur(e,t);if(!n)return null;if(n.dateRange){let e=cr(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=Qn(r[0]);return e?[e.start,e.end]:cr(r)}return r.length>=2?cr(r):null}function fr(e,t,n){return lr(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 pr=class{queryBuilder;constructor(e){this.queryBuilder=e}preload(e,t,n,r){if(e.filters&&e.filters.length>0)for(let i of Nt(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=V(e);if(t.has(i))return;let a=this.resolveMemberDimension(e.member,n);if(!a||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))return;let o=B(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=Mt(e.dimension,e.dateRange);if(t.has(i))return;let a=this.resolveMemberDimension(e.dimension,n);if(!a)return;let o=z(a.sql,r),s=this.queryBuilder.buildDateRangeCondition(o,e.dateRange);s&&t.set(i,s)}};function mr(t){return e.C(t)}function hr(t,n){let r=[],i=mr(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 gr(i[0],n,t,r),{isValid:r.length===0,errors:r};let a=new Set;if(xr(n,t,r,a),Sr(n,t,r,a),Cr(n,t,r,a),n.filters)for(let e of n.filters)kr(e,t,r,a);return a.size===0&&r.push(e.O(`server.validation.query.mustReferenceAtLeastOneCube`)),n.ungrouped&&Er(n,t,r,a),{isValid:r.length===0,errors:r}}function gr(e,t,n,r){e!==`comparison`&&(e===`funnel`?_r(t,n,r):e===`flow`?vr(t,n,r):e===`retention`&&yr(t,n,r))}function _r(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 vr(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 yr(t,n,r){let i=t.retention,a=Ar(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 br(e,t,n){return e===t?`. Did you mean one of: ${n.slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``}function xr(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=br(o,t,Object.keys(s.measures));r.push(e.O(`server.validation.query.measureNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function Sr(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=br(o,t,Object.keys(s.dimensions));r.push(e.O(`server.validation.query.dimensionNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function Cr(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 wr=new Set([`count`,`countDistinct`,`countDistinctApprox`,`calculated`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`]),Tr=[`sum`,`avg`,`min`,`max`,`number`];function Er(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`)),Dr(t,n,r),Or(n,r,i)}function Dr(e,t,n){if(e.measures)for(let r of e.measures){let[e,i]=r.split(`.`),a=t.get(e)?.measures[i];a&&(wr.has(a.type)&&n.push(`Measure '${r}' has type '${a.type}' which is incompatible with ungrouped queries. Only ${Tr.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 Or(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=I(o.targetCube,e);i&&n.has(i.name)&&t.push(`Ungrouped queries are incompatible with hasMany relationships (${r} → ${a} is hasMany)`)}}}function kr(t,n,r,i){if(`and`in t||`or`in t){let e=t.and||t.or||[];for(let t of e)kr(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 Ar(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var jr=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=hr(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(`, `)}))}})[kt(t)]()}};function Mr(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=Nr(e),a=`${r}query:${zr(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=zr(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(Rr(t)));a+=`:ctx:${e}`}return a}function Nr(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?Q(e.filters):void 0,timeDimensions:e.timeDimensions?Lr(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?Rr(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?Pr(e.funnel):void 0,flow:e.flow?Fr(e.flow):void 0,retention:e.retention?Ir(e.retention):void 0}}function Pr(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)?Q(e.filter):Q([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 Fr(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)?Q(e.startingStep.filter):Q([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function Ir(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)?Q(e.cohortFilters):Q([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?Q(e.activityFilters):Q([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function Q(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:Q(e.and)};if(`or`in e&&e.or)return{or:Q(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 Lr(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 Rr(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Rr):Object.keys(e).sort().reduce((t,n)=>(t[n]=Rr(e[n]),t),{})}function zr(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 Br=class{cacheConfig;constructor(e){this.cacheConfig=e}generateKey(e,t){if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)return Mr(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`)}}},Vr=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new G(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})}},Hr=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(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 kn(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=J(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 kn(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 pn(e.bindingKey,t,n,dn(`server.errors.funnel`))}resolveTimeDimension(e,t,n){return mn(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=J(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 kn(n).findPath(t.name,i);if(!e||e.length===0)return null}let c=s.dimensions?.[a];if(!c)return null;let l=B(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(q(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(q(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=q(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)}},Ur=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(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 pn(e.bindingKey,t,n,dn(`server.errors.flow`))}resolveTimeDimension(e,t,n){return mn(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 z(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=J(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=B(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(q(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=q(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=q(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 Wr(e){return Array.isArray(e)}function Gr(e){return typeof e==`object`&&!!e&&`cube`in e}function Kr(e){if(Gr(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 qr(e){if(Gr(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 Jr={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})},Yr=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(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=Kr(t.timeDimension),a=qr(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(Wr(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=un(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=Kr(t.timeDimension),a=qr(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=z(s.sql,r),l=pn(t.bindingKey,o,r,Jr,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=z(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=B(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(q(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(q(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)}},Xr=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 _=xn(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:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t,u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,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}))}buildMeasureRefs(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:this.toCubeRef(a),localName:i}}):[]}buildDimensionRefs(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildTimeDimensionRefs(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:this.toCubeRef(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},Zr=class{name=`identity`;optimise(e){return e}};function Qr(e,t,n,r){let i=$r(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),ei(c,s))}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function $r(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 ei(e,t){if(e.downstreamJoinKeys)for(let n of e.downstreamJoinKeys)t.set(n.targetCubeName,{cteAlias:e.cteAlias,joinKeys:n.joinKeys})}function ti(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Z.isPostAggregationWindow(u))continue;let d=Z.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?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=ni(u,_,n,r,l,t,a);v&&(e[o]=C`${v}`.as(o))}}function ni(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:z(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?z(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Z.getDefaultWindowOperation(e.type)){case`difference`:return 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 ri(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)ii(a,o,t,n,r,i),oi(a,o,r);return ti(a,e,t,n,r,i),a}function ii(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):ai(u,d,t,n,i,a),e[s]=C`${f}`.as(s)}}function ai(e,t,n,r,i,a){let o=n.cteReason===`fanOutPrevention`,s=si(n,r,i),c=o||s;switch(e.type){case`count`:case`countDistinct`:case`sum`:return c?j(t):xe(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):xe(t)}}function oi(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 si(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&&ci(e.sourceColumnObj,t,n))}function ci(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 li(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 ui(e,t,n,r,i,a){let o=[],s=di(t,n,r,i);s=fi(s,n.joins);let c=new Set,l=pi(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=mi(s,n,e,i,t,o),s=_i(s,n,e,i,t,a,c))}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function di(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 fi(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 pi(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 mi(e,t,n,r,i,a){let o=t.junctionTable;if(!o)return e;let s=hi(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 hi(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 gi(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 _i(e,t,n,r,i,a,o){let{joinTarget:s,joinCondition:c,securityCondition:l,joinCubeBase:u}=gi(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)),fi(n,u?.joins)}catch{return e}}function vi(e,t,n,r,i,a,o,s){let c=yi(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 bi(l,e,t,n,r,s)}function yi(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 bi(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 xi(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!Ai(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:Mi(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u=i.regularMeasures??[],d=Si(t,n,r,a,o,s,u);if(!d)return null;let f=Ci(e,t,n,r,a,c,d.keysSelections,d.keyGroupBy),p=Ei(t,n,r,o,s,d.multipliedMeasures,l);return p?ki(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 Si(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=z(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=z(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 Ci(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=wi(u,t,n,l);return l.push(...r.queryBuilder.buildWhereConditions(i,t,n)),u=Oi(u,l),s.length>0&&(u=u.groupBy(...s)),n.db.$with(a).as(u)}function wi(e,t,n,r){let i=e;t.junctionTable&&(i=$(i,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),Ti(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 Ti(e,t,n){if(!e)return;let r=e(t.securityContext);Array.isArray(r)?n.push(...r):n.push(r)}function Ei(e,t,n,r,i,a,o){let s=r.sql(t),c=Di(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=Oi(l,u),c.aggGroupBy.length>0&&(l=l.groupBy(...c.aggGroupBy)),t.db.$with(o).as(l)}function Di(e,t,n,r,i){let a={},o=[];for(let t of r){let r=n.dimensions?.[t];if(!r)return null;let i=z(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=z(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 Oi(e,t){return t.length===0?e:e.where(t.length===1?t[0]:D(...t))}function ki(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]=Ni(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]=Ni(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 Ai(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!ji(e,t,n)}function ji(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 Mi(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}function Ni(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 Pi(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=Vi(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?Ri(t,n,r,a,d,s):Li(t,n,r,a,d,s,Bi(a.mergeStrategy,c,l))}function Fi(e,t,n){let r={};for(let e of t)r[e]=C`${Hi(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 Ii(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 Li(e,t,n,r,i,a,o){let s=r.groups[0].alias,c=Fi(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=Ii(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 Ri(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>C`select ${zi(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 zi(e,t){let n=t.map(t=>C`${C.identifier(e)}.${C.identifier(t)} as ${C.identifier(t)}`);return C.join(n,C`, `)}function Bi(e,t,n){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:n?`full`:`left`}function Vi(e){let t=e.databaseAdapter.getEngineType();return t===`postgres`||t===`duckdb`}function Hi(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 Ui=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=jt(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:At(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=Pi(e,t,n,r,(e,t,n)=>this.build(e,t,n));if(i)return i;let a=xi(e,t,n,r);if(a)return a;let o=Qr(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]);return vi(e,t,n,c,s,o,ui(e,n,s,ri(e,t,n,c,r),o,r),r)}};function Wi(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 Gi=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 On(this.databaseAdapter);let a=new Un,o=new Gn(this.queryBuilder);this.drizzlePlanBuilder=new Ui(this.queryBuilder,o,this.databaseAdapter),this.comparisonQueryBuilder=new Vr(this.databaseAdapter),this.funnelQueryBuilder=new Hr(this.databaseAdapter),this.flowQueryBuilder=new Ur(this.databaseAdapter),this.retentionQueryBuilder=new Yr(this.databaseAdapter),this.logicalPlanBuilder=new Xr(a),this.planOptimiser=i??new Zr,this.rlsSetup=r,this.modeRouter=new jr({comparison:this.comparisonQueryBuilder,funnel:this.funnelQueryBuilder,flow:this.flowQueryBuilder,retention:this.retentionQueryBuilder}),this.resultCache=new Br(n),this.filterCachePreloader=new pr(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 H,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 H,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);Wi(`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);Wi(`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);Wi(`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 H,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);Wi(`query`,l);let u=this.queryBuilder.collectNumericFields(e,t),d={data:fr(await this.dbExecutor.execute(l,u),t,this.databaseAdapter),annotation:Kn(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 H,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)}[kt(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)}[kt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}},Ki=[`year`,`quarter`,`month`,`week`,`day`,`hour`];function qi(e,t){return t.includes(`.`)?t:`${e}.${t}`}function Ji(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=>qi(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 Yi(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||Ki: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 Xi(e,t,n){let r=[];if(!e.joins)return r;for(let[,i]of Object.entries(e.joins)){let e=I(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 Zi(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=>qi(e.name,t))});return t}var Qi=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 Dt(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new Gi(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 X(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=Tn(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 X(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 X(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=Ji(e),n=Yi(e),r=Xi(e,this.cubes,e=>this.getColumnName(e)),i=Zi(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 hr(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Qi}});