drizzle-cube 0.5.8 → 0.6.0
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/README.md +2 -0
- package/dist/adapters/adapters/hono/agent-handler.d.ts +9 -0
- package/dist/adapters/adapters/hono/mcp-handler.d.ts +37 -0
- package/dist/adapters/adapters/mcp-tools-handlers.d.ts +18 -0
- package/dist/adapters/adapters/nextjs/mcp-handler.d.ts +36 -0
- package/dist/adapters/adapters/utils.d.ts +6 -81
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +50 -50
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +78 -78
- package/dist/adapters/google-BOnRIN1w.cjs +2 -0
- package/dist/adapters/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
- package/dist/adapters/{handler-Cx8QYLk6.js → handler-CfgE0JSL.js} +499 -576
- package/dist/adapters/handler-Cn0dOctE.cjs +25 -0
- package/dist/adapters/hono/index.cjs +2 -2
- package/dist/adapters/hono/index.js +205 -175
- package/dist/adapters/locale-DDvZDFVn.js +8114 -0
- package/dist/adapters/locale-ZLUUNUxr.cjs +166 -0
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +49 -38
- package/dist/adapters/mcp-transport-Chiaj4ll.cjs +40 -0
- package/dist/adapters/mcp-transport-H96VG3WY.js +591 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +190 -197
- package/dist/adapters/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
- package/dist/adapters/openai-vXvLni8v.cjs +1 -0
- package/dist/adapters/{utils-D9JPLmfl.js → utils-BPWZsX7k.js} +1271 -1218
- package/dist/adapters/utils-_whV4fXL.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.js +2 -2
- package/dist/client/charts/ChartLoader.d.ts +2 -16
- package/dist/client/charts/chartComponentRegistry.d.ts +46 -0
- package/dist/client/charts/chartConfigHelpers.d.ts +38 -0
- package/dist/client/charts.js +14 -13
- package/dist/client/chunks/{DashboardEditModal-CjCIAT-J.js → DashboardEditModal-okVfH8ZK.js} +5296 -4544
- package/dist/client/chunks/DashboardEditModal-okVfH8ZK.js.map +1 -0
- package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js → RetentionCombinedChart-BgbDhsPz.js} +10 -10
- package/dist/client/chunks/{RetentionCombinedChart-BPkfcTa8.js.map → RetentionCombinedChart-BgbDhsPz.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js → RetentionHeatmap-DjXZaTPq.js} +5 -5
- package/dist/client/chunks/{RetentionHeatmap-DGzLzr7h.js.map → RetentionHeatmap-DjXZaTPq.js.map} +1 -1
- package/dist/client/chunks/analysis-builder-DB88FojM.js +5674 -0
- package/dist/client/chunks/analysis-builder-DB88FojM.js.map +1 -0
- package/dist/client/chunks/{analysis-builder-shared-CYVwSPqt.js → analysis-builder-shared-BVK4TYfR.js} +1578 -1292
- package/dist/client/chunks/analysis-builder-shared-BVK4TYfR.js.map +1 -0
- package/dist/client/chunks/{chart-activity-grid-DmruKPab.js → chart-activity-grid-DX0SJbxs.js} +635 -492
- package/dist/client/chunks/chart-activity-grid-DX0SJbxs.js.map +1 -0
- package/dist/client/chunks/chart-area-of01_62R.js +775 -0
- package/dist/client/chunks/chart-area-of01_62R.js.map +1 -0
- package/dist/client/chunks/chart-bar-BqelQE_I.js +194 -0
- package/dist/client/chunks/chart-bar-BqelQE_I.js.map +1 -0
- package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js → chart-box-plot-kkBixZ27.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-DYKfyOI8.js.map → chart-box-plot-kkBixZ27.js.map} +1 -1
- package/dist/client/chunks/chart-bubble-B2he1--4.js +221 -0
- package/dist/client/chunks/chart-bubble-B2he1--4.js.map +1 -0
- package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js → chart-candlestick-DZp19Tzh.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-Dwc92Mrj.js.map → chart-candlestick-DZp19Tzh.js.map} +1 -1
- package/dist/client/chunks/chart-config-area-BNigHUy8.js +124 -0
- package/dist/client/chunks/chart-config-area-BNigHUy8.js.map +1 -0
- package/dist/client/chunks/chart-config-bar-DSO_LRTx.js +54 -0
- package/dist/client/chunks/chart-config-bar-DSO_LRTx.js.map +1 -0
- package/dist/client/chunks/{chart-config-box-plot-DJ-dWWXA.js → chart-config-box-plot-oW8axV2q.js} +5 -10
- package/dist/client/chunks/chart-config-box-plot-oW8axV2q.js.map +1 -0
- package/dist/client/chunks/{chart-config-gauge-DSwC04l0.js → chart-config-gauge-Dq-_H9UN.js} +5 -7
- package/dist/client/chunks/chart-config-gauge-Dq-_H9UN.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-delta-D6BIkHL3.js → chart-config-kpi-delta-DSQbvqu_.js} +5 -10
- package/dist/client/chunks/chart-config-kpi-delta-DSQbvqu_.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-number-Bx-V9a62.js → chart-config-kpi-number-EFSWY1We.js} +5 -7
- package/dist/client/chunks/chart-config-kpi-number-EFSWY1We.js.map +1 -0
- package/dist/client/chunks/{chart-config-kpi-text-CcqC1u-8.js → chart-config-kpi-text-KM3V5X2u.js} +5 -7
- package/dist/client/chunks/chart-config-kpi-text-KM3V5X2u.js.map +1 -0
- package/dist/client/chunks/{chart-config-line-Db3jDsWc.js → chart-config-line-D6jG8PCH.js} +9 -36
- package/dist/client/chunks/chart-config-line-D6jG8PCH.js.map +1 -0
- package/dist/client/chunks/{chart-config-pie-DD4SmRTF.js → chart-config-pie-BhzW-fdn.js} +6 -16
- package/dist/client/chunks/chart-config-pie-BhzW-fdn.js.map +1 -0
- package/dist/client/chunks/{chart-config-radar-CC2XAaGr.js → chart-config-radar-D7REP1q_.js} +6 -16
- package/dist/client/chunks/chart-config-radar-D7REP1q_.js.map +1 -0
- package/dist/client/chunks/{chart-config-radial-bar-DmxKx1R0.js → chart-config-radial-bar-Byx6qOPU.js} +6 -16
- package/dist/client/chunks/chart-config-radial-bar-Byx6qOPU.js.map +1 -0
- package/dist/client/chunks/{chart-config-tree-map-BI-oQStO.js → chart-config-tree-map-DVrvf3yQ.js} +6 -16
- package/dist/client/chunks/chart-config-tree-map-DVrvf3yQ.js.map +1 -0
- package/dist/client/chunks/{chart-config-waterfall-DSnyixbI.js → chart-config-waterfall-DmFeQdIk.js} +5 -10
- package/dist/client/chunks/chart-config-waterfall-DmFeQdIk.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-BO4sXsim.js → chart-data-table-CKauQXme.js} +1046 -1121
- package/dist/client/chunks/chart-data-table-CKauQXme.js.map +1 -0
- package/dist/client/chunks/{chart-funnel-DnWRsmnS.js → chart-funnel-CToKSBaL.js} +184 -222
- package/dist/client/chunks/chart-funnel-CToKSBaL.js.map +1 -0
- package/dist/client/chunks/chart-gauge-DTVezSk7.js +403 -0
- package/dist/client/chunks/chart-gauge-DTVezSk7.js.map +1 -0
- package/dist/client/chunks/chart-heat-map-DTuUl0BR.js +236 -0
- package/dist/client/chunks/chart-heat-map-DTuUl0BR.js.map +1 -0
- package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js +408 -0
- package/dist/client/chunks/chart-kpi-delta-Dn-jjO-2.js.map +1 -0
- package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js +244 -0
- package/dist/client/chunks/chart-kpi-number-P_WBiO5S.js.map +1 -0
- package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js +185 -0
- package/dist/client/chunks/chart-kpi-text-C-Y4eb5H.js.map +1 -0
- package/dist/client/chunks/chart-line-DKgrQA6c.js +101 -0
- package/dist/client/chunks/chart-line-DKgrQA6c.js.map +1 -0
- package/dist/client/chunks/{chart-markdown-dgUetjyM.js → chart-markdown-CV75S_zL.js} +2 -2
- package/dist/client/chunks/{chart-markdown-dgUetjyM.js.map → chart-markdown-CV75S_zL.js.map} +1 -1
- package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js → chart-measure-profile-Ket8fJyf.js} +7 -7
- package/dist/client/chunks/{chart-measure-profile-ClfpLs4q.js.map → chart-measure-profile-Ket8fJyf.js.map} +1 -1
- package/dist/client/chunks/chart-pie-ByieAX5H.js +119 -0
- package/dist/client/chunks/chart-pie-ByieAX5H.js.map +1 -0
- package/dist/client/chunks/chart-radar-CiSwHWp4.js +138 -0
- package/dist/client/chunks/chart-radar-CiSwHWp4.js.map +1 -0
- package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js +122 -0
- package/dist/client/chunks/chart-radial-bar-BF6Mhl6f.js.map +1 -0
- package/dist/client/chunks/{chart-sankey-M3XpO_ah.js → chart-sankey-DjrvKw6K.js} +36 -39
- package/dist/client/chunks/{chart-sankey-M3XpO_ah.js.map → chart-sankey-DjrvKw6K.js.map} +1 -1
- package/dist/client/chunks/chart-scatter-Dd9WFqnS.js +258 -0
- package/dist/client/chunks/chart-scatter-Dd9WFqnS.js.map +1 -0
- package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js → chart-sunburst-leGpuDj7.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-A_u6lqlS.js.map → chart-sunburst-leGpuDj7.js.map} +1 -1
- package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js +323 -0
- package/dist/client/chunks/chart-tree-map-Ceq5sLZA.js.map +1 -0
- package/dist/client/chunks/{chart-waterfall-BuhMoagf.js → chart-waterfall-DyvQReN5.js} +7 -7
- package/dist/client/chunks/{chart-waterfall-BuhMoagf.js.map → chart-waterfall-DyvQReN5.js.map} +1 -1
- package/dist/client/chunks/{charts-core-jRtb0S2M.js → charts-core-DaXSt1Dd.js} +2 -2
- package/dist/client/chunks/{charts-core-jRtb0S2M.js.map → charts-core-DaXSt1Dd.js.map} +1 -1
- package/dist/client/chunks/charts-loader-DdTeCeNo.js +84 -0
- package/dist/client/chunks/charts-loader-DdTeCeNo.js.map +1 -0
- package/dist/client/chunks/{nl-NL-CpVs7ox3.js → nl-NL-2zTAWTej.js} +2 -1
- package/dist/client/chunks/{nl-NL-CpVs7ox3.js.map → nl-NL-2zTAWTej.js.map} +1 -1
- package/dist/client/chunks/retention-ChW9jYdy.js.map +1 -1
- package/dist/client/chunks/{schema-visualization-DE09kQE3.js → schema-visualization-Cb_E9_Gd.js} +12 -12
- package/dist/client/chunks/{schema-visualization-DE09kQE3.js.map → schema-visualization-Cb_E9_Gd.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-CoeQbprt.js → useDirtyStateTracking-MbpxH_v6.js} +95 -84
- package/dist/client/chunks/useDirtyStateTracking-MbpxH_v6.js.map +1 -0
- package/dist/client/chunks/{useExplainAI-DlnXWdmz.js → useExplainAI-evnZkjCY.js} +14 -14
- package/dist/client/chunks/{useExplainAI-DlnXWdmz.js.map → useExplainAI-evnZkjCY.js.map} +1 -1
- package/dist/client/chunks/{utils-CTKNaXS8.js → utils-3P6z1vz5.js} +2 -2
- package/dist/client/chunks/{utils-CTKNaXS8.js.map → utils-3P6z1vz5.js.map} +1 -1
- package/dist/client/chunks/{vendor-CPIYyeuD.js → vendor-DSpR0IW6.js} +43 -43
- package/dist/client/chunks/{vendor-CPIYyeuD.js.map → vendor-DSpR0IW6.js.map} +1 -1
- package/dist/client/components/AgenticNotebook/agentChatParts.d.ts +34 -0
- package/dist/client/components/AgenticNotebook/chatMessageParts.d.ts +39 -0
- package/dist/client/components/AgenticNotebook/useAgentChatController.d.ts +25 -0
- package/dist/client/components/AgenticNotebook/useNotebookAutosave.d.ts +12 -0
- package/dist/client/components/AnalysisBuilder/AnalysisQueryPanelParts.d.ts +64 -0
- package/dist/client/components/AnalysisBuilder/AnalysisResultsHeader.d.ts +67 -0
- package/dist/client/components/AnalysisBuilder/BreakdownComparisonToggle.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/BreakdownRow.d.ts +26 -0
- package/dist/client/components/AnalysisBuilder/DisplayOptionControl.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/ExecutionPlanPanelParts.d.ts +22 -0
- package/dist/client/components/AnalysisBuilder/FieldSearchResults.d.ts +16 -0
- package/dist/client/components/AnalysisBuilder/FilterValueInput.d.ts +63 -0
- package/dist/client/components/AnalysisBuilder/FlowDepthControls.d.ts +10 -0
- package/dist/client/components/AnalysisBuilder/FlowVisualizationPicker.d.ts +7 -0
- package/dist/client/components/AnalysisBuilder/LegacyBooleanOptions.d.ts +8 -0
- package/dist/client/components/AnalysisBuilder/MetricRow.d.ts +23 -0
- package/dist/client/components/AnalysisBuilder/SortToggleButton.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/StringArrayInput.d.ts +17 -0
- package/dist/client/components/AnalysisBuilder/filterConfigModalUtils.d.ts +30 -0
- package/dist/client/components/AnalysisBuilder/hooks/useAnalysisBuilderImperativeHandle.d.ts +13 -0
- package/dist/client/components/AnalysisBuilder/hooks/useDragReorder.d.ts +25 -0
- package/dist/client/components/AnalysisBuilder/hooks/useFieldSearchKeyboard.d.ts +11 -0
- package/dist/client/components/AnalysisBuilder/utils/axisConfigUtils.d.ts +23 -0
- package/dist/client/components/AnalysisBuilder/utils/executionPlanMarkdown.d.ts +8 -0
- package/dist/client/components/AnalysisBuilder/utils/fieldUtils.d.ts +5 -0
- package/dist/client/components/AnalysisBuilder/utils/resultsPanelDerive.d.ts +68 -0
- package/dist/client/components/AnalysisBuilder/utils/shareStateUtils.d.ts +68 -0
- package/dist/client/components/AnalysisBuilder/utils/sortUtils.d.ts +7 -0
- package/dist/client/components/DashboardFilters/CompactFilterBarParts.d.ts +26 -0
- package/dist/client/components/DashboardFilters/DashboardFilterConfigModalParts.d.ts +27 -0
- package/dist/client/components/DashboardFilters/DashboardFilterValueInput.d.ts +39 -0
- package/dist/client/components/DashboardFilters/dashboardFilterConfigModalUtils.d.ts +21 -0
- package/dist/client/components/DashboardFilters/useCompactFilterBar.d.ts +19 -0
- package/dist/client/components/DashboardFilters/useDashboardFilterConfigModal.d.ts +69 -0
- package/dist/client/components/DashboardFilters/useDateRangeState.d.ts +19 -0
- package/dist/client/components/DashboardFilters/useFilterDropdowns.d.ts +21 -0
- package/dist/client/components/DashboardFilters/useFilterValueFetch.d.ts +23 -0
- package/dist/client/components/DashboardPortletCard.d.ts +2 -57
- package/dist/client/components/analyticsPortlet/PortletChart.d.ts +31 -0
- package/dist/client/components/analyticsPortlet/PortletChartView.d.ts +35 -0
- package/dist/client/components/analyticsPortlet/PortletStates.d.ts +65 -0
- package/dist/client/components/analyticsPortlet/parsePortletQuery.d.ts +22 -0
- package/dist/client/components/analyticsPortlet/portletRenderState.d.ts +31 -0
- package/dist/client/components/analyticsPortlet/usePortletDebugData.d.ts +37 -0
- package/dist/client/components/analyticsPortlet/usePortletDrillState.d.ts +17 -0
- package/dist/client/components/analyticsPortlet/usePortletQueryResults.d.ts +37 -0
- package/dist/client/components/charts/ActivityGridChart.helpers.d.ts +33 -0
- package/dist/client/components/charts/ActivityGridChart.render.d.ts +31 -0
- package/dist/client/components/charts/AxisFormatControls.d.ts +3 -1
- package/dist/client/components/charts/BarChart.helpers.d.ts +23 -0
- package/dist/client/components/charts/BarSeries.d.ts +29 -0
- package/dist/client/components/charts/BubbleChart.helpers.d.ts +43 -0
- package/dist/client/components/charts/BubbleChart.render.d.ts +21 -0
- package/dist/client/components/charts/ChartStates.d.ts +38 -0
- package/dist/client/components/charts/FunnelChart.helpers.d.ts +25 -0
- package/dist/client/components/charts/FunnelViews.d.ts +16 -0
- package/dist/client/components/charts/HeatMapCanvas.d.ts +25 -0
- package/dist/client/components/charts/HeatMapChart.helpers.d.ts +64 -0
- package/dist/client/components/charts/KpiDelta.helpers.d.ts +20 -0
- package/dist/client/components/charts/KpiNumber.helpers.d.ts +30 -0
- package/dist/client/components/charts/KpiStates.d.ts +19 -0
- package/dist/client/components/charts/ScatterChart.helpers.d.ts +43 -0
- package/dist/client/components/charts/ScatterSeries.d.ts +17 -0
- package/dist/client/components/charts/ScatterTooltip.d.ts +21 -0
- package/dist/client/components/charts/TreeMapChart.helpers.d.ts +37 -0
- package/dist/client/components/charts/TreeMapContent.d.ts +24 -0
- package/dist/client/components/charts/TreeMapLegend.d.ts +13 -0
- package/dist/client/components/charts/cartesianChartHelpers.d.ts +126 -0
- package/dist/client/components/charts/chartAxisResolution.d.ts +32 -0
- package/dist/client/components/charts/chartScaffolding.d.ts +77 -0
- package/dist/client/components/charts/gaugeChartHelpers.d.ts +36 -0
- package/dist/client/components/charts/kpiTextHelpers.d.ts +46 -0
- package/dist/client/components/charts/radarChartHelpers.d.ts +14 -0
- package/dist/client/components/charts/radialBarChartHelpers.d.ts +22 -0
- package/dist/client/components/charts/useChartDimensions.d.ts +20 -0
- package/dist/client/components/charts/useKpiDimensions.d.ts +30 -0
- package/dist/client/components/dashboard/DashboardEditBar.d.ts +5 -0
- package/dist/client/components/dashboard/LayoutModeToggle.d.ts +10 -0
- package/dist/client/components/dashboardPortletCard/FilterFieldChip.d.ts +12 -0
- package/dist/client/components/dashboardPortletCard/PortletCardHeader.d.ts +43 -0
- package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +33 -0
- package/dist/client/components/dashboardPortletCard/filterField.d.ts +12 -0
- package/dist/client/components/dashboardPortletCard/propsEqual.d.ts +55 -0
- package/dist/client/components/dashboardPortletCard/usePortletCardActions.d.ts +16 -0
- package/dist/client/components/portletAnalysisModal/saveValidation.d.ts +8 -0
- package/dist/client/components/shared/dateRangeUtils.d.ts +40 -0
- package/dist/client/components/shared/filterDisplayUtils.d.ts +10 -0
- package/dist/client/components/shared/filterItem/FilterDateRangeSelector.d.ts +17 -0
- package/dist/client/components/shared/filterItem/FilterFieldDropdown.d.ts +16 -0
- package/dist/client/components/shared/filterItem/dateRangeSync.d.ts +14 -0
- package/dist/client/components/shared/filterItem/fieldVisuals.d.ts +5 -0
- package/dist/client/components/shared/filterValueSelector/FilterValueInputs.d.ts +55 -0
- package/dist/client/components/shared/filterValueSelector/useFilterValueSelectorState.d.ts +25 -0
- package/dist/client/components/shared/queryFieldUtils.d.ts +21 -0
- package/dist/client/components/shared/utils.d.ts +4 -43
- package/dist/client/components.js +3 -3
- package/dist/client/hooks/agentChatStream.d.ts +39 -0
- package/dist/client/hooks/analysisQueryExecutionModes.d.ts +133 -0
- package/dist/client/hooks/drillNavigation.d.ts +25 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +2 -2
- package/dist/client/index.js +816 -669
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +3 -3
- package/dist/client/schema.js +1 -1
- package/dist/client/shared/chartConfigBuilders.d.ts +18 -0
- package/dist/client/shared/components/QueryAnalysisPanel.sections.d.ts +41 -0
- package/dist/client/shared/queryTransforms.d.ts +20 -0
- package/dist/client/shared/utils.d.ts +2 -4
- package/dist/client/stores/optionsToAnalysisConfig.d.ts +17 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/utils/axisValueFormatting.d.ts +32 -0
- package/dist/client/utils/timeValueFormatting.d.ts +32 -0
- package/dist/client/utils.js +6 -6
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +55 -55
- package/dist/server/google-BOnRIN1w.cjs +2 -0
- package/dist/server/{google-CFYljAOF.js → google-CvKM9yVM.js} +83 -71
- package/dist/server/index.cjs +179 -211
- package/dist/server/index.js +6330 -6458
- package/dist/server/{openai-BZdAA7Ji.js → openai-cDlFSTk6.js} +60 -58
- package/dist/server/openai-vXvLni8v.cjs +1 -0
- package/dist/server/server/adapters/base-adapter.d.ts +80 -35
- package/dist/server/server/adapters/databend-adapter.d.ts +8 -59
- package/dist/server/server/adapters/duckdb-adapter.d.ts +5 -59
- package/dist/server/server/adapters/mysql-adapter.d.ts +13 -70
- package/dist/server/server/adapters/postgres-adapter.d.ts +1 -65
- package/dist/server/server/adapters/snowflake-adapter.d.ts +5 -68
- package/dist/server/server/adapters/sqlite-adapter.d.ts +12 -32
- package/dist/server/server/adapters/window-function-builder.d.ts +11 -0
- package/dist/server/server/agent/chart-validation.d.ts +0 -5
- package/dist/server/server/agent/handler-steps.d.ts +37 -0
- package/dist/server/server/ai/discovery-helpers.d.ts +29 -0
- package/dist/server/server/ai/discovery.d.ts +4 -0
- package/dist/server/server/ai/suggestion-helpers.d.ts +33 -0
- package/dist/server/server/ai/suggestion.d.ts +0 -3
- package/dist/server/server/ai/validation-helpers.d.ts +21 -0
- package/dist/server/server/ai/validation.d.ts +0 -3
- package/dist/server/server/builders/analysis-utils.d.ts +106 -0
- package/dist/server/server/builders/cte-builder.d.ts +46 -0
- package/dist/server/server/builders/date-time-builder.d.ts +5 -0
- package/dist/server/server/builders/date-time-helpers.d.ts +34 -0
- package/dist/server/server/builders/filter-builder.d.ts +2 -0
- package/dist/server/server/builders/filter-operators.d.ts +23 -0
- package/dist/server/server/builders/flow-query-builder.d.ts +46 -19
- package/dist/server/server/builders/funnel-query-builder.d.ts +16 -5
- package/dist/server/server/builders/group-by-builder.d.ts +11 -0
- package/dist/server/server/builders/measure-builder.d.ts +43 -0
- package/dist/server/server/builders/retention-query-builder.d.ts +12 -14
- package/dist/server/server/cache-utils.d.ts +25 -5
- package/dist/server/server/compiler-metadata.d.ts +11 -0
- package/dist/server/server/compiler.d.ts +8 -14
- package/dist/server/server/cube-utils.d.ts +29 -4
- package/dist/server/server/execution/annotation-builder.d.ts +12 -0
- package/dist/server/server/execution/filter-cache-preloader.d.ts +19 -0
- package/dist/server/server/execution/mode-router.d.ts +25 -0
- package/dist/server/server/execution/query-result-cache.d.ts +21 -0
- package/dist/server/server/execution/result-post-processor.d.ts +10 -0
- package/dist/server/server/executor.d.ts +33 -30
- package/dist/server/server/executors/explain-utils.d.ts +28 -0
- package/dist/server/server/explain/explain-tree.d.ts +20 -0
- package/dist/server/server/filter-cache.d.ts +2 -2
- package/dist/server/server/gap-filler.d.ts +6 -0
- package/dist/server/server/index.d.ts +3 -1
- package/dist/server/server/logical-plan/cte-planner-helpers.d.ts +37 -0
- package/dist/server/server/logical-plan/cte-planner.d.ts +104 -0
- package/dist/server/server/logical-plan/filter-propagation.d.ts +44 -0
- package/dist/server/server/logical-plan/index.d.ts +6 -1
- package/dist/server/server/logical-plan/join-planner.d.ts +27 -0
- package/dist/server/server/logical-plan/logical-planner.d.ts +7 -200
- package/dist/server/server/logical-plan/optimiser.d.ts +3 -1
- package/dist/server/server/logical-plan/plan-analysis-reporter.d.ts +59 -0
- package/dist/server/server/logical-plan/planner-utils.d.ts +20 -0
- package/dist/server/server/logical-plan/types.d.ts +17 -9
- package/dist/server/server/measure-classification.d.ts +40 -0
- package/dist/server/server/physical-plan/drizzle-plan-builder.d.ts +21 -21
- package/dist/server/server/physical-plan/drizzle-sql-builder.d.ts +11 -0
- package/dist/server/server/physical-plan/processors/index.d.ts +2 -0
- package/dist/server/server/physical-plan/processors/keys-dedup-processor.d.ts +13 -0
- package/dist/server/server/physical-plan/processors/multi-fact-processor.d.ts +13 -0
- package/dist/server/server/physical-plan/processors/shared.d.ts +5 -0
- package/dist/server/server/query-handlers.d.ts +79 -0
- package/dist/server/server/query-modes.d.ts +28 -0
- package/dist/server/server/query-validator.d.ts +9 -0
- package/dist/server/server/resolvers/calculated-measure-resolver.d.ts +5 -0
- package/dist/server/server/resolvers/join-path-resolver.d.ts +6 -0
- package/dist/server/server/sql-format.d.ts +11 -0
- package/dist/server/server/types/cube.d.ts +18 -4
- package/dist/server/server/types/flow.d.ts +6 -5
- package/dist/server/server/types/index.d.ts +1 -1
- package/dist/server/server/types/validation.d.ts +14 -0
- package/package.json +11 -4
- package/dist/adapters/google-DUlXeeDA.cjs +0 -2
- package/dist/adapters/handler-CzbCuS6_.cjs +0 -25
- package/dist/adapters/locale-BPB7flIG.js +0 -8249
- package/dist/adapters/locale-tIMrNcCr.cjs +0 -198
- package/dist/adapters/mcp-transport-C2QzXm6h.cjs +0 -40
- package/dist/adapters/mcp-transport-D0B3S1tB.js +0 -579
- package/dist/adapters/openai-D_U4V0kT.cjs +0 -1
- package/dist/adapters/utils-KV37IBIv.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-CjCIAT-J.js.map +0 -1
- package/dist/client/chunks/analysis-builder-MuMIzoRq.js +0 -5367
- package/dist/client/chunks/analysis-builder-MuMIzoRq.js.map +0 -1
- package/dist/client/chunks/analysis-builder-shared-CYVwSPqt.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-DmruKPab.js.map +0 -1
- package/dist/client/chunks/chart-area-DHCPM4Em.js +0 -450
- package/dist/client/chunks/chart-area-DHCPM4Em.js.map +0 -1
- package/dist/client/chunks/chart-bar-KddciGDv.js +0 -271
- package/dist/client/chunks/chart-bar-KddciGDv.js.map +0 -1
- package/dist/client/chunks/chart-bubble-CfqiB538.js +0 -273
- package/dist/client/chunks/chart-bubble-CfqiB538.js.map +0 -1
- package/dist/client/chunks/chart-config-area-Bq_UsW3x.js +0 -101
- package/dist/client/chunks/chart-config-area-Bq_UsW3x.js.map +0 -1
- package/dist/client/chunks/chart-config-bar-_JEGZnAu.js +0 -95
- package/dist/client/chunks/chart-config-bar-_JEGZnAu.js.map +0 -1
- package/dist/client/chunks/chart-config-box-plot-DJ-dWWXA.js.map +0 -1
- package/dist/client/chunks/chart-config-gauge-DSwC04l0.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-delta-D6BIkHL3.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-number-Bx-V9a62.js.map +0 -1
- package/dist/client/chunks/chart-config-kpi-text-CcqC1u-8.js.map +0 -1
- package/dist/client/chunks/chart-config-line-Db3jDsWc.js.map +0 -1
- package/dist/client/chunks/chart-config-pie-DD4SmRTF.js.map +0 -1
- package/dist/client/chunks/chart-config-radar-CC2XAaGr.js.map +0 -1
- package/dist/client/chunks/chart-config-radial-bar-DmxKx1R0.js.map +0 -1
- package/dist/client/chunks/chart-config-tree-map-BI-oQStO.js.map +0 -1
- package/dist/client/chunks/chart-config-waterfall-DSnyixbI.js.map +0 -1
- package/dist/client/chunks/chart-data-table-BO4sXsim.js.map +0 -1
- package/dist/client/chunks/chart-funnel-DnWRsmnS.js.map +0 -1
- package/dist/client/chunks/chart-gauge-CgMeqeGb.js +0 -424
- package/dist/client/chunks/chart-gauge-CgMeqeGb.js.map +0 -1
- package/dist/client/chunks/chart-heat-map-DcGm9SWK.js +0 -231
- package/dist/client/chunks/chart-heat-map-DcGm9SWK.js.map +0 -1
- package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js +0 -343
- package/dist/client/chunks/chart-kpi-delta-C2wKPqCb.js.map +0 -1
- package/dist/client/chunks/chart-kpi-number-gWYF44ol.js +0 -322
- package/dist/client/chunks/chart-kpi-number-gWYF44ol.js.map +0 -1
- package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js +0 -149
- package/dist/client/chunks/chart-kpi-text-DIYtJtk4.js.map +0 -1
- package/dist/client/chunks/chart-line-9BEGN5Ti.js +0 -433
- package/dist/client/chunks/chart-line-9BEGN5Ti.js.map +0 -1
- package/dist/client/chunks/chart-pie-BjAIhyOi.js +0 -172
- package/dist/client/chunks/chart-pie-BjAIhyOi.js.map +0 -1
- package/dist/client/chunks/chart-radar-Dgkcl2bN.js +0 -154
- package/dist/client/chunks/chart-radar-Dgkcl2bN.js.map +0 -1
- package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js +0 -148
- package/dist/client/chunks/chart-radial-bar-DdWJjAhK.js.map +0 -1
- package/dist/client/chunks/chart-scatter-DaHYP_OL.js +0 -255
- package/dist/client/chunks/chart-scatter-DaHYP_OL.js.map +0 -1
- package/dist/client/chunks/chart-tree-map-uiwUU4nb.js +0 -298
- package/dist/client/chunks/chart-tree-map-uiwUU4nb.js.map +0 -1
- package/dist/client/chunks/useDirtyStateTracking-CoeQbprt.js.map +0 -1
- package/dist/server/google-DUlXeeDA.cjs +0 -2
- package/dist/server/openai-D_U4V0kT.cjs +0 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
const e=require("./utils-_whV4fXL.cjs");var t=Symbol.for(`drizzle:entityKind`);function n(e,n){if(!e||typeof e!=`object`)return!1;if(e instanceof n)return!0;if(!Object.prototype.hasOwnProperty.call(n,t))throw Error(`Class "${n.name??`<unknown>`}" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`);let r=Object.getPrototypeOf(e).constructor;if(r)for(;r;){if(t in r&&r[t]===n[t])return!0;r=Object.getPrototypeOf(r)}return!1}var r=class{constructor(e,t){this.table=e,this.config=t,this.name=t.name,this.keyAsName=t.keyAsName,this.notNull=t.notNull,this.default=t.default,this.defaultFn=t.defaultFn,this.onUpdateFn=t.onUpdateFn,this.hasDefault=t.hasDefault,this.primary=t.primaryKey,this.isUnique=t.isUnique,this.uniqueName=t.uniqueName,this.uniqueType=t.uniqueType,this.dataType=t.dataType,this.columnType=t.columnType,this.generated=t.generated,this.generatedIdentity=t.generatedIdentity}static[t]=`Column`;name;keyAsName;primary;notNull;default;defaultFn;onUpdateFn;hasDefault;isUnique;uniqueName;uniqueType;dataType;columnType;enumValues=void 0;generated=void 0;generatedIdentity=void 0;config;mapFromDriverValue(e){return e}mapToDriverValue(e){return e}shouldDisableInsert(){return this.config.generated!==void 0&&this.config.generated.type!==`byDefault`}},i=Symbol.for(`drizzle:Name`),a=Symbol.for(`drizzle:isPgEnum`);function o(e){return!!e&&typeof e==`function`&&a in e&&e[a]===!0}var s=class{static[t]=`Subquery`;constructor(e,t,n,r=!1,i=[]){this._={brand:`Subquery`,sql:e,selectedFields:t,alias:n,isWith:r,usedTables:i}}},c={startActiveSpan(e,t){return t()}},l=Symbol.for(`drizzle:ViewBaseConfig`),u=Symbol.for(`drizzle:Schema`),d=Symbol.for(`drizzle:Columns`),f=Symbol.for(`drizzle:ExtraConfigColumns`),p=Symbol.for(`drizzle:OriginalName`),m=Symbol.for(`drizzle:BaseName`),h=Symbol.for(`drizzle:IsAlias`),g=Symbol.for(`drizzle:ExtraConfigBuilder`),_=Symbol.for(`drizzle:IsDrizzleTable`),v=class{static[t]=`Table`;static Symbol={Name:i,Schema:u,OriginalName:p,Columns:d,ExtraConfigColumns:f,BaseName:m,IsAlias:h,ExtraConfigBuilder:g};[i];[p];[u];[d];[f];[m];[h]=!1;[_]=!0;[g]=void 0;constructor(e,t,n){this[i]=this[p]=e,this[u]=t,this[m]=n}};function y(e){return e!=null&&typeof e.getSQL==`function`}function ee(e){let t={sql:``,params:[]};for(let n of e)t.sql+=n.sql,t.params.push(...n.params),n.typings?.length&&(t.typings||=[],t.typings.push(...n.typings));return t}var b=class{static[t]=`StringChunk`;value;constructor(e){this.value=Array.isArray(e)?e:[e]}getSQL(){return new x([this])}},x=class e{constructor(e){this.queryChunks=e;for(let t of e)if(n(t,v)){let e=t[v.Symbol.Schema];this.usedTables.push(e===void 0?t[v.Symbol.Name]:e+`.`+t[v.Symbol.Name])}}static[t]=`SQL`;decoder=re;shouldInlineParams=!1;usedTables=[];append(e){return this.queryChunks.push(...e.queryChunks),this}toQuery(e){return c.startActiveSpan(`drizzle.buildSQL`,t=>{let n=this.buildQueryFromSourceParams(this.queryChunks,e);return t?.setAttributes({"drizzle.query.text":n.sql,"drizzle.query.params":JSON.stringify(n.params)}),n})}buildQueryFromSourceParams(t,i){let a=Object.assign({},i,{inlineParams:i.inlineParams||this.shouldInlineParams,paramStartIndex:i.paramStartIndex||{value:0}}),{casing:c,escapeName:u,escapeParam:d,prepareTyping:f,inlineParams:p,paramStartIndex:m}=a;return ee(t.map(t=>{if(n(t,b))return{sql:t.value.join(``),params:[]};if(n(t,te))return{sql:u(t.value),params:[]};if(t===void 0)return{sql:``,params:[]};if(Array.isArray(t)){let e=[new b(`(`)];for(let[n,r]of t.entries())e.push(r),n<t.length-1&&e.push(new b(`, `));return e.push(new b(`)`)),this.buildQueryFromSourceParams(e,a)}if(n(t,e))return this.buildQueryFromSourceParams(t.queryChunks,{...a,inlineParams:p||t.shouldInlineParams});if(n(t,v)){let e=t[v.Symbol.Schema],n=t[v.Symbol.Name];return{sql:e===void 0||t[h]?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,r)){let e=c.getColumnCasing(t);if(i.invokeSource===`indexes`)return{sql:u(e),params:[]};let n=t.table[v.Symbol.Schema];return{sql:t.table[h]||n===void 0?u(t.table[v.Symbol.Name])+`.`+u(e):u(n)+`.`+u(t.table[v.Symbol.Name])+`.`+u(e),params:[]}}if(n(t,oe)){let e=t[l].schema,n=t[l].name;return{sql:e===void 0||t[l].isAlias?u(n):u(e)+`.`+u(n),params:[]}}if(n(t,S)){if(n(t.value,w))return{sql:d(m.value++,t),params:[t],typings:[`none`]};let r=t.value===null?null:t.encoder.mapToDriverValue(t.value);if(n(r,e))return this.buildQueryFromSourceParams([r],a);if(p)return{sql:this.mapInlineParam(r,a),params:[]};let i=[`none`];return f&&(i=[f(t.encoder)]),{sql:d(m.value++,r),params:[r],typings:i}}return n(t,w)?{sql:d(m.value++,t),params:[t],typings:[`none`]}:n(t,e.Aliased)&&t.fieldAlias!==void 0?{sql:u(t.fieldAlias),params:[]}:n(t,s)?t._.isWith?{sql:u(t._.alias),params:[]}:this.buildQueryFromSourceParams([new b(`(`),t._.sql,new b(`) `),new te(t._.alias)],a):o(t)?t.schema?{sql:u(t.schema)+`.`+u(t.enumName),params:[]}:{sql:u(t.enumName),params:[]}:y(t)?t.shouldOmitSQLParens?.()?this.buildQueryFromSourceParams([t.getSQL()],a):this.buildQueryFromSourceParams([new b(`(`),t.getSQL(),new b(`)`)],a):p?{sql:this.mapInlineParam(t,a),params:[]}:{sql:d(m.value++,t),params:[t],typings:[`none`]}}))}mapInlineParam(e,{escapeString:t}){if(e===null)return`null`;if(typeof e==`number`||typeof e==`boolean`)return e.toString();if(typeof e==`string`)return t(e);if(typeof e==`object`){let n=e.toString();return t(n===`[object Object]`?JSON.stringify(e):n)}throw Error(`Unexpected param value: `+e)}getSQL(){return this}as(t){return t===void 0?this:new e.Aliased(this,t)}mapWith(e){return this.decoder=typeof e==`function`?{mapFromDriverValue:e}:e,this}inlineParams(){return this.shouldInlineParams=!0,this}if(e){return e?this:void 0}},te=class{constructor(e){this.value=e}static[t]=`Name`;brand;getSQL(){return new x([this])}};function ne(e){return typeof e==`object`&&!!e&&`mapToDriverValue`in e&&typeof e.mapToDriverValue==`function`}var re={mapFromDriverValue:e=>e},ie={mapToDriverValue:e=>e};({...re,...ie});var S=class{constructor(e,t=ie){this.value=e,this.encoder=t}static[t]=`Param`;brand;getSQL(){return new x([this])}};function C(e,...t){let n=[];(t.length>0||e.length>0&&e[0]!==``)&&n.push(new b(e[0]));for(let[r,i]of t.entries())n.push(i,new b(e[r+1]));return new x(n)}(e=>{function t(){return new x([])}e.empty=t;function n(e){return new x(e)}e.fromList=n;function r(e){return new x([new b(e)])}e.raw=r;function i(e,t){let n=[];for(let[r,i]of e.entries())r>0&&t!==void 0&&n.push(t),n.push(i);return new x(n)}e.join=i;function a(e){return new te(e)}e.identifier=a;function o(e){return new w(e)}e.placeholder=o;function s(e,t){return new S(e,t)}e.param=s})(C||={}),(e=>{class n{constructor(e,t){this.sql=e,this.fieldAlias=t}static[t]=`SQL.Aliased`;isSelectionField=!1;getSQL(){return this.sql}clone(){return new n(this.sql,this.fieldAlias)}}e.Aliased=n})(x||={});var w=class{constructor(e){this.name=e}static[t]=`Placeholder`;getSQL(){return new x([this])}},ae=Symbol.for(`drizzle:IsDrizzleView`),oe=class{static[t]=`View`;[l];[ae]=!0;constructor({name:e,schema:t,selectedFields:n,query:r}){this[l]={name:e,originalName:e,schema:t,selectedFields:n,query:r,isExisting:!r,isAlias:!1}}getSQL(){return new x([this])}};r.prototype.getSQL=function(){return new x([this])},v.prototype.getSQL=function(){return new x([this])},s.prototype.getSQL=function(){return new x([this])};function T(e,t){return ne(t)&&!y(e)&&!n(e,S)&&!n(e,w)&&!n(e,r)&&!n(e,v)&&!n(e,oe)?new S(e,t):e}var E=(e,t)=>C`${e} = ${T(t,e)}`,se=(e,t)=>C`${e} <> ${T(t,e)}`;function D(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new x(t):new x([new b(`(`),C.join(t,new b(` and `)),new b(`)`)])}function O(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return t.length===1?new x(t):new x([new b(`(`),C.join(t,new b(` or `)),new b(`)`)])}var ce=(e,t)=>C`${e} > ${T(t,e)}`,k=(e,t)=>C`${e} >= ${T(t,e)}`,le=(e,t)=>C`${e} < ${T(t,e)}`,A=(e,t)=>C`${e} <= ${T(t,e)}`;function ue(e,t){return Array.isArray(t)?t.length===0?C`false`:C`${e} in ${t.map(t=>T(t,e))}`:C`${e} in ${T(t,e)}`}function de(e,t){return Array.isArray(t)?t.length===0?C`true`:C`${e} not in ${t.map(t=>T(t,e))}`:C`${e} not in ${T(t,e)}`}function fe(e){return C`${e} is null`}function pe(e){return C`${e} is not null`}function me(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContains requires at least one value`);return C`${e} @> ${C`${T(t,e)}`}`}return C`${e} @> ${T(t,e)}`}function he(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayContained requires at least one value`);return C`${e} <@ ${C`${T(t,e)}`}`}return C`${e} <@ ${T(t,e)}`}function ge(e,t){if(Array.isArray(t)){if(t.length===0)throw Error(`arrayOverlaps requires at least one value`);return C`${e} && ${C`${T(t,e)}`}`}return C`${e} && ${T(t,e)}`}function _e(e){return C`${e} asc`}function ve(e){return C`${e} desc`}function ye(e){return C`count(${e||C.raw(`*`)})`.mapWith(Number)}function be(e){return C`count(distinct ${e})`.mapWith(Number)}function xe(e){return C`sum(${e})`.mapWith(String)}function j(e){return C`max(${e})`.mapWith(n(e,r)?e:String)}function Se(e){return C`min(${e})`.mapWith(n(e,r)?e:String)}function Ce(e){return e&&e.length>0?C`PARTITION BY ${C.join(e,C`, `)}`:C``}function we(e){return e&&e.length>0?C`ORDER BY ${C.join(e.map(e=>e.direction===`desc`?C`${e.field} DESC`:C`${e.field} ASC`),C`, `)}`:C``}function Te(e){return e===`unbounded`?`UNBOUNDED PRECEDING`:typeof e==`number`?`${e} PRECEDING`:`CURRENT ROW`}function Ee(e){return e===`unbounded`?`UNBOUNDED FOLLOWING`:e===`current`?`CURRENT ROW`:typeof e==`number`?`${e} FOLLOWING`:`CURRENT ROW`}function De(e){if(!e)return C``;let t=e.type.toUpperCase(),n=Te(e.start),r=Ee(e.end);return C`${C.raw(t)} BETWEEN ${C.raw(n)} AND ${C.raw(r)}`}function Oe(e,t,n){let r=[];return e&&e.length>0&&r.push(Ce(e)),t&&t.length>0&&r.push(we(t)),n?.frame&&r.push(De(n.frame)),C`OVER (${r.length>0?C.join(r,C` `):C``})`}function ke(e,t,n,r){let i=r?.defaultValue===void 0?C``:C`, ${r.defaultValue}`;return C`${C.raw(e)}(${t}, ${r?.offset??1}${i}) ${n}`}var Ae={rank:`RANK`,denseRank:`DENSE_RANK`,rowNumber:`ROW_NUMBER`},je={firstValue:`FIRST_VALUE`,lastValue:`LAST_VALUE`,movingAvg:`AVG`,movingSum:`SUM`};function Me(e,t,n,r){if(e===`lag`||e===`lead`)return ke(e===`lag`?`LAG`:`LEAD`,t,n,r);if(e===`ntile`)return C`NTILE(${r?.nTile??4}) ${n}`;let i=Ae[e];if(i)return C`${C.raw(i)}() ${n}`;let a=je[e];if(a)return C`${C.raw(a)}(${t}) ${n}`;throw Error(`Unsupported window function: ${e}`)}var M=class{preprocessCalculatedTemplate(e){return e}nullToZero(e){return C`COALESCE(${e}, 0)`}caseInsensitiveLike(e,t,n){return n?C`${e} NOT ILIKE ${t}`:C`${e} ILIKE ${t}`}regexCondition(e,t,n){return n?C`${e} !~* ${t}`:C`${e} ~* ${t}`}buildStringCondition(e,t,n){switch(t){case`contains`:return this.caseInsensitiveLike(e,`%${n}%`,!1);case`notContains`:return this.caseInsensitiveLike(e,`%${n}%`,!0);case`startsWith`:return this.caseInsensitiveLike(e,`${n}%`,!1);case`endsWith`:return this.caseInsensitiveLike(e,`%${n}`,!1);case`like`:return C`${e} LIKE ${n}`;case`notLike`:return C`${e} NOT LIKE ${n}`;case`ilike`:return this.caseInsensitiveLike(e,n,!1);case`regex`:return this.regexCondition(e,n,!1);case`notRegex`:return this.regexCondition(e,n,!0);default:throw Error(`Unsupported string operator: ${t}`)}}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`${C.raw(r)}(CASE WHEN ${n} THEN 1 END)`:C`${C.raw(r)}(CASE WHEN ${n} THEN ${t} END)`}buildAvg(e){return this.nullToZero(C`AVG(${e})`)}buildCaseWhen(e,t){let n=e.map(e=>C`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>C`${e} ${t}`);return t===void 0?C`CASE ${n} END`:C`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?C`TRUE`:C`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}buildStddev(e,t=!1){let n=t?`STDDEV_SAMP`:`STDDEV_POP`;return this.nullToZero(C`${C.raw(n)}(${e})`)}buildVariance(e,t=!1){let n=t?`VAR_SAMP`:`VAR_POP`;return this.nullToZero(C`${C.raw(n)}(${e})`)}buildWindowFunction(e,t,n,r,i){return Me(e,t,Oe(n,r,i),i)}buildPattern(e,t){switch(e){case`contains`:case`notContains`:return`%${t}%`;case`startsWith`:return`${t}%`;case`endsWith`:return`%${t}`;default:return t}}parseISODuration(e){let t={years:0,months:0,days:0,hours:0,minutes:0,seconds:0},n=e.match(/^P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/);if(!n)throw Error(`Invalid ISO 8601 duration format: ${e}`);return t.years=parseInt(n[1]||`0`,10),t.months=parseInt(n[2]||`0`,10),t.days=parseInt(n[3]||`0`,10),t.hours=parseInt(n[4]||`0`,10),t.minutes=parseInt(n[5]||`0`,10),t.seconds=parseFloat(n[6]||`0`),t}durationToSeconds(e){let t=this.parseISODuration(e);return t.years*365*24*60*60+t.months*30*24*60*60+t.days*24*60*60+t.hours*60*60+t.minutes*60+t.seconds}},Ne=class extends M{getEngineType(){return`postgres`}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];t.years&&n.push(`${t.years} years`),t.months&&n.push(`${t.months} months`),t.days&&n.push(`${t.days} days`),t.hours&&n.push(`${t.hours} hours`),t.minutes&&n.push(`${t.minutes} minutes`),t.seconds&&n.push(`${t.seconds} seconds`);let r=n.join(` `)||`0 seconds`;return C`INTERVAL '${C.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return C`EXTRACT(EPOCH FROM (${e} - ${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`COUNT(*) FILTER (WHERE ${n})`:C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return C`(${t}::date - ${e}::date)`;case`week`:return C`FLOOR((${t}::date - ${e}::date) / 7)`;case`month`:return C`(EXTRACT(YEAR FROM AGE(${t}::timestamp, ${e}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${t}::timestamp, ${e}::timestamp)))::integer`;default:throw Error(`Unsupported date diff unit: ${n}`)}}buildPeriodSeriesSubquery(e){return C`(SELECT generate_series(0, ${e}) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return C`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return C`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return C`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return C`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return C`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return C`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}castToType(e,t){switch(t){case`timestamp`:return C`${e}::timestamp`;case`decimal`:return C`${e}::decimal`;case`integer`:return C`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!0}}buildPercentile(e,t){return C`PERCENTILE_CONT(${t/100}) WITHIN GROUP (ORDER BY ${e})`}},Pe=class extends M{getEngineType(){return`mysql`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`TIMESTAMPDIFF(SECOND, ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=C`DATE_ADD(${r}, INTERVAL ${n.years} YEAR)`),n.months&&(r=C`DATE_ADD(${r}, INTERVAL ${n.months} MONTH)`),n.days&&(r=C`DATE_ADD(${r}, INTERVAL ${n.days} DAY)`),n.hours&&(r=C`DATE_ADD(${r}, INTERVAL ${n.hours} HOUR)`),n.minutes&&(r=C`DATE_ADD(${r}, INTERVAL ${n.minutes} MINUTE)`),n.seconds&&(r=C`DATE_ADD(${r}, INTERVAL ${n.seconds} SECOND)`),r}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return C`TIMESTAMPDIFF(${C.raw(r)}, ${e}, ${t})`}buildPeriodSeriesSubquery(e){return C`(
|
|
2
|
+
WITH RECURSIVE periods(period_number) AS (
|
|
3
|
+
SELECT 0
|
|
4
|
+
UNION ALL
|
|
5
|
+
SELECT period_number + 1 FROM periods WHERE period_number < ${e}
|
|
6
|
+
)
|
|
7
|
+
SELECT period_number FROM periods
|
|
8
|
+
) p`}buildTimeDimension(e,t){let n={year:`%Y-01-01 00:00:00`,quarter:`%Y-%q-01 00:00:00`,month:`%Y-%m-01 00:00:00`,week:`%Y-%u-01 00:00:00`,day:`%Y-%m-%d 00:00:00`,hour:`%Y-%m-%d %H:00:00`,minute:`%Y-%m-%d %H:%i:00`,second:`%Y-%m-%d %H:%i:%s`};switch(e){case`quarter`:return C`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;case`week`:return C`STR_TO_DATE(DATE_FORMAT(DATE_SUB(${t}, INTERVAL WEEKDAY(${t}) DAY), '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s')`;default:{let r=n[e];return r?C`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')`:t}}}caseInsensitiveLike(e,t,n){let r=t.toLowerCase();return n?C`LOWER(${e}) NOT LIKE ${r}`:C`LOWER(${e}) LIKE ${r}`}regexCondition(e,t,n){return n?C`${e} NOT REGEXP ${t}`:C`${e} REGEXP ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`CAST(${e} AS DATETIME)`;case`decimal`:return C`CAST(${e} AS DECIMAL(10,2))`;case`integer`:return C`CAST(${e} AS SIGNED INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}nullToZero(e){return C`IFNULL(${e}, 0)`}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!0,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!0}}buildPercentile(e,t){return null}},Fe=class extends M{getEngineType(){return`sqlite`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`(${e} - ${t})`}buildDateAddInterval(e,t){return C`(${e} + ${this.durationToSeconds(t)})`}buildDateDiffPeriods(e,t,n){switch(n){case`day`:return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;case`week`:return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;case`month`:return C`((CAST(strftime('%Y', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%Y', datetime(${e}, 'unixepoch')) AS INTEGER)) * 12 + (CAST(strftime('%m', datetime(${t}, 'unixepoch')) AS INTEGER) - CAST(strftime('%m', datetime(${e}, 'unixepoch')) AS INTEGER)))`;default:throw Error(`Unsupported date diff unit for SQLite: ${n}`)}}buildPeriodSeriesSubquery(e){return C`(
|
|
9
|
+
WITH RECURSIVE periods(period_number) AS (
|
|
10
|
+
SELECT 0
|
|
11
|
+
UNION ALL
|
|
12
|
+
SELECT period_number + 1 FROM periods WHERE period_number < ${e}
|
|
13
|
+
)
|
|
14
|
+
SELECT period_number FROM periods
|
|
15
|
+
) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`datetime(${t}, 'unixepoch', 'start of year')`;case`quarter`:{let e=C`datetime(${t}, 'unixepoch')`;return C`datetime(${e}, 'start of year',
|
|
16
|
+
'+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`}case`month`:return C`datetime(${t}, 'unixepoch', 'start of month')`;case`week`:return C`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;case`day`:return C`datetime(${t}, 'unixepoch', 'start of day')`;case`hour`:return C`datetime(strftime('%Y-%m-%d %H:00:00', ${C`datetime(${t}, 'unixepoch')`}))`;case`minute`:return C`datetime(strftime('%Y-%m-%d %H:%M:00', ${C`datetime(${t}, 'unixepoch')`}))`;case`second`:return C`datetime(strftime('%Y-%m-%d %H:%M:%S', ${C`datetime(${t}, 'unixepoch')`}))`;default:return C`datetime(${t}, 'unixepoch')`}}caseInsensitiveLike(e,t,n){let r=t.toLowerCase();return n?C`LOWER(${e}) NOT LIKE ${r}`:C`LOWER(${e}) LIKE ${r}`}regexCondition(e,t,n){return n?C`${e} NOT GLOB ${t}`:C`${e} GLOB ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`datetime(${e} / 1000, 'unixepoch')`;case`decimal`:return C`CAST(${e} AS REAL)`;case`integer`:return C`CAST(${e} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${t}`)}}nullToZero(e){return C`IFNULL(${e}, 0)`}buildCaseWhen(e,t){let n=e.map(e=>e.then&&typeof e.then==`object`&&(e.then.queryChunks||e.then._||e.then.sql)?C`WHEN ${e.when} THEN ${C.raw(`(`)}${e.then}${C.raw(`)`)}`:C`WHEN ${e.when} THEN ${e.then}`).reduce((e,t)=>C`${e} ${t}`);return t===void 0?C`CASE ${n} END`:t&&typeof t==`object`&&(t.queryChunks||t._||t.sql)?C`CASE ${n} ELSE ${C.raw(`(`)}${t}${C.raw(`)`)} END`:C`CASE ${n} ELSE ${t} END`}buildBooleanLiteral(e){return e?C`1`:C`0`}preprocessCalculatedTemplate(e){return e.length>1e3?e:e.replace(/(\{[^}]+\})\s*\/\s*/g,(e,t)=>`${t.replace(/\{([^}]+)\}/,`CAST({$1} AS REAL)`)} / `)}convertFilterValue(e){return typeof e==`boolean`?+!!e:e instanceof Date?e.getTime():Array.isArray(e)?e.map(e=>this.convertFilterValue(e)):e}prepareDateValue(e){if(!(e instanceof Date)){if(typeof e==`number`)return e;if(typeof e==`string`)return new Date(e).getTime();throw Error(`prepareDateValue expects a Date object, got ${typeof e}`)}return e.getTime()}isTimestampInteger(){return!0}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){return null}buildVariance(e,t=!1){return null}buildPercentile(e,t){return null}},Ie=class extends Pe{getEngineType(){return`singlestore`}},Le=class extends M{getEngineType(){return`duckdb`}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];t.years&&n.push(`${t.years} years`),t.months&&n.push(`${t.months} months`),t.days&&n.push(`${t.days} days`),t.hours&&n.push(`${t.hours} hours`),t.minutes&&n.push(`${t.minutes} minutes`),t.seconds&&n.push(`${t.seconds} seconds`);let r=n.join(` `)||`0 seconds`;return C`INTERVAL '${C.raw(r)}'`}buildTimeDifferenceSeconds(e,t){return C`(EPOCH(${e}) - EPOCH(${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildConditionalAggregation(e,t,n){let r=e.toUpperCase();return e===`count`&&!t?C`COUNT(*) FILTER (WHERE ${n})`:C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`}buildDateDiffPeriods(e,t,n){return C`DATE_DIFF('${C.raw(n)}', ${e}::timestamp, ${t}::timestamp)`}buildPeriodSeriesSubquery(e){return C`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('year', ${t}::timestamp)`;case`quarter`:return C`DATE_TRUNC('quarter', ${t}::timestamp)`;case`month`:return C`DATE_TRUNC('month', ${t}::timestamp)`;case`week`:return C`DATE_TRUNC('week', ${t}::timestamp)`;case`day`:return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;case`hour`:return C`DATE_TRUNC('hour', ${t}::timestamp)`;case`minute`:return C`DATE_TRUNC('minute', ${t}::timestamp)`;case`second`:return C`DATE_TRUNC('second', ${t}::timestamp)`;default:return t}}regexCondition(e,t,n){return n?C`NOT regexp_matches(${e}, ${t})`:C`regexp_matches(${e}, ${t})`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::timestamp`;case`decimal`:return C`${e}::decimal`;case`integer`:return C`${e}::integer`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildPercentile(e,t){return C`QUANTILE_CONT(${e}, ${t/100})`}},Re=class extends M{getEngineType(){return`databend`}buildIntervalFromISO(e){let t=this.parseISODuration(e),n=[];if(t.years&&n.push(`${t.years} YEAR`),t.months&&n.push(`${t.months} MONTH`),t.days&&n.push(`${t.days} DAY`),t.hours&&n.push(`${t.hours} HOUR`),t.minutes&&n.push(`${t.minutes} MINUTE`),t.seconds&&n.push(`${t.seconds} SECOND`),n.length===0)return C`INTERVAL 0 SECOND`;if(n.length===1)return C`INTERVAL ${C.raw(n[0])}`;let r=n.map(e=>`INTERVAL ${e}`);return C`(${C.raw(r.join(` + `))})`}buildTimeDifferenceSeconds(e,t){return C`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`}buildDateAddInterval(e,t){return C`(${e} + ${this.buildIntervalFromISO(t)})`}buildDateDiffPeriods(e,t,n){return C`DATE_DIFF('${C.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return C`(SELECT number as period_number FROM numbers(${e+1})) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;case`quarter`:return C`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;case`month`:return C`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;case`week`:return C`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;case`day`:return C`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return C`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;case`minute`:return C`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;case`second`:return C`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;default:return t}}caseInsensitiveLike(e,t,n){return n?C`LOWER(${e}) NOT LIKE LOWER(${t})`:C`LOWER(${e}) LIKE LOWER(${t})`}regexCondition(e,t,n){return n?C`NOT (${e} REGEXP ${t})`:C`${e} REGEXP ${t}`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::TIMESTAMP`;case`decimal`:return C`${e}::DECIMAL`;case`integer`:return C`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildVariance(e,t=!1){let n=t?`COVAR_SAMP`:`COVAR_POP`;return C`COALESCE(${C.raw(n)}(${e}, ${e}), 0)`}buildPercentile(e,t){throw Error(`Percentile functions are not yet supported for Databend`)}},ze=class extends M{getEngineType(){return`snowflake`}buildIntervalFromISO(e){return C`${this.durationToSeconds(e)}`}buildTimeDifferenceSeconds(e,t){return C`DATEDIFF('SECOND', ${t}, ${e})`}buildDateAddInterval(e,t){let n=this.parseISODuration(t),r=e;return n.years&&(r=C`DATEADD('YEAR', ${n.years}, ${r})`),n.months&&(r=C`DATEADD('MONTH', ${n.months}, ${r})`),n.days&&(r=C`DATEADD('DAY', ${n.days}, ${r})`),n.hours&&(r=C`DATEADD('HOUR', ${n.hours}, ${r})`),n.minutes&&(r=C`DATEADD('MINUTE', ${n.minutes}, ${r})`),n.seconds&&(r=C`DATEADD('SECOND', ${n.seconds}, ${r})`),r}buildDateDiffPeriods(e,t,n){let r=n.toUpperCase();return C`DATEDIFF('${C.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`}buildPeriodSeriesSubquery(e){return C`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e+1}))) p`}buildTimeDimension(e,t){switch(e){case`year`:return C`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;case`quarter`:return C`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;case`month`:return C`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;case`week`:return C`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;case`day`:return C`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;case`hour`:return C`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;case`minute`:return C`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;case`second`:return C`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;default:return t}}regexCondition(e,t,n){return n?C`NOT REGEXP_LIKE(${e}, ${t})`:C`REGEXP_LIKE(${e}, ${t})`}castToType(e,t){switch(t){case`timestamp`:return C`${e}::TIMESTAMP`;case`decimal`:return C`${e}::DECIMAL`;case`integer`:return C`${e}::INTEGER`;default:throw Error(`Unsupported cast type: ${t}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!1}}buildPercentile(e,t){let n=(t/100).toString();return C`PERCENTILE_CONT(${C.raw(n)}) WITHIN GROUP (ORDER BY ${e})`}};function Be(e){switch(e){case`postgres`:return new Ne;case`mysql`:return new Pe;case`sqlite`:return new Fe;case`singlestore`:return new Ie;case`duckdb`:return new Le;case`databend`:return new Re;case`snowflake`:return new ze;default:throw Error(`Unsupported database engine: ${e}`)}}var N=class{db;schema;databaseAdapter;constructor(e,t,n){this.db=e,this.schema=t;let r=n||this.getEngineType();this.databaseAdapter=Be(r)}};function P(e,t,n,r){for(;e.length>0&&e[e.length-1].indent>=r;)e.pop();if(e.length===0)t.push(n);else{let t=e[e.length-1].op;t.children||=[],t.children.push(n)}e.push({indent:r,op:n})}function Ve(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function He(e,t){let n=e.match(/Planning Time:\s*([\d.]+)\s*ms/i);if(n){t.planningTime=parseFloat(n[1]);return}let r=e.match(/Execution Time:\s*([\d.]+)\s*ms/i);if(r){t.executionTime=parseFloat(r[1]);return}let i=We(e);if(!i)return;i.type.includes(`Seq Scan`)&&(t.hasSequentialScans=!0),i.index&&t.usedIndexes.push(i.index),t.operations.length===0&&i.estimatedCost!==void 0&&(t.totalCost=i.estimatedCost);let a=e.search(/\S/);P(t.stack,t.operations,i,a)}function Ue(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,planningTime:void 0,executionTime:void 0,totalCost:void 0,stack:[]};for(let t of e)He(t,n);let r={database:`postgres`,planningTime:n.planningTime,executionTime:n.executionTime,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
|
|
17
|
+
`),sql:t}}function We(e){let t=e.replace(/^[\s->]+/,``).trim();if(!t)return null;let n=t.match(/^([A-Za-z][A-Za-z0-9 ]+?)(?:\s+using\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\w+)?(?:\s+\(cost=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)(?:\s+width=\d+)?\))?(?:\s+\(actual time=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)\s+loops=(\d+)\))?/i);if(!n)return t.match(/^Filter:\s*(.+)$/i)||t.match(/^(Hash Cond|Join Filter|Index Cond):\s*(.+)$/i),null;let r=n[1].trim(),i=n[2]||void 0,a=n[3]||void 0,o=n[5]?parseFloat(n[5]):void 0,s=n[6]?parseInt(n[6],10):void 0,c=n[9]?parseInt(n[9],10):void 0,l={type:r,table:a,index:i,estimatedRows:s,estimatedCost:o};c!==void 0&&(l.actualRows=c);let u=e.match(/Filter:\s*(.+?)(?:\)|$)/i);return u&&(l.filter=u[1].trim()),l}function F(e,t,n){let r=[];if(n===`question`){let n=e.split(`?`);r.push(C.raw(n[0]));for(let e=1;e<n.length;e++)r.push(C`${t[e-1]}`),r.push(C.raw(n[e]))}else{let n=/\$(\d+)/g,i=0,a;for(;(a=n.exec(e))!==null;){r.push(C.raw(e.slice(i,a.index)));let n=parseInt(a[1],10)-1;r.push(C`${t[n]}`),i=a.index+a[0].length}r.push(C.raw(e.slice(i)))}return C.join(r)}function Ge(e){return e&&typeof e==`object`?e:null}function Ke(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ge(n);e&&t.push({id:e.id||1,select_type:e.select_type||`SIMPLE`,table:e.table||null,partitions:e.partitions||null,type:e.type||`ALL`,possible_keys:e.possible_keys||null,key:e.key||null,key_len:e.key_len||null,ref:e.ref||null,rows:Number(e.rows)||0,filtered:Number(e.filtered)||100,Extra:e.Extra||null})}return t}function qe(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Ge(n);e&&t.push({id:Number(e.id)||0,parent:Number(e.parent)||0,notused:Number(e.notused)||0,detail:String(e.detail||``)})}return t}function Je(e){let t=[];for(let n of e){let e=Ge(n);if(!e)continue;let r=e[`QUERY PLAN`]||e[`query plan`]||e.queryplan;typeof r==`string`&&t.push(r)}return t}function Ye(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`rows`in e&&Array.isArray(e.rows)?e.rows:[]}function Xe(e){return/^-?\d+(\.\d+)?$/.test(e)?e.includes(`.`)?parseFloat(e):parseInt(e,10):!isNaN(parseFloat(e))&&isFinite(parseFloat(e))?parseFloat(e):e}function Ze(e){switch(typeof e){case`number`:return e;case`bigint`:return Number(e);case`object`:return Qe(e);case`string`:return Xe(e);default:return e}}function Qe(e){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e.constructor?.name===`Numeric`||e.constructor?.name===`Decimal`||`digits`in e||`sign`in e?parseFloat(e.toString()):e}var $e=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);let n=await this.db.execute(e),r=Ye(n);return r.length>0?r.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){return e==null?e:Ze(e)}getEngineType(){return`postgres`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);return Ue(Je(Ye(await this.db.execute(C`${C.raw(r)} ${F(e,t,`dollar`)}`))),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=Ye(await this.db.execute(C`
|
|
18
|
+
SELECT
|
|
19
|
+
t.relname as table_name,
|
|
20
|
+
i.relname as index_name,
|
|
21
|
+
array_to_string(array_agg(a.attname ORDER BY k.n), ',') as columns,
|
|
22
|
+
ix.indisunique as is_unique,
|
|
23
|
+
ix.indisprimary as is_primary
|
|
24
|
+
FROM pg_index ix
|
|
25
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
26
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
27
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
28
|
+
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
29
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
30
|
+
WHERE n.nspname = 'public'
|
|
31
|
+
AND t.relname IN (${C.raw(t)})
|
|
32
|
+
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
33
|
+
ORDER BY t.relname, i.relname
|
|
34
|
+
`));return n.length===0?[]:n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:e.is_unique,is_primary:e.is_primary}))}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function et(e,t){return new $e(e,t,`postgres`)}function tt(e,t){let n=t?.toLowerCase()||``;switch(e.toLowerCase()){case`all`:return`Seq Scan`;case`index`:return n.includes(`using index`)?`Index Only Scan`:`Index Scan`;case`range`:return`Index Range Scan`;case`ref`:case`eq_ref`:return`Index Lookup`;case`const`:case`system`:return`Const Lookup`;case`null`:return`No Table`;default:return`MySQL ${e}`}}function nt(e,t){let n=[],r=[],i=!1,a=0;for(let t of e){let e=tt(t.type,t.Extra);t.type.toLowerCase()===`all`&&(i=!0),t.key&&r.push(t.key);let o={type:e,table:t.table||void 0,index:t.key||void 0,estimatedRows:t.rows,estimatedCost:t.rows};if(t.Extra){let e=[];t.Extra.includes(`Using where`)&&e.push(`WHERE filter applied`),t.Extra.includes(`Using filesort`)&&e.push(`Filesort required`),t.Extra.includes(`Using temporary`)&&e.push(`Temporary table required`),t.Extra.includes(`Using join buffer`)&&e.push(`Join buffer used`),e.length>0&&(o.details=e.join(`; `)),o.filter=t.Extra}n.push(o),a+=t.rows}return{operations:n,summary:{database:`mysql`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id select_type table type possible_keys key rows Extra`,...e.map(e=>`${e.id}\t${e.select_type}\t${e.table||`NULL`}\t${e.type}\t${e.possible_keys||`NULL`}\t${e.key||`NULL`}\t${e.rows}\t${e.Extra||``}`)].join(`
|
|
35
|
+
`),sql:t}}var rt=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`mysql`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);return nt(Ke(await this.db.execute(C`${C.raw(r)} ${F(e,t,`question`)}`)),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(C`
|
|
36
|
+
SELECT
|
|
37
|
+
TABLE_NAME as table_name,
|
|
38
|
+
INDEX_NAME as index_name,
|
|
39
|
+
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
|
|
40
|
+
CASE WHEN NON_UNIQUE = 0 THEN TRUE ELSE FALSE END as is_unique,
|
|
41
|
+
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
42
|
+
FROM INFORMATION_SCHEMA.STATISTICS
|
|
43
|
+
WHERE TABLE_SCHEMA = DATABASE()
|
|
44
|
+
AND LOWER(TABLE_NAME) IN (${C.raw(t)})
|
|
45
|
+
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
46
|
+
ORDER BY TABLE_NAME, INDEX_NAME
|
|
47
|
+
`);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function it(e,t){return new rt(e,t,`mysql`)}function at(e){let t=e.toLowerCase(),n=e.match(/^SCAN\s+(\S+)/i);if(n)return{type:`Seq Scan`,table:n[1]};let r=e.match(/^SEARCH\s+(\S+)\s+USING\s+(?:COVERING\s+)?INDEX\s+(\S+)(?:\s+\((.+)\))?/i);if(r)return{type:`Index Scan`,table:r[1],index:r[2],filter:r[3]};let i=e.match(/^SEARCH\s+(\S+)\s+USING\s+INTEGER\s+PRIMARY\s+KEY\s+\((.+)\)/i);if(i)return{type:`Primary Key Lookup`,table:i[1],filter:i[2]};let a=e.match(/^SEARCH\s+(\S+)/i);return a?{type:`Search`,table:a[1]}:t.includes(`temp b-tree`)?t.includes(`order by`)?{type:`Sort`}:t.includes(`group by`)?{type:`Group`}:t.includes(`distinct`)?{type:`Distinct`}:{type:`Temp B-Tree`}:t.includes(`compound`)?{type:`Compound Query`}:t.includes(`subquery`)?{type:`Subquery`}:t.includes(`co-routine`)?{type:`Coroutine`}:{type:e}}function ot(e,t){let n=[],r=[],i=!1,a=new Map;for(let t of e){let e=at(t.detail);e.type===`Seq Scan`&&(i=!0),e.index&&r.push(e.index);let o={type:e.type,table:e.table,index:e.index,filter:e.filter,details:t.detail};if(a.set(t.id,o),t.parent===0)n.push(o);else{let e=a.get(t.parent);e?(e.children||=[],e.children.push(o)):n.push(o)}}return{operations:n,summary:{database:`sqlite`,planningTime:void 0,executionTime:void 0,totalCost:void 0,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id parent detail`,...e.map(e=>`${e.id}\t${e.parent}\t${e.detail}`)].join(`
|
|
48
|
+
`),sql:t}}var st=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}try{if(this.db.all){let n=this.db.all(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}else if(this.db.run)return this.db.run(e);else throw Error(`SQLite database instance must have an all() or run() method`)}catch(e){throw Error(`SQLite execution failed: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`sqlite`}async explainQuery(e,t,n){let r;if(this.db.all)r=this.db.all(C`EXPLAIN QUERY PLAN ${F(e,t,`question`)}`);else throw Error(`SQLite database instance must have an all() method for EXPLAIN`);return ot(qe(r),{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.all)throw Error(`SQLite database instance must have an all() method`);try{let t=[];for(let n of e){let e=this.db.all(C.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));if(Array.isArray(e))for(let r of e){let e=r.name,i=!!r.unique,a=r.origin,o=this.db.all(C.raw(`SELECT name FROM pragma_index_info('${e}') ORDER BY seqno`)),s=[];if(Array.isArray(o))for(let e of o){let t=e.name;typeof t==`string`&&s.push(t)}t.push({table_name:n.toLowerCase(),index_name:e,columns:s,is_unique:i,is_primary:a===`pk`})}}return t}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function ct(e,t){return new st(e,t,`sqlite`)}var lt=class extends rt{getEngineType(){return`singlestore`}};function ut(e,t){return new lt(e,t)}function dt(e,t){if(/^[┌├└│─┐┤┘]+$/.test(e.trim())||/EXPLANATION|QUERY PLAN/i.test(e))return;let n=pt(e);if(!n)return;(n.type.includes(`SEQ_SCAN`)||n.type.includes(`TABLE_SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`INDEX_SCAN`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=Ve(e);P(t.stack,t.operations,n,r)}function ft(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)dt(t,n);let r={database:`duckdb`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
|
|
49
|
+
`),sql:t}}function pt(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i))return null;let n=t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);if(!n){let e=t.match(/^FILTER\s+(.+)$/i);return e?{type:`FILTER`,filter:e[1]}:null}let r=n[1].toUpperCase(),i=n[2]||void 0,a=n[3]||void 0,o=n[4]?parseFloat(n[4]):void 0,s=n[5]?parseInt(n[5],10):void 0;if(r===`INDEX_SCAN`){let e=i,t=a;a=e,i=t}return{type:r,table:i,index:a,estimatedRows:s,estimatedCost:o}}var mt=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`duckdb`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);let i=await this.db.execute(C`${C.raw(r)} ${F(e,t,`dollar`)}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain_value||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return ft(a,{sql:e,params:t})}async getTableIndexes(e){if(!e||e.length===0)return[];if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let t=e.map(e=>`'${e.toLowerCase()}'`).join(`,`),n=await this.db.execute(C`
|
|
50
|
+
SELECT
|
|
51
|
+
table_name,
|
|
52
|
+
index_name,
|
|
53
|
+
LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY index_oid) as columns,
|
|
54
|
+
is_unique,
|
|
55
|
+
is_primary
|
|
56
|
+
FROM duckdb_indexes()
|
|
57
|
+
WHERE LOWER(table_name) IN (${C.raw(t)})
|
|
58
|
+
GROUP BY table_name, index_name, is_unique, is_primary
|
|
59
|
+
ORDER BY table_name, index_name
|
|
60
|
+
`);return Array.isArray(n)?n.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:typeof e.columns==`string`?e.columns.split(`,`):[],is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function ht(e,t){return new mt(e,t,`duckdb`)}function gt(e,t){if(!e.trim())return;let n=vt(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`IndexScan`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=Ve(e);P(t.stack,t.operations,n,r)}function _t(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)gt(t,n);let r={database:`databend`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
|
|
61
|
+
`),sql:t}}function vt(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||/^(filters|table|estimated rows|output columns|push downs):/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var yt=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`databend`}async explainQuery(e,t,n){let r=n?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);let i=await this.db.execute(C`${C.raw(r)} ${F(e,t,`dollar`)}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.explain||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return _t(a,{sql:e,params:t})}async getTableIndexes(e){return!e||e.length,[]}};function bt(e,t){return new yt(e,t,`databend`)}function xt(e,t){if(!e.trim())return;let n=wt(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=Ct(e);P(t.stack,t.operations,n,r)}function St(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)xt(t,n);let r={database:`snowflake`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
|
|
62
|
+
`),sql:t}}function Ct(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function wt(e){let t=e.replace(/^[\s\d:]*->/,``).trim();if(!t||/^(GlobalStats|partitions|bytes):/i.test(t)||/^\w+=\d+/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Tt=class extends N{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))t&&t.includes(r)?n[r]=this.coerceToNumber(i):n[r]=i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`snowflake`}async explainQuery(e,t,n){if(n?.analyze,!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);let r=await this.db.execute(C`${C.raw(`EXPLAIN`)} ${F(e,t,`question`)}`),i=[];if(Array.isArray(r)){for(let e of r)if(e&&typeof e==`object`){let t=e.content||e[`QUERY PLAN`]||e.plan||Object.values(e)[0];typeof t==`string`&&i.push(t)}}return St(i,{sql:e,params:t})}async getTableIndexes(e){return[]}};function Et(e,t){return new Tt(e,t,`snowflake`)}function Dt(e,t,n){if(n)switch(n){case`postgres`:return et(e,t);case`mysql`:return it(e,t);case`sqlite`:return ct(e,t);case`singlestore`:return ut(e,t);case`duckdb`:return ht(e,t);case`databend`:return bt(e,t);case`snowflake`:return Et(e,t)}if(e.all&&e.run)return ct(e,t);if(e.execute)return et(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function I(e,t){return typeof e==`string`?t?t.get(e)||(console.warn(`[drizzle-cube] Cannot resolve cube reference '${e}': no cube with that name is registered. Registered cubes: ${Array.from(t.keys()).join(`, `)||`(none)`}. Join will be skipped.`),null):(console.warn(`[drizzle-cube] Cannot resolve string cube reference '${e}': no cube registry provided. Join will be skipped.`),null):typeof e==`function`?e():e}function Ot(e){switch(e){case`belongsTo`:return`hasMany`;case`hasMany`:return`belongsTo`;case`hasOne`:return`hasOne`;case`belongsToMany`:return`belongsToMany`;default:return e}}function L(e,t){if(t)return t;switch(e){case`belongsTo`:return`inner`;case`hasOne`:return`left`;case`hasMany`:return`left`;case`belongsToMany`:return`left`;default:return`left`}}function R(e){return e&&typeof e==`object`?C`${C`${e}`}`:e}function kt(e){if(e===`__proto__`||e===`constructor`||e===`prototype`)throw Error(`Unsafe property key: ${e}`);return e}function z(e,t){return R(typeof e==`function`?e(t):e)}function B(e,t){return e.type===`time`?z(e.sql,t):typeof e.sql==`function`?e.sql(t):e.sql}function At(e){let t=[];for(let n of e.on){let e=R(n.source),r=R(n.target),i=n.as||E;t.push(i(e,r))}return D(...t)}function jt(e){if(e.relationship!==`belongsToMany`||!e.through)throw Error(`expandBelongsToManyJoin can only be called on belongsToMany relationships with through configuration`);let{table:t,sourceKey:n,targetKey:r}=e.through,i=[];for(let e of n){let t=e.as||E;i.push(t(e.source,e.target))}let a=[];for(let e of r){let t=e.as||E;a.push(t(e.source,e.target))}let o=L(`belongsToMany`,e.sqlJoinType);return{junctionJoins:[{joinType:o,table:t,condition:D(...i)},{joinType:o,table:t,condition:D(...a)}]}}function V(e){if(`and`in e)return`and:[${e.and.map(V).sort().join(`,`)}]`;if(`or`in e)return`or:[${e.or.map(V).sort().join(`,`)}]`;let t=e,n=JSON.stringify(Array.isArray(t.values)?[...t.values].sort():t.values),r=t.dateRange?`:dr:${JSON.stringify(t.dateRange)}`:``;return`${t.member}:${t.operator}:${n}${r}`}function Mt(e,t){return`timeDim:${e}:${JSON.stringify(t)}`}var H=class{cache=new Map;stats={hits:0,misses:0};getOrBuild(e,t){let n=this.cache.get(e);if(n!==void 0)return this.stats.hits++,n;let r=t();return r&&this.cache.set(e,r),this.stats.misses++,r}has(e){return this.cache.has(e)}get(e){let t=this.cache.get(e);return t!==void 0&&this.stats.hits++,t}preload(e){for(let{key:t,sql:n}of e)this.cache.has(t)||this.cache.set(t,n)}set(e,t){this.cache.set(e,t)}getStats(){return{...this.stats,cacheSize:this.cache.size}}clear(){this.cache.clear(),this.stats={hits:0,misses:0}}};function Nt(e){let t=[];for(let n of e)`and`in n&&n.and?t.push(...Nt(n.and)):`or`in n&&n.or?t.push(...Nt(n.or)):`member`in n&&t.push(n);return t}function Pt(e,t){return e.isTimestampInteger()?e.getEngineType()===`sqlite`?Math.floor(t/1e3):t:new Date(t).toISOString()}function U(e,t){return Pt(e,t.getTime())}function Ft(e,t){return typeof t==`number`?new Date(t*(e.getEngineType()===`sqlite`?1e3:1)):new Date(t)}function It(e){return typeof e==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(e.trim())}function Lt(e){if(e instanceof Date)return isNaN(e.getTime())?null:e;if(typeof e==`number`){let t=e<1e10?e*1e3:e,n=new Date(t);return isNaN(n.getTime())?null:n}if(typeof e==`string`){let t=It(e)?new Date(e+`T00:00:00Z`):new Date(e);return isNaN(t.getTime())?null:t}let t=new Date(e);return isNaN(t.getTime())?null:t}function Rt(e,t){if(!t)return null;let n=Lt(t);return n?U(e,n):null}var zt=e=>{let t=new Date(e);return t.setUTCHours(0,0,0,0),t},W=e=>{let t=new Date(e);return t.setUTCHours(23,59,59,999),t},Bt={today:({now:e})=>({start:zt(e),end:W(e)}),yesterday:({now:e,utcDate:t})=>{let n=new Date(e);n.setUTCDate(t-1),n.setUTCHours(0,0,0,0);let r=new Date(e);return r.setUTCDate(t-1),r.setUTCHours(23,59,59,999),{start:n,end:r}},"this week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-6:1-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"this month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t,1,0,0,0,0)),end:new Date(Date.UTC(e,t+1,0,23,59,59,999))}),"this quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3);return{start:new Date(Date.UTC(e,n*3,1,0,0,0,0)),end:new Date(Date.UTC(e,n*3+3,0,23,59,59,999))}},"this year":({utcYear:e})=>({start:new Date(Date.UTC(e,0,1,0,0,0,0)),end:new Date(Date.UTC(e,11,31,23,59,59,999))}),"last week":({now:e,utcDate:t,utcDay:n})=>{let r=n===0?-13:-6-n,i=new Date(e);i.setUTCDate(t+r),i.setUTCHours(0,0,0,0);let a=new Date(i);return a.setUTCDate(i.getUTCDate()+6),a.setUTCHours(23,59,59,999),{start:i,end:a}},"last month":({utcYear:e,utcMonth:t})=>({start:new Date(Date.UTC(e,t-1,1,0,0,0,0)),end:new Date(Date.UTC(e,t,0,23,59,59,999))}),"last quarter":({utcYear:e,utcMonth:t})=>{let n=Math.floor(t/3),r=n===0?3:n-1,i=n===0?e-1:e;return{start:new Date(Date.UTC(i,r*3,1,0,0,0,0)),end:new Date(Date.UTC(i,r*3+3,0,23,59,59,999))}},"last year":({utcYear:e})=>({start:new Date(Date.UTC(e-1,0,1,0,0,0,0)),end:new Date(Date.UTC(e-1,11,31,23,59,59,999))}),"last 12 months":({now:e,utcYear:t,utcMonth:n})=>({start:new Date(Date.UTC(t,n-11,1,0,0,0,0)),end:W(e)})},Vt=[{re:/^last\s+(\d+)\s+days?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e+1),r.setUTCHours(0,0,0,0),{start:r,end:W(t)}}},{re:/^last\s+(\d+)\s+weeks?$/,build:(e,{now:t,utcDate:n})=>{let r=new Date(t);return r.setUTCDate(n-e*7+1),r.setUTCHours(0,0,0,0),{start:r,end:W(t)}}},{re:/^last\s+(\d+)\s+months?$/,build:(e,{now:t,utcYear:n,utcMonth:r})=>({start:new Date(Date.UTC(n,r-e+1,1,0,0,0,0)),end:W(t)})},{re:/^last\s+(\d+)\s+years?$/,build:(e,{now:t,utcYear:n})=>({start:new Date(Date.UTC(n-e,0,1,0,0,0,0)),end:W(t)})}];function Ht(e){let t=new Date,n=e.toLowerCase().trim(),r={now:t,utcYear:t.getUTCFullYear(),utcMonth:t.getUTCMonth(),utcDate:t.getUTCDate(),utcDay:t.getUTCDay()},i=Bt[n];if(i)return i(r);for(let{re:e,build:t}of Vt){let i=n.match(e);if(i)return t(parseInt(i[1],10),r)}return null}var G=class{databaseAdapter;constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(e,t,n){let r=z(e,n);return t?this.databaseAdapter.buildTimeDimension(t,r):r instanceof x?r:C`${r}`}buildDateRangeCondition(e,t){return t?Array.isArray(t)?this.buildArrayDateRangeCondition(e,t):typeof t==`string`?this.buildStringDateRangeCondition(e,t):null:null}rangeBetween(e,t,n){return D(k(e,t),A(e,n))}endOfDayValue(e){let t=Ft(this.databaseAdapter,e);return t.setUTCHours(23,59,59,999),U(this.databaseAdapter,t)}buildArrayDateRangeCondition(e,t){if(t.length<2)return null;let n=this.normalizeDate(t[0]),r=this.normalizeDate(t[1]);return!n||!r?null:(It(t[1])&&(r=this.endOfDayValue(r)),this.rangeBetween(e,n,r))}buildStringDateRangeCondition(e,t){let n=this.parseRelativeDateRange(t);if(n){let t=U(this.databaseAdapter,n.start),r=U(this.databaseAdapter,n.end);return this.rangeBetween(e,t,r)}let r=this.normalizeDate(t);if(!r)return null;let i=Ft(this.databaseAdapter,r),a=new Date(i);a.setUTCHours(0,0,0,0);let o=new Date(i);return o.setUTCHours(23,59,59,999),this.rangeBetween(e,U(this.databaseAdapter,a),U(this.databaseAdapter,o))}parseRelativeDateRange(e){return Ht(e)}normalizeDate(e){return Rt(this.databaseAdapter,e)}},Ut=e=>{let{fieldExpr:t,filteredValues:n,value:r,field:i,databaseAdapter:a,dateTimeBuilder:o}=e;return n.length>1?i?.type===`time`?ue(t,n.map(e=>o.normalizeDate(e)||e)):ue(t,n):n.length===1?E(t,i?.type===`time`&&o.normalizeDate(r)||r):a.buildBooleanLiteral(!1)},Wt=e=>{let{fieldExpr:t,filteredValues:n,value:r}=e;return n.length>1?de(t,n):n.length===1?se(t,r):null},K=e=>({fieldExpr:t,value:n,databaseAdapter:r})=>r.buildStringCondition(t,e,n),Gt=({fieldExpr:e,value:t})=>ce(e,t),Kt=({fieldExpr:e,value:t})=>k(e,t),qt=({fieldExpr:e,value:t})=>le(e,t),Jt=({fieldExpr:e,value:t})=>A(e,t),Yt=({fieldExpr:e})=>pe(e),Xt=({fieldExpr:e})=>fe(e),Zt=e=>{let{fieldExpr:t,values:n,filteredValues:r,databaseAdapter:i,dateTimeBuilder:a}=e;if(r.length<2)return null;let o=a.normalizeDate(r[0]),s=a.normalizeDate(r[1]);if(!o||!s)return null;let c=n[1];if(typeof c==`string`&&/^\d{4}-\d{2}-\d{2}$/.test(c.trim())){let e=typeof s==`number`?new Date(s*(i.getEngineType()===`sqlite`?1e3:1)):new Date(s),t=new Date(e);t.setUTCHours(23,59,59,999),s=i.isTimestampInteger()?i.getEngineType()===`sqlite`?Math.floor(t.getTime()/1e3):t.getTime():t.toISOString()}return D(k(t,o),A(t,s))},Qt=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?le(e,r):null},$t=({fieldExpr:e,value:t,dateTimeBuilder:n})=>{let r=n.normalizeDate(t);return r?ce(e,r):null},en=({fieldExpr:e,filteredValues:t})=>t.length>=2?D(k(e,t[0]),A(e,t[1])):null,tn=({fieldExpr:e,filteredValues:t})=>t.length>=2?O(le(e,t[0]),ce(e,t[1])):null,nn=({fieldExpr:e,filteredValues:t})=>t.length>0?ue(e,t):null,rn=({fieldExpr:e,filteredValues:t})=>t.length>0?de(e,t):null,an=({fieldExpr:e})=>O(fe(e),E(e,``)),on=({fieldExpr:e})=>D(pe(e),se(e,``)),sn=e=>({fieldExpr:t,filteredValues:n,databaseAdapter:r})=>r.getEngineType()===`postgres`?e(t,n):null,cn={equals:Ut,notEquals:Wt,contains:K(`contains`),notContains:K(`notContains`),startsWith:K(`startsWith`),endsWith:K(`endsWith`),gt:Gt,gte:Kt,lt:qt,lte:Jt,set:Yt,notSet:Xt,inDateRange:Zt,beforeDate:Qt,afterDate:$t,between:en,notBetween:tn,in:nn,notIn:rn,like:K(`like`),notLike:K(`notLike`),ilike:K(`ilike`),regex:K(`regex`),notRegex:K(`notRegex`),isEmpty:an,isNotEmpty:on,arrayContains:sn(me),arrayOverlaps:sn(ge),arrayContained:sn(he)};function ln(e,t){let n=cn[e];return n?n(t):null}function q(e){if(e.length!==0)return e.length===1?e[0]:D(...e)}function J(e){if(`type`in e&&`filters`in e){let t=e;if(t.type===`and`||t.type===`or`)return{isAnd:t.type===`and`,filters:t.filters??[]}}return null}function un(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}function dn(t){return{noMapping:({cubeName:n})=>e.O(`${t}.noBindingKeyMapping`,{cubeName:n}),keyDimNotFound:({bindingKey:n})=>e.O(`${t}.bindingKeyDimNotFound`,{bindingKey:n}),mappingDimNotFound:({dimension:n})=>e.O(`${t}.bindingKeyMappingDimNotFound`,{dimension:n})}}function fn(e,t,n,r){if(!n)return e;let i=n.get(t);if(!i)throw Error(r.cubeNotFound({cubeName:t}));return i}function pn(e,t,n,r,i){if(typeof e==`string`){let[a]=e.split(`.`),o=un(e),s=fn(t,a,i,r).dimensions?.[o];if(!s)throw Error(r.keyDimNotFound({bindingKey:e,cubeName:a,dimName:o}));return z(s.sql,n)}let a=e.find(e=>e.cube===t.name);if(!a)throw Error(r.noMapping({cubeName:t.name}));let o=un(a.dimension),s=fn(t,a.cube,i,r).dimensions?.[o];if(!s)throw Error(r.mappingDimNotFound({dimension:a.dimension,cubeName:a.cube,dimName:o}));return z(s.sql,n)}function mn(t,n,r,i){if(typeof t==`string`){let[,a]=t.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e.O(`${i}.timeDimNotFound`,{timeDimension:t}));return z(o.sql,r)}let a=t.find(e=>e.cube===n.name);if(!a)throw Error(e.O(`${i}.noTimeDimMapping`,{cubeName:n.name}));let[,o]=a.dimension.split(`.`),s=n.dimensions?.[o];if(!s)throw Error(e.O(`${i}.timeDimMappingNotFound`,{dimension:a.dimension}));return z(s.sql,r)}var Y=class{databaseAdapter;dateTimeBuilder;constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(e,t,n,r,i){if(i!==void 0){if(t!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${t}'. Use explicit date values in the 'values' array for other date operators.`);if(r&&r.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${r.name||`unknown`}' has type '${r.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(e,i)}if(!n||n.length===0)return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let a=n.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(a.length===0&&![`set`,`notSet`].includes(t))return t===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=a[0];return ln(t,{fieldExpr:e,values:n,filteredValues:a,value:o,field:r,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder})}buildLogicalFilter(e,t,n){return`and`in e&&e.and?this.combineFilters(e.and,!0,t,n):`or`in e&&e.or?this.combineFilters(e.or,!1,t,n):null}combineFilters(e,t,n,r){let i=e.map(e=>this.buildSingleFilter(e,n,r)).filter(e=>e!==null);return i.length===0?null:i.length===1?i[0]:t?D(...i):O(...i)}buildSingleFilter(e,t,n){if(`and`in e||`or`in e)return this.buildLogicalFilter(e,t,n);let r=J(e);if(r)return this.combineFilters(r.filters,r.isAnd,t,n);let i=e,[a,o]=i.member.split(`.`),s=t.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=B(c,n);return this.buildFilterCondition(l,i.operator,i.values,c,i.dateRange)}},hn=[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`];function gn(e){return hn.includes(e)}function _n(e){return gn(e.type)&&e.windowConfig?.measure!==void 0}function vn(e,t){if(!e.windowConfig?.measure)return null;let n=e.windowConfig.measure;return n.includes(`.`)?n:`${t}.${n}`}function yn(e){switch(e){case`lag`:case`lead`:return`difference`;default:return`raw`}}function bn(e,t){let n=[],r=[],i=new Set;for(let a of e){let[e,o]=a.split(`.`),s=t.get(e);if(s?.measures?.[o]){let t=s.measures[o];if(_n(t)){r.push(a);let n=vn(t,e);n&&i.add(n)}else gn(t.type)||n.push(a)}}return{aggregateMeasures:n,postAggWindowMeasures:r,requiredBaseMeasures:i}}function xn(e,t){return bn(e,t).postAggWindowMeasures.length>0}function Sn(e){let t=[],n=[];for(let[n,r]of e)r.inDegree===0&&t.push(n);for(;t.length>0;){let r=t.shift();n.push(r);for(let[n,i]of e)i.dependencies.has(r)&&(i.inDegree--,i.inDegree===0&&t.push(n))}return n}var X=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=this.buildSubgraph(e),n=Sn(t);if(n.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return n}buildSubgraph(e){let t=new Map;for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}return t}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function Cn(t,n){let{cube:r,allCubes:i,resolvedMeasures:a}=n,o=wn(t),s=new Map;for(let t of o){let{originalRef:n,cubeName:o,fieldName:c}=t,l=o||r.name;if(!i.get(l))throw Error(e.O(`server.validation.template.substituteTargetCubeNotFound`,{ref:`{${n}}`,cubeName:l}));let u=`${l}.${c}`,d=a.get(u);if(!d)throw Error(e.O(`server.validation.template.substituteMeasureNotResolved`,{ref:`{${n}}`,measureName:u}));let f=C`${d()}`;s.set(n,f)}let c=[],l=[],u=0;for(let e of o){let n=`{${e.originalRef}}`,r=t.indexOf(n,u);if(r>=0){c.push(t.substring(u,r));let i=s.get(e.originalRef);i&&l.push(i),u=r+n.length}}if(c.push(t.substring(u)),l.length===0)return C.raw(t);let d=[];for(let e=0;e<c.length;e++)c[e]&&d.push(new b(c[e])),e<l.length&&d.push(l[e]);return C.join(d,C.raw(``))}function wn(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`).map(e=>e.trim());n.push({originalRef:t,cubeName:e,fieldName:r})}else n.push({originalRef:t,cubeName:null,fieldName:t})}return n}function Tn(t){let n=[],r=0;for(let i=0;i<t.length;i++)if(t[i]===`{`)r++;else if(t[i]===`}`&&(r--,r<0)){n.push(e.O(`server.validation.template.unmatchedClosingBrace`,{position:i}));break}r>0&&n.push(e.O(`server.validation.template.unmatchedOpeningBrace`)),/\{\s*\}/.test(t)&&n.push(e.O(`server.validation.template.emptyReference`)),/\{[^}]*\{/.test(t)&&n.push(e.O(`server.validation.template.nestedBraces`));let i=wn(t);for(let t of i){let r=t.cubeName?`${t.cubeName}.${t.fieldName}`:t.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(r)||n.push(e.O(`server.validation.template.invalidMemberReference`,{ref:`{${t.originalRef}}`})),r.split(`.`).length>2&&n.push(e.O(`server.validation.template.multipleDots`,{ref:`{${t.originalRef}}`}))}return{isValid:n.length===0,errors:n}}function En(e,t){let n=wn(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var Z=class e{databaseAdapter;constructor(e){this.databaseAdapter=e}buildResolvedMeasures(e,t,n,r){let i=new Map,a=[],o=[],s=new Set(e),c=new X(t);for(let e of t.values())c.buildGraph(e);for(let n of e)this.classifyRequestedMeasure(n,t,c,a,o,s);for(let e of s)this.classifyDependencyMeasure(e,t,a,o);for(let e of a){let[a,o]=e.split(`.`),s=t.get(a),c=s.measures[o];if(r){let t=r(e,c,s);i.set(e,()=>t)}else i.set(e,()=>this.buildMeasureExpression(c,n,s))}if(o.length>0){let e=c.topologicalSort(o);for(let r of e){let[e,a]=r.split(`.`),o=t.get(e),s=o.measures[a];i.set(r,()=>this.buildCalculatedMeasure(s,o,t,i,n))}}return i}classifyRequestedMeasure(t,n,r,i,a,o){let[s,c]=t.split(`.`),l=n.get(s)?.measures?.[c];if(l){if(e.isPostAggregationWindow(l)){let t=e.getWindowBaseMeasure(l,s);t&&o.add(t);return}if(!X.isCalculatedMeasure(l)){i.push(t);return}a.push(t),this.collectCalculatedDependencies(t,l,s,n,r,o)}}collectCalculatedDependencies(e,t,n,r,i,a){En(t.calculatedSql,n).forEach(e=>a.add(e));for(let t of i.getAllDependencies(e)){let[e,n]=t.split(`.`),i=r.get(e)?.measures?.[n];i&&X.isCalculatedMeasure(i)&&En(i.calculatedSql,e).forEach(e=>a.add(e))}}classifyDependencyMeasure(t,n,r,i){let[a,o]=t.split(`.`),s=n.get(a)?.measures?.[o];s&&(e.isPostAggregationWindow(s)||(X.isCalculatedMeasure(s)?i.includes(t)||i.push(t):r.includes(t)||r.push(t)))}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return Cn(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql),{cube:t,allCubes:n,resolvedMeasures:r,queryContext:i})}buildCTECalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name||`unknown`}' missing calculatedSql property`);let a=new Map,o=En(e.calculatedSql,t.name);for(let e of o){let[t,i]=e.split(`.`),o=r.get(t);if(o&&o.measures[i]){let t=o.measures[i];if(n.measures.includes(e)){let r=C`${C.identifier(n.cteAlias)}.${C.identifier(i)}`,o=this.reAggregateCteColumn(t.type,r);a.set(e,()=>o)}}}return this.buildCalculatedMeasure(e,t,r,a,i)}reAggregateCteColumn(e,t){switch(e){case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);default:return xe(t)}}buildHavingMeasureExpression(e,t,n,r,i){let a=i?.preAggregationCTEs?.find(t=>t.cube.name===e);return a&&a.measures.includes(`${e}.${t}`)&&i?this.buildHavingCteMeasure(e,t,n,r,i,a):this.buildMeasureExpression(n,r)}buildHavingCteMeasure(e,t,n,r,i,a){if(n.type===`calculated`&&n.calculatedSql){let t=i.primaryCube.name===e?i.primaryCube:i.joinCubes?.find(t=>t.cube.name===e)?.cube;if(!t)throw Error(`Cube ${e} not found in query plan`);let o=new Map([[i.primaryCube.name,i.primaryCube]]);if(i.joinCubes)for(let e of i.joinCubes)o.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(n,t,a,o,r)}let o=C`${C.identifier(a.cteAlias)}.${C.identifier(t)}`;return this.reAggregateCteColumn(n.type,o)}buildMeasureExpression(t,n,r){if(t.type===`calculated`)throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);if(e.isPostAggregationWindow(t))throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!t.sql)throw Error(`Measure '${t.name}' of type '${t.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let i=z(t.sql,n);if(n.ungrouped)return i;let a=this.applyMeasureFilters(t,i,n);return this.applyAggregation(t,a,n,r)}applyMeasureFilters(e,t,n){if(!e.filters||e.filters.length===0)return t;let r=e.filters.map(e=>{let t=e(n);return t?C`(${t})`:void 0}).filter(Boolean);if(r.length===0)return t;let i=r.length===1?r[0]:D(...r);return this.databaseAdapter.buildCaseWhen([{when:i,then:t}])}applyAggregation(e,t,n,r){switch(e.type){case`count`:return ye(t);case`countDistinct`:return be(t);case`sum`:return xe(t);case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);case`number`:return t;case`stddev`:case`stddevSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildStddev(t,e.type===`stddevSamp`||e.statisticalConfig?.useSample));case`variance`:case`varianceSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildVariance(t,e.type===`varianceSamp`||e.statisticalConfig?.useSample));case`percentile`:case`median`:case`p95`:case`p99`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildPercentile(t,this.resolvePercentile(e)));case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:return this.buildWindowMeasure(e,t,n,r);default:return ye(t)}}buildStatistical(e,t,n){let r=n();return r===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),C`MAX(NULL)`):r}resolvePercentile(e){switch(e.type){case`median`:return 50;case`p95`:return 95;case`p99`:return 99;default:return e.statisticalConfig?.percentile??50}}buildWindowMeasure(e,t,n,r){let i=e.windowConfig||{},a=this.resolveWindowPartitions(i,n,r),o=this.resolveWindowOrder(i,n,r),s=this.databaseAdapter.buildWindowFunction(e.type,[`rank`,`denseRank`,`rowNumber`].includes(e.type)?null:t,a,o,{offset:i.offset,defaultValue:i.defaultValue,nTile:i.nTile,frame:i.frame});return s===null?(console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),C`NULL`):s}resolveWindowPartitions(e,t,n){if(!e.partitionBy||e.partitionBy.length===0||!n)return;let r=e.partitionBy.map(e=>{let r=e.includes(`.`)?e.split(`.`)[1]:e,i=n.dimensions?.[r];return i?z(i.sql,t):(console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}resolveWindowOrder(e,t,n){if(!e.orderBy||e.orderBy.length===0||!n)return;let r=e.orderBy.map(e=>{let r=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field,i=n.dimensions?.[r];if(i)return{field:z(i.sql,t),direction:e.direction};let a=n.measures?.[r];return a&&a.sql?{field:z(a.sql,t),direction:e.direction}:(console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${n.name}'`),null)}).filter(e=>e!==null);return r.length>0?r:void 0}static WINDOW_FUNCTION_TYPES=hn;static isWindowFunction(e){return gn(e)}static categorizeMeasures(t,n){let r=[],i=[];for(let a of t){let[t,o]=a.split(`.`),s=n.get(t);if(s?.measures?.[o]){let t=s.measures[o];e.isWindowFunction(t.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(t,n){let{windowMeasures:r}=e.categorizeMeasures(t,n);return r.length>0}static isPostAggregationWindow(e){return _n(e)}static getWindowBaseMeasure(e,t){return vn(e,t)}static getDefaultWindowOperation(e){return yn(e)}static categorizeForPostAggregation(e,t){return bn(e,t)}static hasPostAggregationWindows(e,t){return xn(e,t)}},Dn=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s;if(!this.hasAggregateMeasures(t,a)&&!c)return[];for(let e of t.dimensions||[]){let t=this.resolveDimensionGroupField(e,a,n,r);t&&i.push(t)}for(let e of t.timeDimensions||[]){let t=this.resolveTimeDimensionGroupField(e,a,n,r);t&&i.push(t)}return i}hasAggregateMeasures(e,t){for(let n of e.measures||[]){let[e,r]=n.split(`.`),i=t.get(e)?.measures?.[r];if(i&&(this.isAggregateFunctionType(i.type)||i.type===`calculated`||this.isWindowOverAggregate(i,e,t)))return!0}return!1}isWindowOverAggregate(e,t,n){if(!Z.isPostAggregationWindow(e))return!1;let r=Z.getWindowBaseMeasure(e,t);if(!r)return!1;let[i,a]=r.split(`.`),o=n.get(i)?.measures?.[a];return!!o&&this.isAggregateFunctionType(o.type)}resolveDimensionGroupField(e,t,n,r){let[i,a]=e.split(`.`),o=t.get(i);if(!o?.dimensions?.[a])return null;let s=r?.preAggregationCTEs?.find(e=>e.cube.name===i);if(s){let e=s.joinKeys.find(e=>e.targetColumn===a);return e&&e.sourceColumnObj?e.sourceColumnObj:C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`}return z(o.dimensions[a].sql,n)}resolveTimeDimensionGroupField(e,t,n,r){let[i,a]=e.dimension.split(`.`),o=t.get(i);if(!o?.dimensions?.[a])return null;let s=r?.preAggregationCTEs?.find(e=>e.cube.name===i);if(s){let t=s.joinKeys.find(e=>e.targetColumn===a);return t&&t.sourceColumnObj?this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj,e.granularity,n):C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`}return this.dateTimeBuilder.buildTimeDimensionExpression(o.dimensions[a].sql,e.granularity,n)}},On=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(e,this.dateTimeBuilder),this.groupByBuilder=new Dn(this.dateTimeBuilder),this.measureBuilder=new Z(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(e,t,n){let r={},i=e instanceof Map?e:new Map([[e.name,e]]);if(t.dimensions)for(let e of t.dimensions){let[t,a]=e.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a];r[e]=C`${z(t.sql,n)}`.as(e)}}if(t.measures){let e=this.buildResolvedMeasures(t.measures,i,n);for(let n of t.measures){let t=e.get(n);t&&typeof t==`function`&&(r[n]=C`${t()}`.as(n))}}if(t.timeDimensions)for(let e of t.timeDimensions){let[t,a]=e.dimension.split(`.`),o=i.get(t);if(o&&o.dimensions&&o.dimensions[a]){let t=o.dimensions[a],i=this.buildTimeDimensionExpression(t.sql,e.granularity,n);r[e.dimension]=C`${i}`.as(e.dimension)}}return Object.keys(r).length===0&&(r.count=ye()),r}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters)this.appendWhereFilter(e,o,n,r,i,s,a);if(t.timeDimensions)for(let e of t.timeDimensions)this.appendTimeDimensionWhere(e,o,n,r,a);return a}appendWhereFilter(e,t,n,r,i,a,o){if(i&&`member`in e){let[n]=e.member.split(`.`);if(this.cubeIsInCTE(n,r))return;if(t.has(n)&&i.has(n)&&!a.has(n)){o.push(...i.get(n)),a.add(n);return}else if(a.has(n))return}let s=this.processFilter(e,t,n,`where`,r);s&&o.push(s)}appendTimeDimensionWhere(e,t,n,r,i){let[a,o]=e.dimension.split(`.`),s=t.get(a);if(!s||!s.dimensions[o]||!e.dateRange||this.cubeIsInCTE(a,r))return;if(n.filterCache){let t=Mt(e.dimension,e.dateRange),r=n.filterCache.get(t);if(r){i.push(r);return}}let c=s.dimensions[o],l=z(c.sql,n),u=this.buildDateRangeCondition(l,e.dateRange);u&&i.push(u)}cubeIsInCTE(e,t){return!!t?.preAggregationCTEs?.some(t=>t.cube.name===e)}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(e,t,n,r,i){if(`and`in e||`or`in e){let a=e;if(a.and){let e=a.and.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?D(...e):null}if(a.or){let e=a.or.map(e=>this.processFilter(e,t,n,r,i)).filter(e=>e!==null);return e.length>0?O(...e):null}}let a=e,[o,s]=a.member.split(`.`),c=t.get(o);if(!c)return null;let l=c.dimensions[s],u=c.measures[s],d=l||u;if(!d)return null;if(r===`where`&&l)return this.processWhereDimensionFilter(e,a,l,d,o,n,i);if(r===`where`&&u)return null;if(r===`having`&&u){let e=this.buildHavingMeasureExpression(o,s,u,n,i);return this.buildFilterCondition(e,a.operator,a.values,d,a.dateRange)}return null}processWhereDimensionFilter(e,t,n,r,i,a,o){if(this.cubeIsInCTE(i,o))return null;let s=n.type===`time`;if(a.filterCache){let t=V(e),n=a.filterCache.get(t);if(n)return n}let c=s?z(n.sql,a):typeof n.sql==`function`?n.sql(a):n.sql;return this.buildFilterCondition(c,t.operator,t.values,r,t.dateRange)}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(e,t){let n=[],r=t||[...e.measures||[],...e.dimensions||[],...e.timeDimensions?.map(e=>e.dimension)||[]];if(e.order&&Object.keys(e.order).length>0)for(let[t,i]of Object.entries(e.order)){if(!r.includes(t))throw Error(`Cannot order by '${t}': field is not selected in the query`);let e=i===`desc`?ve(C.identifier(t)):_e(C.identifier(t));n.push(e)}if(e.timeDimensions&&e.timeDimensions.length>0){let t=new Set(Object.keys(e.order||{})),r=[...e.timeDimensions].sort((e,t)=>e.dimension.localeCompare(t.dimension));for(let e of r)t.has(e.dimension)||n.push(_e(C.identifier(e.dimension)))}return n}collectNumericFields(e,t){let n=[],r=e instanceof Map?e:new Map([[e.name,e]]);if(t.measures&&n.push(...t.measures),t.dimensions)for(let e of t.dimensions){let[t,i]=e.split(`.`),a=r.get(t);if(a){let t=a.dimensions[i];t&&t.type===`number`&&n.push(e)}}return n}applyLimitAndOffset(e,t){let n=t.limit;t.offset!==void 0&&t.offset>0&&n===void 0&&(n=50);let r=e;if(n!==void 0){if(n<0)throw Error(`Limit must be non-negative`);r=r.limit(n)}if(t.offset!==void 0){if(t.offset<0)throw Error(`Offset must be non-negative`);r=r.offset(t.offset)}return r}buildFilterConditionPublic(e,t,n,r,i){return this.buildFilterCondition(e,t,n,r,i)}buildLogicalFilter(e,t,n){return this.filterBuilder.buildLogicalFilter(e,t,n)}},kn=class{cubes;connectivityCache=new Map;reverseIndex;constructor(e){this.cubes=e,this.reverseIndex=this.buildReverseIndex()}buildReverseIndex(){let e=new Map;for(let[t,n]of this.cubes)if(n.joins)for(let[,r]of Object.entries(n.joins)){if(r.relationship===`belongsToMany`)continue;let n=I(r.targetCube,this.cubes);if(!n)continue;let i=n.name,a=e.get(i);a||(a=[],e.set(i,a)),a.push({definingCube:t,joinDef:r})}return e}findPath(e,t,n=new Set){if(e===t)return[];let r=this.getCacheKey(e,t,n),i=this.getFromCache(r);if(i!==void 0)return i;let a=[{cube:e,path:[]}],o=new Set([e,...n]);for(;a.length>0;){let{cube:e,path:n}=a.shift();for(let{nextCube:i,step:s}of this.neighbourSteps(e,!1)){if(o.has(i))continue;let e=[...n,s];if(i===t)return this.setInCache(r,e),e;o.add(i),a.push({cube:i,path:e})}}return this.setInCache(r,null),null}neighbourSteps(e,t){let n=[],r=this.cubes.get(e);if(r?.joins)for(let[,t]of Object.entries(r.joins)){let r=I(t.targetCube,this.cubes);if(!r)continue;let i=r.name;n.push({nextCube:i,step:{fromCube:e,toCube:i,joinDef:t}})}if(t)return n;let i=this.reverseIndex.get(e)||[];for(let{definingCube:t,joinDef:r}of i)n.push({nextCube:t,step:{fromCube:e,toCube:t,joinDef:r,reversed:!0}});return n}findPathPreferring(e,t,n,r=new Set){return this.findPathPreferringDetailed(e,t,n,r).selectedPath}findPathPreferringDetailed(e,t,n,r=new Set){let i=this.findAllPaths(e,t,new Set);if(i.length===0){let i=this.findPath(e,t,r),a=i?[{path:i,score:0,usesPreferredJoin:!1,preferredCubesInPath:0,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:0,preferredCubeBonus:0,lengthPenalty:0}}]:[];return{strategy:`fallbackShortest`,preferredCubes:Array.from(n).sort(),selectedIndex:i?0:-1,candidates:a,selectedPath:i}}let a=i.map(i=>{let a=0,o=i.some((n,r)=>r===0?n.reversed?n.joinDef.preferredFor?.includes(e)??!1:n.joinDef.preferredFor?.includes(t)??!1:!1);o&&(a=10);let s=i.filter(e=>n.has(e.toCube)).length,c=s,l=i.length-1;return{path:i,score:a+c-l,usesPreferredJoin:o,preferredCubesInPath:s,usesProcessed:i.some(e=>r.has(e.toCube)),scoreBreakdown:{preferredJoinBonus:a,preferredCubeBonus:c,lengthPenalty:l}}});return a.sort((e,t)=>t.score===e.score?e.usesProcessed===t.usesProcessed?e.path.length-t.path.length:e.usesProcessed?-1:1:t.score-e.score),{strategy:`preferred`,preferredCubes:Array.from(n).sort(),selectedIndex:a.length>0?0:-1,candidates:a,selectedPath:a[0]?.path??null}}findAllPaths(e,t,n,r=4){if(e===t)return[[]];let i=[],a=[{cube:e,path:[],visited:new Set([e,...n])}];for(;a.length>0;){let{cube:e,path:n,visited:o}=a.shift();if(!(n.length>=r))for(let{nextCube:r,step:s}of this.neighbourSteps(e,!1)){if(o.has(r))continue;let e=[...n,s];if(r===t)i.push(e);else{let t=new Set(o);t.add(r),a.push({cube:r,path:e,visited:t})}}}return i}canReachAll(e,t){let n=t.filter(t=>t!==e);for(let t of n){let n=this.findForwardOnlyPath(e,t,new Set);if(!n||n.length===0)return!1}return!0}findForwardOnlyPath(e,t,n){if(e===t)return[];let r=[{cube:e,path:[]}],i=new Set([e,...n]);for(;r.length>0;){let{cube:e,path:n}=r.shift();for(let{nextCube:a,step:o}of this.neighbourSteps(e,!0)){if(i.has(a))continue;let e=[...n,o];if(a===t)return e;i.add(a),r.push({cube:a,path:e})}}return null}buildJoinCondition(e,t,n){let r=[];for(let i of e.on){let e=t?C`${C.identifier(t)}.${C.identifier(i.source.name)}`:R(i.source),a=n?C`${C.identifier(n)}.${C.identifier(i.target.name)}`:R(i.target),o=i.as||E;r.push(o(e,a))}return D(...r)}getReachableCubes(e){let t=new Set([e]),n=[e];for(;n.length>0;){let e=n.shift();for(let{nextCube:r}of this.neighbourSteps(e,!1))t.has(r)||(t.add(r),n.push(r))}return t}getCacheKey(e,t,n){return`${e}:${t}:${Array.from(n).sort().join(`,`)}`}getFromCache(e){let t=this.connectivityCache.get(e);if(t)return t.path}setInCache(e,t){this.connectivityCache.set(e,{path:t})}},An=class{cache=new WeakMap;get(e){let t=this.cache.get(e);return t||(t=new kn(e),this.cache.set(e,t)),t}};function jn(e){let t=new Set;if(e.measures)for(let n of e.measures){let[e]=n.split(`.`);t.add(e)}if(e.dimensions)for(let n of e.dimensions){let[e]=n.split(`.`);t.add(e)}if(e.timeDimensions)for(let n of e.timeDimensions){let[e]=n.dimension.split(`.`);t.add(e)}if(e.filters)for(let n of e.filters)Mn(n,t);if(e.order)for(let n of Object.keys(e.order)){let[e]=n.split(`.`);e&&t.add(e)}return t}function Mn(e,t){if(`and`in e||`or`in e){let n=e.and||e.or||[];for(let e of n)Mn(e,t);return}if(`member`in e){let[n]=e.member.split(`.`);n&&t.add(n)}}var Nn=class{resolverCache;constructor(e){this.resolverCache=e}buildJoinPlan(t,n,r,i,a){let o=this.resolverCache.get(t),s=[],c=new Set([n.name]),l=new Set;if(a.measures)for(let e of a.measures){let[t]=e.split(`.`);l.add(t)}let u=jn(a),d=new Set;for(let e of l)e!==n.name&&this.findHasManyJoinDef(n,e,t)&&d.add(e);let f=r.filter(e=>e!==n.name);for(let r of f){if(c.has(r))continue;let i=new Set([...c].filter(e=>!d.has(e))),a=o.findPathPreferring(n.name,r,u,i);if(!a||a.length===0)throw Error(e.O(`server.errors.noJoinPath`,{fromCube:n.name,toCube:r}));for(let{fromCube:n,toCube:r,joinDef:i,reversed:o}of a){if(c.has(r))continue;let a=t.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:r}));s.push(this.buildJoinRef(a,r,n,i,o)),c.add(r)}}return s}buildJoinRef(e,t,n,r,i){let a=i?Ot(r.relationship):r.relationship;if(a===`belongsToMany`&&r.through){let i=L(`belongsToMany`,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:i,joinDef:r,relationship:`belongsToMany`,junctionTable:{table:r.through.table,alias:`junction_${t.toLowerCase()}`,joinType:i,sourceCubeName:n}}}let o=L(a,r.sqlJoinType);return{target:{name:e.name,cube:e},alias:`${t.toLowerCase()}_cube`,joinType:o,joinDef:r,relationship:a}}findHasManyJoinDef(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(e&&e.name===t&&r.relationship===`hasMany`)return r}return null}};function Pn(e,t){let n=e.joinDef.through;return e.sourceCube?.name===t.name&&!e.reversed?n.targetKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):n.sourceKey.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source}))}function Fn(e,t){return e.joinDef.relationship===`belongsToMany`&&e.joinDef.through?Pn(e,t):e.reversed?e.joinDef.on.map(e=>({sourceColumn:e.target.name,targetColumn:e.source.name,sourceColumnObj:e.target,targetColumnObj:e.source})):e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function In(e){return e.relationship===`belongsToMany`&&e.through?e.through.sourceKey.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target})):e.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}function Ln(e,t,n){if(!e.joins)return null;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(e&&e.name===t)return r}return null}function Rn(e,t,n){let r=Ln(t,n,e);if(r)return{sourceCube:t,joinDef:r};let i=e.get(n);if(i){let n=Ln(i,t.name,e);if(n)return{sourceCube:i,joinDef:n,reversed:!0}}for(let[,r]of e){if(r.name===t.name||r.name===n)continue;let i=Ln(r,n,e);if(i)return{sourceCube:r,joinDef:i}}return null}function zn(e,t){let n=new Set;if(e.dimensions)for(let r of e.dimensions){let[e]=r.split(`.`);e!==t&&n.add(e)}if(e.timeDimensions)for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e!==t&&n.add(e)}if(e.filters){for(let t of e.filters)Mn(t,n);n.delete(t)}return n}var Bn=class{resolverCache;filterPropagation;constructor(e,t){this.resolverCache=e,this.filterPropagation=t}planPreAggregationCTEs(e,t,n,r,i){let a=[];if(!r.measures||r.measures.length===0)return a;let o=this.computeCTEReasons(t,n,r);if(o.size===0)return a;for(let i of n){let n=o.get(i.target.name);if(!n)continue;let s=this.buildCTEForJoinCube(i,n,e,t,r);s&&a.push(s)}return a}buildCTEForJoinCube(e,t,n,r,i){let a=e.target.cube,o=e.alias,s=(i.measures??[]).filter(e=>e.startsWith(a.name+`.`)),c=this.extractMeasuresFromFilters(i,a),l=[...new Set([...s,...c])];if(l.length===0)return null;let u=this.resolveCTEJoinKeys(n,r,a,i);if(!u)return null;let{joinKeys:d,intermediateJoins:f}=u,p=this.filterPropagation.findPropagatingFilters(i,a,n),{aggregateMeasures:m,requiredBaseMeasures:h}=bn(l,new Map([[a.name,a]])),g=[...new Set([...m,...Array.from(h).filter(e=>e.startsWith(a.name+`.`))])];if(g.length===0)return null;let _=this.expandCalculatedMeasureDependencies(a,g),v=this.findDownstreamJoinKeys(a,i,n);return{cube:a,alias:o,cteAlias:`${a.name.toLowerCase()}_agg`,joinKeys:d,measures:_,propagatingFilters:p.length>0?p:void 0,downstreamJoinKeys:v.length>0?v:void 0,intermediateJoins:f&&f.length>0?f:void 0,cteType:`aggregate`,cteReason:t}}resolveCTEJoinKeys(e,t,n,r){let i=this.analyzeJoinPathToPrimary(e,t,n.name,r);if(i?.hasIntermediateHasMany&&i.intermediateJoins.length>0)return{joinKeys:i.correctJoinKeys,intermediateJoins:i.intermediateJoins};let a=this.locateJoinInfo(e,t,n,i);return a?{joinKeys:Fn(a,t),intermediateJoins:void 0}:null}locateJoinInfo(e,t,n,r){if(r?.path&&r.path.length>0){let t=r.path[r.path.length-1],n=e.get(t.fromCube);if(n)return{sourceCube:n,joinDef:t.joinDef,reversed:t.reversed}}return Rn(e,t,n.name)}analyzeJoinPathToPrimary(e,t,n,r){let i=this.resolverCache.get(e),a=jn(r),o=a.size>0?i.findPathPreferring(t.name,n,a,new Set):i.findPath(t.name,n);if(!o||o.length===0)return null;let s=o.map(e=>({fromCube:e.fromCube,toCube:e.toCube,joinDef:e.joinDef,reversed:e.reversed}));if(!s.slice(0,-1).some(e=>(e.reversed?Ot(e.joinDef.relationship):e.joinDef.relationship)===`hasMany`))return{path:s,hasIntermediateHasMany:!1,intermediateJoins:[],correctJoinKeys:[]};let c=[];for(let t=0;t<s.length-1;t++){let n=s[t],r=s[t+1],i=e.get(n.toCube);if(!i)continue;let a=r.joinDef.on[0]?.source,o=n.joinDef.on[0]?.target;c.push({cube:i,joinDef:r.joinDef,primaryJoinColumn:o,cteJoinColumn:a})}return{path:s,hasIntermediateHasMany:!0,intermediateJoins:c,correctJoinKeys:s[0].joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name,sourceColumnObj:e.source,targetColumnObj:e.target}))}}computeCTEReasons(e,t,n){let r=new Map,i=new Set,a=new Set,o=new Set;if(n.measures)for(let e of n.measures){let[t]=e.split(`.`);o.add(t)}for(let e of t)e.relationship===`hasMany`||e.relationship===`belongsToMany`?i.add(e.target.name):e.relationship===`belongsTo`&&o.has(e.target.name)&&a.add(e.target.name);if(i.size===0&&a.size===0)return r;for(let e of t)o.has(e.target.name)&&(i.has(e.target.name)?r.set(e.target.name,`hasMany`):(a.has(e.target.name)||i.size>0)&&r.set(e.target.name,`fanOutPrevention`));return r}findDownstreamJoinKeys(e,t,n){let r=[],i=zn(t,e.name);if(!e.joins)return r;for(let[,t]of Object.entries(e.joins)){let e=I(t.targetCube,n);if(!e)continue;let a=e.name;i.has(a)&&r.push({targetCubeName:a,joinKeys:In(t)})}return r}expandCalculatedMeasureDependencies(e,t){let n=new Set,r=[...t];for(;r.length>0;){let t=r.pop();if(n.has(t))continue;n.add(t);let[,i]=t.split(`.`);if(!e.measures||!e.measures[i])continue;let a=e.measures[i];if(a.type===`calculated`&&a.calculatedSql){let t=this.extractDependenciesFromTemplate(a.calculatedSql,e.name);for(let e of t)n.has(e)||r.push(e)}}return Array.from(n)}extractDependenciesFromTemplate(e,t){if(e.length>1e3)return[];let n=e.matchAll(/\{([^}]+)\}/g),r=[];for(let e of n){let n=e[1].trim();n.includes(`.`)?r.push(n):r.push(`${t}.${n}`)}return r}extractMeasuresFromFilters(e,t){let n=[];if(!e.filters)return n;for(let r of e.filters)this.extractMeasuresFromFilter(r,t,n);return n}extractMeasuresFromFilter(e,t,n){if(`and`in e||`or`in e){let r=e.and||e.or||[];for(let e of r)this.extractMeasuresFromFilter(e,t,n);return}if(`member`in e){let r=e.member,[i,a]=r.split(`.`);i===t.name&&t.measures&&t.measures[a]&&n.push(r)}}},Vn=class{findPropagatingFilters(e,t,n){let r=[];if(!e.filters)return r;let i=this.collectFilterCubeNames(e);for(let a of i){if(a===t.name)continue;let i=n.get(a);if(i?.joins)for(let[,o]of Object.entries(i.joins)){let s=I(o.targetCube,n);if(!s||s.name!==t.name||o.relationship!==`hasMany`)continue;let c=this.buildPropagatingFilter(e,i,a,o);c&&r.push(c)}}return r}collectFilterCubeNames(e){let t=new Set;if(e.filters&&this.extractFilterCubeNamesToSet(e.filters,t),e.timeDimensions){for(let n of e.timeDimensions)if(n.dateRange){let[e]=n.dimension.split(`.`);e&&t.add(e)}}return t}buildPropagatingFilter(e,t,n,r){let i=this.extractFiltersForCube(e.filters??[],n),a=this.extractTimeDimensionFiltersForCube(e,n),o=[...i,...a];return o.length===0||r.on.length===0?null:{sourceCube:t,filters:o,joinConditions:r.on.map(e=>({source:e.source,target:e.target}))}}extractFilterCubeNamesToSet(e,t){for(let n of e){if(`and`in n||`or`in n){let e=n.and||n.or||[];this.extractFilterCubeNamesToSet(e,t);continue}if(`member`in n){let[e]=n.member.split(`.`);e&&t.add(e)}}}extractFiltersForCube(e,t){let n=[];for(let r of e){if(`and`in r){let e=this.extractFiltersForCube(r.and||[],t);e.length>0&&n.push({and:e});continue}if(`or`in r){let e=r.or||[];if(this.allFiltersFromCube(e,t)){let r=this.extractFiltersForCube(e,t);r.length>0&&n.push({or:r})}continue}if(`member`in r){let[e]=r.member.split(`.`);e===t&&n.push(r)}}return n}allFiltersFromCube(e,t){for(let n of e){if(`and`in n){if(!this.allFiltersFromCube(n.and||[],t))return!1;continue}if(`or`in n){if(!this.allFiltersFromCube(n.or||[],t))return!1;continue}if(`member`in n){let[e]=n.member.split(`.`);if(e!==t)return!1}}return!0}extractTimeDimensionFiltersForCube(e,t){let n=[];if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e]=r.dimension.split(`.`);e===t&&r.dateRange&&n.push({member:r.dimension,operator:`inDateRange`,values:Array.isArray(r.dateRange)?r.dateRange:[r.dateRange]})}return n}},Hn=class{resolverCache;constructor(e){this.resolverCache=e}analyzePrimaryCubeSelection(e,t,n){if(e.length===1)return{selectedCube:e[0],reason:`single_cube`,explanation:`Only one cube is used in this query`};let r=this.buildPrimaryCubeCandidates(e,t,n);return this.selectByDimensions(t,r)||this.selectByConnectivity(r)||{selectedCube:[...e].sort()[0],reason:`alphabetical_fallback`,explanation:`Selected alphabetically as fallback (no cube could reach all others)`,candidates:r}}buildPrimaryCubeCandidates(e,t,n){let r=new Map;for(let e of t.dimensions||[]){let t=e.split(`.`)[0];r.set(t,(r.get(t)||0)+1)}let i=this.resolverCache.get(n);return e.map(t=>{let a=n.get(t);return{cubeName:t,dimensionCount:r.get(t)||0,joinCount:a?.joins?Object.keys(a.joins).length:0,canReachAll:i.canReachAll(t,e)}})}selectByDimensions(e,t){if(!e.dimensions||e.dimensions.length===0)return null;let n=Math.max(...t.map(e=>e.dimensionCount));if(n===0)return null;let r=t.filter(e=>e.dimensionCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName));for(let e of r)if(e.canReachAll)return{selectedCube:e.cubeName,reason:`most_dimensions`,explanation:`Selected because it has ${e.dimensionCount} dimension${e.dimensionCount===1?``:`s`} in the query (defines the analytical grain)`,candidates:t};return null}selectByConnectivity(e){let t=e.filter(e=>e.canReachAll);if(t.length===0)return null;let n=Math.max(...t.map(e=>e.joinCount)),r=t.filter(e=>e.joinCount===n).sort((e,t)=>e.cubeName.localeCompare(t.cubeName))[0];return{selectedCube:r.cubeName,reason:`most_connected`,explanation:`Selected because it has ${r.joinCount} join relationship${r.joinCount===1?``:`s`} and can reach all other cubes`,candidates:e}}analyzeJoinPath(e,t,n,r){let i=this.resolverCache.get(e),a=r?jn(r):new Set,o=a.size>0?i.findPathPreferringDetailed(t,n,a):null,s=o?.selectedPath??i.findPath(t,n),c=[t];if(s)for(let e of s)c.push(e.toCube);if(!s||s.length===0)return{targetCube:n,pathFound:!1,error:`No join path found from '${t}' to '${n}'. Ensure the target cube has a relationship defined (belongsTo, hasOne, hasMany, or belongsToMany).`,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)};let l=this.convertInternalPathToJoinPathSteps(s);return{targetCube:n,pathFound:!0,path:l,pathLength:l.length,visitedCubes:c,selection:this.buildJoinPathSelectionAnalysis(o)}}convertInternalPathToJoinPathSteps(e){return e.map(e=>{let t=e.reversed?Ot(e.joinDef.relationship):e.joinDef.relationship,n=L(t,e.joinDef.sqlJoinType),r=e.joinDef.on.map(e=>({sourceColumn:e.source.name,targetColumn:e.target.name})),i={fromCube:e.fromCube,toCube:e.toCube,relationship:t,joinType:n,joinColumns:r};if(e.reversed&&(i.reversed=!0),t===`belongsToMany`&&e.joinDef.through){let t=e.joinDef.through;i.junctionTable={tableName:t.table[Symbol.for(`drizzle:Name`)]||`junction_table`,sourceColumns:t.sourceKey.map(e=>e.target.name),targetColumns:t.targetKey.map(e=>e.source.name)}}return i})}buildJoinPathSelectionAnalysis(e){if(!e)return{strategy:`shortest`};let t=e.candidates.map((e,t)=>this.mapPreferredCandidate(e,t+1));return{strategy:e.strategy,preferredCubes:e.preferredCubes,selectedRank:e.selectedIndex>=0?e.selectedIndex+1:void 0,selectedScore:e.selectedIndex>=0?e.candidates[e.selectedIndex]?.score:void 0,candidates:t}}mapPreferredCandidate(e,t){return{rank:t,score:e.score,usesPreferredJoin:e.usesPreferredJoin,preferredCubesInPath:e.preferredCubesInPath,usesProcessed:e.usesProcessed,scoreBreakdown:e.scoreBreakdown,path:this.convertInternalPathToJoinPathSteps(e.path)}}generateWarnings(e,t){let n=[],r=this.checkFanOutNoDimensions(e,t);return r&&n.push(r),n}checkFanOutNoDimensions(e,t){if(!t||t.length===0||!e.measures||e.measures.length===0)return null;let n=new Set;for(let t of e.measures){let[e]=t.split(`.`);n.add(e)}if(n.size<2)return null;let r=e.dimensions&&e.dimensions.length>0,i=e.timeDimensions?.some(e=>e.granularity);return r||i?null:{code:`FAN_OUT_NO_DIMENSIONS`,message:`Query combines measures from multiple cubes with hasMany relationships but has no dimensions. Results are aggregated at the join key level, which may produce unexpected totals.`,severity:`warning`,cubes:[...n].sort(),measures:e.measures,suggestion:`Add a dimension to see per-group breakdowns, or add a time dimension with granularity.`}}},Un=class{resolverCache=new An;joinPlanner=new Nn(this.resolverCache);ctePlanner=new Bn(this.resolverCache,new Vn);reporter=new Hn(this.resolverCache);analyzeCubeUsage(e){return jn(e)}analyzePrimaryCube(e,t,n){return this.reporter.analyzePrimaryCubeSelection(e,t,n)}analyzeJoinPathForTarget(e,t,n,r){return this.reporter.analyzeJoinPath(e,t,n,r)}buildJoinPlanForPrimary(e,t,n,r,i){return this.joinPlanner.buildJoinPlan(e,t,n,r,i)}buildPreAggregationCTEs(e,t,n,r,i){return this.ctePlanner.planPreAggregationCTEs(e,t,n,r,i)}buildWarnings(e,t){return this.reporter.generateWarnings(e,t)}};function Wn(e,t){if(!t.joins)return e;for(let n of t.joins)switch(n.type||`left`){case`left`:e=e.leftJoin(n.table,n.on);break;case`inner`:e=e.innerJoin(n.table,n.on);break;case`right`:e=e.rightJoin(n.table,n.on);break;case`full`:e=e.fullJoin(n.table,n.on);break}return e}var Gn=class{queryBuilder;constructor(e){this.queryBuilder=e}buildPreAggregationCTE(e,t,n,r,i){let a=e.cube,o=a.sql(n),s=!!(e.intermediateJoins&&e.intermediateJoins.length>0),c=this.buildCTESelections(e,a,t,n,s);if(Object.keys(c).length===0)return null;let l=n.db.select(c).from(o.from);l=Wn(l,o),l=this.applyIntermediateJoins(l,e,n,s);let u=this.buildCTEWhereConditions(e,a,t,n,r,i,o);if(u.length>0){let e=u.length===1?u[0]:D(...u);l=l.where(e)}let d=this.buildCTEGroupByFields(e,a,t,n,s);return d.length>0&&(l=l.groupBy(...d)),n.db.$with(e.cteAlias).as(l)}buildCTESelections(e,t,n,r,i){let a={};return this.addJoinKeySelections(a,e,t,i),this.addDownstreamKeySelections(a,e),this.addMeasureSelections(a,e,t,r),this.addDimensionSelections(a,t,n,r),a}addJoinKeySelections(e,t,n,r){if(r&&t.intermediateJoins){let n=t.intermediateJoins[0].primaryJoinColumn;n&&(e[n.name]=n);return}for(let r of t.joinKeys)if(r.targetColumnObj){e[r.targetColumn]=r.targetColumnObj;for(let[t,i]of Object.entries(n.dimensions||{}))i.sql===r.targetColumnObj&&t!==r.targetColumn&&(e[t]=C`${r.targetColumnObj}`.as(t))}}addDownstreamKeySelections(e,t){if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&(e[t.sourceColumn]=t.sourceColumnObj)}addMeasureSelections(e,t,n,r){let i=new Map([[n.name,n]]),a=this.queryBuilder.buildResolvedMeasures(t.measures,i,r);for(let n of t.measures){let[,t]=n.split(`.`),r=a.get(n);r&&(e[t]=C`${r()}`.as(t))}}addDimensionSelections(e,t,n,r){let i=t.name;for(let a of n.dimensions||[]){let[n,o]=a.split(`.`);n===i&&t.dimensions?.[o]&&(e[o]=C`${this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r)}`.as(o))}for(let a of n.timeDimensions||[]){let[n,o]=a.dimension.split(`.`);n===i&&t.dimensions?.[o]&&(e[o]=C`${this.queryBuilder.buildTimeDimensionExpression(t.dimensions[o].sql,a.granularity,r)}`.as(o))}}applyIntermediateJoins(e,t,n,r){if(!r||!t.intermediateJoins)return e;let i=[...t.intermediateJoins].reverse();for(let t of i){let r=t.cube.sql(n),i=[E(t.cteJoinColumn,t.joinDef.on[0]?.target)];r.where&&i.push(r.where),e=e.leftJoin(r.from,D(...i))}return e}buildCTEWhereConditions(e,t,n,r,i,a,o){let s=i?{...i,preAggregationCTEs:i.preAggregationCTEs?.filter(e=>e.cube.name!==t.name)}:void 0,c=this.queryBuilder.buildWhereConditions(t,n,r,s,a),l=this.buildCTETimeFilters(e,t,n,r),u=[];return o.where&&u.push(o.where),u.push(...c,...l),u}buildCTETimeFilters(e,t,n,r){let i=t.name,a=[];for(let e of n.timeDimensions||[]){let[n,o]=e.dimension.split(`.`);if(n===i&&t.dimensions?.[o]&&e.dateRange){let n=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(n,e.dateRange);i&&a.push(i)}}for(let e of n.filters||[]){if(`and`in e||`or`in e||!(`member`in e)||!(`operator`in e))continue;let n=e,[o,s]=n.member.split(`.`);if(o===i&&t.dimensions?.[s]&&n.operator===`inDateRange`){let e=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[s].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(e,n.values);i&&a.push(i)}}for(let t of e.propagatingFilters||[]){let e=this.buildPropagatingFilterSubquery(t,r);e&&a.push(e)}return a}buildCTEGroupByFields(e,t,n,r,i){let a=t.name,o=[],s=new Set;this.addJoinKeyGroupBy(e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!s.has(t)?(s.add(t),o.push(e)):t||o.push(e)},e,i);for(let e of n.dimensions||[]){let[n,i]=e.split(`.`);n===a&&t.dimensions?.[i]&&o.push(z(t.dimensions[i].sql,r))}for(let e of n.timeDimensions||[]){let[n,i]=e.dimension.split(`.`);n===a&&t.dimensions?.[i]&&o.push(this.queryBuilder.buildTimeDimensionExpression(t.dimensions[i].sql,e.granularity,r))}return o}addJoinKeyGroupBy(e,t,n){if(n&&t.intermediateJoins){let n=t.intermediateJoins[0];n.primaryJoinColumn&&e(n.primaryJoinColumn)}else for(let n of t.joinKeys)n.targetColumnObj&&e(n.targetColumnObj);if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&e(t.sourceColumnObj)}buildCTEJoinCondition(e,t,n){let r=n.preAggregationCTEs?.find(t=>t.cube.name===e.cube.name);if(!r)throw Error(`CTE info not found for cube ${e.cube.name}`);let i=[];if(r.intermediateJoins&&r.intermediateJoins.length>0){let e=r.intermediateJoins[0],a=this.resolveCTEJoinSourceColumn(r.joinKeys[0],r,n),o=C`${C.identifier(t)}.${C.identifier(e.primaryJoinColumn.name)}`;i.push(E(a,o))}else for(let e of r.joinKeys){let a=this.resolveCTEJoinSourceColumn(e,r,n),o=C`${C.identifier(t)}.${C.identifier(e.targetColumn)}`;i.push(E(a,o))}return i.length===1?i[0]:D(...i)}resolveCTEJoinSourceColumn(e,t,n){if(!e)throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);let r=e.sourceColumnObj||C.identifier(e.sourceColumn);if(!e.sourceColumnObj||!n.preAggregationCTEs)return r;for(let r of n.preAggregationCTEs)if(r.cube.name!==t.cube.name){for(let[t,n]of Object.entries(r.cube.dimensions||{}))if(typeof n.sql!=`function`&&n.sql===e.sourceColumnObj)return C`${C.identifier(r.cteAlias)}.${C.identifier(t)}`}return r}buildPropagatingFilterSubquery(e,t){let n=e.sourceCube,r=n.sql(t),i=[];if(r.where&&i.push(r.where),e.preBuiltFilterSQL)i.push(e.preBuiltFilterSQL);else{let r={filters:e.filters},a=new Map([[n.name,n]]),o=this.queryBuilder.buildWhereConditions(a,r,t);i.push(...o)}if(i.length===0)return null;let a=i.length===1?i[0]:D(...i),o=e.joinConditions;if(o.length===1){let{source:e,target:n}=o[0],i=t.db.select({pk:e}).from(r.from);return i=Wn(i,r),i=i.where(a),C`${n} IN ${i}`}else{let e=D(...o.map(e=>E(e.source,e.target)),a),n=t.db.select({one:C`1`}).from(r.from);return n=Wn(n,r),n=n.where(e),C`EXISTS ${n}`}}};function Kn(e,t){let n=qn(e);return{measures:Yn(t,n),dimensions:Xn(t,n),segments:{},timeDimensions:Zn(t,n)}}function qn(e){let t=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&t.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let n of e.multiFactMerge.groups)n.queryPlan.primaryCube&&t.push(n.queryPlan.primaryCube),n.queryPlan.joinCubes?.length&&t.push(...n.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));return t}function Jn(e,t,n){return e.find(e=>e?.name===t)?.dimensions?.[n]}function Yn(e,t){let n={};if(!e.measures)return n;for(let r of e.measures){let[e,i]=r.split(`.`),a=t.find(t=>t?.name===e)?.measures?.[i];a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Xn(e,t){let n={};if(!e.dimensions)return n;for(let r of e.dimensions){let[e,i]=r.split(`.`),a=Jn(t,e,i);a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function Zn(e,t){let n={};if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e,i]=r.dimension.split(`.`),a=Jn(t,e,i);a&&(n[r.dimension]={title:a.title||i,shortTitle:a.title||i,type:a.type,granularity:r.granularity})}return n}function Qn(e){let t=new Date,n=e.toLowerCase().trim(),r=t.getUTCFullYear(),i=t.getUTCMonth(),a=t.getUTCDate(),o=t.getUTCDay();if(n===`today`){let e=new Date(t);e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`yesterday`){let e=new Date(t);e.setUTCDate(a-1),e.setUTCHours(0,0,0,0);let n=new Date(t);return n.setUTCDate(a-1),n.setUTCHours(23,59,59,999),{start:e,end:n}}if(n===`this week`){let e=o===0?-6:1-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`this month`)return{start:new Date(Date.UTC(r,i,1,0,0,0,0)),end:new Date(Date.UTC(r,i+1,0,23,59,59,999))};if(n===`this quarter`){let e=Math.floor(i/3);return{start:new Date(Date.UTC(r,e*3,1,0,0,0,0)),end:new Date(Date.UTC(r,e*3+3,0,23,59,59,999))}}if(n===`this year`)return{start:new Date(Date.UTC(r,0,1,0,0,0,0)),end:new Date(Date.UTC(r,11,31,23,59,59,999))};let s=n.match(/^last\s+(\d+)\s+days?$/);if(s){let e=parseInt(s[1],10),n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}let c=n.match(/^last\s+(\d+)\s+weeks?$/);if(c){let e=parseInt(c[1],10)*7,n=new Date(t);n.setUTCDate(a-e+1),n.setUTCHours(0,0,0,0);let r=new Date(t);return r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last week`){let e=o===0?-13:-6-o,n=new Date(t);n.setUTCDate(a+e),n.setUTCHours(0,0,0,0);let r=new Date(n);return r.setUTCDate(n.getUTCDate()+6),r.setUTCHours(23,59,59,999),{start:n,end:r}}if(n===`last month`)return{start:new Date(Date.UTC(r,i-1,1,0,0,0,0)),end:new Date(Date.UTC(r,i,0,23,59,59,999))};if(n===`last quarter`){let e=Math.floor(i/3),t=e===0?3:e-1,n=e===0?r-1:r;return{start:new Date(Date.UTC(n,t*3,1,0,0,0,0)),end:new Date(Date.UTC(n,t*3+3,0,23,59,59,999))}}if(n===`last year`)return{start:new Date(Date.UTC(r-1,0,1,0,0,0,0)),end:new Date(Date.UTC(r-1,11,31,23,59,59,999))};if(n===`last 12 months`){let e=new Date(Date.UTC(r,i-11,1,0,0,0,0)),n=new Date(t);return n.setUTCHours(23,59,59,999),{start:e,end:n}}let l=n.match(/^last\s+(\d+)\s+months?$/);if(l){let e=parseInt(l[1],10),n=new Date(Date.UTC(r,i-e+1,1,0,0,0,0)),a=new Date(t);return a.setUTCHours(23,59,59,999),{start:n,end:a}}let u=n.match(/^last\s+(\d+)\s+years?$/);if(u){let e=parseInt(u[1],10),n=new Date(Date.UTC(r-e,0,1,0,0,0,0)),i=new Date(t);return i.setUTCHours(23,59,59,999),{start:n,end:i}}return null}var $n=1e4;function er(e,t,n){let r=[],i=tr(new Date(e),n),a=tr(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=nr(i,n);return r}function tr(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCMilliseconds(0);break;case`minute`:n.setUTCSeconds(0,0);break;case`hour`:n.setUTCMinutes(0,0,0);break;case`day`:n.setUTCHours(0,0,0,0);break;case`week`:{let e=n.getUTCDay(),t=e===0?6:e-1;n.setUTCDate(n.getUTCDate()-t),n.setUTCHours(0,0,0,0);break}case`month`:n.setUTCDate(1),n.setUTCHours(0,0,0,0);break;case`quarter`:{let e=Math.floor(n.getUTCMonth()/3)*3;n.setUTCMonth(e,1),n.setUTCHours(0,0,0,0);break}case`year`:n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0);break}return n}function nr(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCSeconds(n.getUTCSeconds()+1);break;case`minute`:n.setUTCMinutes(n.getUTCMinutes()+1);break;case`hour`:n.setUTCHours(n.getUTCHours()+1);break;case`day`:n.setUTCDate(n.getUTCDate()+1);break;case`week`:n.setUTCDate(n.getUTCDate()+7);break;case`month`:n.setUTCMonth(n.getUTCMonth()+1);break;case`quarter`:n.setUTCMonth(n.getUTCMonth()+3);break;case`year`:n.setUTCFullYear(n.getUTCFullYear()+1);break}return n}function rr(e,t){let n=null;if(e instanceof Date)n=e;else if(typeof e==`string`){let t=new Date(e);isNaN(t.getTime())||(n=t)}return!n||isNaN(n.getTime())?null:tr(n,t).toISOString()}function ir(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function ar(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,dimensions:a}=t,o=er(i[0],i[1],r);if(o.length===0)return e;if(o.length>=1e4)return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${$n}-bucket limit. Returning unfilled data.`),e;let s=or(e,n,r,a),c=[];for(let[e,n]of s){let e=n.size>0?n.values().next().value:null;for(let r of o){let i=r.toISOString(),a=n.get(i);c.push(a??sr(i,e??null,t))}}return c}function or(e,t,n,r){let i=new Map;for(let a of e){let e=ir(a,r),o=rr(a[t],n)??String(a[t]),s=i.get(e);s||(s=new Map,i.set(e,s)),s.set(o,a)}return i.size===0&&r.length===0&&i.set(`__all__`,new Map),i}function sr(e,t,n){let{timeDimensionKey:r,fillValue:i,measures:a,dimensions:o}=n,s={[r]:e};if(t)for(let e of o)s[e]=t[e];for(let e of a)s[e]=i;return s}function cr(e){if(!e)return null;if(Array.isArray(e)){if(e.length<2)return null;let t=new Date(e[0]),n=new Date(e[1]);return isNaN(t.getTime())||isNaN(n.getTime())?null:[t,n]}let t=Qn(e);if(t)return[t.start,t.end];let n=new Date(e);return isNaN(n.getTime())?null:[n,n]}function lr(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let n=e.fillMissingDates!==!1,r=!!e.granularity,i=e.dateRange||ur(e.dimension,t.filters);return n&&r&&i});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let r=cr(e.dateRange)||dr(e.dimension,t.filters);if(!r)continue;let a={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:i,measures:n,dimensions:o};s=ar(s,a)}return s}function ur(e,t){if(!t)return null;for(let n of t){if(`member`in n&&`operator`in n&&n.member===e&&n.operator===`inDateRange`)return n;if(`and`in n&&n.and){let t=ur(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=ur(e,n.or);if(t)return t}}return null}function dr(e,t){let n=ur(e,t);if(!n)return null;if(n.dateRange){let e=cr(n.dateRange);if(e)return e}let r=n.values;if(!r||r.length===0)return null;if(r.length===1&&typeof r[0]==`string`){let e=Qn(r[0]);return e?[e.start,e.end]:cr(r)}return r.length>=2?cr(r):null}function fr(e,t,n){return lr(Array.isArray(e)?e.map(e=>{let r={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in r){let t=r[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=n.convertTimeDimensionResult(t),r[e.dimension]=t}}return r}):[e],t,t.measures||[])}var pr=class{queryBuilder;constructor(e){this.queryBuilder=e}preload(e,t,n,r){if(e.filters&&e.filters.length>0)for(let i of Nt(e.filters))this.preloadRegularFilter(i,t,n,r);if(e.timeDimensions)for(let i of e.timeDimensions)this.preloadTimeDimensionFilter(i,t,n,r)}resolveMemberDimension(e,t){let[n,r]=e.split(`.`),i=t.get(n);return i?i.dimensions?.[r]??null:null}preloadRegularFilter(e,t,n,r){let i=V(e);if(t.has(i))return;let a=this.resolveMemberDimension(e.member,n);if(!a||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(e.operator))return;let o=B(a,r),s=this.queryBuilder.buildFilterConditionPublic(o,e.operator,e.values,a,e.dateRange);s&&t.set(i,s)}preloadTimeDimensionFilter(e,t,n,r){if(!e.dateRange)return;let i=Mt(e.dimension,e.dateRange);if(t.has(i))return;let a=this.resolveMemberDimension(e.dimension,n);if(!a)return;let o=z(a.sql,r),s=this.queryBuilder.buildDateRangeCondition(o,e.dateRange);s&&t.set(i,s)}};function mr(t){return e.C(t)}function hr(t,n){let r=[],i=mr(n);if(i.length>1)return r.push(e.O(`server.validation.query.multipleQueryModes`,{modes:i.join(`, `)})),{isValid:!1,errors:r};if(i.length===1&&i[0]!==`comparison`)return gr(i[0],n,t,r),{isValid:r.length===0,errors:r};let a=new Set;if(xr(n,t,r,a),Sr(n,t,r,a),Cr(n,t,r,a),n.filters)for(let e of n.filters)kr(e,t,r,a);return a.size===0&&r.push(e.O(`server.validation.query.mustReferenceAtLeastOneCube`)),n.ungrouped&&Er(n,t,r,a),{isValid:r.length===0,errors:r}}function gr(e,t,n,r){e!==`comparison`&&(e===`funnel`?_r(t,n,r):e===`flow`?vr(t,n,r):e===`retention`&&yr(t,n,r))}function _r(t,n,r){let i=t.funnel.bindingKey;if(typeof i==`string`){let[t]=i.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:t}))}else if(Array.isArray(i))for(let t of i)n.has(t.cube)||r.push(e.O(`server.validation.query.funnelBindingKeyCubeNotFound`,{cubeName:t.cube}))}function vr(t,n,r){let i=t.flow.bindingKey;if(typeof i==`string`){let[t]=i.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.flowBindingKeyCubeNotFound`,{cubeName:t}))}}function yr(t,n,r){let i=t.retention,a=Ar(i.timeDimension);a&&!n.has(a)&&r.push(e.O(`server.validation.query.retentionCubeNotFound`,{cubeName:a}));let o=i.bindingKey;if(typeof o==`string`){let[t]=o.split(`.`);t&&!n.has(t)&&r.push(e.O(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:t}))}else if(Array.isArray(o))for(let t of o)n.has(t.cube)||r.push(e.O(`server.validation.query.retentionBindingKeyCubeNotFound`,{cubeName:t.cube}));if(i.breakdownDimensions&&Array.isArray(i.breakdownDimensions))for(let t of i.breakdownDimensions){let[i]=t.split(`.`);i&&!n.has(i)&&r.push(e.O(`server.validation.query.retentionBreakdownCubeNotFound`,{cubeName:i}))}}function br(e,t,n){return e===t?`. Did you mean one of: ${n.slice(0,5).map(e=>`'${t}.${e}'`).join(`, `)}?`:``}function xr(t,n,r,i){if(t.measures)for(let a of t.measures){let[t,o]=a.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidMeasureFormat`,{measure:a}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForMeasure`,{cubeName:t,measure:a}));continue}if(!s.measures[o]){let n=br(o,t,Object.keys(s.measures));r.push(e.O(`server.validation.query.measureNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function Sr(t,n,r,i){if(t.dimensions)for(let a of t.dimensions){let[t,o]=a.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidDimensionFormat`,{dimension:a}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForDimension`,{cubeName:t,dimension:a}));continue}if(!s.dimensions[o]){let n=br(o,t,Object.keys(s.dimensions));r.push(e.O(`server.validation.query.dimensionNotFound`,{fieldName:o,cubeName:t,hint:n}))}}}function Cr(t,n,r,i){if(t.timeDimensions)for(let a of t.timeDimensions){let[t,o]=a.dimension.split(`.`);if(!t||!o){r.push(e.O(`server.validation.query.invalidTimeDimensionFormat`,{dimension:a.dimension}));continue}i.add(t);let s=n.get(t);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForTimeDimension`,{cubeName:t,dimension:a.dimension}));continue}s.dimensions[o]||r.push(e.O(`server.validation.query.timeDimensionNotFound`,{fieldName:o,cubeName:t}))}}var wr=new Set([`count`,`countDistinct`,`countDistinctApprox`,`calculated`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`]),Tr=[`sum`,`avg`,`min`,`max`,`number`];function Er(t,n,r,i){t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0||r.push(e.O(`server.validation.query.ungroupedRequiresDimension`)),t.funnel&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFunnel`)),t.flow&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFlow`)),t.retention&&r.push(e.O(`server.validation.query.ungroupedIncompatibleRetention`)),t.timeDimensions?.some(e=>e.compareDateRange&&e.compareDateRange.length>0)&&r.push(e.O(`server.validation.query.ungroupedIncompatibleCompareDateRange`)),t.timeDimensions?.some(e=>e.fillMissingDates===!0)&&r.push(e.O(`server.validation.query.ungroupedIncompatibleFillMissingDates`)),Dr(t,n,r),Or(n,r,i)}function Dr(e,t,n){if(e.measures)for(let r of e.measures){let[e,i]=r.split(`.`),a=t.get(e)?.measures[i];a&&(wr.has(a.type)&&n.push(`Measure '${r}' has type '${a.type}' which is incompatible with ungrouped queries. Only ${Tr.join(`, `)} types are allowed.`),a.filters&&a.filters.length>0&&n.push(`Measure '${r}' has filters which are incompatible with ungrouped queries (measure filters require aggregation)`))}}function Or(e,t,n){for(let r of n){let i=e.get(r);if(i?.joins)for(let[a,o]of Object.entries(i.joins)){if(o.relationship!==`hasMany`)continue;let i=I(o.targetCube,e);i&&n.has(i.name)&&t.push(`Ungrouped queries are incompatible with hasMany relationships (${r} → ${a} is hasMany)`)}}}function kr(t,n,r,i){if(`and`in t||`or`in t){let e=t.and||t.or||[];for(let t of e)kr(t,n,r,i);return}if(!(`member`in t)){r.push(e.O(`server.validation.query.filterMustHaveMember`));return}let[a,o]=t.member.split(`.`);if(!a||!o){r.push(e.O(`server.validation.query.invalidFilterMemberFormat`,{member:t.member}));return}i.add(a);let s=n.get(a);if(!s){r.push(e.O(`server.validation.query.cubeNotFoundForFilter`,{cubeName:a,member:t.member}));return}if(!s.dimensions[o]&&!s.measures[o]){let t=o===a?`. Did you mean one of: ${[...Object.keys(s.dimensions),...Object.keys(s.measures)].slice(0,5).map(e=>`'${a}.${e}'`).join(`, `)}?`:``;r.push(e.O(`server.validation.query.filterFieldNotFound`,{fieldName:o,cubeName:a,hint:t}))}}function Ar(e){if(typeof e==`string`){let[t]=e.split(`.`);return t||null}return e.cube}var jr=class{builders;constructor(e){this.builders=e}resolveMode(t){let n=[];if(this.builders.comparison.hasComparison(t)&&n.push(`comparison`),this.builders.funnel.hasFunnel(t)&&n.push(`funnel`),this.builders.flow.hasFlow(t)&&n.push(`flow`),this.builders.retention.hasRetention(t)&&n.push(`retention`),n.length===0)return`regular`;if(n.length>1)throw Error(e.O(`server.errors.queryContainsMultipleModes`,{modes:n.join(`, `)}));return n[0]}validateForMode(t,n,r){let i=()=>{let t=hr(n,r);if(!t.isValid)throw Error(e.O(`server.errors.queryValidationFailed`,{errors:t.errors.join(`, `)}))};({regular:i,comparison:i,funnel:()=>{let t=this.builders.funnel.validateConfig(r.funnel,n);if(!t.isValid)throw Error(e.O(`server.errors.funnelValidationFailed`,{errors:t.errors.join(`, `)}))},flow:()=>{let t=this.builders.flow.validateConfig(r.flow,n);if(!t.isValid)throw Error(e.O(`server.errors.flowValidationFailed`,{errors:t.errors.join(`, `)}))},retention:()=>{let t=this.builders.retention.validateConfig(r.retention,n);if(!t.isValid)throw Error(e.O(`server.errors.retentionValidationFailed`,{errors:t.errors.join(`, `)}))}})[kt(t)]()}};function Mr(e,t,n={}){let r=n.keyPrefix??`drizzle-cube:`,i=Nr(e),a=`${r}query:${zr(JSON.stringify(i))}`;if(n.includeSecurityContext!==!1){let e=zr(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(Rr(t)));a+=`:ctx:${e}`}return a}function Nr(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?Q(e.filters):void 0,timeDimensions:e.timeDimensions?Lr(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?Rr(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,funnel:e.funnel?Pr(e.funnel):void 0,flow:e.flow?Fr(e.flow):void 0,retention:e.retention?Ir(e.retention):void 0}}function Pr(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?Q(e.filter):Q([e.filter])[0]:void 0,timeToConvert:e.timeToConvert};return`cube`in e&&e.cube&&(t.cube=e.cube),t}),includeTimeMetrics:e.includeTimeMetrics,globalTimeWindow:e.globalTimeWindow}}function Fr(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?Q(e.startingStep.filter):Q([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function Ir(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?Q(e.cohortFilters):Q([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?Q(e.activityFilters):Q([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function Q(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:Q(e.and)};if(`or`in e&&e.or)return{or:Q(e.or)};let t=e;return{...t,values:t.values?[...t.values].sort():t.values}}).sort((e,t)=>JSON.stringify(e).localeCompare(JSON.stringify(t)))}function Lr(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function Rr(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(Rr):Object.keys(e).sort().reduce((t,n)=>(t[n]=Rr(e[n]),t),{})}function zr(e){let t=2166136261,n=2246822519,r=3266489917,i=668265263,a=16777619;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=Math.imul(t^s,a)>>>0,n=Math.imul(n^s+o&65535,a)>>>0,r=Math.imul(r^(s^o&255),a)>>>0,i=Math.imul(i^s+Math.imul(o,131)&65535,a)>>>0}return t=(t^e.length)>>>0,t.toString(16).padStart(8,`0`)+n.toString(16).padStart(8,`0`)+r.toString(16).padStart(8,`0`)+i.toString(16).padStart(8,`0`)}var Br=class{cacheConfig;constructor(e){this.cacheConfig=e}generateKey(e,t){if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)return Mr(e,t,this.cacheConfig)}async lookup(e,t){if(!(!e||!this.cacheConfig?.provider)){if(t){this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:0});return}try{let t=Date.now(),n=await this.cacheConfig.provider.get(e);if(n)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:e,durationMs:Date.now()-t}),{...n.value,cache:n.metadata?{hit:!0,cachedAt:new Date(n.metadata.cachedAt).toISOString(),ttlMs:n.metadata.ttlMs,ttlRemainingMs:n.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:Date.now()-t})}catch(e){this.cacheConfig.onError?.(e,`get`)}}}async store(e,t){if(!(!e||!this.cacheConfig?.provider))try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}},Vr=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new G(e)}hasComparison(t){return e.w(t)}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/(1e3*60));case`hour`:return Math.floor((a-i)/(1e3*60*60));case`day`:return Math.floor((a-i)/(1e3*60*60*24));case`week`:return Math.floor((a-i)/(1e3*60*60*24*7));case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/(1e3*60*60*24))}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},Hr=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(e,this.dateTimeBuilder)}hasFunnel(t){return e.E(t)}validateConfig(t,n){let r=[];t.steps.length<2&&r.push(e.O(`server.validation.funnel.minSteps`)),this.validateBindingKey(t,n,r),this.validateTimeDimension(t,n,r);for(let e=0;e<t.steps.length;e++)this.validateStep(t,t.steps[e],e,n,r);return{isValid:r.length===0,errors:r}}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.O(`server.validation.funnel.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.funnel.bindingKeyCubeNotFound`,{cubeName:i}));return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.funnel.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.O(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateTimeDimension(t,n,r){if(typeof t.timeDimension!=`string`)return;let[i,a]=t.timeDimension.split(`.`);if(!i||!a){r.push(e.O(`server.validation.funnel.invalidTimeDimFormat`,{timeDimension:t.timeDimension}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.funnel.timeDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.funnel.timeDimCubeNotFound`,{cubeName:i}))}validateStep(t,n,r,i,a){n.name||a.push(e.O(`server.validation.funnel.stepMustHaveName`,{step:r})),`cube`in n&&n.cube&&!i.get(n.cube)&&a.push(e.O(`server.validation.funnel.stepCubeNotFound`,{step:r,cube:n.cube})),n.filter&&this.validateStepFilters(t,n,r,i,a),n.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(n.timeToConvert)||a.push(e.O(`server.validation.funnel.stepTimeToConvertFormat`,{step:r,value:n.timeToConvert})))}validateStepFilters(t,n,r,i,a){let o;`cube`in n&&n.cube?o=n.cube:typeof t.bindingKey==`string`&&([o]=t.bindingKey.split(`.`));let s=o?new kn(i):null,c=Array.isArray(n.filter)?n.filter:[n.filter];for(let t of c){if(!(`member`in t))continue;let[n,c]=t.member.split(`.`),l=i.get(n);if(!l){a.push(e.O(`server.validation.funnel.stepFilterCubeNotFound`,{step:r,cubeName:n}));continue}if(l.dimensions?.[c]||(l.measures?.[c]?a.push(e.O(`server.validation.funnel.stepFilterIsMeasure`,{step:r,member:`${n}.${c}`})):a.push(e.O(`server.validation.funnel.stepFilterMemberNotFound`,{step:r,field:c,cubeName:n}))),o&&n!==o&&s){let t=s.findPath(o,n);(!t||t.length===0)&&a.push(e.O(`server.validation.funnel.stepFilterNoJoinPath`,{step:r,member:`${n}.${c}`,stepCube:o}))}}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&this.applyTimeMetrics(c,n,e),r.push(c)}return r}applyTimeMetrics(e,t,n){let r=e=>t[e]===null?null:Number(t[e]);e.avgSecondsToConvert=r(`step_${n}_avg_seconds`),e.minSecondsToConvert=r(`step_${n}_min_seconds`),e.maxSecondsToConvert=r(`step_${n}_max_seconds`),t[`step_${n}_median_seconds`]!==void 0&&(e.medianSecondsToConvert=r(`step_${n}_median_seconds`)),t[`step_${n}_p90_seconds`]!==void 0&&(e.p90SecondsToConvert=r(`step_${n}_p90_seconds`))}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{let n=J(e);if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(n)for(let e of n.filters)r(e);else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(e,t,n){let r=new kn(t);return e.steps.map((i,a)=>{let o=this.resolveCubeForStep(i,e,t),s=this.resolveBindingKey(e,o,n),c=this.resolveTimeDimension(e,o,n),l=this.buildStepFilters(i,o,t,n),u=this.extractFilterCubeNames(i),d=[];for(let e of u)if(e!==o.name){let n=t.get(e);if(n){let t=r.findPath(o.name,e);t&&t.length>0&&d.push({cube:n,joinPath:t})}}return{name:i.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:i.timeToConvert,joinedCubes:d}})}resolveCubeForStep(t,n,r){if(`cube`in t&&t.cube){let n=r.get(t.cube);if(!n)throw Error(e.O(`server.errors.funnel.cubeNotFoundForStep`,{cube:t.cube}));return n}if(typeof n.bindingKey==`string`){let[t]=n.bindingKey.split(`.`),i=r.get(t);if(!i)throw Error(e.O(`server.errors.funnel.cubeNotFoundForBindingKey`,{bindingKey:n.bindingKey}));return i}throw Error(e.O(`server.errors.funnel.cannotResolveCubeForStep`))}resolveBindingKey(e,t,n){return pn(e.bindingKey,t,n,dn(`server.errors.funnel`))}resolveTimeDimension(e,t,n){return mn(e.timeDimension,t,n,`server.errors.funnel`)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=J(e);return i||a?this.buildLogicalFilterCondition(e,a,t,n,r):this.buildSimpleFilterCondition(e,t,n,r)}buildLogicalFilterCondition(e,t,n,r,i){let a,o;if(t)a=t.isAnd,o=t.filters;else{let t=e;a=`and`in t&&!!t.and,o=t.and||t.or||[]}let s=[];for(let e of o){let t=this.buildFilterCondition(e,n,r,i);t&&s.push(t)}return s.length===0?null:s.length===1?s[0]:a?D(...s):C`(${C.join(s,C` OR `)})`}buildSimpleFilterCondition(e,t,n,r){let[i,a]=e.member.split(`.`),o=e.dateRange!==void 0;if(e.operator!==`set`&&e.operator!==`notSet`&&!o&&(!e.values||e.values.length===0||e.values[0]===void 0||e.values[0]===``))return null;let s=n.get(i);if(!s)return null;if(i!==t.name){let e=new kn(n).findPath(t.name,i);if(!e||e.length===0)return null}let c=s.dimensions?.[a];if(!c)return null;let l=B(c,r);return this.filterBuilder.buildFilterCondition(l,e.operator,e.values||[],c,e.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(e,t){let n=`step_${e.index}`,r=e.cube.sql(t),i=[];r.where&&i.push(r.where),i.push(...e.filterConditions);let a=t.db.select({binding_key:C`${e.bindingKeyExpr}`.as(`binding_key`),step_time:C`MIN(${e.timeExpr})`.as(`step_time`)}).from(r.from);return a=this.addCrossJoinsToQuery(a,e,t,i),i.length>0&&(a=a.where(q(i))),a=a.groupBy(e.bindingKeyExpr),t.db.$with(n).as(a)}buildSubsequentStepCTE(e,t,n){let r=`step_${e.index}`,i=`step_${e.index-1}`,a=e.cube.sql(t),o=[];a.where&&o.push(a.where),o.push(...e.filterConditions);let s=C`${C.identifier(i)}.step_time`,c=C`${e.timeExpr} > ${s}`;if(e.timeToConvert){let t=this.databaseAdapter.buildDateAddInterval(s,e.timeToConvert);c=C`${c} AND ${e.timeExpr} <= ${t}`}o.push(c);let l=t.db.select({binding_key:C`${e.bindingKeyExpr}`.as(`binding_key`),step_time:C`MIN(${e.timeExpr})`.as(`step_time`)}).from(a.from).innerJoin(n,C`${e.bindingKeyExpr} = ${C.identifier(i)}.binding_key`);return l=this.addCrossJoinsToQuery(l,e,t,o),o.length>0&&(l=l.where(q(o))),l=l.groupBy(e.bindingKeyExpr),t.db.$with(r).as(l)}addCrossJoinsToQuery(e,t,n,r){if(t.joinedCubes.length===0)return e;for(let i of t.joinedCubes)for(let t of i.joinPath){let a=t.joinDef,o=[];for(let e of a.on)e.as?o.push(e.as(e.source,e.target)):o.push(E(e.source,e.target));let s=q(o),c=i.cube.sql(n);e=e.leftJoin(c.from,s),c.where&&r.push(c.where)}return e}buildFunnelResultsCTE(e,t,n,r){let i={binding_key:C`s0.binding_key`,step_0_time:C`s0.step_time`};for(let e=1;e<t.length;e++)i[`step_${e}_time`]=C`s${C.raw(String(e))}.step_time`;let a=C`${C.identifier(`step_0`)} s0`;for(let e=1;e<t.length;e++)a=C`${a}
|
|
63
|
+
LEFT JOIN ${C.identifier(`step_${e}`)} s${C.raw(String(e))} ON s0.binding_key = s${C.raw(String(e))}.binding_key`;let o=Object.entries(i).map(([e,t])=>C`${t} AS ${C.identifier(e)}`),s=C`SELECT ${C.join(o,C`, `)} FROM ${a}`;return r.db.$with(`funnel_joined`).as(s)}buildAggregationCTE(e,t,n,r,i){let a={};a.step_0_count=C`COUNT(*)`.as(`step_0_count`);for(let e=1;e<n.length;e++)a[`step_${e}_count`]=C`COUNT(${C.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);if(r.includeTimeMetrics)for(let e=1;e<n.length;e++){let t=C.identifier(`step_${e}_time`),n=C.identifier(`step_${e-1}_time`),r=this.databaseAdapter.buildTimeDifferenceSeconds(C`${t}`,C`${n}`),i=C`${t} IS NOT NULL`;if(a[`step_${e}_avg_seconds`]=this.databaseAdapter.buildConditionalAggregation(`avg`,r,i).as(`step_${e}_avg_seconds`),a[`step_${e}_min_seconds`]=this.databaseAdapter.buildConditionalAggregation(`min`,r,i).as(`step_${e}_min_seconds`),a[`step_${e}_max_seconds`]=this.databaseAdapter.buildConditionalAggregation(`max`,r,i).as(`step_${e}_max_seconds`),this.databaseAdapter.getCapabilities().supportsPercentileSubqueries){let n=this.databaseAdapter.buildPercentile(r,50);n&&(a[`step_${e}_median_seconds`]=C`(SELECT ${n} FROM ${C.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));let i=this.databaseAdapter.buildPercentile(r,90);i&&(a[`step_${e}_p90_seconds`]=C`(SELECT ${i} FROM ${C.identifier(`funnel_joined`)} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`))}}let o=i.db.select(a).from(e);return i.db.$with(`funnel_metrics`).as(o)}},Ur=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(e,this.dateTimeBuilder)}hasFlow(t){return e.T(t)}validateConfig(t,n){let r=[],i=[],a=this.databaseAdapter.getEngineType(),o=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;return a===`sqlite`?(r.push(e.O(`server.validation.flow.sqliteNotSupported`)),{isValid:!1,errors:r,warnings:i}):(this.validateBindingKey(t,n,r),typeof t.timeDimension==`string`&&this.validateMemberDimension(t.timeDimension,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidTimeDimFormat`,{timeDimension:t.timeDimension}),cubeNotFound:t=>e.O(`server.validation.flow.timeDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.timeDimNotFound`,{dimName:t,cubeName:n})}),t.eventDimension?this.validateMemberDimension(t.eventDimension,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidEventDimFormat`,{eventDimension:t.eventDimension}),cubeNotFound:t=>e.O(`server.validation.flow.eventDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.eventDimNotFound`,{dimName:t,cubeName:n})}):r.push(e.O(`server.validation.flow.eventDimRequired`)),this.validateStartingStep(t,r,i),this.validateDepthBounds(t,r,i),this.validateJoinStrategy(t,o,r),{isValid:r.length===0,errors:r,warnings:i})}validateMemberDimension(e,t,n,r){let[i,a]=e.split(`.`);if(!i||!a){n.push(r.invalidFormat());return}let o=t.get(i);o?o.dimensions?.[a]||n.push(r.dimNotFound(a,i)):n.push(r.cubeNotFound(i))}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){this.validateMemberDimension(t.bindingKey,n,r,{invalidFormat:()=>e.O(`server.validation.flow.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}),cubeNotFound:t=>e.O(`server.validation.flow.bindingKeyCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.O(`server.validation.flow.bindingKeyDimNotFound`,{dimName:t,cubeName:n})});return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.flow.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.O(`server.validation.flow.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateStartingStep(t,n,r){if(!t.startingStep){n.push(e.O(`server.validation.flow.startingStepRequired`));return}t.startingStep.filter||n.push(e.O(`server.validation.flow.startingStepFilterRequired`)),t.startingStep.name||r.push(e.O(`server.validation.flow.startingStepNameMissing`))}validateDepthBounds(t,n,r){(t.stepsBefore<0||t.stepsBefore>5)&&n.push(e.O(`server.validation.flow.stepsBeforeRange`,{value:t.stepsBefore})),(t.stepsAfter<0||t.stepsAfter>5)&&n.push(e.O(`server.validation.flow.stepsAfterRange`,{value:t.stepsAfter})),(t.stepsBefore>=4||t.stepsAfter>=4)&&r.push(e.O(`server.validation.flow.highStepDepthWarning`))}validateJoinStrategy(t,n,r){t.joinStrategy&&![`auto`,`lateral`,`window`].includes(t.joinStrategy)?r.push(e.O(`server.validation.flow.invalidJoinStrategy`,{joinStrategy:t.joinStrategy})):t.joinStrategy===`lateral`&&!n&&r.push(e.O(`server.validation.flow.lateralNotSupported`))}buildFlowQuery(t,n,r){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(e.O(`server.validation.flow.sqliteNotSupported`));let i=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,a=t.joinStrategy??`auto`,o=a===`lateral`||a===`auto`&&i;if(a===`lateral`&&!i)throw Error(e.O(`server.validation.flow.lateralNotSupportedExec`));let s={...t,stepsBefore:t.outputMode===`sunburst`?0:t.stepsBefore},c=this.resolveFlowConfig(s,n,r),l=[],u=this.buildStartingEntitiesCTE(s,c,r);l.push(u);let d=o?this.buildDirectionalCTEsLateral(`before`,s,c,r):this.buildDirectionalCTEsWindow(`before`,s,c,r);l.push(...d);let f=o?this.buildDirectionalCTEsLateral(`after`,s,c,r):this.buildDirectionalCTEsWindow(`after`,s,c,r);l.push(...f);let p=this.buildNodesAggregationCTE(s,r);l.push(p);let m=this.buildLinksAggregationCTE(s,r);l.push(m);let h=this.buildFinalResultCTE(r);return l.push(h),r.db.with(...l).select().from(h)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(t,n){let r;if(typeof t.bindingKey==`string`)[r]=t.bindingKey.split(`.`);else if(Array.isArray(t.bindingKey)&&t.bindingKey.length>0)r=t.bindingKey[0].cube;else throw Error(e.O(`server.errors.flow.cannotResolveCube`));let i=n.get(r);if(!i)throw Error(e.O(`server.errors.flow.cubeNotFound`,{cubeName:r}));return i}resolveBindingKey(e,t,n){return pn(e.bindingKey,t,n,dn(`server.errors.flow`))}resolveTimeDimension(e,t,n){return mn(e.timeDimension,t,n,`server.errors.flow`)}resolveEventDimension(t,n,r){let[,i]=t.eventDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e.O(`server.errors.flow.eventDimNotFound`,{eventDimension:t.eventDimension}));return z(a.sql,r)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(e,t,n){if(`and`in e||`or`in e){let r=e,i=r.and||r.or||[],a=this.buildSubConditions(i,t,n);return this.combineConditions(a,`and`in e)}let r=J(e);if(r){let e=this.buildSubConditions(r.filters,t,n);return this.combineConditions(e,r.isAnd)}let i=e,[,a]=i.member.split(`.`),o=t.dimensions?.[a];if(!o)return null;let s=B(o,n);return this.filterBuilder.buildFilterCondition(s,i.operator,i.values||[],o,i.dateRange)}buildSubConditions(e,t,n){let r=[];for(let i of e){let e=this.buildFilterCondition(i,t,n);e&&r.push(e)}return r}combineConditions(e,t){return e.length===0?null:e.length===1?e[0]:t?D(...e):C`(${C.join(e,C` OR `)})`}buildStartingEntitiesCTE(e,t,n){let{cubeBase:r,bindingKeyExpr:i,timeExpr:a,eventExpr:o,startingStepFilters:s}=t,c=[];r.where&&c.push(r.where),c.push(...s);let l=n.db.select({binding_key:C`${i}`.as(`binding_key`),start_time:C`MIN(${a})`.as(`start_time`),event_type:C`${o}`.as(`event_type`),event_path:C`${o}`.as(`event_path`)}).from(r.from);return c.length>0&&(l=l.where(q(c))),l=l.groupBy(i,o),e.entityLimit&&(l=l.limit(e.entityLimit)),n.db.$with(`starting_entities`).as(l)}buildDirectionalCTEsLateral(e,t,n,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s}=n,c=[],l=t.outputMode===`sunburst`,u=e===`before`,d=u?t.stepsBefore:t.stepsAfter,f=u?C`<`:C`>`,p=u?C`DESC`:C`ASC`;for(let t=1;t<=d;t++){let n=t===1?`starting_entities`:`${e}_step_${t-1}`,d=t===1?`start_time`:`step_time`,m=`${e}_step_${t}`,h=[];i.where&&h.push(i.where),h.push(C`${a} = ${C.identifier(n)}.binding_key`,C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);let g=q(h),_=l?u?C`${s} || ${`→`} || ${C.identifier(n)}.event_path`:C`${C.identifier(n)}.event_path || ${`→`} || ${s}`:C`${s}`,v=r.db.select({binding_key:C`${a}`.as(`binding_key`),step_time:C`${o}`.as(`step_time`),event_type:C`${s}`.as(`event_type`),event_path:_.as(`event_path`)}).from(i.from).where(g).orderBy(C`${o} ${p}`).limit(1),y=r.db.$with(m).as(r.db.select({binding_key:C`e.binding_key`.as(`binding_key`),step_time:C`e.step_time`.as(`step_time`),event_type:C`e.event_type`.as(`event_type`),event_path:C`e.event_path`.as(`event_path`)}).from(C`${C.identifier(n)}`).crossJoinLateral(v.as(`e`)));c.push(y)}return c}buildDirectionalCTEsWindow(e,t,n,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s}=n,c=[],l=t.outputMode===`sunburst`,u=e===`before`,d=u?t.stepsBefore:t.stepsAfter,f=u?C`<`:C`>`,p=u?C`DESC`:C`ASC`;for(let t=1;t<=d;t++){let n=t===1?`starting_entities`:`${e}_step_${t-1}`,d=t===1?`start_time`:`step_time`,m=`${e}_step_${t}`,h=[];i.where&&h.push(i.where),h.push(C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);let g=q(h),_=l?u?C`${s} || ${`→`} || ${C.identifier(n)}.event_path`:C`${C.identifier(n)}.event_path || ${`→`} || ${s}`:C`${s}`,v=r.db.select({binding_key:C`${a}`.as(`binding_key`),step_time:C`${o}`.as(`step_time`),event_type:C`${s}`.as(`event_type`),event_path:_.as(`event_path`),rn:C`ROW_NUMBER() OVER (PARTITION BY ${a} ORDER BY ${o} ${p})`.as(`rn`)}).from(i.from).innerJoin(C`${C.identifier(n)}`,C`${a} = ${C.identifier(n)}.binding_key`).where(g),y=r.db.select({binding_key:C`binding_key`.as(`binding_key`),step_time:C`step_time`.as(`step_time`),event_type:C`event_type`.as(`event_type`),event_path:C`event_path`.as(`event_path`)}).from(v.as(`ranked`)).where(C`rn = 1`);c.push(r.db.$with(m).as(y))}return c}buildNodeArm(e,t,n,r){let i=C.raw(`'${e}_'`),a=C.raw(String(t)),o=C.identifier(n);return r?C`
|
|
64
|
+
SELECT
|
|
65
|
+
${i} || event_path AS node_id,
|
|
66
|
+
event_type AS name,
|
|
67
|
+
${a} AS layer,
|
|
68
|
+
COUNT(*) AS value
|
|
69
|
+
FROM ${o}
|
|
70
|
+
GROUP BY event_path, event_type
|
|
71
|
+
`:C`
|
|
72
|
+
SELECT
|
|
73
|
+
${i} || event_type AS node_id,
|
|
74
|
+
event_type AS name,
|
|
75
|
+
${a} AS layer,
|
|
76
|
+
COUNT(*) AS value
|
|
77
|
+
FROM ${o}
|
|
78
|
+
GROUP BY event_type
|
|
79
|
+
`}buildAdjacentLinkArm(e,t,n,r,i){let a=C.raw(`'${e}_'`),o=C.raw(`'${t}_'`),s=C.identifier(n),c=C.identifier(r);return i?C`
|
|
80
|
+
SELECT
|
|
81
|
+
${a} || f.event_path AS source_id,
|
|
82
|
+
${o} || t.event_path AS target_id,
|
|
83
|
+
COUNT(*) AS value
|
|
84
|
+
FROM ${s} f
|
|
85
|
+
INNER JOIN ${c} t ON f.binding_key = t.binding_key
|
|
86
|
+
GROUP BY f.event_path, t.event_path
|
|
87
|
+
`:C`
|
|
88
|
+
SELECT
|
|
89
|
+
${a} || f.event_type AS source_id,
|
|
90
|
+
${o} || t.event_type AS target_id,
|
|
91
|
+
COUNT(*) AS value
|
|
92
|
+
FROM ${s} f
|
|
93
|
+
INNER JOIN ${c} t ON f.binding_key = t.binding_key
|
|
94
|
+
GROUP BY f.event_type, t.event_type
|
|
95
|
+
`}buildNodesAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=1;t--)n.push(this.buildNodeArm(`before_${t}`,-t,`before_step_${t}`,r));n.push(C`
|
|
96
|
+
SELECT
|
|
97
|
+
${C.raw(`'start_'`)} || event_type AS node_id,
|
|
98
|
+
event_type AS name,
|
|
99
|
+
0 AS layer,
|
|
100
|
+
COUNT(*) AS value
|
|
101
|
+
FROM starting_entities
|
|
102
|
+
GROUP BY event_type
|
|
103
|
+
`);for(let t=1;t<=e.stepsAfter;t++)n.push(this.buildNodeArm(`after_${t}`,t,`after_step_${t}`,r));let i=C.join(n,C` UNION ALL `),a=t.db.select({node_id:C`node_id`.as(`node_id`),name:C`name`.as(`name`),layer:C`layer`.as(`layer`),value:C`value`.as(`value`)}).from(C`(${i}) AS nodes_union`);return t.db.$with(`nodes_agg`).as(a)}buildLinksAggregationCTE(e,t){let n=[],r=e.outputMode===`sunburst`;for(let t=e.stepsBefore;t>=2;t--)n.push(this.buildAdjacentLinkArm(`before_${t}`,`before_${t-1}`,`before_step_${t}`,`before_step_${t-1}`,r));e.stepsBefore>=1&&(r?n.push(C`
|
|
104
|
+
SELECT
|
|
105
|
+
${C.raw(`'before_1_'`)} || b.event_path AS source_id,
|
|
106
|
+
${C.raw(`'start_'`)} || s.event_type AS target_id,
|
|
107
|
+
COUNT(*) AS value
|
|
108
|
+
FROM before_step_1 b
|
|
109
|
+
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
110
|
+
GROUP BY b.event_path, s.event_type
|
|
111
|
+
`):n.push(C`
|
|
112
|
+
SELECT
|
|
113
|
+
${C.raw(`'before_1_'`)} || b.event_type AS source_id,
|
|
114
|
+
${C.raw(`'start_'`)} || s.event_type AS target_id,
|
|
115
|
+
COUNT(*) AS value
|
|
116
|
+
FROM before_step_1 b
|
|
117
|
+
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
118
|
+
GROUP BY b.event_type, s.event_type
|
|
119
|
+
`)),e.stepsAfter>=1&&(r?n.push(C`
|
|
120
|
+
SELECT
|
|
121
|
+
${C.raw(`'start_'`)} || s.event_type AS source_id,
|
|
122
|
+
${C.raw(`'after_1_'`)} || a.event_path AS target_id,
|
|
123
|
+
COUNT(*) AS value
|
|
124
|
+
FROM starting_entities s
|
|
125
|
+
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
126
|
+
GROUP BY s.event_type, a.event_path
|
|
127
|
+
`):n.push(C`
|
|
128
|
+
SELECT
|
|
129
|
+
${C.raw(`'start_'`)} || s.event_type AS source_id,
|
|
130
|
+
${C.raw(`'after_1_'`)} || a.event_type AS target_id,
|
|
131
|
+
COUNT(*) AS value
|
|
132
|
+
FROM starting_entities s
|
|
133
|
+
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
134
|
+
GROUP BY s.event_type, a.event_type
|
|
135
|
+
`));for(let t=1;t<e.stepsAfter;t++)n.push(this.buildAdjacentLinkArm(`after_${t}`,`after_${t+1}`,`after_step_${t}`,`after_step_${t+1}`,r));if(n.length===0){let e=t.db.select({source_id:C`NULL`.as(`source_id`),target_id:C`NULL`.as(`target_id`),value:C`0`.as(`value`)}).from(C`(SELECT 1) AS empty`).where(C`1 = 0`);return t.db.$with(`links_agg`).as(e)}let i=C.join(n,C` UNION ALL `),a=t.db.select({source_id:C`source_id`.as(`source_id`),target_id:C`target_id`.as(`target_id`),value:C`value`.as(`value`)}).from(C`(${i}) AS links_union`);return t.db.$with(`links_agg`).as(a)}buildFinalResultCTE(e){let t=C`
|
|
136
|
+
SELECT
|
|
137
|
+
'node' AS record_type,
|
|
138
|
+
node_id AS id,
|
|
139
|
+
name AS name,
|
|
140
|
+
layer AS layer,
|
|
141
|
+
value AS value,
|
|
142
|
+
NULL AS source_id,
|
|
143
|
+
NULL AS target_id
|
|
144
|
+
FROM nodes_agg
|
|
145
|
+
UNION ALL
|
|
146
|
+
SELECT
|
|
147
|
+
'link' AS record_type,
|
|
148
|
+
NULL AS id,
|
|
149
|
+
NULL AS name,
|
|
150
|
+
NULL AS layer,
|
|
151
|
+
value AS value,
|
|
152
|
+
source_id AS source_id,
|
|
153
|
+
target_id AS target_id
|
|
154
|
+
FROM links_agg
|
|
155
|
+
WHERE source_id IS NOT NULL
|
|
156
|
+
`,n=e.db.select({record_type:C`record_type`.as(`record_type`),id:C`id`.as(`id`),name:C`name`.as(`name`),layer:C`layer`.as(`layer`),value:C`value`.as(`value`),source_id:C`source_id`.as(`source_id`),target_id:C`target_id`.as(`target_id`)}).from(C`(${t}) AS final_union`);return e.db.$with(`final_result`).as(n)}};function Wr(e){return Array.isArray(e)}function Gr(e){return typeof e==`object`&&!!e&&`cube`in e}function Kr(e){if(Gr(e))return e.cube;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(0,t)}function qr(e){if(Gr(e))return e.dimension;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(t+1)}var Jr={noMapping:({cubeName:t})=>e.O(`server.validation.retention.noBindingKeyMapping`,{cubeName:t}),cubeNotFound:({cubeName:t})=>e.O(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:t}),keyDimNotFound:({bindingKey:t,cubeName:n})=>e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n}),mappingDimNotFound:({dimension:t,cubeName:n})=>e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n})},Yr=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new G(e),this.filterBuilder=new Y(e,this.dateTimeBuilder)}hasRetention(t){return e.D(t)}validateConfig(t,n){let r=[],i=this.databaseAdapter.getEngineType();return(i===`sqlite`||i===`mysql`||i===`singlestore`)&&r.push(e.O(`server.validation.retention.engineNotSupported`,{engine:i})),this.validateTimeDimension(t,n,r),this.validateBindingKey(t,n,r),this.validateBreakdownDimensions(t,n,r),this.validatePeriodsAndEnums(t,r),this.validateDateRange(t,r),{isValid:r.length===0,errors:r}}validateTimeDimension(t,n,r){try{let i=Kr(t.timeDimension),a=qr(t.timeDimension),o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.timeDimNotFound`,{dimName:a})):r.push(e.O(`server.validation.retention.cubeNotFound`,{cubeName:i}))}catch{r.push(e.O(`server.validation.retention.invalidTimeDimFormat`,{timeDimension:t.timeDimension}))}}validateBindingKey(t,n,r){if(Wr(t.bindingKey)){for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.O(`server.validation.retention.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let a=un(i.dimension);t.dimensions?.[a]||r.push(e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}return}let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.O(`server.validation.retention.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.O(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:i}))}validateBreakdownDimensions(t,n,r){if(!(!t.breakdownDimensions||t.breakdownDimensions.length===0))for(let i of t.breakdownDimensions){let[t,a]=i.split(`.`);if(!t||!a){r.push(e.O(`server.validation.retention.invalidBreakdownDimFormat`,{dimension:i}));continue}let o=n.get(t);o?o.dimensions?.[a]||r.push(e.O(`server.validation.retention.breakdownDimNotFound`,{dimName:a,cubeName:t})):r.push(e.O(`server.validation.retention.breakdownDimCubeNotFound`,{cubeName:t}))}}validatePeriodsAndEnums(t,n){t.periods<1&&n.push(e.O(`server.validation.retention.periodsMin`)),t.periods>52&&n.push(e.O(`server.validation.retention.periodsMax`)),[`day`,`week`,`month`].includes(t.granularity)||n.push(e.O(`server.validation.retention.invalidGranularity`,{granularity:t.granularity})),[`classic`,`rolling`].includes(t.retentionType)||n.push(e.O(`server.validation.retention.invalidRetentionType`,{retentionType:t.retentionType}))}validateDateRange(t,n){if(!t.dateRange){n.push(e.O(`server.validation.retention.dateRangeRequired`));return}if(t.dateRange.start?isNaN(new Date(t.dateRange.start).getTime())&&n.push(e.O(`server.validation.retention.dateRangeInvalidStart`)):n.push(e.O(`server.validation.retention.dateRangeStartRequired`)),t.dateRange.end?isNaN(new Date(t.dateRange.end).getTime())&&n.push(e.O(`server.validation.retention.dateRangeInvalidEnd`)):n.push(e.O(`server.validation.retention.dateRangeEndRequired`)),t.dateRange.start&&t.dateRange.end){let r=new Date(t.dateRange.start),i=new Date(t.dateRange.end);!isNaN(r.getTime())&&!isNaN(i.getTime())&&r>i&&n.push(e.O(`server.validation.retention.dateRangeStartBeforeEnd`))}}buildRetentionQuery(e,t,n){let r=this.resolveConfig(e,t,n),i=r.breakdowns.length,a=this.buildCohortBaseCTE(e,r,n),o=this.buildActivityPeriodsCTE(e,r,n),s=this.buildCohortSizesCTE(e,n,i),c=this.buildRetentionCountsCTE(e,n,i),l=r.breakdowns.length>0,u={period:C`rc.period_number`.as(`period`),cohort_size:C`cs.cohort_size`.as(`cohort_size`),retained_users:C`rc.retained_users`.as(`retained_users`),retention_rate:C`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as(`retention_rate`)};for(let e=0;e<r.breakdowns.length;e++)u[`breakdown_${e}`]=C.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);let d=n.db.with(a,o,s,c).select(u).from(C`retention_counts rc`);if(l){let e=r.breakdowns.map((e,t)=>C`COALESCE(CAST(rc.breakdown_${C.raw(String(t))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${C.raw(String(t))} AS TEXT), '')`),t=e.length===1?e[0]:C.join(e,C` AND `);d=d.innerJoin(C`cohort_sizes cs`,t)}else d=d.innerJoin(C`cohort_sizes cs`,C`1 = 1`);let f=[];for(let e=0;e<r.breakdowns.length;e++)f.push(C.raw(`rc.breakdown_${e}`));return f.push(C`rc.period_number`),d=d.orderBy(...f),d}transformResult(e,t){let n=t.breakdownDimensions||[],r=Math.min(n.length,100),i=r>0;return e.map(e=>{let t={period:Number(e.period),cohortSize:Number(e.cohort_size),retainedUsers:Number(e.retained_users),retentionRate:e.retention_rate===null?0:Number(e.retention_rate)};if(i){let i={};for(let t=0;t<r;t++){let r=n[t],a=e[`breakdown_${t}`];i[r]=a===void 0?null:String(a)}t.breakdownValues=i}return t})}resolveConfig(t,n,r){let i=Kr(t.timeDimension),a=qr(t.timeDimension),o=n.get(i);if(!o)throw Error(e.O(`server.validation.retention.cubeNotFound`,{cubeName:i}));let s=o.dimensions?.[a];if(!s)throw Error(e.O(`server.validation.retention.timeDimNotFound`,{dimName:a}));let c=z(s.sql,r),l=pn(t.bindingKey,o,r,Jr,n),u=this.buildFilterConditions(t.cohortFilters,o,n,r),d=this.buildFilterConditions(t.activityFilters,o,n,r),f=[];if(t.breakdownDimensions&&t.breakdownDimensions.length>0)for(let e of t.breakdownDimensions){let[t,i]=e.split(`.`),a=n.get(t);if(a&&a.dimensions?.[i]){let t=z(a.dimensions[i].sql,r);f.push({dimension:e,expr:t})}}return{cube:o,bindingKeyExpr:l,timeExpr:c,cohortFilterConditions:u,activityFilterConditions:d,breakdowns:f}}buildFilterConditions(e,t,n,r){if(!e)return[];let i=Array.isArray(e)?e:[e],a=[];for(let e of i){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildSingleFilterCondition(e,t,n,r){if(`and`in e||`or`in e){let i=e,a=[],o=`and`in i&&!!i.and,s=i.and||i.or||[];for(let e of s){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a.length===0?null:a.length===1?a[0]:o?D(...a):C`(${C.join(a,C` OR `)})`}let i=e,[a,o]=i.member.split(`.`),s=n.get(a);if(!s)return null;let c=s.dimensions?.[o];if(!c)return null;let l=B(c,r);return this.filterBuilder.buildFilterCondition(l,i.operator,i.values||[],c,i.dateRange)}buildCohortBaseCTE(e,t,n){let r=t.cube.sql(n),i=[];if(r.where&&i.push(r.where),i.push(...t.cohortFilterConditions),e.dateRange){let n=this.buildDateRangeCondition(t.timeExpr,e.dateRange);i.push(n)}let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o={binding_key:C`${t.bindingKeyExpr}`.as(`binding_key`),cohort_entry:C`MIN(${a})`.as(`cohort_entry`)};for(let e=0;e<t.breakdowns.length;e++){let{expr:n}=t.breakdowns[e];o[`breakdown_${e}`]=C`MIN(${n})`.as(`breakdown_${e}`)}let s=n.db.select(o).from(r.from);i.length>0&&(s=s.where(q(i)));let c=[t.bindingKeyExpr];for(let e=0;e<t.breakdowns.length;e++)c.push(t.breakdowns[e].expr);if(s=s.groupBy(...c),e.dateRange){let t=this.buildDateRangeHavingCondition(a,e.dateRange);s=s.having(t)}return n.db.$with(`cohort_base`).as(s)}buildDateRangeCondition(e,t){return C`${e} >= ${this.databaseAdapter.castToType(C`${t.start}`,`timestamp`)} AND ${e} < ${this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`,`timestamp`),`P1D`)}`}buildDateRangeHavingCondition(e,t){return C`MIN(${e}) >= ${this.databaseAdapter.castToType(C`${t.start}`,`timestamp`)} AND MIN(${e}) < ${this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`,`timestamp`),`P1D`)}`}buildActivityPeriodsCTE(e,t,n){let r=t.cube.sql(n),i=[];r.where&&i.push(r.where),i.push(...t.activityFilterConditions),i.push(C`${t.timeExpr} >= cohort_base.cohort_entry`);let a=this.databaseAdapter.buildTimeDimension(e.granularity,t.timeExpr),o=this.buildPeriodNumberExpression(C`cohort_base.cohort_entry`,a,e.granularity),s={binding_key:C`cohort_base.binding_key`.as(`binding_key`),period_number:o.as(`period_number`)};for(let e=0;e<t.breakdowns.length;e++)s[`breakdown_${e}`]=C.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);let c=n.db.select(s).from(r.from).innerJoin(C`cohort_base`,C`${t.bindingKeyExpr} = cohort_base.binding_key`);i.length>0&&(c=c.where(q(i)));let l=[C`cohort_base.binding_key`,o];for(let e=0;e<t.breakdowns.length;e++)l.push(C.raw(`cohort_base.breakdown_${e}`));return c=c.groupBy(...l),n.db.$with(`activity_periods`).as(c)}buildCohortSizesCTE(e,t,n){if(n>0){let e={cohort_size:C`COUNT(*)`.as(`cohort_size`)},r=[];for(let t=0;t<n;t++)e[`breakdown_${t}`]=C.raw(`breakdown_${t}`).as(`breakdown_${t}`),r.push(C.raw(`breakdown_${t}`));let i=t.db.select(e).from(C`cohort_base`).groupBy(...r);return t.db.$with(`cohort_sizes`).as(i)}let r=t.db.select({cohort_size:C`COUNT(*)`.as(`cohort_size`)}).from(C`cohort_base`);return t.db.$with(`cohort_sizes`).as(r)}buildRetentionCountsCTE(e,t,n){let r;if(e.retentionType===`rolling`)r=this.buildRollingRetentionCountsQuery(e,t,n);else{let i={period_number:C`period_number`.as(`period_number`),retained_users:C`COUNT(DISTINCT binding_key)`.as(`retained_users`)},a=[C`period_number`];for(let e=0;e<n;e++)i[`breakdown_${e}`]=C.raw(`breakdown_${e}`).as(`breakdown_${e}`),a.push(C.raw(`breakdown_${e}`));let o=Math.min(e.periods,52);r=t.db.select(i).from(C`activity_periods`).where(C`period_number >= 0 AND period_number <= ${o}`).groupBy(...a)}return t.db.$with(`retention_counts`).as(r)}buildRollingRetentionCountsQuery(e,t,n){let r=[];for(let e=0;e<n;e++)r.push(`breakdown_${e}`);let i=r.length>0?`, ${r.join(`, `)}`:``,a=Math.min(e.periods,52),o=C`(
|
|
157
|
+
SELECT
|
|
158
|
+
binding_key,
|
|
159
|
+
${C.raw(r.map(e=>`${e}`).join(`, `)+(r.length>0?`,`:``))}
|
|
160
|
+
MAX(period_number) as max_period
|
|
161
|
+
FROM activity_periods
|
|
162
|
+
WHERE period_number >= 0 AND period_number <= ${a}
|
|
163
|
+
GROUP BY binding_key${C.raw(i)}
|
|
164
|
+
)`,s=this.databaseAdapter.buildPeriodSeriesSubquery(a),c={period_number:C`p.period_number`.as(`period_number`),retained_users:C`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},l=[C`p.period_number`];for(let e=0;e<n;e++)c[`breakdown_${e}`]=C.raw(`ump.breakdown_${e}`).as(`breakdown_${e}`),l.push(C.raw(`ump.breakdown_${e}`));return t.db.select(c).from(C`${o} ump`).innerJoin(s,C`TRUE`).groupBy(...l)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}},Xr=class{queryPlanner;constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(t,n,r){let i=Array.from(this.queryPlanner.analyzeCubeUsage(n));if(i.length===0)throw Error(e.O(`server.errors.noCubesInQuery`));let a=this.queryPlanner.analyzePrimaryCube(i,n,t),o=a.selectedCube,s=t.get(o);if(!s)throw Error(e.O(`server.errors.primaryCubeNotFound`,{cubeName:o}));let c=i.filter(e=>e!==o).map(e=>this.queryPlanner.analyzeJoinPathForTarget(t,o,e,n)),l=i.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,s,i,r,n):[],u=i.length>1?this.queryPlanner.buildPreAggregationCTEs(t,s,l,n,r)??[]:[],d=this.queryPlanner.buildWarnings(n,u),f=this.buildSourceFromPhases(s,l,u,t,n,r),p=f.source,m=this.buildQueryNode(p,n,t,d),h=this.buildPreAggregationAnalysis(u),g=new Map;for(let e of i){let n=t.get(e);n&&g.set(e,n)}let _=xn(n.measures??[],g),v=[...c.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...d.map(e=>e.message)];return{plan:m,analysis:{timestamp:new Date().toISOString(),cubeCount:i.length,cubesInvolved:[...i].sort(),primaryCube:a,joinPaths:c,preAggregations:h,querySummary:{queryType:u.length>0?`multi_cube_cte`:i.length>1?`multi_cube_join`:`single_cube`,measureStrategy:f.strategy,joinCount:l.length,cteCount:u.length,hasPreAggregation:u.length>0,hasWindowFunctions:_},warnings:v.length>0?v:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${i.length} cube${i.length===1?``:`s`} from query members`,details:{cubesInvolved:[...i].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${a.selectedCube}' as primary cube (${a.reason})`,details:{selectedCube:a.selectedCube,reason:a.reason,candidates:a.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${l.length} join${l.length===1?``:`s`}`,details:{joinCount:l.length,joinTargets:l.map(e=>e.target.name),pathSelection:c.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${u.length} pre-aggregation CTE${u.length===1?``:`s`}`,details:{cteCount:u.length,cubes:u.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${f.strategy}' measure strategy`,details:{strategy:f.strategy,regularMeasures:f.classification.regular.map(e=>e.name),multipliedMeasures:f.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:f.classification.deduplicationSafe.map(e=>e.name),sourceType:p.type}},{phase:`warnings`,decision:d.length>0?`Generated ${d.length} planning warning${d.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:d.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:this.buildMeasureRefs(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=this.buildMeasureRefs(i,r),o=this.buildDimensionRefs(i,r),s=this.buildTimeDimensionRefs(i,r),c=this.toCubeRef(e),l=t,u=n.map(e=>{let t=this.toCubeRef(e.cube);return{type:`ctePreAggregate`,schema:this.buildCTESchema(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:{measures:a,dimensions:o,timeDimensions:s},primaryCube:c,joins:l,ctes:u}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=this.buildDimensionRefs(e,t),c=this.buildTimeDimensionRefs(e,t),l={measures:this.buildMeasureRefs(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(e,t,n){if(!e?.joins)return!1;for(let[,r]of Object.entries(e.joins)){let e=I(r.targetCube,n);if(!(!e||e.name!==t)&&(r.relationship===`belongsTo`||r.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))!r.primaryKey||typeof r.sql==`function`||t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=this.buildMeasureRefs(t,n),a=this.buildDimensionRefs(t,n),o=this.buildTimeDimensionRefs(t,n),s=this.buildOrderByRefs(t),c=t.filters??[];return{type:`query`,schema:{measures:i,dimensions:a,timeDimensions:o},source:e,dimensions:a,measures:i,filters:c,timeDimensions:o,orderBy:s,limit:t.limit,offset:t.offset,ungrouped:t.ungrouped,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildMeasureRefs(t,n){return t.measures?t.measures.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForMeasure`,{cubeName:r,measure:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildDimensionRefs(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:this.toCubeRef(a),localName:i}}):[]}buildTimeDimensionRefs(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e.O(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:this.toCubeRef(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}toCubeRef(e){return{name:e.name,cube:e}}buildCTESchema(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}},Zr=class{name=`identity`;optimise(e){return e}};function Qr(e,t,n,r){let i=$r(e,n,r),a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);l&&(a.push(l),o.set(c.cube.name,c.cteAlias),ei(c,s))}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function $r(e,t,n){let r=new Map;if(!e.preAggregationCTEs||e.preAggregationCTEs.length===0)return r;for(let i of e.preAggregationCTEs)if(!(!i.propagatingFilters||i.propagatingFilters.length===0))for(let e of i.propagatingFilters){let i=e.sourceCube.name;if(!r.has(i)){let a={filters:e.filters},o=new Map([[i,e.sourceCube]]),s=n.queryBuilder.buildWhereConditions(o,a,t);r.set(i,s)}let a=r.get(i);a&&a.length>0&&(e.preBuiltFilterSQL=a.length===1?a[0]:D(...a))}return r}function ei(e,t){if(e.downstreamJoinKeys)for(let n of e.downstreamJoinKeys)t.set(n.targetCubeName,{cteAlias:e.cteAlias,joinKeys:n.joinKeys})}function ti(e,t,n,r,i,a){if(n.measures)for(let o of n.measures){let[s,c]=o.split(`.`),l=i.get(s);if(!l?.measures?.[c])continue;let u=l.measures[c];if(!Z.isPostAggregationWindow(u))continue;let d=Z.getWindowBaseMeasure(u,s);if(!d)continue;let[f,p]=d.split(`.`),m=i.get(f);if(!m?.measures?.[p])continue;let h=m.measures[p],g=t.preAggregationCTEs?.find(e=>e.cube?.name===f&&e.measures?.includes(d)),_;_=g?C`sum(${C`${C.identifier(g.cteAlias)}.${C.identifier(p)}`})`:a.queryBuilder.buildMeasureExpression(h,r,m),e[d]||(e[d]=C`${_}`.as(d));let v=ni(u,_,n,r,l,t,a);v&&(e[o]=C`${v}`.as(o))}}function ni(e,t,n,r,i,a,o){let s=e.windowConfig||{},c=(e,t)=>{if(!a.preAggregationCTEs)return null;let n=a.preAggregationCTEs.find(t=>t.cube?.name===e);return n&&n.cteAlias?C`${C.identifier(n.cteAlias)}.${C.identifier(t)}`:null},l;if(s.orderBy&&s.orderBy.length>0)l=s.orderBy.map(e=>{let a=e.field.includes(`.`)?e.field.split(`.`)[1]:e.field;if(n.timeDimensions)for(let t of n.timeDimensions){let[n,s]=t.dimension.split(`.`);if(s===a){let l=c(n,a);if(l)return{field:l,direction:e.direction};let u=i.dimensions?.[s];if(u)return{field:o.queryBuilder.buildTimeDimensionExpression(u.sql,t.granularity,r),direction:e.direction}}}let l=i.dimensions?.[a];return l?{field:z(l.sql,r),direction:e.direction}:a===(s.measure?.includes(`.`)?s.measure.split(`.`)[1]:s.measure)||e.field===s.measure?{field:t,direction:e.direction}:null}).filter(e=>e!==null);else if(n.timeDimensions&&n.timeDimensions.length>0){let e=n.timeDimensions[0],[t,a]=e.dimension.split(`.`),s=c(t,a);if(s)l=[{field:s,direction:`asc`}];else{let n=i.name===t?i:void 0;if(n?.dimensions?.[a]){let t=n.dimensions[a];l=[{field:o.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,r),direction:`asc`}]}}}let u;s.partitionBy&&s.partitionBy.length>0&&(u=s.partitionBy.map(e=>{let t=e.includes(`.`)?e.split(`.`)[1]:e,n=i.dimensions?.[t];return n?z(n.sql,r):null}).filter(e=>e!==null));let d=o.databaseAdapter.buildWindowFunction(e.type,t,u,l,{offset:s.offset,defaultValue:s.defaultValue,nTile:s.nTile,frame:s.frame});if(!d)return null;switch(s.operation||Z.getDefaultWindowOperation(e.type)){case`difference`:return C`${t} - ${d}`;case`ratio`:return C`${t} / NULLIF(${d}, 0)`;case`percentChange`:return C`((${t} - ${d}) / NULLIF(${d}, 0)) * 100`;default:return d}}function ri(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs)ii(a,o,t,n,r,i),oi(a,o,r);return ti(a,e,t,n,r,i),a}function ii(e,t,n,r,i,a){let o=t.cube.name;for(let s of t.measures){if(!e[s])continue;let[,c]=s.split(`.`),l=i.get(o);if(!l?.measures?.[c])continue;let u=l.measures[c],d=C`${C.identifier(t.cteAlias)}.${C.identifier(c)}`,f;f=u.type===`calculated`&&u.calculatedSql?a.queryBuilder.buildCTECalculatedMeasure(u,l,t,i,r):ai(u,d,t,n,i,a),e[s]=C`${f}`.as(s)}}function ai(e,t,n,r,i,a){let o=n.cteReason===`fanOutPrevention`,s=si(n,r,i),c=o||s;switch(e.type){case`count`:case`countDistinct`:case`sum`:return c?j(t):xe(t);case`avg`:return c?j(t):a.databaseAdapter.buildAvg(t);case`min`:return Se(t);case`max`:return j(t);case`number`:return j(t);default:return c?j(t):xe(t)}}function oi(e,t,n){let r=t.cube.name;for(let i in e){let[a,o]=i.split(`.`);if(a!==r)continue;let s=n.get(r),c=s&&s.dimensions?.[o],l=i.startsWith(r+`.`);if(!c&&!l)continue;let u=t.joinKeys.find(e=>e.targetColumn===o);if(!u&&s?.dimensions?.[o]){let e=s.dimensions[o].sql;u=t.joinKeys.find(t=>t.targetColumnObj===e)}(u||l&&s?.dimensions?.[o])&&(e[i]=C`${C.identifier(t.cteAlias)}.${C.identifier(o)}`.as(i))}}function si(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&ci(e.sourceColumnObj,t,n))}function ci(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function $(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}function li(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}function ui(e,t,n,r,i,a){let o=[],s=di(t,n,r,i);s=fi(s,n.joins);let c=new Set,l=pi(e);if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;l.has(r)&&!i.cteAliasMap.has(r)||(s=mi(s,n,e,i,t,o),s=_i(s,n,e,i,t,a,c))}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function di(e,t,n,r){return r.ctes.length>0?e.db.with(...r.ctes).select(n).from(t.from):e.db.select(n).from(t.from)}function fi(e,t){if(!t)return e;let n=e;for(let e of t)n=$(n,e.type??`left`,e.table,e.on);return n}function pi(e){let t=new Set;if(e.preAggregationCTEs){for(let n of e.preAggregationCTEs)if(n.intermediateJoins&&n.intermediateJoins.length>0)for(let e of n.intermediateJoins)t.add(e.cube.name)}return t}function mi(e,t,n,r,i,a){let o=t.junctionTable;if(!o)return e;let s=hi(o,t,n,r),c=[];if(o.securitySql){let e=o.securitySql(i.securityContext);Array.isArray(e)?c.push(...e):c.push(e)}try{let t=$(e,o.joinType??`left`,o.table,s);return c.length>0&&a.push(...c),t}catch{return e}}function hi(e,t,n,r){let i=e.joinCondition,a=e.sourceCubeName?r.cteAliasMap.get(e.sourceCubeName):void 0;if(!a)return i;let o=(n.preAggregationCTEs?.find(t=>t.cube.name===e.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===t.cube.name);if(o&&o.joinKeys.length>0){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(a)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj;r&&e.push(E(r,n))}e.length>0&&(i=D(...e))}return i}function gi(e,t,n,r,i,a){if(t)return{joinTarget:C`${C.identifier(t)}`,joinCondition:a.cteBuilder.buildCTEJoinCondition(e,t,r),securityCondition:void 0,joinCubeBase:void 0};let o=n.downstreamCubeMap.get(e.cube.name),s=e.cube.sql(i),c;if(o&&!e.junctionTable){let e=[];for(let t of o.joinKeys){let n=C`${C.identifier(o.cteAlias)}.${C.identifier(t.sourceColumn)}`,r=t.targetColumnObj||C.identifier(t.targetColumn);e.push(E(n,r))}c=e.length===1?e[0]:D(...e)}else c=e.joinCondition;return{joinTarget:s.from,joinCondition:c,securityCondition:s.where,joinCubeBase:s}}function _i(e,t,n,r,i,a,o){let{joinTarget:s,joinCondition:c,securityCondition:l,joinCubeBase:u}=gi(t,r.cteAliasMap.get(t.cube.name),r,n,i,a),d=t.joinType||`left`,f=d!==`inner`&&l?D(c,l):c;try{let n;return d===`inner`?n=e.innerJoin(s,c):(n=$(e,d,s,f),l&&o.add(t.cube.name)),fi(n,u?.joins)}catch{return e}}function vi(e,t,n,r,i,a,o,s){let c=yi(e,t,n,r,i,a,o,s),l=o.drizzleQuery;if(c.length>0){let e=c.length===1?c[0]:D(...c);l=l.where(e)}return bi(l,e,t,n,r,s)}function yi(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);return l.length>0&&c.push(...l),c}function bi(e,t,n,r,i,a){let o=t.joinCubes.length>0?i:t.primaryCube,s=e,c=a.queryBuilder.buildGroupByFields(o,n,r,t);if(c.length>0&&(s=s.groupBy(...c)),!n.ungrouped){let e=a.queryBuilder.buildHavingConditions(o,n,r,t);if(e.length>0){let t=e.length===1?e[0]:D(...e);s=s.having(t)}}let l=a.queryBuilder.buildOrderBy(n);return l.length>0&&(s=s.orderBy(...l)),a.queryBuilder.applyLimitAndOffset(s,n)}function xi(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!Ai(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:Mi(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u=i.regularMeasures??[],d=Si(t,n,r,a,o,s,u);if(!d)return null;let f=Ci(e,t,n,r,a,c,d.keysSelections,d.keyGroupBy),p=Ei(t,n,r,o,s,d.multipliedMeasures,l);return p?ki(t,n,r,a,o,{keysAlias:c,aggAlias:l,keysCte:f,aggCte:p,pkDimensions:s,pkAliases:d.pkAliases,multipliedMeasures:d.multipliedMeasures,regularMeasureNames:u}):null}function Si(e,t,n,r,i,a,o){let s={},c=[];if(e.dimensions)for(let n of e.dimensions){let[e,i]=n.split(`.`),a=r.get(e),o=a?.dimensions?.[i];if(!a||!o)return null;let l=z(o.sql,t);s[n]=C`${l}`.as(n),c.push(l)}if(e.timeDimensions)for(let i of e.timeDimensions){let[e,a]=i.dimension.split(`.`),o=r.get(e),l=o?.dimensions?.[a];if(!o||!l)return null;let u=n.queryBuilder.buildTimeDimensionExpression(l.sql,i.granularity,t);s[i.dimension]=C`${u}`.as(i.dimension),c.push(u)}let l=[];for(let e of a){let n=i.dimensions?.[e];if(!n)return null;let r=z(n.sql,t),a=`__pk__${e}`;s[a]=C`${r}`.as(a),c.push(r),l.push(a)}let u=new Set(o),d=e.measures.filter(e=>!u.has(e));if(o.length>0){let e=n.queryBuilder.buildResolvedMeasures(o,r,t);for(let t of o){let n=e.get(t);if(!n)return null;let r=`__reg__${t.replace(`.`,`__`)}`;s[r]=C`${n()}`.as(r)}}return{keysSelections:s,keyGroupBy:c,pkAliases:l,multipliedMeasures:d}}function Ci(e,t,n,r,i,a,o,s){let c=e.primaryCube.sql(n),l=[];c.where&&l.push(c.where);let u=n.db.select(o).from(c.from);if(c.joins)for(let e of c.joins)u=$(u,e.type??`left`,e.table,e.on);for(let t of e.joinCubes)u=wi(u,t,n,l);return l.push(...r.queryBuilder.buildWhereConditions(i,t,n)),u=Oi(u,l),s.length>0&&(u=u.groupBy(...s)),n.db.$with(a).as(u)}function wi(e,t,n,r){let i=e;t.junctionTable&&(i=$(i,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),Ti(t.junctionTable.securitySql,n,r));let a=t.cube.sql(n);if(i=$(i,t.joinType??`left`,a.from,t.joinCondition),a.joins)for(let e of a.joins)i=$(i,e.type??`left`,e.table,e.on);return a.where&&r.push(a.where),i}function Ti(e,t,n){if(!e)return;let r=e(t.securityContext);Array.isArray(r)?n.push(...r):n.push(r)}function Ei(e,t,n,r,i,a,o){let s=r.sql(t),c=Di(t,n,r,i,a);if(!c)return null;let l=t.db.select(c.aggSelections).from(s.from);if(s.joins)for(let e of s.joins)l=$(l,e.type??`left`,e.table,e.on);let u=[];return s.where&&u.push(s.where),u.push(...n.queryBuilder.buildWhereConditions(r,e,t)),l=Oi(l,u),c.aggGroupBy.length>0&&(l=l.groupBy(...c.aggGroupBy)),t.db.$with(o).as(l)}function Di(e,t,n,r,i){let a={},o=[];for(let t of r){let r=n.dimensions?.[t];if(!r)return null;let i=z(r.sql,e);a[t]=C`${i}`.as(t),o.push(i)}let s=new Set;for(let e of i){let[,t]=e.split(`.`);n.measures?.[t]?.type===`avg`&&s.add(t)}let c=i.filter(e=>{let[,t]=e.split(`.`);return!s.has(t)});if(c.length>0){let r=t.queryBuilder.buildResolvedMeasures(c,new Map([[n.name,n]]),e);for(let e of c){let[,t]=e.split(`.`),n=r.get(e);if(!n||typeof n!=`function`)return null;a[t]=C`${n()}`.as(t)}}for(let t of i){let[,r]=t.split(`.`);if(!s.has(r))continue;let i=n.measures?.[r];if(!i?.sql)return null;let o=z(i.sql,e),c=`__avg_sum__${r}`,l=`__avg_count__${r}`;a[c]=C`sum(${o})`.as(c),a[l]=C`count(${o})`.as(l)}return{aggSelections:a,aggGroupBy:o}}function Oi(e,t){return t.length===0?e:e.where(t.length===1?t[0]:D(...t))}function ki(e,t,n,r,i,a){let{keysAlias:o,aggAlias:s,keysCte:c,aggCte:l,pkDimensions:u,pkAliases:d,multipliedMeasures:f,regularMeasureNames:p}=a,m={};for(let t of e.dimensions??[])m[t]=C`${C.identifier(o)}.${C.identifier(t)}`.as(t);for(let t of e.timeDimensions??[])m[t.dimension]=C`${C.identifier(o)}.${C.identifier(t.dimension)}`.as(t.dimension);for(let e of f){let[,t]=e.split(`.`),n=i.measures?.[t];m[e]=Ni(n?.type??`sum`,s,t,e)}for(let e of p){let[t,n]=e.split(`.`),i=r.get(t)?.measures?.[n],a=`__reg__${e.replace(`.`,`__`)}`;m[e]=Ni(i?.type??`sum`,o,a,e)}let h=t.db.with(c,l).select(m).from(C`${C.identifier(o)}`),g=d.map((e,t)=>E(C`${C.identifier(o)}.${C.identifier(e)}`,C`${C.identifier(s)}.${C.identifier(u[t])}`)),_=g.length===1?g[0]:D(...g);h=h.leftJoin(C`${C.identifier(s)}`,_);let v=[...(e.dimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e)}`),...(e.timeDimensions??[]).map(e=>C`${C.identifier(o)}.${C.identifier(e.dimension)}`)];v.length>0&&(h=h.groupBy(...v));let y=n.queryBuilder.buildOrderBy(e,Object.keys(m));return y.length>0&&(h=h.orderBy(...y)),n.queryBuilder.applyLimitAndOffset(h,e)}function Ai(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!ji(e,t,n)}function ji(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}function Mi(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}function Ni(e,t,n,r){switch(e){case`min`:return C`min(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`max`:return C`max(${C`${C.identifier(t)}.${C.identifier(n)}`})`.as(r);case`avg`:return C`sum(${C`${C.identifier(t)}.${C.identifier(`__avg_sum__${n}`)}`}) / nullif(sum(${C`${C.identifier(t)}.${C.identifier(`__avg_count__${n}`)}`}), 0)`.as(r);default:return C`coalesce(sum(${C`${C.identifier(t)}.${C.identifier(n)}`}), 0)`.as(r)}}function Pi(e,t,n,r,i){let a=e.multiFactMerge;if(!a||a.groups.length<2)return null;let o=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],s=Array.from(new Set(o)),c=s.length>0,l=Vi(r),u=c&&a.mergeStrategy===`fullJoin`&&!l,d=a.groups.map(e=>{let t=i(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});return u?Ri(t,n,r,a,d,s):Li(t,n,r,a,d,s,Bi(a.mergeStrategy,c,l))}function Fi(e,t,n){let r={};for(let e of t)r[e]=C`${Hi(n,e)}`.as(e);for(let t of e.groups)for(let e of t.measures)r[e]=C`coalesce(${C`${C.identifier(t.alias)}.${C.identifier(e)}`}, 0)`.as(e);return r}function Ii(e,t,n){if(t.length===0)return C`1 = 1`;let r=t.map(t=>E(n.get(t),C`${C.identifier(e)}.${C.identifier(t)}`));return r.length===1?r[0]:D(...r)}function Li(e,t,n,r,i,a,o){let s=r.groups[0].alias,c=Fi(r,a,r.groups.map(e=>e.alias)),l=t.db.with(...i).select(c).from(C`${C.identifier(s)}`),u=new Map;for(let e of a)u.set(e,C`${C.identifier(s)}.${C.identifier(e)}`);for(let e=1;e<r.groups.length;e++){let t=r.groups[e].alias,n=Ii(t,a,u);if(l=$(l,o,C`${C.identifier(t)}`,n),a.length>0&&o===`full`)for(let e of a)u.set(e,C`coalesce(${u.get(e)}, ${C`${C.identifier(t)}.${C.identifier(e)}`})`)}let d=n.queryBuilder.buildOrderBy(e,Object.keys(c));return d.length>0&&(l=l.orderBy(...d)),n.queryBuilder.applyLimitAndOffset(l,e)}function Ri(e,t,n,r,i,a){let o=`mf_all_keys`,s=r.groups.map(e=>C`select ${zi(e.alias,a)} from ${C.identifier(e.alias)}`),c=C`${C.join(s,C` union `)}`,l=t.db.$with(o).as(c),u={};for(let e of a)u[e]=C`${C.identifier(o)}.${C.identifier(e)}`.as(e);for(let e of r.groups)for(let t of e.measures)u[t]=C`coalesce(${C`${C.identifier(e.alias)}.${C.identifier(t)}`}, 0)`.as(t);let d=t.db.with(...i,l).select(u).from(C`${C.identifier(o)}`);for(let e of r.groups){let t=a.map(t=>E(C`${C.identifier(o)}.${C.identifier(t)}`,C`${C.identifier(e.alias)}.${C.identifier(t)}`)),n=t.length===1?t[0]:D(...t);d=d.leftJoin(C`${C.identifier(e.alias)}`,n)}let f=n.queryBuilder.buildOrderBy(e,Object.keys(u));return f.length>0&&(d=d.orderBy(...f)),n.queryBuilder.applyLimitAndOffset(d,e)}function zi(e,t){let n=t.map(t=>C`${C.identifier(e)}.${C.identifier(t)} as ${C.identifier(t)}`);return C.join(n,C`, `)}function Bi(e,t,n){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:n?`full`:`left`}function Vi(e){let t=e.databaseAdapter.getEngineType();return t===`postgres`||t===`duckdb`}function Hi(e,t){if(e.length===1)return C`${C.identifier(e[0])}.${C.identifier(t)}`;let n=e.map(e=>C`${C.identifier(e)}.${C.identifier(t)}`),r=n[0];for(let e=1;e<n.length;e++)r=C`coalesce(${r}, ${n[e]})`;return r}var Ui=class{queryBuilder;cteBuilder;databaseAdapter;constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>this.materializeJoin(e)),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}materializeJoin(e){if(e.junctionTable){let t=jt(e.joinDef);return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:t.junctionJoins[1].condition,relationship:e.relationship,junctionTable:{table:e.junctionTable.table,alias:e.junctionTable.alias,joinType:e.junctionTable.joinType,joinCondition:t.junctionJoins[0].condition,securitySql:e.joinDef.through?.securitySql,sourceCubeName:e.junctionTable.sourceCubeName}}}return{cube:e.target.cube,alias:e.alias,joinType:e.joinType,joinCondition:At(e.joinDef),relationship:e.relationship}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset,ungrouped:e.ungrouped}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=Pi(e,t,n,r,(e,t,n)=>this.build(e,t,n));if(i)return i;let a=xi(e,t,n,r);if(a)return a;let o=Qr(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?li(e):new Map([[e.primaryCube.name,e.primaryCube]]);return vi(e,t,n,c,s,o,ui(e,n,s,ri(e,t,n,c,r),o,r),r)}};function Wi(e,t){if(!(typeof process>`u`||!process.env?.DC_DEBUG))try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var Gi=class{dbExecutor;queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;logicalPlanBuilder;planOptimiser;modeRouter;resultCache;filterCachePreloader;rlsSetup;constructor(t,n,r,i){if(this.dbExecutor=t,this.databaseAdapter=t.databaseAdapter,!this.databaseAdapter)throw Error(e.O(`server.errors.dbAdapterRequired`));this.queryBuilder=new On(this.databaseAdapter);let a=new Un,o=new Gn(this.queryBuilder);this.drizzlePlanBuilder=new Ui(this.queryBuilder,o,this.databaseAdapter),this.comparisonQueryBuilder=new Vr(this.databaseAdapter),this.funnelQueryBuilder=new Hr(this.databaseAdapter),this.flowQueryBuilder=new Ur(this.databaseAdapter),this.retentionQueryBuilder=new Yr(this.databaseAdapter),this.logicalPlanBuilder=new Xr(a),this.planOptimiser=i??new Zr,this.rlsSetup=r,this.modeRouter=new jr({comparison:this.comparisonQueryBuilder,funnel:this.funnelQueryBuilder,flow:this.flowQueryBuilder,retention:this.retentionQueryBuilder}),this.resultCache=new Br(n),this.filterCachePreloader=new pr(this.queryBuilder)}async withRLSContext(t,n){if(!this.rlsSetup)return n();let r=this.dbExecutor.db;if(!r.transaction)throw Error(e.O(`server.errors.rlsRequiresTransactions`));let i=this.rlsSetup;return r.transaction(async e=>{await i(e,t);let r=Object.create(this.dbExecutor);return r.db=e,this.dbExecutor=r,n()})}async execute(t,n,r,i){try{let e=this.modeRouter.resolveMode(n);this.modeRouter.validateForMode(e,t,n);let a=this.resultCache.generateKey(n,r);return await this.resultCache.lookup(a,i?.skipCache??!1)||await this.withRLSContext(r,()=>this.executeQueryByModeWithCache(e,t,n,r,a))}catch(t){if(t instanceof Error){let n=t;for(;n.cause instanceof Error;)n=n.cause;let r=n.message,i=n;throw i.code&&(r+=` [${i.code}]`),i.detail&&(r+=` Detail: ${i.detail}`),i.hint&&(r+=` Hint: ${i.hint}`),t.message=e.O(`server.errors.queryExecutionFailed`,{message:r}),t}throw Error(e.O(`server.errors.queryExecutionUnknown`),{cause:t})}}buildLogicalPlan(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).optimisedPlan}analyzeQuery(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);return this.filterCachePreloader.preload(t,r,e,i),this.buildRegularQueryArtifacts(e,t,i).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.resultCache.store(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(t){let n=this.comparisonQueryBuilder.getComparisonTimeDimension(t);if(!n||!n.compareDateRange)throw Error(e.O(`server.errors.noCompareDateRange`));let r=this.comparisonQueryBuilder.normalizePeriods(n.compareDateRange);if(r.length<2)throw Error(e.O(`server.errors.compareDateRangeInvalid`));let i=r.map(e=>this.comparisonQueryBuilder.createPeriodQuery(t,e));return{timeDimension:n,granularity:n.granularity||`day`,periods:r,periodQueries:i}}async executeAnalysisQueryWithCache(e,t){let n=await e();return await this.resultCache.store(t,n),n}async executeFunnelQuery(e,t,n){let r=t.funnel,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.funnelQueryBuilder.buildFunnelQuery(r,e,i);Wi(`funnel query`,a);let o=await a,s=this.funnelQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:s,annotation:c}}async executeFlowQuery(e,t,n){let r=t.flow,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.flowQueryBuilder.buildFlowQuery(r,e,i);Wi(`flow query`,a);let o=await a,s=this.flowQueryBuilder.transformResult(o),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[s],annotation:c}}async executeRetentionQuery(e,t,n){let r=t.retention,i={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},a=this.retentionQueryBuilder.buildRetentionQuery(r,e,i);Wi(`retention query`,a);let o=await a,s=this.retentionQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:s,annotation:c}}async executeStandardQuery(e,t,n,r){let i=new H,a=this.createQueryContext(n,i,t);this.filterCachePreloader.preload(t,i,e,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(e,t,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o),c=this.drizzlePlanBuilder.toSemanticQuery(o);this.validateSecurityContext(s,a);let l=this.drizzlePlanBuilder.build(s,c,a);Wi(`query`,l);let u=this.queryBuilder.collectNumericFields(e,t),d={data:fr(await this.dbExecutor.execute(l,u),t,this.databaseAdapter),annotation:Kn(s,t),warnings:o.warnings?.length?o.warnings:void 0};return await this.resultCache.store(r,d),d}createQueryContext(e,t,n){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t,ungrouped:n?.ungrouped}}getOptimiserEngineType(){return this.dbExecutor.getEngineType?.()??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.funnelQueryBuilder.hasFunnel(e),invalidConfigKey:`server.errors.invalidFunnelConfig`,getConfig:e=>e.funnel,validate:t=>this.funnelQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.funnelValidationFailed`,build:(t,n)=>this.funnelQueryBuilder.buildFunnelQuery(t,e,n)})}async dryRunFlow(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.flowQueryBuilder.hasFlow(e),invalidConfigKey:`server.errors.invalidFlowConfig`,getConfig:e=>e.flow,validate:t=>this.flowQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.flowValidationFailed`,build:(t,n)=>this.flowQueryBuilder.buildFlowQuery(t,e,n)})}async dryRunRetention(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.retentionQueryBuilder.hasRetention(e),invalidConfigKey:`server.errors.invalidRetentionConfig`,getConfig:e=>e.retention,validate:t=>this.retentionQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.retentionValidationFailed`,build:(t,n)=>this.retentionQueryBuilder.buildRetentionQuery(t,e,n)})}async dryRunAnalysis(t,n,r){if(!r.has(t))throw Error(e.O(r.invalidConfigKey));let i=r.getConfig(t),a=r.validate(i);if(!a.isValid)throw Error(e.O(r.validationFailedKey,{errors:a.errors.join(`, `)}));let o={db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:n},s=r.build(i,o).toSQL();return{sql:s.sql,params:s.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.modeRouter.resolveMode(t);return this.modeRouter.validateForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(e,t,n){let r=new H,i=this.createQueryContext(n,r,t);this.filterCachePreloader.preload(t,r,e,i);let{optimisedPlan:a}=this.buildRegularQueryArtifacts(e,t,i),o=this.drizzlePlanBuilder.derivePhysicalPlanContext(a),s=this.drizzlePlanBuilder.toSemanticQuery(a),c=this.drizzlePlanBuilder.build(o,s,i).toSQL();return{sql:c.sql,params:c.params}}async executeQueryByModeWithCache(e,t,n,r,i){return{regular:()=>this.executeStandardQuery(t,n,r,i),comparison:()=>this.executeComparisonQueryWithCache(t,n,r,i),funnel:()=>this.executeAnalysisQueryWithCache(()=>this.executeFunnelQuery(t,n,r),i),flow:()=>this.executeAnalysisQueryWithCache(()=>this.executeFlowQuery(t,n,r),i),retention:()=>this.executeAnalysisQueryWithCache(()=>this.executeRetentionQuery(t,n,r),i)}[kt(e)]()}async generateSqlForMode(e,t,n,r){return{regular:()=>this.generateUnifiedSQL(t,n,r),comparison:()=>this.generateComparisonSQL(t,n,r),funnel:()=>this.dryRunFunnel(t,n,r),flow:()=>this.dryRunFlow(t,n,r),retention:()=>this.dryRunRetention(t,n,r)}[kt(e)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}},Ki=[`year`,`quarter`,`month`,`week`,`day`,`hour`];function qi(e,t){return t.includes(`.`)?t:`${e}.${t}`}function Ji(e){let t=Object.keys(e.measures),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.measures[i],o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>qi(e.name,t))),n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o}}return n}function Yi(e){let t=Object.keys(e.dimensions),n=Array(t.length);for(let r=0;r<t.length;r++){let i=t[r],a=e.dimensions[i],o=a.type===`time`?a.granularities||Ki:void 0;n[r]={name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,granularities:o}}return n}function Xi(e,t,n){let r=[];if(!e.joins)return r;for(let[,i]of Object.entries(e.joins)){let e=I(i.targetCube,t);e&&r.push({targetCube:e.name,relationship:i.relationship,joinFields:i.on.map(e=>({sourceField:n(e.source),targetField:n(e.target)}))})}return r}function Zi(e){let t=[];if(!e.hierarchies)return t;for(let[,n]of Object.entries(e.hierarchies))t.push({name:n.name,title:n.title||n.name,cubeName:e.name,levels:n.levels.map(t=>qi(e.name,t))});return t}var Qi=class{cubes=new Map;metadataCache;cacheConfig;rlsSetup;planOptimiser;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup,this.planOptimiser=e?.planOptimiser}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(e.O(`server.errors.dbNotConfigured`));return Dt(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new Gi(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup,this.planOptimiser)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.S(t.sql,n),params:t.params}}registerCube(e){this.validateCalculatedMeasures(e),new X(this.cubes).populateDependencies(e),this.cubes.set(e.name,e),this.invalidateMetadataCache()}validateCubeReferences(){let t=[];for(let[n,r]of this.cubes)if(r.joins)for(let[i,a]of Object.entries(r.joins))typeof a.targetCube==`string`&&!this.cubes.has(a.targetCube)&&t.push(e.O(`server.errors.cubeRefUnresolved`,{cubeName:n,joinName:i,targetCube:a.targetCube}));if(t.length>0)throw Error(e.O(`server.errors.unresolvedCubeRefs`,{details:t.map(e=>` - ${e}`).join(`
|
|
165
|
+
`)}))}validateCalculatedMeasures(t){let n=[];for(let[r,i]of Object.entries(t.measures))if(i.type===`calculated`){if(!i.calculatedSql){n.push(e.O(`server.validation.calculatedMeasure.mustHaveCalculatedSql`,{cubeName:t.name,fieldName:r}));continue}let a=Tn(i.calculatedSql);if(!a.isValid){n.push(e.O(`server.validation.calculatedMeasure.invalidSyntax`,{cubeName:t.name,fieldName:r,errors:a.errors.join(`, `)}));continue}let o=new Map(this.cubes);o.set(t.name,t);let s=new X(o);try{s.validateDependencies(t)}catch(e){n.push(e instanceof Error?e.message:String(e))}}if(n.length===0){let r=new Map(this.cubes);r.set(t.name,t);let i=new X(r);i.buildGraph(t);let a=i.detectCycle();a&&n.push(e.O(`server.validation.calculatedMeasure.circularDependency`,{cycle:a.join(` -> `)}))}if(n.length>0)throw Error(e.O(`server.errors.calculatedMeasureValidation`,{cubeName:t.name,details:n.join(`
|
|
166
|
+
`)}))}getCube(e){return this.cubes.get(e)}getAllCubes(){return Array.from(this.cubes.values())}getAllCubesMap(){return this.cubes}async execute(e,t,n){return this.createQueryExecutor(!0).execute(this.cubes,e,t,n)}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.cubes.get(t))throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(){return this.metadataCache||=Array.from(this.cubes.values()).map(e=>this.generateCubeMetadata(e)),this.metadataCache}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}generateCubeMetadata(e){let t=Ji(e),n=Yi(e),r=Xi(e,this.cubes,e=>this.getColumnName(e)),i=Zi(e);return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:t,dimensions:n,segments:[],relationships:r.length>0?r:void 0,hierarchies:i.length>0?i:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t);if(!i)throw Error(e.O(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.cubes,e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.cubes,e,t,n)}hasCube(e){return this.cubes.has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.cubes.delete(e);return t&&this.invalidateMetadataCache(),t}clearCubes(){this.cubes.clear(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache=void 0}getCubeNames(){return Array.from(this.cubes.keys())}validateQuery(e){return hr(this.cubes,e)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.cubes,e,t)}},$i=`x-dc-locale`;function ea(e){if(!e)return;let t=(Array.isArray(e)?e[0]:e).split(`,`)[0]?.trim();if(t&&/^[A-Za-z0-9-]{2,35}$/.test(t))return t}function ta(e){return ea(e($i))}function na(e,t){let n=e&&typeof e==`object`?e:{},r=typeof n.locale==`string`?n.locale:void 0,i=t??r??`en-GB`;return r===i?n:{...n,locale:i}}function ra(e){let t=Array.isArray(e)?[...e]:(e??``).split(`,`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e.toLowerCase()===`x-dc-locale`)||t.push(`X-DC-Locale`),t}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return Qi}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return ta}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return na}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ra}});
|