drizzle-cube 0.4.48 → 0.4.49
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.
- package/dist/adapters/{compiler-B_Nl7ZZb.js → compiler-BXfrvebp.js} +3 -2
- package/dist/adapters/{compiler-CdL3ksb3.cjs → compiler-CPE-YZfe.cjs} +1 -1
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +2 -2
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +2 -2
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +1 -1
- package/dist/adapters/{mcp-transport-CG5Aw2cs.js → mcp-transport-BhPqU0Ft.js} +24 -12
- package/dist/adapters/{mcp-transport-DlFvZl2c.cjs → mcp-transport-Kk_HTCeR.cjs} +1 -1
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +2 -2
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.js +3 -2
- package/package.json +1 -1
|
@@ -3471,8 +3471,9 @@ var Q = class e {
|
|
|
3471
3471
|
let a = [], o = e instanceof Map ? e : new Map([[e.name, e]]), s = /* @__PURE__ */ new Set();
|
|
3472
3472
|
if (t.filters && t.filters.length > 0) for (let e of t.filters) {
|
|
3473
3473
|
if (i && "member" in e) {
|
|
3474
|
-
let [t] = e.member.split(".");
|
|
3475
|
-
if (
|
|
3474
|
+
let [t] = e.member.split("."), n = o.has(t);
|
|
3475
|
+
if (r?.preAggregationCTEs && r.preAggregationCTEs.some((e) => e.cube.name === t)) continue;
|
|
3476
|
+
if (n && i.has(t) && !s.has(t)) {
|
|
3476
3477
|
let e = i.get(t);
|
|
3477
3478
|
a.push(...e), s.add(t);
|
|
3478
3479
|
continue;
|
|
@@ -59,7 +59,7 @@ const e=require(`./utils-CyBt-as9.cjs`);var t=Symbol.for(`drizzle:entityKind`);f
|
|
|
59
59
|
ORDER BY table_name, index_name
|
|
60
60
|
`);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:typeof e.columns==`string`?e.columns.split(`,`):[],is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Be(e,t){return new ze(e,t,`duckdb`)}function Ve(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=Ue(t);if(e){(e.type.includes(`TableScan`)||e.type.includes(`SCAN`))&&(i=!0),e.type.includes(`IndexScan`)&&e.index&&r.push(e.index),n.length===0&&e.estimatedCost!==void 0&&(a=e.estimatedCost);let s=He(t);for(;o.length>0&&o[o.length-1].indent>=s;)o.pop();if(o.length===0)n.push(e);else{let t=o[o.length-1].op;t.children||=[],t.children.push(e)}o.push({indent:s,op:e})}}return{operations:n,summary:{database:`databend`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
|
|
61
61
|
`),sql:t}}function He(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function Ue(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||/^(filters|table|estimated rows|output columns|push downs):/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var We=class extends H{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(D`${D.raw(r)} ${D.raw(e.replace(/\$(\d+)/g,(e,n)=>{let r=t[parseInt(n,10)-1];return r===null?`NULL`:typeof r==`number`?String(r):typeof r==`boolean`?r?`TRUE`:`FALSE`:r instanceof Date?`'${r.toISOString()}'`:`'${String(r).replace(/'/g,`''`)}'`}))}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return Ve(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function Ge(e,t){return new We(e,t,`databend`)}function Ke(e,t){let n=[],r=[],i=!1,a,o=[];for(let t of e){if(!t.trim())continue;let e=Je(t);if(e){(e.type.includes(`TableScan`)||e.type.includes(`SCAN`))&&(i=!0),n.length===0&&e.estimatedCost!==void 0&&(a=e.estimatedCost);let r=qe(t);for(;o.length>0&&o[o.length-1].indent>=r;)o.pop();if(o.length===0)n.push(e);else{let t=o[o.length-1].op;t.children||=[],t.children.push(e)}o.push({indent:r,op:e})}}return{operations:n,summary:{database:`snowflake`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:e.join(`
|
|
62
|
-
`),sql:t}}function qe(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function Je(e){let t=e.replace(/^[\s\d:]*->/,``).trim();if(!t||/^(GlobalStats|partitions|bytes):/i.test(t)||/^\w+=\d+/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Ye=class extends H{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(D`${D.raw(`EXPLAIN`)} ${D.raw(e.replace(/\?/g,()=>{let e=t.shift();return e===null?`NULL`:typeof e==`number`?String(e):typeof e==`boolean`?e?`TRUE`:`FALSE`:e instanceof Date?`'${e.toISOString()}'`:`'${String(e).replace(/'/g,`''`)}'`}))}`),i=[];if(Array.isArray(r)){for(let e of r)if(e&&typeof e==`object`){let t=e.content||e[`QUERY PLAN`]||e.plan||Object.values(e)[0];typeof t==`string`&&i.push(t)}}return Ke(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Xe(e,t){return new Ye(e,t,`snowflake`)}function Ze(e,t,n){if(n)switch(n){case`postgres`:return Te(e,t);case`mysql`:return ke(e,t);case`sqlite`:return Ne(e,t);case`singlestore`:return Fe(e,t);case`duckdb`:return Be(e,t);case`databend`:return Ge(e,t);case`snowflake`:return Xe(e,t)}if(e.all&&e.run)return Ne(e,t);if(e.execute)return Te(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function U(e,t){return typeof e==`string`?t?t.get(e)||(console.warn(`[drizzle-cube] Cannot resolve cube reference '${e}': no cube with that name is registered. Registered cubes: ${Array.from(t.keys()).join(`, `)||`(none)`}. Join will be skipped.`),null):(console.warn(`[drizzle-cube] Cannot resolve string cube reference '${e}': no cube registry provided. Join will be skipped.`),null):typeof e==`function`?e():e}function Qe(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function $e(e,t){if(t)return t;switch(e){case`belongsTo`:return`inner`;case`hasOne`:return`left`;case`hasMany`:return`left`;case`belongsToMany`:return`left`;default:return`left`}}function et(e){return e&&typeof e==`object`?D`${D`${e}`}`:e}function tt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function W(e,t){return et(typeof e==`function`?e(t):e)}function nt(e,t){if(e.relationship!==`belongsToMany`||!e.through)throw Error(`expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration`);let{table:n,sourceKey:r,targetKey:i,securitySql:a}=e.through,o=[];for(let e of r){let t=e.as||M;o.push(t(e.source,e.target))}let s=[];for(let e of i){let t=e.as||M;s.push(t(e.source,e.target))}let c;if(a){let e=a(t);c=Array.isArray(e)?e:[e]}let l=$e(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:l,table:n,condition:P(...o)},{joinType:l,table:n,condition:P(...s)}],junctionSecurityConditions:c}}function G(e){if(`and`in e)return`and:[${e.and.map(G).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(G).sort().join(`,`)}]`;let t=e,n=JSON.stringify(Array.isArray(t.values)?[...t.values].sort():t.values),r=t.dateRange?`:dr:${JSON.stringify(t.dateRange)}`:``;return`${t.member}:${t.operator}:${n}${r}`}function rt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var K=class{cache=new Map;stats={hits:0,misses:0};getOrBuild(e,t){let n=this.cache.get(e);if(n!==void 0)return this.stats.hits++,n;let r=t();return r&&this.cache.set(e,r),this.stats.misses++,r}has(e){return this.cache.has(e)}get(e){let t=this.cache.get(e);return t!==void 0&&this.stats.hits++,t}preload(e){for(let{key:t,sql:n}of e)this.cache.has(t)||this.cache.set(t,n)}set(e,t){this.cache.set(e,t)}getStats(){return{...this.stats,cacheSize:this.cache.size}}clear(){this.cache.clear(),this.stats={hits:0,misses:0}}};function it(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...it(n.and)):`or`in n&&n.or?t.push(...it(n.or)):`member`in n&&t.push(n);return t}function at(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=ot(e),a=`${r}query:${dt(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=dt(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(J(t)));a+=`:ctx:${e}`}return a}function ot(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?q(e.filters):void 0,timeDimensions:e.timeDimensions?ut(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?J(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?st(e.funnel):void 0,flow:e.flow?ct(e.flow):void 0,retention:e.retention?lt(e.retention):void 0}}function st(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?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 ct(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?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 lt(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?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 ut(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function J(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(J):Object.keys(e).sort().reduce((t,n)=>(t[n]=J(e[n]),t),{})}function dt(e){let t=2166136261,n=Math.min(e.length,65536);for(let r=0;r<n;r++)t^=e.charCodeAt(r),t=t*16777619>>>0;return t.toString(16).padStart(8,`0`)}var Y=class{constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=W(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof S?r:D`${r}`}buildDateRangeCondition(e,t){if(!t)return null;if(Array.isArray(t)&&t.length>=2){let n=this.normalizeDate(t[0]),r=this.normalizeDate(t[1]);if(!n||!r)return null;if(typeof t[1]==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(t[1].trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return P(I(e,n),L(e,r))}if(typeof t==`string`){let n=this.parseRelativeDateRange(t);if(n){let t,r;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(t=Math.floor(n.start.getTime()/1e3),r=Math.floor(n.end.getTime()/1e3)):(t=n.start.getTime(),r=n.end.getTime()):(t=n.start.toISOString(),r=n.end.toISOString()),P(I(e,t),L(e,r))}let r=this.normalizeDate(t);if(!r)return null;let i=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);o.setUTCHours(23,59,59,999);let s,c;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(s=Math.floor(a.getTime()/1e3),c=Math.floor(o.getTime()/1e3)):(s=a.getTime(),c=o.getTime()):(s=a.toISOString(),c=o.toISOString()),P(I(e,s),L(e,c))}return null}parseRelativeDateRange(e){let t=new Date,n=e.toLowerCase().trim(),r=t.getUTCFullYear(),i=t.getUTCMonth(),a=t.getUTCDate(),o=t.getUTCDay();if(n===`today`){let e=new Date(t);e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`yesterday`){let e=new Date(t);e.setUTCDate(a-1),e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCDate(a-1),n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`this week`){let e=o===0?-6:1-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`this month`)return{start:new Date(Date.UTC(r,i,1,0,0,0,0)),end:new Date(Date.UTC(r,i+1,0,23,59,59,999))};if(n===`this quarter`){let e=Math.floor(i/3);return{start:new Date(Date.UTC(r,e*3,1,0,0,0,0)),end:new Date(Date.UTC(r,e*3+3,0,23,59,59,999))}}if(n===`this year`)return{start:new Date(Date.UTC(r,0,1,0,0,0,0)),end:new Date(Date.UTC(r,11,31,23,59,59,999))};let s=n.match(/^last\s+(\d+)\s+days?$/);if(s){let e=parseInt(s[1],10),n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}let c=n.match(/^last\s+(\d+)\s+weeks?$/);if(c){let e=parseInt(c[1],10)*7,n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last week`){let e=o===0?-13:-6-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last month`)return{start:new Date(Date.UTC(r,i-1,1,0,0,0,0)),end:new Date(Date.UTC(r,i,0,23,59,59,999))};if(n===`last quarter`){let e=Math.floor(i/3),t=e===0?3:e-1,n=e===0?r-1:r;return{start:new Date(Date.UTC(n,t*3,1,0,0,0,0)),end:new Date(Date.UTC(n,t*3+3,0,23,59,59,999))}}if(n===`last year`)return{start:new Date(Date.UTC(r-1,0,1,0,0,0,0)),end:new Date(Date.UTC(r-1,11,31,23,59,59,999))};if(n===`last 12 months`){let e=new Date(Date.UTC(r,i-11,1,0,0,0,0)),n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}let l=n.match(/^last\s+(\d+)\s+months?$/);if(l){let e=parseInt(l[1],10),n=new Date(Date.UTC(r,i-e+1,1,0,0,0,0)),a=new Date(t);return a.setUTCHours(23,59,59,999),{start:n,end:a}}let u=n.match(/^last\s+(\d+)\s+years?$/);if(u){let e=parseInt(u[1],10),n=new Date(Date.UTC(r-e,0,1,0,0,0,0)),i=new Date(t);return i.setUTCHours(23,59,59,999),{start:n,end:i}}return null}normalizeDate(e){if(!e)return null;if(e instanceof Date)return isNaN(e.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(e.getTime()/1e3):e.getTime():e.toISOString();if(typeof e==`number`){let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t/1e3):t:n.toISOString()}if(typeof e==`string`){if(/^\d{4}-\d{2}-\d{2}$/.test(e.trim())){let t=new Date(e+`T00:00:00Z`);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}},X=class{constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(e,t,n,r,i){if(i!==void 0){if(t!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${t}'. Use explicit date values in the 'values' array for other date operators.`);if(r&&r.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${r.name||`unknown`}' has type '${r.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(e,i)}if(!n||n.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let a=n.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(a.length===0&&![`set`,`notSet`].includes(t))return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=a[0];switch(t){case`equals`:return a.length>1?r?.type===`time`?re(e,a.map(e=>this.dateTimeBuilder.normalizeDate(e)||e)):re(e,a):a.length===1?M(e,r?.type===`time`&&this.dateTimeBuilder.normalizeDate(o)||o):this.databaseAdapter.buildBooleanLiteral(!1);case`notEquals`:return a.length>1?ie(e,a):a.length===1?N(e,o):null;case`contains`:return this.databaseAdapter.buildStringCondition(e,`contains`,o);case`notContains`:return this.databaseAdapter.buildStringCondition(e,`notContains`,o);case`startsWith`:return this.databaseAdapter.buildStringCondition(e,`startsWith`,o);case`endsWith`:return this.databaseAdapter.buildStringCondition(e,`endsWith`,o);case`gt`:return te(e,o);case`gte`:return I(e,o);case`lt`:return ne(e,o);case`lte`:return L(e,o);case`set`:return oe(e);case`notSet`:return ae(e);case`inDateRange`:if(a.length>=2){let t=this.dateTimeBuilder.normalizeDate(a[0]),r=this.dateTimeBuilder.normalizeDate(a[1]);if(t&&r){let i=n[1];if(typeof i==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(i.trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return P(I(e,t),L(e,r))}}return null;case`beforeDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?ne(e,t):null}case`afterDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?te(e,t):null}case`between`:return a.length>=2?P(I(e,a[0]),L(e,a[1])):null;case`notBetween`:return a.length>=2?F(ne(e,a[0]),te(e,a[1])):null;case`in`:return a.length>0?re(e,a):null;case`notIn`:return a.length>0?ie(e,a):null;case`like`:return this.databaseAdapter.buildStringCondition(e,`like`,o);case`notLike`:return this.databaseAdapter.buildStringCondition(e,`notLike`,o);case`ilike`:return this.databaseAdapter.buildStringCondition(e,`ilike`,o);case`regex`:return this.databaseAdapter.buildStringCondition(e,`regex`,o);case`notRegex`:return this.databaseAdapter.buildStringCondition(e,`notRegex`,o);case`isEmpty`:return F(ae(e),M(e,``));case`isNotEmpty`:return P(oe(e),N(e,``));case`arrayContains`:return this.databaseAdapter.getEngineType()===`postgres`?se(e,a):null;case`arrayOverlaps`:return this.databaseAdapter.getEngineType()===`postgres`?le(e,a):null;case`arrayContained`:return this.databaseAdapter.getEngineType()===`postgres`?ce(e,a):null;default:return null}}buildLogicalFilter(e,t,n){if(`and`in e&&e.and){let r=e.and.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:P(...r):null}if(`or`in e&&e.or){let r=e.or.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:F(...r):null}return null}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=e,[i,a]=r.member.split(`.`),o=t.get(i);if(!o)return null;let s=o.dimensions?.[a];if(!s)return null;let c=s.type===`time`?W(s.sql,n):typeof s.sql==`function`?s.sql(n):s.sql;return this.buildFilterCondition(c,r.operator,r.values,s,r.dateRange)}},Z=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=new Map,n=[],r=[];for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}for(let[e,r]of t)r.inDegree===0&&n.push(e);for(;n.length>0;){let e=n.shift();r.push(e);for(let[r,i]of t)i.dependencies.has(e)&&(i.inDegree--,i.inDegree===0&&n.push(r))}if(r.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return r}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function ft(e,t){let{cube:n,allCubes:r,resolvedMeasures:i}=t,a=pt(e),o=new Map;for(let e of a){let{originalRef:t,cubeName:a,fieldName:s}=e,c=a||n.name;if(!r.get(c))throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);let l=`${c}.${s}`,u=i.get(l);if(!u)throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);let d=D`${u()}`;o.set(t,d)}let s=[],c=[],l=0;for(let t of a){let n=`{${t.originalRef}}`,r=e.indexOf(n,l);if(r>=0){s.push(e.substring(l,r));let i=o.get(t.originalRef);i&&c.push(i),l=r+n.length}}if(s.push(e.substring(l)),c.length===0)return D.raw(e);let u=[];for(let e=0;e<s.length;e++)s[e]&&u.push(new x(s[e])),e<c.length&&u.push(c[e]);return D.join(u,D.raw(``))}function pt(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 mt(e){let t=[],n=0;for(let r=0;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n<0)){t.push(`Unmatched closing brace at position ${r}`);break}n>0&&t.push(`Unmatched opening brace in template`),/\{\s*\}/.test(e)&&t.push(`Empty member reference {} found in template`),/\{[^}]*\{/.test(e)&&t.push(`Nested braces are not allowed in member references`);let r=pt(e);for(let e of r){let n=e.cubeName?`${e.cubeName}.${e.fieldName}`:e.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n)||t.push(`Invalid member reference {${e.originalRef}}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`),n.split(`.`).length>2&&t.push(`Invalid member reference {${e.originalRef}}: only one dot allowed (Cube.measure format)`)}return{isValid:t.length===0,errors:t}}function ht(e,t){let n=pt(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Q=class e{constructor(e){this.databaseAdapter=e}buildResolvedMeasures(t,n,r,i){let a=new Map,o=[],s=[],c=new Set(t),l=new Z(n);for(let e of n.values())l.buildGraph(e);let u=[];for(let r of t){let[t,i]=r.split(`.`),a=n.get(t);if(a&&a.measures&&a.measures[i]){let d=a.measures[i];if(e.isPostAggregationWindow(d)){u.push(r);let n=e.getWindowBaseMeasure(d,t);n&&c.add(n);continue}Z.isCalculatedMeasure(d)?(s.push(r),ht(d.calculatedSql,t).forEach(e=>c.add(e)),l.getAllDependencies(r).forEach(e=>{let[t,r]=e.split(`.`),i=n.get(t);if(i&&i.measures[r]){let e=i.measures[r];Z.isCalculatedMeasure(e)&&ht(e.calculatedSql,t).forEach(e=>c.add(e))}})):o.push(r)}}for(let t of c){let[r,i]=t.split(`.`),a=n.get(r);if(a&&a.measures&&a.measures[i]){let n=a.measures[i];if(e.isPostAggregationWindow(n))continue;Z.isCalculatedMeasure(n)?s.includes(t)||s.push(t):o.includes(t)||o.push(t)}}for(let e of o){let[t,o]=e.split(`.`),s=n.get(t),c=s.measures[o];if(i){let t=i(e,c,s);a.set(e,()=>t)}else a.set(e,()=>this.buildMeasureExpression(c,r,s))}if(s.length>0){let e=l.topologicalSort(s);for(let t of e){let[e,i]=t.split(`.`),o=n.get(e),s=o.measures[i];a.set(t,()=>this.buildCalculatedMeasure(s,o,n,a,r))}}return a}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return ft(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=ht(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=D`${D.identifier(n.cteAlias)}.${D.identifier(i)}`,o;switch(t.type){case`count`:case`countDistinct`:case`sum`:o=R(r);break;case`avg`:o=this.databaseAdapter.buildAvg(r);break;case`min`:o=B(r);break;case`max`:o=z(r);break;case`number`:o=R(r);break;default:o=R(r)}a.set(e,()=>o)}}}return this.buildCalculatedMeasure(e,t,r,a,i)}buildHavingMeasureExpression(e,t,n,r,i){if(i&&i.preAggregationCTEs){let a=i.preAggregationCTEs.find(t=>t.cube.name===e);if(a&&a.measures.includes(`${e}.${t}`))if(n.type===`calculated`&&n.calculatedSql){let t=i.primaryCube.name===e?i.primaryCube:i.joinCubes?.find(t=>t.cube.name===e)?.cube;if(!t)throw Error(`Cube ${e} not found in query plan`);let o=new Map([[i.primaryCube.name,i.primaryCube]]);if(i.joinCubes)for(let e of i.joinCubes)o.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(n,t,a,o,r)}else{let e=D`${D.identifier(a.cteAlias)}.${D.identifier(t)}`;switch(n.type){case`count`:case`countDistinct`:case`sum`:return R(e);case`avg`:return this.databaseAdapter.buildAvg(e);case`min`:return B(e);case`max`:return z(e);case`number`:return R(e);default:return R(e)}}}return this.buildMeasureExpression(n,r)}buildMeasureExpression(t,n,r){if(t.type===`calculated`)throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);if(e.isPostAggregationWindow(t))throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!t.sql)throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let i=W(t.sql,n);if(n.ungrouped)return i;if(t.filters&&t.filters.length>0){let e=t.filters.map(e=>{let t=e(n);return t?D`(${t})`:void 0}).filter(Boolean);if(e.length>0){let t=e.length===1?e[0]:P(...e);i=this.databaseAdapter.buildCaseWhen([{when:t,then:i}])}}switch(t.type){case`count`:return fe(i);case`countDistinct`:return pe(i);case`sum`:return R(i);case`avg`:return this.databaseAdapter.buildAvg(i);case`min`:return B(i);case`max`:return z(i);case`number`:return i;case`stddev`:case`stddevSamp`:{let e=t.type===`stddevSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildStddev(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`variance`:case`varianceSamp`:{let e=t.type===`varianceSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildVariance(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`percentile`:case`median`:case`p95`:case`p99`:{let e;switch(t.type){case`median`:e=50;break;case`p95`:e=95;break;case`p99`:e=99;break;default:e=t.statisticalConfig?.percentile??50}let n=this.databaseAdapter.buildPercentile(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:{let e=t.windowConfig||{},a;if(e.partitionBy&&e.partitionBy.length>0&&r){let t=e.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,i=r.dimensions?.[t];return i?W(i.sql,n):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(a=t)}let o;if(e.orderBy&&e.orderBy.length>0&&r){let t=e.orderBy.map(e=>{let t=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=r.dimensions?.[t];if(i)return{field:W(i.sql,n),direction:e.direction};let a=r.measures?.[t];return a&&a.sql?{field:W(a.sql,n),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(o=t)}let s=this.databaseAdapter.buildWindowFunction(t.type,[`rank`,`denseRank`,`rowNumber`].includes(t.type)?null:i,a,o,{offset:e.offset,defaultValue:e.defaultValue,nTile:e.nTile,frame:e.frame});return s===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`NULL`):s}default:return fe(i)}}static WINDOW_FUNCTION_TYPES=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];static isWindowFunction(t){return e.WINDOW_FUNCTION_TYPES.includes(t)}static categorizeMeasures(t,n){let r=[],i=[];for(let a of t){let[t,o]=a.split(`.`),s=n.get(t);if(s?.measures?.[o]){let t=s.measures[o];e.isWindowFunction(t.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(t,n){let{windowMeasures:r}=e.categorizeMeasures(t,n);return r.length>0}static isPostAggregationWindow(t){return e.isWindowFunction(t.type)&&t.windowConfig?.measure!==void 0}static getWindowBaseMeasure(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}static getDefaultWindowOperation(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}static categorizeForPostAggregation(t,n){let r=[],i=[],a=new Set;for(let o of t){let[t,s]=o.split(`.`),c=n.get(t);if(c?.measures?.[s]){let n=c.measures[s];if(e.isPostAggregationWindow(n)){i.push(o);let r=e.getWindowBaseMeasure(n,t);r&&a.add(r)}else e.isWindowFunction(n.type)||r.push(o)}}return{aggregateMeasures:r,postAggWindowMeasures:i,requiredBaseMeasures:a}}static hasPostAggregationWindows(t,n){let{postAggWindowMeasures:r}=e.categorizeForPostAggregation(t,n);return r.length>0}},gt=class{constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s,l=!1;for(let e of t.measures||[]){let[t,n]=e.split(`.`),r=a.get(t);if(r&&r.measures&&r.measures[n]){let e=r.measures[n];if(this.isAggregateFunctionType(e.type)||e.type===`calculated`){l=!0;break}if(Q.isPostAggregationWindow(e)){let n=Q.getWindowBaseMeasure(e,t);if(n){let[e,t]=n.split(`.`),r=a.get(e)?.measures?.[t];if(r&&this.isAggregateFunctionType(r.type)){l=!0;break}}}}}if(!l&&!c)return[];if(t.dimensions)for(let e of t.dimensions){let[t,o]=e.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let e=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(e){let t=e.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj)i.push(t.sourceColumnObj);else{let t=D`${D.identifier(e.cteAlias)}.${D.identifier(o)}`;i.push(t)}}else{let e=s.dimensions[o],t=W(e.sql,n);i.push(t)}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,o]=e.dimension.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let a=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(a){let t=a.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj){let r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,n);i.push(r)}else{let e=D`${D.identifier(a.cteAlias)}.${D.identifier(o)}`;i.push(e)}}else{let t=s.dimensions[o],r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);i.push(r)}}}return i}},_t=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new Y(e),this.filterBuilder=new X(e,this.dateTimeBuilder),this.groupByBuilder=new gt(this.dateTimeBuilder),this.measureBuilder=new Q(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,n){let r={},i=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,a]=e.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a];r[e]=D`${W(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]=D`${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]=D`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=fe()),r}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters){if(i&&`member`in e){let[t]=e.member.split(`.`);if(o.has(t)&&i.has(t)&&!s.has(t)){let e=i.get(t);a.push(...e),s.add(t);continue}else if(s.has(t))continue}let t=this.processFilter(e,o,n,`where`,r);t&&a.push(t)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),s=o.get(t);if(s&&s.dimensions[i]&&e.dateRange){if(r?.preAggregationCTEs&&r.preAggregationCTEs.some(e=>e.cube.name===t))continue;if(n.filterCache){let t=rt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){a.push(r);continue}}let o=s.dimensions[i],c=W(o.sql,n),l=this.buildDateRangeCondition(c,e.dateRange);l&&a.push(l)}}return a}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(e,t,n,r,i){if(`and`in e||`or`in e){let a=e;if(a.and){let e=a.and.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?P(...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?F(...e):null}}let a=e,[o,s]=a.member.split(`.`),c=t.get(o);if(!c)return null;let l=c.dimensions[s],u=c.measures[s],d=l||u;if(!d)return null;if(r===`where`&&l){if(i?.preAggregationCTEs&&i.preAggregationCTEs.some(e=>e.cube.name===o))return null;let t=l.type===`time`;if(n.filterCache){let t=G(e),r=n.filterCache.get(t);if(r)return r}let r=t?W(l.sql,n):typeof l.sql==`function`?l.sql(n):l.sql;return this.buildFilterCondition(r,a.operator,a.values,d,a.dateRange)}else if(r===`where`&&u)return null;else if(r===`having`&&u){let e=this.buildHavingMeasureExpression(o,s,u,n,i);return this.buildFilterCondition(e,a.operator,a.values,d,a.dateRange)}return null}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(e,t){let n=[],r=t||[...e.measures||[],...e.dimensions||[],...e.timeDimensions?.map(e=>e.dimension)||[]];if(e.order&&Object.keys(e.order).length>0)for(let[t,i]of Object.entries(e.order)){if(!r.includes(t))throw Error(`Cannot order by '${t}': field is not selected in the query`);let e=i===`desc`?de(D.identifier(t)):ue(D.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(ue(D.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)}},vt=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=U(r.targetCube,this.cubes);if(!n)continue;let i=n.name,a=e.get(i);a||(a=[],e.set(i,a)),a.push({definingCube:t,joinDef:r})}return e}findPath(e,t,n=new Set){if(e===t)return[];let r=this.getCacheKey(e,t,n),i=this.getFromCache(r);if(i!==void 0)return i;let a=[{cube:e,path:[]}],o=new Set([e,...n]);for(;a.length>0;){let{cube:e,path:n}=a.shift(),i=this.cubes.get(e);if(i?.joins)for(let[,s]of Object.entries(i.joins)){let i=U(s.targetCube,this.cubes);if(!i)continue;let c=i.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:s}];if(c===t)return this.setInCache(r,l),l;o.add(c),a.push({cube:c,path:l})}let s=this.reverseIndex.get(e)||[];for(let{definingCube:i,joinDef:c}of s){if(o.has(i))continue;let s=[...n,{fromCube:e,toCube:i,joinDef:c,reversed:!0}];if(i===t)return this.setInCache(r,s),s;o.add(i),a.push({cube:i,path:s})}}return this.setInCache(r,null),null}findPathPreferring(e,t,n,r=new Set){return this.findPathPreferringDetailed(e,t,n,r).selectedPath}findPathPreferringDetailed(e,t,n,r=new Set){let i=this.findAllPaths(e,t,new Set);if(i.length===0){let i=this.findPath(e,t,r),a=i?[{path:i,score:0,usesPreferredJoin:!1,preferredCubesInPath:0,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:0,preferredCubeBonus:0,lengthPenalty:0}}]:[];return{strategy:`fallbackShortest`,preferredCubes:Array.from(n).sort(),selectedIndex:i?0:-1,candidates:a,selectedPath:i}}let a=i.map(i=>{let a=0,o=i.some((n,r)=>r===0?n.reversed?n.joinDef.preferredFor?.includes(e)??!1:n.joinDef.preferredFor?.includes(t)??!1:!1);o&&(a=10);let s=i.filter(e=>n.has(e.toCube)).length,c=s,l=i.length-1;return{path:i,score:a+c-l,usesPreferredJoin:o,preferredCubesInPath:s,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:a,preferredCubeBonus:c,lengthPenalty:l}}});return a.sort((e,t)=>t.score===e.score?e.usesProcessed===t.usesProcessed?e.path.length-t.path.length:e.usesProcessed?-1:1:t.score-e.score),{strategy:`preferred`,preferredCubes:Array.from(n).sort(),selectedIndex:a.length>0?0:-1,candidates:a,selectedPath:a[0]?.path??null}}findAllPaths(e,t,n,r=4){if(e===t)return[[]];let i=[],a=[{cube:e,path:[],visited:new Set([e,...n])}];for(;a.length>0;){let{cube:e,path:n,visited:o}=a.shift();if(n.length>=r)continue;let s=this.cubes.get(e);if(s?.joins)for(let[,r]of Object.entries(s.joins)){let s=U(r.targetCube,this.cubes);if(!s)continue;let c=s.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:r}];if(c===t)i.push(l);else{let e=new Set(o);e.add(c),a.push({cube:c,path:l,visited:e})}}let c=this.reverseIndex.get(e)||[];for(let{definingCube:r,joinDef:s}of c){if(o.has(r))continue;let c=[...n,{fromCube:e,toCube:r,joinDef:s,reversed:!0}];if(r===t)i.push(c);else{let e=new Set(o);e.add(r),a.push({cube:r,path:c,visited:e})}}}return i}canReachAll(e,t){let n=t.filter(t=>t!==e);for(let t of n){let n=this.findForwardOnlyPath(e,t,new Set);if(!n||n.length===0)return!1}return!0}findForwardOnlyPath(e,t,n){if(e===t)return[];let r=[{cube:e,path:[]}],i=new Set([e,...n]);for(;r.length>0;){let{cube:e,path:n}=r.shift(),a=this.cubes.get(e);if(a?.joins)for(let[,o]of Object.entries(a.joins)){let a=U(o.targetCube,this.cubes);if(!a)continue;let s=a.name;if(i.has(s))continue;let c=[...n,{fromCube:e,toCube:s,joinDef:o}];if(s===t)return c;i.add(s),r.push({cube:s,path:c})}}return null}buildJoinCondition(e,t,n){let r=[];for(let i of e.on){let e=t?D`${D.identifier(t)}.${D.identifier(i.source.name)}`:et(i.source),a=n?D`${D.identifier(n)}.${D.identifier(i.target.name)}`:et(i.target),o=i.as||M;r.push(o(e,a))}return P(...r)}getReachableCubes(e){let t=new Set([e]),n=[e];for(;n.length>0;){let e=n.shift(),r=this.cubes.get(e);if(r?.joins)for(let[,e]of Object.entries(r.joins)){let r=U(e.targetCube,this.cubes);if(!r)continue;let i=r.name;t.has(i)||(t.add(i),n.push(i))}let i=this.reverseIndex.get(e)||[];for(let{definingCube:e}of i)t.has(e)||(t.add(e),n.push(e))}return t}getCacheKey(e,t,n){return`${e}:${t}:${Array.from(n).sort().join(`,`)}`}getFromCache(e){let t=this.connectivityCache.get(e);if(t)return t.path}setInCache(e,t){this.connectivityCache.set(e,{path:t})}},yt=class{resolverCache=new WeakMap;getResolver(e){let t=this.resolverCache.get(e);return t||(t=new vt(e),this.resolverCache.set(e,t)),t}analyzeCubeUsage(e){let t=new Set;if(e.measures)for(let n of e.measures){let[e]=n.split(`.`);t.add(e)}if(e.dimensions)for(let n of e.dimensions){let[e]=n.split(`.`);t.add(e)}if(e.timeDimensions)for(let n of e.timeDimensions){let[e]=n.dimension.split(`.`);t.add(e)}if(e.filters)for(let n of e.filters)this.extractCubeNamesFromFilter(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}collectPathHintCubes(e){return this.analyzeCubeUsage(e)}extractCubeNamesFromFilter(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)this.extractCubeNamesFromFilter(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}extractMeasuresFromFilters(e,t){let n=[];if(!e.filters)return n;for(let r of e.filters)this.extractMeasuresFromFilter(r,t,n);return n}extractMeasuresFromFilter(e,t,n){if(`and`in e||`or`in e){let r=e.and||e.or||[];for(let e of r)this.extractMeasuresFromFilter(e,t,n);return}if(`member`in e){let r=e.member,[i,a]=r.split(`.`);i===t.name&&t.measures&&t.measures[a]&&n.push(r)}}choosePrimaryCube(e,t,n){return e.length===1?e[0]:n?this.analyzePrimaryCubeSelection(e,t,n).selectedCube:[...e].sort()[0]}analyzePrimaryCube(e,t,n){return this.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.generateWarnings(e,t)}buildJoinPlan(e,t,n,r,i){let a=this.getResolver(e),o=[],s=new Set([t.name]),c=new Set;if(i.measures)for(let e of i.measures){let[t]=e.split(`.`);c.add(t)}let l=this.collectPathHintCubes(i),u=new Set;for(let n of c)n!==t.name&&this.findHasManyJoinDef(t,n,e)&&u.add(n);let d=n.filter(e=>e!==t.name);for(let n of d){if(s.has(n))continue;let i=new Set([...s].filter(e=>!u.has(e))),c=a.findPathPreferring(t.name,n,l,i);if(!c||c.length===0)throw Error(`No join path found from '${t.name}' to '${n}'`);for(let{fromCube:t,toCube:n,joinDef:i,reversed:l}of c){if(s.has(n))continue;let c=e.get(n);if(!c)throw Error(`Cube '${n}' not found`);let u=l?Qe(i.relationship):i.relationship;if(u===`belongsToMany`&&i.through){let e=nt(i,r.securityContext);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:e.junctionJoins[1].joinType,joinCondition:e.junctionJoins[1].condition,relationship:`belongsToMany`,junctionTable:{table:i.through.table,alias:`junction_${n.toLowerCase()}`,joinType:e.junctionJoins[0].joinType,joinCondition:e.junctionJoins[0].condition,securitySql:i.through.securitySql,sourceCubeName:t}})}else{let e=a.buildJoinCondition(i,null,null),t=$e(u,i.sqlJoinType);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:t,joinCondition:e,relationship:u})}s.add(n)}}return o}planPreAggregationCTEs(e,t,n,r,i){let a=[];if(!r.measures||r.measures.length===0)return a;let o=this.computeCTEReasons(t,n,r);if(o.size===0)return a;for(let s of n){let n=o.get(s.cube.name);if(!n)continue;let c=s.cube,l=s.alias,u=r.measures.filter(e=>e.startsWith(c.name+`.`)),d=this.extractMeasuresFromFilters(r,c),f=[...new Set([...u,...d])];if(f.length===0)continue;let p=this.analyzeJoinPathToPrimary(e,t,c.name,i,r),m,h;if(p?.hasIntermediateHasMany&&p.intermediateJoins.length>0)m=p.correctJoinKeys,h=p.intermediateJoins;else{let n=(p?.path&&p.path.length>0?(()=>{let t=p.path[p.path.length-1],n=e.get(t.fromCube);return n?{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}:null})():null)??this.findJoinInfoForCube(e,t,c.name);if(!n)continue;m=n.joinDef.relationship===`belongsToMany`&&n.joinDef.through?n.sourceCube?.name===t.name&&!(`reversed`in n&&n.reversed)?n.joinDef.through.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.joinDef.through.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):`reversed`in n&&n.reversed?n.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):n.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),h=void 0}let g=this.findPropagatingFilters(r,c,e),_=new Map([[c.name,c]]),{aggregateMeasures:v,requiredBaseMeasures:y}=Q.categorizeForPostAggregation(f,_),b=[...new Set([...v,...Array.from(y).filter(e=>e.startsWith(c.name+`.`))])];if(b.length>0){let t=this.expandCalculatedMeasureDependencies(c,b),i=this.findDownstreamJoinKeys(c,r,e);a.push({cube:c,alias:l,cteAlias:`${c.name.toLowerCase()}_agg`,joinKeys:m,measures:t,propagatingFilters:g.length>0?g:void 0,downstreamJoinKeys:i.length>0?i:void 0,intermediateJoins:h&&h.length>0?h:void 0,cteType:`aggregate`,cteReason:n})}}return a}findJoinInfoToCube(e,t){for(let[,n]of e)if(n.name!==t&&n.joins)for(let[,r]of Object.entries(n.joins)){let i=U(r.targetCube,e);if(i&&i.name===t)return{sourceCube:n,joinDef:r}}return null}analyzeJoinPathToPrimary(e,t,n,r,i){let a=this.getResolver(e),o=this.collectPathHintCubes(i),s=o.size>0?a.findPathPreferring(t.name,n,o,new Set):a.findPath(t.name,n);if(!s||s.length===0)return null;let c=s.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!c.slice(0,-1).some(e=>(e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:c,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let l=[];for(let t=0;t<c.length-1;t++){let n=c[t],i=c[t+1],a=e.get(n.toCube);if(!a)continue;let o=a.sql(r).where,s=i.joinDef.on[0]?.source,u=n.joinDef.on[0]?.target;l.push({cube:a,joinDef:i.joinDef,securityFilter:o,primaryJoinColumn:u,cteJoinColumn:s})}return{path:c,hasIntermediateHasMany:!0,intermediateJoins:l,correctJoinKeys:c[0].joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}}computeCTEReasons(e,t,n){let r=new Map,i=new Set,a=new Set,o=new Set;if(n.measures)for(let e of n.measures){let[t]=e.split(`.`);o.add(t)}for(let e of t)e.relationship===`hasMany`||e.relationship===`belongsToMany`?i.add(e.cube.name):e.relationship===`belongsTo`&&o.has(e.cube.name)&&a.add(e.cube.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.cube.name)&&(i.has(e.cube.name)?r.set(e.cube.name,`hasMany`):(a.has(e.cube.name)||i.size>0)&&r.set(e.cube.name,`fanOutPrevention`));return r}findJoinInfoForCube(e,t,n){if(t.joins)for(let[,r]of Object.entries(t.joins)){let i=U(r.targetCube,e);if(i&&i.name===n)return{sourceCube:t,joinDef:r}}let r=e.get(n);if(r?.joins)for(let[,n]of Object.entries(r.joins)){let i=U(n.targetCube,e);if(i&&i.name===t.name)return{sourceCube:r,joinDef:n,reversed:!0}}for(let[,r]of e)if(!(r.name===t.name||r.name===n)&&r.joins)for(let[,t]of Object.entries(r.joins)){let i=U(t.targetCube,e);if(i&&i.name===n)return{sourceCube:r,joinDef:t}}return null}findDownstreamJoinKeys(e,t,n){let r=[],i=new Set;if(t.dimensions)for(let n of t.dimensions){let[t]=n.split(`.`);t!==e.name&&i.add(t)}if(t.timeDimensions)for(let n of t.timeDimensions){let[t]=n.dimension.split(`.`);t!==e.name&&i.add(t)}if(t.filters){for(let e of t.filters)this.extractCubeNamesFromFilter(e,i);i.delete(e.name)}if(e.joins)for(let[,t]of Object.entries(e.joins)){let e=U(t.targetCube,n);if(!e)continue;let a=e.name;if(i.has(a)){let e;e=t.relationship===`belongsToMany`&&t.through?t.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):t.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),r.push({targetCubeName:a,joinKeys:e})}}return r}expandCalculatedMeasureDependencies(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();if(n.has(t))continue;n.add(t);let[,i]=t.split(`.`);if(!e.measures||!e.measures[i])continue;let a=e.measures[i];if(a.type===`calculated`&&a.calculatedSql){let t=this.extractDependenciesFromTemplate(a.calculatedSql,e.name);for(let e of t)n.has(e)||r.push(e)}}return Array.from(n)}extractDependenciesFromTemplate(e,t){if(e.length>1e3)return[];let n=e.matchAll(/\{([^}]+)\}/g),r=[];for(let e of n){let n=e[1].trim();n.includes(`.`)?r.push(n):r.push(`${t}.${n}`)}return r}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=U(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=new Set;if(this.extractFilterCubeNamesToSet(e.filters,i),e.timeDimensions){for(let t of e.timeDimensions)if(t.dateRange){let[e]=t.dimension.split(`.`);e&&i.add(e)}}for(let a of i){if(a===t.name)continue;let i=n.get(a);if(i?.joins)for(let[,o]of Object.entries(i.joins)){let s=U(o.targetCube,n);if(s&&s.name===t.name&&o.relationship===`hasMany`){let t=this.extractFiltersForCube(e.filters,a),n=this.extractTimeDimensionFiltersForCube(e,a),s=[...t,...n];s.length>0&&o.on.length>0&&r.push({sourceCube:i,filters:s,joinConditions:o.on.map(e=>({source:e.source,target:e.target}))})}}}return r}extractFilterCubeNamesToSet(e,t){for(let n of e){if(`and`in n||`or`in n){let e=n.and||n.or||[];this.extractFilterCubeNamesToSet(e,t);continue}if(`member`in n){let[e]=n.member.split(`.`);e&&t.add(e)}}}extractFiltersForCube(e,t){let n=[];for(let r of e){if(`and`in r){let e=this.extractFiltersForCube(r.and||[],t);e.length>0&&n.push({and:e});continue}if(`or`in r){let e=r.or||[];if(this.allFiltersFromCube(e,t)){let r=this.extractFiltersForCube(e,t);r.length>0&&n.push({or:r})}continue}if(`member`in r){let[e]=r.member.split(`.`);e===t&&n.push(r)}}return n}allFiltersFromCube(e,t){for(let n of e){if(`and`in n){if(!this.allFiltersFromCube(n.and||[],t))return!1;continue}if(`or`in n){if(!this.allFiltersFromCube(n.or||[],t))return!1;continue}if(`member`in n){let[e]=n.member.split(`.`);if(e!==t)return!1}}return!0}extractTimeDimensionFiltersForCube(e,t){let n=[];if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e===t&&r.dateRange&&n.push({member:r.dimension,operator:`inDateRange`,values:Array.isArray(r.dateRange)?r.dateRange:[r.dateRange]})}return n}analyzePrimaryCubeSelection(e,t,n){if(e.length===1)return{selectedCube:e[0],reason:`single_cube`,explanation:`Only one cube is used in this query`};let r=[],i=(t.dimensions||[]).map(e=>e.split(`.`)[0]),a=new Map;for(let e of i)a.set(e,(a.get(e)||0)+1);let o=this.getResolver(n);for(let t of e){let i=n.get(t),s=a.get(t)||0,c=i?.joins?Object.keys(i.joins).length:0,l=o.canReachAll(t,e);r.push({cubeName:t,dimensionCount:s,joinCount:c,canReachAll:l})}if(t.dimensions&&t.dimensions.length>0){let e=Math.max(...r.map(e=>e.dimensionCount));if(e>0){let t=r.filter(t=>t.dimensionCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of t)if(e.canReachAll)return{selectedCube:e.cubeName,reason:`most_dimensions`,explanation:`Selected because it has ${e.dimensionCount} dimension${e.dimensionCount===1?``:`s`} in the query (defines the analytical grain)`,candidates:r}}}let s=r.filter(e=>e.canReachAll);if(s.length>0){let e=Math.max(...s.map(e=>e.joinCount)),t=s.filter(t=>t.joinCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:t.cubeName,reason:`most_connected`,explanation:`Selected because it has ${t.joinCount} join relationship${t.joinCount===1?``:`s`} and can reach all other cubes`,candidates:r}}return{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}analyzeJoinPath(e,t,n,r){let i=this.getResolver(e),a=r?this.collectPathHintCubes(r):new Set,o=a.size>0?i.findPathPreferringDetailed(t,n,a):null,s=o?.selectedPath??i.findPath(t,n),c=[t];if(s)for(let e of s)c.push(e.toCube);if(!s||s.length===0)return{targetCube:n,pathFound:!1,error:`No join path found from '${t}' to '${n}'. Ensure the target cube has a relationship defined (belongsTo, hasOne, hasMany, or belongsToMany).`,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)};let l=this.convertInternalPathToJoinPathSteps(s);return{targetCube:n,pathFound:!0,path:l,pathLength:l.length,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)}}convertInternalPathToJoinPathSteps(e){return e.map(e=>{let t=e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship,n=$e(t,e.joinDef.sqlJoinType),r=e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name})),i={fromCube:e.fromCube,toCube:e.toCube,relationship:t,joinType:n,joinColumns:r};if(e.reversed&&(i.reversed=!0),t===`belongsToMany`&&e.joinDef.through){let t=e.joinDef.through;i.junctionTable={tableName:t.table[Symbol.for(`drizzle:Name`)]||`junction_table`,sourceColumns:t.sourceKey.map(e=>e.target.name),targetColumns:t.targetKey.map(e=>e.source.name)}}return i})}buildJoinPathSelectionAnalysis(e){if(!e)return{strategy:`shortest`};let t=e.candidates.map((e,t)=>this.mapPreferredCandidate(e,t+1));return{strategy:e.strategy,preferredCubes:e.preferredCubes,selectedRank:e.selectedIndex>=0?e.selectedIndex+1:void 0,selectedScore:e.selectedIndex>=0?e.candidates[e.selectedIndex]?.score:void 0,candidates:t}}mapPreferredCandidate(e,t){return{rank:t,score:e.score,usesPreferredJoin:e.usesPreferredJoin,preferredCubesInPath:e.preferredCubesInPath,usesProcessed:e.usesProcessed,scoreBreakdown:e.scoreBreakdown,path:this.convertInternalPathToJoinPathSteps(e.path)}}generateWarnings(e,t){let n=[],r=this.checkFanOutNoDimensions(e,t);return r&&n.push(r),n}checkFanOutNoDimensions(e,t){if(!t||t.length===0||!e.measures||e.measures.length===0)return null;let n=new Set;for(let t of e.measures){let[e]=t.split(`.`);n.add(e)}if(n.size<2)return null;let r=e.dimensions&&e.dimensions.length>0,i=e.timeDimensions?.some(e=>e.granularity);return r||i?null:{code:`FAN_OUT_NO_DIMENSIONS`,message:`Query combines measures from multiple cubes with hasMany relationships but has no dimensions. Results are aggregated at the join key level, which may produce unexpected totals.`,severity:`warning`,cubes:[...n].sort(),measures:e.measures,suggestion:`Add a dimension to see per-group breakdowns, or add a time dimension with granularity.`}}},bt=class{constructor(e){this.queryBuilder=e}buildPreAggregationCTE(e,t,n,r,i){let a=e.cube,o=a.sql(n),s=e.intermediateJoins&&e.intermediateJoins.length>0,c={};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0].primaryJoinColumn;if(t){let e=t.name;c[e]=t}}else for(let t of e.joinKeys)if(t.targetColumnObj){c[t.targetColumn]=t.targetColumnObj;for(let[e,n]of Object.entries(a.dimensions||{}))n.sql===t.targetColumnObj&&e!==t.targetColumn&&(c[e]=D`${t.targetColumnObj}`.as(e))}if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&(c[e.sourceColumn]=e.sourceColumnObj);let l=a.name,u=new Map([[l,a]]),d=this.queryBuilder.buildResolvedMeasures(e.measures,u,n);for(let t of e.measures){let[,e]=t.split(`.`),n=d.get(t);n&&(c[e]=D`${n()}`.as(e))}if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r];c[r]=D`${this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n)}`.as(r)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r];c[r]=D`${this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n)}`.as(r)}}if(Object.keys(c).length===0)return null;let f=n.db.select(c).from(o.from);if(s&&e.intermediateJoins){let t=[...e.intermediateJoins].reverse();for(let e of t){let t=e.cube.sql(n),r=[M(e.cteJoinColumn,e.joinDef.on[0]?.target)];e.securityFilter&&r.push(e.securityFilter),f=f.leftJoin(t.from,P(...r))}}let p=r?{...r,preAggregationCTEs:r.preAggregationCTEs?.filter(e=>e.cube.name!==a.name)}:void 0,m=this.queryBuilder.buildWhereConditions(a,t,n,p,i),h=[];if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]&&e.dateRange){let t=a.dimensions[r],i=this.queryBuilder.buildMeasureExpression({sql:t.sql,type:`number`},n),o=this.queryBuilder.buildDateRangeCondition(i,e.dateRange);o&&h.push(o)}}if(t.filters){for(let e of t.filters)if(!(`and`in e)&&!(`or`in e)&&`member`in e&&`operator`in e){let t=e,[r,i]=t.member.split(`.`);if(r===l&&a.dimensions&&a.dimensions[i]){let e=a.dimensions[i];if(t.operator===`inDateRange`){let r=this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n),i=this.queryBuilder.buildDateRangeCondition(r,t.values);i&&h.push(i)}}}}if(e.propagatingFilters&&e.propagatingFilters.length>0)for(let t of e.propagatingFilters){let e=this.buildPropagatingFilterSubquery(t,n);e&&h.push(e)}let g=[];if(o.where&&g.push(o.where),g.push(...m,...h),g.length>0){let e=g.length===1?g[0]:P(...g);f=f.where(e)}let _=[],v=new Set,y=e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!v.has(t)?(v.add(t),_.push(e)):t||_.push(e)};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0];t.primaryJoinColumn&&y(t.primaryJoinColumn)}else for(let t of e.joinKeys)t.targetColumnObj&&y(t.targetColumnObj);if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&y(e.sourceColumnObj);if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r],t=W(e.sql,n);_.push(t)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r],i=this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);_.push(i)}}return _.length>0&&(f=f.groupBy(..._)),n.db.$with(e.cteAlias).as(f)}buildCTEJoinCondition(e,t,n){let r=n.preAggregationCTEs?.find(t=>t.cube.name===e.cube.name);if(!r)throw Error(`CTE info not found for cube ${e.cube.name}`);let i=[];if(r.intermediateJoins&&r.intermediateJoins.length>0){let e=r.intermediateJoins[0],a=this.resolveCTEJoinSourceColumn(r.joinKeys[0],r,n),o=D`${D.identifier(t)}.${D.identifier(e.primaryJoinColumn.name)}`;i.push(M(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=D`${D.identifier(t)}.${D.identifier(e.targetColumn)}`;i.push(M(a,o))}return i.length===1?i[0]:P(...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||D.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 D`${D.identifier(r.cteAlias)}.${D.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]:P(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0];return D`${n} IN ${t.db.select({pk:e}).from(r.from).where(a)}`}else{let e=P(...o.map(e=>M(e.source,e.target)),a);return D`EXISTS ${t.db.select({one:D`1`}).from(r.from).where(e)}`}}};function xt(e,t,n){let r=[],i=St(new Date(e),n),a=St(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=Ct(i,n);return r}function St(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 Ct(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 wt(e){if(e instanceof Date)return e.toISOString();if(typeof e==`string`){let t=new Date(e);if(!isNaN(t.getTime()))return t.toISOString()}return String(e)}function Tt(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function Et(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,fillValue:a,measures:o,dimensions:s}=t,c=xt(i[0],i[1],r);if(c.length===0)return e;let l=new Map;for(let t of e){let e=Tt(t,s),r=wt(t[n]);l.has(e)||l.set(e,new Map),l.get(e).set(r,t)}l.size===0&&s.length===0&&l.set(`__all__`,new Map);let u=[];for(let[e,t]of l){let e=t.size>0?t.values().next().value:null;for(let r of c){let i=r.toISOString(),c=t.get(i);if(c)u.push(c);else{let t={[n]:i};if(e)for(let n of s)t[n]=e[n];for(let e of o)t[e]=a;u.push(t)}}}return u}function Dt(e){if(!e)return null;if(Array.isArray(e)){if(e.length<2)return null;let t=new Date(e[0]),n=new Date(e[1]);return isNaN(t.getTime())||isNaN(n.getTime())?null:[t,n]}let t=new Date(e);return isNaN(t.getTime())?null:[t,t]}function Ot(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let t=e.fillMissingDates!==!1,n=e.granularity&&e.dateRange;return t&&n});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let t=Dt(e.dateRange);if(!t)continue;let r={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:t,fillValue:i,measures:n,dimensions:o};s=Et(s,r)}return s}var kt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new Y(e)}hasComparison(e){return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)??!1}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/(1e3*60));case`hour`:return Math.floor((a-i)/(1e3*60*60));case`day`:return Math.floor((a-i)/(1e3*60*60*24));case`week`:return Math.floor((a-i)/(1e3*60*60*24*7));case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/(1e3*60*60*24))}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},At=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new X(e,this.dateTimeBuilder)}hasFunnel(e){return e.funnel!==void 0&&e.funnel.steps.length>=2}validateConfig(e,t){let n=[];if(e.steps.length<2&&n.push(`Funnel must have at least 2 steps`),typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}for(let r=0;r<e.steps.length;r++){let i=e.steps[r];if(i.name||n.push(`Step ${r} must have a name`),`cube`in i&&i.cube&&(t.get(i.cube)||n.push(`Step ${r} cube not found: ${i.cube}`)),i.filter){let a;`cube`in i&&i.cube?a=i.cube:typeof e.bindingKey==`string`&&([a]=e.bindingKey.split(`.`));let o=a?new vt(t):null,s=Array.isArray(i.filter)?i.filter:[i.filter];for(let e of s)if(`member`in e){let[i,s]=e.member.split(`.`),c=t.get(i);if(!c)n.push(`Step ${r} filter cube not found: ${i}`);else if(c.dimensions?.[s]||(c.measures?.[s]?n.push(`Step ${r} filter '${i}.${s}' is a measure. Funnel step filters only support dimensions, not measures.`):n.push(`Step ${r} filter member not found: ${s} in cube ${i}`)),a&&i!==a&&o){let e=o.findPath(a,i);(!e||e.length===0)&&n.push(`Step ${r} filter '${i}.${s}' requires a join from '${a}' but no join path was found. Define a join relationship between these cubes.`)}}}i.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(i.timeToConvert)||n.push(`Step ${r} timeToConvert must be ISO 8601 duration format: ${i.timeToConvert}`))}return{isValid:n.length===0,errors:n}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&(c.avgSecondsToConvert=n[`step_${e}_avg_seconds`]===null?null:Number(n[`step_${e}_avg_seconds`]),c.minSecondsToConvert=n[`step_${e}_min_seconds`]===null?null:Number(n[`step_${e}_min_seconds`]),c.maxSecondsToConvert=n[`step_${e}_max_seconds`]===null?null:Number(n[`step_${e}_max_seconds`]),n[`step_${e}_median_seconds`]!==void 0&&(c.medianSecondsToConvert=n[`step_${e}_median_seconds`]===null?null:Number(n[`step_${e}_median_seconds`])),n[`step_${e}_p90_seconds`]!==void 0&&(c.p90SecondsToConvert=n[`step_${e}_p90_seconds`]===null?null:Number(n[`step_${e}_p90_seconds`]))),r.push(c)}return r}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(`type`in e&&`filters`in e){let t=e;for(let e of t.filters||[])r(e)}else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(e,t,n){let r=new vt(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(e,t,n){if(`cube`in e&&e.cube){let t=n.get(e.cube);if(!t)throw Error(`Cube not found for step: ${e.cube}`);return t}if(typeof t.bindingKey==`string`){let[e]=t.bindingKey.split(`.`),r=n.get(e);if(!r)throw Error(`Cube not found for binding key: ${t.bindingKey}`);return r}throw Error(`Cannot resolve cube for step - multi-cube funnel requires cube specification in each step`)}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return W(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return W(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return W(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return W(a.sql,n)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=`type`in e&&`filters`in e&&(e.type===`and`||e.type===`or`);if(i||a){let i=[],o;if(a){let a=e;o=a.type===`and`;for(let e of a.filters||[]){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}else{let a=e;o=`and`in a&&!!a.and;let s=a.and||a.or||[];for(let e of s){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}return i.length===0?null:i.length===1?i[0]:o?P(...i):D`(${D.join(i,D` OR `)})`}let o=e,[s,c]=o.member.split(`.`),l=o.dateRange!==void 0;if(o.operator!==`set`&&o.operator!==`notSet`&&!l&&(!o.values||o.values.length===0||o.values[0]===void 0||o.values[0]===``))return null;let u=n.get(s);if(!u)return null;if(s!==t.name){let e=new vt(n).findPath(t.name,s);if(!e||e.length===0)return console.warn(`Funnel filter: Cannot filter by '${String(s).replace(/\n|\r/g,``)}.${String(c).replace(/\n|\r/g,``)}' in step using '${String(t.name).replace(/\n|\r/g,``)}'. No join path found. Filter will be skipped.`),null}let d=u.dimensions?.[c];if(!d)return null;let f=d.type===`time`?W(d.sql,r):typeof d.sql==`function`?d.sql(r):d.sql;return this.filterBuilder.buildFilterCondition(f,o.operator,o.values||[],d,o.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(e,t){let n=`step_${e.index}`,r=e.cube.sql(t),i=[];r.where&&i.push(r.where),i.push(...e.filterConditions);let a=t.db.select({binding_key:D`${e.bindingKeyExpr}`.as(`binding_key`),step_time:D`MIN(${e.timeExpr})`.as(`step_time`)}).from(r.from);if(a=this.addCrossJoinsToQuery(a,e,t,i),i.length>0){let e=i.length===1?i[0]:P(...i);a=a.where(e)}return a=a.groupBy(e.bindingKeyExpr),t.db.$with(n).as(a)}buildSubsequentStepCTE(e,t,n){let r=`step_${e.index}`,i=`step_${e.index-1}`,a=e.cube.sql(t),o=[];a.where&&o.push(a.where),o.push(...e.filterConditions);let s=D`${D.identifier(i)}.step_time`,c=D`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=D`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:D`${e.bindingKeyExpr}`.as(`binding_key`),step_time:D`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,D`${e.bindingKeyExpr} = ${D.identifier(i)}.binding_key`);if(l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0){let e=o.length===1?o[0]:P(...o);l=l.where(e)}return l=l.groupBy(e.bindingKeyExpr),t.db.$with(r).as(l)}addCrossJoinsToQuery(e,t,n,r){if(t.joinedCubes.length===0)return e;for(let i of t.joinedCubes)for(let t of i.joinPath){let a=t.joinDef,o=[];for(let e of a.on)e.as?o.push(e.as(e.source,e.target)):o.push(M(e.source,e.target));let s=o.length===1?o[0]:P(...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:D`s0.binding_key`,step_0_time:D`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=D`s${D.raw(String(e))}.step_time`;let a=D`${D.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=D`${a}
|
|
62
|
+
`),sql:t}}function qe(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function Je(e){let t=e.replace(/^[\s\d:]*->/,``).trim();if(!t||/^(GlobalStats|partitions|bytes):/i.test(t)||/^\w+=\d+/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Ye=class extends H{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(D`${D.raw(`EXPLAIN`)} ${D.raw(e.replace(/\?/g,()=>{let e=t.shift();return e===null?`NULL`:typeof e==`number`?String(e):typeof e==`boolean`?e?`TRUE`:`FALSE`:e instanceof Date?`'${e.toISOString()}'`:`'${String(e).replace(/'/g,`''`)}'`}))}`),i=[];if(Array.isArray(r)){for(let e of r)if(e&&typeof e==`object`){let t=e.content||e[`QUERY PLAN`]||e.plan||Object.values(e)[0];typeof t==`string`&&i.push(t)}}return Ke(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Xe(e,t){return new Ye(e,t,`snowflake`)}function Ze(e,t,n){if(n)switch(n){case`postgres`:return Te(e,t);case`mysql`:return ke(e,t);case`sqlite`:return Ne(e,t);case`singlestore`:return Fe(e,t);case`duckdb`:return Be(e,t);case`databend`:return Ge(e,t);case`snowflake`:return Xe(e,t)}if(e.all&&e.run)return Ne(e,t);if(e.execute)return Te(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function U(e,t){return typeof e==`string`?t?t.get(e)||(console.warn(`[drizzle-cube] Cannot resolve cube reference '${e}': no cube with that name is registered. Registered cubes: ${Array.from(t.keys()).join(`, `)||`(none)`}. Join will be skipped.`),null):(console.warn(`[drizzle-cube] Cannot resolve string cube reference '${e}': no cube registry provided. Join will be skipped.`),null):typeof e==`function`?e():e}function Qe(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function $e(e,t){if(t)return t;switch(e){case`belongsTo`:return`inner`;case`hasOne`:return`left`;case`hasMany`:return`left`;case`belongsToMany`:return`left`;default:return`left`}}function et(e){return e&&typeof e==`object`?D`${D`${e}`}`:e}function tt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function W(e,t){return et(typeof e==`function`?e(t):e)}function nt(e,t){if(e.relationship!==`belongsToMany`||!e.through)throw Error(`expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration`);let{table:n,sourceKey:r,targetKey:i,securitySql:a}=e.through,o=[];for(let e of r){let t=e.as||M;o.push(t(e.source,e.target))}let s=[];for(let e of i){let t=e.as||M;s.push(t(e.source,e.target))}let c;if(a){let e=a(t);c=Array.isArray(e)?e:[e]}let l=$e(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:l,table:n,condition:P(...o)},{joinType:l,table:n,condition:P(...s)}],junctionSecurityConditions:c}}function G(e){if(`and`in e)return`and:[${e.and.map(G).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(G).sort().join(`,`)}]`;let t=e,n=JSON.stringify(Array.isArray(t.values)?[...t.values].sort():t.values),r=t.dateRange?`:dr:${JSON.stringify(t.dateRange)}`:``;return`${t.member}:${t.operator}:${n}${r}`}function rt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var K=class{cache=new Map;stats={hits:0,misses:0};getOrBuild(e,t){let n=this.cache.get(e);if(n!==void 0)return this.stats.hits++,n;let r=t();return r&&this.cache.set(e,r),this.stats.misses++,r}has(e){return this.cache.has(e)}get(e){let t=this.cache.get(e);return t!==void 0&&this.stats.hits++,t}preload(e){for(let{key:t,sql:n}of e)this.cache.has(t)||this.cache.set(t,n)}set(e,t){this.cache.set(e,t)}getStats(){return{...this.stats,cacheSize:this.cache.size}}clear(){this.cache.clear(),this.stats={hits:0,misses:0}}};function it(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...it(n.and)):`or`in n&&n.or?t.push(...it(n.or)):`member`in n&&t.push(n);return t}function at(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=ot(e),a=`${r}query:${dt(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=dt(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(J(t)));a+=`:ctx:${e}`}return a}function ot(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?q(e.filters):void 0,timeDimensions:e.timeDimensions?ut(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?J(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?st(e.funnel):void 0,flow:e.flow?ct(e.flow):void 0,retention:e.retention?lt(e.retention):void 0}}function st(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?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 ct(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?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 lt(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?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 ut(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function J(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(J):Object.keys(e).sort().reduce((t,n)=>(t[n]=J(e[n]),t),{})}function dt(e){let t=2166136261,n=Math.min(e.length,65536);for(let r=0;r<n;r++)t^=e.charCodeAt(r),t=t*16777619>>>0;return t.toString(16).padStart(8,`0`)}var Y=class{constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=W(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof S?r:D`${r}`}buildDateRangeCondition(e,t){if(!t)return null;if(Array.isArray(t)&&t.length>=2){let n=this.normalizeDate(t[0]),r=this.normalizeDate(t[1]);if(!n||!r)return null;if(typeof t[1]==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(t[1].trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return P(I(e,n),L(e,r))}if(typeof t==`string`){let n=this.parseRelativeDateRange(t);if(n){let t,r;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(t=Math.floor(n.start.getTime()/1e3),r=Math.floor(n.end.getTime()/1e3)):(t=n.start.getTime(),r=n.end.getTime()):(t=n.start.toISOString(),r=n.end.toISOString()),P(I(e,t),L(e,r))}let r=this.normalizeDate(t);if(!r)return null;let i=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);o.setUTCHours(23,59,59,999);let s,c;return this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?(s=Math.floor(a.getTime()/1e3),c=Math.floor(o.getTime()/1e3)):(s=a.getTime(),c=o.getTime()):(s=a.toISOString(),c=o.toISOString()),P(I(e,s),L(e,c))}return null}parseRelativeDateRange(e){let t=new Date,n=e.toLowerCase().trim(),r=t.getUTCFullYear(),i=t.getUTCMonth(),a=t.getUTCDate(),o=t.getUTCDay();if(n===`today`){let e=new Date(t);e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`yesterday`){let e=new Date(t);e.setUTCDate(a-1),e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCDate(a-1),n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`this week`){let e=o===0?-6:1-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`this month`)return{start:new Date(Date.UTC(r,i,1,0,0,0,0)),end:new Date(Date.UTC(r,i+1,0,23,59,59,999))};if(n===`this quarter`){let e=Math.floor(i/3);return{start:new Date(Date.UTC(r,e*3,1,0,0,0,0)),end:new Date(Date.UTC(r,e*3+3,0,23,59,59,999))}}if(n===`this year`)return{start:new Date(Date.UTC(r,0,1,0,0,0,0)),end:new Date(Date.UTC(r,11,31,23,59,59,999))};let s=n.match(/^last\s+(\d+)\s+days?$/);if(s){let e=parseInt(s[1],10),n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}let c=n.match(/^last\s+(\d+)\s+weeks?$/);if(c){let e=parseInt(c[1],10)*7,n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last week`){let e=o===0?-13:-6-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last month`)return{start:new Date(Date.UTC(r,i-1,1,0,0,0,0)),end:new Date(Date.UTC(r,i,0,23,59,59,999))};if(n===`last quarter`){let e=Math.floor(i/3),t=e===0?3:e-1,n=e===0?r-1:r;return{start:new Date(Date.UTC(n,t*3,1,0,0,0,0)),end:new Date(Date.UTC(n,t*3+3,0,23,59,59,999))}}if(n===`last year`)return{start:new Date(Date.UTC(r-1,0,1,0,0,0,0)),end:new Date(Date.UTC(r-1,11,31,23,59,59,999))};if(n===`last 12 months`){let e=new Date(Date.UTC(r,i-11,1,0,0,0,0)),n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}let l=n.match(/^last\s+(\d+)\s+months?$/);if(l){let e=parseInt(l[1],10),n=new Date(Date.UTC(r,i-e+1,1,0,0,0,0)),a=new Date(t);return a.setUTCHours(23,59,59,999),{start:n,end:a}}let u=n.match(/^last\s+(\d+)\s+years?$/);if(u){let e=parseInt(u[1],10),n=new Date(Date.UTC(r-e,0,1,0,0,0,0)),i=new Date(t);return i.setUTCHours(23,59,59,999),{start:n,end:i}}return null}normalizeDate(e){if(!e)return null;if(e instanceof Date)return isNaN(e.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(e.getTime()/1e3):e.getTime():e.toISOString();if(typeof e==`number`){let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t/1e3):t:n.toISOString()}if(typeof e==`string`){if(/^\d{4}-\d{2}-\d{2}$/.test(e.trim())){let t=new Date(e+`T00:00:00Z`);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}let t=new Date(e);return isNaN(t.getTime())?null:this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}},X=class{constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(e,t,n,r,i){if(i!==void 0){if(t!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${t}'. Use explicit date values in the 'values' array for other date operators.`);if(r&&r.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${r.name||`unknown`}' has type '${r.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(e,i)}if(!n||n.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let a=n.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(a.length===0&&![`set`,`notSet`].includes(t))return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=a[0];switch(t){case`equals`:return a.length>1?r?.type===`time`?re(e,a.map(e=>this.dateTimeBuilder.normalizeDate(e)||e)):re(e,a):a.length===1?M(e,r?.type===`time`&&this.dateTimeBuilder.normalizeDate(o)||o):this.databaseAdapter.buildBooleanLiteral(!1);case`notEquals`:return a.length>1?ie(e,a):a.length===1?N(e,o):null;case`contains`:return this.databaseAdapter.buildStringCondition(e,`contains`,o);case`notContains`:return this.databaseAdapter.buildStringCondition(e,`notContains`,o);case`startsWith`:return this.databaseAdapter.buildStringCondition(e,`startsWith`,o);case`endsWith`:return this.databaseAdapter.buildStringCondition(e,`endsWith`,o);case`gt`:return te(e,o);case`gte`:return I(e,o);case`lt`:return ne(e,o);case`lte`:return L(e,o);case`set`:return oe(e);case`notSet`:return ae(e);case`inDateRange`:if(a.length>=2){let t=this.dateTimeBuilder.normalizeDate(a[0]),r=this.dateTimeBuilder.normalizeDate(a[1]);if(t&&r){let i=n[1];if(typeof i==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(i.trim())){let e=typeof r==`number`?new Date(r*(this.databaseAdapter.getEngineType()===`sqlite`?1e3:1)):new Date(r),t=new Date(e);t.setUTCHours(23,59,59,999),r=this.databaseAdapter.isTimestampInteger()?this.databaseAdapter.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return P(I(e,t),L(e,r))}}return null;case`beforeDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?ne(e,t):null}case`afterDate`:{let t=this.dateTimeBuilder.normalizeDate(o);return t?te(e,t):null}case`between`:return a.length>=2?P(I(e,a[0]),L(e,a[1])):null;case`notBetween`:return a.length>=2?F(ne(e,a[0]),te(e,a[1])):null;case`in`:return a.length>0?re(e,a):null;case`notIn`:return a.length>0?ie(e,a):null;case`like`:return this.databaseAdapter.buildStringCondition(e,`like`,o);case`notLike`:return this.databaseAdapter.buildStringCondition(e,`notLike`,o);case`ilike`:return this.databaseAdapter.buildStringCondition(e,`ilike`,o);case`regex`:return this.databaseAdapter.buildStringCondition(e,`regex`,o);case`notRegex`:return this.databaseAdapter.buildStringCondition(e,`notRegex`,o);case`isEmpty`:return F(ae(e),M(e,``));case`isNotEmpty`:return P(oe(e),N(e,``));case`arrayContains`:return this.databaseAdapter.getEngineType()===`postgres`?se(e,a):null;case`arrayOverlaps`:return this.databaseAdapter.getEngineType()===`postgres`?le(e,a):null;case`arrayContained`:return this.databaseAdapter.getEngineType()===`postgres`?ce(e,a):null;default:return null}}buildLogicalFilter(e,t,n){if(`and`in e&&e.and){let r=e.and.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:P(...r):null}if(`or`in e&&e.or){let r=e.or.map(e=>this.buildSingleFilter(e,t,n)).filter(e=>e!==null);return r.length>0?r.length===1?r[0]:F(...r):null}return null}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=e,[i,a]=r.member.split(`.`),o=t.get(i);if(!o)return null;let s=o.dimensions?.[a];if(!s)return null;let c=s.type===`time`?W(s.sql,n):typeof s.sql==`function`?s.sql(n):s.sql;return this.buildFilterCondition(c,r.operator,r.values,s,r.dateRange)}},Z=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=new Map,n=[],r=[];for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}for(let[e,r]of t)r.inDegree===0&&n.push(e);for(;n.length>0;){let e=n.shift();r.push(e);for(let[r,i]of t)i.dependencies.has(e)&&(i.inDegree--,i.inDegree===0&&n.push(r))}if(r.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return r}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function ft(e,t){let{cube:n,allCubes:r,resolvedMeasures:i}=t,a=pt(e),o=new Map;for(let e of a){let{originalRef:t,cubeName:a,fieldName:s}=e,c=a||n.name;if(!r.get(c))throw Error(`Cannot substitute {${t}}: cube '${c}' not found`);let l=`${c}.${s}`,u=i.get(l);if(!u)throw Error(`Cannot substitute {${t}}: measure '${l}' not resolved yet. Ensure measures are resolved in dependency order.`);let d=D`${u()}`;o.set(t,d)}let s=[],c=[],l=0;for(let t of a){let n=`{${t.originalRef}}`,r=e.indexOf(n,l);if(r>=0){s.push(e.substring(l,r));let i=o.get(t.originalRef);i&&c.push(i),l=r+n.length}}if(s.push(e.substring(l)),c.length===0)return D.raw(e);let u=[];for(let e=0;e<s.length;e++)s[e]&&u.push(new x(s[e])),e<c.length&&u.push(c[e]);return D.join(u,D.raw(``))}function pt(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 mt(e){let t=[],n=0;for(let r=0;r<e.length;r++)if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n<0)){t.push(`Unmatched closing brace at position ${r}`);break}n>0&&t.push(`Unmatched opening brace in template`),/\{\s*\}/.test(e)&&t.push(`Empty member reference {} found in template`),/\{[^}]*\{/.test(e)&&t.push(`Nested braces are not allowed in member references`);let r=pt(e);for(let e of r){let n=e.cubeName?`${e.cubeName}.${e.fieldName}`:e.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n)||t.push(`Invalid member reference {${e.originalRef}}: must start with letter or underscore, and contain only letters, numbers, underscores, and dots`),n.split(`.`).length>2&&t.push(`Invalid member reference {${e.originalRef}}: only one dot allowed (Cube.measure format)`)}return{isValid:t.length===0,errors:t}}function ht(e,t){let n=pt(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Q=class e{constructor(e){this.databaseAdapter=e}buildResolvedMeasures(t,n,r,i){let a=new Map,o=[],s=[],c=new Set(t),l=new Z(n);for(let e of n.values())l.buildGraph(e);let u=[];for(let r of t){let[t,i]=r.split(`.`),a=n.get(t);if(a&&a.measures&&a.measures[i]){let d=a.measures[i];if(e.isPostAggregationWindow(d)){u.push(r);let n=e.getWindowBaseMeasure(d,t);n&&c.add(n);continue}Z.isCalculatedMeasure(d)?(s.push(r),ht(d.calculatedSql,t).forEach(e=>c.add(e)),l.getAllDependencies(r).forEach(e=>{let[t,r]=e.split(`.`),i=n.get(t);if(i&&i.measures[r]){let e=i.measures[r];Z.isCalculatedMeasure(e)&&ht(e.calculatedSql,t).forEach(e=>c.add(e))}})):o.push(r)}}for(let t of c){let[r,i]=t.split(`.`),a=n.get(r);if(a&&a.measures&&a.measures[i]){let n=a.measures[i];if(e.isPostAggregationWindow(n))continue;Z.isCalculatedMeasure(n)?s.includes(t)||s.push(t):o.includes(t)||o.push(t)}}for(let e of o){let[t,o]=e.split(`.`),s=n.get(t),c=s.measures[o];if(i){let t=i(e,c,s);a.set(e,()=>t)}else a.set(e,()=>this.buildMeasureExpression(c,r,s))}if(s.length>0){let e=l.topologicalSort(s);for(let t of e){let[e,i]=t.split(`.`),o=n.get(e),s=o.measures[i];a.set(t,()=>this.buildCalculatedMeasure(s,o,n,a,r))}}return a}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return ft(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=ht(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=D`${D.identifier(n.cteAlias)}.${D.identifier(i)}`,o;switch(t.type){case`count`:case`countDistinct`:case`sum`:o=R(r);break;case`avg`:o=this.databaseAdapter.buildAvg(r);break;case`min`:o=B(r);break;case`max`:o=z(r);break;case`number`:o=R(r);break;default:o=R(r)}a.set(e,()=>o)}}}return this.buildCalculatedMeasure(e,t,r,a,i)}buildHavingMeasureExpression(e,t,n,r,i){if(i&&i.preAggregationCTEs){let a=i.preAggregationCTEs.find(t=>t.cube.name===e);if(a&&a.measures.includes(`${e}.${t}`))if(n.type===`calculated`&&n.calculatedSql){let t=i.primaryCube.name===e?i.primaryCube:i.joinCubes?.find(t=>t.cube.name===e)?.cube;if(!t)throw Error(`Cube ${e} not found in query plan`);let o=new Map([[i.primaryCube.name,i.primaryCube]]);if(i.joinCubes)for(let e of i.joinCubes)o.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(n,t,a,o,r)}else{let e=D`${D.identifier(a.cteAlias)}.${D.identifier(t)}`;switch(n.type){case`count`:case`countDistinct`:case`sum`:return R(e);case`avg`:return this.databaseAdapter.buildAvg(e);case`min`:return B(e);case`max`:return z(e);case`number`:return R(e);default:return R(e)}}}return this.buildMeasureExpression(n,r)}buildMeasureExpression(t,n,r){if(t.type===`calculated`)throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);if(e.isPostAggregationWindow(t))throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!t.sql)throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let i=W(t.sql,n);if(n.ungrouped)return i;if(t.filters&&t.filters.length>0){let e=t.filters.map(e=>{let t=e(n);return t?D`(${t})`:void 0}).filter(Boolean);if(e.length>0){let t=e.length===1?e[0]:P(...e);i=this.databaseAdapter.buildCaseWhen([{when:t,then:i}])}}switch(t.type){case`count`:return fe(i);case`countDistinct`:return pe(i);case`sum`:return R(i);case`avg`:return this.databaseAdapter.buildAvg(i);case`min`:return B(i);case`max`:return z(i);case`number`:return i;case`stddev`:case`stddevSamp`:{let e=t.type===`stddevSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildStddev(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`variance`:case`varianceSamp`:{let e=t.type===`varianceSamp`||t.statisticalConfig?.useSample,n=this.databaseAdapter.buildVariance(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`percentile`:case`median`:case`p95`:case`p99`:{let e;switch(t.type){case`median`:e=50;break;case`p95`:e=95;break;case`p99`:e=99;break;default:e=t.statisticalConfig?.percentile??50}let n=this.databaseAdapter.buildPercentile(i,e);return n===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`MAX(NULL)`):n}case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:{let e=t.windowConfig||{},a;if(e.partitionBy&&e.partitionBy.length>0&&r){let t=e.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,i=r.dimensions?.[t];return i?W(i.sql,n):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(a=t)}let o;if(e.orderBy&&e.orderBy.length>0&&r){let t=e.orderBy.map(e=>{let t=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=r.dimensions?.[t];if(i)return{field:W(i.sql,n),direction:e.direction};let a=r.measures?.[t];return a&&a.sql?{field:W(a.sql,n),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);t.length>0&&(o=t)}let s=this.databaseAdapter.buildWindowFunction(t.type,[`rank`,`denseRank`,`rowNumber`].includes(t.type)?null:i,a,o,{offset:e.offset,defaultValue:e.defaultValue,nTile:e.nTile,frame:e.frame});return s===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),D`NULL`):s}default:return fe(i)}}static WINDOW_FUNCTION_TYPES=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];static isWindowFunction(t){return e.WINDOW_FUNCTION_TYPES.includes(t)}static categorizeMeasures(t,n){let r=[],i=[];for(let a of t){let[t,o]=a.split(`.`),s=n.get(t);if(s?.measures?.[o]){let t=s.measures[o];e.isWindowFunction(t.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(t,n){let{windowMeasures:r}=e.categorizeMeasures(t,n);return r.length>0}static isPostAggregationWindow(t){return e.isWindowFunction(t.type)&&t.windowConfig?.measure!==void 0}static getWindowBaseMeasure(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}static getDefaultWindowOperation(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}static categorizeForPostAggregation(t,n){let r=[],i=[],a=new Set;for(let o of t){let[t,s]=o.split(`.`),c=n.get(t);if(c?.measures?.[s]){let n=c.measures[s];if(e.isPostAggregationWindow(n)){i.push(o);let r=e.getWindowBaseMeasure(n,t);r&&a.add(r)}else e.isWindowFunction(n.type)||r.push(o)}}return{aggregateMeasures:r,postAggWindowMeasures:i,requiredBaseMeasures:a}}static hasPostAggregationWindows(t,n){let{postAggWindowMeasures:r}=e.categorizeForPostAggregation(t,n);return r.length>0}},gt=class{constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s,l=!1;for(let e of t.measures||[]){let[t,n]=e.split(`.`),r=a.get(t);if(r&&r.measures&&r.measures[n]){let e=r.measures[n];if(this.isAggregateFunctionType(e.type)||e.type===`calculated`){l=!0;break}if(Q.isPostAggregationWindow(e)){let n=Q.getWindowBaseMeasure(e,t);if(n){let[e,t]=n.split(`.`),r=a.get(e)?.measures?.[t];if(r&&this.isAggregateFunctionType(r.type)){l=!0;break}}}}}if(!l&&!c)return[];if(t.dimensions)for(let e of t.dimensions){let[t,o]=e.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let e=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(e){let t=e.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj)i.push(t.sourceColumnObj);else{let t=D`${D.identifier(e.cteAlias)}.${D.identifier(o)}`;i.push(t)}}else{let e=s.dimensions[o],t=W(e.sql,n);i.push(t)}}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,o]=e.dimension.split(`.`),s=a.get(t);if(s&&s.dimensions&&s.dimensions[o]){let a=r?.preAggregationCTEs?.find(e=>e.cube.name===t);if(a){let t=a.joinKeys.find(e=>e.targetColumn===o);if(t&&t.sourceColumnObj){let r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,n);i.push(r)}else{let e=D`${D.identifier(a.cteAlias)}.${D.identifier(o)}`;i.push(e)}}else{let t=s.dimensions[o],r=this.dateTimeBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);i.push(r)}}}return i}},_t=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new Y(e),this.filterBuilder=new X(e,this.dateTimeBuilder),this.groupByBuilder=new gt(this.dateTimeBuilder),this.measureBuilder=new Q(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,n){let r={},i=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,a]=e.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a];r[e]=D`${W(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]=D`${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]=D`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=fe()),r}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters){if(i&&`member`in e){let[t]=e.member.split(`.`),n=o.has(t);if(r?.preAggregationCTEs&&r.preAggregationCTEs.some(e=>e.cube.name===t))continue;if(n&&i.has(t)&&!s.has(t)){let e=i.get(t);a.push(...e),s.add(t);continue}else if(s.has(t))continue}let t=this.processFilter(e,o,n,`where`,r);t&&a.push(t)}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,i]=e.dimension.split(`.`),s=o.get(t);if(s&&s.dimensions[i]&&e.dateRange){if(r?.preAggregationCTEs&&r.preAggregationCTEs.some(e=>e.cube.name===t))continue;if(n.filterCache){let t=rt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){a.push(r);continue}}let o=s.dimensions[i],c=W(o.sql,n),l=this.buildDateRangeCondition(c,e.dateRange);l&&a.push(l)}}return a}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(e,t,n,r,i){if(`and`in e||`or`in e){let a=e;if(a.and){let e=a.and.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?P(...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?F(...e):null}}let a=e,[o,s]=a.member.split(`.`),c=t.get(o);if(!c)return null;let l=c.dimensions[s],u=c.measures[s],d=l||u;if(!d)return null;if(r===`where`&&l){if(i?.preAggregationCTEs&&i.preAggregationCTEs.some(e=>e.cube.name===o))return null;let t=l.type===`time`;if(n.filterCache){let t=G(e),r=n.filterCache.get(t);if(r)return r}let r=t?W(l.sql,n):typeof l.sql==`function`?l.sql(n):l.sql;return this.buildFilterCondition(r,a.operator,a.values,d,a.dateRange)}else if(r===`where`&&u)return null;else if(r===`having`&&u){let e=this.buildHavingMeasureExpression(o,s,u,n,i);return this.buildFilterCondition(e,a.operator,a.values,d,a.dateRange)}return null}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(e,t){let n=[],r=t||[...e.measures||[],...e.dimensions||[],...e.timeDimensions?.map(e=>e.dimension)||[]];if(e.order&&Object.keys(e.order).length>0)for(let[t,i]of Object.entries(e.order)){if(!r.includes(t))throw Error(`Cannot order by '${t}': field is not selected in the query`);let e=i===`desc`?de(D.identifier(t)):ue(D.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(ue(D.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)}},vt=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=U(r.targetCube,this.cubes);if(!n)continue;let i=n.name,a=e.get(i);a||(a=[],e.set(i,a)),a.push({definingCube:t,joinDef:r})}return e}findPath(e,t,n=new Set){if(e===t)return[];let r=this.getCacheKey(e,t,n),i=this.getFromCache(r);if(i!==void 0)return i;let a=[{cube:e,path:[]}],o=new Set([e,...n]);for(;a.length>0;){let{cube:e,path:n}=a.shift(),i=this.cubes.get(e);if(i?.joins)for(let[,s]of Object.entries(i.joins)){let i=U(s.targetCube,this.cubes);if(!i)continue;let c=i.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:s}];if(c===t)return this.setInCache(r,l),l;o.add(c),a.push({cube:c,path:l})}let s=this.reverseIndex.get(e)||[];for(let{definingCube:i,joinDef:c}of s){if(o.has(i))continue;let s=[...n,{fromCube:e,toCube:i,joinDef:c,reversed:!0}];if(i===t)return this.setInCache(r,s),s;o.add(i),a.push({cube:i,path:s})}}return this.setInCache(r,null),null}findPathPreferring(e,t,n,r=new Set){return this.findPathPreferringDetailed(e,t,n,r).selectedPath}findPathPreferringDetailed(e,t,n,r=new Set){let i=this.findAllPaths(e,t,new Set);if(i.length===0){let i=this.findPath(e,t,r),a=i?[{path:i,score:0,usesPreferredJoin:!1,preferredCubesInPath:0,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:0,preferredCubeBonus:0,lengthPenalty:0}}]:[];return{strategy:`fallbackShortest`,preferredCubes:Array.from(n).sort(),selectedIndex:i?0:-1,candidates:a,selectedPath:i}}let a=i.map(i=>{let a=0,o=i.some((n,r)=>r===0?n.reversed?n.joinDef.preferredFor?.includes(e)??!1:n.joinDef.preferredFor?.includes(t)??!1:!1);o&&(a=10);let s=i.filter(e=>n.has(e.toCube)).length,c=s,l=i.length-1;return{path:i,score:a+c-l,usesPreferredJoin:o,preferredCubesInPath:s,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:a,preferredCubeBonus:c,lengthPenalty:l}}});return a.sort((e,t)=>t.score===e.score?e.usesProcessed===t.usesProcessed?e.path.length-t.path.length:e.usesProcessed?-1:1:t.score-e.score),{strategy:`preferred`,preferredCubes:Array.from(n).sort(),selectedIndex:a.length>0?0:-1,candidates:a,selectedPath:a[0]?.path??null}}findAllPaths(e,t,n,r=4){if(e===t)return[[]];let i=[],a=[{cube:e,path:[],visited:new Set([e,...n])}];for(;a.length>0;){let{cube:e,path:n,visited:o}=a.shift();if(n.length>=r)continue;let s=this.cubes.get(e);if(s?.joins)for(let[,r]of Object.entries(s.joins)){let s=U(r.targetCube,this.cubes);if(!s)continue;let c=s.name;if(o.has(c))continue;let l=[...n,{fromCube:e,toCube:c,joinDef:r}];if(c===t)i.push(l);else{let e=new Set(o);e.add(c),a.push({cube:c,path:l,visited:e})}}let c=this.reverseIndex.get(e)||[];for(let{definingCube:r,joinDef:s}of c){if(o.has(r))continue;let c=[...n,{fromCube:e,toCube:r,joinDef:s,reversed:!0}];if(r===t)i.push(c);else{let e=new Set(o);e.add(r),a.push({cube:r,path:c,visited:e})}}}return i}canReachAll(e,t){let n=t.filter(t=>t!==e);for(let t of n){let n=this.findForwardOnlyPath(e,t,new Set);if(!n||n.length===0)return!1}return!0}findForwardOnlyPath(e,t,n){if(e===t)return[];let r=[{cube:e,path:[]}],i=new Set([e,...n]);for(;r.length>0;){let{cube:e,path:n}=r.shift(),a=this.cubes.get(e);if(a?.joins)for(let[,o]of Object.entries(a.joins)){let a=U(o.targetCube,this.cubes);if(!a)continue;let s=a.name;if(i.has(s))continue;let c=[...n,{fromCube:e,toCube:s,joinDef:o}];if(s===t)return c;i.add(s),r.push({cube:s,path:c})}}return null}buildJoinCondition(e,t,n){let r=[];for(let i of e.on){let e=t?D`${D.identifier(t)}.${D.identifier(i.source.name)}`:et(i.source),a=n?D`${D.identifier(n)}.${D.identifier(i.target.name)}`:et(i.target),o=i.as||M;r.push(o(e,a))}return P(...r)}getReachableCubes(e){let t=new Set([e]),n=[e];for(;n.length>0;){let e=n.shift(),r=this.cubes.get(e);if(r?.joins)for(let[,e]of Object.entries(r.joins)){let r=U(e.targetCube,this.cubes);if(!r)continue;let i=r.name;t.has(i)||(t.add(i),n.push(i))}let i=this.reverseIndex.get(e)||[];for(let{definingCube:e}of i)t.has(e)||(t.add(e),n.push(e))}return t}getCacheKey(e,t,n){return`${e}:${t}:${Array.from(n).sort().join(`,`)}`}getFromCache(e){let t=this.connectivityCache.get(e);if(t)return t.path}setInCache(e,t){this.connectivityCache.set(e,{path:t})}},yt=class{resolverCache=new WeakMap;getResolver(e){let t=this.resolverCache.get(e);return t||(t=new vt(e),this.resolverCache.set(e,t)),t}analyzeCubeUsage(e){let t=new Set;if(e.measures)for(let n of e.measures){let[e]=n.split(`.`);t.add(e)}if(e.dimensions)for(let n of e.dimensions){let[e]=n.split(`.`);t.add(e)}if(e.timeDimensions)for(let n of e.timeDimensions){let[e]=n.dimension.split(`.`);t.add(e)}if(e.filters)for(let n of e.filters)this.extractCubeNamesFromFilter(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}collectPathHintCubes(e){return this.analyzeCubeUsage(e)}extractCubeNamesFromFilter(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)this.extractCubeNamesFromFilter(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}extractMeasuresFromFilters(e,t){let n=[];if(!e.filters)return n;for(let r of e.filters)this.extractMeasuresFromFilter(r,t,n);return n}extractMeasuresFromFilter(e,t,n){if(`and`in e||`or`in e){let r=e.and||e.or||[];for(let e of r)this.extractMeasuresFromFilter(e,t,n);return}if(`member`in e){let r=e.member,[i,a]=r.split(`.`);i===t.name&&t.measures&&t.measures[a]&&n.push(r)}}choosePrimaryCube(e,t,n){return e.length===1?e[0]:n?this.analyzePrimaryCubeSelection(e,t,n).selectedCube:[...e].sort()[0]}analyzePrimaryCube(e,t,n){return this.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.generateWarnings(e,t)}buildJoinPlan(e,t,n,r,i){let a=this.getResolver(e),o=[],s=new Set([t.name]),c=new Set;if(i.measures)for(let e of i.measures){let[t]=e.split(`.`);c.add(t)}let l=this.collectPathHintCubes(i),u=new Set;for(let n of c)n!==t.name&&this.findHasManyJoinDef(t,n,e)&&u.add(n);let d=n.filter(e=>e!==t.name);for(let n of d){if(s.has(n))continue;let i=new Set([...s].filter(e=>!u.has(e))),c=a.findPathPreferring(t.name,n,l,i);if(!c||c.length===0)throw Error(`No join path found from '${t.name}' to '${n}'`);for(let{fromCube:t,toCube:n,joinDef:i,reversed:l}of c){if(s.has(n))continue;let c=e.get(n);if(!c)throw Error(`Cube '${n}' not found`);let u=l?Qe(i.relationship):i.relationship;if(u===`belongsToMany`&&i.through){let e=nt(i,r.securityContext);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:e.junctionJoins[1].joinType,joinCondition:e.junctionJoins[1].condition,relationship:`belongsToMany`,junctionTable:{table:i.through.table,alias:`junction_${n.toLowerCase()}`,joinType:e.junctionJoins[0].joinType,joinCondition:e.junctionJoins[0].condition,securitySql:i.through.securitySql,sourceCubeName:t}})}else{let e=a.buildJoinCondition(i,null,null),t=$e(u,i.sqlJoinType);o.push({cube:c,alias:`${n.toLowerCase()}_cube`,joinType:t,joinCondition:e,relationship:u})}s.add(n)}}return o}planPreAggregationCTEs(e,t,n,r,i){let a=[];if(!r.measures||r.measures.length===0)return a;let o=this.computeCTEReasons(t,n,r);if(o.size===0)return a;for(let s of n){let n=o.get(s.cube.name);if(!n)continue;let c=s.cube,l=s.alias,u=r.measures.filter(e=>e.startsWith(c.name+`.`)),d=this.extractMeasuresFromFilters(r,c),f=[...new Set([...u,...d])];if(f.length===0)continue;let p=this.analyzeJoinPathToPrimary(e,t,c.name,i,r),m,h;if(p?.hasIntermediateHasMany&&p.intermediateJoins.length>0)m=p.correctJoinKeys,h=p.intermediateJoins;else{let n=(p?.path&&p.path.length>0?(()=>{let t=p.path[p.path.length-1],n=e.get(t.fromCube);return n?{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}:null})():null)??this.findJoinInfoForCube(e,t,c.name);if(!n)continue;m=n.joinDef.relationship===`belongsToMany`&&n.joinDef.through?n.sourceCube?.name===t.name&&!(`reversed`in n&&n.reversed)?n.joinDef.through.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.joinDef.through.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):`reversed`in n&&n.reversed?n.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):n.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),h=void 0}let g=this.findPropagatingFilters(r,c,e),_=new Map([[c.name,c]]),{aggregateMeasures:v,requiredBaseMeasures:y}=Q.categorizeForPostAggregation(f,_),b=[...new Set([...v,...Array.from(y).filter(e=>e.startsWith(c.name+`.`))])];if(b.length>0){let t=this.expandCalculatedMeasureDependencies(c,b),i=this.findDownstreamJoinKeys(c,r,e);a.push({cube:c,alias:l,cteAlias:`${c.name.toLowerCase()}_agg`,joinKeys:m,measures:t,propagatingFilters:g.length>0?g:void 0,downstreamJoinKeys:i.length>0?i:void 0,intermediateJoins:h&&h.length>0?h:void 0,cteType:`aggregate`,cteReason:n})}}return a}findJoinInfoToCube(e,t){for(let[,n]of e)if(n.name!==t&&n.joins)for(let[,r]of Object.entries(n.joins)){let i=U(r.targetCube,e);if(i&&i.name===t)return{sourceCube:n,joinDef:r}}return null}analyzeJoinPathToPrimary(e,t,n,r,i){let a=this.getResolver(e),o=this.collectPathHintCubes(i),s=o.size>0?a.findPathPreferring(t.name,n,o,new Set):a.findPath(t.name,n);if(!s||s.length===0)return null;let c=s.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!c.slice(0,-1).some(e=>(e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:c,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let l=[];for(let t=0;t<c.length-1;t++){let n=c[t],i=c[t+1],a=e.get(n.toCube);if(!a)continue;let o=a.sql(r).where,s=i.joinDef.on[0]?.source,u=n.joinDef.on[0]?.target;l.push({cube:a,joinDef:i.joinDef,securityFilter:o,primaryJoinColumn:u,cteJoinColumn:s})}return{path:c,hasIntermediateHasMany:!0,intermediateJoins:l,correctJoinKeys:c[0].joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}}computeCTEReasons(e,t,n){let r=new Map,i=new Set,a=new Set,o=new Set;if(n.measures)for(let e of n.measures){let[t]=e.split(`.`);o.add(t)}for(let e of t)e.relationship===`hasMany`||e.relationship===`belongsToMany`?i.add(e.cube.name):e.relationship===`belongsTo`&&o.has(e.cube.name)&&a.add(e.cube.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.cube.name)&&(i.has(e.cube.name)?r.set(e.cube.name,`hasMany`):(a.has(e.cube.name)||i.size>0)&&r.set(e.cube.name,`fanOutPrevention`));return r}findJoinInfoForCube(e,t,n){if(t.joins)for(let[,r]of Object.entries(t.joins)){let i=U(r.targetCube,e);if(i&&i.name===n)return{sourceCube:t,joinDef:r}}let r=e.get(n);if(r?.joins)for(let[,n]of Object.entries(r.joins)){let i=U(n.targetCube,e);if(i&&i.name===t.name)return{sourceCube:r,joinDef:n,reversed:!0}}for(let[,r]of e)if(!(r.name===t.name||r.name===n)&&r.joins)for(let[,t]of Object.entries(r.joins)){let i=U(t.targetCube,e);if(i&&i.name===n)return{sourceCube:r,joinDef:t}}return null}findDownstreamJoinKeys(e,t,n){let r=[],i=new Set;if(t.dimensions)for(let n of t.dimensions){let[t]=n.split(`.`);t!==e.name&&i.add(t)}if(t.timeDimensions)for(let n of t.timeDimensions){let[t]=n.dimension.split(`.`);t!==e.name&&i.add(t)}if(t.filters){for(let e of t.filters)this.extractCubeNamesFromFilter(e,i);i.delete(e.name)}if(e.joins)for(let[,t]of Object.entries(e.joins)){let e=U(t.targetCube,n);if(!e)continue;let a=e.name;if(i.has(a)){let e;e=t.relationship===`belongsToMany`&&t.through?t.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):t.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})),r.push({targetCubeName:a,joinKeys:e})}}return r}expandCalculatedMeasureDependencies(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();if(n.has(t))continue;n.add(t);let[,i]=t.split(`.`);if(!e.measures||!e.measures[i])continue;let a=e.measures[i];if(a.type===`calculated`&&a.calculatedSql){let t=this.extractDependenciesFromTemplate(a.calculatedSql,e.name);for(let e of t)n.has(e)||r.push(e)}}return Array.from(n)}extractDependenciesFromTemplate(e,t){if(e.length>1e3)return[];let n=e.matchAll(/\{([^}]+)\}/g),r=[];for(let e of n){let n=e[1].trim();n.includes(`.`)?r.push(n):r.push(`${t}.${n}`)}return r}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=U(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=new Set;if(this.extractFilterCubeNamesToSet(e.filters,i),e.timeDimensions){for(let t of e.timeDimensions)if(t.dateRange){let[e]=t.dimension.split(`.`);e&&i.add(e)}}for(let a of i){if(a===t.name)continue;let i=n.get(a);if(i?.joins)for(let[,o]of Object.entries(i.joins)){let s=U(o.targetCube,n);if(s&&s.name===t.name&&o.relationship===`hasMany`){let t=this.extractFiltersForCube(e.filters,a),n=this.extractTimeDimensionFiltersForCube(e,a),s=[...t,...n];s.length>0&&o.on.length>0&&r.push({sourceCube:i,filters:s,joinConditions:o.on.map(e=>({source:e.source,target:e.target}))})}}}return r}extractFilterCubeNamesToSet(e,t){for(let n of e){if(`and`in n||`or`in n){let e=n.and||n.or||[];this.extractFilterCubeNamesToSet(e,t);continue}if(`member`in n){let[e]=n.member.split(`.`);e&&t.add(e)}}}extractFiltersForCube(e,t){let n=[];for(let r of e){if(`and`in r){let e=this.extractFiltersForCube(r.and||[],t);e.length>0&&n.push({and:e});continue}if(`or`in r){let e=r.or||[];if(this.allFiltersFromCube(e,t)){let r=this.extractFiltersForCube(e,t);r.length>0&&n.push({or:r})}continue}if(`member`in r){let[e]=r.member.split(`.`);e===t&&n.push(r)}}return n}allFiltersFromCube(e,t){for(let n of e){if(`and`in n){if(!this.allFiltersFromCube(n.and||[],t))return!1;continue}if(`or`in n){if(!this.allFiltersFromCube(n.or||[],t))return!1;continue}if(`member`in n){let[e]=n.member.split(`.`);if(e!==t)return!1}}return!0}extractTimeDimensionFiltersForCube(e,t){let n=[];if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e===t&&r.dateRange&&n.push({member:r.dimension,operator:`inDateRange`,values:Array.isArray(r.dateRange)?r.dateRange:[r.dateRange]})}return n}analyzePrimaryCubeSelection(e,t,n){if(e.length===1)return{selectedCube:e[0],reason:`single_cube`,explanation:`Only one cube is used in this query`};let r=[],i=(t.dimensions||[]).map(e=>e.split(`.`)[0]),a=new Map;for(let e of i)a.set(e,(a.get(e)||0)+1);let o=this.getResolver(n);for(let t of e){let i=n.get(t),s=a.get(t)||0,c=i?.joins?Object.keys(i.joins).length:0,l=o.canReachAll(t,e);r.push({cubeName:t,dimensionCount:s,joinCount:c,canReachAll:l})}if(t.dimensions&&t.dimensions.length>0){let e=Math.max(...r.map(e=>e.dimensionCount));if(e>0){let t=r.filter(t=>t.dimensionCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of t)if(e.canReachAll)return{selectedCube:e.cubeName,reason:`most_dimensions`,explanation:`Selected because it has ${e.dimensionCount} dimension${e.dimensionCount===1?``:`s`} in the query (defines the analytical grain)`,candidates:r}}}let s=r.filter(e=>e.canReachAll);if(s.length>0){let e=Math.max(...s.map(e=>e.joinCount)),t=s.filter(t=>t.joinCount===e).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:t.cubeName,reason:`most_connected`,explanation:`Selected because it has ${t.joinCount} join relationship${t.joinCount===1?``:`s`} and can reach all other cubes`,candidates:r}}return{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}analyzeJoinPath(e,t,n,r){let i=this.getResolver(e),a=r?this.collectPathHintCubes(r):new Set,o=a.size>0?i.findPathPreferringDetailed(t,n,a):null,s=o?.selectedPath??i.findPath(t,n),c=[t];if(s)for(let e of s)c.push(e.toCube);if(!s||s.length===0)return{targetCube:n,pathFound:!1,error:`No join path found from '${t}' to '${n}'. Ensure the target cube has a relationship defined (belongsTo, hasOne, hasMany, or belongsToMany).`,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)};let l=this.convertInternalPathToJoinPathSteps(s);return{targetCube:n,pathFound:!0,path:l,pathLength:l.length,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)}}convertInternalPathToJoinPathSteps(e){return e.map(e=>{let t=e.reversed?Qe(e.joinDef.relationship):e.joinDef.relationship,n=$e(t,e.joinDef.sqlJoinType),r=e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name})),i={fromCube:e.fromCube,toCube:e.toCube,relationship:t,joinType:n,joinColumns:r};if(e.reversed&&(i.reversed=!0),t===`belongsToMany`&&e.joinDef.through){let t=e.joinDef.through;i.junctionTable={tableName:t.table[Symbol.for(`drizzle:Name`)]||`junction_table`,sourceColumns:t.sourceKey.map(e=>e.target.name),targetColumns:t.targetKey.map(e=>e.source.name)}}return i})}buildJoinPathSelectionAnalysis(e){if(!e)return{strategy:`shortest`};let t=e.candidates.map((e,t)=>this.mapPreferredCandidate(e,t+1));return{strategy:e.strategy,preferredCubes:e.preferredCubes,selectedRank:e.selectedIndex>=0?e.selectedIndex+1:void 0,selectedScore:e.selectedIndex>=0?e.candidates[e.selectedIndex]?.score:void 0,candidates:t}}mapPreferredCandidate(e,t){return{rank:t,score:e.score,usesPreferredJoin:e.usesPreferredJoin,preferredCubesInPath:e.preferredCubesInPath,usesProcessed:e.usesProcessed,scoreBreakdown:e.scoreBreakdown,path:this.convertInternalPathToJoinPathSteps(e.path)}}generateWarnings(e,t){let n=[],r=this.checkFanOutNoDimensions(e,t);return r&&n.push(r),n}checkFanOutNoDimensions(e,t){if(!t||t.length===0||!e.measures||e.measures.length===0)return null;let n=new Set;for(let t of e.measures){let[e]=t.split(`.`);n.add(e)}if(n.size<2)return null;let r=e.dimensions&&e.dimensions.length>0,i=e.timeDimensions?.some(e=>e.granularity);return r||i?null:{code:`FAN_OUT_NO_DIMENSIONS`,message:`Query combines measures from multiple cubes with hasMany relationships but has no dimensions. Results are aggregated at the join key level, which may produce unexpected totals.`,severity:`warning`,cubes:[...n].sort(),measures:e.measures,suggestion:`Add a dimension to see per-group breakdowns, or add a time dimension with granularity.`}}},bt=class{constructor(e){this.queryBuilder=e}buildPreAggregationCTE(e,t,n,r,i){let a=e.cube,o=a.sql(n),s=e.intermediateJoins&&e.intermediateJoins.length>0,c={};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0].primaryJoinColumn;if(t){let e=t.name;c[e]=t}}else for(let t of e.joinKeys)if(t.targetColumnObj){c[t.targetColumn]=t.targetColumnObj;for(let[e,n]of Object.entries(a.dimensions||{}))n.sql===t.targetColumnObj&&e!==t.targetColumn&&(c[e]=D`${t.targetColumnObj}`.as(e))}if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&(c[e.sourceColumn]=e.sourceColumnObj);let l=a.name,u=new Map([[l,a]]),d=this.queryBuilder.buildResolvedMeasures(e.measures,u,n);for(let t of e.measures){let[,e]=t.split(`.`),n=d.get(t);n&&(c[e]=D`${n()}`.as(e))}if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r];c[r]=D`${this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n)}`.as(r)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r];c[r]=D`${this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n)}`.as(r)}}if(Object.keys(c).length===0)return null;let f=n.db.select(c).from(o.from);if(s&&e.intermediateJoins){let t=[...e.intermediateJoins].reverse();for(let e of t){let t=e.cube.sql(n),r=[M(e.cteJoinColumn,e.joinDef.on[0]?.target)];e.securityFilter&&r.push(e.securityFilter),f=f.leftJoin(t.from,P(...r))}}let p=r?{...r,preAggregationCTEs:r.preAggregationCTEs?.filter(e=>e.cube.name!==a.name)}:void 0,m=this.queryBuilder.buildWhereConditions(a,t,n,p,i),h=[];if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]&&e.dateRange){let t=a.dimensions[r],i=this.queryBuilder.buildMeasureExpression({sql:t.sql,type:`number`},n),o=this.queryBuilder.buildDateRangeCondition(i,e.dateRange);o&&h.push(o)}}if(t.filters){for(let e of t.filters)if(!(`and`in e)&&!(`or`in e)&&`member`in e&&`operator`in e){let t=e,[r,i]=t.member.split(`.`);if(r===l&&a.dimensions&&a.dimensions[i]){let e=a.dimensions[i];if(t.operator===`inDateRange`){let r=this.queryBuilder.buildMeasureExpression({sql:e.sql,type:`number`},n),i=this.queryBuilder.buildDateRangeCondition(r,t.values);i&&h.push(i)}}}}if(e.propagatingFilters&&e.propagatingFilters.length>0)for(let t of e.propagatingFilters){let e=this.buildPropagatingFilterSubquery(t,n);e&&h.push(e)}let g=[];if(o.where&&g.push(o.where),g.push(...m,...h),g.length>0){let e=g.length===1?g[0]:P(...g);f=f.where(e)}let _=[],v=new Set,y=e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!v.has(t)?(v.add(t),_.push(e)):t||_.push(e)};if(s&&e.intermediateJoins){let t=e.intermediateJoins[0];t.primaryJoinColumn&&y(t.primaryJoinColumn)}else for(let t of e.joinKeys)t.targetColumnObj&&y(t.targetColumnObj);if(e.downstreamJoinKeys)for(let t of e.downstreamJoinKeys)for(let e of t.joinKeys)e.sourceColumnObj&&y(e.sourceColumnObj);if(t.dimensions)for(let e of t.dimensions){let[t,r]=e.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let e=a.dimensions[r],t=W(e.sql,n);_.push(t)}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,r]=e.dimension.split(`.`);if(t===l&&a.dimensions&&a.dimensions[r]){let t=a.dimensions[r],i=this.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,n);_.push(i)}}return _.length>0&&(f=f.groupBy(..._)),n.db.$with(e.cteAlias).as(f)}buildCTEJoinCondition(e,t,n){let r=n.preAggregationCTEs?.find(t=>t.cube.name===e.cube.name);if(!r)throw Error(`CTE info not found for cube ${e.cube.name}`);let i=[];if(r.intermediateJoins&&r.intermediateJoins.length>0){let e=r.intermediateJoins[0],a=this.resolveCTEJoinSourceColumn(r.joinKeys[0],r,n),o=D`${D.identifier(t)}.${D.identifier(e.primaryJoinColumn.name)}`;i.push(M(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=D`${D.identifier(t)}.${D.identifier(e.targetColumn)}`;i.push(M(a,o))}return i.length===1?i[0]:P(...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||D.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 D`${D.identifier(r.cteAlias)}.${D.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]:P(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0];return D`${n} IN ${t.db.select({pk:e}).from(r.from).where(a)}`}else{let e=P(...o.map(e=>M(e.source,e.target)),a);return D`EXISTS ${t.db.select({one:D`1`}).from(r.from).where(e)}`}}};function xt(e,t,n){let r=[],i=St(new Date(e),n),a=St(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=Ct(i,n);return r}function St(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 Ct(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 wt(e){if(e instanceof Date)return e.toISOString();if(typeof e==`string`){let t=new Date(e);if(!isNaN(t.getTime()))return t.toISOString()}return String(e)}function Tt(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function Et(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,fillValue:a,measures:o,dimensions:s}=t,c=xt(i[0],i[1],r);if(c.length===0)return e;let l=new Map;for(let t of e){let e=Tt(t,s),r=wt(t[n]);l.has(e)||l.set(e,new Map),l.get(e).set(r,t)}l.size===0&&s.length===0&&l.set(`__all__`,new Map);let u=[];for(let[e,t]of l){let e=t.size>0?t.values().next().value:null;for(let r of c){let i=r.toISOString(),c=t.get(i);if(c)u.push(c);else{let t={[n]:i};if(e)for(let n of s)t[n]=e[n];for(let e of o)t[e]=a;u.push(t)}}}return u}function Dt(e){if(!e)return null;if(Array.isArray(e)){if(e.length<2)return null;let t=new Date(e[0]),n=new Date(e[1]);return isNaN(t.getTime())||isNaN(n.getTime())?null:[t,n]}let t=new Date(e);return isNaN(t.getTime())?null:[t,t]}function Ot(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let t=e.fillMissingDates!==!1,n=e.granularity&&e.dateRange;return t&&n});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let t=Dt(e.dateRange);if(!t)continue;let r={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:t,fillValue:i,measures:n,dimensions:o};s=Et(s,r)}return s}var kt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new Y(e)}hasComparison(e){return e.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>=2)??!1}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/(1e3*60));case`hour`:return Math.floor((a-i)/(1e3*60*60));case`day`:return Math.floor((a-i)/(1e3*60*60*24));case`week`:return Math.floor((a-i)/(1e3*60*60*24*7));case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/(1e3*60*60*24))}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},At=class{filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new X(e,this.dateTimeBuilder)}hasFunnel(e){return e.funnel!==void 0&&e.funnel.steps.length>=2}validateConfig(e,t){let n=[];if(e.steps.length<2&&n.push(`Funnel must have at least 2 steps`),typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}for(let r=0;r<e.steps.length;r++){let i=e.steps[r];if(i.name||n.push(`Step ${r} must have a name`),`cube`in i&&i.cube&&(t.get(i.cube)||n.push(`Step ${r} cube not found: ${i.cube}`)),i.filter){let a;`cube`in i&&i.cube?a=i.cube:typeof e.bindingKey==`string`&&([a]=e.bindingKey.split(`.`));let o=a?new vt(t):null,s=Array.isArray(i.filter)?i.filter:[i.filter];for(let e of s)if(`member`in e){let[i,s]=e.member.split(`.`),c=t.get(i);if(!c)n.push(`Step ${r} filter cube not found: ${i}`);else if(c.dimensions?.[s]||(c.measures?.[s]?n.push(`Step ${r} filter '${i}.${s}' is a measure. Funnel step filters only support dimensions, not measures.`):n.push(`Step ${r} filter member not found: ${s} in cube ${i}`)),a&&i!==a&&o){let e=o.findPath(a,i);(!e||e.length===0)&&n.push(`Step ${r} filter '${i}.${s}' requires a join from '${a}' but no join path was found. Define a join relationship between these cubes.`)}}}i.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(i.timeToConvert)||n.push(`Step ${r} timeToConvert must be ISO 8601 duration format: ${i.timeToConvert}`))}return{isValid:n.length===0,errors:n}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&(c.avgSecondsToConvert=n[`step_${e}_avg_seconds`]===null?null:Number(n[`step_${e}_avg_seconds`]),c.minSecondsToConvert=n[`step_${e}_min_seconds`]===null?null:Number(n[`step_${e}_min_seconds`]),c.maxSecondsToConvert=n[`step_${e}_max_seconds`]===null?null:Number(n[`step_${e}_max_seconds`]),n[`step_${e}_median_seconds`]!==void 0&&(c.medianSecondsToConvert=n[`step_${e}_median_seconds`]===null?null:Number(n[`step_${e}_median_seconds`])),n[`step_${e}_p90_seconds`]!==void 0&&(c.p90SecondsToConvert=n[`step_${e}_p90_seconds`]===null?null:Number(n[`step_${e}_p90_seconds`]))),r.push(c)}return r}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(`type`in e&&`filters`in e){let t=e;for(let e of t.filters||[])r(e)}else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(e,t,n){let r=new vt(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(e,t,n){if(`cube`in e&&e.cube){let t=n.get(e.cube);if(!t)throw Error(`Cube not found for step: ${e.cube}`);return t}if(typeof t.bindingKey==`string`){let[e]=t.bindingKey.split(`.`),r=n.get(e);if(!r)throw Error(`Cube not found for binding key: ${t.bindingKey}`);return r}throw Error(`Cannot resolve cube for step - multi-cube funnel requires cube specification in each step`)}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return W(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return W(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return W(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return W(a.sql,n)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=`type`in e&&`filters`in e&&(e.type===`and`||e.type===`or`);if(i||a){let i=[],o;if(a){let a=e;o=a.type===`and`;for(let e of a.filters||[]){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}else{let a=e;o=`and`in a&&!!a.and;let s=a.and||a.or||[];for(let e of s){let a=this.buildFilterCondition(e,t,n,r);a&&i.push(a)}}return i.length===0?null:i.length===1?i[0]:o?P(...i):D`(${D.join(i,D` OR `)})`}let o=e,[s,c]=o.member.split(`.`),l=o.dateRange!==void 0;if(o.operator!==`set`&&o.operator!==`notSet`&&!l&&(!o.values||o.values.length===0||o.values[0]===void 0||o.values[0]===``))return null;let u=n.get(s);if(!u)return null;if(s!==t.name){let e=new vt(n).findPath(t.name,s);if(!e||e.length===0)return console.warn(`Funnel filter: Cannot filter by '${String(s).replace(/\n|\r/g,``)}.${String(c).replace(/\n|\r/g,``)}' in step using '${String(t.name).replace(/\n|\r/g,``)}'. No join path found. Filter will be skipped.`),null}let d=u.dimensions?.[c];if(!d)return null;let f=d.type===`time`?W(d.sql,r):typeof d.sql==`function`?d.sql(r):d.sql;return this.filterBuilder.buildFilterCondition(f,o.operator,o.values||[],d,o.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(e,t){let n=`step_${e.index}`,r=e.cube.sql(t),i=[];r.where&&i.push(r.where),i.push(...e.filterConditions);let a=t.db.select({binding_key:D`${e.bindingKeyExpr}`.as(`binding_key`),step_time:D`MIN(${e.timeExpr})`.as(`step_time`)}).from(r.from);if(a=this.addCrossJoinsToQuery(a,e,t,i),i.length>0){let e=i.length===1?i[0]:P(...i);a=a.where(e)}return a=a.groupBy(e.bindingKeyExpr),t.db.$with(n).as(a)}buildSubsequentStepCTE(e,t,n){let r=`step_${e.index}`,i=`step_${e.index-1}`,a=e.cube.sql(t),o=[];a.where&&o.push(a.where),o.push(...e.filterConditions);let s=D`${D.identifier(i)}.step_time`,c=D`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=D`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:D`${e.bindingKeyExpr}`.as(`binding_key`),step_time:D`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,D`${e.bindingKeyExpr} = ${D.identifier(i)}.binding_key`);if(l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0){let e=o.length===1?o[0]:P(...o);l=l.where(e)}return l=l.groupBy(e.bindingKeyExpr),t.db.$with(r).as(l)}addCrossJoinsToQuery(e,t,n,r){if(t.joinedCubes.length===0)return e;for(let i of t.joinedCubes)for(let t of i.joinPath){let a=t.joinDef,o=[];for(let e of a.on)e.as?o.push(e.as(e.source,e.target)):o.push(M(e.source,e.target));let s=o.length===1?o[0]:P(...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:D`s0.binding_key`,step_0_time:D`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=D`s${D.raw(String(e))}.step_time`;let a=D`${D.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=D`${a}
|
|
63
63
|
LEFT JOIN ${D.identifier(`step_${e}`)} s${D.raw(String(e))} ON s0.binding_key = s${D.raw(String(e))}.binding_key`;let o=Object.entries(i).map(([e,t])=>D`${t} AS ${D.identifier(e)}`),s=D`SELECT ${D.join(o,D`, `)} FROM ${a}`;return r.db.$with(`funnel_joined`).as(s)}buildAggregationCTE(e,t,n,r,i){let a={};a.step_0_count=D`COUNT(*)`.as(`step_0_count`);for(let e=1;e<n.length;e++)a[`step_${e}_count`]=D`COUNT(${D.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(r.includeTimeMetrics)for(let e=1;e<n.length;e++){let t=D.identifier(`step_${e}_time`),n=D.identifier(`step_${e-1}_time`),r=this.databaseAdapter.buildTimeDifferenceSeconds(D`${t}`,D`${n}`),i=D`${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`]=D`(SELECT ${n} FROM ${D.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`]=D`(SELECT ${i} FROM ${D.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)}},jt=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new Y(e),this.filterBuilder=new X(e,this.dateTimeBuilder)}hasFlow(e){return e.flow!==void 0&&e.flow.startingStep!==void 0&&e.flow.eventDimension!==void 0}validateConfig(e,t){let n=[],r=[],i=this.databaseAdapter.getEngineType(),a=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;if(i===`sqlite`)return n.push(`Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.`),{isValid:!1,errors:n,warnings:r};if(typeof e.bindingKey==`string`){let[r,i]=e.bindingKey.split(`.`);if(!r||!i)n.push(`Invalid binding key format: ${e.bindingKey}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Binding key dimension not found: ${i} in cube ${r}`):n.push(`Binding key cube not found: ${r}`)}}else if(Array.isArray(e.bindingKey))for(let r of e.bindingKey){let e=t.get(r.cube);if(!e)n.push(`Binding key mapping cube not found: ${r.cube}`);else{let[,t]=r.dimension.split(`.`);e.dimensions?.[t]||n.push(`Binding key dimension not found: ${t} in cube ${r.cube}`)}}if(typeof e.timeDimension==`string`){let[r,i]=e.timeDimension.split(`.`);if(!r||!i)n.push(`Invalid time dimension format: ${e.timeDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Time dimension not found: ${i} in cube ${r}`):n.push(`Time dimension cube not found: ${r}`)}}if(e.eventDimension){let[r,i]=e.eventDimension.split(`.`);if(!r||!i)n.push(`Invalid event dimension format: ${e.eventDimension}. Expected 'CubeName.dimensionName'`);else{let e=t.get(r);e?e.dimensions?.[i]||n.push(`Event dimension not found: ${i} in cube ${r}`):n.push(`Event dimension cube not found: ${r}`)}}else n.push(`Event dimension is required for flow analysis`);return e.startingStep?(e.startingStep.filter||n.push(`Starting step must have at least one filter`),e.startingStep.name||r.push(`Starting step has no name - using default`)):n.push(`Starting step is required for flow analysis`),(e.stepsBefore<0||e.stepsBefore>5)&&n.push(`stepsBefore must be between 0 and 5, got: ${e.stepsBefore}`),(e.stepsAfter<0||e.stepsAfter>5)&&n.push(`stepsAfter must be between 0 and 5, got: ${e.stepsAfter}`),(e.stepsBefore>=4||e.stepsAfter>=4)&&r.push(`High step depth (4-5) may impact query performance on large datasets`),e.joinStrategy&&![`auto`,`lateral`,`window`].includes(e.joinStrategy)?n.push(`Invalid joinStrategy: ${e.joinStrategy}`):e.joinStrategy===`lateral`&&!a&&n.push(`Lateral joins are not supported on this database`),{isValid:n.length===0,errors:n,warnings:r}}buildFlowQuery(e,t,n){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(`Flow queries are not supported on SQLite. Use PostgreSQL or MySQL for flow analysis.`);let r=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,i=e.joinStrategy??`auto`,a=i===`lateral`||i===`auto`&&r;if(i===`lateral`&&!r)throw Error(`Lateral joins with CTE references are not supported on this database`);let o={...e,stepsBefore:e.outputMode===`sunburst`?0:e.stepsBefore},s=this.resolveFlowConfig(o,t,n),c=[],l=this.buildStartingEntitiesCTE(o,s,n);c.push(l);let u=a?this.buildBeforeCTEsLateral(o,s,n):this.buildBeforeCTEsWindow(o,s,n);c.push(...u);let d=a?this.buildAfterCTEsLateral(o,s,n):this.buildAfterCTEsWindow(o,s,n);c.push(...d);let f=this.buildNodesAggregationCTE(o,n);c.push(f);let p=this.buildLinksAggregationCTE(o,n);c.push(p);let m=this.buildFinalResultCTE(n);return c.push(m),n.db.with(...c).select().from(m)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(e,t){let n;if(typeof e.bindingKey==`string`)[n]=e.bindingKey.split(`.`);else if(Array.isArray(e.bindingKey)&&e.bindingKey.length>0)n=e.bindingKey[0].cube;else throw Error(`Cannot resolve cube for flow query`);let r=t.get(n);if(!r)throw Error(`Cube not found: ${n}`);return r}resolveBindingKey(e,t,n){if(typeof e.bindingKey==`string`){let[,r]=e.bindingKey.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Binding key dimension not found: ${e.bindingKey}`);return W(i.sql,n)}let r=e.bindingKey.find(e=>e.cube===t.name);if(!r)throw Error(`No binding key mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Binding key dimension not found: ${r.dimension}`);return W(a.sql,n)}resolveTimeDimension(e,t,n){if(typeof e.timeDimension==`string`){let[,r]=e.timeDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Time dimension not found: ${e.timeDimension}`);return W(i.sql,n)}let r=e.timeDimension.find(e=>e.cube===t.name);if(!r)throw Error(`No time dimension mapping found for cube: ${t.name}`);let[,i]=r.dimension.split(`.`),a=t.dimensions?.[i];if(!a)throw Error(`Time dimension not found: ${r.dimension}`);return W(a.sql,n)}resolveEventDimension(e,t,n){let[,r]=e.eventDimension.split(`.`),i=t.dimensions?.[r];if(!i)throw Error(`Event dimension not found: ${e.eventDimension}`);return W(i.sql,n)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(e,t,n){if(`and`in e||`or`in e){let r=e,i=[],a=r.and||r.or||[];for(let e of a){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i.length===0?null:i.length===1?i[0]:`and`in e?P(...i):D`(${D.join(i,D` OR `)})`}if(`type`in e&&`filters`in e){let r=e,i=[];for(let e of r.filters||[]){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i.length===0?null:i.length===1?i[0]:r.type===`and`?P(...i):D`(${D.join(i,D` OR `)})`}let r=e,[,i]=r.member.split(`.`),a=t.dimensions?.[i];if(!a)return null;let o=a.type===`time`?W(a.sql,n):typeof a.sql==`function`?a.sql(n):a.sql;return this.filterBuilder.buildFilterCondition(o,r.operator,r.values||[],a,r.dateRange)}buildStartingEntitiesCTE(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o,startingStepFilters:s}=t,c=[];r.where&&c.push(r.where),c.push(...s);let l=n.db.select({binding_key:D`${i}`.as(`binding_key`),start_time:D`MIN(${a})`.as(`start_time`),event_type:D`${o}`.as(`event_type`),event_path:D`${o}`.as(`event_path`)}).from(r.from);if(c.length>0){let e=c.length===1?c[0]:P(...c);l=l.where(e)}return l=l.groupBy(i,o),e.entityLimit&&(l=l.limit(e.entityLimit)),n.db.$with(`starting_entities`).as(l)}buildBeforeCTEsLateral(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsBefore;t++){let e=t===1?`starting_entities`:`before_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`before_step_${t}`,d=[];r.where&&d.push(r.where),d.push(D`${i} = ${D.identifier(e)}.binding_key`,D`${a} < ${D.identifier(e)}.${D.identifier(l)}`);let f=d.length===1?d[0]:P(...d),p=c?D`${o} || ${`→`} || ${D.identifier(e)}.event_path`:D`${o}`,m=n.db.select({binding_key:D`${i}`.as(`binding_key`),step_time:D`${a}`.as(`step_time`),event_type:D`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(D`${a} DESC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:D`e.binding_key`.as(`binding_key`),step_time:D`e.step_time`.as(`step_time`),event_type:D`e.event_type`.as(`event_type`),event_path:D`e.event_path`.as(`event_path`)}).from(D`${D.identifier(e)}`).crossJoinLateral(m.as(`e`)));s.push(h)}return s}buildAfterCTEsLateral(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsAfter;t++){let e=t===1?`starting_entities`:`after_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`after_step_${t}`,d=[];r.where&&d.push(r.where),d.push(D`${i} = ${D.identifier(e)}.binding_key`,D`${a} > ${D.identifier(e)}.${D.identifier(l)}`);let f=d.length===1?d[0]:P(...d),p=c?D`${D.identifier(e)}.event_path || ${`→`} || ${o}`:D`${o}`,m=n.db.select({binding_key:D`${i}`.as(`binding_key`),step_time:D`${a}`.as(`step_time`),event_type:D`${o}`.as(`event_type`),event_path:p.as(`event_path`)}).from(r.from).where(f).orderBy(D`${a} ASC`).limit(1),h=n.db.$with(u).as(n.db.select({binding_key:D`e.binding_key`.as(`binding_key`),step_time:D`e.step_time`.as(`step_time`),event_type:D`e.event_type`.as(`event_type`),event_path:D`e.event_path`.as(`event_path`)}).from(D`${D.identifier(e)}`).crossJoinLateral(m.as(`e`)));s.push(h)}return s}buildBeforeCTEsWindow(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsBefore;t++){let e=t===1?`starting_entities`:`before_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`before_step_${t}`,d=[];r.where&&d.push(r.where),d.push(D`${a} < ${D.identifier(e)}.${D.identifier(l)}`);let f=d.length===1?d[0]:P(...d),p=c?D`${o} || ${`→`} || ${D.identifier(e)}.event_path`:D`${o}`,m=n.db.select({binding_key:D`${i}`.as(`binding_key`),step_time:D`${a}`.as(`step_time`),event_type:D`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:D`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} DESC)`.as(`rn`)}).from(r.from).innerJoin(D`${D.identifier(e)}`,D`${i} = ${D.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:D`binding_key`.as(`binding_key`),step_time:D`step_time`.as(`step_time`),event_type:D`event_type`.as(`event_type`),event_path:D`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(D`rn = 1`);s.push(n.db.$with(u).as(h))}return s}buildAfterCTEsWindow(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o}=t,s=[],c=e.outputMode===`sunburst`;for(let t=1;t<=e.stepsAfter;t++){let e=t===1?`starting_entities`:`after_step_${t-1}`,l=t===1?`start_time`:`step_time`,u=`after_step_${t}`,d=[];r.where&&d.push(r.where),d.push(D`${a} > ${D.identifier(e)}.${D.identifier(l)}`);let f=d.length===1?d[0]:P(...d),p=c?D`${D.identifier(e)}.event_path || ${`→`} || ${o}`:D`${o}`,m=n.db.select({binding_key:D`${i}`.as(`binding_key`),step_time:D`${a}`.as(`step_time`),event_type:D`${o}`.as(`event_type`),event_path:p.as(`event_path`),rn:D`ROW_NUMBER() OVER (PARTITION BY ${i} ORDER BY ${a} ASC)`.as(`rn`)}).from(r.from).innerJoin(D`${D.identifier(e)}`,D`${i} = ${D.identifier(e)}.binding_key`).where(f),h=n.db.select({binding_key:D`binding_key`.as(`binding_key`),step_time:D`step_time`.as(`step_time`),event_type:D`event_type`.as(`event_type`),event_path:D`event_path`.as(`event_path`)}).from(m.as(`ranked`)).where(D`rn = 1`);s.push(n.db.$with(u).as(h))}return s}buildNodesAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=1;t--){let e=-t,i=`before_step_${t}`;r?n.push(D`
|
|
64
64
|
SELECT
|
|
65
65
|
${D.raw(`'before_${t}_'`)} || event_path AS node_id,
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-CPE-YZfe.cjs`),n=require(`../mcp-transport-Kk_HTCeR.cjs`);let r=require(`express`);r=e._(r);let i=require(`cors`);i=e._(i);function a(a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,jsonLimit:p=`10mb`,cache:m,mcp:h={enabled:!0},agent:g}=a;if(!o||o.length===0)throw Error(`At least one cube must be provided in the cubes array`);let _=(0,r.Router)();d&&_.use((0,i.default)(d)),_.use(r.default.json({limit:p})),_.use(r.default.urlencoded({extended:!0,limit:p}));let v=new t.t({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:a.rlsSetup});if(o.forEach(e=>{v.registerCube(e)}),_.post(`${f}/load`,async(t,n)=>{try{let r=t.body.query||t.body,i=await l(t,n),a=v.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=t.headers[`x-cache-control`]===`no-cache`,s=await v.executeMultiCubeQuery(r,i,{skipCache:o});n.json(e.r(r,s,v))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.get(`${f}/load`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i;try{i=JSON.parse(r)}catch{return n.status(400).json(e.i(`Invalid JSON in query parameter`,400))}let a=await l(t,n),o=v.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,c=await v.executeMultiCubeQuery(i,a,{skipCache:s});n.json(e.r(i,c,v))}catch(t){console.error(`Query execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Query execution failed`,500))}}),_.post(`${f}/batch`,async(t,n)=>{try{let{queries:r}=t.body;if(!r||!Array.isArray(r))return n.status(400).json(e.i(`Request body must contain a "queries" array`,400));if(r.length===0)return n.status(400).json(e.i(`Queries array cannot be empty`,400));let i=await e.u(r,await l(t,n),v,{skipCache:t.headers[`x-cache-control`]===`no-cache`});n.json(i)}catch(t){console.error(`Batch execution error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Batch execution failed`,500))}}),_.get(`${f}/meta`,(t,n)=>{try{let t=v.getMetadata();n.json(e.a(t))}catch(t){console.error(`Metadata error:`,t),n.status(500).json(e.i(t instanceof Error?t.message:`Failed to fetch metadata`,500))}}),_.post(`${f}/sql`,async(t,n)=>{try{let r=t.body,i=await l(t,n),a=v.validateQuery(r);if(!a.isValid)return n.status(400).json(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0],c=await v.generateSQL(s,r,i);n.json(e.o(r,c))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),_.get(`${f}/sql`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json(e.i(`Query parameter is required`,400));let i=JSON.parse(r),a=await l(t,n),o=v.validateQuery(i);if(!o.isValid)return n.status(400).json(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).json(e.i(`No measures or dimensions specified`,400));let c=s.split(`.`)[0],u=await v.generateSQL(c,i,a);n.json(e.o(i,u))}catch(t){console.error(`SQL generation error:`,String(t).replace(/\n|\r/g,``)),n.status(500).json(e.i(t instanceof Error?t.message:`SQL generation failed`,500))}}),_.post(`${f}/dry-run`,async(t,n)=>{try{let r=await e.f(t.body.query||t.body,await l(t,n),v);n.json(r)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),_.get(`${f}/dry-run`,async(t,n)=>{try{let r=t.query.query;if(!r)return n.status(400).json({error:`Query parameter is required`,valid:!1});let i=await e.f(JSON.parse(r),await l(t,n),v);n.json(i)}catch(e){console.error(`Dry-run error:`,e),n.status(400).json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),_.post(`${f}/explain`,async(e,t)=>{try{let n=e.body.query||e.body,r=e.body.options||{},i=await l(e,t),a=v.validateQuery(n);if(!a.isValid)return t.status(400).json({error:`Query validation failed: ${a.errors.join(`, `)}`});let o=await v.explainQuery(n,i,r);t.json(o)}catch(e){console.error(`Explain error:`,e),t.status(500).json({error:e instanceof Error?e.message:`Explain query failed`})}}),g&&_.post(`${f}/agent/chat`,async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DumFgnNM.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).json({error:`message is required and must be a string`});let o=(g.apiKey||``).trim();if(g.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await l(e,t),f=g.buildSystemContext?.(d);t.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:v,securityContext:d,agentConfig:g,apiKey:o,systemContext:f,providerOverride:s,modelOverride:c,baseURLOverride:u});for await(let n of e)t.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.end()}}catch(e){console.error(`Agent chat error:`,e),t.headersSent||t.status(500).json({error:e instanceof Error?e.message:`Agent chat failed`})}}),h.enabled!==!1){let e=h.basePath??`/mcp`;_.post(`${e}`,async(e,t)=>{let r=n._(e.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!r.valid)return t.status(403).json(n.i(null,-32600,r.reason));let i=e.headers.accept;if(!n.g(i))return t.status(400).json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=n.f(e.headers);if(!a.ok)return t.status(426).json({error:`Unsupported MCP protocol version`,supported:a.supported});let o=n.p(e.body);if(!o)return t.status(400).json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=n.v(i),c=o.method===`initialize`;try{let r=await n.s(o.method,o.params,{semanticLayer:v,extractSecurityContext:l,rawRequest:e,rawResponse:t,negotiatedProtocol:a.negotiated,appEnabled:!!h.app});if(n.d(o))return t.status(202).end();let i=c&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&t.setHeader(n.r,i);let u=n.a(o.id??null,r);if(s){let e=n.m();return t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(`id: ${e}\n\n`),t.write(n.h(u,e)),t.end()}return t.json(u)}catch(e){if(n.d(o))return console.error(`MCP notification processing error:`,String(e).replace(/\n|\r/g,``)),t.status(202).end();console.error(`MCP RPC error:`,String(e).replace(/\n|\r/g,``));let r=e?.code??-32603,i=e?.data,a=e.message||`MCP request failed`,c=n.i(o.id??null,r,a,i);if(s){let e=n.m();return t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(`id: ${e}\n\n`),t.write(n.h(c,e)),t.end()}return t.status(200).json(c)}}),_.get(`${e}`,async(e,t)=>{let r=n.m();t.status(200),t.setHeader(`Content-Type`,`text/event-stream`),t.setHeader(`Cache-Control`,`no-cache`),t.setHeader(`Connection`,`keep-alive`),t.write(n.h({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.write(`: keep-alive
|
|
2
2
|
|
|
3
3
|
`)},15e3);e.on(`close`,()=>{clearInterval(i)})}),_.delete(`${e}`,(e,t)=>t.status(405).json({error:`Session termination not supported`}))}return _.use((t,n,r,i)=>{console.error(`Express adapter error:`,t),r.headersSent||r.status(500).json(e.i(t,500))}),_}function o(e,t){let n=a(t);return e.use(`/`,n),e}function s(e){return o((0,r.default)(),e)}exports.createCubeApp=s,exports.createCubeRouter=a,exports.mountCubeRoutes=o;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as e, f as t, i as n, o as r, r as i, u as a } from "../utils-IH1ePsBd.js";
|
|
2
|
-
import { t as o } from "../compiler-
|
|
3
|
-
import { _ as s, a as c, d as l, f as u, g as d, h as f, i as p, m, p as h, r as g, s as _, v } from "../mcp-transport-
|
|
2
|
+
import { t as o } from "../compiler-BXfrvebp.js";
|
|
3
|
+
import { _ as s, a as c, d as l, f as u, g as d, h as f, i as p, m, p as h, r as g, s as _, v } from "../mcp-transport-BhPqU0Ft.js";
|
|
4
4
|
import y, { Router as b } from "express";
|
|
5
5
|
import x from "cors";
|
|
6
6
|
//#region src/adapters/express/index.ts
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-CPE-YZfe.cjs`),n=require(`../mcp-transport-Kk_HTCeR.cjs`);var r=function(r,i,a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,bodyLimit:p=10485760,cache:m,mcp:h={enabled:!0},agent:g}=i;if(!o||o.length===0)return a(Error(`At least one cube must be provided in the cubes array`));d&&r.register(import(`@fastify/cors`),d),r.addHook(`onRequest`,async(e,t)=>{e.method===`POST`&&(e.body=void 0)});let _=new t.t({drizzle:s,schema:c,engineType:u,cache:m,rlsSetup:i.rlsSetup});if(o.forEach(e=>{_.registerCube(e)}),r.post(`${f}/load`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=r.query||r,a=await l(t),o=_.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`;return e.r(i,await _.executeMultiCubeQuery(i,a,{skipCache:s}),_)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),r.get(`${f}/load`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i;try{i=JSON.parse(r)}catch{return n.status(400).send(e.i(`Invalid JSON in query parameter`,400))}let a=await l(t),o=_.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=t.headers[`x-cache-control`]===`no-cache`,c=await _.executeMultiCubeQuery(i,a,{skipCache:s});return e.r(i,c,_)}catch(r){return t.log.error(r,`Query execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Query execution failed`,500))}}),r.post(`${f}/batch`,{bodyLimit:p,schema:{body:{type:`object`,required:[`queries`],properties:{queries:{type:`array`,items:{type:`object`}}}}}},async(t,n)=>{try{let{queries:r}=t.body;return!r||!Array.isArray(r)?n.status(400).send(e.i(`Request body must contain a "queries" array`,400)):r.length===0?n.status(400).send(e.i(`Queries array cannot be empty`,400)):await e.u(r,await l(t),_,{skipCache:t.headers[`x-cache-control`]===`no-cache`})}catch(r){return t.log.error(r,`Batch execution error`),n.status(500).send(e.i(r instanceof Error?r.message:`Batch execution failed`,500))}}),r.get(`${f}/meta`,async(t,n)=>{try{return e.a(_.getMetadata())}catch(r){return t.log.error(r,`Metadata error`),n.status(500).send(e.i(r instanceof Error?r.message:`Failed to fetch metadata`,500))}}),r.post(`${f}/sql`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let r=t.body,i=await l(t),a=_.validateQuery(r);if(!a.isValid)return n.status(400).send(e.i(`Query validation failed: ${a.errors.join(`, `)}`,400));let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let s=o.split(`.`)[0];return e.o(r,await _.generateSQL(s,r,i))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),r.get(`${f}/sql`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:r}=t.query,i=JSON.parse(r),a=await l(t),o=_.validateQuery(i);if(!o.isValid)return n.status(400).send(e.i(`Query validation failed: ${o.errors.join(`, `)}`,400));let s=i.measures?.[0]||i.dimensions?.[0];if(!s)return n.status(400).send(e.i(`No measures or dimensions specified`,400));let c=s.split(`.`)[0];return e.o(i,await _.generateSQL(c,i,a))}catch(r){return t.log.error({err:String(r).replace(/\n|\r/g,``)},`SQL generation error`),n.status(500).send(e.i(r instanceof Error?r.message:`SQL generation failed`,500))}}),r.post(`${f}/dry-run`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(t,n)=>{try{let n=t.body;return await e.f(n.query||n,await l(t),_)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),r.get(`${f}/dry-run`,{schema:{querystring:{type:`object`,properties:{query:{type:`string`}},required:[`query`]}}},async(t,n)=>{try{let{query:n}=t.query;return await e.f(JSON.parse(n),await l(t),_)}catch(e){return t.log.error(e,`Dry-run error`),n.status(400).send({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1})}}),r.post(`${f}/explain`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let n=e.body,r=n.query||n,i=n.options||{},a=await l(e),o=_.validateQuery(r);return o.isValid?await _.explainQuery(r,a,i):t.status(400).send({error:`Query validation failed: ${o.errors.join(`, `)}`})}catch(n){return e.log.error(n,`Explain error`),t.status(500).send({error:n instanceof Error?n.message:`Explain query failed`})}}),g&&r.post(`${f}/agent/chat`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{try{let{handleAgentChat:n}=await Promise.resolve().then(()=>require(`../handler-DumFgnNM.cjs`)),{message:r,sessionId:i,history:a}=e.body;if(!r||typeof r!=`string`)return t.status(400).send({error:`message is required and must be a string`});let o=(g.apiKey||``).trim();if(g.allowClientApiKey){let t=e.headers[`x-agent-api-key`];t&&(o=t.trim())}if(!o)return t.status(401).send({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`});let s=g.allowClientApiKey?e.headers[`x-agent-provider`]:void 0,c=g.allowClientApiKey?e.headers[`x-agent-model`]:void 0,u=g.allowClientApiKey?e.headers[`x-agent-provider-endpoint`]:void 0,d=await l(e),f=g.buildSystemContext?.(d);t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`});try{let e=n({message:r,sessionId:i,history:a,semanticLayer:_,securityContext:d,agentConfig:g,apiKey:o,systemContext:f,providerOverride:s,modelOverride:c,baseURLOverride:u});for await(let n of e)t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}catch(e){let n={type:`error`,data:{message:e instanceof Error?e.message:`Stream failed`}};t.raw.write(`data: ${JSON.stringify(n)}\n\n`)}finally{t.raw.end()}}catch(n){if(e.log.error(n,`Agent chat error`),!t.raw.headersSent)return t.status(500).send({error:n instanceof Error?n.message:`Agent chat failed`})}}),h.enabled!==!1){let e=h.basePath??`/mcp`;r.post(`${e}`,{bodyLimit:p,schema:{body:{type:`object`,additionalProperties:!0}}},async(e,t)=>{let r=n._(e.headers.origin,h.allowedOrigins?{allowedOrigins:h.allowedOrigins}:{});if(!r.valid)return t.status(403).send(n.i(null,-32600,r.reason));let i=e.headers.accept;if(!n.g(i))return t.status(400).send(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`));let a=n.f(e.headers);if(!a.ok)return t.status(426).send({error:`Unsupported MCP protocol version`,supported:a.supported});let o=n.p(e.body);if(!o)return t.status(400).send(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`));let s=n.v(i),c=o.method===`initialize`;try{let r=await n.s(o.method,o.params,{semanticLayer:_,extractSecurityContext:l,rawRequest:e,rawResponse:t,negotiatedProtocol:a.negotiated,appEnabled:!!h.app});if(n.d(o))return t.status(202).send();let i=c&&r&&typeof r==`object`&&`sessionId`in r?r.sessionId:void 0;i&&t.header(n.r,i);let u=n.a(o.id??null,r);if(s){let e=n.m();t.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n.h(u,e)}`);return}return t.send(u)}catch(r){if(n.d(o))return e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP notification processing error`),t.status(202).send();e.log.error({err:String(r).replace(/\n|\r/g,``)},`MCP RPC error`);let i=r?.code??-32603,a=r?.data,c=r.message||`MCP request failed`,l=n.i(o.id??null,i,c,a);if(s){let e=n.m();t.header(`Content-Type`,`text/event-stream`).header(`Cache-Control`,`no-cache`).header(`Connection`,`keep-alive`).send(`id: ${e}\n\n${n.h(l,e)}`);return}return t.send(l)}}),r.get(`${e}`,async(e,t)=>{let r=n.m();t.raw.writeHead(200,{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}),t.raw.write(n.h({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3));let i=setInterval(()=>{t.raw.write(`: keep-alive
|
|
2
2
|
|
|
3
3
|
`)},15e3);e.raw.on(`close`,()=>{clearInterval(i)})}),r.delete(`${e}`,async(e,t)=>t.status(405).send({error:`Session termination not supported`}))}r.setErrorHandler(async(t,n,r)=>(n.log.error(t,`Fastify cube adapter error`),r.statusCode<400&&r.status(500),e.i(t instanceof Error?t:String(t),r.statusCode))),a()};async function i(e,t){await e.register(r,t)}function a(e){let t=require(`fastify`)({logger:!0});return t.register(r,e),t}exports.createCubeApp=a,exports.cubePlugin=r,exports.registerCubeRoutes=i;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _ as e, a as t, f as n, i as r, o as i, r as a, u as o } from "../utils-IH1ePsBd.js";
|
|
2
|
-
import { t as s } from "../compiler-
|
|
3
|
-
import { _ as c, a as l, d as u, f as d, g as f, h as p, i as m, m as h, p as g, r as _, s as v, v as y } from "../mcp-transport-
|
|
2
|
+
import { t as s } from "../compiler-BXfrvebp.js";
|
|
3
|
+
import { _ as c, a as l, d as u, f as d, g as f, h as p, i as m, m as h, p as g, r as _, s as v, v as y } from "../mcp-transport-BhPqU0Ft.js";
|
|
4
4
|
//#region src/adapters/fastify/index.ts
|
|
5
5
|
var b = function(e, b, x) {
|
|
6
6
|
let { cubes: S, drizzle: C, schema: w, extractSecurityContext: T, engineType: E, cors: D, basePath: O = "/cubejs-api/v1", bodyLimit: k = 10485760, cache: A, mcp: j = { enabled: !0 }, agent: M } = b;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../utils-CyBt-as9.cjs`),t=require(`../compiler-CPE-YZfe.cjs`),n=require(`../mcp-transport-Kk_HTCeR.cjs`);let r=require(`hono`);var i=e=>{let t={origin:`*`,allowMethods:[`GET`,`HEAD`,`PUT`,`POST`,`DELETE`,`PATCH`],allowHeaders:[],exposeHeaders:[],...e},n=(e=>typeof e==`string`?e===`*`?t.credentials?e=>e||null:()=>e:t=>e===t?t:null:typeof e==`function`?e:t=>e.includes(t)?t:null)(t.origin),r=(e=>typeof e==`function`?e:Array.isArray(e)?()=>e:()=>[])(t.allowMethods);return async function(e,i){function a(t,n){e.res.headers.set(t,n)}let o=await n(e.req.header(`origin`)||``,e);if(o&&a(`Access-Control-Allow-Origin`,o),t.credentials&&a(`Access-Control-Allow-Credentials`,`true`),t.exposeHeaders?.length&&a(`Access-Control-Expose-Headers`,t.exposeHeaders.join(`,`)),e.req.method===`OPTIONS`){(t.origin!==`*`||t.credentials)&&a(`Vary`,`Origin`),t.maxAge!=null&&a(`Access-Control-Max-Age`,t.maxAge.toString());let n=await r(e.req.header(`origin`)||``,e);n.length&&a(`Access-Control-Allow-Methods`,n.join(`,`));let i=t.allowHeaders;if(!i?.length){let t=e.req.header(`Access-Control-Request-Headers`);t&&(i=t.split(/\s*,\s*/))}return i?.length&&(a(`Access-Control-Allow-Headers`,i.join(`,`)),e.res.headers.append(`Vary`,`Access-Control-Request-Headers`)),e.res.headers.delete(`Content-Length`),e.res.headers.delete(`Content-Type`),new Response(null,{headers:e.res.headers,status:204,statusText:`No Content`})}await i(),(t.origin!==`*`||t.credentials)&&e.header(`Vary`,`Origin`,{append:!0})}};function a(a){let{cubes:o,drizzle:s,schema:c,extractSecurityContext:l,engineType:u,cors:d,basePath:f=`/cubejs-api/v1`,cache:p,mcp:m={enabled:!0},agent:h}=a;if(!a.semanticLayer&&(!o||o.length===0))throw Error(`Either semanticLayer or a non-empty cubes array must be provided`);let g=new r.Hono;d&&g.use(`/*`,i(d));let _=a.semanticLayer??new t.t({drizzle:s,schema:c,engineType:u,cache:p,rlsSetup:a.rlsSetup});if(!a.semanticLayer&&o&&o.forEach(e=>{_.registerCube(e)}),g.post(`${f}/load`,async t=>{try{let n=await t.req.json(),r=n.query||n,i=await l(t),a=_.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,_))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),g.get(`${f}/load`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r;try{r=JSON.parse(n)}catch{return t.json({error:`Invalid JSON in query parameter`},400)}let i=await l(t),a=_.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=t.req.header(`x-cache-control`)===`no-cache`,s=await _.executeMultiCubeQuery(r,i,{skipCache:o});return t.json(e.r(r,s,_))}catch(e){return console.error(`Query execution error:`,e),t.json({error:e instanceof Error?e.message:`Query execution failed`},500)}}),g.post(`${f}/batch`,async t=>{try{let{queries:n}=await t.req.json();if(!n||!Array.isArray(n))return t.json({error:`Request body must contain a "queries" array`},400);if(n.length===0)return t.json({error:`Queries array cannot be empty`},400);let r=await e.u(n,await l(t),_,{skipCache:t.req.header(`x-cache-control`)===`no-cache`});return t.json(r)}catch(e){return console.error(`Batch execution error:`,e),t.json({error:e instanceof Error?e.message:`Batch execution failed`},500)}}),g.get(`${f}/meta`,t=>{try{let n=_.getMetadata();return t.json(e.a(n))}catch(e){return console.error(`Metadata error:`,e),t.json({error:e instanceof Error?e.message:`Failed to fetch metadata`},500)}}),g.post(`${f}/sql`,async t=>{try{let n=await t.req.json(),r=await l(t),i=_.validateQuery(n);if(!i.isValid)return t.json({error:`Query validation failed: ${i.errors.join(`, `)}`},400);let a=n.measures?.[0]||n.dimensions?.[0];if(!a)return t.json({error:`No measures or dimensions specified`},400);let o=a.split(`.`)[0],s=await _.generateSQL(o,n,r);return t.json(e.o(n,s))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),g.get(`${f}/sql`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`},400);let r=JSON.parse(n),i=await l(t),a=_.validateQuery(r);if(!a.isValid)return t.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=r.measures?.[0]||r.dimensions?.[0];if(!o)return t.json({error:`No measures or dimensions specified`},400);let s=o.split(`.`)[0],c=await _.generateSQL(s,r,i);return t.json(e.o(r,c))}catch(e){return console.error(`SQL generation error:`,e),t.json({error:e instanceof Error?e.message:`SQL generation failed`},500)}}),g.post(`${f}/dry-run`,async t=>{try{let n=await t.req.json(),r=await e.f(n.query||n,await l(t),_);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),g.get(`${f}/dry-run`,async t=>{try{let n=t.req.query(`query`);if(!n)return t.json({error:`Query parameter is required`,valid:!1},400);let r=await e.f(JSON.parse(n),await l(t),_);return t.json(r)}catch(e){return console.error(`Dry-run error:`,e),t.json({error:e instanceof Error?e.message:`Dry-run validation failed`,valid:!1},400)}}),g.post(`${f}/explain`,async e=>{try{let t=await e.req.json(),n=t.query||t,r=t.options||{},i=await l(e),a=_.validateQuery(n);if(!a.isValid)return e.json({error:`Query validation failed: ${a.errors.join(`, `)}`},400);let o=await _.explainQuery(n,i,r);return e.json(o)}catch(t){return console.error(`Explain error:`,t),e.json({error:t instanceof Error?t.message:`Explain query failed`},500)}}),h&&g.post(`${f}/agent/chat`,async e=>{try{let{handleAgentChat:t}=await Promise.resolve().then(()=>require(`../handler-DumFgnNM.cjs`)),{message:n,sessionId:r,history:i}=await e.req.json();if(!n||typeof n!=`string`)return e.json({error:`message is required and must be a string`},400);let a=(h.apiKey||``).trim();if(h.allowClientApiKey){let t=e.req.header(`x-agent-api-key`);t&&(a=t.trim())}if(!a)return e.json({error:`No API key configured. Set agent.apiKey in server config or send X-Agent-Api-Key header.`},401);let o=h.allowClientApiKey?e.req.header(`x-agent-provider`):void 0,s=h.allowClientApiKey?e.req.header(`x-agent-model`):void 0,c=h.allowClientApiKey?e.req.header(`x-agent-provider-endpoint`):void 0,u=await l(e),d=h.buildSystemContext?.(u),f=new TextEncoder,p=new ReadableStream({async start(e){try{let l=t({message:n,sessionId:r,history:i,semanticLayer:_,securityContext:u,agentConfig:h,apiKey:a,systemContext:d,providerOverride:o,modelOverride:s,baseURLOverride:c});for await(let t of l){let n=`data: ${JSON.stringify(t)}\n\n`;e.enqueue(f.encode(n))}}catch(t){let n={type:`error`,data:{message:t instanceof Error?t.message:`Stream failed`}};e.enqueue(f.encode(`data: ${JSON.stringify(n)}\n\n`))}finally{e.close()}}});return new Response(p,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}catch(t){return console.error(`Agent chat error:`,t),e.json({error:t instanceof Error?t.message:`Agent chat failed`},500)}}),m.enabled!==!1){let e={uri:`drizzle-cube://schema`,name:`Cube Schema`,description:`Current cube metadata as JSON`,mimeType:`application/json`,text:JSON.stringify(_.getMetadata(),null,2)},t=[...n.l(),e],r=n.c(),i=m.basePath??`/mcp`;g.post(`${i}`,async e=>{let i=n._(e.req.header(`origin`),m.allowedOrigins?{allowedOrigins:m.allowedOrigins}:{});if(!i.valid)return e.json(n.i(null,-32600,i.reason),403);let a=e.req.header(`accept`);if(!n.g(a))return e.json(n.i(null,-32600,`Accept header must include both application/json and text/event-stream`),400);let o=n.f(e.req.header());if(!o.ok)return e.json({error:`Unsupported MCP protocol version`,supported:o.supported},426);let s=n.p(await e.req.json().catch(()=>null));if(!s)return e.json(n.i(null,-32600,`Invalid JSON-RPC 2.0 request`),400);let c=n.v(a),u=s.method===`initialize`;try{let i=await n.s(s.method,s.params,{semanticLayer:_,extractSecurityContext:l,rawRequest:e,rawResponse:null,negotiatedProtocol:o.negotiated,resources:t,prompts:r,appEnabled:!!m.app});if(n.d(s))return e.body(null,202);let a=n.a(s.id??null,i),d=u&&i&&typeof i==`object`&&`sessionId`in i?i.sessionId:void 0,f={};if(d&&(f[n.r]=d),c){let e=new TextEncoder,t=n.m(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${t}\n\n`)),r.enqueue(e.encode(n.h(a,t))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,...f}})}return e.json(a,200,f)}catch(t){if(n.d(s))return console.error(`MCP notification processing error:`,t),e.body(null,202);console.error(`MCP RPC error:`,t);let r=t?.code??-32603,i=t?.data,a=t.message||`MCP request failed`,o=n.i(s.id??null,r,a,i);if(c){let e=new TextEncoder,t=n.m(),r=new ReadableStream({start(r){r.enqueue(e.encode(`id: ${t}\n\n`)),r.enqueue(e.encode(n.h(o,t))),r.close()}});return new Response(r,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})}return e.json(o,200)}}),g.delete(`${i}`,e=>e.json({error:`Session termination not supported`},405)),g.get(`${i}`,e=>{let t=new TextEncoder,r=n.m(),i,a=new ReadableStream({start(e){e.enqueue(t.encode(n.h({jsonrpc:`2.0`,method:`mcp/ready`,params:{protocol:`streamable-http`}},r,15e3))),i=setInterval(()=>{e.enqueue(t.encode(`: keep-alive
|
|
2
2
|
|
|
3
3
|
`))},15e3)},cancel(){clearInterval(i)}});return new Response(a,{status:200,headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`}})})}return g}function o(e,t){let n=a(t);return e.route(`/`,n),e}function s(e){return o(new r.Hono,e)}exports.createCubeApp=s,exports.createCubeRoutes=a,exports.mountCubeRoutes=o;
|