drizzle-cube 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/ActivityGridChart.config-BtECymia.cjs +1 -0
- package/dist/adapters/ActivityGridChart.config-CTd5HYjI.js +2 -0
- package/dist/adapters/AreaChart.config-1B8iQnfn.js +2 -0
- package/dist/adapters/AreaChart.config-hnncyQL4.cjs +1 -0
- package/dist/adapters/BarChart.config-C-QCf1rL.cjs +1 -0
- package/dist/adapters/BarChart.config-CFelK1qP.js +2 -0
- package/dist/adapters/BoxPlotChart.config-CD9WEPyF.js +2 -0
- package/dist/adapters/BoxPlotChart.config-DEbLA0BX.cjs +1 -0
- package/dist/adapters/BubbleChart.config-B_M4hzzV.js +2 -0
- package/dist/adapters/BubbleChart.config-dRZZlAke.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-Dsil2Fop.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-fuhyFvob.js +2 -0
- package/dist/adapters/DataTable.config-q2gqBi6t.cjs +1 -0
- package/dist/adapters/DataTable.config-wIQnHX5R.js +2 -0
- package/dist/adapters/FunnelChart.config-Dz710ssx.js +2 -0
- package/dist/adapters/FunnelChart.config-YNP9CeS-.cjs +1 -0
- package/dist/adapters/GaugeChart.config-BG9FcMCn.cjs +1 -0
- package/dist/adapters/GaugeChart.config-CgwniXkd.js +2 -0
- package/dist/adapters/HeatMapChart.config-1zSMXXoN.cjs +1 -0
- package/dist/adapters/HeatMapChart.config-YVEWx6s5.js +2 -0
- package/dist/adapters/KpiDelta.config-BWvYXuFp.cjs +1 -0
- package/dist/adapters/KpiDelta.config-C_dYM64q.js +2 -0
- package/dist/adapters/KpiNumber.config-CXg6toZG.js +2 -0
- package/dist/adapters/KpiNumber.config-CZmV-yU1.cjs +1 -0
- package/dist/adapters/KpiText.config-BY-SJvAF.js +2 -0
- package/dist/adapters/KpiText.config-GSIxy0CE.cjs +1 -0
- package/dist/adapters/LineChart.config-CJtF8SOu.js +2 -0
- package/dist/adapters/LineChart.config-d0y60gw9.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-B6w0spya.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-BuIQcWOn.js +2 -0
- package/dist/adapters/MeasureProfileChart.config-Bo2n5Ae5.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-C5d34lsc.js +2 -0
- package/dist/adapters/PieChart.config-CDxfXCIt.cjs +1 -0
- package/dist/adapters/PieChart.config-CuZxQc5m.js +2 -0
- package/dist/adapters/RadarChart.config-DpdVWyh5.cjs +1 -0
- package/dist/adapters/RadarChart.config-KrxwaaGu.js +2 -0
- package/dist/adapters/RadialBarChart.config-DpRZd0FW.js +2 -0
- package/dist/adapters/RadialBarChart.config-faIY4jpE.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-CUnScqnS.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-Dd8FuawP.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-CPd6GeoQ.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-CPlHbLom.cjs +1 -0
- package/dist/adapters/SankeyChart.config-DbIUqi-H.cjs +1 -0
- package/dist/adapters/SankeyChart.config-kzAnW0C7.js +2 -0
- package/dist/adapters/ScatterChart.config-4Okvn27v.js +2 -0
- package/dist/adapters/ScatterChart.config-4f9nNw3e.cjs +1 -0
- package/dist/adapters/SunburstChart.config-BsUQkIM_.js +2 -0
- package/dist/adapters/SunburstChart.config-lvnYkWs7.cjs +1 -0
- package/dist/adapters/TreeMapChart.config-S0qsgAFW.js +2 -0
- package/dist/adapters/TreeMapChart.config-jbwKsTYt.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-CDQ74-pS.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-XdtH-O5g.js +2 -0
- package/dist/adapters/chartConfigHelpers-CcvqrIWF.js +72 -0
- package/dist/adapters/chartConfigHelpers-DHQB-_v5.cjs +1 -0
- package/dist/adapters/{locale-ZLUUNUxr.cjs → compiler-ChGO4ZLU.cjs} +1 -1
- package/dist/adapters/{locale-DDvZDFVn.js → compiler-LKTN9PTt.js} +2 -21
- package/dist/adapters/core/cube-http-handler.d.ts +27 -0
- package/dist/adapters/core/http-port.d.ts +39 -0
- package/dist/adapters/core/index.cjs +1 -0
- package/dist/adapters/core/index.d.ts +11 -0
- package/dist/adapters/core/index.js +2 -0
- package/dist/adapters/core/mcp-handler.d.ts +13 -0
- package/dist/adapters/core/rest-handlers.d.ts +14 -0
- package/dist/adapters/core/security-context.d.ts +17 -0
- package/dist/adapters/core-Bbchr0ui.js +244 -0
- package/dist/adapters/core-F1pCQPde.cjs +1 -0
- package/dist/adapters/express/index.cjs +2 -2
- package/dist/adapters/express/index.js +93 -201
- package/dist/adapters/fastify/index.cjs +2 -2
- package/dist/adapters/fastify/index.js +79 -217
- package/dist/adapters/handler-DRZb2ip6.cjs +25 -0
- package/dist/adapters/{handler-CtaSua-i.js → handler-u8FyzPBT.js} +1572 -1500
- package/dist/adapters/hono/index.cjs +2 -2
- package/dist/adapters/hono/index.js +69 -225
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +1 -1
- package/dist/adapters/mcp-transport-Bw_zqky2.js +591 -0
- package/dist/adapters/mcp-transport-CNIPoe1i.cjs +40 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.d.ts +8 -9
- package/dist/adapters/nextjs/index.js +181 -288
- package/dist/adapters/nextjs/mcp-handler.d.ts +0 -28
- package/dist/adapters/{openai-D-6l1Y8h.cjs → openai-B4kAJTSD.cjs} +1 -1
- package/dist/adapters/{openai-DTSTMiXL.cjs → openai-Cdf2wWZA.cjs} +1 -1
- package/dist/adapters/{openai-CmVRIbUg.js → openai-CmMzrs1Y.js} +1 -1
- package/dist/adapters/{openai-CtXqeznO.js → openai-DhzGY9R4.js} +1 -1
- package/dist/cjs/adapters/core/cube-http-handler.d.ts +27 -0
- package/dist/cjs/adapters/core/http-port.d.ts +39 -0
- package/dist/cjs/adapters/core/index.d.ts +11 -0
- package/dist/cjs/adapters/core/mcp-handler.d.ts +13 -0
- package/dist/cjs/adapters/core/rest-handlers.d.ts +14 -0
- package/dist/cjs/adapters/core/security-context.d.ts +17 -0
- package/dist/cjs/adapters/nextjs/index.d.ts +8 -9
- package/dist/cjs/adapters/nextjs/mcp-handler.d.ts +0 -28
- package/dist/cjs/client/charts/chartComponentRegistry.d.ts +1 -9
- package/dist/cjs/client/charts/chartConfigRegistry.d.ts +5 -1
- package/dist/cjs/client/charts/chartPlugin.d.ts +1 -2
- package/dist/cjs/client/charts/chartRegistry.d.ts +73 -0
- package/dist/cjs/client/components/AIAssistant/index.d.ts +2 -2
- package/dist/cjs/client/components/charts/ActivityGridChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/AreaChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/BarChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/BoxPlotChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/BubbleChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/CandlestickChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/DataTable.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/FunnelChart.config.d.ts +5 -0
- package/dist/cjs/client/components/charts/GaugeChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/HeatMapChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/KpiDelta.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/KpiNumber.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/KpiText.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/LineChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/MarkdownChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/MeasureProfileChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/PieChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/RadarChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/RadialBarChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/SankeyChart.config.d.ts +5 -0
- package/dist/cjs/client/components/charts/ScatterChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/SunburstChart.config.d.ts +5 -0
- package/dist/cjs/client/components/charts/TreeMapChart.config.d.ts +6 -1
- package/dist/cjs/client/components/charts/WaterfallChart.config.d.ts +6 -1
- package/dist/cjs/client/hooks/analysisQueryExecutionModes.d.ts +1 -1
- package/dist/cjs/client/hooks/useAnalysisEffects.d.ts +33 -0
- package/dist/{client/hooks/useAnalysisQueryExecution.d.ts → cjs/client/hooks/useAnalysisQuery.d.ts} +3 -3
- package/dist/cjs/client/hooks/useAnalysisState.d.ts +165 -0
- package/dist/cjs/client/icons/registry.d.ts +0 -6
- package/dist/cjs/client/icons/types.d.ts +5 -0
- package/dist/client/charts/chartComponentRegistry.d.ts +1 -9
- package/dist/client/charts/chartConfigRegistry.d.ts +5 -1
- package/dist/client/charts/chartPlugin.d.ts +1 -2
- package/dist/client/charts/chartRegistry.d.ts +73 -0
- package/dist/client/charts.js +3 -3
- package/dist/client/chunks/{DashboardEditModal-okVfH8ZK.js → DashboardEditModal-CWurUU2B.js} +7 -7
- package/dist/client/chunks/{DashboardEditModal-okVfH8ZK.js.map → DashboardEditModal-CWurUU2B.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-DB88FojM.js → analysis-builder-Uj_Fxv0-.js} +1588 -1857
- package/dist/client/chunks/analysis-builder-Uj_Fxv0-.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-shared-BVK4TYfR.js → analysis-builder-shared-AdAYIfj_.js} +1531 -1266
- package/dist/client/chunks/analysis-builder-shared-AdAYIfj_.js.map +1 -0
- package/dist/client/chunks/{chart-config-activity-grid-D_UX4NHC.js → chart-config-activity-grid-BU_bkvER.js} +1 -11
- package/dist/client/chunks/chart-config-activity-grid-BU_bkvER.js.map +1 -0
- package/dist/client/chunks/{chart-config-area-BNigHUy8.js → chart-config-area-DxwIZ4Uf.js} +1 -5
- package/dist/client/chunks/{chart-config-area-BNigHUy8.js.map → chart-config-area-DxwIZ4Uf.js.map} +1 -1
- package/dist/client/chunks/{chart-config-bar-DSO_LRTx.js → chart-config-bar-Cc8GY9aQ.js} +5 -9
- package/dist/client/chunks/chart-config-bar-Cc8GY9aQ.js.map +1 -0
- package/dist/client/chunks/{chart-config-box-plot-oW8axV2q.js → chart-config-box-plot-Bs8ovYvV.js} +3 -8
- package/dist/client/chunks/chart-config-box-plot-Bs8ovYvV.js.map +1 -0
- package/dist/client/chunks/{chart-config-bubble-gIoqVyjZ.js → chart-config-bubble-BfgY7pt8.js} +1 -11
- package/dist/client/chunks/chart-config-bubble-BfgY7pt8.js.map +1 -0
- package/dist/client/chunks/{chart-config-candlestick-N6DchAA3.js → chart-config-candlestick-jaeNNEtC.js} +1 -11
- package/dist/client/chunks/chart-config-candlestick-jaeNNEtC.js.map +1 -0
- package/dist/client/chunks/{chart-config-data-table-d7VBY-y_.js → chart-config-data-table-CRk0C0rW.js} +1 -4
- package/dist/client/chunks/chart-config-data-table-CRk0C0rW.js.map +1 -0
- package/dist/client/chunks/{chart-config-funnel-DEYMcxsD.js → chart-config-funnel-boT_LNfl.js} +1 -4
- package/dist/client/chunks/chart-config-funnel-boT_LNfl.js.map +1 -0
- package/dist/client/chunks/{chart-config-gauge-Dq-_H9UN.js → chart-config-gauge-C5uJEr97.js} +3 -8
- package/dist/client/chunks/chart-config-gauge-C5uJEr97.js.map +1 -0
- package/dist/client/chunks/{chart-config-heat-map-CfRnRNcw.js → chart-config-heat-map-CCarP44-.js} +1 -11
- package/dist/client/chunks/chart-config-heat-map-CCarP44-.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-delta-DSQbvqu_.js → chart-config-kpi-delta-DYopvwyG.js} +3 -8
- package/dist/client/chunks/chart-config-kpi-delta-DYopvwyG.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-number-EFSWY1We.js → chart-config-kpi-number-BhMdoArB.js} +3 -8
- package/dist/client/chunks/chart-config-kpi-number-BhMdoArB.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-text-KM3V5X2u.js → chart-config-kpi-text-DE6Zdi53.js} +3 -8
- package/dist/client/chunks/chart-config-kpi-text-DE6Zdi53.js.map +1 -0
- package/dist/client/chunks/{chart-config-line-D6jG8PCH.js → chart-config-line-CBfM0Rds.js} +6 -10
- package/dist/client/chunks/chart-config-line-CBfM0Rds.js.map +1 -0
- package/dist/client/chunks/{chart-config-markdown-BtRIe8JN.js → chart-config-markdown-BCDyBI8K.js} +1 -4
- package/dist/client/chunks/chart-config-markdown-BCDyBI8K.js.map +1 -0
- package/dist/client/chunks/{chart-config-measure-profile-DxRGa-zf.js → chart-config-measure-profile-BgQIH1u2.js} +1 -8
- package/dist/client/chunks/chart-config-measure-profile-BgQIH1u2.js.map +1 -0
- package/dist/client/chunks/{chart-config-pie-BhzW-fdn.js → chart-config-pie-ChfFz6DV.js} +5 -9
- package/dist/client/chunks/chart-config-pie-ChfFz6DV.js.map +1 -0
- package/dist/client/chunks/{chart-config-radar-D7REP1q_.js → chart-config-radar-BlAIGnww.js} +5 -9
- package/dist/client/chunks/chart-config-radar-BlAIGnww.js.map +1 -0
- package/dist/client/chunks/{chart-config-radial-bar-Byx6qOPU.js → chart-config-radial-bar-VFerwbCO.js} +5 -9
- package/dist/client/chunks/chart-config-radial-bar-VFerwbCO.js.map +1 -0
- package/dist/client/chunks/{chart-config-sankey-BTnWA7EW.js → chart-config-sankey-BhrDxIgj.js} +1 -4
- package/dist/client/chunks/chart-config-sankey-BhrDxIgj.js.map +1 -0
- package/dist/client/chunks/{chart-config-scatter-DSYTjwRb.js → chart-config-scatter-q_olh54e.js} +1 -11
- package/dist/client/chunks/chart-config-scatter-q_olh54e.js.map +1 -0
- package/dist/client/chunks/{chart-config-sunburst-Bwjtdf7X.js → chart-config-sunburst-BOmkOnKn.js} +1 -4
- package/dist/client/chunks/chart-config-sunburst-BOmkOnKn.js.map +1 -0
- package/dist/client/chunks/{chart-config-tree-map-DVrvf3yQ.js → chart-config-tree-map-BjX88YBY.js} +5 -9
- package/dist/client/chunks/chart-config-tree-map-BjX88YBY.js.map +1 -0
- package/dist/client/chunks/{chart-config-waterfall-DmFeQdIk.js → chart-config-waterfall-QsWXVSoF.js} +3 -8
- package/dist/client/chunks/chart-config-waterfall-QsWXVSoF.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-CKauQXme.js → chart-data-table-D4g5_jfF.js} +1277 -1094
- package/dist/client/chunks/chart-data-table-D4g5_jfF.js.map +1 -0
- package/dist/client/chunks/{chart-kpi-delta-Dn-jjO-2.js → chart-kpi-delta-BvWOt8-D.js} +2 -2
- package/dist/client/chunks/{chart-kpi-delta-Dn-jjO-2.js.map → chart-kpi-delta-BvWOt8-D.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-P_WBiO5S.js → chart-kpi-number-xgZmMiQY.js} +3 -3
- package/dist/client/chunks/{chart-kpi-number-P_WBiO5S.js.map → chart-kpi-number-xgZmMiQY.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-C-Y4eb5H.js → chart-kpi-text-ZO3eFi7t.js} +2 -2
- package/dist/client/chunks/{chart-kpi-text-C-Y4eb5H.js.map → chart-kpi-text-ZO3eFi7t.js.map} +1 -1
- package/dist/client/chunks/{charts-loader-DdTeCeNo.js → charts-loader-B0DOQMFH.js} +6 -6
- package/dist/client/chunks/{charts-loader-DdTeCeNo.js.map → charts-loader-B0DOQMFH.js.map} +1 -1
- package/dist/client/chunks/{schema-visualization-Cb_E9_Gd.js → schema-visualization-DJPTktM6.js} +2 -2
- package/dist/client/chunks/{schema-visualization-Cb_E9_Gd.js.map → schema-visualization-DJPTktM6.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-MbpxH_v6.js → useDirtyStateTracking-BY_IIG1n.js} +2 -2
- package/dist/client/chunks/{useDirtyStateTracking-MbpxH_v6.js.map → useDirtyStateTracking-BY_IIG1n.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-evnZkjCY.js → useExplainAI-PjMBmj2p.js} +4 -4
- package/dist/client/chunks/{useExplainAI-evnZkjCY.js.map → useExplainAI-PjMBmj2p.js.map} +1 -1
- package/dist/client/chunks/{utils-3P6z1vz5.js → utils-Cq-j5E5I.js} +2 -2
- package/dist/client/chunks/{utils-3P6z1vz5.js.map → utils-Cq-j5E5I.js.map} +1 -1
- package/dist/client/chunks/{vendor-DSpR0IW6.js → vendor-D4jADu8t.js} +2 -2
- package/dist/client/chunks/{vendor-DSpR0IW6.js.map → vendor-D4jADu8t.js.map} +1 -1
- package/dist/client/components/AIAssistant/index.d.ts +2 -2
- package/dist/client/components/charts/ActivityGridChart.config.d.ts +6 -1
- package/dist/client/components/charts/AreaChart.config.d.ts +6 -1
- package/dist/client/components/charts/BarChart.config.d.ts +6 -1
- package/dist/client/components/charts/BoxPlotChart.config.d.ts +6 -1
- package/dist/client/components/charts/BubbleChart.config.d.ts +6 -1
- package/dist/client/components/charts/CandlestickChart.config.d.ts +6 -1
- package/dist/client/components/charts/DataTable.config.d.ts +6 -1
- package/dist/client/components/charts/FunnelChart.config.d.ts +5 -0
- package/dist/client/components/charts/GaugeChart.config.d.ts +6 -1
- package/dist/client/components/charts/HeatMapChart.config.d.ts +6 -1
- package/dist/client/components/charts/KpiDelta.config.d.ts +6 -1
- package/dist/client/components/charts/KpiNumber.config.d.ts +6 -1
- package/dist/client/components/charts/KpiText.config.d.ts +6 -1
- package/dist/client/components/charts/LineChart.config.d.ts +6 -1
- package/dist/client/components/charts/MarkdownChart.config.d.ts +6 -1
- package/dist/client/components/charts/MeasureProfileChart.config.d.ts +6 -1
- package/dist/client/components/charts/PieChart.config.d.ts +6 -1
- package/dist/client/components/charts/RadarChart.config.d.ts +6 -1
- package/dist/client/components/charts/RadialBarChart.config.d.ts +6 -1
- package/dist/client/components/charts/SankeyChart.config.d.ts +5 -0
- package/dist/client/components/charts/ScatterChart.config.d.ts +6 -1
- package/dist/client/components/charts/SunburstChart.config.d.ts +5 -0
- package/dist/client/components/charts/TreeMapChart.config.d.ts +6 -1
- package/dist/client/components/charts/WaterfallChart.config.d.ts +6 -1
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/analysisQueryExecutionModes.d.ts +1 -1
- package/dist/client/hooks/useAnalysisEffects.d.ts +33 -0
- package/dist/{cjs/client/hooks/useAnalysisQueryExecution.d.ts → client/hooks/useAnalysisQuery.d.ts} +3 -3
- package/dist/client/hooks/useAnalysisState.d.ts +165 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons/registry.d.ts +0 -6
- package/dist/client/icons/types.d.ts +5 -0
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +9 -9
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/utils.js +3 -3
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +34 -34
- package/dist/server/chartConfigHelpers-CcvqrIWF.js +72 -0
- package/dist/server/chartConfigHelpers-DHQB-_v5.cjs +1 -0
- package/dist/server/index.cjs +68 -68
- package/dist/server/index.js +3800 -3728
- package/dist/server/{openai-D-6l1Y8h.cjs → openai-B4kAJTSD.cjs} +1 -1
- package/dist/server/{openai-DTSTMiXL.cjs → openai-Cdf2wWZA.cjs} +1 -1
- package/dist/server/{openai-CmVRIbUg.js → openai-CmMzrs1Y.js} +1 -1
- package/dist/server/{openai-CtXqeznO.js → openai-DhzGY9R4.js} +1 -1
- package/package.json +12 -2
- package/dist/adapters/handler-OwxSBJH8.cjs +0 -25
- package/dist/adapters/hono/mcp-handler.d.ts +0 -37
- package/dist/adapters/mcp-transport-B7ddET3M.cjs +0 -40
- package/dist/adapters/mcp-transport-Dfuj4j4q.js +0 -591
- package/dist/cjs/adapters/hono/mcp-handler.d.ts +0 -37
- package/dist/cjs/client/hooks/useAnalysisAI.d.ts +0 -56
- package/dist/cjs/client/hooks/useAnalysisChartDefaults.d.ts +0 -35
- package/dist/cjs/client/hooks/useAnalysisCombinedFields.d.ts +0 -18
- package/dist/cjs/client/hooks/useAnalysisInitialization.d.ts +0 -25
- package/dist/cjs/client/hooks/useAnalysisQueryBuilder.d.ts +0 -32
- package/dist/cjs/client/hooks/useAnalysisShare.d.ts +0 -18
- package/dist/cjs/client/hooks/useAnalysisUIState.d.ts +0 -24
- package/dist/client/chunks/analysis-builder-DB88FojM.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-BVK4TYfR.js.map +0 -1
- package/dist/client/chunks/chart-config-activity-grid-D_UX4NHC.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-DSO_LRTx.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-oW8axV2q.js.map +0 -1
- package/dist/client/chunks/chart-config-bubble-gIoqVyjZ.js.map +0 -1
- package/dist/client/chunks/chart-config-candlestick-N6DchAA3.js.map +0 -1
- package/dist/client/chunks/chart-config-data-table-d7VBY-y_.js.map +0 -1
- package/dist/client/chunks/chart-config-funnel-DEYMcxsD.js.map +0 -1
- package/dist/client/chunks/chart-config-gauge-Dq-_H9UN.js.map +0 -1
- package/dist/client/chunks/chart-config-heat-map-CfRnRNcw.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-delta-DSQbvqu_.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-number-EFSWY1We.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-text-KM3V5X2u.js.map +0 -1
- package/dist/client/chunks/chart-config-line-D6jG8PCH.js.map +0 -1
- package/dist/client/chunks/chart-config-markdown-BtRIe8JN.js.map +0 -1
- package/dist/client/chunks/chart-config-measure-profile-DxRGa-zf.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-BhzW-fdn.js.map +0 -1
- package/dist/client/chunks/chart-config-radar-D7REP1q_.js.map +0 -1
- package/dist/client/chunks/chart-config-radial-bar-Byx6qOPU.js.map +0 -1
- package/dist/client/chunks/chart-config-sankey-BTnWA7EW.js.map +0 -1
- package/dist/client/chunks/chart-config-scatter-DSYTjwRb.js.map +0 -1
- package/dist/client/chunks/chart-config-sunburst-Bwjtdf7X.js.map +0 -1
- package/dist/client/chunks/chart-config-tree-map-DVrvf3yQ.js.map +0 -1
- package/dist/client/chunks/chart-config-waterfall-DmFeQdIk.js.map +0 -1
- package/dist/client/chunks/chart-data-table-CKauQXme.js.map +0 -1
- package/dist/client/hooks/useAnalysisAI.d.ts +0 -56
- package/dist/client/hooks/useAnalysisChartDefaults.d.ts +0 -35
- package/dist/client/hooks/useAnalysisCombinedFields.d.ts +0 -18
- package/dist/client/hooks/useAnalysisInitialization.d.ts +0 -25
- package/dist/client/hooks/useAnalysisQueryBuilder.d.ts +0 -32
- package/dist/client/hooks/useAnalysisShare.d.ts +0 -18
- package/dist/client/hooks/useAnalysisUIState.d.ts +0 -24
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.activityGridChartConfig=e.g;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.areaChartConfig=e.w;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.barChartConfig=e.E;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.boxPlotChartConfig=e.a;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.bubbleChartConfig=e.x;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.candlestickChartConfig=e.r;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.dataTableConfig=e._;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.funnelChartConfig=e.d;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.gaugeChartConfig=e.t;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.heatmapChartConfig=e.c;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.kpiDeltaConfig=e.m;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.kpiNumberConfig=e.h;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.kpiTextConfig=e.p;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.lineChartConfig=e.T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.markdownConfig=e.f;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.measureProfileChartConfig=e.n;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.pieChartConfig=e.C;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.radarChartConfig=e.b;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.radialBarChartConfig=e.y;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.retentionCombinedConfig=e.o;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.retentionHeatmapConfig=e.s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.sankeyChartConfig=e.u;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.scatterChartConfig=e.S;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.sunburstChartConfig=e.l;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.treemapChartConfig=e.v;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./handler-DRZb2ip6.cjs");exports.waterfallChartConfig=e.i;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/client/charts/chartConfigHelpers.ts
|
|
2
|
+
function e({ measureCount: e, dimensionCount: t }) {
|
|
3
|
+
return e < 1 ? {
|
|
4
|
+
available: !1,
|
|
5
|
+
reason: "chart.availability.requiresMeasure"
|
|
6
|
+
} : t < 1 ? {
|
|
7
|
+
available: !1,
|
|
8
|
+
reason: "chart.availability.requiresDimension"
|
|
9
|
+
} : { available: !0 };
|
|
10
|
+
}
|
|
11
|
+
function t({ measureCount: e }) {
|
|
12
|
+
return e < 1 ? {
|
|
13
|
+
available: !1,
|
|
14
|
+
reason: "chart.availability.requiresMeasure"
|
|
15
|
+
} : { available: !0 };
|
|
16
|
+
}
|
|
17
|
+
var n = {
|
|
18
|
+
key: "target",
|
|
19
|
+
label: "chart.option.target.label",
|
|
20
|
+
type: "string",
|
|
21
|
+
placeholder: "e.g., 100 or 50,75 for spread",
|
|
22
|
+
description: "chart.option.target.description"
|
|
23
|
+
}, r = {
|
|
24
|
+
key: "connectNulls",
|
|
25
|
+
label: "chart.option.connectNulls.label",
|
|
26
|
+
type: "boolean",
|
|
27
|
+
defaultValue: !1,
|
|
28
|
+
description: "chart.option.connectNulls.description"
|
|
29
|
+
}, i = {
|
|
30
|
+
key: "leftYAxisFormat",
|
|
31
|
+
label: "chart.option.leftYAxisFormat.label",
|
|
32
|
+
type: "axisFormat",
|
|
33
|
+
description: "chart.option.leftYAxisFormat.description"
|
|
34
|
+
}, a = {
|
|
35
|
+
key: "rightYAxisFormat",
|
|
36
|
+
label: "chart.option.rightYAxisFormat.label",
|
|
37
|
+
type: "axisFormat",
|
|
38
|
+
description: "chart.option.rightYAxisFormat.description"
|
|
39
|
+
};
|
|
40
|
+
function o(e = "chart.option.valueFormat.description") {
|
|
41
|
+
return {
|
|
42
|
+
key: "leftYAxisFormat",
|
|
43
|
+
label: "chart.option.valueFormat.label",
|
|
44
|
+
type: "axisFormat",
|
|
45
|
+
description: e
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function s(e) {
|
|
49
|
+
return {
|
|
50
|
+
key: "stackType",
|
|
51
|
+
label: "chart.option.stacking.label",
|
|
52
|
+
type: "select",
|
|
53
|
+
defaultValue: "none",
|
|
54
|
+
options: [
|
|
55
|
+
{
|
|
56
|
+
value: "none",
|
|
57
|
+
label: "chart.option.accentBorder.none"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
value: "normal",
|
|
61
|
+
label: "chart.option.stacking.stacked"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
value: "percent",
|
|
65
|
+
label: "chart.option.stacking.percent"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
description: e
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { a, o as c, e as i, i as n, s as o, t as r, n as s, r as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e({measureCount:e,dimensionCount:t}){return e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:t<1?{available:!1,reason:`chart.availability.requiresDimension`}:{available:!0}}function t({measureCount:e}){return e<1?{available:!1,reason:`chart.availability.requiresMeasure`}:{available:!0}}var n={key:`target`,label:`chart.option.target.label`,type:`string`,placeholder:`e.g., 100 or 50,75 for spread`,description:`chart.option.target.description`},r={key:`connectNulls`,label:`chart.option.connectNulls.label`,type:`boolean`,defaultValue:!1,description:`chart.option.connectNulls.description`},i={key:`leftYAxisFormat`,label:`chart.option.leftYAxisFormat.label`,type:`axisFormat`,description:`chart.option.leftYAxisFormat.description`},a={key:`rightYAxisFormat`,label:`chart.option.rightYAxisFormat.label`,type:`axisFormat`,description:`chart.option.rightYAxisFormat.description`};function o(e=`chart.option.valueFormat.description`){return{key:`leftYAxisFormat`,label:`chart.option.valueFormat.label`,type:`axisFormat`,description:e}}function s(e){return{key:`stackType`,label:`chart.option.stacking.label`,type:`select`,defaultValue:`none`,options:[{value:`none`,label:`chart.option.accentBorder.none`},{value:`normal`,label:`chart.option.stacking.stacked`},{value:`percent`,label:`chart.option.stacking.percent`}],description:e}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
|
|
@@ -163,4 +163,4 @@ const e=require("./utils-_whV4fXL.cjs");var t=Symbol.for(`drizzle:entityKind`);f
|
|
|
163
163
|
GROUP BY binding_key${C.raw(i)}
|
|
164
164
|
)`,s=this.databaseAdapter.buildPeriodSeriesSubquery(a),c={period_number:C`p.period_number`.as(`period_number`),retained_users:C`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},l=[C`p.period_number`];for(let e=0;e<n;e++)c[`breakdown_${e}`]=C.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),l.push(C.raw(`ump.breakdown_${e}`));return t.db.select(c).from(C`${o} ump`).innerJoin(s,C`TRUE`).groupBy(...l)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}},Xr=class{queryPlanner;constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(t,n,r){let i=Array.from(this.queryPlanner.analyzeCubeUsage(n));if(i.length===0)throw Error(e.O(`server.errors.noCubesInQuery`));let a=this.queryPlanner.analyzePrimaryCube(i,n,t),o=a.selectedCube,s=t.get(o);if(!s)throw Error(e.O(`server.errors.primaryCubeNotFound`,{cubeName:o}));let c=i.filter(e=>e!==o).map(e=>this.queryPlanner.analyzeJoinPathForTarget(t,o,e,n)),l=i.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,s,i,r,n):[],u=i.length>1?this.queryPlanner.buildPreAggregationCTEs(t,s,l,n,r)??[]:[],d=this.queryPlanner.buildWarnings(n,u),f=this.buildSourceFromPhases(s,l,u,t,n,r),p=f.source,m=this.buildQueryNode(p,n,t,d),h=this.buildPreAggregationAnalysis(u),g=new Map;for(let e of i){let n=t.get(e);n&&g.set(e,n)}let _=xn(n.measures??[],g),v=[...c.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...d.map(e=>e.message)];return{plan:m,analysis:{timestamp:new Date().toISOString(),cubeCount:i.length,cubesInvolved:[...i].sort(),primaryCube:a,joinPaths:c,preAggregations:h,querySummary:{queryType:u.length>0?`multi_cube_cte`:i.length>1?`multi_cube_join`:`single_cube`,measureStrategy:f.strategy,joinCount:l.length,cteCount:u.length,hasPreAggregation:u.length>0,hasWindowFunctions:_},warnings:v.length>0?v:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${i.length} cube${i.length===1?``:`s`} from query members`,details:{cubesInvolved:[...i].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${a.selectedCube}' as primary cube (${a.reason})`,details:{selectedCube:a.selectedCube,reason:a.reason,candidates:a.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${l.length} join${l.length===1?``:`s`}`,details:{joinCount:l.length,joinTargets:l.map(e=>e.target.name),pathSelection:c.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${u.length} pre-aggregation CTE${u.length===1?``:`s`}`,details:{cteCount:u.length,cubes:u.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${f.strategy}' measure strategy`,details:{strategy:f.strategy,regularMeasures:f.classification.regular.map(e=>e.name),multipliedMeasures:f.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:f.classification.deduplicationSafe.map(e=>e.name),sourceType:p.type}},{phase:`warnings`,decision:d.length>0?`Generated ${d.length} planning warning${d.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:d.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t,u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,ungrouped:t.ungrouped,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildMeasureRefs(t,n){return t.measures?t.measures.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForMeasure`,{cubeName:r,measure:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildDimensionRefs(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildTimeDimensionRefs(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:this.toCubeRef(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},Zr=class{name=`identity`;optimise(e){return e}};function Qr(e,t,n,r){let i=$r(e,n,r),a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);l&&(a.push(l),o.set(c.cube.name,c.cteAlias),ei(c,s))}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function $r(e,t,n){let r=new Map;if(!e.preAggregationCTEs||e.preAggregationCTEs.length===0)return r;for(let i of e.preAggregationCTEs)if(!(!i.propagatingFilters||i.propagatingFilters.length===0))for(let e of i.propagatingFilters){let i=e.sourceCube.name;if(!r.has(i)){let a={filters:e.filters},o=new Map([[i,e.sourceCube]]),s=n.queryBuilder.buildWhereConditions(o,a,t);r.set(i,s)}let a=r.get(i);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:D(...a))}return r}function ei(e,t){if(e.downstreamJoinKeys)for(let n of e.downstreamJoinKeys)t.set(n.targetCubeName,{cteAlias:e.cteAlias,joinKeys:n.joinKeys})}function ti(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Z.isPostAggregationWindow(u))continue;let d=Z.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?C`sum(${C`${C.identifier(g.cteAlias)}.${C.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=C`${_}`.as(d));let v=ni(u,_,n,r,l,t,a);v&&(e[o]=C`${v}`.as(o))}}function ni(e,t,n,r,i,a,o){let s=e.windowConfig||{},c=(e,t)=>{if(!a.preAggregationCTEs)return null;let n=a.preAggregationCTEs.find(t=>t.cube?.name===e);return n&&n.cteAlias?C`${C.identifier(n.cteAlias)}.${C.identifier(t)}`:null},l;if(s.orderBy&&s.orderBy.length>0)l=s.orderBy.map(e=>{let a=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field;if(n.timeDimensions)for(let t of n.timeDimensions){let[n,s]=t.dimension.split(`.`);if(s===a){let l=c(n,a);if(l)return{field:l,direction:e.direction};let u=i.dimensions?.[s];if(u)return{field:o.queryBuilder.buildTimeDimensionExpression(u.sql,t.granularity,r),direction:e.direction}}}let l=i.dimensions?.[a];return l?{field:z(l.sql,r),direction:e.direction}:a===(s.measure?.includes(`.`)?s.measure.split(`.`)[1]:s.measure)||e.field===s.measure?{field:t,direction:e.direction}:null}).filter(e=>e!==null);else if(n.timeDimensions&&n.timeDimensions.length>0){let e=n.timeDimensions[0],[t,a]=e.dimension.split(`.`),s=c(t,a);if(s)l=[{field:s,direction:`asc`}];else{let n=i.name===t?i:void 0;if(n?.dimensions?.[a]){let t=n.dimensions[a];l=[{field:o.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,r),direction:`asc`}]}}}let u;s.partitionBy&&s.partitionBy.length>0&&(u=s.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,n=i.dimensions?.[t];return n?z(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Z.getDefaultWindowOperation(e.type)){case`difference`:return C`${t} - ${d}`;case`ratio`:return C`${t} / NULLIF(${d}, 0)`;case`percentChange`:return C`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function ri(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs)ii(a,o,t,n,r,i),oi(a,o,r);return ti(a,e,t,n,r,i),a}function ii(e,t,n,r,i,a){let o=t.cube.name;for(let s of t.measures){if(!e[s])continue;let[,c]=s.split(`.`),l=i.get(o);if(!l?.measures?.[c])continue;let u=l.measures[c],d=C`${C.identifier(t.cteAlias)}.${C.identifier(c)}`,f;f=u.type===`calculated`&&u.calculatedSql?a.queryBuilder.buildCTECalculatedMeasure(u,l,t,i,r):ai(u,d,t,n,i,a),e[s]=C`${f}`.as(s)}}function ai(e,t,n,r,i,a){let o=n.cteReason===`fanOutPrevention`,s=si(n,r,i),c=o||s;switch(e.type){case`count`:case`countDistinct`:case`sum`:return c?j(t):xe(t);case`avg`:return c?j(t):a.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);case`number`:return j(t);default:return c?j(t):xe(t)}}function oi(e,t,n){let r=t.cube.name;for(let i in e){let[a,o]=i.split(`.`);if(a!==r)continue;let s=n.get(r),c=s&&s.dimensions?.[o],l=i.startsWith(r+`.`);if(!c&&!l)continue;let u=t.joinKeys.find(e=>e.targetColumn===o);if(!u&&s?.dimensions?.[o]){let e=s.dimensions[o].sql;u=t.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[o])&&(e[i]=C`${C.identifier(t.cteAlias)}.${C.identifier(o)}`.as(i))}}function si(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&ci(e.sourceColumnObj,t,n))}function ci(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function $(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}function li(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}function ui(e,t,n,r,i,a){let o=[],s=di(t,n,r,i);s=fi(s,n.joins);let c=new Set,l=pi(e);if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;l.has(r)&&!i.cteAliasMap.has(r)||(s=mi(s,n,e,i,t,o),s=_i(s,n,e,i,t,a,c))}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function di(e,t,n,r){return r.ctes.length>0?e.db.with(...r.ctes).select(n).from(t.from):e.db.select(n).from(t.from)}function fi(e,t){if(!t)return e;let n=e;for(let e of t)n=$(n,e.type??`left`,e.table,e.on);return n}function pi(e){let t=new Set;if(e.preAggregationCTEs){for(let n of e.preAggregationCTEs)if(n.intermediateJoins&&n.intermediateJoins.length>0)for(let e of n.intermediateJoins)t.add(e.cube.name)}return t}function mi(e,t,n,r,i,a){let o=t.junctionTable;if(!o)return e;let s=hi(o,t,n,r),c=[];if(o.securitySql){let e=o.securitySql(i.securityContext);Array.isArray(e)?c.push(...e):c.push(e)}try{let t=$(e,o.joinType??`left`,o.table,s);return c.length>0&&a.push(...c),t}catch{return e}}function hi(e,t,n,r){let i=e.joinCondition,a=e.sourceCubeName?r.cteAliasMap.get(e.sourceCubeName):void 0;if(!a)return i;let o=(n.preAggregationCTEs?.find(t=>t.cube.name===e.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===t.cube.name);if(o&&o.joinKeys.length>0){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(a)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj;r&&e.push(E(r,n))}e.length>0&&(i=D(...e))}return i}function gi(e,t,n,r,i,a){if(t)return{joinTarget:C`${C.identifier(t)}`,joinCondition:a.cteBuilder.buildCTEJoinCondition(e,t,r),securityCondition:void 0,joinCubeBase:void 0};let o=n.downstreamCubeMap.get(e.cube.name),s=e.cube.sql(i),c;if(o&&!e.junctionTable){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(o.cteAlias)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj||C.identifier(t.targetColumn);e.push(E(n,r))}c=e.length===1?e[0]:D(...e)}else c=e.joinCondition;return{joinTarget:s.from,joinCondition:c,securityCondition:s.where,joinCubeBase:s}}function _i(e,t,n,r,i,a,o){let{joinTarget:s,joinCondition:c,securityCondition:l,joinCubeBase:u}=gi(t,r.cteAliasMap.get(t.cube.name),r,n,i,a),d=t.joinType||`left`,f=d!==`inner`&&l?D(c,l):c;try{let n;return d===`inner`?n=e.innerJoin(s,c):(n=$(e,d,s,f),l&&o.add(t.cube.name)),fi(n,u?.joins)}catch{return e}}function vi(e,t,n,r,i,a,o,s){let c=yi(e,t,n,r,i,a,o,s),l=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:D(...c);l=l.where(e)}return bi(l,e,t,n,r,s)}function yi(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);return l.length>0&&c.push(...l),c}function bi(e,t,n,r,i,a){let o=t.joinCubes.length>0?i:t.primaryCube,s=e,c=a.queryBuilder.buildGroupByFields(o,n,r,t);if(c.length>0&&(s=s.groupBy(...c)),!n.ungrouped){let e=a.queryBuilder.buildHavingConditions(o,n,r,t);if(e.length>0){let t=e.length===1?e[0]:D(...e);s=s.having(t)}}let l=a.queryBuilder.buildOrderBy(n);return l.length>0&&(s=s.orderBy(...l)),a.queryBuilder.applyLimitAndOffset(s,n)}function xi(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!Ai(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:Mi(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u=i.regularMeasures??[],d=Si(t,n,r,a,o,s,u);if(!d)return null;let f=Ci(e,t,n,r,a,c,d.keysSelections,d.keyGroupBy),p=Ei(t,n,r,o,s,d.multipliedMeasures,l);return p?ki(t,n,r,a,o,{keysAlias:c,aggAlias:l,keysCte:f,aggCte:p,pkDimensions:s,pkAliases:d.pkAliases,multipliedMeasures:d.multipliedMeasures,regularMeasureNames:u}):null}function Si(e,t,n,r,i,a,o){let s={},c=[];if(e.dimensions)for(let n of e.dimensions){let[e,i]=n.split(`.`),a=r.get(e),o=a?.dimensions?.[i];if(!a||!o)return null;let l=z(o.sql,t);s[n]=C`${l}`.as(n),c.push(l)}if(e.timeDimensions)for(let i of e.timeDimensions){let[e,a]=i.dimension.split(`.`),o=r.get(e),l=o?.dimensions?.[a];if(!o||!l)return null;let u=n.queryBuilder.buildTimeDimensionExpression(l.sql,i.granularity,t);s[i.dimension]=C`${u}`.as(i.dimension),c.push(u)}let l=[];for(let e of a){let n=i.dimensions?.[e];if(!n)return null;let r=z(n.sql,t),a=`__pk__${e}`;s[a]=C`${r}`.as(a),c.push(r),l.push(a)}let u=new Set(o),d=e.measures.filter(e=>!u.has(e));if(o.length>0){let e=n.queryBuilder.buildResolvedMeasures(o,r,t);for(let t of o){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;s[r]=C`${n()}`.as(r)}}return{keysSelections:s,keyGroupBy:c,pkAliases:l,multipliedMeasures:d}}function Ci(e,t,n,r,i,a,o,s){let c=e.primaryCube.sql(n),l=[];c.where&&l.push(c.where);let u=n.db.select(o).from(c.from);if(c.joins)for(let e of c.joins)u=$(u,e.type??`left`,e.table,e.on);for(let t of e.joinCubes)u=wi(u,t,n,l);return l.push(...r.queryBuilder.buildWhereConditions(i,t,n)),u=Oi(u,l),s.length>0&&(u=u.groupBy(...s)),n.db.$with(a).as(u)}function wi(e,t,n,r){let i=e;t.junctionTable&&(i=$(i,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),Ti(t.junctionTable.securitySql,n,r));let a=t.cube.sql(n);if(i=$(i,t.joinType??`left`,a.from,t.joinCondition),a.joins)for(let e of a.joins)i=$(i,e.type??`left`,e.table,e.on);return a.where&&r.push(a.where),i}function Ti(e,t,n){if(!e)return;let r=e(t.securityContext);Array.isArray(r)?n.push(...r):n.push(r)}function Ei(e,t,n,r,i,a,o){let s=r.sql(t),c=Di(t,n,r,i,a);if(!c)return null;let l=t.db.select(c.aggSelections).from(s.from);if(s.joins)for(let e of s.joins)l=$(l,e.type??`left`,e.table,e.on);let u=[];return s.where&&u.push(s.where),u.push(...n.queryBuilder.buildWhereConditions(r,e,t)),l=Oi(l,u),c.aggGroupBy.length>0&&(l=l.groupBy(...c.aggGroupBy)),t.db.$with(o).as(l)}function Di(e,t,n,r,i){let a={},o=[];for(let t of r){let r=n.dimensions?.[t];if(!r)return null;let i=z(r.sql,e);a[t]=C`${i}`.as(t),o.push(i)}let s=new Set;for(let e of i){let[,t]=e.split(`.`);n.measures?.[t]?.type===`avg`&&s.add(t)}let c=i.filter(e=>{let[,t]=e.split(`.`);return!s.has(t)});if(c.length>0){let r=t.queryBuilder.buildResolvedMeasures(c,new Map([[n.name,n]]),e);for(let e of c){let[,t]=e.split(`.`),n=r.get(e);if(!n||typeof n!=`function`)return null;a[t]=C`${n()}`.as(t)}}for(let t of i){let[,r]=t.split(`.`);if(!s.has(r))continue;let i=n.measures?.[r];if(!i?.sql)return null;let o=z(i.sql,e),c=`__avg_sum__${r}`,l=`__avg_count__${r}`;a[c]=C`sum(${o})`.as(c),a[l]=C`count(${o})`.as(l)}return{aggSelections:a,aggGroupBy:o}}function Oi(e,t){return t.length===0?e:e.where(t.length===1?t[0]:D(...t))}function ki(e,t,n,r,i,a){let{keysAlias:o,aggAlias:s,keysCte:c,aggCte:l,pkDimensions:u,pkAliases:d,multipliedMeasures:f,regularMeasureNames:p}=a,m={};for(let t of e.dimensions??[])m[t]=C`${C.identifier(o)}.${C.identifier(t)}`.as(t);for(let t of e.timeDimensions??[])m[t.dimension]=C`${C.identifier(o)}.${C.identifier(t.dimension)}`.as(t.dimension);for(let e of f){let[,t]=e.split(`.`),n=i.measures?.[t];m[e]=Ni(n?.type??`sum`,s,t,e)}for(let e of p){let[t,n]=e.split(`.`),i=r.get(t)?.measures?.[n],a=`__reg__${e.replace(`.`,`__`)}`;m[e]=Ni(i?.type??`sum`,o,a,e)}let h=t.db.with(c,l).select(m).from(C`${C.identifier(o)}`),g=d.map((e,t)=>E(C`${C.identifier(o)}.${C.identifier(e)}`,C`${C.identifier(s)}.${C.identifier(u[t])}`)),_=g.length===1?g[0]:D(...g);h=h.leftJoin(C`${C.identifier(s)}`,_);let v=[...(e.dimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e)}`),...(e.timeDimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e.dimension)}`)];v.length>0&&(h=h.groupBy(...v));let y=n.queryBuilder.buildOrderBy(e,Object.keys(m));return y.length>0&&(h=h.orderBy(...y)),n.queryBuilder.applyLimitAndOffset(h,e)}function Ai(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!ji(e,t,n)}function ji(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}function Mi(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}function Ni(e,t,n,r){switch(e){case`min`:return C`min(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`max`:return C`max(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`avg`:return C`sum(${C`${C.identifier(t)}.${C.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${C`${C.identifier(t)}.${C.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return C`coalesce(sum(${C`${C.identifier(t)}.${C.identifier(n)}`}), 0)`.as(r)}}function Pi(e,t,n,r,i){let a=e.multiFactMerge;if(!a||a.groups.length<2)return null;let o=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],s=Array.from(new Set(o)),c=s.length>0,l=Vi(r),u=c&&a.mergeStrategy===`fullJoin`&&!l,d=a.groups.map(e=>{let t=i(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});return u?Ri(t,n,r,a,d,s):Li(t,n,r,a,d,s,Bi(a.mergeStrategy,c,l))}function Fi(e,t,n){let r={};for(let e of t)r[e]=C`${Hi(n,e)}`.as(e);for(let t of e.groups)for(let e of t.measures)r[e]=C`coalesce(${C`${C.identifier(t.alias)}.${C.identifier(e)}`}, 0)`.as(e);return r}function Ii(e,t,n){if(t.length===0)return C`1 = 1`;let r=t.map(t=>E(n.get(t),C`${C.identifier(e)}.${C.identifier(t)}`));return r.length===1?r[0]:D(...r)}function Li(e,t,n,r,i,a,o){let s=r.groups[0].alias,c=Fi(r,a,r.groups.map(e=>e.alias)),l=t.db.with(...i).select(c).from(C`${C.identifier(s)}`),u=new Map;for(let e of a)u.set(e,C`${C.identifier(s)}.${C.identifier(e)}`);for(let e=1;e<r.groups.length;e++){let t=r.groups[e].alias,n=Ii(t,a,u);if(l=$(l,o,C`${C.identifier(t)}`,n),a.length>0&&o===`full`)for(let e of a)u.set(e,C`coalesce(${u.get(e)}, ${C`${C.identifier(t)}.${C.identifier(e)}`})`)}let d=n.queryBuilder.buildOrderBy(e,Object.keys(c));return d.length>0&&(l=l.orderBy(...d)),n.queryBuilder.applyLimitAndOffset(l,e)}function Ri(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>C`select ${zi(e.alias,a)} from ${C.identifier(e.alias)}`),c=C`${C.join(s,C` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=C`${C.identifier(o)}.${C.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=C`coalesce(${C`${C.identifier(e.alias)}.${C.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(C`${C.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>E(C`${C.identifier(o)}.${C.identifier(t)}`,C`${C.identifier(e.alias)}.${C.identifier(t)}`)),n=t.length===1?t[0]:D(...t);d=d.leftJoin(C`${C.identifier(e.alias)}`,n)}let f=n.queryBuilder.buildOrderBy(e,Object.keys(u));return f.length>0&&(d=d.orderBy(...f)),n.queryBuilder.applyLimitAndOffset(d,e)}function zi(e,t){let n=t.map(t=>C`${C.identifier(e)}.${C.identifier(t)} as ${C.identifier(t)}`);return C.join(n,C`, `)}function Bi(e,t,n){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:n?`full`:`left`}function Vi(e){let t=e.databaseAdapter.getEngineType();return t===`postgres`||t===`duckdb`}function Hi(e,t){if(e.length===1)return C`${C.identifier(e[0])}.${C.identifier(t)}`;let n=e.map(e=>C`${C.identifier(e)}.${C.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=C`coalesce(${r}, ${n[e]})`;return r}var Ui=class{queryBuilder;cteBuilder;databaseAdapter;constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>this.materializeJoin(e)),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}materializeJoin(e){if(e.junctionTable){let t=jt(e.joinDef);return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:t.junctionJoins[1].condition,relationship:e.relationship,junctionTable:{table:e.junctionTable.table,alias:e.junctionTable.alias,joinType:e.junctionTable.joinType,joinCondition:t.junctionJoins[0].condition,securitySql:e.joinDef.through?.securitySql,sourceCubeName:e.junctionTable.sourceCubeName}}}return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:At(e.joinDef),relationship:e.relationship}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset,ungrouped:e.ungrouped}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=Pi(e,t,n,r,(e,t,n)=>this.build(e,t,n));if(i)return i;let a=xi(e,t,n,r);if(a)return a;let o=Qr(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]);return vi(e,t,n,c,s,o,ui(e,n,s,ri(e,t,n,c,r),o,r),r)}};function Wi(e,t){if(!(typeof process>`u`||!process.env?.DC_DEBUG))try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var Gi=class{dbExecutor;queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;logicalPlanBuilder;planOptimiser;modeRouter;resultCache;filterCachePreloader;rlsSetup;constructor(t,n,r,i){if(this.dbExecutor=t,this.databaseAdapter=t.databaseAdapter,!this.databaseAdapter)throw Error(e.O(`server.errors.dbAdapterRequired`));this.queryBuilder=new On(this.databaseAdapter);let a=new Un,o=new Gn(this.queryBuilder);this.drizzlePlanBuilder=new Ui(this.queryBuilder,o,this.databaseAdapter),this.comparisonQueryBuilder=new Vr(this.databaseAdapter),this.funnelQueryBuilder=new Hr(this.databaseAdapter),this.flowQueryBuilder=new Ur(this.databaseAdapter),this.retentionQueryBuilder=new Yr(this.databaseAdapter),this.logicalPlanBuilder=new Xr(a),this.planOptimiser=i??new Zr,this.rlsSetup=r,this.modeRouter=new jr({comparison:this.comparisonQueryBuilder,funnel:this.funnelQueryBuilder,flow:this.flowQueryBuilder,retention:this.retentionQueryBuilder}),this.resultCache=new Br(n),this.filterCachePreloader=new pr(this.queryBuilder)}async withRLSContext(t,n){if(!this.rlsSetup)return n();let r=this.dbExecutor.db;if(!r.transaction)throw Error(e.O(`server.errors.rlsRequiresTransactions`));let i=this.rlsSetup;return r.transaction(async e=>{await i(e,t);let r=Object.create(this.dbExecutor);return r.db=e,this.dbExecutor=r,n()})}async execute(t,n,r,i){try{let e=this.modeRouter.resolveMode(n);this.modeRouter.validateForMode(e,t,n);let a=this.resultCache.generateKey(n,r);return await this.resultCache.lookup(a,i?.skipCache??!1)||await this.withRLSContext(r,()=>this.executeQueryByModeWithCache(e,t,n,r,a))}catch(t){if(t instanceof Error){let n=t;for(;n.cause instanceof Error;)n=n.cause;let r=n.message,i=n;throw i.code&&(r+=` [${i.code}]`),i.detail&&(r+=` Detail: ${i.detail}`),i.hint&&(r+=` Hint: ${i.hint}`),t.message=e.O(`server.errors.queryExecutionFailed`,{message:r}),t}throw Error(e.O(`server.errors.queryExecutionUnknown`),{cause:t})}}buildLogicalPlan(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.resultCache.store(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(t){let n=this.comparisonQueryBuilder.getComparisonTimeDimension(t);if(!n||!n.compareDateRange)throw Error(e.O(`server.errors.noCompareDateRange`));let r=this.comparisonQueryBuilder.normalizePeriods(n.compareDateRange);if(r.length<2)throw Error(e.O(`server.errors.compareDateRangeInvalid`));let i=r.map(e=>this.comparisonQueryBuilder.createPeriodQuery(t,e));return{timeDimension:n,granularity:n.granularity||`day`,periods:r,periodQueries:i}}async executeAnalysisQueryWithCache(e,t){let n=await e();return await this.resultCache.store(t,n),n}async executeFunnelQuery(e,t,n){let r=t.funnel,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.funnelQueryBuilder.buildFunnelQuery(r,e,i);Wi(`funnel query`,a);let o=await a,s=this.funnelQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:s,annotation:c}}async executeFlowQuery(e,t,n){let r=t.flow,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.flowQueryBuilder.buildFlowQuery(r,e,i);Wi(`flow query`,a);let o=await a,s=this.flowQueryBuilder.transformResult(o),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[s],annotation:c}}async executeRetentionQuery(e,t,n){let r=t.retention,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.retentionQueryBuilder.buildRetentionQuery(r,e,i);Wi(`retention query`,a);let o=await a,s=this.retentionQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:s,annotation:c}}async executeStandardQuery(e,t,n,r){let i=new H,a=this.createQueryContext(n,i,t);this.filterCachePreloader.preload(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o),c=this.drizzlePlanBuilder.toSemanticQuery(o);this.validateSecurityContext(s,a);let l=this.drizzlePlanBuilder.build(s,c,a);Wi(`query`,l);let u=this.queryBuilder.collectNumericFields(e,t),d={data:fr(await this.dbExecutor.execute(l,u),t,this.databaseAdapter),annotation:Kn(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.resultCache.store(r,d),d}createQueryContext(e,t,n){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t,ungrouped:n?.ungrouped}}getOptimiserEngineType(){return this.dbExecutor.getEngineType?.()??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.funnelQueryBuilder.hasFunnel(e),invalidConfigKey:`server.errors.invalidFunnelConfig`,getConfig:e=>e.funnel,validate:t=>this.funnelQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.funnelValidationFailed`,build:(t,n)=>this.funnelQueryBuilder.buildFunnelQuery(t,e,n)})}async dryRunFlow(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.flowQueryBuilder.hasFlow(e),invalidConfigKey:`server.errors.invalidFlowConfig`,getConfig:e=>e.flow,validate:t=>this.flowQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.flowValidationFailed`,build:(t,n)=>this.flowQueryBuilder.buildFlowQuery(t,e,n)})}async dryRunRetention(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.retentionQueryBuilder.hasRetention(e),invalidConfigKey:`server.errors.invalidRetentionConfig`,getConfig:e=>e.retention,validate:t=>this.retentionQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.retentionValidationFailed`,build:(t,n)=>this.retentionQueryBuilder.buildRetentionQuery(t,e,n)})}async dryRunAnalysis(t,n,r){if(!r.has(t))throw Error(e.O(r.invalidConfigKey));let i=r.getConfig(t),a=r.validate(i);if(!a.isValid)throw Error(e.O(r.validationFailedKey,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},s=r.build(i,o).toSQL();return{sql:s.sql,params:s.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.modeRouter.resolveMode(t);return this.modeRouter.validateForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);this.filterCachePreloader.preload(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.toSemanticQuery(a),c=this.drizzlePlanBuilder.build(o,s,i).toSQL();return{sql:c.sql,params:c.params}}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeStandardQuery(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeAnalysisQueryWithCache(()=>this.executeFunnelQuery(t,n,r),i),flow:()=>this.executeAnalysisQueryWithCache(()=>this.executeFlowQuery(t,n,r),i),retention:()=>this.executeAnalysisQueryWithCache(()=>this.executeRetentionQuery(t,n,r),i)}[kt(e)]()}async generateSqlForMode(e,t,n,r){return{regular:()=>this.generateUnifiedSQL(t,n,r),comparison:()=>this.generateComparisonSQL(t,n,r),funnel:()=>this.dryRunFunnel(t,n,r),flow:()=>this.dryRunFlow(t,n,r),retention:()=>this.dryRunRetention(t,n,r)}[kt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}},Ki=[`year`,`quarter`,`month`,`week`,`day`,`hour`];function qi(e,t){return t.includes(`.`)?t:`${e}.${t}`}function Ji(e){let t=Object.keys(e.measures),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.measures[i],o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>qi(e.name,t))),n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o}}return n}function Yi(e){let t=Object.keys(e.dimensions),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.dimensions[i],o=a.type===`time`?a.granularities||Ki:void 0;n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,granularities:o}}return n}function Xi(e,t,n){let r=[];if(!e.joins)return r;for(let[,i]of Object.entries(e.joins)){let e=I(i.targetCube,t);e&&r.push({targetCube:e.name,relationship:i.relationship,joinFields:i.on.map(e=>({sourceField:n(e.source),targetField:n(e.target)}))})}return r}function Zi(e){let t=[];if(!e.hierarchies)return t;for(let[,n]of Object.entries(e.hierarchies))t.push({name:n.name,title:n.title||n.name,cubeName:e.name,levels:n.levels.map(t=>qi(e.name,t))});return t}var Qi=class{cubes=new Map;metadataCache;cacheConfig;rlsSetup;planOptimiser;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup,this.planOptimiser=e?.planOptimiser}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(e.O(`server.errors.dbNotConfigured`));return Dt(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new Gi(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup,this.planOptimiser)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.S(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let t=[];for(let[n,r]of this.cubes)if(r.joins)for(let[i,a]of Object.entries(r.joins))typeof a.targetCube==`string`&&!this.cubes.has(a.targetCube)&&t.push(e.O(`server.errors.cubeRefUnresolved`,{cubeName:n,joinName:i,targetCube:a.targetCube}));if(t.length>0)throw Error(e.O(`server.errors.unresolvedCubeRefs`,{details:t.map(e=>` - ${e}`).join(`
|
|
165
165
|
`)}))}validateCalculatedMeasures(t){let n=[];for(let[r,i]of Object.entries(t.measures))if(i.type===`calculated`){if(!i.calculatedSql){n.push(e.O(`server.validation.calculatedMeasure.mustHaveCalculatedSql`,{cubeName:t.name,fieldName:r}));continue}let a=Tn(i.calculatedSql);if(!a.isValid){n.push(e.O(`server.validation.calculatedMeasure.invalidSyntax`,{cubeName:t.name,fieldName:r,errors:a.errors.join(`, `)}));continue}let o=new Map(this.cubes);o.set(t.name,t);let s=new X(o);try{s.validateDependencies(t)}catch(e){n.push(e instanceof Error?e.message:String(e))}}if(n.length===0){let r=new Map(this.cubes);r.set(t.name,t);let i=new X(r);i.buildGraph(t);let a=i.detectCycle();a&&n.push(e.O(`server.validation.calculatedMeasure.circularDependency`,{cycle:a.join(` -> `)}))}if(n.length>0)throw Error(e.O(`server.errors.calculatedMeasureValidation`,{cubeName:t.name,details:n.join(`
|
|
166
|
-
`)}))}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.cubes.get(t))throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(){return this.metadataCache||=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}generateCubeMetadata(e){let t=Ji(e),n=Yi(e),r=Xi(e,this.cubes,e=>this.getColumnName(e)),i=Zi(e);return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:t,dimensions:n,segments:[],relationships:r.length>0?r:void 0,hierarchies:i.length>0?i:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t);if(!i)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return hr(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}}
|
|
166
|
+
`)}))}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.cubes.get(t))throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(){return this.metadataCache||=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}generateCubeMetadata(e){let t=Ji(e),n=Yi(e),r=Xi(e,this.cubes,e=>this.getColumnName(e)),i=Zi(e);return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:t,dimensions:n,segments:[],relationships:r.length>0?r:void 0,hierarchies:i.length>0?i:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t);if(!i)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return hr(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Qi}});
|
|
@@ -8090,25 +8090,6 @@ var ia = class {
|
|
|
8090
8090
|
analyzeQuery(e, t) {
|
|
8091
8091
|
return this.createQueryExecutor(!0).analyzeQuery(this.cubes, e, t);
|
|
8092
8092
|
}
|
|
8093
|
-
}
|
|
8094
|
-
function oa(e) {
|
|
8095
|
-
if (!e) return;
|
|
8096
|
-
let t = (Array.isArray(e) ? e[0] : e).split(",")[0]?.trim();
|
|
8097
|
-
if (t && /^[A-Za-z0-9-]{2,35}$/.test(t)) return t;
|
|
8098
|
-
}
|
|
8099
|
-
function sa(e) {
|
|
8100
|
-
return oa(e(aa));
|
|
8101
|
-
}
|
|
8102
|
-
function ca(e, t) {
|
|
8103
|
-
let n = e && typeof e == "object" ? e : {}, r = typeof n.locale == "string" ? n.locale : void 0, i = t ?? r ?? "en-GB";
|
|
8104
|
-
return r === i ? n : {
|
|
8105
|
-
...n,
|
|
8106
|
-
locale: i
|
|
8107
|
-
};
|
|
8108
|
-
}
|
|
8109
|
-
function la(e) {
|
|
8110
|
-
let t = Array.isArray(e) ? [...e] : (e ?? "").split(",").map((e) => e.trim()).filter(Boolean);
|
|
8111
|
-
return t.some((e) => e.toLowerCase() === "x-dc-locale") || t.push("X-DC-Locale"), t;
|
|
8112
|
-
}
|
|
8093
|
+
};
|
|
8113
8094
|
//#endregion
|
|
8114
|
-
export { ia as
|
|
8095
|
+
export { ia as t };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SemanticLayerCompiler } from '../../server/compiler.js';
|
|
2
|
+
import { MCPOptions } from '../utils.js';
|
|
3
|
+
import { HttpPort, McpHttpPort } from './http-port.js';
|
|
4
|
+
import { BaseSecurityContextThunk } from './security-context.js';
|
|
5
|
+
import { RestHandlers } from './rest-handlers.js';
|
|
6
|
+
export type { BaseSecurityContextThunk } from './security-context.js';
|
|
7
|
+
export interface CubeHttpHandlerOptions {
|
|
8
|
+
/** The semantic layer the handlers validate and execute against. */
|
|
9
|
+
semanticLayer: SemanticLayerCompiler;
|
|
10
|
+
/** Called in the REST `/load` catch-all 500 path with the thrown error (e.g. for logging). */
|
|
11
|
+
onError: (error: unknown) => void;
|
|
12
|
+
/**
|
|
13
|
+
* MCP endpoint config. Resolved once into the MCP POST handler. When omitted,
|
|
14
|
+
* MCP defaults are used; the adapter decides whether to route the MCP path.
|
|
15
|
+
*/
|
|
16
|
+
mcp?: MCPOptions;
|
|
17
|
+
}
|
|
18
|
+
export interface CubeHttpHandler extends RestHandlers {
|
|
19
|
+
handleLoadGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
20
|
+
handleLoadPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
21
|
+
handleMcpPost<TRes>(port: McpHttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build all HTTP handlers once. Each REST entry point owns its own request
|
|
25
|
+
* extraction, then funnels into a shared validate/execute/format tail.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createCubeHttpHandler(options: CubeHttpHandlerOptions): CubeHttpHandler;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework port for the HTTP handler core.
|
|
3
|
+
*
|
|
4
|
+
* Captures the minimal transport surface a handler needs, generically over the
|
|
5
|
+
* framework's response type `TRes` so the same core works for adapters that
|
|
6
|
+
* mutate a response object (Express) and adapters that return a `Response`
|
|
7
|
+
* (Hono/Next.js). Implementations are constructed per request by each adapter.
|
|
8
|
+
*
|
|
9
|
+
* This interface is public — third parties implement it to build adapters for
|
|
10
|
+
* other frameworks. Add new capabilities as optional members or via a separate
|
|
11
|
+
* extension interface; a new required member is a breaking change.
|
|
12
|
+
*/
|
|
13
|
+
export interface HttpPort<TRes> {
|
|
14
|
+
/** Read a request header by (case-insensitive) name. Synchronous. */
|
|
15
|
+
getHeader(name: string): string | undefined;
|
|
16
|
+
/** Resolve the parsed request body. Async (Express resolves `req.body`; others await `.json()`). */
|
|
17
|
+
getBody(): Promise<unknown>;
|
|
18
|
+
/** Read a raw query-string value by name (used by GET). */
|
|
19
|
+
getQueryParam(name: string): string | undefined;
|
|
20
|
+
/** Send a response with the given status and JSON body; returns the framework's response value. */
|
|
21
|
+
send(status: number, body: unknown): TRes;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extension of {@link HttpPort} for the MCP POST handler, which needs to set
|
|
25
|
+
* response headers (WWW-Authenticate, MCP-Session-Id), emit a single-event SSE
|
|
26
|
+
* response, and send an empty-body acknowledgement (202 for notifications).
|
|
27
|
+
*
|
|
28
|
+
* Kept separate from the minimal REST port so third-party adapters only
|
|
29
|
+
* implement these when they wire up MCP. New required members on this interface
|
|
30
|
+
* are still a breaking change for MCP-capable adapters.
|
|
31
|
+
*/
|
|
32
|
+
export interface McpHttpPort<TRes> extends HttpPort<TRes> {
|
|
33
|
+
/** Set a response header. Must be called before `send`/`sendSse`/`sendEmpty`. */
|
|
34
|
+
setHeader(name: string, value: string): void;
|
|
35
|
+
/** Send a single-event SSE response (status 200): write the pre-serialized body, then end. */
|
|
36
|
+
sendSse(status: number, body: string): TRes;
|
|
37
|
+
/** Send an empty-body response (no JSON), e.g. a 202 notification acknowledgement. */
|
|
38
|
+
sendEmpty(status: number): TRes;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-F1pCQPde.cjs");exports.createCubeHttpHandler=e.t,exports.resolveSecurityContext=e.n,exports.withLocaleFromHeaders=e.r;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point for the framework-agnostic HTTP handler core.
|
|
3
|
+
*
|
|
4
|
+
* Third parties can build adapters for other frameworks by implementing
|
|
5
|
+
* {@link HttpPort} (REST) / {@link McpHttpPort} (MCP) and driving them with
|
|
6
|
+
* {@link createCubeHttpHandler}.
|
|
7
|
+
*/
|
|
8
|
+
export type { HttpPort, McpHttpPort } from './http-port.js';
|
|
9
|
+
export { withLocaleFromHeaders, resolveSecurityContext, type HeaderReader, type BaseSecurityContextThunk } from './security-context.js';
|
|
10
|
+
export { createCubeHttpHandler, type CubeHttpHandler, type CubeHttpHandlerOptions } from './cube-http-handler.js';
|
|
11
|
+
export type { RestHandlers } from './rest-handlers.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SemanticLayerCompiler } from '../../server/compiler.js';
|
|
2
|
+
import { MCPOptions } from '../utils.js';
|
|
3
|
+
import { McpHttpPort } from './http-port.js';
|
|
4
|
+
import { BaseSecurityContextThunk } from './security-context.js';
|
|
5
|
+
export interface McpPostHandler {
|
|
6
|
+
handleMcpPost<TRes>(port: McpHttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Build the MCP POST handler once. Resolves the static resources/prompts/
|
|
10
|
+
* instructions and app config from {@link MCPOptions} at setup time, mirroring
|
|
11
|
+
* the per-request plumbing the adapters used to do inline.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createMcpPostHandler(semanticLayer: SemanticLayerCompiler, mcp: MCPOptions): McpPostHandler;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SemanticLayerCompiler } from '../../server/compiler.js';
|
|
2
|
+
import { HttpPort } from './http-port.js';
|
|
3
|
+
import { BaseSecurityContextThunk } from './security-context.js';
|
|
4
|
+
/** REST handlers keyed by endpoint; each closes over the shared semantic layer. */
|
|
5
|
+
export interface RestHandlers {
|
|
6
|
+
handleMetaGet<TRes>(port: HttpPort<TRes>): TRes;
|
|
7
|
+
handleSqlGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
8
|
+
handleSqlPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
9
|
+
handleDryRunGet<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
10
|
+
handleDryRunPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
11
|
+
handleBatchPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
12
|
+
handleExplainPost<TRes>(port: HttpPort<TRes>, getBaseSecurityContext: BaseSecurityContextThunk): Promise<TRes>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createRestHandlers(semanticLayer: SemanticLayerCompiler): RestHandlers;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SecurityContext } from '../../server/index.js';
|
|
2
|
+
/** Returns the base (pre-locale) security context for a request. */
|
|
3
|
+
export type BaseSecurityContextThunk = () => SecurityContext | Promise<SecurityContext>;
|
|
4
|
+
/** Reads a request header by (case-insensitive) name. */
|
|
5
|
+
export type HeaderReader = (name: string) => string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Merge the request locale (from the `X-DC-Locale` header) into a base security
|
|
8
|
+
* context. Replaces the per-adapter `extractSecurityContextWithLocale` wrappers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function withLocaleFromHeaders(base: SecurityContext, readHeader: HeaderReader): SecurityContext;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the base security context and merge the request locale in one step —
|
|
13
|
+
* the standard preamble for every authenticated core handler.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveSecurityContext(getBaseSecurityContext: BaseSecurityContextThunk, readHeader: HeaderReader): Promise<SecurityContext>;
|
|
16
|
+
/** Strip CR/LF from a thrown value for single-line logging (log-injection guard). */
|
|
17
|
+
export declare function sanitizeForLog(error: unknown): string;
|