drizzle-cube 0.8.2 → 0.9.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/dist/adapters/ActivityGridChart.config-DfyZh3He.js +2 -0
- package/dist/adapters/ActivityGridChart.config-DgOwl51m.cjs +1 -0
- package/dist/adapters/AreaChart.config-BL_ZpMsg.js +2 -0
- package/dist/adapters/AreaChart.config-rc1phjmI.cjs +1 -0
- package/dist/adapters/BarChart.config-C6k4BxhM.cjs +1 -0
- package/dist/adapters/BarChart.config-CBACR7Z-.js +2 -0
- package/dist/adapters/BoxPlotChart.config-Bvg6yFn2.js +2 -0
- package/dist/adapters/BoxPlotChart.config-CAlLRM0v.cjs +1 -0
- package/dist/adapters/BubbleChart.config-22qXNskY.js +2 -0
- package/dist/adapters/BubbleChart.config-BkB3P6Bi.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-DuZb-y6d.cjs +1 -0
- package/dist/adapters/CandlestickChart.config-G78UbuwS.js +2 -0
- package/dist/adapters/DataTable.config-BXkpzOC2.js +2 -0
- package/dist/adapters/DataTable.config-CwPlSht6.cjs +1 -0
- package/dist/adapters/DotStripChart.config-Bw9Ww5zY.cjs +1 -0
- package/dist/adapters/DotStripChart.config-D5sbLAqA.js +2 -0
- package/dist/adapters/FunnelChart.config-CUs1rqN2.cjs +1 -0
- package/dist/adapters/FunnelChart.config-Cw9qrC2C.js +2 -0
- package/dist/adapters/GaugeChart.config-CjGtJVoO.cjs +1 -0
- package/dist/adapters/GaugeChart.config-F5SA5Oi3.js +2 -0
- package/dist/adapters/HeatMapChart.config-CvgmSiuY.cjs +1 -0
- package/dist/adapters/HeatMapChart.config-DrvQrPHT.js +2 -0
- package/dist/adapters/KpiDelta.config-B-UJWdJ5.cjs +1 -0
- package/dist/adapters/KpiDelta.config-C00mTZYy.js +2 -0
- package/dist/adapters/KpiNumber.config-CB0kTeoV.cjs +1 -0
- package/dist/adapters/KpiNumber.config-D3CogH8j.js +2 -0
- package/dist/adapters/KpiText.config-B0LbKRCf.js +2 -0
- package/dist/adapters/KpiText.config-Dv4TNprC.cjs +1 -0
- package/dist/adapters/LineChart.config-CdONxSLL.js +2 -0
- package/dist/adapters/LineChart.config-DBHsfIYG.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-AYKXdpuw.cjs +1 -0
- package/dist/adapters/MarkdownChart.config-CngxD_Lc.js +2 -0
- package/dist/adapters/MeasureProfileChart.config-B0a5sUk6.cjs +1 -0
- package/dist/adapters/MeasureProfileChart.config-ByW5F1Ey.js +2 -0
- package/dist/adapters/PieChart.config-Csx1ctk4.js +2 -0
- package/dist/adapters/PieChart.config-Dfw66Xab.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-BaeYznc1.cjs +1 -0
- package/dist/adapters/ProportionBarChart.config-DCOizSVs.js +2 -0
- package/dist/adapters/RadarChart.config-AxQh97rB.js +2 -0
- package/dist/adapters/RadarChart.config-BjP-zEGW.cjs +1 -0
- package/dist/adapters/RadialBarChart.config-D5EwyJ0G.cjs +1 -0
- package/dist/adapters/RadialBarChart.config-DMaEJYM_.js +2 -0
- package/dist/adapters/RecordsTable.config-BdN0kZ8b.js +2 -0
- package/dist/adapters/RecordsTable.config-CWRvGDbi.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-BpciOTeX.cjs +1 -0
- package/dist/adapters/RetentionCombinedChart.config-CY8TDzuy.js +2 -0
- package/dist/adapters/RetentionHeatmap.config-BZPRoVpF.cjs +1 -0
- package/dist/adapters/RetentionHeatmap.config-YMZt-u-T.js +2 -0
- package/dist/adapters/SankeyChart.config-BdSA-Jlp.cjs +1 -0
- package/dist/adapters/SankeyChart.config-Dlgi5_DA.js +2 -0
- package/dist/adapters/ScatterChart.config-VJ0xG0Ak.cjs +1 -0
- package/dist/adapters/ScatterChart.config-oOd1Jplx.js +2 -0
- package/dist/adapters/SunburstChart.config-Cllhyjy4.js +2 -0
- package/dist/adapters/SunburstChart.config-DU11BAei.cjs +1 -0
- package/dist/adapters/TreeMapChart.config--EB8bQTo.js +2 -0
- package/dist/adapters/TreeMapChart.config-BPmMLBH1.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-E99Fl6uM.cjs +1 -0
- package/dist/adapters/WaterfallChart.config-xz3DaoMQ.js +2 -0
- package/dist/adapters/{anthropic-DG4r1LSm.cjs → anthropic-CqLkud62.cjs} +1 -1
- package/dist/adapters/{anthropic-CZh4hB-m.js → anthropic-MQlafOZv.js} +3 -0
- package/dist/adapters/compiler-BdVMQ3Xj.cjs +166 -0
- package/dist/adapters/{compiler-BFLAXV7W.js → compiler-SBDjxyQ3.js} +1231 -1231
- package/dist/adapters/core/index.cjs +1 -1
- package/dist/adapters/core/index.js +1 -1
- package/dist/adapters/{core-CrJu6vJY.cjs → core-CSt8MGbw.cjs} +1 -1
- package/dist/adapters/{core-l3KMTu9u.js → core-CXrxqh7l.js} +2 -2
- package/dist/adapters/express/index.cjs +1 -1
- package/dist/adapters/express/index.js +5 -5
- package/dist/adapters/fastify/index.cjs +1 -1
- package/dist/adapters/fastify/index.js +23 -23
- package/dist/{server/google-PsZzwedr.cjs → adapters/google-6pofxIfm.cjs} +1 -1
- package/dist/{server/google-DRY7jnOh.js → adapters/google-BBBP1Dhs.js} +3 -0
- package/dist/adapters/{handler-DESp4wPg.js → handler-Cppe-aqH.js} +569 -374
- package/dist/adapters/handler-_u5krbOj.cjs +26 -0
- package/dist/adapters/hono/index.cjs +1 -1
- package/dist/adapters/hono/index.js +4 -4
- package/dist/adapters/mcp-tools.cjs +1 -1
- package/dist/adapters/mcp-tools.js +2 -2
- package/dist/adapters/mcp-transport-CpF7usmR.js +754 -0
- package/dist/adapters/mcp-transport-DXIfb0p-.cjs +42 -0
- package/dist/adapters/nextjs/index.cjs +1 -1
- package/dist/adapters/nextjs/index.js +5 -5
- package/dist/adapters/{openai-DK_KWiI7.js → openai-62sEF0Ev.js} +10 -4
- package/dist/adapters/{openai-BJyU4kvE.js → openai-BIoIunc7.js} +2 -2
- package/dist/adapters/openai-CaxNY6TC.cjs +1 -0
- package/dist/adapters/{openai-GO3M7Hwi.cjs → openai-EBTQKJnV.cjs} +2 -2
- package/dist/adapters/{utils-BhlkVCzZ.js → utils-C_RKaP0n.js} +2 -1
- package/dist/adapters/utils-DXWQUJbD.cjs +128 -0
- package/dist/adapters/utils.cjs +1 -1
- package/dist/adapters/utils.js +2 -2
- package/dist/cjs/client/components/AgenticNotebook/chatMessageParts.d.ts +0 -2
- package/dist/cjs/client/components/PortletGroupCard.d.ts +3 -1
- package/dist/cjs/client/components/RowManagedLayout.d.ts +5 -2
- package/dist/cjs/client/components/dashboardPortletCard/cardStyles.d.ts +7 -3
- package/dist/cjs/client/components/markdownOverrides.d.ts +202 -0
- package/dist/cjs/client/components/rowManagedLayout/sections.d.ts +46 -0
- package/dist/cjs/client/hooks/agentChatStream.d.ts +3 -2
- package/dist/cjs/client/hooks/useAgentChat.d.ts +1 -0
- package/dist/cjs/server/agent/agent-prompts.d.ts +14 -0
- package/dist/cjs/server/agent/chart-validation.d.ts +14 -0
- package/dist/cjs/server/agent/data-shape.d.ts +41 -0
- package/dist/cjs/server/agent/providers/anthropic.d.ts +1 -0
- package/dist/cjs/server/agent/providers/google.d.ts +1 -0
- package/dist/cjs/server/agent/providers/openai.d.ts +1 -0
- package/dist/cjs/server/agent/providers/types.d.ts +13 -0
- package/dist/cjs/server/agent/tools.d.ts +18 -4
- package/dist/cjs/server/agent/types.d.ts +5 -1
- package/dist/cjs/server/ai/chart-schema.d.ts +37 -0
- package/dist/client/charts.js +12 -12
- package/dist/client/chunks/{DashboardEditModal-BliiIHcI.js → DashboardEditModal-DjMGNTUa.js} +878 -785
- package/dist/client/chunks/DashboardEditModal-DjMGNTUa.js.map +1 -0
- package/dist/client/chunks/{DotStripChart-ChwsVeRU.js → DotStripChart-EEtJyV1v.js} +3 -3
- package/dist/client/chunks/{DotStripChart-ChwsVeRU.js.map → DotStripChart-EEtJyV1v.js.map} +1 -1
- package/dist/client/chunks/{ProportionBarChart-D-Qt9nkF.js → ProportionBarChart-3r7ZPX-V.js} +3 -3
- package/dist/client/chunks/{ProportionBarChart-D-Qt9nkF.js.map → ProportionBarChart-3r7ZPX-V.js.map} +1 -1
- package/dist/client/chunks/{RecordsTable-aG-QYXOH.js → RecordsTable-DvMXV6F6.js} +4 -4
- package/dist/client/chunks/{RecordsTable-aG-QYXOH.js.map → RecordsTable-DvMXV6F6.js.map} +1 -1
- package/dist/client/chunks/{RetentionCombinedChart-BRZ9w7ah.js → RetentionCombinedChart-DbxB86fj.js} +3 -3
- package/dist/client/chunks/{RetentionCombinedChart-BRZ9w7ah.js.map → RetentionCombinedChart-DbxB86fj.js.map} +1 -1
- package/dist/client/chunks/{RetentionHeatmap-LkTt89pK.js → RetentionHeatmap-CE3rxhAU.js} +2 -2
- package/dist/client/chunks/{RetentionHeatmap-LkTt89pK.js.map → RetentionHeatmap-CE3rxhAU.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-C0gJ3kDD.js → analysis-builder-lQk_qJBQ.js} +9 -9
- package/dist/client/chunks/{analysis-builder-C0gJ3kDD.js.map → analysis-builder-lQk_qJBQ.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-dqcpl_WL.js → analysis-builder-shared-C_pLSXJR.js} +9 -9
- package/dist/client/chunks/{analysis-builder-shared-dqcpl_WL.js.map → analysis-builder-shared-C_pLSXJR.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-CJzxC18G.js → chart-activity-grid-UZIp9_2E.js} +3 -2
- package/dist/client/chunks/chart-activity-grid-UZIp9_2E.js.map +1 -0
- package/dist/client/chunks/{chart-area-C66dgy84.js → chart-area-CEBcvCcn.js} +2 -2
- package/dist/client/chunks/{chart-area-C66dgy84.js.map → chart-area-CEBcvCcn.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-D9kiSOCT.js → chart-bar-DGh7cpU-.js} +3 -3
- package/dist/client/chunks/{chart-bar-D9kiSOCT.js.map → chart-bar-DGh7cpU-.js.map} +1 -1
- package/dist/client/chunks/{chart-box-plot-FsLIMisc.js → chart-box-plot-CeqoKPFa.js} +2 -2
- package/dist/client/chunks/{chart-box-plot-FsLIMisc.js.map → chart-box-plot-CeqoKPFa.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-BzyvrqKs.js → chart-bubble-8uH_JKNt.js} +2 -2
- package/dist/client/chunks/{chart-bubble-BzyvrqKs.js.map → chart-bubble-8uH_JKNt.js.map} +1 -1
- package/dist/client/chunks/{chart-candlestick-6lD35bLw.js → chart-candlestick-DogklMg1.js} +2 -2
- package/dist/client/chunks/{chart-candlestick-6lD35bLw.js.map → chart-candlestick-DogklMg1.js.map} +1 -1
- package/dist/client/chunks/{chart-data-table-Cou9qOab.js → chart-data-table-CCvvgeG_.js} +2 -2
- package/dist/client/chunks/{chart-data-table-Cou9qOab.js.map → chart-data-table-CCvvgeG_.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-B0775aaT.js → chart-funnel-D2vGQhaz.js} +2 -2
- package/dist/client/chunks/{chart-funnel-B0775aaT.js.map → chart-funnel-D2vGQhaz.js.map} +1 -1
- package/dist/client/chunks/{chart-gauge-pf-2E8w9.js → chart-gauge-DbU0rxqv.js} +3 -3
- package/dist/client/chunks/{chart-gauge-pf-2E8w9.js.map → chart-gauge-DbU0rxqv.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-EzVGe6fl.js → chart-heat-map-x6aQq91x.js} +3 -3
- package/dist/client/chunks/{chart-heat-map-EzVGe6fl.js.map → chart-heat-map-x6aQq91x.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-lfskDdx4.js → chart-kpi-delta-B2-m16QC.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-lfskDdx4.js.map → chart-kpi-delta-B2-m16QC.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-BnsofbTf.js → chart-kpi-number-DggvlYT_.js} +5 -5
- package/dist/client/chunks/{chart-kpi-number-BnsofbTf.js.map → chart-kpi-number-DggvlYT_.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-U5EdmdkV.js → chart-kpi-text-BFy-m1NP.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-U5EdmdkV.js.map → chart-kpi-text-BFy-m1NP.js.map} +1 -1
- package/dist/client/chunks/{chart-line-IwXqPY80.js → chart-line-C4r44HWi.js} +3 -3
- package/dist/client/chunks/{chart-line-IwXqPY80.js.map → chart-line-C4r44HWi.js.map} +1 -1
- package/dist/client/chunks/{chart-markdown-yxN_xBP9.js → chart-markdown-b0qPZ617.js} +3 -3
- package/dist/client/chunks/chart-markdown-b0qPZ617.js.map +1 -0
- package/dist/client/chunks/{chart-measure-profile-Bs4vhBJQ.js → chart-measure-profile-Dc-d82kF.js} +3 -3
- package/dist/client/chunks/{chart-measure-profile-Bs4vhBJQ.js.map → chart-measure-profile-Dc-d82kF.js.map} +1 -1
- package/dist/client/chunks/{chart-pie-LDJfDXfX.js → chart-pie-BHrPxga2.js} +3 -3
- package/dist/client/chunks/{chart-pie-LDJfDXfX.js.map → chart-pie-BHrPxga2.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-BZY6TP9m.js → chart-radar-I9sOFbG5.js} +3 -3
- package/dist/client/chunks/{chart-radar-BZY6TP9m.js.map → chart-radar-I9sOFbG5.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-aga05X7h.js → chart-radial-bar-DeDMMf9P.js} +3 -3
- package/dist/client/chunks/{chart-radial-bar-aga05X7h.js.map → chart-radial-bar-DeDMMf9P.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-MRCoWFd4.js → chart-sankey-1qB7yWHq.js} +2 -2
- package/dist/client/chunks/{chart-sankey-MRCoWFd4.js.map → chart-sankey-1qB7yWHq.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-DP-nn9hH.js → chart-scatter-BHttSxcc.js} +3 -3
- package/dist/client/chunks/{chart-scatter-DP-nn9hH.js.map → chart-scatter-BHttSxcc.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-DE4EX7zi.js → chart-sunburst-Cmzol8kR.js} +3 -3
- package/dist/client/chunks/{chart-sunburst-DE4EX7zi.js.map → chart-sunburst-Cmzol8kR.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-C3O6uQcP.js → chart-tree-map-CdSwr_zI.js} +3 -3
- package/dist/client/chunks/{chart-tree-map-C3O6uQcP.js.map → chart-tree-map-CdSwr_zI.js.map} +1 -1
- package/dist/client/chunks/{chart-waterfall-DU2Fg_7P.js → chart-waterfall-BN3B5luW.js} +3 -3
- package/dist/client/chunks/{chart-waterfall-DU2Fg_7P.js.map → chart-waterfall-BN3B5luW.js.map} +1 -1
- package/dist/client/chunks/{charts-core-DnirPG1F.js → charts-core-DIneMirc.js} +2 -2
- package/dist/client/chunks/{charts-core-DnirPG1F.js.map → charts-core-DIneMirc.js.map} +1 -1
- package/dist/client/chunks/charts-loader-OHpTBq8c.js +87 -0
- package/dist/client/chunks/{charts-loader-tCSbqT7H.js.map → charts-loader-OHpTBq8c.js.map} +1 -1
- package/dist/client/chunks/{nl-NL-B9VnaVAm.js → nl-NL-dk-kC0sL.js} +2 -1
- package/dist/client/chunks/nl-NL-dk-kC0sL.js.map +1 -0
- package/dist/client/chunks/{schema-visualization-o1zzuMQy.js → schema-visualization-PYa578pV.js} +3 -3
- package/dist/client/chunks/{schema-visualization-o1zzuMQy.js.map → schema-visualization-PYa578pV.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-DTYbmRBn.js → useDirtyStateTracking-BQupC3wJ.js} +4 -4
- package/dist/client/chunks/{useDirtyStateTracking-DTYbmRBn.js.map → useDirtyStateTracking-BQupC3wJ.js.map} +1 -1
- package/dist/client/chunks/{useExplainAI-MuC9jBn-.js → useExplainAI-DORnTynt.js} +4 -4
- package/dist/client/chunks/{useExplainAI-MuC9jBn-.js.map → useExplainAI-DORnTynt.js.map} +1 -1
- package/dist/client/chunks/{vendor-XQT9APIq.js → vendor-DDo8nSGP.js} +2 -2
- package/dist/client/chunks/{vendor-XQT9APIq.js.map → vendor-DDo8nSGP.js.map} +1 -1
- package/dist/client/components/AgenticNotebook/chatMessageParts.d.ts +0 -2
- package/dist/client/components/PortletGroupCard.d.ts +3 -1
- package/dist/client/components/RowManagedLayout.d.ts +5 -2
- package/dist/client/components/dashboardPortletCard/cardStyles.d.ts +7 -3
- package/dist/client/components/markdownOverrides.d.ts +202 -0
- package/dist/client/components/rowManagedLayout/sections.d.ts +46 -0
- package/dist/client/components.js +1 -1
- package/dist/client/hooks/agentChatStream.d.ts +3 -2
- package/dist/client/hooks/useAgentChat.d.ts +1 -0
- package/dist/client/hooks.js +3 -3
- package/dist/client/icons.js +1 -1
- package/dist/client/index.js +474 -471
- package/dist/client/index.js.map +1 -1
- package/dist/client/providers.js +1 -1
- package/dist/client/schema.js +1 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/utils.js +4 -4
- package/dist/client-bundle-stats.html +1 -1
- package/dist/mcp-app/mcp-app.html +4 -4
- package/dist/server/agent/agent-prompts.d.ts +14 -0
- package/dist/server/agent/chart-validation.d.ts +14 -0
- package/dist/server/agent/data-shape.d.ts +41 -0
- package/dist/server/agent/providers/anthropic.d.ts +1 -0
- package/dist/server/agent/providers/google.d.ts +1 -0
- package/dist/server/agent/providers/openai.d.ts +1 -0
- package/dist/server/agent/providers/types.d.ts +13 -0
- package/dist/server/agent/tools.d.ts +18 -4
- package/dist/server/agent/types.d.ts +5 -1
- package/dist/server/ai/chart-schema.d.ts +37 -0
- package/dist/server/{anthropic-DG4r1LSm.cjs → anthropic-CqLkud62.cjs} +1 -1
- package/dist/server/{anthropic-CZh4hB-m.js → anthropic-MQlafOZv.js} +3 -0
- package/dist/{adapters/google-PsZzwedr.cjs → server/google-6pofxIfm.cjs} +1 -1
- package/dist/{adapters/google-DRY7jnOh.js → server/google-BBBP1Dhs.js} +3 -0
- package/dist/server/index.cjs +44 -43
- package/dist/server/index.js +2069 -1857
- package/dist/server/{openai-6uUf7h-5.js → openai-nBhuSFd3.js} +9 -3
- package/dist/server/openai-rF50ZEiR.cjs +1 -0
- package/package.json +4 -4
- package/dist/adapters/ActivityGridChart.config-Bc7mPqcf.cjs +0 -1
- package/dist/adapters/ActivityGridChart.config-Dd2YDeaM.js +0 -2
- package/dist/adapters/AreaChart.config-BqNusnpg.js +0 -2
- package/dist/adapters/AreaChart.config-dI84V34B.cjs +0 -1
- package/dist/adapters/BarChart.config-B9MQjgLJ.cjs +0 -1
- package/dist/adapters/BarChart.config-Cq_qcxBA.js +0 -2
- package/dist/adapters/BoxPlotChart.config-XmtRN2xq.cjs +0 -1
- package/dist/adapters/BoxPlotChart.config-Zc-JGV-W.js +0 -2
- package/dist/adapters/BubbleChart.config-CU_18uxb.js +0 -2
- package/dist/adapters/BubbleChart.config-CbhOzA6-.cjs +0 -1
- package/dist/adapters/CandlestickChart.config-Bwo3uaa-.js +0 -2
- package/dist/adapters/CandlestickChart.config-CmRBlWFv.cjs +0 -1
- package/dist/adapters/DataTable.config-7JNSj6qQ.js +0 -2
- package/dist/adapters/DataTable.config-DNxm1sYk.cjs +0 -1
- package/dist/adapters/DotStripChart.config-B7Dl-T1h.js +0 -2
- package/dist/adapters/DotStripChart.config-Co4g1fpZ.cjs +0 -1
- package/dist/adapters/FunnelChart.config-D1TpuGtL.cjs +0 -1
- package/dist/adapters/FunnelChart.config-vuZScOHQ.js +0 -2
- package/dist/adapters/GaugeChart.config-BMgUHKhC.cjs +0 -1
- package/dist/adapters/GaugeChart.config-zdpFydo6.js +0 -2
- package/dist/adapters/HeatMapChart.config-4XMab1zq.js +0 -2
- package/dist/adapters/HeatMapChart.config-C-Ns6QBq.cjs +0 -1
- package/dist/adapters/KpiDelta.config-BGdqsHcc.js +0 -2
- package/dist/adapters/KpiDelta.config-DuNxrGIi.cjs +0 -1
- package/dist/adapters/KpiNumber.config-CkPWpcSz.js +0 -2
- package/dist/adapters/KpiNumber.config-DMGmuA3i.cjs +0 -1
- package/dist/adapters/KpiText.config-Bvtuv8vE.js +0 -2
- package/dist/adapters/KpiText.config-DOMLO16U.cjs +0 -1
- package/dist/adapters/LineChart.config-CJmTSmZ1.js +0 -2
- package/dist/adapters/LineChart.config-CrkGu0aa.cjs +0 -1
- package/dist/adapters/MarkdownChart.config-BgY5Xc97.cjs +0 -1
- package/dist/adapters/MarkdownChart.config-Cm6G4Yuh.js +0 -2
- package/dist/adapters/MeasureProfileChart.config-BYwDo_ox.cjs +0 -1
- package/dist/adapters/MeasureProfileChart.config-Dt7npubZ.js +0 -2
- package/dist/adapters/PieChart.config-BRbPctBN.cjs +0 -1
- package/dist/adapters/PieChart.config-HZofeody.js +0 -2
- package/dist/adapters/ProportionBarChart.config-B_rTtGZr.cjs +0 -1
- package/dist/adapters/ProportionBarChart.config-ChCSoM0L.js +0 -2
- package/dist/adapters/RadarChart.config-B9OdMEib.js +0 -2
- package/dist/adapters/RadarChart.config-BOgPD2Kz.cjs +0 -1
- package/dist/adapters/RadialBarChart.config-CeP7jEbq.js +0 -2
- package/dist/adapters/RadialBarChart.config-sivA1Jmo.cjs +0 -1
- package/dist/adapters/RecordsTable.config-BInSgo-G.js +0 -2
- package/dist/adapters/RecordsTable.config-CVmxLdjz.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-8ry7gh6X.cjs +0 -1
- package/dist/adapters/RetentionCombinedChart.config-Bxtxnlcf.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-DCtOD8dO.js +0 -2
- package/dist/adapters/RetentionHeatmap.config-i-LgmmIT.cjs +0 -1
- package/dist/adapters/SankeyChart.config-DfpeHfNT.cjs +0 -1
- package/dist/adapters/SankeyChart.config-hfM0ACm1.js +0 -2
- package/dist/adapters/ScatterChart.config-BD2vfOZ6.js +0 -2
- package/dist/adapters/ScatterChart.config-CdpvRueF.cjs +0 -1
- package/dist/adapters/SunburstChart.config-Boyt88L_.cjs +0 -1
- package/dist/adapters/SunburstChart.config-BvrofzMv.js +0 -2
- package/dist/adapters/TreeMapChart.config-DBrqwtqT.js +0 -2
- package/dist/adapters/TreeMapChart.config-KcRLlZAG.cjs +0 -1
- package/dist/adapters/WaterfallChart.config-CuCGaIl5.cjs +0 -1
- package/dist/adapters/WaterfallChart.config-DZ8H0V2L.js +0 -2
- package/dist/adapters/compiler-DG6dLFQU.cjs +0 -166
- package/dist/adapters/handler-CRGZ8gd2.cjs +0 -25
- package/dist/adapters/mcp-transport-BqdBHmXL.js +0 -730
- package/dist/adapters/mcp-transport-D8xZJLPD.cjs +0 -42
- package/dist/adapters/openai-DH9MtcLA.cjs +0 -1
- package/dist/adapters/utils-C1JpSDOX.cjs +0 -128
- package/dist/client/chunks/DashboardEditModal-BliiIHcI.js.map +0 -1
- package/dist/client/chunks/chart-activity-grid-CJzxC18G.js.map +0 -1
- package/dist/client/chunks/chart-markdown-yxN_xBP9.js.map +0 -1
- package/dist/client/chunks/charts-loader-tCSbqT7H.js +0 -87
- package/dist/client/chunks/nl-NL-B9VnaVAm.js.map +0 -1
- package/dist/server/openai-BBe1XbZd.cjs +0 -1
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
import { $ as e, A as t, B as n, C as r, D as i, E as a, F as o, G as s, H as c, I as l, J as u, K as d, L as f, M as p, N as m,
|
|
1
|
+
import { $ as e, A as t, B as n, C as r, D as i, E as a, F as o, G as s, H as c, I as l, J as u, K as d, L as f, M as p, N as m, P as h, Q as g, R as _, S as v, T as y, U as b, V as ee, W as te, X as x, Y as ne, Z as re, et as ie, it as ae, j as oe, k as S, nt as C, q as se, rt as ce, tt as le, w as ue, x as de, z as w } from "./utils-C_RKaP0n.js";
|
|
2
2
|
//#region node_modules/drizzle-orm/sql/expressions/select.js
|
|
3
|
-
function de(e) {
|
|
4
|
-
return T`${e} asc`;
|
|
5
|
-
}
|
|
6
3
|
function fe(e) {
|
|
7
|
-
return
|
|
4
|
+
return C`${e} asc`;
|
|
5
|
+
}
|
|
6
|
+
function pe(e) {
|
|
7
|
+
return C`${e} desc`;
|
|
8
8
|
}
|
|
9
9
|
//#endregion
|
|
10
10
|
//#region node_modules/drizzle-orm/sql/functions/aggregate.js
|
|
11
|
-
function
|
|
12
|
-
return
|
|
11
|
+
function T(e) {
|
|
12
|
+
return C`count(${e || C.raw("*")})`.mapWith(Number);
|
|
13
13
|
}
|
|
14
14
|
function me(e) {
|
|
15
|
-
return
|
|
15
|
+
return C`count(distinct ${e})`.mapWith(Number);
|
|
16
16
|
}
|
|
17
17
|
function E(e) {
|
|
18
|
-
return
|
|
18
|
+
return C`sum(${e})`.mapWith(String);
|
|
19
19
|
}
|
|
20
20
|
function D(e) {
|
|
21
|
-
return
|
|
21
|
+
return C`max(${e})`.mapWith(ae(e, ce) ? e : String);
|
|
22
22
|
}
|
|
23
23
|
function he(e) {
|
|
24
|
-
return
|
|
24
|
+
return C`min(${e})`.mapWith(ae(e, ce) ? e : String);
|
|
25
25
|
}
|
|
26
26
|
//#endregion
|
|
27
27
|
//#region src/server/adapters/window-function-builder.ts
|
|
28
28
|
function ge(e) {
|
|
29
|
-
return e && e.length > 0 ?
|
|
29
|
+
return e && e.length > 0 ? C`PARTITION BY ${C.join(e, C`, `)}` : C``;
|
|
30
30
|
}
|
|
31
31
|
function _e(e) {
|
|
32
|
-
return e && e.length > 0 ?
|
|
32
|
+
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``;
|
|
33
33
|
}
|
|
34
34
|
function ve(e) {
|
|
35
35
|
return e === "unbounded" ? "UNBOUNDED PRECEDING" : typeof e == "number" ? `${e} PRECEDING` : "CURRENT ROW";
|
|
@@ -38,19 +38,19 @@ function ye(e) {
|
|
|
38
38
|
return e === "unbounded" ? "UNBOUNDED FOLLOWING" : e === "current" ? "CURRENT ROW" : typeof e == "number" ? `${e} FOLLOWING` : "CURRENT ROW";
|
|
39
39
|
}
|
|
40
40
|
function be(e) {
|
|
41
|
-
if (!e) return
|
|
41
|
+
if (!e) return C``;
|
|
42
42
|
let t = e.type.toUpperCase(), n = ve(e.start), r = ye(e.end);
|
|
43
|
-
return
|
|
43
|
+
return C`${C.raw(t)} BETWEEN ${C.raw(n)} AND ${C.raw(r)}`;
|
|
44
44
|
}
|
|
45
45
|
function xe(e, t, n) {
|
|
46
46
|
let r = [];
|
|
47
47
|
e && e.length > 0 && r.push(ge(e)), t && t.length > 0 && r.push(_e(t)), n?.frame && r.push(be(n.frame));
|
|
48
|
-
let i = r.length > 0 ?
|
|
49
|
-
return
|
|
48
|
+
let i = r.length > 0 ? C.join(r, C` `) : C``;
|
|
49
|
+
return C`OVER (${i})`;
|
|
50
50
|
}
|
|
51
51
|
function Se(e, t, n, r) {
|
|
52
|
-
let i = r?.defaultValue === void 0 ?
|
|
53
|
-
return
|
|
52
|
+
let i = r?.defaultValue === void 0 ? C`` : C`, ${r.defaultValue}`;
|
|
53
|
+
return C`${C.raw(e)}(${t}, ${r?.offset ?? 1}${i}) ${n}`;
|
|
54
54
|
}
|
|
55
55
|
var Ce = {
|
|
56
56
|
rank: "RANK",
|
|
@@ -64,11 +64,11 @@ var Ce = {
|
|
|
64
64
|
};
|
|
65
65
|
function Te(e, t, n, r) {
|
|
66
66
|
if (e === "lag" || e === "lead") return Se(e === "lag" ? "LAG" : "LEAD", t, n, r);
|
|
67
|
-
if (e === "ntile") return
|
|
67
|
+
if (e === "ntile") return C`NTILE(${r?.nTile ?? 4}) ${n}`;
|
|
68
68
|
let i = Ce[e];
|
|
69
|
-
if (i) return
|
|
69
|
+
if (i) return C`${C.raw(i)}() ${n}`;
|
|
70
70
|
let a = we[e];
|
|
71
|
-
if (a) return
|
|
71
|
+
if (a) return C`${C.raw(a)}(${t}) ${n}`;
|
|
72
72
|
throw Error(`Unsupported window function: ${e}`);
|
|
73
73
|
}
|
|
74
74
|
//#endregion
|
|
@@ -78,13 +78,13 @@ var O = class {
|
|
|
78
78
|
return e;
|
|
79
79
|
}
|
|
80
80
|
nullToZero(e) {
|
|
81
|
-
return
|
|
81
|
+
return C`COALESCE(${e}, 0)`;
|
|
82
82
|
}
|
|
83
83
|
caseInsensitiveLike(e, t, n) {
|
|
84
|
-
return n ?
|
|
84
|
+
return n ? C`${e} NOT ILIKE ${t}` : C`${e} ILIKE ${t}`;
|
|
85
85
|
}
|
|
86
86
|
regexCondition(e, t, n) {
|
|
87
|
-
return n ?
|
|
87
|
+
return n ? C`${e} !~* ${t}` : C`${e} ~* ${t}`;
|
|
88
88
|
}
|
|
89
89
|
buildStringCondition(e, t, n) {
|
|
90
90
|
switch (t) {
|
|
@@ -92,8 +92,8 @@ var O = class {
|
|
|
92
92
|
case "notContains": return this.caseInsensitiveLike(e, `%${n}%`, !0);
|
|
93
93
|
case "startsWith": return this.caseInsensitiveLike(e, `${n}%`, !1);
|
|
94
94
|
case "endsWith": return this.caseInsensitiveLike(e, `%${n}`, !1);
|
|
95
|
-
case "like": return
|
|
96
|
-
case "notLike": return
|
|
95
|
+
case "like": return C`${e} LIKE ${n}`;
|
|
96
|
+
case "notLike": return C`${e} NOT LIKE ${n}`;
|
|
97
97
|
case "ilike": return this.caseInsensitiveLike(e, n, !1);
|
|
98
98
|
case "regex": return this.regexCondition(e, n, !1);
|
|
99
99
|
case "notRegex": return this.regexCondition(e, n, !0);
|
|
@@ -102,17 +102,17 @@ var O = class {
|
|
|
102
102
|
}
|
|
103
103
|
buildConditionalAggregation(e, t, n) {
|
|
104
104
|
let r = e.toUpperCase();
|
|
105
|
-
return e === "count" && !t ?
|
|
105
|
+
return e === "count" && !t ? C`${C.raw(r)}(CASE WHEN ${n} THEN 1 END)` : C`${C.raw(r)}(CASE WHEN ${n} THEN ${t} END)`;
|
|
106
106
|
}
|
|
107
107
|
buildAvg(e) {
|
|
108
|
-
return this.nullToZero(
|
|
108
|
+
return this.nullToZero(C`AVG(${e})`);
|
|
109
109
|
}
|
|
110
110
|
buildCaseWhen(e, t) {
|
|
111
|
-
let n = e.map((e) =>
|
|
112
|
-
return t === void 0 ?
|
|
111
|
+
let n = e.map((e) => C`WHEN ${e.when} THEN ${e.then}`).reduce((e, t) => C`${e} ${t}`);
|
|
112
|
+
return t === void 0 ? C`CASE ${n} END` : C`CASE ${n} ELSE ${t} END`;
|
|
113
113
|
}
|
|
114
114
|
buildBooleanLiteral(e) {
|
|
115
|
-
return e ?
|
|
115
|
+
return e ? C`TRUE` : C`FALSE`;
|
|
116
116
|
}
|
|
117
117
|
convertFilterValue(e) {
|
|
118
118
|
return e;
|
|
@@ -128,11 +128,11 @@ var O = class {
|
|
|
128
128
|
}
|
|
129
129
|
buildStddev(e, t = !1) {
|
|
130
130
|
let n = t ? "STDDEV_SAMP" : "STDDEV_POP";
|
|
131
|
-
return this.nullToZero(
|
|
131
|
+
return this.nullToZero(C`${C.raw(n)}(${e})`);
|
|
132
132
|
}
|
|
133
133
|
buildVariance(e, t = !1) {
|
|
134
134
|
let n = t ? "VAR_SAMP" : "VAR_POP";
|
|
135
|
-
return this.nullToZero(
|
|
135
|
+
return this.nullToZero(C`${C.raw(n)}(${e})`);
|
|
136
136
|
}
|
|
137
137
|
buildWindowFunction(e, t, n, r, i) {
|
|
138
138
|
return Te(e, t, xe(n, r, i), i);
|
|
@@ -179,56 +179,56 @@ var O = class {
|
|
|
179
179
|
let t = this.parseISODuration(e), n = [];
|
|
180
180
|
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`);
|
|
181
181
|
let r = n.join(" ") || "0 seconds";
|
|
182
|
-
return
|
|
182
|
+
return C`INTERVAL '${C.raw(r)}'`;
|
|
183
183
|
}
|
|
184
184
|
buildTimeDifferenceSeconds(e, t) {
|
|
185
|
-
return
|
|
185
|
+
return C`EXTRACT(EPOCH FROM (${e} - ${t}))`;
|
|
186
186
|
}
|
|
187
187
|
buildDateAddInterval(e, t) {
|
|
188
188
|
let n = this.buildIntervalFromISO(t);
|
|
189
|
-
return
|
|
189
|
+
return C`(${e} + ${n})`;
|
|
190
190
|
}
|
|
191
191
|
buildConditionalAggregation(e, t, n) {
|
|
192
192
|
let r = e.toUpperCase();
|
|
193
|
-
return e === "count" && !t ?
|
|
193
|
+
return e === "count" && !t ? C`COUNT(*) FILTER (WHERE ${n})` : C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
194
194
|
}
|
|
195
195
|
buildDateDiffPeriods(e, t, n) {
|
|
196
196
|
switch (n) {
|
|
197
|
-
case "day": return
|
|
198
|
-
case "week": return
|
|
199
|
-
case "month": return
|
|
197
|
+
case "day": return C`(${t}::date - ${e}::date)`;
|
|
198
|
+
case "week": return C`FLOOR((${t}::date - ${e}::date) / 7)`;
|
|
199
|
+
case "month": return C`(EXTRACT(YEAR FROM AGE(${t}::timestamp, ${e}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${t}::timestamp, ${e}::timestamp)))::integer`;
|
|
200
200
|
default: throw Error(`Unsupported date diff unit: ${n}`);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
buildPeriodSeriesSubquery(e) {
|
|
204
|
-
return
|
|
204
|
+
return C`(SELECT generate_series(0, ${e}) as period_number) p`;
|
|
205
205
|
}
|
|
206
206
|
buildTimeDimension(e, t) {
|
|
207
207
|
switch (e) {
|
|
208
|
-
case "year": return
|
|
209
|
-
case "quarter": return
|
|
210
|
-
case "month": return
|
|
211
|
-
case "week": return
|
|
212
|
-
case "day": return
|
|
213
|
-
case "hour": return
|
|
214
|
-
case "minute": return
|
|
215
|
-
case "second": return
|
|
208
|
+
case "year": return C`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
209
|
+
case "quarter": return C`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
210
|
+
case "month": return C`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
211
|
+
case "week": return C`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
212
|
+
case "day": return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
213
|
+
case "hour": return C`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
214
|
+
case "minute": return C`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
215
|
+
case "second": return C`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
216
216
|
default: return t;
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
castToType(e, t) {
|
|
220
220
|
switch (t) {
|
|
221
|
-
case "timestamp": return
|
|
222
|
-
case "decimal": return
|
|
223
|
-
case "integer": return
|
|
221
|
+
case "timestamp": return C`${e}::timestamp`;
|
|
222
|
+
case "decimal": return C`${e}::decimal`;
|
|
223
|
+
case "integer": return C`${e}::integer`;
|
|
224
224
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
tryCastToType(e, t) {
|
|
228
228
|
switch (t) {
|
|
229
|
-
case "timestamp": return
|
|
230
|
-
case "decimal": return
|
|
231
|
-
case "integer": return
|
|
229
|
+
case "timestamp": return C`CASE WHEN ${e} ~ ${this.timestampTryCastPattern()} THEN ${e}::timestamp ELSE NULL END`;
|
|
230
|
+
case "decimal": return C`CASE WHEN ${e} ~ ${this.decimalTryCastPattern()} THEN ${e}::decimal ELSE NULL END`;
|
|
231
|
+
case "integer": return C`CASE WHEN ${e} ~ ${this.integerTryCastPattern()} THEN ${e}::integer ELSE NULL END`;
|
|
232
232
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
233
233
|
}
|
|
234
234
|
}
|
|
@@ -242,7 +242,7 @@ var O = class {
|
|
|
242
242
|
}
|
|
243
243
|
buildPercentile(e, t) {
|
|
244
244
|
let n = t / 100;
|
|
245
|
-
return
|
|
245
|
+
return C`PERCENTILE_CONT(${n}) WITHIN GROUP (ORDER BY ${e})`;
|
|
246
246
|
}
|
|
247
247
|
}, De = class extends O {
|
|
248
248
|
getEngineType() {
|
|
@@ -250,21 +250,21 @@ var O = class {
|
|
|
250
250
|
}
|
|
251
251
|
buildIntervalFromISO(e) {
|
|
252
252
|
let t = this.durationToSeconds(e);
|
|
253
|
-
return
|
|
253
|
+
return C`${t}`;
|
|
254
254
|
}
|
|
255
255
|
buildTimeDifferenceSeconds(e, t) {
|
|
256
|
-
return
|
|
256
|
+
return C`TIMESTAMPDIFF(SECOND, ${t}, ${e})`;
|
|
257
257
|
}
|
|
258
258
|
buildDateAddInterval(e, t) {
|
|
259
259
|
let n = this.parseISODuration(t), r = e;
|
|
260
|
-
return n.years && (r =
|
|
260
|
+
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;
|
|
261
261
|
}
|
|
262
262
|
buildDateDiffPeriods(e, t, n) {
|
|
263
263
|
let r = n.toUpperCase();
|
|
264
|
-
return
|
|
264
|
+
return C`TIMESTAMPDIFF(${C.raw(r)}, ${e}, ${t})`;
|
|
265
265
|
}
|
|
266
266
|
buildPeriodSeriesSubquery(e) {
|
|
267
|
-
return
|
|
267
|
+
return C`(
|
|
268
268
|
WITH RECURSIVE periods(period_number) AS (
|
|
269
269
|
SELECT 0
|
|
270
270
|
UNION ALL
|
|
@@ -285,39 +285,39 @@ var O = class {
|
|
|
285
285
|
second: "%Y-%m-%d %H:%i:%s"
|
|
286
286
|
};
|
|
287
287
|
switch (e) {
|
|
288
|
-
case "quarter": return
|
|
289
|
-
case "week": return
|
|
288
|
+
case "quarter": return C`DATE_ADD(MAKEDATE(YEAR(${t}), 1), INTERVAL (QUARTER(${t}) - 1) * 3 MONTH)`;
|
|
289
|
+
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')`;
|
|
290
290
|
default: {
|
|
291
291
|
let r = n[e];
|
|
292
|
-
return r ?
|
|
292
|
+
return r ? C`STR_TO_DATE(DATE_FORMAT(${t}, ${r}), '%Y-%m-%d %H:%i:%s')` : t;
|
|
293
293
|
}
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
caseInsensitiveLike(e, t, n) {
|
|
297
297
|
let r = t.toLowerCase();
|
|
298
|
-
return n ?
|
|
298
|
+
return n ? C`LOWER(${e}) NOT LIKE ${r}` : C`LOWER(${e}) LIKE ${r}`;
|
|
299
299
|
}
|
|
300
300
|
regexCondition(e, t, n) {
|
|
301
|
-
return n ?
|
|
301
|
+
return n ? C`${e} NOT REGEXP ${t}` : C`${e} REGEXP ${t}`;
|
|
302
302
|
}
|
|
303
303
|
castToType(e, t) {
|
|
304
304
|
switch (t) {
|
|
305
|
-
case "timestamp": return
|
|
306
|
-
case "decimal": return
|
|
307
|
-
case "integer": return
|
|
305
|
+
case "timestamp": return C`CAST(${e} AS DATETIME)`;
|
|
306
|
+
case "decimal": return C`CAST(${e} AS DECIMAL(10,2))`;
|
|
307
|
+
case "integer": return C`CAST(${e} AS SIGNED INTEGER)`;
|
|
308
308
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
309
309
|
}
|
|
310
310
|
}
|
|
311
311
|
tryCastToType(e, t) {
|
|
312
312
|
switch (t) {
|
|
313
|
-
case "timestamp": return
|
|
314
|
-
case "decimal": return
|
|
315
|
-
case "integer": return
|
|
313
|
+
case "timestamp": return C`CASE WHEN ${e} REGEXP ${this.timestampTryCastPattern()} THEN CAST(${e} AS DATETIME) ELSE NULL END`;
|
|
314
|
+
case "decimal": return C`CASE WHEN ${e} REGEXP ${this.decimalTryCastPattern()} THEN CAST(${e} AS DECIMAL(10,2)) ELSE NULL END`;
|
|
315
|
+
case "integer": return C`CASE WHEN ${e} REGEXP ${this.integerTryCastPattern()} THEN CAST(${e} AS SIGNED INTEGER) ELSE NULL END`;
|
|
316
316
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
319
|
nullToZero(e) {
|
|
320
|
-
return
|
|
320
|
+
return C`IFNULL(${e}, 0)`;
|
|
321
321
|
}
|
|
322
322
|
getCapabilities() {
|
|
323
323
|
return {
|
|
@@ -336,25 +336,25 @@ var O = class {
|
|
|
336
336
|
}
|
|
337
337
|
buildIntervalFromISO(e) {
|
|
338
338
|
let t = this.durationToSeconds(e);
|
|
339
|
-
return
|
|
339
|
+
return C`${t}`;
|
|
340
340
|
}
|
|
341
341
|
buildTimeDifferenceSeconds(e, t) {
|
|
342
|
-
return
|
|
342
|
+
return C`(${e} - ${t})`;
|
|
343
343
|
}
|
|
344
344
|
buildDateAddInterval(e, t) {
|
|
345
345
|
let n = this.durationToSeconds(t);
|
|
346
|
-
return
|
|
346
|
+
return C`(${e} + ${n})`;
|
|
347
347
|
}
|
|
348
348
|
buildDateDiffPeriods(e, t, n) {
|
|
349
349
|
switch (n) {
|
|
350
|
-
case "day": return
|
|
351
|
-
case "week": return
|
|
352
|
-
case "month": return
|
|
350
|
+
case "day": return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) AS INTEGER)`;
|
|
351
|
+
case "week": return C`CAST((julianday(datetime(${t}, 'unixepoch')) - julianday(datetime(${e}, 'unixepoch'))) / 7 AS INTEGER)`;
|
|
352
|
+
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)))`;
|
|
353
353
|
default: throw Error(`Unsupported date diff unit for SQLite: ${n}`);
|
|
354
354
|
}
|
|
355
355
|
}
|
|
356
356
|
buildPeriodSeriesSubquery(e) {
|
|
357
|
-
return
|
|
357
|
+
return C`(
|
|
358
358
|
WITH RECURSIVE periods(period_number) AS (
|
|
359
359
|
SELECT 0
|
|
360
360
|
UNION ALL
|
|
@@ -365,62 +365,62 @@ var O = class {
|
|
|
365
365
|
}
|
|
366
366
|
buildTimeDimension(e, t) {
|
|
367
367
|
switch (e) {
|
|
368
|
-
case "year": return
|
|
368
|
+
case "year": return C`datetime(${t}, 'unixepoch', 'start of year')`;
|
|
369
369
|
case "quarter": {
|
|
370
|
-
let e =
|
|
371
|
-
return
|
|
370
|
+
let e = C`datetime(${t}, 'unixepoch')`;
|
|
371
|
+
return C`datetime(${e}, 'start of year',
|
|
372
372
|
'+' || (((CAST(strftime('%m', ${e}) AS INTEGER) - 1) / 3) * 3) || ' months')`;
|
|
373
373
|
}
|
|
374
|
-
case "month": return
|
|
375
|
-
case "week": return
|
|
376
|
-
case "day": return
|
|
374
|
+
case "month": return C`datetime(${t}, 'unixepoch', 'start of month')`;
|
|
375
|
+
case "week": return C`date(datetime(${t}, 'unixepoch'), 'weekday 1', '-6 days')`;
|
|
376
|
+
case "day": return C`datetime(${t}, 'unixepoch', 'start of day')`;
|
|
377
377
|
case "hour": {
|
|
378
|
-
let e =
|
|
379
|
-
return
|
|
378
|
+
let e = C`datetime(${t}, 'unixepoch')`;
|
|
379
|
+
return C`datetime(strftime('%Y-%m-%d %H:00:00', ${e}))`;
|
|
380
380
|
}
|
|
381
381
|
case "minute": {
|
|
382
|
-
let e =
|
|
383
|
-
return
|
|
382
|
+
let e = C`datetime(${t}, 'unixepoch')`;
|
|
383
|
+
return C`datetime(strftime('%Y-%m-%d %H:%M:00', ${e}))`;
|
|
384
384
|
}
|
|
385
385
|
case "second": {
|
|
386
|
-
let e =
|
|
387
|
-
return
|
|
386
|
+
let e = C`datetime(${t}, 'unixepoch')`;
|
|
387
|
+
return C`datetime(strftime('%Y-%m-%d %H:%M:%S', ${e}))`;
|
|
388
388
|
}
|
|
389
|
-
default: return
|
|
389
|
+
default: return C`datetime(${t}, 'unixepoch')`;
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
392
|
caseInsensitiveLike(e, t, n) {
|
|
393
393
|
let r = t.toLowerCase();
|
|
394
|
-
return n ?
|
|
394
|
+
return n ? C`LOWER(${e}) NOT LIKE ${r}` : C`LOWER(${e}) LIKE ${r}`;
|
|
395
395
|
}
|
|
396
396
|
regexCondition(e, t, n) {
|
|
397
|
-
return n ?
|
|
397
|
+
return n ? C`${e} NOT GLOB ${t}` : C`${e} GLOB ${t}`;
|
|
398
398
|
}
|
|
399
399
|
castToType(e, t) {
|
|
400
400
|
switch (t) {
|
|
401
|
-
case "timestamp": return
|
|
402
|
-
case "decimal": return
|
|
403
|
-
case "integer": return
|
|
401
|
+
case "timestamp": return C`datetime(${e} / 1000, 'unixepoch')`;
|
|
402
|
+
case "decimal": return C`CAST(${e} AS REAL)`;
|
|
403
|
+
case "integer": return C`CAST(${e} AS INTEGER)`;
|
|
404
404
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
407
|
tryCastToType(e, t) {
|
|
408
408
|
switch (t) {
|
|
409
|
-
case "timestamp": return
|
|
410
|
-
case "decimal": return
|
|
411
|
-
case "integer": return
|
|
409
|
+
case "timestamp": return C`CASE WHEN TRIM(${e}) = '' OR TRIM(${e}) GLOB '*[^0-9-]*' THEN NULL ELSE datetime(${e} / 1000, 'unixepoch') END`;
|
|
410
|
+
case "decimal": return C`CASE WHEN TRIM(${e}) = '' OR TRIM(${e}) GLOB '*[^0-9.+-]*' THEN NULL ELSE CAST(${e} AS REAL) END`;
|
|
411
|
+
case "integer": return C`CASE WHEN TRIM(${e}) = '' OR TRIM(${e}) GLOB '*[^0-9+-]*' THEN NULL ELSE CAST(${e} AS INTEGER) END`;
|
|
412
412
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
413
413
|
}
|
|
414
414
|
}
|
|
415
415
|
nullToZero(e) {
|
|
416
|
-
return
|
|
416
|
+
return C`IFNULL(${e}, 0)`;
|
|
417
417
|
}
|
|
418
418
|
buildCaseWhen(e, t) {
|
|
419
|
-
let n = e.map((e) => e.then && typeof e.then == "object" && (e.then.queryChunks || e.then._ || e.then.sql) ?
|
|
420
|
-
return t === void 0 ?
|
|
419
|
+
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}`);
|
|
420
|
+
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`;
|
|
421
421
|
}
|
|
422
422
|
buildBooleanLiteral(e) {
|
|
423
|
-
return e ?
|
|
423
|
+
return e ? C`1` : C`0`;
|
|
424
424
|
}
|
|
425
425
|
preprocessCalculatedTemplate(e) {
|
|
426
426
|
return e.length > 1e3 ? e : e.replace(/(\{[^}]+\})\s*\/\s*/g, (e, t) => `${t.replace(/\{([^}]+)\}/, "CAST({$1} AS REAL)")} / `);
|
|
@@ -468,54 +468,54 @@ var O = class {
|
|
|
468
468
|
let t = this.parseISODuration(e), n = [];
|
|
469
469
|
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`);
|
|
470
470
|
let r = n.join(" ") || "0 seconds";
|
|
471
|
-
return
|
|
471
|
+
return C`INTERVAL '${C.raw(r)}'`;
|
|
472
472
|
}
|
|
473
473
|
buildTimeDifferenceSeconds(e, t) {
|
|
474
|
-
return
|
|
474
|
+
return C`(EPOCH(${e}) - EPOCH(${t}))`;
|
|
475
475
|
}
|
|
476
476
|
buildDateAddInterval(e, t) {
|
|
477
477
|
let n = this.buildIntervalFromISO(t);
|
|
478
|
-
return
|
|
478
|
+
return C`(${e} + ${n})`;
|
|
479
479
|
}
|
|
480
480
|
buildConditionalAggregation(e, t, n) {
|
|
481
481
|
let r = e.toUpperCase();
|
|
482
|
-
return e === "count" && !t ?
|
|
482
|
+
return e === "count" && !t ? C`COUNT(*) FILTER (WHERE ${n})` : C`${C.raw(r)}(${t}) FILTER (WHERE ${n})`;
|
|
483
483
|
}
|
|
484
484
|
buildDateDiffPeriods(e, t, n) {
|
|
485
|
-
return
|
|
485
|
+
return C`DATE_DIFF('${C.raw(n)}', ${e}::timestamp, ${t}::timestamp)`;
|
|
486
486
|
}
|
|
487
487
|
buildPeriodSeriesSubquery(e) {
|
|
488
|
-
return
|
|
488
|
+
return C`(SELECT UNNEST(generate_series(0, ${e})) as period_number) p`;
|
|
489
489
|
}
|
|
490
490
|
buildTimeDimension(e, t) {
|
|
491
491
|
switch (e) {
|
|
492
|
-
case "year": return
|
|
493
|
-
case "quarter": return
|
|
494
|
-
case "month": return
|
|
495
|
-
case "week": return
|
|
496
|
-
case "day": return
|
|
497
|
-
case "hour": return
|
|
498
|
-
case "minute": return
|
|
499
|
-
case "second": return
|
|
492
|
+
case "year": return C`DATE_TRUNC('year', ${t}::timestamp)`;
|
|
493
|
+
case "quarter": return C`DATE_TRUNC('quarter', ${t}::timestamp)`;
|
|
494
|
+
case "month": return C`DATE_TRUNC('month', ${t}::timestamp)`;
|
|
495
|
+
case "week": return C`DATE_TRUNC('week', ${t}::timestamp)`;
|
|
496
|
+
case "day": return C`DATE_TRUNC('day', ${t}::timestamp)::timestamp`;
|
|
497
|
+
case "hour": return C`DATE_TRUNC('hour', ${t}::timestamp)`;
|
|
498
|
+
case "minute": return C`DATE_TRUNC('minute', ${t}::timestamp)`;
|
|
499
|
+
case "second": return C`DATE_TRUNC('second', ${t}::timestamp)`;
|
|
500
500
|
default: return t;
|
|
501
501
|
}
|
|
502
502
|
}
|
|
503
503
|
regexCondition(e, t, n) {
|
|
504
|
-
return n ?
|
|
504
|
+
return n ? C`NOT regexp_matches(${e}, ${t})` : C`regexp_matches(${e}, ${t})`;
|
|
505
505
|
}
|
|
506
506
|
castToType(e, t) {
|
|
507
507
|
switch (t) {
|
|
508
|
-
case "timestamp": return
|
|
509
|
-
case "decimal": return
|
|
510
|
-
case "integer": return
|
|
508
|
+
case "timestamp": return C`${e}::timestamp`;
|
|
509
|
+
case "decimal": return C`${e}::decimal`;
|
|
510
|
+
case "integer": return C`${e}::integer`;
|
|
511
511
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
512
512
|
}
|
|
513
513
|
}
|
|
514
514
|
tryCastToType(e, t) {
|
|
515
515
|
switch (t) {
|
|
516
|
-
case "timestamp": return
|
|
517
|
-
case "decimal": return
|
|
518
|
-
case "integer": return
|
|
516
|
+
case "timestamp": return C`TRY_CAST(${e} AS timestamp)`;
|
|
517
|
+
case "decimal": return C`TRY_CAST(${e} AS decimal)`;
|
|
518
|
+
case "integer": return C`TRY_CAST(${e} AS integer)`;
|
|
519
519
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
520
520
|
}
|
|
521
521
|
}
|
|
@@ -529,7 +529,7 @@ var O = class {
|
|
|
529
529
|
}
|
|
530
530
|
buildPercentile(e, t) {
|
|
531
531
|
let n = t / 100;
|
|
532
|
-
return
|
|
532
|
+
return C`QUANTILE_CONT(${e}, ${n})`;
|
|
533
533
|
}
|
|
534
534
|
}, je = class extends O {
|
|
535
535
|
getEngineType() {
|
|
@@ -537,56 +537,56 @@ var O = class {
|
|
|
537
537
|
}
|
|
538
538
|
buildIntervalFromISO(e) {
|
|
539
539
|
let t = this.parseISODuration(e), n = [];
|
|
540
|
-
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
|
|
541
|
-
if (n.length === 1) return
|
|
540
|
+
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`;
|
|
541
|
+
if (n.length === 1) return C`INTERVAL ${C.raw(n[0])}`;
|
|
542
542
|
let r = n.map((e) => `INTERVAL ${e}`);
|
|
543
|
-
return
|
|
543
|
+
return C`(${C.raw(r.join(" + "))})`;
|
|
544
544
|
}
|
|
545
545
|
buildTimeDifferenceSeconds(e, t) {
|
|
546
|
-
return
|
|
546
|
+
return C`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${e}, ${t}))`;
|
|
547
547
|
}
|
|
548
548
|
buildDateAddInterval(e, t) {
|
|
549
549
|
let n = this.buildIntervalFromISO(t);
|
|
550
|
-
return
|
|
550
|
+
return C`(${e} + ${n})`;
|
|
551
551
|
}
|
|
552
552
|
buildDateDiffPeriods(e, t, n) {
|
|
553
|
-
return
|
|
553
|
+
return C`DATE_DIFF('${C.raw(n)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
554
554
|
}
|
|
555
555
|
buildPeriodSeriesSubquery(e) {
|
|
556
|
-
return
|
|
556
|
+
return C`(SELECT number as period_number FROM numbers(${e + 1})) p`;
|
|
557
557
|
}
|
|
558
558
|
buildTimeDimension(e, t) {
|
|
559
559
|
switch (e) {
|
|
560
|
-
case "year": return
|
|
561
|
-
case "quarter": return
|
|
562
|
-
case "month": return
|
|
563
|
-
case "week": return
|
|
564
|
-
case "day": return
|
|
565
|
-
case "hour": return
|
|
566
|
-
case "minute": return
|
|
567
|
-
case "second": return
|
|
560
|
+
case "year": return C`DATE_TRUNC(YEAR, ${t}::TIMESTAMP)`;
|
|
561
|
+
case "quarter": return C`DATE_TRUNC(QUARTER, ${t}::TIMESTAMP)`;
|
|
562
|
+
case "month": return C`DATE_TRUNC(MONTH, ${t}::TIMESTAMP)`;
|
|
563
|
+
case "week": return C`DATE_TRUNC(WEEK, ${t}::TIMESTAMP)`;
|
|
564
|
+
case "day": return C`DATE_TRUNC(DAY, ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
565
|
+
case "hour": return C`DATE_TRUNC(HOUR, ${t}::TIMESTAMP)`;
|
|
566
|
+
case "minute": return C`DATE_TRUNC(MINUTE, ${t}::TIMESTAMP)`;
|
|
567
|
+
case "second": return C`DATE_TRUNC(SECOND, ${t}::TIMESTAMP)`;
|
|
568
568
|
default: return t;
|
|
569
569
|
}
|
|
570
570
|
}
|
|
571
571
|
caseInsensitiveLike(e, t, n) {
|
|
572
|
-
return n ?
|
|
572
|
+
return n ? C`LOWER(${e}) NOT LIKE LOWER(${t})` : C`LOWER(${e}) LIKE LOWER(${t})`;
|
|
573
573
|
}
|
|
574
574
|
regexCondition(e, t, n) {
|
|
575
|
-
return n ?
|
|
575
|
+
return n ? C`NOT (${e} REGEXP ${t})` : C`${e} REGEXP ${t}`;
|
|
576
576
|
}
|
|
577
577
|
castToType(e, t) {
|
|
578
578
|
switch (t) {
|
|
579
|
-
case "timestamp": return
|
|
580
|
-
case "decimal": return
|
|
581
|
-
case "integer": return
|
|
579
|
+
case "timestamp": return C`${e}::TIMESTAMP`;
|
|
580
|
+
case "decimal": return C`${e}::DECIMAL`;
|
|
581
|
+
case "integer": return C`${e}::INTEGER`;
|
|
582
582
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
583
583
|
}
|
|
584
584
|
}
|
|
585
585
|
tryCastToType(e, t) {
|
|
586
586
|
switch (t) {
|
|
587
|
-
case "timestamp": return
|
|
588
|
-
case "decimal": return
|
|
589
|
-
case "integer": return
|
|
587
|
+
case "timestamp": return C`TRY_CAST(${e} AS TIMESTAMP)`;
|
|
588
|
+
case "decimal": return C`TRY_CAST(${e} AS DECIMAL)`;
|
|
589
|
+
case "integer": return C`TRY_CAST(${e} AS INTEGER)`;
|
|
590
590
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
591
591
|
}
|
|
592
592
|
}
|
|
@@ -600,7 +600,7 @@ var O = class {
|
|
|
600
600
|
}
|
|
601
601
|
buildVariance(e, t = !1) {
|
|
602
602
|
let n = t ? "COVAR_SAMP" : "COVAR_POP";
|
|
603
|
-
return
|
|
603
|
+
return C`COALESCE(${C.raw(n)}(${e}, ${e}), 0)`;
|
|
604
604
|
}
|
|
605
605
|
buildPercentile(e, t) {
|
|
606
606
|
throw Error("Percentile functions are not yet supported for Databend");
|
|
@@ -611,51 +611,51 @@ var O = class {
|
|
|
611
611
|
}
|
|
612
612
|
buildIntervalFromISO(e) {
|
|
613
613
|
let t = this.durationToSeconds(e);
|
|
614
|
-
return
|
|
614
|
+
return C`${t}`;
|
|
615
615
|
}
|
|
616
616
|
buildTimeDifferenceSeconds(e, t) {
|
|
617
|
-
return
|
|
617
|
+
return C`DATEDIFF('SECOND', ${t}, ${e})`;
|
|
618
618
|
}
|
|
619
619
|
buildDateAddInterval(e, t) {
|
|
620
620
|
let n = this.parseISODuration(t), r = e;
|
|
621
|
-
return n.years && (r =
|
|
621
|
+
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;
|
|
622
622
|
}
|
|
623
623
|
buildDateDiffPeriods(e, t, n) {
|
|
624
624
|
let r = n.toUpperCase();
|
|
625
|
-
return
|
|
625
|
+
return C`DATEDIFF('${C.raw(r)}', ${e}::TIMESTAMP, ${t}::TIMESTAMP)`;
|
|
626
626
|
}
|
|
627
627
|
buildPeriodSeriesSubquery(e) {
|
|
628
|
-
return
|
|
628
|
+
return C`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${e + 1}))) p`;
|
|
629
629
|
}
|
|
630
630
|
buildTimeDimension(e, t) {
|
|
631
631
|
switch (e) {
|
|
632
|
-
case "year": return
|
|
633
|
-
case "quarter": return
|
|
634
|
-
case "month": return
|
|
635
|
-
case "week": return
|
|
636
|
-
case "day": return
|
|
637
|
-
case "hour": return
|
|
638
|
-
case "minute": return
|
|
639
|
-
case "second": return
|
|
632
|
+
case "year": return C`DATE_TRUNC('YEAR', ${t}::TIMESTAMP)`;
|
|
633
|
+
case "quarter": return C`DATE_TRUNC('QUARTER', ${t}::TIMESTAMP)`;
|
|
634
|
+
case "month": return C`DATE_TRUNC('MONTH', ${t}::TIMESTAMP)`;
|
|
635
|
+
case "week": return C`DATE_TRUNC('WEEK', ${t}::TIMESTAMP)`;
|
|
636
|
+
case "day": return C`DATE_TRUNC('DAY', ${t}::TIMESTAMP)::TIMESTAMP`;
|
|
637
|
+
case "hour": return C`DATE_TRUNC('HOUR', ${t}::TIMESTAMP)`;
|
|
638
|
+
case "minute": return C`DATE_TRUNC('MINUTE', ${t}::TIMESTAMP)`;
|
|
639
|
+
case "second": return C`DATE_TRUNC('SECOND', ${t}::TIMESTAMP)`;
|
|
640
640
|
default: return t;
|
|
641
641
|
}
|
|
642
642
|
}
|
|
643
643
|
regexCondition(e, t, n) {
|
|
644
|
-
return n ?
|
|
644
|
+
return n ? C`NOT REGEXP_LIKE(${e}, ${t})` : C`REGEXP_LIKE(${e}, ${t})`;
|
|
645
645
|
}
|
|
646
646
|
castToType(e, t) {
|
|
647
647
|
switch (t) {
|
|
648
|
-
case "timestamp": return
|
|
649
|
-
case "decimal": return
|
|
650
|
-
case "integer": return
|
|
648
|
+
case "timestamp": return C`${e}::TIMESTAMP`;
|
|
649
|
+
case "decimal": return C`${e}::DECIMAL`;
|
|
650
|
+
case "integer": return C`${e}::INTEGER`;
|
|
651
651
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
652
652
|
}
|
|
653
653
|
}
|
|
654
654
|
tryCastToType(e, t) {
|
|
655
655
|
switch (t) {
|
|
656
|
-
case "timestamp": return
|
|
657
|
-
case "decimal": return
|
|
658
|
-
case "integer": return
|
|
656
|
+
case "timestamp": return C`TRY_CAST(${e} AS TIMESTAMP)`;
|
|
657
|
+
case "decimal": return C`TRY_CAST(${e} AS DECIMAL)`;
|
|
658
|
+
case "integer": return C`TRY_CAST(${e} AS INTEGER)`;
|
|
659
659
|
default: throw Error(`Unsupported cast type: ${t}`);
|
|
660
660
|
}
|
|
661
661
|
}
|
|
@@ -669,7 +669,7 @@ var O = class {
|
|
|
669
669
|
}
|
|
670
670
|
buildPercentile(e, t) {
|
|
671
671
|
let n = (t / 100).toString();
|
|
672
|
-
return
|
|
672
|
+
return C`PERCENTILE_CONT(${C.raw(n)}) WITHIN GROUP (ORDER BY ${e})`;
|
|
673
673
|
}
|
|
674
674
|
};
|
|
675
675
|
//#endregion
|
|
@@ -785,18 +785,18 @@ function j(e, t, n) {
|
|
|
785
785
|
let r = [];
|
|
786
786
|
if (n === "question") {
|
|
787
787
|
let n = e.split("?");
|
|
788
|
-
r.push(
|
|
789
|
-
for (let e = 1; e < n.length; e++) r.push(
|
|
788
|
+
r.push(C.raw(n[0]));
|
|
789
|
+
for (let e = 1; e < n.length; e++) r.push(C`${t[e - 1]}`), r.push(C.raw(n[e]));
|
|
790
790
|
} else {
|
|
791
791
|
let n = /\$(\d+)/g, i = 0, a;
|
|
792
792
|
for (; (a = n.exec(e)) !== null;) {
|
|
793
|
-
r.push(
|
|
793
|
+
r.push(C.raw(e.slice(i, a.index)));
|
|
794
794
|
let n = parseInt(a[1], 10) - 1;
|
|
795
|
-
r.push(
|
|
795
|
+
r.push(C`${t[n]}`), i = a.index + a[0].length;
|
|
796
796
|
}
|
|
797
|
-
r.push(
|
|
797
|
+
r.push(C.raw(e.slice(i)));
|
|
798
798
|
}
|
|
799
|
-
return
|
|
799
|
+
return C.join(r);
|
|
800
800
|
}
|
|
801
801
|
function Re(e) {
|
|
802
802
|
return e && typeof e == "object" ? e : null;
|
|
@@ -896,7 +896,7 @@ var Ke = class extends k {
|
|
|
896
896
|
async explainQuery(e, t, n) {
|
|
897
897
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
898
898
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
899
|
-
return Ie(Ve(He(await this.db.execute(
|
|
899
|
+
return Ie(Ve(He(await this.db.execute(C`${C.raw(r)} ${j(e, t, "dollar")}`))), {
|
|
900
900
|
sql: e,
|
|
901
901
|
params: t
|
|
902
902
|
});
|
|
@@ -905,7 +905,7 @@ var Ke = class extends k {
|
|
|
905
905
|
if (!e || e.length === 0) return [];
|
|
906
906
|
if (!this.db.execute) throw Error("PostgreSQL database instance must have an execute method");
|
|
907
907
|
try {
|
|
908
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = He(await this.db.execute(
|
|
908
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = He(await this.db.execute(C`
|
|
909
909
|
SELECT
|
|
910
910
|
t.relname as table_name,
|
|
911
911
|
i.relname as index_name,
|
|
@@ -919,7 +919,7 @@ var Ke = class extends k {
|
|
|
919
919
|
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
920
920
|
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
921
921
|
WHERE n.nspname = 'public'
|
|
922
|
-
AND t.relname IN (${
|
|
922
|
+
AND t.relname IN (${C.raw(t)})
|
|
923
923
|
GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
|
|
924
924
|
ORDER BY t.relname, i.relname
|
|
925
925
|
`));
|
|
@@ -1018,7 +1018,7 @@ var Xe = class extends k {
|
|
|
1018
1018
|
async explainQuery(e, t, n) {
|
|
1019
1019
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1020
1020
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1021
|
-
return Ye(ze(await this.db.execute(
|
|
1021
|
+
return Ye(ze(await this.db.execute(C`${C.raw(r)} ${j(e, t, "question")}`)), {
|
|
1022
1022
|
sql: e,
|
|
1023
1023
|
params: t
|
|
1024
1024
|
});
|
|
@@ -1027,7 +1027,7 @@ var Xe = class extends k {
|
|
|
1027
1027
|
if (!e || e.length === 0) return [];
|
|
1028
1028
|
if (!this.db.execute) throw Error("MySQL database instance must have an execute method");
|
|
1029
1029
|
try {
|
|
1030
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1030
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(C`
|
|
1031
1031
|
SELECT
|
|
1032
1032
|
TABLE_NAME as table_name,
|
|
1033
1033
|
INDEX_NAME as index_name,
|
|
@@ -1036,7 +1036,7 @@ var Xe = class extends k {
|
|
|
1036
1036
|
CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
|
|
1037
1037
|
FROM INFORMATION_SCHEMA.STATISTICS
|
|
1038
1038
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
1039
|
-
AND LOWER(TABLE_NAME) IN (${
|
|
1039
|
+
AND LOWER(TABLE_NAME) IN (${C.raw(t)})
|
|
1040
1040
|
GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
|
|
1041
1041
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
1042
1042
|
`);
|
|
@@ -1157,7 +1157,7 @@ var et = class extends k {
|
|
|
1157
1157
|
}
|
|
1158
1158
|
async explainQuery(e, t, n) {
|
|
1159
1159
|
let r;
|
|
1160
|
-
if (this.db.all) r = this.db.all(
|
|
1160
|
+
if (this.db.all) r = this.db.all(C`EXPLAIN QUERY PLAN ${j(e, t, "question")}`);
|
|
1161
1161
|
else throw Error("SQLite database instance must have an all() method for EXPLAIN");
|
|
1162
1162
|
return $e(Be(r), {
|
|
1163
1163
|
sql: e,
|
|
@@ -1170,9 +1170,9 @@ var et = class extends k {
|
|
|
1170
1170
|
try {
|
|
1171
1171
|
let t = [];
|
|
1172
1172
|
for (let n of e) {
|
|
1173
|
-
let e = this.db.all(
|
|
1173
|
+
let e = this.db.all(C.raw(`SELECT name, "unique", origin FROM pragma_index_list('${n.toLowerCase()}')`));
|
|
1174
1174
|
if (Array.isArray(e)) for (let r of e) {
|
|
1175
|
-
let e = r.name, i = !!r.unique, a = r.origin, o = this.db.all(
|
|
1175
|
+
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 = [];
|
|
1176
1176
|
if (Array.isArray(o)) for (let e of o) {
|
|
1177
1177
|
let t = e.name;
|
|
1178
1178
|
typeof t == "string" && s.push(t);
|
|
@@ -1349,7 +1349,7 @@ var st = class extends k {
|
|
|
1349
1349
|
async explainQuery(e, t, n) {
|
|
1350
1350
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1351
1351
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1352
|
-
let i = await this.db.execute(
|
|
1352
|
+
let i = await this.db.execute(C`${C.raw(r)} ${j(e, t, "dollar")}`), a = [];
|
|
1353
1353
|
if (Array.isArray(i)) {
|
|
1354
1354
|
for (let e of i) if (e && typeof e == "object") {
|
|
1355
1355
|
let t = e.explain_value || e["QUERY PLAN"] || e.query_plan || e.Plan || Object.values(e)[0];
|
|
@@ -1365,7 +1365,7 @@ var st = class extends k {
|
|
|
1365
1365
|
if (!e || e.length === 0) return [];
|
|
1366
1366
|
if (!this.db.execute) throw Error("DuckDB database instance must have an execute method");
|
|
1367
1367
|
try {
|
|
1368
|
-
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(
|
|
1368
|
+
let t = e.map((e) => `'${e.toLowerCase()}'`).join(","), n = await this.db.execute(C`
|
|
1369
1369
|
SELECT
|
|
1370
1370
|
table_name,
|
|
1371
1371
|
index_name,
|
|
@@ -1373,7 +1373,7 @@ var st = class extends k {
|
|
|
1373
1373
|
is_unique,
|
|
1374
1374
|
is_primary
|
|
1375
1375
|
FROM duckdb_indexes()
|
|
1376
|
-
WHERE LOWER(table_name) IN (${
|
|
1376
|
+
WHERE LOWER(table_name) IN (${C.raw(t)})
|
|
1377
1377
|
GROUP BY table_name, index_name, is_unique, is_primary
|
|
1378
1378
|
ORDER BY table_name, index_name
|
|
1379
1379
|
`);
|
|
@@ -1524,7 +1524,7 @@ var ft = class extends k {
|
|
|
1524
1524
|
async explainQuery(e, t, n) {
|
|
1525
1525
|
let r = n?.analyze ? "EXPLAIN ANALYZE" : "EXPLAIN";
|
|
1526
1526
|
if (!this.db.execute) throw Error("Databend database instance must have an execute method");
|
|
1527
|
-
let i = await this.db.execute(
|
|
1527
|
+
let i = await this.db.execute(C`${C.raw(r)} ${j(e, t, "dollar")}`), a = [];
|
|
1528
1528
|
if (Array.isArray(i)) {
|
|
1529
1529
|
for (let e of i) if (e && typeof e == "object") {
|
|
1530
1530
|
let t = e.explain || e["QUERY PLAN"] || e.query_plan || e.Plan || Object.values(e)[0];
|
|
@@ -1680,7 +1680,7 @@ var vt = class extends k {
|
|
|
1680
1680
|
}
|
|
1681
1681
|
async explainQuery(e, t, n) {
|
|
1682
1682
|
if (n?.analyze, !this.db.execute) throw Error("Snowflake database instance must have an execute method");
|
|
1683
|
-
let r = await this.db.execute(
|
|
1683
|
+
let r = await this.db.execute(C`${C.raw("EXPLAIN")} ${j(e, t, "question")}`), i = [];
|
|
1684
1684
|
if (Array.isArray(r)) {
|
|
1685
1685
|
for (let e of r) if (e && typeof e == "object") {
|
|
1686
1686
|
let t = e.content || e["QUERY PLAN"] || e.plan || Object.values(e)[0];
|
|
@@ -1932,14 +1932,14 @@ var I = class {
|
|
|
1932
1932
|
this.databaseAdapter = e;
|
|
1933
1933
|
}
|
|
1934
1934
|
buildTimeDimensionExpression(e, t, n) {
|
|
1935
|
-
let r =
|
|
1936
|
-
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof
|
|
1935
|
+
let r = l(e, n);
|
|
1936
|
+
return t ? this.databaseAdapter.buildTimeDimension(t, r) : r instanceof ie ? r : C`${r}`;
|
|
1937
1937
|
}
|
|
1938
1938
|
buildDateRangeCondition(e, t) {
|
|
1939
1939
|
return t ? Array.isArray(t) ? this.buildArrayDateRangeCondition(e, t) : typeof t == "string" ? this.buildStringDateRangeCondition(e, t) : null : null;
|
|
1940
1940
|
}
|
|
1941
|
-
rangeBetween(e, t,
|
|
1942
|
-
return
|
|
1941
|
+
rangeBetween(e, t, n) {
|
|
1942
|
+
return w(s(e, t), x(e, n));
|
|
1943
1943
|
}
|
|
1944
1944
|
endOfDayValue(e) {
|
|
1945
1945
|
let t = wt(this.databaseAdapter, e);
|
|
@@ -1974,36 +1974,36 @@ var I = class {
|
|
|
1974
1974
|
if (n.length > 1) {
|
|
1975
1975
|
if (i?.type === "time") {
|
|
1976
1976
|
let e = n.map((e) => o.normalizeDate(e) || e);
|
|
1977
|
-
return
|
|
1977
|
+
return d(t, e);
|
|
1978
1978
|
}
|
|
1979
|
-
return
|
|
1979
|
+
return d(t, n);
|
|
1980
1980
|
}
|
|
1981
1981
|
if (n.length === 1) {
|
|
1982
1982
|
let e = i?.type === "time" && o.normalizeDate(r) || r;
|
|
1983
|
-
return
|
|
1983
|
+
return b(t, e);
|
|
1984
1984
|
}
|
|
1985
1985
|
return a.buildBooleanLiteral(!1);
|
|
1986
|
-
}, Nt = (
|
|
1987
|
-
let { fieldExpr:
|
|
1988
|
-
return
|
|
1989
|
-
}, L = (e) => ({ fieldExpr: t, value: n, databaseAdapter: r }) => r.buildStringCondition(t, e, n), Pt = ({ fieldExpr: e, value: t }) =>
|
|
1990
|
-
let { fieldExpr: t, values:
|
|
1991
|
-
if (
|
|
1992
|
-
let
|
|
1993
|
-
if (!
|
|
1994
|
-
let l =
|
|
1986
|
+
}, Nt = (e) => {
|
|
1987
|
+
let { fieldExpr: t, filteredValues: n, value: r } = e;
|
|
1988
|
+
return n.length > 1 ? g(t, n) : n.length === 1 ? re(t, r) : null;
|
|
1989
|
+
}, L = (e) => ({ fieldExpr: t, value: n, databaseAdapter: r }) => r.buildStringCondition(t, e, n), Pt = ({ fieldExpr: e, value: t }) => te(e, t), Ft = ({ fieldExpr: e, value: t }) => s(e, t), It = ({ fieldExpr: e, value: t }) => ne(e, t), Lt = ({ fieldExpr: e, value: t }) => x(e, t), Rt = ({ fieldExpr: e }) => se(e), zt = ({ fieldExpr: e }) => u(e), Bt = (e) => {
|
|
1990
|
+
let { fieldExpr: t, values: n, filteredValues: r, databaseAdapter: i, dateTimeBuilder: a } = e;
|
|
1991
|
+
if (r.length < 2) return null;
|
|
1992
|
+
let o = a.normalizeDate(r[0]), c = a.normalizeDate(r[1]);
|
|
1993
|
+
if (!o || !c) return null;
|
|
1994
|
+
let l = n[1];
|
|
1995
1995
|
if (typeof l == "string" && /^\d{4}-\d{2}-\d{2}$/.test(l.trim())) {
|
|
1996
|
-
let e = typeof c == "number" ? /* @__PURE__ */ new Date(c * (
|
|
1997
|
-
t.setUTCHours(23, 59, 59, 999), c =
|
|
1996
|
+
let e = typeof c == "number" ? /* @__PURE__ */ new Date(c * (i.getEngineType() === "sqlite" ? 1e3 : 1)) : new Date(c), t = new Date(e);
|
|
1997
|
+
t.setUTCHours(23, 59, 59, 999), c = i.isTimestampInteger() ? i.getEngineType() === "sqlite" ? Math.floor(t.getTime() / 1e3) : t.getTime() : t.toISOString();
|
|
1998
1998
|
}
|
|
1999
|
-
return
|
|
1999
|
+
return w(s(t, o), x(t, c));
|
|
2000
2000
|
}, Vt = ({ fieldExpr: e, value: t, dateTimeBuilder: n }) => {
|
|
2001
2001
|
let r = n.normalizeDate(t);
|
|
2002
2002
|
return r ? ne(e, r) : null;
|
|
2003
2003
|
}, Ht = ({ fieldExpr: e, value: t, dateTimeBuilder: n }) => {
|
|
2004
2004
|
let r = n.normalizeDate(t);
|
|
2005
|
-
return r ?
|
|
2006
|
-
}, Ut = ({ fieldExpr: e, filteredValues: t }) => t.length >= 2 ?
|
|
2005
|
+
return r ? te(e, r) : null;
|
|
2006
|
+
}, Ut = ({ fieldExpr: e, filteredValues: t }) => t.length >= 2 ? w(s(e, t[0]), x(e, t[1])) : null, Wt = ({ fieldExpr: t, filteredValues: n }) => n.length >= 2 ? e(ne(t, n[0]), te(t, n[1])) : null, Gt = ({ fieldExpr: e, filteredValues: t }) => t.length > 0 ? d(e, t) : null, Kt = ({ fieldExpr: e, filteredValues: t }) => t.length > 0 ? g(e, t) : null, qt = ({ fieldExpr: t }) => e(u(t), b(t, "")), Jt = ({ fieldExpr: e }) => w(se(e), re(e, "")), Yt = (e) => ({ fieldExpr: t, filteredValues: n, databaseAdapter: r }) => r.getEngineType() === "postgres" ? e(t, n) : null, Xt = {
|
|
2007
2007
|
equals: Mt,
|
|
2008
2008
|
notEquals: Nt,
|
|
2009
2009
|
contains: L("contains"),
|
|
@@ -2030,9 +2030,9 @@ var I = class {
|
|
|
2030
2030
|
notRegex: L("notRegex"),
|
|
2031
2031
|
isEmpty: qt,
|
|
2032
2032
|
isNotEmpty: Jt,
|
|
2033
|
-
arrayContains: Yt(
|
|
2034
|
-
arrayOverlaps: Yt(
|
|
2035
|
-
arrayContained: Yt(
|
|
2033
|
+
arrayContains: Yt(ee),
|
|
2034
|
+
arrayOverlaps: Yt(c),
|
|
2035
|
+
arrayContained: Yt(n)
|
|
2036
2036
|
};
|
|
2037
2037
|
function Zt(e, t) {
|
|
2038
2038
|
let n = Xt[e];
|
|
@@ -2041,7 +2041,7 @@ function Zt(e, t) {
|
|
|
2041
2041
|
//#endregion
|
|
2042
2042
|
//#region src/server/builders/analysis-utils.ts
|
|
2043
2043
|
function R(e) {
|
|
2044
|
-
if (e.length !== 0) return e.length === 1 ? e[0] :
|
|
2044
|
+
if (e.length !== 0) return e.length === 1 ? e[0] : w(...e);
|
|
2045
2045
|
}
|
|
2046
2046
|
function z(e) {
|
|
2047
2047
|
if ("type" in e && "filters" in e) {
|
|
@@ -2059,9 +2059,9 @@ function Qt(e) {
|
|
|
2059
2059
|
}
|
|
2060
2060
|
function $t(e) {
|
|
2061
2061
|
return {
|
|
2062
|
-
noMapping: ({ cubeName:
|
|
2063
|
-
keyDimNotFound: ({ bindingKey:
|
|
2064
|
-
mappingDimNotFound: ({ dimension:
|
|
2062
|
+
noMapping: ({ cubeName: t }) => S(`${e}.noBindingKeyMapping`, { cubeName: t }),
|
|
2063
|
+
keyDimNotFound: ({ bindingKey: t }) => S(`${e}.bindingKeyDimNotFound`, { bindingKey: t }),
|
|
2064
|
+
mappingDimNotFound: ({ dimension: t }) => S(`${e}.bindingKeyMappingDimNotFound`, { dimension: t })
|
|
2065
2065
|
};
|
|
2066
2066
|
}
|
|
2067
2067
|
function en(e, t, n, r) {
|
|
@@ -2078,7 +2078,7 @@ function tn(e, t, n, r, i) {
|
|
|
2078
2078
|
cubeName: a,
|
|
2079
2079
|
dimName: o
|
|
2080
2080
|
}));
|
|
2081
|
-
return
|
|
2081
|
+
return l(s.sql, n);
|
|
2082
2082
|
}
|
|
2083
2083
|
let a = e.find((e) => e.cube === t.name);
|
|
2084
2084
|
if (!a) throw Error(r.noMapping({ cubeName: t.name }));
|
|
@@ -2088,19 +2088,19 @@ function tn(e, t, n, r, i) {
|
|
|
2088
2088
|
cubeName: a.cube,
|
|
2089
2089
|
dimName: o
|
|
2090
2090
|
}));
|
|
2091
|
-
return
|
|
2091
|
+
return l(s.sql, n);
|
|
2092
2092
|
}
|
|
2093
|
-
function nn(e, n, r
|
|
2093
|
+
function nn(e, t, n, r) {
|
|
2094
2094
|
if (typeof e == "string") {
|
|
2095
|
-
let [,
|
|
2096
|
-
if (!
|
|
2097
|
-
return
|
|
2095
|
+
let [, i] = e.split("."), a = t.dimensions?.[i];
|
|
2096
|
+
if (!a) throw Error(S(`${r}.timeDimNotFound`, { timeDimension: e }));
|
|
2097
|
+
return l(a.sql, n);
|
|
2098
2098
|
}
|
|
2099
|
-
let
|
|
2100
|
-
if (!
|
|
2101
|
-
let [,
|
|
2102
|
-
if (!
|
|
2103
|
-
return
|
|
2099
|
+
let i = e.find((e) => e.cube === t.name);
|
|
2100
|
+
if (!i) throw Error(S(`${r}.noTimeDimMapping`, { cubeName: t.name }));
|
|
2101
|
+
let [, a] = i.dimension.split("."), o = t.dimensions?.[a];
|
|
2102
|
+
if (!o) throw Error(S(`${r}.timeDimMappingNotFound`, { dimension: i.dimension }));
|
|
2103
|
+
return l(o.sql, n);
|
|
2104
2104
|
}
|
|
2105
2105
|
//#endregion
|
|
2106
2106
|
//#region src/server/builders/filter-builder.ts
|
|
@@ -2133,20 +2133,20 @@ var B = class {
|
|
|
2133
2133
|
buildLogicalFilter(e, t, n) {
|
|
2134
2134
|
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;
|
|
2135
2135
|
}
|
|
2136
|
-
combineFilters(
|
|
2137
|
-
let a =
|
|
2138
|
-
return a.length === 0 ? null : a.length === 1 ? a[0] :
|
|
2136
|
+
combineFilters(t, n, r, i) {
|
|
2137
|
+
let a = t.map((e) => this.buildSingleFilter(e, r, i)).filter((e) => e !== null);
|
|
2138
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : n ? w(...a) : e(...a);
|
|
2139
2139
|
}
|
|
2140
2140
|
buildSingleFilter(e, t, n) {
|
|
2141
2141
|
if ("and" in e || "or" in e) return this.buildLogicalFilter(e, t, n);
|
|
2142
2142
|
let r = z(e);
|
|
2143
2143
|
if (r) return this.combineFilters(r.filters, r.isAnd, t, n);
|
|
2144
|
-
let i = e, [a,
|
|
2145
|
-
if (!s) return null;
|
|
2146
|
-
let c = s.dimensions?.[o];
|
|
2144
|
+
let i = e, [a, s] = i.member.split("."), c = t.get(a);
|
|
2147
2145
|
if (!c) return null;
|
|
2148
|
-
let
|
|
2149
|
-
|
|
2146
|
+
let l = c.dimensions?.[s];
|
|
2147
|
+
if (!l) return null;
|
|
2148
|
+
let u = o(l, n);
|
|
2149
|
+
return this.buildFilterCondition(u, i.operator, i.values, l, i.dateRange);
|
|
2150
2150
|
}
|
|
2151
2151
|
}, rn = [
|
|
2152
2152
|
"lag",
|
|
@@ -2160,35 +2160,35 @@ var B = class {
|
|
|
2160
2160
|
"movingAvg",
|
|
2161
2161
|
"movingSum"
|
|
2162
2162
|
];
|
|
2163
|
-
function
|
|
2163
|
+
function V(e) {
|
|
2164
2164
|
return rn.includes(e);
|
|
2165
2165
|
}
|
|
2166
|
-
function
|
|
2167
|
-
return
|
|
2166
|
+
function an(e) {
|
|
2167
|
+
return V(e.type) && e.windowConfig?.measure !== void 0;
|
|
2168
2168
|
}
|
|
2169
|
-
function
|
|
2169
|
+
function on(e, t) {
|
|
2170
2170
|
if (!e.windowConfig?.measure) return null;
|
|
2171
2171
|
let n = e.windowConfig.measure;
|
|
2172
2172
|
return n.includes(".") ? n : `${t}.${n}`;
|
|
2173
2173
|
}
|
|
2174
|
-
function
|
|
2174
|
+
function sn(e) {
|
|
2175
2175
|
switch (e) {
|
|
2176
2176
|
case "lag":
|
|
2177
2177
|
case "lead": return "difference";
|
|
2178
2178
|
default: return "raw";
|
|
2179
2179
|
}
|
|
2180
2180
|
}
|
|
2181
|
-
function
|
|
2181
|
+
function cn(e, t) {
|
|
2182
2182
|
let n = [], r = [], i = /* @__PURE__ */ new Set();
|
|
2183
2183
|
for (let a of e) {
|
|
2184
2184
|
let [e, o] = a.split("."), s = t.get(e);
|
|
2185
2185
|
if (s?.measures?.[o]) {
|
|
2186
2186
|
let t = s.measures[o];
|
|
2187
|
-
if (
|
|
2187
|
+
if (an(t)) {
|
|
2188
2188
|
r.push(a);
|
|
2189
|
-
let n =
|
|
2189
|
+
let n = on(t, e);
|
|
2190
2190
|
n && i.add(n);
|
|
2191
|
-
} else
|
|
2191
|
+
} else V(t.type) || n.push(a);
|
|
2192
2192
|
}
|
|
2193
2193
|
}
|
|
2194
2194
|
return {
|
|
@@ -2198,7 +2198,7 @@ function V(e, t) {
|
|
|
2198
2198
|
};
|
|
2199
2199
|
}
|
|
2200
2200
|
function ln(e, t) {
|
|
2201
|
-
return
|
|
2201
|
+
return cn(e, t).postAggWindowMeasures.length > 0;
|
|
2202
2202
|
}
|
|
2203
2203
|
//#endregion
|
|
2204
2204
|
//#region src/server/resolvers/calculated-measure-resolver.ts
|
|
@@ -2338,35 +2338,35 @@ var H = class {
|
|
|
2338
2338
|
};
|
|
2339
2339
|
//#endregion
|
|
2340
2340
|
//#region src/server/template-substitution.ts
|
|
2341
|
-
function dn(e,
|
|
2342
|
-
let { cube:
|
|
2343
|
-
for (let e of
|
|
2344
|
-
let { originalRef:
|
|
2345
|
-
if (!
|
|
2346
|
-
ref: `{${
|
|
2347
|
-
cubeName:
|
|
2341
|
+
function dn(e, t) {
|
|
2342
|
+
let { cube: n, allCubes: r, resolvedMeasures: i } = t, a = fn(e), o = /* @__PURE__ */ new Map();
|
|
2343
|
+
for (let e of a) {
|
|
2344
|
+
let { originalRef: t, cubeName: a, fieldName: s } = e, c = a || n.name;
|
|
2345
|
+
if (!r.get(c)) throw Error(S("server.validation.template.substituteTargetCubeNotFound", {
|
|
2346
|
+
ref: `{${t}}`,
|
|
2347
|
+
cubeName: c
|
|
2348
2348
|
}));
|
|
2349
|
-
let
|
|
2350
|
-
if (!
|
|
2351
|
-
ref: `{${
|
|
2352
|
-
measureName:
|
|
2349
|
+
let l = `${c}.${s}`, u = i.get(l);
|
|
2350
|
+
if (!u) throw Error(S("server.validation.template.substituteMeasureNotResolved", {
|
|
2351
|
+
ref: `{${t}}`,
|
|
2352
|
+
measureName: l
|
|
2353
2353
|
}));
|
|
2354
|
-
let
|
|
2355
|
-
|
|
2354
|
+
let d = u(), f = C`${d}`;
|
|
2355
|
+
o.set(t, f);
|
|
2356
2356
|
}
|
|
2357
|
-
let
|
|
2358
|
-
for (let t of
|
|
2359
|
-
let n = `{${t.originalRef}}`, r = e.indexOf(n,
|
|
2357
|
+
let s = [], c = [], l = 0;
|
|
2358
|
+
for (let t of a) {
|
|
2359
|
+
let n = `{${t.originalRef}}`, r = e.indexOf(n, l);
|
|
2360
2360
|
if (r >= 0) {
|
|
2361
|
-
|
|
2362
|
-
let i =
|
|
2363
|
-
i &&
|
|
2361
|
+
s.push(e.substring(l, r));
|
|
2362
|
+
let i = o.get(t.originalRef);
|
|
2363
|
+
i && c.push(i), l = r + n.length;
|
|
2364
2364
|
}
|
|
2365
2365
|
}
|
|
2366
|
-
if (
|
|
2367
|
-
let
|
|
2368
|
-
for (let e = 0; e <
|
|
2369
|
-
return
|
|
2366
|
+
if (s.push(e.substring(l)), c.length === 0) return C.raw(e);
|
|
2367
|
+
let u = [];
|
|
2368
|
+
for (let e = 0; e < s.length; e++) s[e] && u.push(new le(s[e])), e < c.length && u.push(c[e]);
|
|
2369
|
+
return C.join(u, C.raw(""));
|
|
2370
2370
|
}
|
|
2371
2371
|
function fn(e) {
|
|
2372
2372
|
if (e.length > 1e3) return [];
|
|
@@ -2389,21 +2389,21 @@ function fn(e) {
|
|
|
2389
2389
|
return n;
|
|
2390
2390
|
}
|
|
2391
2391
|
function pn(e) {
|
|
2392
|
-
let
|
|
2393
|
-
for (let
|
|
2394
|
-
else if (e[
|
|
2395
|
-
|
|
2392
|
+
let t = [], n = 0;
|
|
2393
|
+
for (let r = 0; r < e.length; r++) if (e[r] === "{") n++;
|
|
2394
|
+
else if (e[r] === "}" && (n--, n < 0)) {
|
|
2395
|
+
t.push(S("server.validation.template.unmatchedClosingBrace", { position: r }));
|
|
2396
2396
|
break;
|
|
2397
2397
|
}
|
|
2398
|
-
|
|
2399
|
-
let
|
|
2400
|
-
for (let e of
|
|
2401
|
-
let
|
|
2402
|
-
/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(
|
|
2398
|
+
n > 0 && t.push(S("server.validation.template.unmatchedOpeningBrace")), /\{\s*\}/.test(e) && t.push(S("server.validation.template.emptyReference")), /\{[^}]*\{/.test(e) && t.push(S("server.validation.template.nestedBraces"));
|
|
2399
|
+
let r = fn(e);
|
|
2400
|
+
for (let e of r) {
|
|
2401
|
+
let n = e.cubeName ? `${e.cubeName}.${e.fieldName}` : e.fieldName;
|
|
2402
|
+
/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(n) || t.push(S("server.validation.template.invalidMemberReference", { ref: `{${e.originalRef}}` })), n.split(".").length > 2 && t.push(S("server.validation.template.multipleDots", { ref: `{${e.originalRef}}` }));
|
|
2403
2403
|
}
|
|
2404
2404
|
return {
|
|
2405
|
-
isValid:
|
|
2406
|
-
errors:
|
|
2405
|
+
isValid: t.length === 0,
|
|
2406
|
+
errors: t
|
|
2407
2407
|
};
|
|
2408
2408
|
}
|
|
2409
2409
|
function mn(e, t) {
|
|
@@ -2485,7 +2485,7 @@ var U = class e {
|
|
|
2485
2485
|
if (o && o.measures[i]) {
|
|
2486
2486
|
let t = o.measures[i];
|
|
2487
2487
|
if (n.measures.includes(e)) {
|
|
2488
|
-
let r =
|
|
2488
|
+
let r = C`${C.identifier(n.cteAlias)}.${C.identifier(i)}`, o = this.reAggregateCteColumn(t.type, r);
|
|
2489
2489
|
a.set(e, () => o);
|
|
2490
2490
|
}
|
|
2491
2491
|
}
|
|
@@ -2512,34 +2512,34 @@ var U = class e {
|
|
|
2512
2512
|
if (i.joinCubes) for (let e of i.joinCubes) o.set(e.cube.name, e.cube);
|
|
2513
2513
|
return this.buildCTECalculatedMeasure(n, t, a, o, r);
|
|
2514
2514
|
}
|
|
2515
|
-
let o =
|
|
2515
|
+
let o = C`${C.identifier(a.cteAlias)}.${C.identifier(t)}`;
|
|
2516
2516
|
return this.reAggregateCteColumn(n.type, o);
|
|
2517
2517
|
}
|
|
2518
2518
|
buildMeasureExpression(t, n, r) {
|
|
2519
2519
|
if (t.type === "calculated") throw Error(`Cannot build calculated measure '${t.name}' directly. Use buildCalculatedMeasure instead.`);
|
|
2520
2520
|
if (e.isPostAggregationWindow(t)) throw Error(`Post-aggregation window measure '${t.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);
|
|
2521
2521
|
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'.`);
|
|
2522
|
-
let i =
|
|
2522
|
+
let i = l(t.sql, n);
|
|
2523
2523
|
if (n.ungrouped) return i;
|
|
2524
2524
|
let a = this.applyMeasureFilters(t, i, n);
|
|
2525
2525
|
return this.applyAggregation(t, a, n, r);
|
|
2526
2526
|
}
|
|
2527
|
-
applyMeasureFilters(e, t,
|
|
2527
|
+
applyMeasureFilters(e, t, n) {
|
|
2528
2528
|
if (!e.filters || e.filters.length === 0) return t;
|
|
2529
|
-
let
|
|
2530
|
-
let t = e(
|
|
2531
|
-
return t ?
|
|
2529
|
+
let r = e.filters.map((e) => {
|
|
2530
|
+
let t = e(n);
|
|
2531
|
+
return t ? C`(${t})` : void 0;
|
|
2532
2532
|
}).filter(Boolean);
|
|
2533
|
-
if (
|
|
2534
|
-
let
|
|
2533
|
+
if (r.length === 0) return t;
|
|
2534
|
+
let i = r.length === 1 ? r[0] : w(...r);
|
|
2535
2535
|
return this.databaseAdapter.buildCaseWhen([{
|
|
2536
|
-
when:
|
|
2536
|
+
when: i,
|
|
2537
2537
|
then: t
|
|
2538
2538
|
}]);
|
|
2539
2539
|
}
|
|
2540
2540
|
applyAggregation(e, t, n, r) {
|
|
2541
2541
|
switch (e.type) {
|
|
2542
|
-
case "count": return
|
|
2542
|
+
case "count": return T(t);
|
|
2543
2543
|
case "countDistinct": return me(t);
|
|
2544
2544
|
case "sum": return E(t);
|
|
2545
2545
|
case "avg": return this.databaseAdapter.buildAvg(t);
|
|
@@ -2564,12 +2564,12 @@ var U = class e {
|
|
|
2564
2564
|
case "lastValue":
|
|
2565
2565
|
case "movingAvg":
|
|
2566
2566
|
case "movingSum": return this.buildWindowMeasure(e, t, n, r);
|
|
2567
|
-
default: return
|
|
2567
|
+
default: return T(t);
|
|
2568
2568
|
}
|
|
2569
2569
|
}
|
|
2570
2570
|
buildStatistical(e, t, n) {
|
|
2571
2571
|
let r = n();
|
|
2572
|
-
return r === null ? (console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
2572
|
+
return r === null ? (console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), C`MAX(NULL)`) : r;
|
|
2573
2573
|
}
|
|
2574
2574
|
resolvePercentile(e) {
|
|
2575
2575
|
switch (e.type) {
|
|
@@ -2590,13 +2590,13 @@ var U = class e {
|
|
|
2590
2590
|
nTile: i.nTile,
|
|
2591
2591
|
frame: i.frame
|
|
2592
2592
|
});
|
|
2593
|
-
return s === null ? (console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),
|
|
2593
|
+
return s === null ? (console.warn(`[drizzle-cube] ${e.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`), C`NULL`) : s;
|
|
2594
2594
|
}
|
|
2595
2595
|
resolveWindowPartitions(e, t, n) {
|
|
2596
2596
|
if (!e.partitionBy || e.partitionBy.length === 0 || !n) return;
|
|
2597
2597
|
let r = e.partitionBy.map((e) => {
|
|
2598
2598
|
let r = e.includes(".") ? e.split(".")[1] : e, i = n.dimensions?.[r];
|
|
2599
|
-
return i ?
|
|
2599
|
+
return i ? l(i.sql, t) : (console.warn(`[drizzle-cube] Window function partition dimension '${e}' not found in cube '${n.name}'`), null);
|
|
2600
2600
|
}).filter((e) => e !== null);
|
|
2601
2601
|
return r.length > 0 ? r : void 0;
|
|
2602
2602
|
}
|
|
@@ -2605,12 +2605,12 @@ var U = class e {
|
|
|
2605
2605
|
let r = e.orderBy.map((e) => {
|
|
2606
2606
|
let r = e.field.includes(".") ? e.field.split(".")[1] : e.field, i = n.dimensions?.[r];
|
|
2607
2607
|
if (i) return {
|
|
2608
|
-
field:
|
|
2608
|
+
field: l(i.sql, t),
|
|
2609
2609
|
direction: e.direction
|
|
2610
2610
|
};
|
|
2611
2611
|
let a = n.measures?.[r];
|
|
2612
2612
|
return a && a.sql ? {
|
|
2613
|
-
field:
|
|
2613
|
+
field: l(a.sql, t),
|
|
2614
2614
|
direction: e.direction
|
|
2615
2615
|
} : (console.warn(`[drizzle-cube] Window function order field '${e.field}' not found in cube '${n.name}'`), null);
|
|
2616
2616
|
}).filter((e) => e !== null);
|
|
@@ -2618,7 +2618,7 @@ var U = class e {
|
|
|
2618
2618
|
}
|
|
2619
2619
|
static WINDOW_FUNCTION_TYPES = rn;
|
|
2620
2620
|
static isWindowFunction(e) {
|
|
2621
|
-
return
|
|
2621
|
+
return V(e);
|
|
2622
2622
|
}
|
|
2623
2623
|
static categorizeMeasures(t, n) {
|
|
2624
2624
|
let r = [], i = [];
|
|
@@ -2639,16 +2639,16 @@ var U = class e {
|
|
|
2639
2639
|
return r.length > 0;
|
|
2640
2640
|
}
|
|
2641
2641
|
static isPostAggregationWindow(e) {
|
|
2642
|
-
return
|
|
2642
|
+
return an(e);
|
|
2643
2643
|
}
|
|
2644
2644
|
static getWindowBaseMeasure(e, t) {
|
|
2645
|
-
return
|
|
2645
|
+
return on(e, t);
|
|
2646
2646
|
}
|
|
2647
2647
|
static getDefaultWindowOperation(e) {
|
|
2648
|
-
return
|
|
2648
|
+
return sn(e);
|
|
2649
2649
|
}
|
|
2650
2650
|
static categorizeForPostAggregation(e, t) {
|
|
2651
|
-
return
|
|
2651
|
+
return cn(e, t);
|
|
2652
2652
|
}
|
|
2653
2653
|
static hasPostAggregationWindows(e, t) {
|
|
2654
2654
|
return ln(e, t);
|
|
@@ -2732,9 +2732,9 @@ var U = class e {
|
|
|
2732
2732
|
let s = r?.preAggregationCTEs?.find((e) => e.cube.name === i);
|
|
2733
2733
|
if (s) {
|
|
2734
2734
|
let e = s.joinKeys.find((e) => e.targetColumn === a);
|
|
2735
|
-
return e && e.sourceColumnObj ? e.sourceColumnObj :
|
|
2735
|
+
return e && e.sourceColumnObj ? e.sourceColumnObj : C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`;
|
|
2736
2736
|
}
|
|
2737
|
-
return
|
|
2737
|
+
return l(o.dimensions[a].sql, n);
|
|
2738
2738
|
}
|
|
2739
2739
|
resolveTimeDimensionGroupField(e, t, n, r) {
|
|
2740
2740
|
let [i, a] = e.dimension.split("."), o = t.get(i);
|
|
@@ -2742,7 +2742,7 @@ var U = class e {
|
|
|
2742
2742
|
let s = r?.preAggregationCTEs?.find((e) => e.cube.name === i);
|
|
2743
2743
|
if (s) {
|
|
2744
2744
|
let t = s.joinKeys.find((e) => e.targetColumn === a);
|
|
2745
|
-
return t && t.sourceColumnObj ? this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n) :
|
|
2745
|
+
return t && t.sourceColumnObj ? this.dateTimeBuilder.buildTimeDimensionExpression(t.sourceColumnObj, e.granularity, n) : C`${C.identifier(s.cteAlias)}.${C.identifier(a)}`;
|
|
2746
2746
|
}
|
|
2747
2747
|
return this.dateTimeBuilder.buildTimeDimensionExpression(o.dimensions[a].sql, e.granularity, n);
|
|
2748
2748
|
}
|
|
@@ -2762,8 +2762,8 @@ var U = class e {
|
|
|
2762
2762
|
if (t.dimensions) for (let e of t.dimensions) {
|
|
2763
2763
|
let [t, a] = e.split("."), o = i.get(t);
|
|
2764
2764
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
2765
|
-
let t = o.dimensions[a], i =
|
|
2766
|
-
r[e] =
|
|
2765
|
+
let t = o.dimensions[a], i = l(t.sql, n);
|
|
2766
|
+
r[e] = C`${i}`.as(e);
|
|
2767
2767
|
}
|
|
2768
2768
|
}
|
|
2769
2769
|
if (t.measures) {
|
|
@@ -2772,7 +2772,7 @@ var U = class e {
|
|
|
2772
2772
|
let t = e.get(n);
|
|
2773
2773
|
if (t && typeof t == "function") {
|
|
2774
2774
|
let e = t();
|
|
2775
|
-
r[n] =
|
|
2775
|
+
r[n] = C`${e}`.as(n);
|
|
2776
2776
|
}
|
|
2777
2777
|
}
|
|
2778
2778
|
}
|
|
@@ -2780,10 +2780,10 @@ var U = class e {
|
|
|
2780
2780
|
let [t, a] = e.dimension.split("."), o = i.get(t);
|
|
2781
2781
|
if (o && o.dimensions && o.dimensions[a]) {
|
|
2782
2782
|
let t = o.dimensions[a], i = this.buildTimeDimensionExpression(t.sql, e.granularity, n);
|
|
2783
|
-
r[e.dimension] =
|
|
2783
|
+
r[e.dimension] = C`${i}`.as(e.dimension);
|
|
2784
2784
|
}
|
|
2785
2785
|
}
|
|
2786
|
-
return Object.keys(r).length === 0 && (r.count =
|
|
2786
|
+
return Object.keys(r).length === 0 && (r.count = T()), r;
|
|
2787
2787
|
}
|
|
2788
2788
|
buildCalculatedMeasure(e, t, n, r, i) {
|
|
2789
2789
|
return this.measureBuilder.buildCalculatedMeasure(e, t, n, r, i);
|
|
@@ -2829,8 +2829,8 @@ var U = class e {
|
|
|
2829
2829
|
return;
|
|
2830
2830
|
}
|
|
2831
2831
|
}
|
|
2832
|
-
let c = s.dimensions[o],
|
|
2833
|
-
|
|
2832
|
+
let c = s.dimensions[o], u = l(c.sql, n), d = this.buildDateRangeCondition(u, e.dateRange);
|
|
2833
|
+
d && i.push(d);
|
|
2834
2834
|
}
|
|
2835
2835
|
cubeIsInCTE(e, t) {
|
|
2836
2836
|
return !!t?.preAggregationCTEs?.some((t) => t.cube.name === e);
|
|
@@ -2843,23 +2843,23 @@ var U = class e {
|
|
|
2843
2843
|
}
|
|
2844
2844
|
return i;
|
|
2845
2845
|
}
|
|
2846
|
-
processFilter(
|
|
2847
|
-
if ("and" in
|
|
2848
|
-
let o =
|
|
2846
|
+
processFilter(t, n, r, i, a) {
|
|
2847
|
+
if ("and" in t || "or" in t) {
|
|
2848
|
+
let o = t;
|
|
2849
2849
|
if (o.and) {
|
|
2850
|
-
let e = o.and.map((e) => this.processFilter(e,
|
|
2851
|
-
return e.length > 0 ?
|
|
2850
|
+
let e = o.and.map((e) => this.processFilter(e, n, r, i, a)).filter((e) => e !== null);
|
|
2851
|
+
return e.length > 0 ? w(...e) : null;
|
|
2852
2852
|
}
|
|
2853
2853
|
if (o.or) {
|
|
2854
|
-
let
|
|
2855
|
-
return
|
|
2854
|
+
let t = o.or.map((e) => this.processFilter(e, n, r, i, a)).filter((e) => e !== null);
|
|
2855
|
+
return t.length > 0 ? e(...t) : null;
|
|
2856
2856
|
}
|
|
2857
2857
|
}
|
|
2858
|
-
let o =
|
|
2858
|
+
let o = t, [s, c] = o.member.split("."), l = n.get(s);
|
|
2859
2859
|
if (!l) return null;
|
|
2860
2860
|
let u = l.dimensions[c], d = l.measures[c], f = u || d;
|
|
2861
2861
|
if (!f) return null;
|
|
2862
|
-
if (i === "where" && u) return this.processWhereDimensionFilter(
|
|
2862
|
+
if (i === "where" && u) return this.processWhereDimensionFilter(t, o, u, f, s, r, a);
|
|
2863
2863
|
if (i === "where" && d) return null;
|
|
2864
2864
|
if (i === "having" && d) {
|
|
2865
2865
|
let e = this.buildHavingMeasureExpression(s, c, d, r, a);
|
|
@@ -2874,7 +2874,7 @@ var U = class e {
|
|
|
2874
2874
|
let t = M(e), n = a.filterCache.get(t);
|
|
2875
2875
|
if (n) return n;
|
|
2876
2876
|
}
|
|
2877
|
-
let c = s ?
|
|
2877
|
+
let c = s ? l(n.sql, a) : typeof n.sql == "function" ? n.sql(a) : n.sql;
|
|
2878
2878
|
return this.buildFilterCondition(c, t.operator, t.values, r, t.dateRange);
|
|
2879
2879
|
}
|
|
2880
2880
|
buildFilterCondition(e, t, n, r, i) {
|
|
@@ -2894,12 +2894,12 @@ var U = class e {
|
|
|
2894
2894
|
];
|
|
2895
2895
|
if (e.order && Object.keys(e.order).length > 0) for (let [t, i] of Object.entries(e.order)) {
|
|
2896
2896
|
if (!r.includes(t)) throw Error(`Cannot order by '${t}': field is not selected in the query`);
|
|
2897
|
-
let e = i === "desc" ?
|
|
2897
|
+
let e = i === "desc" ? pe(C.identifier(t)) : fe(C.identifier(t));
|
|
2898
2898
|
n.push(e);
|
|
2899
2899
|
}
|
|
2900
2900
|
if (e.timeDimensions && e.timeDimensions.length > 0) {
|
|
2901
2901
|
let t = new Set(Object.keys(e.order || {})), r = [...e.timeDimensions].sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
2902
|
-
for (let e of r) t.has(e.dimension) || n.push(
|
|
2902
|
+
for (let e of r) t.has(e.dimension) || n.push(fe(C.identifier(e.dimension)));
|
|
2903
2903
|
}
|
|
2904
2904
|
return n;
|
|
2905
2905
|
}
|
|
@@ -2945,7 +2945,7 @@ var U = class e {
|
|
|
2945
2945
|
let e = /* @__PURE__ */ new Map();
|
|
2946
2946
|
for (let [t, n] of this.cubes) if (n.joins) for (let [, r] of Object.entries(n.joins)) {
|
|
2947
2947
|
if (r.relationship === "belongsToMany") continue;
|
|
2948
|
-
let n =
|
|
2948
|
+
let n = h(r.targetCube, this.cubes);
|
|
2949
2949
|
if (!n) continue;
|
|
2950
2950
|
let i = n.name, a = e.get(i);
|
|
2951
2951
|
a || (a = [], e.set(i, a)), a.push({
|
|
@@ -2980,7 +2980,7 @@ var U = class e {
|
|
|
2980
2980
|
neighbourSteps(e, t) {
|
|
2981
2981
|
let n = [], r = this.cubes.get(e);
|
|
2982
2982
|
if (r?.joins) for (let [, t] of Object.entries(r.joins)) {
|
|
2983
|
-
let r =
|
|
2983
|
+
let r = h(t.targetCube, this.cubes);
|
|
2984
2984
|
if (!r) continue;
|
|
2985
2985
|
let i = r.name;
|
|
2986
2986
|
n.push({
|
|
@@ -3109,13 +3109,13 @@ var U = class e {
|
|
|
3109
3109
|
}
|
|
3110
3110
|
return null;
|
|
3111
3111
|
}
|
|
3112
|
-
buildJoinCondition(e, t,
|
|
3113
|
-
let
|
|
3114
|
-
for (let
|
|
3115
|
-
let e = t ?
|
|
3116
|
-
|
|
3112
|
+
buildJoinCondition(e, t, n) {
|
|
3113
|
+
let r = [];
|
|
3114
|
+
for (let i of e.on) {
|
|
3115
|
+
let e = t ? C`${C.identifier(t)}.${C.identifier(i.source.name)}` : m(i.source), a = n ? C`${C.identifier(n)}.${C.identifier(i.target.name)}` : m(i.target), o = i.as || b;
|
|
3116
|
+
r.push(o(e, a));
|
|
3117
3117
|
}
|
|
3118
|
-
return
|
|
3118
|
+
return w(...r);
|
|
3119
3119
|
}
|
|
3120
3120
|
getReachableCubes(e) {
|
|
3121
3121
|
let t = /* @__PURE__ */ new Set([e]), n = [e];
|
|
@@ -3181,35 +3181,35 @@ var yn = class {
|
|
|
3181
3181
|
constructor(e) {
|
|
3182
3182
|
this.resolverCache = e;
|
|
3183
3183
|
}
|
|
3184
|
-
buildJoinPlan(e, n, r, i
|
|
3185
|
-
let
|
|
3186
|
-
if (
|
|
3184
|
+
buildJoinPlan(e, t, n, r, i) {
|
|
3185
|
+
let a = this.resolverCache.get(e), o = [], s = /* @__PURE__ */ new Set([t.name]), c = /* @__PURE__ */ new Set();
|
|
3186
|
+
if (i.measures) for (let e of i.measures) {
|
|
3187
3187
|
let [t] = e.split(".");
|
|
3188
|
-
|
|
3189
|
-
}
|
|
3190
|
-
let
|
|
3191
|
-
for (let
|
|
3192
|
-
let
|
|
3193
|
-
for (let
|
|
3194
|
-
if (
|
|
3195
|
-
let
|
|
3196
|
-
if (!
|
|
3197
|
-
fromCube:
|
|
3198
|
-
toCube:
|
|
3188
|
+
c.add(t);
|
|
3189
|
+
}
|
|
3190
|
+
let l = G(i), u = /* @__PURE__ */ new Set();
|
|
3191
|
+
for (let n of c) n !== t.name && this.findHasManyJoinDef(t, n, e) && u.add(n);
|
|
3192
|
+
let d = n.filter((e) => e !== t.name);
|
|
3193
|
+
for (let n of d) {
|
|
3194
|
+
if (s.has(n)) continue;
|
|
3195
|
+
let r = new Set([...s].filter((e) => !u.has(e))), i = a.findPathPreferring(t.name, n, l, r);
|
|
3196
|
+
if (!i || i.length === 0) throw Error(S("server.errors.noJoinPath", {
|
|
3197
|
+
fromCube: t.name,
|
|
3198
|
+
toCube: n
|
|
3199
3199
|
}));
|
|
3200
|
-
for (let { fromCube:
|
|
3201
|
-
if (
|
|
3202
|
-
let
|
|
3203
|
-
if (!
|
|
3204
|
-
|
|
3200
|
+
for (let { fromCube: t, toCube: n, joinDef: r, reversed: a } of i) {
|
|
3201
|
+
if (s.has(n)) continue;
|
|
3202
|
+
let i = e.get(n);
|
|
3203
|
+
if (!i) throw Error(S("server.errors.cubeNotFound", { cubeName: n }));
|
|
3204
|
+
o.push(this.buildJoinRef(i, n, t, r, a)), s.add(n);
|
|
3205
3205
|
}
|
|
3206
3206
|
}
|
|
3207
|
-
return
|
|
3207
|
+
return o;
|
|
3208
3208
|
}
|
|
3209
3209
|
buildJoinRef(e, t, n, r, i) {
|
|
3210
|
-
let a = i ?
|
|
3210
|
+
let a = i ? f(r.relationship) : r.relationship;
|
|
3211
3211
|
if (a === "belongsToMany" && r.through) {
|
|
3212
|
-
let i =
|
|
3212
|
+
let i = p("belongsToMany", r.sqlJoinType);
|
|
3213
3213
|
return {
|
|
3214
3214
|
target: {
|
|
3215
3215
|
name: e.name,
|
|
@@ -3227,7 +3227,7 @@ var yn = class {
|
|
|
3227
3227
|
}
|
|
3228
3228
|
};
|
|
3229
3229
|
}
|
|
3230
|
-
let o =
|
|
3230
|
+
let o = p(a, r.sqlJoinType);
|
|
3231
3231
|
return {
|
|
3232
3232
|
target: {
|
|
3233
3233
|
name: e.name,
|
|
@@ -3242,7 +3242,7 @@ var yn = class {
|
|
|
3242
3242
|
findHasManyJoinDef(e, t, n) {
|
|
3243
3243
|
if (!e.joins) return null;
|
|
3244
3244
|
for (let [, r] of Object.entries(e.joins)) {
|
|
3245
|
-
let e =
|
|
3245
|
+
let e = h(r.targetCube, n);
|
|
3246
3246
|
if (e && e.name === t && r.relationship === "hasMany") return r;
|
|
3247
3247
|
}
|
|
3248
3248
|
return null;
|
|
@@ -3293,7 +3293,7 @@ function Sn(e) {
|
|
|
3293
3293
|
function Cn(e, t, n) {
|
|
3294
3294
|
if (!e.joins) return null;
|
|
3295
3295
|
for (let [, r] of Object.entries(e.joins)) {
|
|
3296
|
-
let e =
|
|
3296
|
+
let e = h(r.targetCube, n);
|
|
3297
3297
|
if (e && e.name === t) return r;
|
|
3298
3298
|
}
|
|
3299
3299
|
return null;
|
|
@@ -3365,7 +3365,7 @@ var En = class {
|
|
|
3365
3365
|
if (l.length === 0) return null;
|
|
3366
3366
|
let u = this.resolveCTEJoinKeys(n, r, a, i);
|
|
3367
3367
|
if (!u) return null;
|
|
3368
|
-
let { joinKeys: d, intermediateJoins: f } = u, p = this.filterPropagation.findPropagatingFilters(i, a, n), { aggregateMeasures: m, requiredBaseMeasures: h } =
|
|
3368
|
+
let { joinKeys: d, intermediateJoins: f } = u, p = this.filterPropagation.findPropagatingFilters(i, a, n), { aggregateMeasures: m, requiredBaseMeasures: h } = cn(l, /* @__PURE__ */ new Map([[a.name, a]])), g = [.../* @__PURE__ */ new Set([...m, ...Array.from(h).filter((e) => e.startsWith(a.name + "."))])];
|
|
3369
3369
|
if (g.length === 0) return null;
|
|
3370
3370
|
let _ = this.expandCalculatedMeasureDependencies(a, g), v = this.findDownstreamJoinKeys(a, i, n);
|
|
3371
3371
|
return {
|
|
@@ -3413,7 +3413,7 @@ var En = class {
|
|
|
3413
3413
|
joinDef: e.joinDef,
|
|
3414
3414
|
reversed: e.reversed
|
|
3415
3415
|
}));
|
|
3416
|
-
if (!s.slice(0, -1).some((e) => (e.reversed ?
|
|
3416
|
+
if (!s.slice(0, -1).some((e) => (e.reversed ? f(e.joinDef.relationship) : e.joinDef.relationship) === "hasMany")) return {
|
|
3417
3417
|
path: s,
|
|
3418
3418
|
hasIntermediateHasMany: !1,
|
|
3419
3419
|
intermediateJoins: [],
|
|
@@ -3458,7 +3458,7 @@ var En = class {
|
|
|
3458
3458
|
let r = [], i = Tn(t, e.name);
|
|
3459
3459
|
if (!e.joins) return r;
|
|
3460
3460
|
for (let [, t] of Object.entries(e.joins)) {
|
|
3461
|
-
let e =
|
|
3461
|
+
let e = h(t.targetCube, n);
|
|
3462
3462
|
if (!e) continue;
|
|
3463
3463
|
let a = e.name;
|
|
3464
3464
|
i.has(a) && r.push({
|
|
@@ -3518,11 +3518,11 @@ var En = class {
|
|
|
3518
3518
|
for (let a of i) {
|
|
3519
3519
|
if (a === t.name) continue;
|
|
3520
3520
|
let i = n.get(a);
|
|
3521
|
-
if (i?.joins) for (let [,
|
|
3522
|
-
let
|
|
3523
|
-
if (!
|
|
3524
|
-
let
|
|
3525
|
-
|
|
3521
|
+
if (i?.joins) for (let [, o] of Object.entries(i.joins)) {
|
|
3522
|
+
let s = h(o.targetCube, n);
|
|
3523
|
+
if (!s || s.name !== t.name || o.relationship !== "hasMany") continue;
|
|
3524
|
+
let c = this.buildPropagatingFilter(e, i, a, o);
|
|
3525
|
+
c && r.push(c);
|
|
3526
3526
|
}
|
|
3527
3527
|
}
|
|
3528
3528
|
return r;
|
|
@@ -3696,7 +3696,7 @@ var En = class {
|
|
|
3696
3696
|
}
|
|
3697
3697
|
convertInternalPathToJoinPathSteps(e) {
|
|
3698
3698
|
return e.map((e) => {
|
|
3699
|
-
let t = e.reversed ?
|
|
3699
|
+
let t = e.reversed ? f(e.joinDef.relationship) : e.joinDef.relationship, n = p(t, e.joinDef.sqlJoinType), r = e.joinDef.on.map((e) => ({
|
|
3700
3700
|
sourceColumn: e.source.name,
|
|
3701
3701
|
targetColumn: e.target.name
|
|
3702
3702
|
})), i = {
|
|
@@ -3787,7 +3787,7 @@ var En = class {
|
|
|
3787
3787
|
};
|
|
3788
3788
|
//#endregion
|
|
3789
3789
|
//#region src/server/builders/cte-builder.ts
|
|
3790
|
-
function
|
|
3790
|
+
function An(e, t) {
|
|
3791
3791
|
if (!t.joins) return e;
|
|
3792
3792
|
for (let n of t.joins) switch (n.type || "left") {
|
|
3793
3793
|
case "left":
|
|
@@ -3803,23 +3803,23 @@ function K(e, t) {
|
|
|
3803
3803
|
}
|
|
3804
3804
|
return e;
|
|
3805
3805
|
}
|
|
3806
|
-
var
|
|
3806
|
+
var jn = class {
|
|
3807
3807
|
queryBuilder;
|
|
3808
3808
|
constructor(e) {
|
|
3809
3809
|
this.queryBuilder = e;
|
|
3810
3810
|
}
|
|
3811
|
-
buildPreAggregationCTE(e, t, r, i
|
|
3812
|
-
let
|
|
3813
|
-
if (Object.keys(
|
|
3814
|
-
let
|
|
3815
|
-
|
|
3816
|
-
let
|
|
3817
|
-
if (
|
|
3818
|
-
let e =
|
|
3819
|
-
|
|
3811
|
+
buildPreAggregationCTE(e, t, n, r, i) {
|
|
3812
|
+
let a = e.cube, o = a.sql(n), s = !!(e.intermediateJoins && e.intermediateJoins.length > 0), c = this.buildCTESelections(e, a, t, n, s);
|
|
3813
|
+
if (Object.keys(c).length === 0) return null;
|
|
3814
|
+
let l = n.db.select(c).from(o.from);
|
|
3815
|
+
l = An(l, o), l = this.applyIntermediateJoins(l, e, n, s);
|
|
3816
|
+
let u = this.buildCTEWhereConditions(e, a, t, n, r, i, o);
|
|
3817
|
+
if (u.length > 0) {
|
|
3818
|
+
let e = u.length === 1 ? u[0] : w(...u);
|
|
3819
|
+
l = l.where(e);
|
|
3820
3820
|
}
|
|
3821
|
-
let
|
|
3822
|
-
return
|
|
3821
|
+
let d = this.buildCTEGroupByFields(e, a, t, n, s);
|
|
3822
|
+
return d.length > 0 && (l = l.groupBy(...d)), n.db.$with(e.cteAlias).as(l);
|
|
3823
3823
|
}
|
|
3824
3824
|
buildCTESelections(e, t, n, r, i) {
|
|
3825
3825
|
let a = {};
|
|
@@ -3833,7 +3833,7 @@ var An = class {
|
|
|
3833
3833
|
}
|
|
3834
3834
|
for (let r of t.joinKeys) if (r.targetColumnObj) {
|
|
3835
3835
|
e[r.targetColumn] = r.targetColumnObj;
|
|
3836
|
-
for (let [t, i] of Object.entries(n.dimensions || {})) i.sql === r.targetColumnObj && t !== r.targetColumn && (e[t] =
|
|
3836
|
+
for (let [t, i] of Object.entries(n.dimensions || {})) i.sql === r.targetColumnObj && t !== r.targetColumn && (e[t] = C`${r.targetColumnObj}`.as(t));
|
|
3837
3837
|
}
|
|
3838
3838
|
}
|
|
3839
3839
|
addDownstreamKeySelections(e, t) {
|
|
@@ -3843,7 +3843,7 @@ var An = class {
|
|
|
3843
3843
|
let i = /* @__PURE__ */ new Map([[n.name, n]]), a = this.queryBuilder.buildResolvedMeasures(t.measures, i, r);
|
|
3844
3844
|
for (let n of t.measures) {
|
|
3845
3845
|
let [, t] = n.split("."), r = a.get(n);
|
|
3846
|
-
r && (e[t] =
|
|
3846
|
+
r && (e[t] = C`${r()}`.as(t));
|
|
3847
3847
|
}
|
|
3848
3848
|
}
|
|
3849
3849
|
addDimensionSelections(e, t, n, r) {
|
|
@@ -3855,23 +3855,23 @@ var An = class {
|
|
|
3855
3855
|
sql: t.dimensions[o].sql,
|
|
3856
3856
|
type: "number"
|
|
3857
3857
|
}, r);
|
|
3858
|
-
e[o] =
|
|
3858
|
+
e[o] = C`${n}`.as(o);
|
|
3859
3859
|
}
|
|
3860
3860
|
}
|
|
3861
3861
|
for (let a of n.timeDimensions || []) {
|
|
3862
3862
|
let [n, o] = a.dimension.split(".");
|
|
3863
3863
|
if (n === i && t.dimensions?.[o]) {
|
|
3864
3864
|
let n = this.queryBuilder.buildTimeDimensionExpression(t.dimensions[o].sql, a.granularity, r);
|
|
3865
|
-
e[o] =
|
|
3865
|
+
e[o] = C`${n}`.as(o);
|
|
3866
3866
|
}
|
|
3867
3867
|
}
|
|
3868
3868
|
}
|
|
3869
|
-
applyIntermediateJoins(e, t,
|
|
3870
|
-
if (!
|
|
3871
|
-
let
|
|
3872
|
-
for (let t of
|
|
3873
|
-
let
|
|
3874
|
-
|
|
3869
|
+
applyIntermediateJoins(e, t, n, r) {
|
|
3870
|
+
if (!r || !t.intermediateJoins) return e;
|
|
3871
|
+
let i = [...t.intermediateJoins].reverse();
|
|
3872
|
+
for (let t of i) {
|
|
3873
|
+
let r = t.cube.sql(n), i = [b(t.cteJoinColumn, t.joinDef.on[0]?.target)];
|
|
3874
|
+
r.where && i.push(r.where), e = e.leftJoin(r.from, w(...i));
|
|
3875
3875
|
}
|
|
3876
3876
|
return e;
|
|
3877
3877
|
}
|
|
@@ -3919,7 +3919,7 @@ var An = class {
|
|
|
3919
3919
|
}, e, i);
|
|
3920
3920
|
for (let e of n.dimensions || []) {
|
|
3921
3921
|
let [n, i] = e.split(".");
|
|
3922
|
-
n === a && t.dimensions?.[i] && o.push(
|
|
3922
|
+
n === a && t.dimensions?.[i] && o.push(l(t.dimensions[i].sql, r));
|
|
3923
3923
|
}
|
|
3924
3924
|
for (let e of n.timeDimensions || []) {
|
|
3925
3925
|
let [n, i] = e.dimension.split(".");
|
|
@@ -3934,67 +3934,67 @@ var An = class {
|
|
|
3934
3934
|
} else for (let n of t.joinKeys) n.targetColumnObj && e(n.targetColumnObj);
|
|
3935
3935
|
if (t.downstreamJoinKeys) for (let n of t.downstreamJoinKeys) for (let t of n.joinKeys) t.sourceColumnObj && e(t.sourceColumnObj);
|
|
3936
3936
|
}
|
|
3937
|
-
buildCTEJoinCondition(e, t,
|
|
3938
|
-
let
|
|
3939
|
-
if (!
|
|
3940
|
-
let
|
|
3941
|
-
if (
|
|
3942
|
-
let e =
|
|
3943
|
-
|
|
3944
|
-
} else for (let e of
|
|
3945
|
-
let
|
|
3946
|
-
|
|
3937
|
+
buildCTEJoinCondition(e, t, n) {
|
|
3938
|
+
let r = n.preAggregationCTEs?.find((t) => t.cube.name === e.cube.name);
|
|
3939
|
+
if (!r) throw Error(`CTE info not found for cube ${e.cube.name}`);
|
|
3940
|
+
let i = [];
|
|
3941
|
+
if (r.intermediateJoins && r.intermediateJoins.length > 0) {
|
|
3942
|
+
let e = r.intermediateJoins[0], a = this.resolveCTEJoinSourceColumn(r.joinKeys[0], r, n), o = C`${C.identifier(t)}.${C.identifier(e.primaryJoinColumn.name)}`;
|
|
3943
|
+
i.push(b(a, o));
|
|
3944
|
+
} else for (let e of r.joinKeys) {
|
|
3945
|
+
let a = this.resolveCTEJoinSourceColumn(e, r, n), o = C`${C.identifier(t)}.${C.identifier(e.targetColumn)}`;
|
|
3946
|
+
i.push(b(a, o));
|
|
3947
3947
|
}
|
|
3948
|
-
return
|
|
3948
|
+
return i.length === 1 ? i[0] : w(...i);
|
|
3949
3949
|
}
|
|
3950
3950
|
resolveCTEJoinSourceColumn(e, t, n) {
|
|
3951
3951
|
if (!e) throw Error(`Missing join key while building CTE join condition for '${t.cube.name}'`);
|
|
3952
|
-
let r = e.sourceColumnObj ||
|
|
3952
|
+
let r = e.sourceColumnObj || C.identifier(e.sourceColumn);
|
|
3953
3953
|
if (!e.sourceColumnObj || !n.preAggregationCTEs) return r;
|
|
3954
3954
|
for (let r of n.preAggregationCTEs) if (r.cube.name !== t.cube.name) {
|
|
3955
|
-
for (let [t, n] of Object.entries(r.cube.dimensions || {})) if (typeof n.sql != "function" && n.sql === e.sourceColumnObj) return
|
|
3955
|
+
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)}`;
|
|
3956
3956
|
}
|
|
3957
3957
|
return r;
|
|
3958
3958
|
}
|
|
3959
3959
|
buildPropagatingFilterSubquery(e, t) {
|
|
3960
|
-
let
|
|
3961
|
-
if (
|
|
3960
|
+
let n = e.sourceCube, r = n.sql(t), i = [];
|
|
3961
|
+
if (r.where && i.push(r.where), e.preBuiltFilterSQL) i.push(e.preBuiltFilterSQL);
|
|
3962
3962
|
else {
|
|
3963
|
-
let
|
|
3964
|
-
|
|
3963
|
+
let r = { filters: e.filters }, a = /* @__PURE__ */ new Map([[n.name, n]]), o = this.queryBuilder.buildWhereConditions(a, r, t);
|
|
3964
|
+
i.push(...o);
|
|
3965
3965
|
}
|
|
3966
|
-
if (
|
|
3967
|
-
let
|
|
3968
|
-
if (
|
|
3969
|
-
let { source: e, target: n } =
|
|
3970
|
-
return
|
|
3966
|
+
if (i.length === 0) return null;
|
|
3967
|
+
let a = i.length === 1 ? i[0] : w(...i), o = e.joinConditions;
|
|
3968
|
+
if (o.length === 1) {
|
|
3969
|
+
let { source: e, target: n } = o[0], i = t.db.select({ pk: e }).from(r.from);
|
|
3970
|
+
return i = An(i, r), i = i.where(a), C`${n} IN ${i}`;
|
|
3971
3971
|
}
|
|
3972
3972
|
{
|
|
3973
|
-
let e =
|
|
3974
|
-
return
|
|
3973
|
+
let e = o.map((e) => b(e.source, e.target)), n = w(...e, a), i = t.db.select({ one: C`1` }).from(r.from);
|
|
3974
|
+
return i = An(i, r), i = i.where(n), C`EXISTS ${i}`;
|
|
3975
3975
|
}
|
|
3976
3976
|
}
|
|
3977
3977
|
};
|
|
3978
3978
|
//#endregion
|
|
3979
3979
|
//#region src/server/execution/annotation-builder.ts
|
|
3980
|
-
function
|
|
3981
|
-
let n =
|
|
3980
|
+
function Mn(e, t) {
|
|
3981
|
+
let n = Nn(e);
|
|
3982
3982
|
return {
|
|
3983
|
-
measures:
|
|
3984
|
-
dimensions:
|
|
3983
|
+
measures: Fn(t, n),
|
|
3984
|
+
dimensions: In(t, n),
|
|
3985
3985
|
segments: {},
|
|
3986
|
-
timeDimensions:
|
|
3986
|
+
timeDimensions: Ln(t, n)
|
|
3987
3987
|
};
|
|
3988
3988
|
}
|
|
3989
|
-
function
|
|
3989
|
+
function Nn(e) {
|
|
3990
3990
|
let t = [e.primaryCube].filter(Boolean);
|
|
3991
3991
|
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));
|
|
3992
3992
|
return t;
|
|
3993
3993
|
}
|
|
3994
|
-
function
|
|
3994
|
+
function Pn(e, t, n) {
|
|
3995
3995
|
return e.find((e) => e?.name === t)?.dimensions?.[n];
|
|
3996
3996
|
}
|
|
3997
|
-
function
|
|
3997
|
+
function Fn(e, t) {
|
|
3998
3998
|
let n = {};
|
|
3999
3999
|
if (!e.measures) return n;
|
|
4000
4000
|
for (let r of e.measures) {
|
|
@@ -4007,11 +4007,11 @@ function Pn(e, t) {
|
|
|
4007
4007
|
}
|
|
4008
4008
|
return n;
|
|
4009
4009
|
}
|
|
4010
|
-
function
|
|
4010
|
+
function In(e, t) {
|
|
4011
4011
|
let n = {};
|
|
4012
4012
|
if (!e.dimensions) return n;
|
|
4013
4013
|
for (let r of e.dimensions) {
|
|
4014
|
-
let [e, i] = r.split("."), a =
|
|
4014
|
+
let [e, i] = r.split("."), a = Pn(t, e, i);
|
|
4015
4015
|
a && (n[r] = {
|
|
4016
4016
|
title: a.title || i,
|
|
4017
4017
|
shortTitle: a.title || i,
|
|
@@ -4020,11 +4020,11 @@ function Fn(e, t) {
|
|
|
4020
4020
|
}
|
|
4021
4021
|
return n;
|
|
4022
4022
|
}
|
|
4023
|
-
function
|
|
4023
|
+
function Ln(e, t) {
|
|
4024
4024
|
let n = {};
|
|
4025
4025
|
if (!e.timeDimensions) return n;
|
|
4026
4026
|
for (let r of e.timeDimensions) {
|
|
4027
|
-
let [e, i] = r.dimension.split("."), a =
|
|
4027
|
+
let [e, i] = r.dimension.split("."), a = Pn(t, e, i);
|
|
4028
4028
|
a && (n[r.dimension] = {
|
|
4029
4029
|
title: a.title || i,
|
|
4030
4030
|
shortTitle: a.title || i,
|
|
@@ -4036,7 +4036,7 @@ function In(e, t) {
|
|
|
4036
4036
|
}
|
|
4037
4037
|
//#endregion
|
|
4038
4038
|
//#region src/shared/date-utils.ts
|
|
4039
|
-
function
|
|
4039
|
+
function Rn(e) {
|
|
4040
4040
|
let t = /* @__PURE__ */ new Date(), n = e.toLowerCase().trim(), r = t.getUTCFullYear(), i = t.getUTCMonth(), a = t.getUTCDate(), o = t.getUTCDay();
|
|
4041
4041
|
if (n === "today") {
|
|
4042
4042
|
let e = new Date(t);
|
|
@@ -4151,13 +4151,13 @@ function Ln(e) {
|
|
|
4151
4151
|
}
|
|
4152
4152
|
//#endregion
|
|
4153
4153
|
//#region src/server/gap-filler.ts
|
|
4154
|
-
var
|
|
4155
|
-
function
|
|
4156
|
-
let r = [], i =
|
|
4157
|
-
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i =
|
|
4154
|
+
var zn = 1e4;
|
|
4155
|
+
function Bn(e, t, n) {
|
|
4156
|
+
let r = [], i = Vn(new Date(e), n), a = Vn(new Date(t), n);
|
|
4157
|
+
for (; i <= a && r.length < 1e4;) r.push(new Date(i)), i = Hn(i, n);
|
|
4158
4158
|
return r;
|
|
4159
4159
|
}
|
|
4160
|
-
function
|
|
4160
|
+
function Vn(e, t) {
|
|
4161
4161
|
let n = new Date(e);
|
|
4162
4162
|
switch (t) {
|
|
4163
4163
|
case "second":
|
|
@@ -4189,7 +4189,7 @@ function Bn(e, t) {
|
|
|
4189
4189
|
}
|
|
4190
4190
|
return n;
|
|
4191
4191
|
}
|
|
4192
|
-
function
|
|
4192
|
+
function Hn(e, t) {
|
|
4193
4193
|
let n = new Date(e);
|
|
4194
4194
|
switch (t) {
|
|
4195
4195
|
case "second":
|
|
@@ -4217,68 +4217,68 @@ function Vn(e, t) {
|
|
|
4217
4217
|
}
|
|
4218
4218
|
return n;
|
|
4219
4219
|
}
|
|
4220
|
-
function
|
|
4220
|
+
function Un(e, t) {
|
|
4221
4221
|
let n = null;
|
|
4222
4222
|
if (e instanceof Date) n = e;
|
|
4223
4223
|
else if (typeof e == "string") {
|
|
4224
4224
|
let t = new Date(e);
|
|
4225
4225
|
isNaN(t.getTime()) || (n = t);
|
|
4226
4226
|
}
|
|
4227
|
-
return !n || isNaN(n.getTime()) ? null :
|
|
4227
|
+
return !n || isNaN(n.getTime()) ? null : Vn(n, t).toISOString();
|
|
4228
4228
|
}
|
|
4229
|
-
function
|
|
4229
|
+
function Wn(e, t) {
|
|
4230
4230
|
return t.length === 0 ? "__all__" : t.map((t) => String(e[t] ?? "")).join("|||");
|
|
4231
4231
|
}
|
|
4232
|
-
function
|
|
4233
|
-
let { timeDimensionKey: n, granularity: r, dateRange: i, dimensions: a } = t, o =
|
|
4232
|
+
function Gn(e, t) {
|
|
4233
|
+
let { timeDimensionKey: n, granularity: r, dateRange: i, dimensions: a } = t, o = Bn(i[0], i[1], r);
|
|
4234
4234
|
if (o.length === 0) return e;
|
|
4235
|
-
if (o.length >= 1e4) return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${
|
|
4236
|
-
let s =
|
|
4235
|
+
if (o.length >= 1e4) return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${zn}-bucket limit. Returning unfilled data.`), e;
|
|
4236
|
+
let s = Kn(e, n, r, a), c = [];
|
|
4237
4237
|
for (let [e, n] of s) {
|
|
4238
4238
|
let e = n.size > 0 ? n.values().next().value : null;
|
|
4239
4239
|
for (let r of o) {
|
|
4240
4240
|
let i = r.toISOString(), a = n.get(i);
|
|
4241
|
-
c.push(a ??
|
|
4241
|
+
c.push(a ?? qn(i, e ?? null, t));
|
|
4242
4242
|
}
|
|
4243
4243
|
}
|
|
4244
4244
|
return c;
|
|
4245
4245
|
}
|
|
4246
|
-
function
|
|
4246
|
+
function Kn(e, t, n, r) {
|
|
4247
4247
|
let i = /* @__PURE__ */ new Map();
|
|
4248
4248
|
for (let a of e) {
|
|
4249
|
-
let e =
|
|
4249
|
+
let e = Wn(a, r), o = Un(a[t], n) ?? String(a[t]), s = i.get(e);
|
|
4250
4250
|
s || (s = /* @__PURE__ */ new Map(), i.set(e, s)), s.set(o, a);
|
|
4251
4251
|
}
|
|
4252
4252
|
return i.size === 0 && r.length === 0 && i.set("__all__", /* @__PURE__ */ new Map()), i;
|
|
4253
4253
|
}
|
|
4254
|
-
function
|
|
4254
|
+
function qn(e, t, n) {
|
|
4255
4255
|
let { timeDimensionKey: r, fillValue: i, measures: a, dimensions: o } = n, s = { [r]: e };
|
|
4256
4256
|
if (t) for (let e of o) s[e] = t[e];
|
|
4257
4257
|
for (let e of a) s[e] = i;
|
|
4258
4258
|
return s;
|
|
4259
4259
|
}
|
|
4260
|
-
function
|
|
4260
|
+
function K(e) {
|
|
4261
4261
|
if (!e) return null;
|
|
4262
4262
|
if (Array.isArray(e)) {
|
|
4263
4263
|
if (e.length < 2) return null;
|
|
4264
4264
|
let t = new Date(e[0]), n = new Date(e[1]);
|
|
4265
4265
|
return isNaN(t.getTime()) || isNaN(n.getTime()) ? null : [t, n];
|
|
4266
4266
|
}
|
|
4267
|
-
let t =
|
|
4267
|
+
let t = Rn(e);
|
|
4268
4268
|
if (t) return [t.start, t.end];
|
|
4269
4269
|
let n = new Date(e);
|
|
4270
4270
|
return isNaN(n.getTime()) ? null : [n, n];
|
|
4271
4271
|
}
|
|
4272
|
-
function
|
|
4272
|
+
function Jn(e, t, n) {
|
|
4273
4273
|
if (!t.timeDimensions || t.timeDimensions.length === 0) return e;
|
|
4274
4274
|
let r = t.timeDimensions.filter((e) => {
|
|
4275
|
-
let n = e.fillMissingDates !== !1, r = !!e.granularity, i = e.dateRange ||
|
|
4275
|
+
let n = e.fillMissingDates !== !1, r = !!e.granularity, i = e.dateRange || q(e.dimension, t.filters);
|
|
4276
4276
|
return n && r && i;
|
|
4277
4277
|
});
|
|
4278
4278
|
if (r.length === 0) return e;
|
|
4279
4279
|
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;
|
|
4280
4280
|
for (let e of r) {
|
|
4281
|
-
let r =
|
|
4281
|
+
let r = K(e.dateRange) || Yn(e.dimension, t.filters);
|
|
4282
4282
|
if (!r) continue;
|
|
4283
4283
|
let a = {
|
|
4284
4284
|
timeDimensionKey: e.dimension,
|
|
@@ -4288,44 +4288,44 @@ function qn(e, t, n) {
|
|
|
4288
4288
|
measures: n,
|
|
4289
4289
|
dimensions: o
|
|
4290
4290
|
};
|
|
4291
|
-
s =
|
|
4291
|
+
s = Gn(s, a);
|
|
4292
4292
|
}
|
|
4293
4293
|
return s;
|
|
4294
4294
|
}
|
|
4295
|
-
function
|
|
4295
|
+
function q(e, t) {
|
|
4296
4296
|
if (!t) return null;
|
|
4297
4297
|
for (let n of t) {
|
|
4298
4298
|
if ("member" in n && "operator" in n && n.member === e && n.operator === "inDateRange") return n;
|
|
4299
4299
|
if ("and" in n && n.and) {
|
|
4300
|
-
let t =
|
|
4300
|
+
let t = q(e, n.and);
|
|
4301
4301
|
if (t) return t;
|
|
4302
4302
|
}
|
|
4303
4303
|
if ("or" in n && n.or) {
|
|
4304
|
-
let t =
|
|
4304
|
+
let t = q(e, n.or);
|
|
4305
4305
|
if (t) return t;
|
|
4306
4306
|
}
|
|
4307
4307
|
}
|
|
4308
4308
|
return null;
|
|
4309
4309
|
}
|
|
4310
|
-
function
|
|
4311
|
-
let n =
|
|
4310
|
+
function Yn(e, t) {
|
|
4311
|
+
let n = q(e, t);
|
|
4312
4312
|
if (!n) return null;
|
|
4313
4313
|
if (n.dateRange) {
|
|
4314
|
-
let e =
|
|
4314
|
+
let e = K(n.dateRange);
|
|
4315
4315
|
if (e) return e;
|
|
4316
4316
|
}
|
|
4317
4317
|
let r = n.values;
|
|
4318
4318
|
if (!r || r.length === 0) return null;
|
|
4319
4319
|
if (r.length === 1 && typeof r[0] == "string") {
|
|
4320
|
-
let e =
|
|
4321
|
-
return e ? [e.start, e.end] :
|
|
4320
|
+
let e = Rn(r[0]);
|
|
4321
|
+
return e ? [e.start, e.end] : K(r);
|
|
4322
4322
|
}
|
|
4323
|
-
return r.length >= 2 ?
|
|
4323
|
+
return r.length >= 2 ? K(r) : null;
|
|
4324
4324
|
}
|
|
4325
4325
|
//#endregion
|
|
4326
4326
|
//#region src/server/execution/result-post-processor.ts
|
|
4327
|
-
function
|
|
4328
|
-
return
|
|
4327
|
+
function Xn(e, t, n) {
|
|
4328
|
+
return Jn(Array.isArray(e) ? e.map((e) => {
|
|
4329
4329
|
let r = { ...e };
|
|
4330
4330
|
if (t.timeDimensions) {
|
|
4331
4331
|
for (let e of t.timeDimensions) if (e.dimension in r) {
|
|
@@ -4342,7 +4342,7 @@ function Yn(e, t, n) {
|
|
|
4342
4342
|
}
|
|
4343
4343
|
//#endregion
|
|
4344
4344
|
//#region src/server/execution/filter-cache-preloader.ts
|
|
4345
|
-
var
|
|
4345
|
+
var Zn = class {
|
|
4346
4346
|
queryBuilder;
|
|
4347
4347
|
constructor(e) {
|
|
4348
4348
|
this.queryBuilder = e;
|
|
@@ -4364,8 +4364,8 @@ var Xn = class {
|
|
|
4364
4364
|
"arrayOverlaps",
|
|
4365
4365
|
"arrayContained"
|
|
4366
4366
|
].includes(e.operator)) return;
|
|
4367
|
-
let
|
|
4368
|
-
|
|
4367
|
+
let s = o(a, r), c = this.queryBuilder.buildFilterConditionPublic(s, e.operator, e.values, a, e.dateRange);
|
|
4368
|
+
c && t.set(i, c);
|
|
4369
4369
|
}
|
|
4370
4370
|
preloadTimeDimensionFilter(e, t, n, r) {
|
|
4371
4371
|
if (!e.dateRange) return;
|
|
@@ -4373,78 +4373,78 @@ var Xn = class {
|
|
|
4373
4373
|
if (t.has(i)) return;
|
|
4374
4374
|
let a = this.resolveMemberDimension(e.dimension, n);
|
|
4375
4375
|
if (!a) return;
|
|
4376
|
-
let o =
|
|
4376
|
+
let o = l(a.sql, r), s = this.queryBuilder.buildDateRangeCondition(o, e.dateRange);
|
|
4377
4377
|
s && t.set(i, s);
|
|
4378
4378
|
}
|
|
4379
|
-
},
|
|
4379
|
+
}, Qn = class {
|
|
4380
4380
|
builders;
|
|
4381
4381
|
constructor(e) {
|
|
4382
4382
|
this.builders = e;
|
|
4383
4383
|
}
|
|
4384
4384
|
resolveMode(e) {
|
|
4385
|
-
let
|
|
4386
|
-
if (this.builders.comparison.hasComparison(e) &&
|
|
4387
|
-
if (
|
|
4388
|
-
return
|
|
4389
|
-
}
|
|
4390
|
-
validateForMode(e,
|
|
4391
|
-
let
|
|
4392
|
-
let e =
|
|
4393
|
-
if (!e.isValid) throw new
|
|
4385
|
+
let t = [];
|
|
4386
|
+
if (this.builders.comparison.hasComparison(e) && t.push("comparison"), this.builders.funnel.hasFunnel(e) && t.push("funnel"), this.builders.flow.hasFlow(e) && t.push("flow"), this.builders.retention.hasRetention(e) && t.push("retention"), t.length === 0) return "regular";
|
|
4387
|
+
if (t.length > 1) throw Error(S("server.errors.queryContainsMultipleModes", { modes: t.join(", ") }));
|
|
4388
|
+
return t[0];
|
|
4389
|
+
}
|
|
4390
|
+
validateForMode(e, t, n) {
|
|
4391
|
+
let i = () => {
|
|
4392
|
+
let e = r(t, n);
|
|
4393
|
+
if (!e.isValid) throw new v(S("server.errors.queryValidationFailed", { errors: e.errors.join(", ") }), e.issues);
|
|
4394
4394
|
};
|
|
4395
4395
|
({
|
|
4396
|
-
regular:
|
|
4397
|
-
comparison:
|
|
4396
|
+
regular: i,
|
|
4397
|
+
comparison: i,
|
|
4398
4398
|
funnel: () => {
|
|
4399
|
-
let e = this.builders.funnel.validateConfig(
|
|
4400
|
-
if (!e.isValid) throw Error(
|
|
4399
|
+
let e = this.builders.funnel.validateConfig(n.funnel, t);
|
|
4400
|
+
if (!e.isValid) throw Error(S("server.errors.funnelValidationFailed", { errors: e.errors.join(", ") }));
|
|
4401
4401
|
},
|
|
4402
4402
|
flow: () => {
|
|
4403
|
-
let e = this.builders.flow.validateConfig(
|
|
4404
|
-
if (!e.isValid) throw Error(
|
|
4403
|
+
let e = this.builders.flow.validateConfig(n.flow, t);
|
|
4404
|
+
if (!e.isValid) throw Error(S("server.errors.flowValidationFailed", { errors: e.errors.join(", ") }));
|
|
4405
4405
|
},
|
|
4406
4406
|
retention: () => {
|
|
4407
|
-
let e = this.builders.retention.validateConfig(
|
|
4408
|
-
if (!e.isValid) throw Error(
|
|
4407
|
+
let e = this.builders.retention.validateConfig(n.retention, t);
|
|
4408
|
+
if (!e.isValid) throw Error(S("server.errors.retentionValidationFailed", { errors: e.errors.join(", ") }));
|
|
4409
4409
|
}
|
|
4410
|
-
})[
|
|
4410
|
+
})[_(e)]();
|
|
4411
4411
|
}
|
|
4412
4412
|
};
|
|
4413
4413
|
//#endregion
|
|
4414
4414
|
//#region src/server/cache-utils.ts
|
|
4415
|
-
function
|
|
4416
|
-
let i = n.keyPrefix ?? "drizzle-cube:", a =
|
|
4415
|
+
function $n(e, t, n = {}, r) {
|
|
4416
|
+
let i = n.keyPrefix ?? "drizzle-cube:", a = er(e), o = `${i}query:${ar(JSON.stringify(a))}`;
|
|
4417
4417
|
if (n.includeSecurityContext !== !1) {
|
|
4418
|
-
let e =
|
|
4418
|
+
let e = ar(n.securityContextSerializer ? n.securityContextSerializer(t) : JSON.stringify(Y(t)));
|
|
4419
4419
|
o += `:ctx:${e}`;
|
|
4420
4420
|
}
|
|
4421
4421
|
return r && (o += `:cubes:${r}`), o;
|
|
4422
4422
|
}
|
|
4423
|
-
function
|
|
4423
|
+
function er(e) {
|
|
4424
4424
|
return {
|
|
4425
4425
|
measures: e.measures ? [...e.measures].sort() : void 0,
|
|
4426
4426
|
dimensions: e.dimensions ? [...e.dimensions].sort() : void 0,
|
|
4427
|
-
filters: e.filters ?
|
|
4428
|
-
timeDimensions: e.timeDimensions ?
|
|
4427
|
+
filters: e.filters ? J(e.filters) : void 0,
|
|
4428
|
+
timeDimensions: e.timeDimensions ? ir(e.timeDimensions) : void 0,
|
|
4429
4429
|
limit: e.limit,
|
|
4430
4430
|
offset: e.offset,
|
|
4431
|
-
order: e.order ?
|
|
4431
|
+
order: e.order ? Y(e.order) : void 0,
|
|
4432
4432
|
fillMissingDatesValue: e.fillMissingDatesValue,
|
|
4433
4433
|
ungrouped: e.ungrouped,
|
|
4434
4434
|
total: e.total,
|
|
4435
|
-
funnel: e.funnel ?
|
|
4436
|
-
flow: e.flow ?
|
|
4437
|
-
retention: e.retention ?
|
|
4435
|
+
funnel: e.funnel ? tr(e.funnel) : void 0,
|
|
4436
|
+
flow: e.flow ? nr(e.flow) : void 0,
|
|
4437
|
+
retention: e.retention ? rr(e.retention) : void 0
|
|
4438
4438
|
};
|
|
4439
4439
|
}
|
|
4440
|
-
function
|
|
4440
|
+
function tr(e) {
|
|
4441
4441
|
return {
|
|
4442
4442
|
bindingKey: e.bindingKey,
|
|
4443
4443
|
timeDimension: e.timeDimension,
|
|
4444
4444
|
steps: e.steps.map((e) => {
|
|
4445
4445
|
let t = {
|
|
4446
4446
|
name: e.name,
|
|
4447
|
-
filter: e.filter ? Array.isArray(e.filter) ?
|
|
4447
|
+
filter: e.filter ? Array.isArray(e.filter) ? J(e.filter) : J([e.filter])[0] : void 0,
|
|
4448
4448
|
timeToConvert: e.timeToConvert
|
|
4449
4449
|
};
|
|
4450
4450
|
return "cube" in e && e.cube && (t.cube = e.cube), t;
|
|
@@ -4453,14 +4453,14 @@ function er(e) {
|
|
|
4453
4453
|
globalTimeWindow: e.globalTimeWindow
|
|
4454
4454
|
};
|
|
4455
4455
|
}
|
|
4456
|
-
function
|
|
4456
|
+
function nr(e) {
|
|
4457
4457
|
return {
|
|
4458
4458
|
bindingKey: e.bindingKey,
|
|
4459
4459
|
timeDimension: e.timeDimension,
|
|
4460
4460
|
eventDimension: e.eventDimension,
|
|
4461
4461
|
startingStep: {
|
|
4462
4462
|
name: e.startingStep.name,
|
|
4463
|
-
filter: e.startingStep.filter ? Array.isArray(e.startingStep.filter) ?
|
|
4463
|
+
filter: e.startingStep.filter ? Array.isArray(e.startingStep.filter) ? J(e.startingStep.filter) : J([e.startingStep.filter])[0] : void 0
|
|
4464
4464
|
},
|
|
4465
4465
|
stepsBefore: e.stepsBefore,
|
|
4466
4466
|
stepsAfter: e.stepsAfter,
|
|
@@ -4469,7 +4469,7 @@ function tr(e) {
|
|
|
4469
4469
|
joinStrategy: e.joinStrategy
|
|
4470
4470
|
};
|
|
4471
4471
|
}
|
|
4472
|
-
function
|
|
4472
|
+
function rr(e) {
|
|
4473
4473
|
return {
|
|
4474
4474
|
timeDimension: e.timeDimension,
|
|
4475
4475
|
bindingKey: e.bindingKey,
|
|
@@ -4477,15 +4477,15 @@ function nr(e) {
|
|
|
4477
4477
|
granularity: e.granularity,
|
|
4478
4478
|
periods: e.periods,
|
|
4479
4479
|
retentionType: e.retentionType,
|
|
4480
|
-
cohortFilters: e.cohortFilters ? Array.isArray(e.cohortFilters) ?
|
|
4481
|
-
activityFilters: e.activityFilters ? Array.isArray(e.activityFilters) ?
|
|
4480
|
+
cohortFilters: e.cohortFilters ? Array.isArray(e.cohortFilters) ? J(e.cohortFilters) : J([e.cohortFilters])[0] : void 0,
|
|
4481
|
+
activityFilters: e.activityFilters ? Array.isArray(e.activityFilters) ? J(e.activityFilters) : J([e.activityFilters])[0] : void 0,
|
|
4482
4482
|
breakdownDimensions: e.breakdownDimensions
|
|
4483
4483
|
};
|
|
4484
4484
|
}
|
|
4485
|
-
function
|
|
4485
|
+
function J(e) {
|
|
4486
4486
|
return [...e].map((e) => {
|
|
4487
|
-
if ("and" in e && e.and) return { and:
|
|
4488
|
-
if ("or" in e && e.or) return { or:
|
|
4487
|
+
if ("and" in e && e.and) return { and: J(e.and) };
|
|
4488
|
+
if ("or" in e && e.or) return { or: J(e.or) };
|
|
4489
4489
|
let t = e;
|
|
4490
4490
|
return {
|
|
4491
4491
|
...t,
|
|
@@ -4493,7 +4493,7 @@ function Y(e) {
|
|
|
4493
4493
|
};
|
|
4494
4494
|
}).sort((e, t) => JSON.stringify(e).localeCompare(JSON.stringify(t)));
|
|
4495
4495
|
}
|
|
4496
|
-
function
|
|
4496
|
+
function ir(e) {
|
|
4497
4497
|
return [...e].map((e) => ({
|
|
4498
4498
|
dimension: e.dimension,
|
|
4499
4499
|
granularity: e.granularity,
|
|
@@ -4505,10 +4505,10 @@ function rr(e) {
|
|
|
4505
4505
|
}) : void 0
|
|
4506
4506
|
})).sort((e, t) => e.dimension.localeCompare(t.dimension));
|
|
4507
4507
|
}
|
|
4508
|
-
function
|
|
4509
|
-
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(
|
|
4508
|
+
function Y(e) {
|
|
4509
|
+
return typeof e != "object" || !e ? e : Array.isArray(e) ? e.map(Y) : Object.keys(e).sort().reduce((t, n) => (t[n] = Y(e[n]), t), {});
|
|
4510
4510
|
}
|
|
4511
|
-
function
|
|
4511
|
+
function ar(e) {
|
|
4512
4512
|
let t = 2166136261, n = 2246822519, r = 3266489917, i = 668265263, a = 16777619;
|
|
4513
4513
|
for (let o = 0; o < e.length; o++) {
|
|
4514
4514
|
let s = e.charCodeAt(o);
|
|
@@ -4518,13 +4518,13 @@ function ir(e) {
|
|
|
4518
4518
|
}
|
|
4519
4519
|
//#endregion
|
|
4520
4520
|
//#region src/server/execution/query-result-cache.ts
|
|
4521
|
-
var
|
|
4521
|
+
var or = class {
|
|
4522
4522
|
cacheConfig;
|
|
4523
4523
|
constructor(e) {
|
|
4524
4524
|
this.cacheConfig = e;
|
|
4525
4525
|
}
|
|
4526
4526
|
generateKey(e, t, n) {
|
|
4527
|
-
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) return
|
|
4527
|
+
if (this.cacheConfig?.enabled !== !1 && this.cacheConfig?.provider) return $n(e, t, this.cacheConfig, n);
|
|
4528
4528
|
}
|
|
4529
4529
|
async lookup(e, t) {
|
|
4530
4530
|
if (!(!e || !this.cacheConfig?.provider)) {
|
|
@@ -4578,13 +4578,13 @@ var ar = class {
|
|
|
4578
4578
|
this.cacheConfig.onError?.(e, "set");
|
|
4579
4579
|
}
|
|
4580
4580
|
}
|
|
4581
|
-
},
|
|
4581
|
+
}, sr = class {
|
|
4582
4582
|
dateTimeBuilder;
|
|
4583
4583
|
constructor(e) {
|
|
4584
4584
|
this.dateTimeBuilder = new I(e);
|
|
4585
4585
|
}
|
|
4586
4586
|
hasComparison(e) {
|
|
4587
|
-
return
|
|
4587
|
+
return ue(e);
|
|
4588
4588
|
}
|
|
4589
4589
|
getComparisonTimeDimension(e) {
|
|
4590
4590
|
return e.timeDimensions?.find((e) => e.compareDateRange && e.compareDateRange.length >= 2);
|
|
@@ -4709,7 +4709,7 @@ var ar = class {
|
|
|
4709
4709
|
return typeof i == "string" && typeof a == "string" ? new Date(i).getTime() - new Date(a).getTime() : 0;
|
|
4710
4710
|
});
|
|
4711
4711
|
}
|
|
4712
|
-
},
|
|
4712
|
+
}, cr = class {
|
|
4713
4713
|
databaseAdapter;
|
|
4714
4714
|
filterBuilder;
|
|
4715
4715
|
dateTimeBuilder;
|
|
@@ -4717,93 +4717,93 @@ var ar = class {
|
|
|
4717
4717
|
this.databaseAdapter = e, this.dateTimeBuilder = new I(e), this.filterBuilder = new B(e, this.dateTimeBuilder);
|
|
4718
4718
|
}
|
|
4719
4719
|
hasFunnel(e) {
|
|
4720
|
-
return
|
|
4720
|
+
return a(e);
|
|
4721
4721
|
}
|
|
4722
|
-
validateConfig(e,
|
|
4723
|
-
let
|
|
4724
|
-
e.steps.length < 2 &&
|
|
4725
|
-
for (let
|
|
4722
|
+
validateConfig(e, t) {
|
|
4723
|
+
let n = [];
|
|
4724
|
+
e.steps.length < 2 && n.push(S("server.validation.funnel.minSteps")), this.validateBindingKey(e, t, n), this.validateTimeDimension(e, t, n);
|
|
4725
|
+
for (let r = 0; r < e.steps.length; r++) this.validateStep(e, e.steps[r], r, t, n);
|
|
4726
4726
|
return {
|
|
4727
|
-
isValid:
|
|
4728
|
-
errors:
|
|
4727
|
+
isValid: n.length === 0,
|
|
4728
|
+
errors: n
|
|
4729
4729
|
};
|
|
4730
4730
|
}
|
|
4731
|
-
validateBindingKey(e,
|
|
4731
|
+
validateBindingKey(e, t, n) {
|
|
4732
4732
|
if (typeof e.bindingKey == "string") {
|
|
4733
|
-
let [
|
|
4734
|
-
if (!
|
|
4735
|
-
|
|
4733
|
+
let [r, i] = e.bindingKey.split(".");
|
|
4734
|
+
if (!r || !i) {
|
|
4735
|
+
n.push(S("server.validation.funnel.invalidBindingKeyFormat", { bindingKey: e.bindingKey }));
|
|
4736
4736
|
return;
|
|
4737
4737
|
}
|
|
4738
|
-
let
|
|
4739
|
-
|
|
4740
|
-
dimName:
|
|
4741
|
-
cubeName:
|
|
4742
|
-
})) :
|
|
4738
|
+
let a = t.get(r);
|
|
4739
|
+
a ? a.dimensions?.[i] || n.push(S("server.validation.funnel.bindingKeyDimNotFound", {
|
|
4740
|
+
dimName: i,
|
|
4741
|
+
cubeName: r
|
|
4742
|
+
})) : n.push(S("server.validation.funnel.bindingKeyCubeNotFound", { cubeName: r }));
|
|
4743
4743
|
return;
|
|
4744
4744
|
}
|
|
4745
|
-
if (Array.isArray(e.bindingKey)) for (let
|
|
4746
|
-
let e =
|
|
4745
|
+
if (Array.isArray(e.bindingKey)) for (let r of e.bindingKey) {
|
|
4746
|
+
let e = t.get(r.cube);
|
|
4747
4747
|
if (!e) {
|
|
4748
|
-
|
|
4748
|
+
n.push(S("server.validation.funnel.bindingKeyMappingCubeNotFound", { cubeName: r.cube }));
|
|
4749
4749
|
continue;
|
|
4750
4750
|
}
|
|
4751
|
-
let [,
|
|
4752
|
-
e.dimensions?.[
|
|
4753
|
-
dimName:
|
|
4754
|
-
cubeName:
|
|
4751
|
+
let [, i] = r.dimension.split(".");
|
|
4752
|
+
e.dimensions?.[i] || n.push(S("server.validation.funnel.bindingKeyDimNotFound", {
|
|
4753
|
+
dimName: i,
|
|
4754
|
+
cubeName: r.cube
|
|
4755
4755
|
}));
|
|
4756
4756
|
}
|
|
4757
4757
|
}
|
|
4758
|
-
validateTimeDimension(e,
|
|
4758
|
+
validateTimeDimension(e, t, n) {
|
|
4759
4759
|
if (typeof e.timeDimension != "string") return;
|
|
4760
|
-
let [
|
|
4761
|
-
if (!
|
|
4762
|
-
|
|
4760
|
+
let [r, i] = e.timeDimension.split(".");
|
|
4761
|
+
if (!r || !i) {
|
|
4762
|
+
n.push(S("server.validation.funnel.invalidTimeDimFormat", { timeDimension: e.timeDimension }));
|
|
4763
4763
|
return;
|
|
4764
4764
|
}
|
|
4765
|
-
let
|
|
4766
|
-
|
|
4767
|
-
dimName:
|
|
4768
|
-
cubeName:
|
|
4769
|
-
})) :
|
|
4770
|
-
}
|
|
4771
|
-
validateStep(e, n, r, i
|
|
4772
|
-
|
|
4773
|
-
step:
|
|
4774
|
-
cube:
|
|
4775
|
-
})),
|
|
4776
|
-
step:
|
|
4777
|
-
value:
|
|
4765
|
+
let a = t.get(r);
|
|
4766
|
+
a ? a.dimensions?.[i] || n.push(S("server.validation.funnel.timeDimNotFound", {
|
|
4767
|
+
dimName: i,
|
|
4768
|
+
cubeName: r
|
|
4769
|
+
})) : n.push(S("server.validation.funnel.timeDimCubeNotFound", { cubeName: r }));
|
|
4770
|
+
}
|
|
4771
|
+
validateStep(e, t, n, r, i) {
|
|
4772
|
+
t.name || i.push(S("server.validation.funnel.stepMustHaveName", { step: n })), "cube" in t && t.cube && !r.get(t.cube) && i.push(S("server.validation.funnel.stepCubeNotFound", {
|
|
4773
|
+
step: n,
|
|
4774
|
+
cube: t.cube
|
|
4775
|
+
})), t.filter && this.validateStepFilters(e, t, n, r, i), t.timeToConvert && n > 0 && (/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(t.timeToConvert) || i.push(S("server.validation.funnel.stepTimeToConvertFormat", {
|
|
4776
|
+
step: n,
|
|
4777
|
+
value: t.timeToConvert
|
|
4778
4778
|
})));
|
|
4779
4779
|
}
|
|
4780
|
-
validateStepFilters(e, n, r, i
|
|
4781
|
-
let
|
|
4782
|
-
"cube" in
|
|
4783
|
-
let
|
|
4784
|
-
for (let e of
|
|
4780
|
+
validateStepFilters(e, t, n, r, i) {
|
|
4781
|
+
let a;
|
|
4782
|
+
"cube" in t && t.cube ? a = t.cube : typeof e.bindingKey == "string" && ([a] = e.bindingKey.split("."));
|
|
4783
|
+
let o = a ? new W(r) : null, s = Array.isArray(t.filter) ? t.filter : [t.filter];
|
|
4784
|
+
for (let e of s) {
|
|
4785
4785
|
if (!("member" in e)) continue;
|
|
4786
|
-
let [
|
|
4787
|
-
if (!
|
|
4788
|
-
|
|
4789
|
-
step:
|
|
4790
|
-
cubeName:
|
|
4786
|
+
let [t, s] = e.member.split("."), c = r.get(t);
|
|
4787
|
+
if (!c) {
|
|
4788
|
+
i.push(S("server.validation.funnel.stepFilterCubeNotFound", {
|
|
4789
|
+
step: n,
|
|
4790
|
+
cubeName: t
|
|
4791
4791
|
}));
|
|
4792
4792
|
continue;
|
|
4793
4793
|
}
|
|
4794
|
-
if (
|
|
4795
|
-
step:
|
|
4796
|
-
member: `${
|
|
4797
|
-
})) :
|
|
4798
|
-
step:
|
|
4799
|
-
field:
|
|
4800
|
-
cubeName:
|
|
4801
|
-
}))),
|
|
4802
|
-
let e =
|
|
4803
|
-
(!e || e.length === 0) &&
|
|
4804
|
-
step:
|
|
4805
|
-
member: `${
|
|
4806
|
-
stepCube:
|
|
4794
|
+
if (c.dimensions?.[s] || (c.measures?.[s] ? i.push(S("server.validation.funnel.stepFilterIsMeasure", {
|
|
4795
|
+
step: n,
|
|
4796
|
+
member: `${t}.${s}`
|
|
4797
|
+
})) : i.push(S("server.validation.funnel.stepFilterMemberNotFound", {
|
|
4798
|
+
step: n,
|
|
4799
|
+
field: s,
|
|
4800
|
+
cubeName: t
|
|
4801
|
+
}))), a && t !== a && o) {
|
|
4802
|
+
let e = o.findPath(a, t);
|
|
4803
|
+
(!e || e.length === 0) && i.push(S("server.validation.funnel.stepFilterNoJoinPath", {
|
|
4804
|
+
step: n,
|
|
4805
|
+
member: `${t}.${s}`,
|
|
4806
|
+
stepCube: a
|
|
4807
4807
|
}));
|
|
4808
4808
|
}
|
|
4809
4809
|
}
|
|
@@ -4882,18 +4882,18 @@ var ar = class {
|
|
|
4882
4882
|
};
|
|
4883
4883
|
});
|
|
4884
4884
|
}
|
|
4885
|
-
resolveCubeForStep(e,
|
|
4885
|
+
resolveCubeForStep(e, t, n) {
|
|
4886
4886
|
if ("cube" in e && e.cube) {
|
|
4887
|
-
let
|
|
4888
|
-
if (!
|
|
4889
|
-
return
|
|
4887
|
+
let t = n.get(e.cube);
|
|
4888
|
+
if (!t) throw Error(S("server.errors.funnel.cubeNotFoundForStep", { cube: e.cube }));
|
|
4889
|
+
return t;
|
|
4890
4890
|
}
|
|
4891
|
-
if (typeof
|
|
4892
|
-
let [e] =
|
|
4893
|
-
if (!
|
|
4894
|
-
return
|
|
4891
|
+
if (typeof t.bindingKey == "string") {
|
|
4892
|
+
let [e] = t.bindingKey.split("."), r = n.get(e);
|
|
4893
|
+
if (!r) throw Error(S("server.errors.funnel.cubeNotFoundForBindingKey", { bindingKey: t.bindingKey }));
|
|
4894
|
+
return r;
|
|
4895
4895
|
}
|
|
4896
|
-
throw Error(
|
|
4896
|
+
throw Error(S("server.errors.funnel.cannotResolveCubeForStep"));
|
|
4897
4897
|
}
|
|
4898
4898
|
resolveBindingKey(e, t, n) {
|
|
4899
4899
|
return tn(e.bindingKey, t, n, $t("server.errors.funnel"));
|
|
@@ -4914,33 +4914,33 @@ var ar = class {
|
|
|
4914
4914
|
let i = "and" in e || "or" in e, a = z(e);
|
|
4915
4915
|
return i || a ? this.buildLogicalFilterCondition(e, a, t, n, r) : this.buildSimpleFilterCondition(e, t, n, r);
|
|
4916
4916
|
}
|
|
4917
|
-
buildLogicalFilterCondition(e, t, r, i
|
|
4918
|
-
let
|
|
4919
|
-
if (t)
|
|
4917
|
+
buildLogicalFilterCondition(e, t, n, r, i) {
|
|
4918
|
+
let a, o;
|
|
4919
|
+
if (t) a = t.isAnd, o = t.filters;
|
|
4920
4920
|
else {
|
|
4921
4921
|
let t = e;
|
|
4922
|
-
|
|
4922
|
+
a = "and" in t && !!t.and, o = t.and || t.or || [];
|
|
4923
4923
|
}
|
|
4924
|
-
let
|
|
4925
|
-
for (let e of
|
|
4926
|
-
let t = this.buildFilterCondition(e, r, i
|
|
4927
|
-
t &&
|
|
4924
|
+
let s = [];
|
|
4925
|
+
for (let e of o) {
|
|
4926
|
+
let t = this.buildFilterCondition(e, n, r, i);
|
|
4927
|
+
t && s.push(t);
|
|
4928
4928
|
}
|
|
4929
|
-
return
|
|
4929
|
+
return s.length === 0 ? null : s.length === 1 ? s[0] : a ? w(...s) : C`(${C.join(s, C` OR `)})`;
|
|
4930
4930
|
}
|
|
4931
4931
|
buildSimpleFilterCondition(e, t, n, r) {
|
|
4932
|
-
let [i, a] = e.member.split("."),
|
|
4933
|
-
if (e.operator !== "set" && e.operator !== "notSet" && !
|
|
4934
|
-
let
|
|
4935
|
-
if (!
|
|
4932
|
+
let [i, a] = e.member.split("."), s = e.dateRange !== void 0;
|
|
4933
|
+
if (e.operator !== "set" && e.operator !== "notSet" && !s && (!e.values || e.values.length === 0 || e.values[0] === void 0 || e.values[0] === "")) return null;
|
|
4934
|
+
let c = n.get(i);
|
|
4935
|
+
if (!c) return null;
|
|
4936
4936
|
if (i !== t.name) {
|
|
4937
4937
|
let e = new W(n).findPath(t.name, i);
|
|
4938
4938
|
if (!e || e.length === 0) return null;
|
|
4939
4939
|
}
|
|
4940
|
-
let
|
|
4941
|
-
if (!
|
|
4942
|
-
let u = l
|
|
4943
|
-
return this.filterBuilder.buildFilterCondition(u, e.operator, e.values || [],
|
|
4940
|
+
let l = c.dimensions?.[a];
|
|
4941
|
+
if (!l) return null;
|
|
4942
|
+
let u = o(l, r);
|
|
4943
|
+
return this.filterBuilder.buildFilterCondition(u, e.operator, e.values || [], l, e.dateRange);
|
|
4944
4944
|
}
|
|
4945
4945
|
buildStepCTE(e, t, n) {
|
|
4946
4946
|
return e.index === 0 ? this.buildFirstStepCTE(e, t) : this.buildSubsequentStepCTE(e, t, n);
|
|
@@ -4949,31 +4949,31 @@ var ar = class {
|
|
|
4949
4949
|
let n = `step_${e.index}`, r = e.cube.sql(t), i = [];
|
|
4950
4950
|
r.where && i.push(r.where), i.push(...e.filterConditions);
|
|
4951
4951
|
let a = t.db.select({
|
|
4952
|
-
binding_key:
|
|
4953
|
-
step_time:
|
|
4952
|
+
binding_key: C`${e.bindingKeyExpr}`.as("binding_key"),
|
|
4953
|
+
step_time: C`MIN(${e.timeExpr})`.as("step_time")
|
|
4954
4954
|
}).from(r.from);
|
|
4955
4955
|
return a = this.addCrossJoinsToQuery(a, e, t, i), i.length > 0 && (a = a.where(R(i))), a = a.groupBy(e.bindingKeyExpr), t.db.$with(n).as(a);
|
|
4956
4956
|
}
|
|
4957
4957
|
buildSubsequentStepCTE(e, t, n) {
|
|
4958
4958
|
let r = `step_${e.index}`, i = `step_${e.index - 1}`, a = e.cube.sql(t), o = [];
|
|
4959
4959
|
a.where && o.push(a.where), o.push(...e.filterConditions);
|
|
4960
|
-
let s =
|
|
4960
|
+
let s = C`${C.identifier(i)}.step_time`, c = C`${e.timeExpr} > ${s}`;
|
|
4961
4961
|
if (e.timeToConvert) {
|
|
4962
4962
|
let t = this.databaseAdapter.buildDateAddInterval(s, e.timeToConvert);
|
|
4963
|
-
c =
|
|
4963
|
+
c = C`${c} AND ${e.timeExpr} <= ${t}`;
|
|
4964
4964
|
}
|
|
4965
4965
|
o.push(c);
|
|
4966
4966
|
let l = t.db.select({
|
|
4967
|
-
binding_key:
|
|
4968
|
-
step_time:
|
|
4969
|
-
}).from(a.from).innerJoin(n,
|
|
4967
|
+
binding_key: C`${e.bindingKeyExpr}`.as("binding_key"),
|
|
4968
|
+
step_time: C`MIN(${e.timeExpr})`.as("step_time")
|
|
4969
|
+
}).from(a.from).innerJoin(n, C`${e.bindingKeyExpr} = ${C.identifier(i)}.binding_key`);
|
|
4970
4970
|
return l = this.addCrossJoinsToQuery(l, e, t, o), o.length > 0 && (l = l.where(R(o))), l = l.groupBy(e.bindingKeyExpr), t.db.$with(r).as(l);
|
|
4971
4971
|
}
|
|
4972
4972
|
addCrossJoinsToQuery(e, t, n, r) {
|
|
4973
4973
|
if (t.joinedCubes.length === 0) return e;
|
|
4974
4974
|
for (let i of t.joinedCubes) for (let t of i.joinPath) {
|
|
4975
4975
|
let a = t.joinDef, o = [];
|
|
4976
|
-
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(
|
|
4976
|
+
for (let e of a.on) e.as ? o.push(e.as(e.source, e.target)) : o.push(b(e.source, e.target));
|
|
4977
4977
|
let s = R(o), c = i.cube.sql(n);
|
|
4978
4978
|
e = e.leftJoin(c.from, s), c.where && r.push(c.where);
|
|
4979
4979
|
}
|
|
@@ -4981,33 +4981,33 @@ var ar = class {
|
|
|
4981
4981
|
}
|
|
4982
4982
|
buildFunnelResultsCTE(e, t, n, r) {
|
|
4983
4983
|
let i = {
|
|
4984
|
-
binding_key:
|
|
4985
|
-
step_0_time:
|
|
4984
|
+
binding_key: C`s0.binding_key`,
|
|
4985
|
+
step_0_time: C`s0.step_time`
|
|
4986
4986
|
};
|
|
4987
|
-
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] =
|
|
4988
|
-
let a =
|
|
4989
|
-
for (let e = 1; e < t.length; e++) a =
|
|
4990
|
-
LEFT JOIN ${
|
|
4991
|
-
let o = Object.entries(i).map(([e, t]) =>
|
|
4987
|
+
for (let e = 1; e < t.length; e++) i[`step_${e}_time`] = C`s${C.raw(String(e))}.step_time`;
|
|
4988
|
+
let a = C`${C.identifier("step_0")} s0`;
|
|
4989
|
+
for (let e = 1; e < t.length; e++) a = C`${a}
|
|
4990
|
+
LEFT JOIN ${C.identifier(`step_${e}`)} s${C.raw(String(e))} ON s0.binding_key = s${C.raw(String(e))}.binding_key`;
|
|
4991
|
+
let o = Object.entries(i).map(([e, t]) => C`${t} AS ${C.identifier(e)}`), s = C`SELECT ${C.join(o, C`, `)} FROM ${a}`;
|
|
4992
4992
|
return r.db.$with("funnel_joined").as(s);
|
|
4993
4993
|
}
|
|
4994
4994
|
buildAggregationCTE(e, t, n, r, i) {
|
|
4995
4995
|
let a = {};
|
|
4996
|
-
a.step_0_count =
|
|
4997
|
-
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] =
|
|
4996
|
+
a.step_0_count = C`COUNT(*)`.as("step_0_count");
|
|
4997
|
+
for (let e = 1; e < n.length; e++) a[`step_${e}_count`] = C`COUNT(${C.identifier(`step_${e}_time`)})`.as(`step_${e}_count`);
|
|
4998
4998
|
if (r.includeTimeMetrics) for (let e = 1; e < n.length; e++) {
|
|
4999
|
-
let t =
|
|
4999
|
+
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`;
|
|
5000
5000
|
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) {
|
|
5001
5001
|
let n = this.databaseAdapter.buildPercentile(r, 50);
|
|
5002
|
-
n && (a[`step_${e}_median_seconds`] =
|
|
5002
|
+
n && (a[`step_${e}_median_seconds`] = C`(SELECT ${n} FROM ${C.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_median_seconds`));
|
|
5003
5003
|
let i = this.databaseAdapter.buildPercentile(r, 90);
|
|
5004
|
-
i && (a[`step_${e}_p90_seconds`] =
|
|
5004
|
+
i && (a[`step_${e}_p90_seconds`] = C`(SELECT ${i} FROM ${C.identifier("funnel_joined")} WHERE ${t} IS NOT NULL)`.as(`step_${e}_p90_seconds`));
|
|
5005
5005
|
}
|
|
5006
5006
|
}
|
|
5007
5007
|
let o = i.db.select(a).from(e);
|
|
5008
5008
|
return i.db.$with("funnel_metrics").as(o);
|
|
5009
5009
|
}
|
|
5010
|
-
},
|
|
5010
|
+
}, lr = class {
|
|
5011
5011
|
filterBuilder;
|
|
5012
5012
|
dateTimeBuilder;
|
|
5013
5013
|
databaseAdapter;
|
|
@@ -5015,32 +5015,32 @@ var ar = class {
|
|
|
5015
5015
|
this.databaseAdapter = e, this.dateTimeBuilder = new I(e), this.filterBuilder = new B(e, this.dateTimeBuilder);
|
|
5016
5016
|
}
|
|
5017
5017
|
hasFlow(e) {
|
|
5018
|
-
return
|
|
5018
|
+
return y(e);
|
|
5019
5019
|
}
|
|
5020
|
-
validateConfig(e,
|
|
5021
|
-
let
|
|
5022
|
-
return
|
|
5020
|
+
validateConfig(e, t) {
|
|
5021
|
+
let n = [], r = [], i = this.databaseAdapter.getEngineType(), a = this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;
|
|
5022
|
+
return i === "sqlite" ? (n.push(S("server.validation.flow.sqliteNotSupported")), {
|
|
5023
5023
|
isValid: !1,
|
|
5024
|
-
errors:
|
|
5025
|
-
warnings:
|
|
5026
|
-
}) : (this.validateBindingKey(e,
|
|
5027
|
-
invalidFormat: () =>
|
|
5028
|
-
cubeNotFound: (e) =>
|
|
5029
|
-
dimNotFound: (e,
|
|
5024
|
+
errors: n,
|
|
5025
|
+
warnings: r
|
|
5026
|
+
}) : (this.validateBindingKey(e, t, n), typeof e.timeDimension == "string" && this.validateMemberDimension(e.timeDimension, t, n, {
|
|
5027
|
+
invalidFormat: () => S("server.validation.flow.invalidTimeDimFormat", { timeDimension: e.timeDimension }),
|
|
5028
|
+
cubeNotFound: (e) => S("server.validation.flow.timeDimCubeNotFound", { cubeName: e }),
|
|
5029
|
+
dimNotFound: (e, t) => S("server.validation.flow.timeDimNotFound", {
|
|
5030
5030
|
dimName: e,
|
|
5031
|
-
cubeName:
|
|
5031
|
+
cubeName: t
|
|
5032
5032
|
})
|
|
5033
|
-
}), e.eventDimension ? this.validateMemberDimension(e.eventDimension,
|
|
5034
|
-
invalidFormat: () =>
|
|
5035
|
-
cubeNotFound: (e) =>
|
|
5036
|
-
dimNotFound: (e,
|
|
5033
|
+
}), e.eventDimension ? this.validateMemberDimension(e.eventDimension, t, n, {
|
|
5034
|
+
invalidFormat: () => S("server.validation.flow.invalidEventDimFormat", { eventDimension: e.eventDimension }),
|
|
5035
|
+
cubeNotFound: (e) => S("server.validation.flow.eventDimCubeNotFound", { cubeName: e }),
|
|
5036
|
+
dimNotFound: (e, t) => S("server.validation.flow.eventDimNotFound", {
|
|
5037
5037
|
dimName: e,
|
|
5038
|
-
cubeName:
|
|
5038
|
+
cubeName: t
|
|
5039
5039
|
})
|
|
5040
|
-
}) :
|
|
5041
|
-
isValid:
|
|
5042
|
-
errors:
|
|
5043
|
-
warnings:
|
|
5040
|
+
}) : n.push(S("server.validation.flow.eventDimRequired")), this.validateStartingStep(e, n, r), this.validateDepthBounds(e, n, r), this.validateJoinStrategy(e, a, n), {
|
|
5041
|
+
isValid: n.length === 0,
|
|
5042
|
+
errors: n,
|
|
5043
|
+
warnings: r
|
|
5044
5044
|
});
|
|
5045
5045
|
}
|
|
5046
5046
|
validateMemberDimension(e, t, n, r) {
|
|
@@ -5052,67 +5052,67 @@ var ar = class {
|
|
|
5052
5052
|
let o = t.get(i);
|
|
5053
5053
|
o ? o.dimensions?.[a] || n.push(r.dimNotFound(a, i)) : n.push(r.cubeNotFound(i));
|
|
5054
5054
|
}
|
|
5055
|
-
validateBindingKey(e,
|
|
5055
|
+
validateBindingKey(e, t, n) {
|
|
5056
5056
|
if (typeof e.bindingKey == "string") {
|
|
5057
|
-
this.validateMemberDimension(e.bindingKey,
|
|
5058
|
-
invalidFormat: () =>
|
|
5059
|
-
cubeNotFound: (e) =>
|
|
5060
|
-
dimNotFound: (e,
|
|
5057
|
+
this.validateMemberDimension(e.bindingKey, t, n, {
|
|
5058
|
+
invalidFormat: () => S("server.validation.flow.invalidBindingKeyFormat", { bindingKey: e.bindingKey }),
|
|
5059
|
+
cubeNotFound: (e) => S("server.validation.flow.bindingKeyCubeNotFound", { cubeName: e }),
|
|
5060
|
+
dimNotFound: (e, t) => S("server.validation.flow.bindingKeyDimNotFound", {
|
|
5061
5061
|
dimName: e,
|
|
5062
|
-
cubeName:
|
|
5062
|
+
cubeName: t
|
|
5063
5063
|
})
|
|
5064
5064
|
});
|
|
5065
5065
|
return;
|
|
5066
5066
|
}
|
|
5067
|
-
if (Array.isArray(e.bindingKey)) for (let
|
|
5068
|
-
let e =
|
|
5067
|
+
if (Array.isArray(e.bindingKey)) for (let r of e.bindingKey) {
|
|
5068
|
+
let e = t.get(r.cube);
|
|
5069
5069
|
if (!e) {
|
|
5070
|
-
|
|
5070
|
+
n.push(S("server.validation.flow.bindingKeyMappingCubeNotFound", { cubeName: r.cube }));
|
|
5071
5071
|
continue;
|
|
5072
5072
|
}
|
|
5073
|
-
let [,
|
|
5074
|
-
e.dimensions?.[
|
|
5075
|
-
dimName:
|
|
5076
|
-
cubeName:
|
|
5073
|
+
let [, i] = r.dimension.split(".");
|
|
5074
|
+
e.dimensions?.[i] || n.push(S("server.validation.flow.bindingKeyDimNotFound", {
|
|
5075
|
+
dimName: i,
|
|
5076
|
+
cubeName: r.cube
|
|
5077
5077
|
}));
|
|
5078
5078
|
}
|
|
5079
5079
|
}
|
|
5080
|
-
validateStartingStep(e,
|
|
5080
|
+
validateStartingStep(e, t, n) {
|
|
5081
5081
|
if (!e.startingStep) {
|
|
5082
|
-
|
|
5082
|
+
t.push(S("server.validation.flow.startingStepRequired"));
|
|
5083
5083
|
return;
|
|
5084
5084
|
}
|
|
5085
|
-
e.startingStep.filter ||
|
|
5085
|
+
e.startingStep.filter || t.push(S("server.validation.flow.startingStepFilterRequired")), e.startingStep.name || n.push(S("server.validation.flow.startingStepNameMissing"));
|
|
5086
5086
|
}
|
|
5087
|
-
validateDepthBounds(e,
|
|
5088
|
-
(e.stepsBefore < 0 || e.stepsBefore > 5) &&
|
|
5087
|
+
validateDepthBounds(e, t, n) {
|
|
5088
|
+
(e.stepsBefore < 0 || e.stepsBefore > 5) && t.push(S("server.validation.flow.stepsBeforeRange", { value: e.stepsBefore })), (e.stepsAfter < 0 || e.stepsAfter > 5) && t.push(S("server.validation.flow.stepsAfterRange", { value: e.stepsAfter })), (e.stepsBefore >= 4 || e.stepsAfter >= 4) && n.push(S("server.validation.flow.highStepDepthWarning"));
|
|
5089
5089
|
}
|
|
5090
|
-
validateJoinStrategy(e,
|
|
5090
|
+
validateJoinStrategy(e, t, n) {
|
|
5091
5091
|
e.joinStrategy && ![
|
|
5092
5092
|
"auto",
|
|
5093
5093
|
"lateral",
|
|
5094
5094
|
"window"
|
|
5095
|
-
].includes(e.joinStrategy) ?
|
|
5095
|
+
].includes(e.joinStrategy) ? n.push(S("server.validation.flow.invalidJoinStrategy", { joinStrategy: e.joinStrategy })) : e.joinStrategy === "lateral" && !t && n.push(S("server.validation.flow.lateralNotSupported"));
|
|
5096
5096
|
}
|
|
5097
|
-
buildFlowQuery(e,
|
|
5098
|
-
if (this.databaseAdapter.getEngineType() === "sqlite") throw Error(
|
|
5099
|
-
let
|
|
5100
|
-
if (
|
|
5101
|
-
let
|
|
5097
|
+
buildFlowQuery(e, t, n) {
|
|
5098
|
+
if (this.databaseAdapter.getEngineType() === "sqlite") throw Error(S("server.validation.flow.sqliteNotSupported"));
|
|
5099
|
+
let r = this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE, i = e.joinStrategy ?? "auto", a = i === "lateral" || i === "auto" && r;
|
|
5100
|
+
if (i === "lateral" && !r) throw Error(S("server.validation.flow.lateralNotSupportedExec"));
|
|
5101
|
+
let o = {
|
|
5102
5102
|
...e,
|
|
5103
5103
|
stepsBefore: e.outputMode === "sunburst" ? 0 : e.stepsBefore
|
|
5104
|
-
},
|
|
5105
|
-
|
|
5106
|
-
let
|
|
5107
|
-
|
|
5108
|
-
let
|
|
5109
|
-
|
|
5110
|
-
let
|
|
5111
|
-
|
|
5112
|
-
let
|
|
5113
|
-
|
|
5114
|
-
let
|
|
5115
|
-
return
|
|
5104
|
+
}, s = this.resolveFlowConfig(o, t, n), c = [], l = this.buildStartingEntitiesCTE(o, s, n);
|
|
5105
|
+
c.push(l);
|
|
5106
|
+
let u = a ? this.buildDirectionalCTEsLateral("before", o, s, n) : this.buildDirectionalCTEsWindow("before", o, s, n);
|
|
5107
|
+
c.push(...u);
|
|
5108
|
+
let d = a ? this.buildDirectionalCTEsLateral("after", o, s, n) : this.buildDirectionalCTEsWindow("after", o, s, n);
|
|
5109
|
+
c.push(...d);
|
|
5110
|
+
let f = this.buildNodesAggregationCTE(o, n);
|
|
5111
|
+
c.push(f);
|
|
5112
|
+
let p = this.buildLinksAggregationCTE(o, n);
|
|
5113
|
+
c.push(p);
|
|
5114
|
+
let m = this.buildFinalResultCTE(n);
|
|
5115
|
+
return c.push(m), n.db.with(...c).select().from(m);
|
|
5116
5116
|
}
|
|
5117
5117
|
transformResult(e) {
|
|
5118
5118
|
if (!e || e.length === 0) return {
|
|
@@ -5149,14 +5149,14 @@ var ar = class {
|
|
|
5149
5149
|
startingStepFilters: this.buildStartingStepFilters(e, r, n)
|
|
5150
5150
|
};
|
|
5151
5151
|
}
|
|
5152
|
-
resolveCube(e,
|
|
5153
|
-
let
|
|
5154
|
-
if (typeof e.bindingKey == "string") [
|
|
5155
|
-
else if (Array.isArray(e.bindingKey) && e.bindingKey.length > 0)
|
|
5156
|
-
else throw Error(
|
|
5157
|
-
let
|
|
5158
|
-
if (!
|
|
5159
|
-
return
|
|
5152
|
+
resolveCube(e, t) {
|
|
5153
|
+
let n;
|
|
5154
|
+
if (typeof e.bindingKey == "string") [n] = e.bindingKey.split(".");
|
|
5155
|
+
else if (Array.isArray(e.bindingKey) && e.bindingKey.length > 0) n = e.bindingKey[0].cube;
|
|
5156
|
+
else throw Error(S("server.errors.flow.cannotResolveCube"));
|
|
5157
|
+
let r = t.get(n);
|
|
5158
|
+
if (!r) throw Error(S("server.errors.flow.cubeNotFound", { cubeName: n }));
|
|
5159
|
+
return r;
|
|
5160
5160
|
}
|
|
5161
5161
|
resolveBindingKey(e, t, n) {
|
|
5162
5162
|
return tn(e.bindingKey, t, n, $t("server.errors.flow"));
|
|
@@ -5164,10 +5164,10 @@ var ar = class {
|
|
|
5164
5164
|
resolveTimeDimension(e, t, n) {
|
|
5165
5165
|
return nn(e.timeDimension, t, n, "server.errors.flow");
|
|
5166
5166
|
}
|
|
5167
|
-
resolveEventDimension(e,
|
|
5168
|
-
let [,
|
|
5169
|
-
if (!
|
|
5170
|
-
return
|
|
5167
|
+
resolveEventDimension(e, t, n) {
|
|
5168
|
+
let [, r] = e.eventDimension.split("."), i = t.dimensions?.[r];
|
|
5169
|
+
if (!i) throw Error(S("server.errors.flow.eventDimNotFound", { eventDimension: e.eventDimension }));
|
|
5170
|
+
return l(i.sql, n);
|
|
5171
5171
|
}
|
|
5172
5172
|
buildStartingStepFilters(e, t, n) {
|
|
5173
5173
|
if (!e.startingStep.filter) return [];
|
|
@@ -5188,10 +5188,10 @@ var ar = class {
|
|
|
5188
5188
|
let e = this.buildSubConditions(r.filters, t, n);
|
|
5189
5189
|
return this.combineConditions(e, r.isAnd);
|
|
5190
5190
|
}
|
|
5191
|
-
let i = e, [, a] = i.member.split("."),
|
|
5192
|
-
if (!
|
|
5193
|
-
let
|
|
5194
|
-
return this.filterBuilder.buildFilterCondition(
|
|
5191
|
+
let i = e, [, a] = i.member.split("."), s = t.dimensions?.[a];
|
|
5192
|
+
if (!s) return null;
|
|
5193
|
+
let c = o(s, n);
|
|
5194
|
+
return this.filterBuilder.buildFilterCondition(c, i.operator, i.values || [], s, i.dateRange);
|
|
5195
5195
|
}
|
|
5196
5196
|
buildSubConditions(e, t, n) {
|
|
5197
5197
|
let r = [];
|
|
@@ -5202,63 +5202,63 @@ var ar = class {
|
|
|
5202
5202
|
return r;
|
|
5203
5203
|
}
|
|
5204
5204
|
combineConditions(e, t) {
|
|
5205
|
-
return e.length === 0 ? null : e.length === 1 ? e[0] : t ?
|
|
5205
|
+
return e.length === 0 ? null : e.length === 1 ? e[0] : t ? w(...e) : C`(${C.join(e, C` OR `)})`;
|
|
5206
5206
|
}
|
|
5207
5207
|
buildStartingEntitiesCTE(e, t, n) {
|
|
5208
5208
|
let { cubeBase: r, bindingKeyExpr: i, timeExpr: a, eventExpr: o, startingStepFilters: s } = t, c = [];
|
|
5209
5209
|
r.where && c.push(r.where), c.push(...s);
|
|
5210
5210
|
let l = n.db.select({
|
|
5211
|
-
binding_key:
|
|
5212
|
-
start_time:
|
|
5213
|
-
event_type:
|
|
5214
|
-
event_path:
|
|
5211
|
+
binding_key: C`${i}`.as("binding_key"),
|
|
5212
|
+
start_time: C`MIN(${a})`.as("start_time"),
|
|
5213
|
+
event_type: C`${o}`.as("event_type"),
|
|
5214
|
+
event_path: C`${o}`.as("event_path")
|
|
5215
5215
|
}).from(r.from);
|
|
5216
5216
|
return c.length > 0 && (l = l.where(R(c))), l = l.groupBy(i, o), e.entityLimit && (l = l.limit(e.entityLimit)), n.db.$with("starting_entities").as(l);
|
|
5217
5217
|
}
|
|
5218
5218
|
buildDirectionalCTEsLateral(e, t, n, r) {
|
|
5219
|
-
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 ?
|
|
5219
|
+
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`;
|
|
5220
5220
|
for (let t = 1; t <= d; t++) {
|
|
5221
5221
|
let n = t === 1 ? "starting_entities" : `${e}_step_${t - 1}`, d = t === 1 ? "start_time" : "step_time", m = `${e}_step_${t}`, h = [];
|
|
5222
|
-
i.where && h.push(i.where), h.push(
|
|
5223
|
-
let g = R(h), _ = l ? u ?
|
|
5224
|
-
binding_key:
|
|
5225
|
-
step_time:
|
|
5226
|
-
event_type:
|
|
5222
|
+
i.where && h.push(i.where), h.push(C`${a} = ${C.identifier(n)}.binding_key`, C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);
|
|
5223
|
+
let g = R(h), _ = l ? u ? C`${s} || ${"→"} || ${C.identifier(n)}.event_path` : C`${C.identifier(n)}.event_path || ${"→"} || ${s}` : C`${s}`, v = r.db.select({
|
|
5224
|
+
binding_key: C`${a}`.as("binding_key"),
|
|
5225
|
+
step_time: C`${o}`.as("step_time"),
|
|
5226
|
+
event_type: C`${s}`.as("event_type"),
|
|
5227
5227
|
event_path: _.as("event_path")
|
|
5228
|
-
}).from(i.from).where(g).orderBy(
|
|
5229
|
-
binding_key:
|
|
5230
|
-
step_time:
|
|
5231
|
-
event_type:
|
|
5232
|
-
event_path:
|
|
5233
|
-
}).from(
|
|
5228
|
+
}).from(i.from).where(g).orderBy(C`${o} ${p}`).limit(1), y = r.db.$with(m).as(r.db.select({
|
|
5229
|
+
binding_key: C`e.binding_key`.as("binding_key"),
|
|
5230
|
+
step_time: C`e.step_time`.as("step_time"),
|
|
5231
|
+
event_type: C`e.event_type`.as("event_type"),
|
|
5232
|
+
event_path: C`e.event_path`.as("event_path")
|
|
5233
|
+
}).from(C`${C.identifier(n)}`).crossJoinLateral(v.as("e")));
|
|
5234
5234
|
c.push(y);
|
|
5235
5235
|
}
|
|
5236
5236
|
return c;
|
|
5237
5237
|
}
|
|
5238
5238
|
buildDirectionalCTEsWindow(e, t, n, r) {
|
|
5239
|
-
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 ?
|
|
5239
|
+
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`;
|
|
5240
5240
|
for (let t = 1; t <= d; t++) {
|
|
5241
5241
|
let n = t === 1 ? "starting_entities" : `${e}_step_${t - 1}`, d = t === 1 ? "start_time" : "step_time", m = `${e}_step_${t}`, h = [];
|
|
5242
|
-
i.where && h.push(i.where), h.push(
|
|
5243
|
-
let g = R(h), _ = l ? u ?
|
|
5244
|
-
binding_key:
|
|
5245
|
-
step_time:
|
|
5246
|
-
event_type:
|
|
5242
|
+
i.where && h.push(i.where), h.push(C`${o} ${f} ${C.identifier(n)}.${C.identifier(d)}`);
|
|
5243
|
+
let g = R(h), _ = l ? u ? C`${s} || ${"→"} || ${C.identifier(n)}.event_path` : C`${C.identifier(n)}.event_path || ${"→"} || ${s}` : C`${s}`, v = r.db.select({
|
|
5244
|
+
binding_key: C`${a}`.as("binding_key"),
|
|
5245
|
+
step_time: C`${o}`.as("step_time"),
|
|
5246
|
+
event_type: C`${s}`.as("event_type"),
|
|
5247
5247
|
event_path: _.as("event_path"),
|
|
5248
|
-
rn:
|
|
5249
|
-
}).from(i.from).innerJoin(
|
|
5250
|
-
binding_key:
|
|
5251
|
-
step_time:
|
|
5252
|
-
event_type:
|
|
5253
|
-
event_path:
|
|
5254
|
-
}).from(v.as("ranked")).where(
|
|
5248
|
+
rn: C`ROW_NUMBER() OVER (PARTITION BY ${a} ORDER BY ${o} ${p})`.as("rn")
|
|
5249
|
+
}).from(i.from).innerJoin(C`${C.identifier(n)}`, C`${a} = ${C.identifier(n)}.binding_key`).where(g), y = r.db.select({
|
|
5250
|
+
binding_key: C`binding_key`.as("binding_key"),
|
|
5251
|
+
step_time: C`step_time`.as("step_time"),
|
|
5252
|
+
event_type: C`event_type`.as("event_type"),
|
|
5253
|
+
event_path: C`event_path`.as("event_path")
|
|
5254
|
+
}).from(v.as("ranked")).where(C`rn = 1`);
|
|
5255
5255
|
c.push(r.db.$with(m).as(y));
|
|
5256
5256
|
}
|
|
5257
5257
|
return c;
|
|
5258
5258
|
}
|
|
5259
5259
|
buildNodeArm(e, t, n, r) {
|
|
5260
|
-
let i =
|
|
5261
|
-
return r ?
|
|
5260
|
+
let i = C.raw(`'${e}_'`), a = C.raw(String(t)), o = C.identifier(n);
|
|
5261
|
+
return r ? C`
|
|
5262
5262
|
SELECT
|
|
5263
5263
|
${i} || event_path AS node_id,
|
|
5264
5264
|
event_type AS name,
|
|
@@ -5266,7 +5266,7 @@ var ar = class {
|
|
|
5266
5266
|
COUNT(*) AS value
|
|
5267
5267
|
FROM ${o}
|
|
5268
5268
|
GROUP BY event_path, event_type
|
|
5269
|
-
` :
|
|
5269
|
+
` : C`
|
|
5270
5270
|
SELECT
|
|
5271
5271
|
${i} || event_type AS node_id,
|
|
5272
5272
|
event_type AS name,
|
|
@@ -5277,8 +5277,8 @@ var ar = class {
|
|
|
5277
5277
|
`;
|
|
5278
5278
|
}
|
|
5279
5279
|
buildAdjacentLinkArm(e, t, n, r, i) {
|
|
5280
|
-
let a =
|
|
5281
|
-
return i ?
|
|
5280
|
+
let a = C.raw(`'${e}_'`), o = C.raw(`'${t}_'`), s = C.identifier(n), c = C.identifier(r);
|
|
5281
|
+
return i ? C`
|
|
5282
5282
|
SELECT
|
|
5283
5283
|
${a} || f.event_path AS source_id,
|
|
5284
5284
|
${o} || t.event_path AS target_id,
|
|
@@ -5286,7 +5286,7 @@ var ar = class {
|
|
|
5286
5286
|
FROM ${s} f
|
|
5287
5287
|
INNER JOIN ${c} t ON f.binding_key = t.binding_key
|
|
5288
5288
|
GROUP BY f.event_path, t.event_path
|
|
5289
|
-
` :
|
|
5289
|
+
` : C`
|
|
5290
5290
|
SELECT
|
|
5291
5291
|
${a} || f.event_type AS source_id,
|
|
5292
5292
|
${o} || t.event_type AS target_id,
|
|
@@ -5299,9 +5299,9 @@ var ar = class {
|
|
|
5299
5299
|
buildNodesAggregationCTE(e, t) {
|
|
5300
5300
|
let n = [], r = e.outputMode === "sunburst";
|
|
5301
5301
|
for (let t = e.stepsBefore; t >= 1; t--) n.push(this.buildNodeArm(`before_${t}`, -t, `before_step_${t}`, r));
|
|
5302
|
-
n.push(
|
|
5302
|
+
n.push(C`
|
|
5303
5303
|
SELECT
|
|
5304
|
-
${
|
|
5304
|
+
${C.raw("'start_'")} || event_type AS node_id,
|
|
5305
5305
|
event_type AS name,
|
|
5306
5306
|
0 AS layer,
|
|
5307
5307
|
COUNT(*) AS value
|
|
@@ -5309,45 +5309,45 @@ var ar = class {
|
|
|
5309
5309
|
GROUP BY event_type
|
|
5310
5310
|
`);
|
|
5311
5311
|
for (let t = 1; t <= e.stepsAfter; t++) n.push(this.buildNodeArm(`after_${t}`, t, `after_step_${t}`, r));
|
|
5312
|
-
let i =
|
|
5313
|
-
node_id:
|
|
5314
|
-
name:
|
|
5315
|
-
layer:
|
|
5316
|
-
value:
|
|
5317
|
-
}).from(
|
|
5312
|
+
let i = C.join(n, C` UNION ALL `), a = t.db.select({
|
|
5313
|
+
node_id: C`node_id`.as("node_id"),
|
|
5314
|
+
name: C`name`.as("name"),
|
|
5315
|
+
layer: C`layer`.as("layer"),
|
|
5316
|
+
value: C`value`.as("value")
|
|
5317
|
+
}).from(C`(${i}) AS nodes_union`);
|
|
5318
5318
|
return t.db.$with("nodes_agg").as(a);
|
|
5319
5319
|
}
|
|
5320
5320
|
buildLinksAggregationCTE(e, t) {
|
|
5321
5321
|
let n = [], r = e.outputMode === "sunburst";
|
|
5322
5322
|
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));
|
|
5323
|
-
e.stepsBefore >= 1 && (r ? n.push(
|
|
5323
|
+
e.stepsBefore >= 1 && (r ? n.push(C`
|
|
5324
5324
|
SELECT
|
|
5325
|
-
${
|
|
5326
|
-
${
|
|
5325
|
+
${C.raw("'before_1_'")} || b.event_path AS source_id,
|
|
5326
|
+
${C.raw("'start_'")} || s.event_type AS target_id,
|
|
5327
5327
|
COUNT(*) AS value
|
|
5328
5328
|
FROM before_step_1 b
|
|
5329
5329
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5330
5330
|
GROUP BY b.event_path, s.event_type
|
|
5331
|
-
`) : n.push(
|
|
5331
|
+
`) : n.push(C`
|
|
5332
5332
|
SELECT
|
|
5333
|
-
${
|
|
5334
|
-
${
|
|
5333
|
+
${C.raw("'before_1_'")} || b.event_type AS source_id,
|
|
5334
|
+
${C.raw("'start_'")} || s.event_type AS target_id,
|
|
5335
5335
|
COUNT(*) AS value
|
|
5336
5336
|
FROM before_step_1 b
|
|
5337
5337
|
INNER JOIN starting_entities s ON b.binding_key = s.binding_key
|
|
5338
5338
|
GROUP BY b.event_type, s.event_type
|
|
5339
|
-
`)), e.stepsAfter >= 1 && (r ? n.push(
|
|
5339
|
+
`)), e.stepsAfter >= 1 && (r ? n.push(C`
|
|
5340
5340
|
SELECT
|
|
5341
|
-
${
|
|
5342
|
-
${
|
|
5341
|
+
${C.raw("'start_'")} || s.event_type AS source_id,
|
|
5342
|
+
${C.raw("'after_1_'")} || a.event_path AS target_id,
|
|
5343
5343
|
COUNT(*) AS value
|
|
5344
5344
|
FROM starting_entities s
|
|
5345
5345
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
5346
5346
|
GROUP BY s.event_type, a.event_path
|
|
5347
|
-
`) : n.push(
|
|
5347
|
+
`) : n.push(C`
|
|
5348
5348
|
SELECT
|
|
5349
|
-
${
|
|
5350
|
-
${
|
|
5349
|
+
${C.raw("'start_'")} || s.event_type AS source_id,
|
|
5350
|
+
${C.raw("'after_1_'")} || a.event_type AS target_id,
|
|
5351
5351
|
COUNT(*) AS value
|
|
5352
5352
|
FROM starting_entities s
|
|
5353
5353
|
INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
|
|
@@ -5356,21 +5356,21 @@ var ar = class {
|
|
|
5356
5356
|
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));
|
|
5357
5357
|
if (n.length === 0) {
|
|
5358
5358
|
let e = t.db.select({
|
|
5359
|
-
source_id:
|
|
5360
|
-
target_id:
|
|
5361
|
-
value:
|
|
5362
|
-
}).from(
|
|
5359
|
+
source_id: C`NULL`.as("source_id"),
|
|
5360
|
+
target_id: C`NULL`.as("target_id"),
|
|
5361
|
+
value: C`0`.as("value")
|
|
5362
|
+
}).from(C`(SELECT 1) AS empty`).where(C`1 = 0`);
|
|
5363
5363
|
return t.db.$with("links_agg").as(e);
|
|
5364
5364
|
}
|
|
5365
|
-
let i =
|
|
5366
|
-
source_id:
|
|
5367
|
-
target_id:
|
|
5368
|
-
value:
|
|
5369
|
-
}).from(
|
|
5365
|
+
let i = C.join(n, C` UNION ALL `), a = t.db.select({
|
|
5366
|
+
source_id: C`source_id`.as("source_id"),
|
|
5367
|
+
target_id: C`target_id`.as("target_id"),
|
|
5368
|
+
value: C`value`.as("value")
|
|
5369
|
+
}).from(C`(${i}) AS links_union`);
|
|
5370
5370
|
return t.db.$with("links_agg").as(a);
|
|
5371
5371
|
}
|
|
5372
5372
|
buildFinalResultCTE(e) {
|
|
5373
|
-
let t =
|
|
5373
|
+
let t = C`
|
|
5374
5374
|
SELECT
|
|
5375
5375
|
'node' AS record_type,
|
|
5376
5376
|
node_id AS id,
|
|
@@ -5392,51 +5392,51 @@ var ar = class {
|
|
|
5392
5392
|
FROM links_agg
|
|
5393
5393
|
WHERE source_id IS NOT NULL
|
|
5394
5394
|
`, n = e.db.select({
|
|
5395
|
-
record_type:
|
|
5396
|
-
id:
|
|
5397
|
-
name:
|
|
5398
|
-
layer:
|
|
5399
|
-
value:
|
|
5400
|
-
source_id:
|
|
5401
|
-
target_id:
|
|
5402
|
-
}).from(
|
|
5395
|
+
record_type: C`record_type`.as("record_type"),
|
|
5396
|
+
id: C`id`.as("id"),
|
|
5397
|
+
name: C`name`.as("name"),
|
|
5398
|
+
layer: C`layer`.as("layer"),
|
|
5399
|
+
value: C`value`.as("value"),
|
|
5400
|
+
source_id: C`source_id`.as("source_id"),
|
|
5401
|
+
target_id: C`target_id`.as("target_id")
|
|
5402
|
+
}).from(C`(${t}) AS final_union`);
|
|
5403
5403
|
return e.db.$with("final_result").as(n);
|
|
5404
5404
|
}
|
|
5405
5405
|
};
|
|
5406
5406
|
//#endregion
|
|
5407
5407
|
//#region src/server/types/retention.ts
|
|
5408
|
-
function
|
|
5408
|
+
function ur(e) {
|
|
5409
5409
|
return Array.isArray(e);
|
|
5410
5410
|
}
|
|
5411
|
-
function
|
|
5411
|
+
function dr(e) {
|
|
5412
5412
|
return typeof e == "object" && !!e && "cube" in e;
|
|
5413
5413
|
}
|
|
5414
|
-
function
|
|
5415
|
-
if (
|
|
5414
|
+
function fr(e) {
|
|
5415
|
+
if (dr(e)) return e.cube;
|
|
5416
5416
|
let t = e.indexOf(".");
|
|
5417
5417
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5418
5418
|
return e.substring(0, t);
|
|
5419
5419
|
}
|
|
5420
|
-
function
|
|
5421
|
-
if (
|
|
5420
|
+
function pr(e) {
|
|
5421
|
+
if (dr(e)) return e.dimension;
|
|
5422
5422
|
let t = e.indexOf(".");
|
|
5423
5423
|
if (t === -1) throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);
|
|
5424
5424
|
return e.substring(t + 1);
|
|
5425
5425
|
}
|
|
5426
5426
|
//#endregion
|
|
5427
5427
|
//#region src/server/builders/retention-query-builder.ts
|
|
5428
|
-
var
|
|
5429
|
-
noMapping: ({ cubeName: e }) =>
|
|
5430
|
-
cubeNotFound: ({ cubeName: e }) =>
|
|
5431
|
-
keyDimNotFound: ({ bindingKey: e, cubeName:
|
|
5428
|
+
var mr = {
|
|
5429
|
+
noMapping: ({ cubeName: e }) => S("server.validation.retention.noBindingKeyMapping", { cubeName: e }),
|
|
5430
|
+
cubeNotFound: ({ cubeName: e }) => S("server.validation.retention.bindingKeyCubeNotFound", { cubeName: e }),
|
|
5431
|
+
keyDimNotFound: ({ bindingKey: e, cubeName: t }) => S("server.validation.retention.bindingKeyDimNotFound", {
|
|
5432
5432
|
dimName: e,
|
|
5433
|
-
cubeName:
|
|
5433
|
+
cubeName: t
|
|
5434
5434
|
}),
|
|
5435
|
-
mappingDimNotFound: ({ dimension: e, cubeName:
|
|
5435
|
+
mappingDimNotFound: ({ dimension: e, cubeName: t }) => S("server.validation.retention.bindingKeyDimNotFound", {
|
|
5436
5436
|
dimName: e,
|
|
5437
|
-
cubeName:
|
|
5437
|
+
cubeName: t
|
|
5438
5438
|
})
|
|
5439
|
-
},
|
|
5439
|
+
}, hr = class {
|
|
5440
5440
|
databaseAdapter;
|
|
5441
5441
|
filterBuilder;
|
|
5442
5442
|
dateTimeBuilder;
|
|
@@ -5444,97 +5444,97 @@ var pr = {
|
|
|
5444
5444
|
this.databaseAdapter = e, this.dateTimeBuilder = new I(e), this.filterBuilder = new B(e, this.dateTimeBuilder);
|
|
5445
5445
|
}
|
|
5446
5446
|
hasRetention(e) {
|
|
5447
|
-
return
|
|
5447
|
+
return i(e);
|
|
5448
5448
|
}
|
|
5449
|
-
validateConfig(e,
|
|
5450
|
-
let
|
|
5451
|
-
return (
|
|
5452
|
-
isValid:
|
|
5453
|
-
errors:
|
|
5449
|
+
validateConfig(e, t) {
|
|
5450
|
+
let n = [], r = this.databaseAdapter.getEngineType();
|
|
5451
|
+
return (r === "sqlite" || r === "mysql" || r === "singlestore") && n.push(S("server.validation.retention.engineNotSupported", { engine: r })), this.validateTimeDimension(e, t, n), this.validateBindingKey(e, t, n), this.validateBreakdownDimensions(e, t, n), this.validatePeriodsAndEnums(e, n), this.validateDateRange(e, n), {
|
|
5452
|
+
isValid: n.length === 0,
|
|
5453
|
+
errors: n
|
|
5454
5454
|
};
|
|
5455
5455
|
}
|
|
5456
|
-
validateTimeDimension(e,
|
|
5456
|
+
validateTimeDimension(e, t, n) {
|
|
5457
5457
|
try {
|
|
5458
|
-
let
|
|
5459
|
-
|
|
5458
|
+
let r = fr(e.timeDimension), i = pr(e.timeDimension), a = t.get(r);
|
|
5459
|
+
a ? a.dimensions?.[i] || n.push(S("server.validation.retention.timeDimNotFound", { dimName: i })) : n.push(S("server.validation.retention.cubeNotFound", { cubeName: r }));
|
|
5460
5460
|
} catch {
|
|
5461
|
-
|
|
5461
|
+
n.push(S("server.validation.retention.invalidTimeDimFormat", { timeDimension: e.timeDimension }));
|
|
5462
5462
|
}
|
|
5463
5463
|
}
|
|
5464
|
-
validateBindingKey(e,
|
|
5465
|
-
if (
|
|
5466
|
-
for (let
|
|
5467
|
-
let e =
|
|
5464
|
+
validateBindingKey(e, t, n) {
|
|
5465
|
+
if (ur(e.bindingKey)) {
|
|
5466
|
+
for (let r of e.bindingKey) {
|
|
5467
|
+
let e = t.get(r.cube);
|
|
5468
5468
|
if (!e) {
|
|
5469
|
-
|
|
5469
|
+
n.push(S("server.validation.retention.bindingKeyMappingCubeNotFound", { cubeName: r.cube }));
|
|
5470
5470
|
continue;
|
|
5471
5471
|
}
|
|
5472
|
-
let
|
|
5473
|
-
e.dimensions?.[
|
|
5474
|
-
dimName:
|
|
5475
|
-
cubeName:
|
|
5472
|
+
let i = Qt(r.dimension);
|
|
5473
|
+
e.dimensions?.[i] || n.push(S("server.validation.retention.bindingKeyDimNotFound", {
|
|
5474
|
+
dimName: i,
|
|
5475
|
+
cubeName: r.cube
|
|
5476
5476
|
}));
|
|
5477
5477
|
}
|
|
5478
5478
|
return;
|
|
5479
5479
|
}
|
|
5480
|
-
let [
|
|
5481
|
-
if (!
|
|
5482
|
-
|
|
5480
|
+
let [r, i] = e.bindingKey.split(".");
|
|
5481
|
+
if (!r || !i) {
|
|
5482
|
+
n.push(S("server.validation.retention.invalidBindingKeyFormat", { bindingKey: e.bindingKey }));
|
|
5483
5483
|
return;
|
|
5484
5484
|
}
|
|
5485
|
-
let
|
|
5486
|
-
|
|
5487
|
-
dimName:
|
|
5488
|
-
cubeName:
|
|
5489
|
-
})) :
|
|
5490
|
-
}
|
|
5491
|
-
validateBreakdownDimensions(e,
|
|
5492
|
-
if (!(!e.breakdownDimensions || e.breakdownDimensions.length === 0)) for (let
|
|
5493
|
-
let [e,
|
|
5494
|
-
if (!e || !
|
|
5495
|
-
|
|
5485
|
+
let a = t.get(r);
|
|
5486
|
+
a ? a.dimensions?.[i] || n.push(S("server.validation.retention.bindingKeyDimNotFound", {
|
|
5487
|
+
dimName: i,
|
|
5488
|
+
cubeName: r
|
|
5489
|
+
})) : n.push(S("server.validation.retention.bindingKeyCubeNotFound", { cubeName: r }));
|
|
5490
|
+
}
|
|
5491
|
+
validateBreakdownDimensions(e, t, n) {
|
|
5492
|
+
if (!(!e.breakdownDimensions || e.breakdownDimensions.length === 0)) for (let r of e.breakdownDimensions) {
|
|
5493
|
+
let [e, i] = r.split(".");
|
|
5494
|
+
if (!e || !i) {
|
|
5495
|
+
n.push(S("server.validation.retention.invalidBreakdownDimFormat", { dimension: r }));
|
|
5496
5496
|
continue;
|
|
5497
5497
|
}
|
|
5498
|
-
let
|
|
5499
|
-
|
|
5500
|
-
dimName:
|
|
5498
|
+
let a = t.get(e);
|
|
5499
|
+
a ? a.dimensions?.[i] || n.push(S("server.validation.retention.breakdownDimNotFound", {
|
|
5500
|
+
dimName: i,
|
|
5501
5501
|
cubeName: e
|
|
5502
|
-
})) :
|
|
5502
|
+
})) : n.push(S("server.validation.retention.breakdownDimCubeNotFound", { cubeName: e }));
|
|
5503
5503
|
}
|
|
5504
5504
|
}
|
|
5505
|
-
validatePeriodsAndEnums(e,
|
|
5506
|
-
e.periods < 1 &&
|
|
5505
|
+
validatePeriodsAndEnums(e, t) {
|
|
5506
|
+
e.periods < 1 && t.push(S("server.validation.retention.periodsMin")), e.periods > 52 && t.push(S("server.validation.retention.periodsMax")), [
|
|
5507
5507
|
"day",
|
|
5508
5508
|
"week",
|
|
5509
5509
|
"month"
|
|
5510
|
-
].includes(e.granularity) ||
|
|
5510
|
+
].includes(e.granularity) || t.push(S("server.validation.retention.invalidGranularity", { granularity: e.granularity })), ["classic", "rolling"].includes(e.retentionType) || t.push(S("server.validation.retention.invalidRetentionType", { retentionType: e.retentionType }));
|
|
5511
5511
|
}
|
|
5512
|
-
validateDateRange(e,
|
|
5512
|
+
validateDateRange(e, t) {
|
|
5513
5513
|
if (!e.dateRange) {
|
|
5514
|
-
|
|
5514
|
+
t.push(S("server.validation.retention.dateRangeRequired"));
|
|
5515
5515
|
return;
|
|
5516
5516
|
}
|
|
5517
|
-
if (e.dateRange.start ? isNaN(new Date(e.dateRange.start).getTime()) &&
|
|
5518
|
-
let
|
|
5519
|
-
!isNaN(
|
|
5517
|
+
if (e.dateRange.start ? isNaN(new Date(e.dateRange.start).getTime()) && t.push(S("server.validation.retention.dateRangeInvalidStart")) : t.push(S("server.validation.retention.dateRangeStartRequired")), e.dateRange.end ? isNaN(new Date(e.dateRange.end).getTime()) && t.push(S("server.validation.retention.dateRangeInvalidEnd")) : t.push(S("server.validation.retention.dateRangeEndRequired")), e.dateRange.start && e.dateRange.end) {
|
|
5518
|
+
let n = new Date(e.dateRange.start), r = new Date(e.dateRange.end);
|
|
5519
|
+
!isNaN(n.getTime()) && !isNaN(r.getTime()) && n > r && t.push(S("server.validation.retention.dateRangeStartBeforeEnd"));
|
|
5520
5520
|
}
|
|
5521
5521
|
}
|
|
5522
5522
|
buildRetentionQuery(e, t, n) {
|
|
5523
5523
|
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 = {
|
|
5524
|
-
period:
|
|
5525
|
-
cohort_size:
|
|
5526
|
-
retained_users:
|
|
5527
|
-
retention_rate:
|
|
5524
|
+
period: C`rc.period_number`.as("period"),
|
|
5525
|
+
cohort_size: C`cs.cohort_size`.as("cohort_size"),
|
|
5526
|
+
retained_users: C`rc.retained_users`.as("retained_users"),
|
|
5527
|
+
retention_rate: C`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as("retention_rate")
|
|
5528
5528
|
};
|
|
5529
|
-
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] =
|
|
5530
|
-
let d = n.db.with(a, o, s, c).select(u).from(
|
|
5529
|
+
for (let e = 0; e < r.breakdowns.length; e++) u[`breakdown_${e}`] = C.raw(`rc.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5530
|
+
let d = n.db.with(a, o, s, c).select(u).from(C`retention_counts rc`);
|
|
5531
5531
|
if (l) {
|
|
5532
|
-
let e = r.breakdowns.map((e, t) =>
|
|
5533
|
-
d = d.innerJoin(
|
|
5534
|
-
} else d = d.innerJoin(
|
|
5532
|
+
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 `);
|
|
5533
|
+
d = d.innerJoin(C`cohort_sizes cs`, t);
|
|
5534
|
+
} else d = d.innerJoin(C`cohort_sizes cs`, C`1 = 1`);
|
|
5535
5535
|
let f = [];
|
|
5536
|
-
for (let e = 0; e < r.breakdowns.length; e++) f.push(
|
|
5537
|
-
return f.push(
|
|
5536
|
+
for (let e = 0; e < r.breakdowns.length; e++) f.push(C.raw(`rc.breakdown_${e}`));
|
|
5537
|
+
return f.push(C`rc.period_number`), d = d.orderBy(...f), d;
|
|
5538
5538
|
}
|
|
5539
5539
|
transformResult(e, t) {
|
|
5540
5540
|
let n = t.breakdownDimensions || [], r = Math.min(n.length, 100), i = r > 0;
|
|
@@ -5556,29 +5556,29 @@ var pr = {
|
|
|
5556
5556
|
return t;
|
|
5557
5557
|
});
|
|
5558
5558
|
}
|
|
5559
|
-
resolveConfig(e,
|
|
5560
|
-
let
|
|
5561
|
-
if (!
|
|
5562
|
-
let
|
|
5563
|
-
if (!
|
|
5564
|
-
let
|
|
5565
|
-
if (e.breakdownDimensions && e.breakdownDimensions.length > 0) for (let
|
|
5566
|
-
let [e, i] =
|
|
5559
|
+
resolveConfig(e, t, n) {
|
|
5560
|
+
let r = fr(e.timeDimension), i = pr(e.timeDimension), a = t.get(r);
|
|
5561
|
+
if (!a) throw Error(S("server.validation.retention.cubeNotFound", { cubeName: r }));
|
|
5562
|
+
let o = a.dimensions?.[i];
|
|
5563
|
+
if (!o) throw Error(S("server.validation.retention.timeDimNotFound", { dimName: i }));
|
|
5564
|
+
let s = l(o.sql, n), c = tn(e.bindingKey, a, n, mr, t), u = this.buildFilterConditions(e.cohortFilters, a, t, n), d = this.buildFilterConditions(e.activityFilters, a, t, n), f = [];
|
|
5565
|
+
if (e.breakdownDimensions && e.breakdownDimensions.length > 0) for (let r of e.breakdownDimensions) {
|
|
5566
|
+
let [e, i] = r.split("."), a = t.get(e);
|
|
5567
5567
|
if (a && a.dimensions?.[i]) {
|
|
5568
|
-
let e =
|
|
5569
|
-
|
|
5570
|
-
dimension:
|
|
5568
|
+
let e = l(a.dimensions[i].sql, n);
|
|
5569
|
+
f.push({
|
|
5570
|
+
dimension: r,
|
|
5571
5571
|
expr: e
|
|
5572
5572
|
});
|
|
5573
5573
|
}
|
|
5574
5574
|
}
|
|
5575
5575
|
return {
|
|
5576
|
-
cube:
|
|
5577
|
-
bindingKeyExpr:
|
|
5578
|
-
timeExpr:
|
|
5576
|
+
cube: a,
|
|
5577
|
+
bindingKeyExpr: c,
|
|
5578
|
+
timeExpr: s,
|
|
5579
5579
|
cohortFilterConditions: u,
|
|
5580
5580
|
activityFilterConditions: d,
|
|
5581
|
-
breakdowns:
|
|
5581
|
+
breakdowns: f
|
|
5582
5582
|
};
|
|
5583
5583
|
}
|
|
5584
5584
|
buildFilterConditions(e, t, n, r) {
|
|
@@ -5590,21 +5590,21 @@ var pr = {
|
|
|
5590
5590
|
}
|
|
5591
5591
|
return a;
|
|
5592
5592
|
}
|
|
5593
|
-
buildSingleFilterCondition(e, t,
|
|
5593
|
+
buildSingleFilterCondition(e, t, n, r) {
|
|
5594
5594
|
if ("and" in e || "or" in e) {
|
|
5595
|
-
let
|
|
5596
|
-
for (let e of
|
|
5597
|
-
let
|
|
5598
|
-
|
|
5595
|
+
let i = e, a = [], o = "and" in i && !!i.and, s = i.and || i.or || [];
|
|
5596
|
+
for (let e of s) {
|
|
5597
|
+
let i = this.buildSingleFilterCondition(e, t, n, r);
|
|
5598
|
+
i && a.push(i);
|
|
5599
5599
|
}
|
|
5600
|
-
return
|
|
5600
|
+
return a.length === 0 ? null : a.length === 1 ? a[0] : o ? w(...a) : C`(${C.join(a, C` OR `)})`;
|
|
5601
5601
|
}
|
|
5602
|
-
let
|
|
5602
|
+
let i = e, [a, s] = i.member.split("."), c = n.get(a);
|
|
5603
5603
|
if (!c) return null;
|
|
5604
|
-
let
|
|
5605
|
-
if (!
|
|
5606
|
-
let
|
|
5607
|
-
return this.filterBuilder.buildFilterCondition(
|
|
5604
|
+
let l = c.dimensions?.[s];
|
|
5605
|
+
if (!l) return null;
|
|
5606
|
+
let u = o(l, r);
|
|
5607
|
+
return this.filterBuilder.buildFilterCondition(u, i.operator, i.values || [], l, i.dateRange);
|
|
5608
5608
|
}
|
|
5609
5609
|
buildCohortBaseCTE(e, t, n) {
|
|
5610
5610
|
let r = t.cube.sql(n), i = [];
|
|
@@ -5613,12 +5613,12 @@ var pr = {
|
|
|
5613
5613
|
i.push(n);
|
|
5614
5614
|
}
|
|
5615
5615
|
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = {
|
|
5616
|
-
binding_key:
|
|
5617
|
-
cohort_entry:
|
|
5616
|
+
binding_key: C`${t.bindingKeyExpr}`.as("binding_key"),
|
|
5617
|
+
cohort_entry: C`MIN(${a})`.as("cohort_entry")
|
|
5618
5618
|
};
|
|
5619
5619
|
for (let e = 0; e < t.breakdowns.length; e++) {
|
|
5620
5620
|
let { expr: n } = t.breakdowns[e];
|
|
5621
|
-
o[`breakdown_${e}`] =
|
|
5621
|
+
o[`breakdown_${e}`] = C`MIN(${n})`.as(`breakdown_${e}`);
|
|
5622
5622
|
}
|
|
5623
5623
|
let s = n.db.select(o).from(r.from);
|
|
5624
5624
|
i.length > 0 && (s = s.where(R(i)));
|
|
@@ -5631,35 +5631,35 @@ var pr = {
|
|
|
5631
5631
|
return n.db.$with("cohort_base").as(s);
|
|
5632
5632
|
}
|
|
5633
5633
|
buildDateRangeCondition(e, t) {
|
|
5634
|
-
let n = this.databaseAdapter.castToType(
|
|
5635
|
-
return
|
|
5634
|
+
let n = this.databaseAdapter.castToType(C`${t.start}`, "timestamp"), r = this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`, "timestamp"), "P1D");
|
|
5635
|
+
return C`${e} >= ${n} AND ${e} < ${r}`;
|
|
5636
5636
|
}
|
|
5637
5637
|
buildDateRangeHavingCondition(e, t) {
|
|
5638
|
-
let n = this.databaseAdapter.castToType(
|
|
5639
|
-
return
|
|
5638
|
+
let n = this.databaseAdapter.castToType(C`${t.start}`, "timestamp"), r = this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(C`${t.end}`, "timestamp"), "P1D");
|
|
5639
|
+
return C`MIN(${e}) >= ${n} AND MIN(${e}) < ${r}`;
|
|
5640
5640
|
}
|
|
5641
5641
|
buildActivityPeriodsCTE(e, t, n) {
|
|
5642
5642
|
let r = t.cube.sql(n), i = [];
|
|
5643
|
-
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(
|
|
5644
|
-
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(
|
|
5645
|
-
binding_key:
|
|
5643
|
+
r.where && i.push(r.where), i.push(...t.activityFilterConditions), i.push(C`${t.timeExpr} >= cohort_base.cohort_entry`);
|
|
5644
|
+
let a = this.databaseAdapter.buildTimeDimension(e.granularity, t.timeExpr), o = this.buildPeriodNumberExpression(C`cohort_base.cohort_entry`, a, e.granularity), s = {
|
|
5645
|
+
binding_key: C`cohort_base.binding_key`.as("binding_key"),
|
|
5646
5646
|
period_number: o.as("period_number")
|
|
5647
5647
|
};
|
|
5648
|
-
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] =
|
|
5649
|
-
let c = n.db.select(s).from(r.from).innerJoin(
|
|
5648
|
+
for (let e = 0; e < t.breakdowns.length; e++) s[`breakdown_${e}`] = C.raw(`cohort_base.breakdown_${e}`).as(`breakdown_${e}`);
|
|
5649
|
+
let c = n.db.select(s).from(r.from).innerJoin(C`cohort_base`, C`${t.bindingKeyExpr} = cohort_base.binding_key`);
|
|
5650
5650
|
i.length > 0 && (c = c.where(R(i)));
|
|
5651
|
-
let l = [
|
|
5652
|
-
for (let e = 0; e < t.breakdowns.length; e++) l.push(
|
|
5651
|
+
let l = [C`cohort_base.binding_key`, o];
|
|
5652
|
+
for (let e = 0; e < t.breakdowns.length; e++) l.push(C.raw(`cohort_base.breakdown_${e}`));
|
|
5653
5653
|
return c = c.groupBy(...l), n.db.$with("activity_periods").as(c);
|
|
5654
5654
|
}
|
|
5655
5655
|
buildCohortSizesCTE(e, t, n) {
|
|
5656
5656
|
if (n > 0) {
|
|
5657
|
-
let e = { cohort_size:
|
|
5658
|
-
for (let t = 0; t < n; t++) e[`breakdown_${t}`] =
|
|
5659
|
-
let i = t.db.select(e).from(
|
|
5657
|
+
let e = { cohort_size: C`COUNT(*)`.as("cohort_size") }, r = [];
|
|
5658
|
+
for (let t = 0; t < n; t++) e[`breakdown_${t}`] = C.raw(`breakdown_${t}`).as(`breakdown_${t}`), r.push(C.raw(`breakdown_${t}`));
|
|
5659
|
+
let i = t.db.select(e).from(C`cohort_base`).groupBy(...r);
|
|
5660
5660
|
return t.db.$with("cohort_sizes").as(i);
|
|
5661
5661
|
}
|
|
5662
|
-
let r = t.db.select({ cohort_size:
|
|
5662
|
+
let r = t.db.select({ cohort_size: C`COUNT(*)`.as("cohort_size") }).from(C`cohort_base`);
|
|
5663
5663
|
return t.db.$with("cohort_sizes").as(r);
|
|
5664
5664
|
}
|
|
5665
5665
|
buildRetentionCountsCTE(e, t, n) {
|
|
@@ -5667,32 +5667,32 @@ var pr = {
|
|
|
5667
5667
|
if (e.retentionType === "rolling") r = this.buildRollingRetentionCountsQuery(e, t, n);
|
|
5668
5668
|
else {
|
|
5669
5669
|
let i = {
|
|
5670
|
-
period_number:
|
|
5671
|
-
retained_users:
|
|
5672
|
-
}, a = [
|
|
5673
|
-
for (let e = 0; e < n; e++) i[`breakdown_${e}`] =
|
|
5670
|
+
period_number: C`period_number`.as("period_number"),
|
|
5671
|
+
retained_users: C`COUNT(DISTINCT binding_key)`.as("retained_users")
|
|
5672
|
+
}, a = [C`period_number`];
|
|
5673
|
+
for (let e = 0; e < n; e++) i[`breakdown_${e}`] = C.raw(`breakdown_${e}`).as(`breakdown_${e}`), a.push(C.raw(`breakdown_${e}`));
|
|
5674
5674
|
let o = Math.min(e.periods, 52);
|
|
5675
|
-
r = t.db.select(i).from(
|
|
5675
|
+
r = t.db.select(i).from(C`activity_periods`).where(C`period_number >= 0 AND period_number <= ${o}`).groupBy(...a);
|
|
5676
5676
|
}
|
|
5677
5677
|
return t.db.$with("retention_counts").as(r);
|
|
5678
5678
|
}
|
|
5679
5679
|
buildRollingRetentionCountsQuery(e, t, n) {
|
|
5680
5680
|
let r = [];
|
|
5681
5681
|
for (let e = 0; e < n; e++) r.push(`breakdown_${e}`);
|
|
5682
|
-
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = Math.min(e.periods, 52), o =
|
|
5682
|
+
let i = r.length > 0 ? `, ${r.join(", ")}` : "", a = Math.min(e.periods, 52), o = C`(
|
|
5683
5683
|
SELECT
|
|
5684
5684
|
binding_key,
|
|
5685
|
-
${
|
|
5685
|
+
${C.raw(r.map((e) => `${e}`).join(", ") + (r.length > 0 ? "," : ""))}
|
|
5686
5686
|
MAX(period_number) as max_period
|
|
5687
5687
|
FROM activity_periods
|
|
5688
5688
|
WHERE period_number >= 0 AND period_number <= ${a}
|
|
5689
|
-
GROUP BY binding_key${
|
|
5689
|
+
GROUP BY binding_key${C.raw(i)}
|
|
5690
5690
|
)`, s = this.databaseAdapter.buildPeriodSeriesSubquery(a), c = {
|
|
5691
|
-
period_number:
|
|
5692
|
-
retained_users:
|
|
5693
|
-
}, l = [
|
|
5694
|
-
for (let e = 0; e < n; e++) c[`breakdown_${e}`] =
|
|
5695
|
-
return t.db.select(c).from(
|
|
5691
|
+
period_number: C`p.period_number`.as("period_number"),
|
|
5692
|
+
retained_users: C`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as("retained_users")
|
|
5693
|
+
}, l = [C`p.period_number`];
|
|
5694
|
+
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}`));
|
|
5695
|
+
return t.db.select(c).from(C`${o} ump`).innerJoin(s, C`TRUE`).groupBy(...l);
|
|
5696
5696
|
}
|
|
5697
5697
|
buildPeriodNumberExpression(e, t, n) {
|
|
5698
5698
|
return this.databaseAdapter.buildDateDiffPeriods(e, t, n);
|
|
@@ -5700,51 +5700,51 @@ var pr = {
|
|
|
5700
5700
|
};
|
|
5701
5701
|
//#endregion
|
|
5702
5702
|
//#region src/server/logical-plan/schema-builder.ts
|
|
5703
|
-
function
|
|
5703
|
+
function X(e) {
|
|
5704
5704
|
return {
|
|
5705
5705
|
name: e.name,
|
|
5706
5706
|
cube: e
|
|
5707
5707
|
};
|
|
5708
5708
|
}
|
|
5709
|
-
function
|
|
5709
|
+
function Z(e, t) {
|
|
5710
5710
|
return e.measures ? e.measures.map((e) => {
|
|
5711
|
-
let [
|
|
5712
|
-
if (!
|
|
5713
|
-
cubeName:
|
|
5711
|
+
let [n, r] = e.split("."), i = t.get(n);
|
|
5712
|
+
if (!i) throw Error(S("server.errors.cubeNotFoundForMeasure", {
|
|
5713
|
+
cubeName: n,
|
|
5714
5714
|
measure: e
|
|
5715
5715
|
}));
|
|
5716
5716
|
return {
|
|
5717
5717
|
name: e,
|
|
5718
|
-
cube:
|
|
5719
|
-
localName:
|
|
5718
|
+
cube: X(i),
|
|
5719
|
+
localName: r
|
|
5720
5720
|
};
|
|
5721
5721
|
}) : [];
|
|
5722
5722
|
}
|
|
5723
|
-
function gr(e,
|
|
5723
|
+
function gr(e, t) {
|
|
5724
5724
|
return e.dimensions ? e.dimensions.map((e) => {
|
|
5725
|
-
let [
|
|
5726
|
-
if (!
|
|
5727
|
-
cubeName:
|
|
5725
|
+
let [n, r] = e.split("."), i = t.get(n);
|
|
5726
|
+
if (!i) throw Error(S("server.errors.cubeNotFoundForDimension", {
|
|
5727
|
+
cubeName: n,
|
|
5728
5728
|
dimension: e
|
|
5729
5729
|
}));
|
|
5730
5730
|
return {
|
|
5731
5731
|
name: e,
|
|
5732
|
-
cube:
|
|
5733
|
-
localName:
|
|
5732
|
+
cube: X(i),
|
|
5733
|
+
localName: r
|
|
5734
5734
|
};
|
|
5735
5735
|
}) : [];
|
|
5736
5736
|
}
|
|
5737
|
-
function _r(e,
|
|
5737
|
+
function _r(e, t) {
|
|
5738
5738
|
return e.timeDimensions ? e.timeDimensions.map((e) => {
|
|
5739
|
-
let [
|
|
5740
|
-
if (!
|
|
5741
|
-
cubeName:
|
|
5739
|
+
let [n, r] = e.dimension.split("."), i = t.get(n);
|
|
5740
|
+
if (!i) throw Error(S("server.errors.cubeNotFoundForTimeDimension", {
|
|
5741
|
+
cubeName: n,
|
|
5742
5742
|
timeDimension: e.dimension
|
|
5743
5743
|
}));
|
|
5744
5744
|
return {
|
|
5745
5745
|
name: e.dimension,
|
|
5746
|
-
cube:
|
|
5747
|
-
localName:
|
|
5746
|
+
cube: X(i),
|
|
5747
|
+
localName: r,
|
|
5748
5748
|
granularity: e.granularity,
|
|
5749
5749
|
dateRange: e.dateRange,
|
|
5750
5750
|
fillMissingDates: e.fillMissingDates,
|
|
@@ -5754,7 +5754,7 @@ function _r(e, n) {
|
|
|
5754
5754
|
}
|
|
5755
5755
|
function vr(e, t) {
|
|
5756
5756
|
return {
|
|
5757
|
-
measures:
|
|
5757
|
+
measures: Z(e, t),
|
|
5758
5758
|
dimensions: gr(e, t),
|
|
5759
5759
|
timeDimensions: _r(e, t)
|
|
5760
5760
|
};
|
|
@@ -5786,57 +5786,57 @@ var br = class {
|
|
|
5786
5786
|
plan(e, t, n) {
|
|
5787
5787
|
return this.planWithAnalysis(e, t, n).plan;
|
|
5788
5788
|
}
|
|
5789
|
-
planWithAnalysis(e,
|
|
5790
|
-
let
|
|
5791
|
-
if (
|
|
5792
|
-
let
|
|
5793
|
-
if (!
|
|
5794
|
-
let
|
|
5795
|
-
for (let t of
|
|
5789
|
+
planWithAnalysis(e, t, n) {
|
|
5790
|
+
let r = Array.from(this.queryPlanner.analyzeCubeUsage(t));
|
|
5791
|
+
if (r.length === 0) throw Error(S("server.errors.noCubesInQuery"));
|
|
5792
|
+
let i = this.queryPlanner.analyzePrimaryCube(r, t, e), a = i.selectedCube, o = e.get(a);
|
|
5793
|
+
if (!o) throw Error(S("server.errors.primaryCubeNotFound", { cubeName: a }));
|
|
5794
|
+
let s = r.filter((e) => e !== a).map((n) => this.queryPlanner.analyzeJoinPathForTarget(e, a, n, t)), c = r.length > 1 ? this.queryPlanner.buildJoinPlanForPrimary(e, o, r, n, t) : [], l = r.length > 1 ? this.queryPlanner.buildPreAggregationCTEs(e, o, c, t, n) ?? [] : [], u = this.queryPlanner.buildWarnings(t, l), d = this.buildSourceFromPhases(o, c, l, e, t, n), f = d.source, p = this.buildQueryNode(f, t, e, u), m = this.buildPreAggregationAnalysis(l), h = /* @__PURE__ */ new Map();
|
|
5795
|
+
for (let t of r) {
|
|
5796
5796
|
let n = e.get(t);
|
|
5797
|
-
n &&
|
|
5797
|
+
n && h.set(t, n);
|
|
5798
5798
|
}
|
|
5799
|
-
let
|
|
5799
|
+
let g = ln(t.measures ?? [], h), _ = [...s.filter((e) => !e.pathFound && e.error).map((e) => e.error), ...u.map((e) => e.message)];
|
|
5800
5800
|
return {
|
|
5801
|
-
plan:
|
|
5801
|
+
plan: p,
|
|
5802
5802
|
analysis: {
|
|
5803
5803
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
5804
|
-
cubeCount:
|
|
5805
|
-
cubesInvolved: [...
|
|
5806
|
-
primaryCube:
|
|
5807
|
-
joinPaths:
|
|
5808
|
-
preAggregations:
|
|
5804
|
+
cubeCount: r.length,
|
|
5805
|
+
cubesInvolved: [...r].sort(),
|
|
5806
|
+
primaryCube: i,
|
|
5807
|
+
joinPaths: s,
|
|
5808
|
+
preAggregations: m,
|
|
5809
5809
|
querySummary: {
|
|
5810
|
-
queryType:
|
|
5811
|
-
measureStrategy:
|
|
5812
|
-
joinCount:
|
|
5813
|
-
cteCount:
|
|
5814
|
-
hasPreAggregation:
|
|
5815
|
-
hasWindowFunctions:
|
|
5810
|
+
queryType: l.length > 0 ? "multi_cube_cte" : r.length > 1 ? "multi_cube_join" : "single_cube",
|
|
5811
|
+
measureStrategy: d.strategy,
|
|
5812
|
+
joinCount: c.length,
|
|
5813
|
+
cteCount: l.length,
|
|
5814
|
+
hasPreAggregation: l.length > 0,
|
|
5815
|
+
hasWindowFunctions: g
|
|
5816
5816
|
},
|
|
5817
|
-
warnings:
|
|
5817
|
+
warnings: _.length > 0 ? _ : void 0,
|
|
5818
5818
|
planningTrace: { steps: [
|
|
5819
5819
|
{
|
|
5820
5820
|
phase: "cube_usage",
|
|
5821
|
-
decision: `Identified ${
|
|
5822
|
-
details: { cubesInvolved: [...
|
|
5821
|
+
decision: `Identified ${r.length} cube${r.length === 1 ? "" : "s"} from query members`,
|
|
5822
|
+
details: { cubesInvolved: [...r].sort() }
|
|
5823
5823
|
},
|
|
5824
5824
|
{
|
|
5825
5825
|
phase: "primary_cube_selection",
|
|
5826
|
-
decision: `Selected '${
|
|
5826
|
+
decision: `Selected '${i.selectedCube}' as primary cube (${i.reason})`,
|
|
5827
5827
|
details: {
|
|
5828
|
-
selectedCube:
|
|
5829
|
-
reason:
|
|
5830
|
-
candidates:
|
|
5828
|
+
selectedCube: i.selectedCube,
|
|
5829
|
+
reason: i.reason,
|
|
5830
|
+
candidates: i.candidates?.map((e) => e.cubeName)
|
|
5831
5831
|
}
|
|
5832
5832
|
},
|
|
5833
5833
|
{
|
|
5834
5834
|
phase: "join_planning",
|
|
5835
|
-
decision: `Planned ${
|
|
5835
|
+
decision: `Planned ${c.length} join${c.length === 1 ? "" : "s"}`,
|
|
5836
5836
|
details: {
|
|
5837
|
-
joinCount:
|
|
5838
|
-
joinTargets:
|
|
5839
|
-
pathSelection:
|
|
5837
|
+
joinCount: c.length,
|
|
5838
|
+
joinTargets: c.map((e) => e.target.name),
|
|
5839
|
+
pathSelection: s.map((e) => ({
|
|
5840
5840
|
targetCube: e.targetCube,
|
|
5841
5841
|
strategy: e.selection?.strategy,
|
|
5842
5842
|
selectedRank: e.selection?.selectedRank,
|
|
@@ -5846,27 +5846,27 @@ var br = class {
|
|
|
5846
5846
|
},
|
|
5847
5847
|
{
|
|
5848
5848
|
phase: "cte_planning",
|
|
5849
|
-
decision: `Planned ${
|
|
5849
|
+
decision: `Planned ${l.length} pre-aggregation CTE${l.length === 1 ? "" : "s"}`,
|
|
5850
5850
|
details: {
|
|
5851
|
-
cteCount:
|
|
5852
|
-
cubes:
|
|
5851
|
+
cteCount: l.length,
|
|
5852
|
+
cubes: l.map((e) => e.cube.name)
|
|
5853
5853
|
}
|
|
5854
5854
|
},
|
|
5855
5855
|
{
|
|
5856
5856
|
phase: "measure_strategy",
|
|
5857
|
-
decision: `Selected '${
|
|
5857
|
+
decision: `Selected '${d.strategy}' measure strategy`,
|
|
5858
5858
|
details: {
|
|
5859
|
-
strategy:
|
|
5860
|
-
regularMeasures:
|
|
5861
|
-
multipliedMeasures:
|
|
5862
|
-
deduplicationSafeMeasures:
|
|
5863
|
-
sourceType:
|
|
5859
|
+
strategy: d.strategy,
|
|
5860
|
+
regularMeasures: d.classification.regular.map((e) => e.name),
|
|
5861
|
+
multipliedMeasures: d.classification.multiplied.map((e) => e.name),
|
|
5862
|
+
deduplicationSafeMeasures: d.classification.deduplicationSafe.map((e) => e.name),
|
|
5863
|
+
sourceType: f.type
|
|
5864
5864
|
}
|
|
5865
5865
|
},
|
|
5866
5866
|
{
|
|
5867
5867
|
phase: "warnings",
|
|
5868
|
-
decision:
|
|
5869
|
-
details: { warningCodes:
|
|
5868
|
+
decision: u.length > 0 ? `Generated ${u.length} planning warning${u.length === 1 ? "" : "s"}` : "No planning warnings generated",
|
|
5869
|
+
details: { warningCodes: u.map((e) => e.code) }
|
|
5870
5870
|
}
|
|
5871
5871
|
] }
|
|
5872
5872
|
}
|
|
@@ -5878,7 +5878,7 @@ var br = class {
|
|
|
5878
5878
|
source: o,
|
|
5879
5879
|
strategy: "multiFactMerge",
|
|
5880
5880
|
classification: {
|
|
5881
|
-
regular:
|
|
5881
|
+
regular: Z(i, r),
|
|
5882
5882
|
multiplied: [],
|
|
5883
5883
|
deduplicationSafe: []
|
|
5884
5884
|
}
|
|
@@ -5895,8 +5895,8 @@ var br = class {
|
|
|
5895
5895
|
};
|
|
5896
5896
|
}
|
|
5897
5897
|
buildSimpleSourceFromPhases(e, t, n, r, i) {
|
|
5898
|
-
let a =
|
|
5899
|
-
let t =
|
|
5898
|
+
let a = X(e), o = t, s = n.map((e) => {
|
|
5899
|
+
let t = X(e.cube);
|
|
5900
5900
|
return {
|
|
5901
5901
|
type: "ctePreAggregate",
|
|
5902
5902
|
schema: yr(e, r),
|
|
@@ -5943,7 +5943,7 @@ var br = class {
|
|
|
5943
5943
|
let o = Array.from(r);
|
|
5944
5944
|
if (!o.every((e) => this.hasDirectJoinToSharedDimension(t.get(e), a, t))) return null;
|
|
5945
5945
|
let s = gr(e, t), c = _r(e, t), l = {
|
|
5946
|
-
measures:
|
|
5946
|
+
measures: Z(e, t),
|
|
5947
5947
|
dimensions: s,
|
|
5948
5948
|
timeDimensions: c
|
|
5949
5949
|
}, u = [];
|
|
@@ -5968,7 +5968,7 @@ var br = class {
|
|
|
5968
5968
|
hasDirectJoinToSharedDimension(e, t, n) {
|
|
5969
5969
|
if (!e?.joins) return !1;
|
|
5970
5970
|
for (let [, r] of Object.entries(e.joins)) {
|
|
5971
|
-
let e =
|
|
5971
|
+
let e = h(r.targetCube, n);
|
|
5972
5972
|
if (!(!e || e.name !== t) && (r.relationship === "belongsTo" || r.relationship === "hasOne")) return !0;
|
|
5973
5973
|
}
|
|
5974
5974
|
return !1;
|
|
@@ -6161,19 +6161,19 @@ function Sr(e, t, n, r) {
|
|
|
6161
6161
|
downstreamCubeMap: s
|
|
6162
6162
|
};
|
|
6163
6163
|
}
|
|
6164
|
-
function Cr(e, t,
|
|
6165
|
-
let
|
|
6166
|
-
if (!e.preAggregationCTEs || e.preAggregationCTEs.length === 0) return
|
|
6167
|
-
for (let
|
|
6168
|
-
let
|
|
6169
|
-
if (!
|
|
6170
|
-
let
|
|
6171
|
-
|
|
6164
|
+
function Cr(e, t, n) {
|
|
6165
|
+
let r = /* @__PURE__ */ new Map();
|
|
6166
|
+
if (!e.preAggregationCTEs || e.preAggregationCTEs.length === 0) return r;
|
|
6167
|
+
for (let i of e.preAggregationCTEs) if (!(!i.propagatingFilters || i.propagatingFilters.length === 0)) for (let e of i.propagatingFilters) {
|
|
6168
|
+
let i = e.sourceCube.name;
|
|
6169
|
+
if (!r.has(i)) {
|
|
6170
|
+
let a = { filters: e.filters }, o = /* @__PURE__ */ new Map([[i, e.sourceCube]]), s = n.queryBuilder.buildWhereConditions(o, a, t);
|
|
6171
|
+
r.set(i, s);
|
|
6172
6172
|
}
|
|
6173
|
-
let
|
|
6174
|
-
|
|
6173
|
+
let a = r.get(i);
|
|
6174
|
+
a && a.length > 0 && (e.preBuiltFilterSQL = a.length === 1 ? a[0] : w(...a));
|
|
6175
6175
|
}
|
|
6176
|
-
return
|
|
6176
|
+
return r;
|
|
6177
6177
|
}
|
|
6178
6178
|
function wr(e, t) {
|
|
6179
6179
|
if (e.downstreamJoinKeys) for (let n of e.downstreamJoinKeys) t.set(n.targetCubeName, {
|
|
@@ -6195,21 +6195,21 @@ function Tr(e, t, n, r, i, a) {
|
|
|
6195
6195
|
if (!m?.measures?.[p]) continue;
|
|
6196
6196
|
let h = m.measures[p], g = t.preAggregationCTEs?.find((e) => e.cube?.name === f && e.measures?.includes(d)), _;
|
|
6197
6197
|
if (g) {
|
|
6198
|
-
let e =
|
|
6199
|
-
_ =
|
|
6198
|
+
let e = C`${C.identifier(g.cteAlias)}.${C.identifier(p)}`;
|
|
6199
|
+
_ = C`sum(${e})`;
|
|
6200
6200
|
} else _ = a.queryBuilder.buildMeasureExpression(h, r, m);
|
|
6201
|
-
e[d] || (e[d] =
|
|
6201
|
+
e[d] || (e[d] = C`${_}`.as(d));
|
|
6202
6202
|
let v = Er(u, _, n, r, l, t, a);
|
|
6203
|
-
v && (e[o] =
|
|
6203
|
+
v && (e[o] = C`${v}`.as(o));
|
|
6204
6204
|
}
|
|
6205
6205
|
}
|
|
6206
6206
|
function Er(e, t, n, r, i, a, o) {
|
|
6207
6207
|
let s = e.windowConfig || {}, c = (e, t) => {
|
|
6208
6208
|
if (!a.preAggregationCTEs) return null;
|
|
6209
6209
|
let n = a.preAggregationCTEs.find((t) => t.cube?.name === e);
|
|
6210
|
-
return n && n.cteAlias ?
|
|
6211
|
-
},
|
|
6212
|
-
if (s.orderBy && s.orderBy.length > 0)
|
|
6210
|
+
return n && n.cteAlias ? C`${C.identifier(n.cteAlias)}.${C.identifier(t)}` : null;
|
|
6211
|
+
}, u;
|
|
6212
|
+
if (s.orderBy && s.orderBy.length > 0) u = s.orderBy.map((e) => {
|
|
6213
6213
|
let a = e.field.includes(".") ? e.field.split(".")[1] : e.field;
|
|
6214
6214
|
if (n.timeDimensions) for (let t of n.timeDimensions) {
|
|
6215
6215
|
let [n, s] = t.dimension.split(".");
|
|
@@ -6226,9 +6226,9 @@ function Er(e, t, n, r, i, a, o) {
|
|
|
6226
6226
|
};
|
|
6227
6227
|
}
|
|
6228
6228
|
}
|
|
6229
|
-
let
|
|
6230
|
-
return
|
|
6231
|
-
field:
|
|
6229
|
+
let u = i.dimensions?.[a];
|
|
6230
|
+
return u ? {
|
|
6231
|
+
field: l(u.sql, r),
|
|
6232
6232
|
direction: e.direction
|
|
6233
6233
|
} : a === (s.measure?.includes(".") ? s.measure.split(".")[1] : s.measure) || e.field === s.measure ? {
|
|
6234
6234
|
field: t,
|
|
@@ -6237,7 +6237,7 @@ function Er(e, t, n, r, i, a, o) {
|
|
|
6237
6237
|
}).filter((e) => e !== null);
|
|
6238
6238
|
else if (n.timeDimensions && n.timeDimensions.length > 0) {
|
|
6239
6239
|
let e = n.timeDimensions[0], [t, a] = e.dimension.split("."), s = c(t, a);
|
|
6240
|
-
if (s)
|
|
6240
|
+
if (s) u = [{
|
|
6241
6241
|
field: s,
|
|
6242
6242
|
direction: "asc"
|
|
6243
6243
|
}];
|
|
@@ -6245,30 +6245,30 @@ function Er(e, t, n, r, i, a, o) {
|
|
|
6245
6245
|
let n = i.name === t ? i : void 0;
|
|
6246
6246
|
if (n?.dimensions?.[a]) {
|
|
6247
6247
|
let t = n.dimensions[a];
|
|
6248
|
-
|
|
6248
|
+
u = [{
|
|
6249
6249
|
field: o.queryBuilder.buildTimeDimensionExpression(t.sql, e.granularity, r),
|
|
6250
6250
|
direction: "asc"
|
|
6251
6251
|
}];
|
|
6252
6252
|
}
|
|
6253
6253
|
}
|
|
6254
6254
|
}
|
|
6255
|
-
let
|
|
6256
|
-
s.partitionBy && s.partitionBy.length > 0 && (
|
|
6255
|
+
let d;
|
|
6256
|
+
s.partitionBy && s.partitionBy.length > 0 && (d = s.partitionBy.map((e) => {
|
|
6257
6257
|
let t = e.includes(".") ? e.split(".")[1] : e, n = i.dimensions?.[t];
|
|
6258
|
-
return n ?
|
|
6258
|
+
return n ? l(n.sql, r) : null;
|
|
6259
6259
|
}).filter((e) => e !== null));
|
|
6260
|
-
let
|
|
6260
|
+
let f = o.databaseAdapter.buildWindowFunction(e.type, t, d, u, {
|
|
6261
6261
|
offset: s.offset,
|
|
6262
6262
|
defaultValue: s.defaultValue,
|
|
6263
6263
|
nTile: s.nTile,
|
|
6264
6264
|
frame: s.frame
|
|
6265
6265
|
});
|
|
6266
|
-
if (!
|
|
6266
|
+
if (!f) return null;
|
|
6267
6267
|
switch (s.operation || U.getDefaultWindowOperation(e.type)) {
|
|
6268
|
-
case "difference": return
|
|
6269
|
-
case "ratio": return
|
|
6270
|
-
case "percentChange": return
|
|
6271
|
-
default: return
|
|
6268
|
+
case "difference": return C`${t} - ${f}`;
|
|
6269
|
+
case "ratio": return C`${t} / NULLIF(${f}, 0)`;
|
|
6270
|
+
case "percentChange": return C`((${t} - ${f}) / NULLIF(${f}, 0)) * 100`;
|
|
6271
|
+
default: return f;
|
|
6272
6272
|
}
|
|
6273
6273
|
}
|
|
6274
6274
|
//#endregion
|
|
@@ -6284,8 +6284,8 @@ function Or(e, t, n, r, i, a) {
|
|
|
6284
6284
|
if (!e[s]) continue;
|
|
6285
6285
|
let [, c] = s.split("."), l = i.get(o);
|
|
6286
6286
|
if (!l?.measures?.[c]) continue;
|
|
6287
|
-
let u = l.measures[c], d =
|
|
6288
|
-
f = u.type === "calculated" && u.calculatedSql ? a.queryBuilder.buildCTECalculatedMeasure(u, l, t, i, r) : kr(u, d, t, n, i, a), e[s] =
|
|
6287
|
+
let u = l.measures[c], d = C`${C.identifier(t.cteAlias)}.${C.identifier(c)}`, f;
|
|
6288
|
+
f = u.type === "calculated" && u.calculatedSql ? a.queryBuilder.buildCTECalculatedMeasure(u, l, t, i, r) : kr(u, d, t, n, i, a), e[s] = C`${f}`.as(s);
|
|
6289
6289
|
}
|
|
6290
6290
|
}
|
|
6291
6291
|
function kr(e, t, n, r, i, a) {
|
|
@@ -6313,7 +6313,7 @@ function Ar(e, t, n) {
|
|
|
6313
6313
|
let e = s.dimensions[o].sql;
|
|
6314
6314
|
u = t.joinKeys.find((t) => t.targetColumnObj === e);
|
|
6315
6315
|
}
|
|
6316
|
-
(u || l && s?.dimensions?.[o]) && (e[i] =
|
|
6316
|
+
(u || l && s?.dimensions?.[o]) && (e[i] = C`${C.identifier(t.cteAlias)}.${C.identifier(o)}`.as(i));
|
|
6317
6317
|
}
|
|
6318
6318
|
}
|
|
6319
6319
|
function jr(e, t, n) {
|
|
@@ -6394,61 +6394,61 @@ function Rr(e, t, n, r, i, a) {
|
|
|
6394
6394
|
return e;
|
|
6395
6395
|
}
|
|
6396
6396
|
}
|
|
6397
|
-
function zr(e, t,
|
|
6398
|
-
let
|
|
6399
|
-
if (!
|
|
6400
|
-
let
|
|
6401
|
-
if (
|
|
6397
|
+
function zr(e, t, n, r) {
|
|
6398
|
+
let i = e.joinCondition, a = e.sourceCubeName ? r.cteAliasMap.get(e.sourceCubeName) : void 0;
|
|
6399
|
+
if (!a) return i;
|
|
6400
|
+
let o = (n.preAggregationCTEs?.find((t) => t.cube.name === e.sourceCubeName))?.downstreamJoinKeys?.find((e) => e.targetCubeName === t.cube.name);
|
|
6401
|
+
if (o && o.joinKeys.length > 0) {
|
|
6402
6402
|
let e = [];
|
|
6403
|
-
for (let t of
|
|
6404
|
-
let n =
|
|
6405
|
-
r && e.push(
|
|
6403
|
+
for (let t of o.joinKeys) {
|
|
6404
|
+
let n = C`${C.identifier(a)}.${C.identifier(t.sourceColumn)}`, r = t.targetColumnObj;
|
|
6405
|
+
r && e.push(b(r, n));
|
|
6406
6406
|
}
|
|
6407
|
-
e.length > 0 && (
|
|
6407
|
+
e.length > 0 && (i = w(...e));
|
|
6408
6408
|
}
|
|
6409
|
-
return
|
|
6409
|
+
return i;
|
|
6410
6410
|
}
|
|
6411
|
-
function Br(e, t, r, i, a
|
|
6411
|
+
function Br(e, t, n, r, i, a) {
|
|
6412
6412
|
if (t) return {
|
|
6413
|
-
joinTarget:
|
|
6414
|
-
joinCondition:
|
|
6413
|
+
joinTarget: C`${C.identifier(t)}`,
|
|
6414
|
+
joinCondition: a.cteBuilder.buildCTEJoinCondition(e, t, r),
|
|
6415
6415
|
securityCondition: void 0,
|
|
6416
6416
|
joinCubeBase: void 0
|
|
6417
6417
|
};
|
|
6418
|
-
let
|
|
6419
|
-
if (
|
|
6418
|
+
let o = n.downstreamCubeMap.get(e.cube.name), s = e.cube.sql(i), c;
|
|
6419
|
+
if (o && !e.junctionTable) {
|
|
6420
6420
|
let e = [];
|
|
6421
|
-
for (let t of
|
|
6422
|
-
let n =
|
|
6423
|
-
e.push(
|
|
6421
|
+
for (let t of o.joinKeys) {
|
|
6422
|
+
let n = C`${C.identifier(o.cteAlias)}.${C.identifier(t.sourceColumn)}`, r = t.targetColumnObj || C.identifier(t.targetColumn);
|
|
6423
|
+
e.push(b(n, r));
|
|
6424
6424
|
}
|
|
6425
|
-
|
|
6426
|
-
} else
|
|
6425
|
+
c = e.length === 1 ? e[0] : w(...e);
|
|
6426
|
+
} else c = e.joinCondition;
|
|
6427
6427
|
return {
|
|
6428
|
-
joinTarget:
|
|
6429
|
-
joinCondition:
|
|
6430
|
-
securityCondition:
|
|
6431
|
-
joinCubeBase:
|
|
6428
|
+
joinTarget: s.from,
|
|
6429
|
+
joinCondition: c,
|
|
6430
|
+
securityCondition: s.where,
|
|
6431
|
+
joinCubeBase: s
|
|
6432
6432
|
};
|
|
6433
6433
|
}
|
|
6434
|
-
function Vr(e, t, r, i, a, o
|
|
6435
|
-
let { joinTarget:
|
|
6434
|
+
function Vr(e, t, n, r, i, a, o) {
|
|
6435
|
+
let { joinTarget: s, joinCondition: c, securityCondition: l, joinCubeBase: u } = Br(t, r.cteAliasMap.get(t.cube.name), r, n, i, a), d = t.joinType || "left", f = d !== "inner" && l ? w(c, l) : c;
|
|
6436
6436
|
try {
|
|
6437
6437
|
let n;
|
|
6438
|
-
return
|
|
6438
|
+
return d === "inner" ? n = e.innerJoin(s, c) : (n = Q(e, d, s, f), l && o.add(t.cube.name)), Ir(n, u?.joins);
|
|
6439
6439
|
} catch {
|
|
6440
6440
|
return e;
|
|
6441
6441
|
}
|
|
6442
6442
|
}
|
|
6443
6443
|
//#endregion
|
|
6444
6444
|
//#region src/server/physical-plan/processors/predicates-processor.ts
|
|
6445
|
-
function Hr(e, t, r, i, a, o, s
|
|
6446
|
-
let
|
|
6447
|
-
if (
|
|
6448
|
-
let e =
|
|
6449
|
-
|
|
6445
|
+
function Hr(e, t, n, r, i, a, o, s) {
|
|
6446
|
+
let c = Ur(e, t, n, r, i, a, o, s), l = o.drizzleQuery;
|
|
6447
|
+
if (c.length > 0) {
|
|
6448
|
+
let e = c.length === 1 ? c[0] : w(...c);
|
|
6449
|
+
l = l.where(e);
|
|
6450
6450
|
}
|
|
6451
|
-
return Wr(
|
|
6451
|
+
return Wr(l, e, t, n, r, s);
|
|
6452
6452
|
}
|
|
6453
6453
|
function Ur(e, t, n, r, i, a, o, s) {
|
|
6454
6454
|
let c = [...o.allWhereConditions];
|
|
@@ -6461,17 +6461,17 @@ function Ur(e, t, n, r, i, a, o, s) {
|
|
|
6461
6461
|
let l = s.queryBuilder.buildWhereConditions(e.joinCubes.length > 0 ? r : e.primaryCube, t, n, e, a.preBuiltFilterMap);
|
|
6462
6462
|
return l.length > 0 && c.push(...l), c;
|
|
6463
6463
|
}
|
|
6464
|
-
function Wr(e, t, r, i, a
|
|
6465
|
-
let
|
|
6466
|
-
if (
|
|
6467
|
-
let e =
|
|
6464
|
+
function Wr(e, t, n, r, i, a) {
|
|
6465
|
+
let o = t.joinCubes.length > 0 ? i : t.primaryCube, s = e, c = a.queryBuilder.buildGroupByFields(o, n, r, t);
|
|
6466
|
+
if (c.length > 0 && (s = s.groupBy(...c)), !n.ungrouped) {
|
|
6467
|
+
let e = a.queryBuilder.buildHavingConditions(o, n, r, t);
|
|
6468
6468
|
if (e.length > 0) {
|
|
6469
|
-
let t = e.length === 1 ? e[0] :
|
|
6470
|
-
|
|
6469
|
+
let t = e.length === 1 ? e[0] : w(...e);
|
|
6470
|
+
s = s.having(t);
|
|
6471
6471
|
}
|
|
6472
6472
|
}
|
|
6473
|
-
let
|
|
6474
|
-
return
|
|
6473
|
+
let l = a.queryBuilder.buildOrderBy(n);
|
|
6474
|
+
return l.length > 0 && (s = s.orderBy(...l)), a.queryBuilder.applyLimitAndOffset(s, n);
|
|
6475
6475
|
}
|
|
6476
6476
|
//#endregion
|
|
6477
6477
|
//#region src/server/physical-plan/processors/keys-dedup-processor.ts
|
|
@@ -6501,37 +6501,37 @@ function Kr(e, t, n, r, i, a, o) {
|
|
|
6501
6501
|
if (e.dimensions) for (let n of e.dimensions) {
|
|
6502
6502
|
let [e, i] = n.split("."), a = r.get(e), o = a?.dimensions?.[i];
|
|
6503
6503
|
if (!a || !o) return null;
|
|
6504
|
-
let
|
|
6505
|
-
s[n] =
|
|
6504
|
+
let u = l(o.sql, t);
|
|
6505
|
+
s[n] = C`${u}`.as(n), c.push(u);
|
|
6506
6506
|
}
|
|
6507
6507
|
if (e.timeDimensions) for (let i of e.timeDimensions) {
|
|
6508
6508
|
let [e, a] = i.dimension.split("."), o = r.get(e), l = o?.dimensions?.[a];
|
|
6509
6509
|
if (!o || !l) return null;
|
|
6510
6510
|
let u = n.queryBuilder.buildTimeDimensionExpression(l.sql, i.granularity, t);
|
|
6511
|
-
s[i.dimension] =
|
|
6511
|
+
s[i.dimension] = C`${u}`.as(i.dimension), c.push(u);
|
|
6512
6512
|
}
|
|
6513
|
-
let
|
|
6513
|
+
let u = [];
|
|
6514
6514
|
for (let e of a) {
|
|
6515
6515
|
let n = i.dimensions?.[e];
|
|
6516
6516
|
if (!n) return null;
|
|
6517
|
-
let r =
|
|
6518
|
-
s[a] =
|
|
6517
|
+
let r = l(n.sql, t), a = `__pk__${e}`;
|
|
6518
|
+
s[a] = C`${r}`.as(a), c.push(r), u.push(a);
|
|
6519
6519
|
}
|
|
6520
|
-
let
|
|
6520
|
+
let d = new Set(o), f = e.measures.filter((e) => !d.has(e));
|
|
6521
6521
|
if (o.length > 0) {
|
|
6522
6522
|
let e = n.queryBuilder.buildResolvedMeasures(o, r, t);
|
|
6523
6523
|
for (let t of o) {
|
|
6524
6524
|
let n = e.get(t);
|
|
6525
6525
|
if (!n) return null;
|
|
6526
6526
|
let r = `__reg__${t.replace(".", "__")}`;
|
|
6527
|
-
s[r] =
|
|
6527
|
+
s[r] = C`${n()}`.as(r);
|
|
6528
6528
|
}
|
|
6529
6529
|
}
|
|
6530
6530
|
return {
|
|
6531
6531
|
keysSelections: s,
|
|
6532
6532
|
keyGroupBy: c,
|
|
6533
|
-
pkAliases:
|
|
6534
|
-
multipliedMeasures:
|
|
6533
|
+
pkAliases: u,
|
|
6534
|
+
multipliedMeasures: f
|
|
6535
6535
|
};
|
|
6536
6536
|
}
|
|
6537
6537
|
function qr(e, t, n, r, i, a, o, s) {
|
|
@@ -6567,8 +6567,8 @@ function Zr(e, t, n, r, i) {
|
|
|
6567
6567
|
for (let t of r) {
|
|
6568
6568
|
let r = n.dimensions?.[t];
|
|
6569
6569
|
if (!r) return null;
|
|
6570
|
-
let i =
|
|
6571
|
-
a[t] =
|
|
6570
|
+
let i = l(r.sql, e);
|
|
6571
|
+
a[t] = C`${i}`.as(t), o.push(i);
|
|
6572
6572
|
}
|
|
6573
6573
|
let s = /* @__PURE__ */ new Set();
|
|
6574
6574
|
for (let e of i) {
|
|
@@ -6584,7 +6584,7 @@ function Zr(e, t, n, r, i) {
|
|
|
6584
6584
|
for (let e of c) {
|
|
6585
6585
|
let [, t] = e.split("."), n = r.get(e);
|
|
6586
6586
|
if (!n || typeof n != "function") return null;
|
|
6587
|
-
a[t] =
|
|
6587
|
+
a[t] = C`${n()}`.as(t);
|
|
6588
6588
|
}
|
|
6589
6589
|
}
|
|
6590
6590
|
for (let t of i) {
|
|
@@ -6592,8 +6592,8 @@ function Zr(e, t, n, r, i) {
|
|
|
6592
6592
|
if (!s.has(r)) continue;
|
|
6593
6593
|
let i = n.measures?.[r];
|
|
6594
6594
|
if (!i?.sql) return null;
|
|
6595
|
-
let o =
|
|
6596
|
-
a[c] =
|
|
6595
|
+
let o = l(i.sql, e), c = `__avg_sum__${r}`, u = `__avg_count__${r}`;
|
|
6596
|
+
a[c] = C`sum(${o})`.as(c), a[u] = C`count(${o})`.as(u);
|
|
6597
6597
|
}
|
|
6598
6598
|
return {
|
|
6599
6599
|
aggSelections: a,
|
|
@@ -6601,26 +6601,26 @@ function Zr(e, t, n, r, i) {
|
|
|
6601
6601
|
};
|
|
6602
6602
|
}
|
|
6603
6603
|
function Qr(e, t) {
|
|
6604
|
-
return t.length === 0 ? e : e.where(t.length === 1 ? t[0] :
|
|
6604
|
+
return t.length === 0 ? e : e.where(t.length === 1 ? t[0] : w(...t));
|
|
6605
6605
|
}
|
|
6606
|
-
function $r(e, t, r, i, a
|
|
6607
|
-
let { keysAlias:
|
|
6608
|
-
for (let t of e.dimensions ?? [])
|
|
6609
|
-
for (let t of e.timeDimensions ?? [])
|
|
6610
|
-
for (let e of
|
|
6611
|
-
let [, t] = e.split("."), n =
|
|
6612
|
-
|
|
6606
|
+
function $r(e, t, n, r, i, a) {
|
|
6607
|
+
let { keysAlias: o, aggAlias: s, keysCte: c, aggCte: l, pkDimensions: u, pkAliases: d, multipliedMeasures: f, regularMeasureNames: p } = a, m = {};
|
|
6608
|
+
for (let t of e.dimensions ?? []) m[t] = C`${C.identifier(o)}.${C.identifier(t)}`.as(t);
|
|
6609
|
+
for (let t of e.timeDimensions ?? []) m[t.dimension] = C`${C.identifier(o)}.${C.identifier(t.dimension)}`.as(t.dimension);
|
|
6610
|
+
for (let e of f) {
|
|
6611
|
+
let [, t] = e.split("."), n = i.measures?.[t];
|
|
6612
|
+
m[e] = ri(n?.type ?? "sum", s, t, e);
|
|
6613
6613
|
}
|
|
6614
|
-
for (let e of
|
|
6615
|
-
let [t, n] = e.split("."),
|
|
6616
|
-
|
|
6614
|
+
for (let e of p) {
|
|
6615
|
+
let [t, n] = e.split("."), i = r.get(t)?.measures?.[n], a = `__reg__${e.replace(".", "__")}`;
|
|
6616
|
+
m[e] = ri(i?.type ?? "sum", o, a, e);
|
|
6617
6617
|
}
|
|
6618
|
-
let
|
|
6619
|
-
|
|
6620
|
-
let
|
|
6621
|
-
|
|
6622
|
-
let
|
|
6623
|
-
return
|
|
6618
|
+
let h = t.db.with(c, l).select(m).from(C`${C.identifier(o)}`), g = d.map((e, t) => b(C`${C.identifier(o)}.${C.identifier(e)}`, C`${C.identifier(s)}.${C.identifier(u[t])}`)), _ = g.length === 1 ? g[0] : w(...g);
|
|
6619
|
+
h = h.leftJoin(C`${C.identifier(s)}`, _);
|
|
6620
|
+
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)}`)];
|
|
6621
|
+
v.length > 0 && (h = h.groupBy(...v));
|
|
6622
|
+
let y = n.queryBuilder.buildOrderBy(e, Object.keys(m));
|
|
6623
|
+
return y.length > 0 && (h = h.orderBy(...y)), n.queryBuilder.applyLimitAndOffset(h, e);
|
|
6624
6624
|
}
|
|
6625
6625
|
function ei(e, t, n) {
|
|
6626
6626
|
if (!e.measures?.length) return !1;
|
|
@@ -6666,20 +6666,20 @@ function ni(e) {
|
|
|
6666
6666
|
function ri(e, t, n, r) {
|
|
6667
6667
|
switch (e) {
|
|
6668
6668
|
case "min": {
|
|
6669
|
-
let e =
|
|
6670
|
-
return
|
|
6669
|
+
let e = C`${C.identifier(t)}.${C.identifier(n)}`;
|
|
6670
|
+
return C`min(${e})`.as(r);
|
|
6671
6671
|
}
|
|
6672
6672
|
case "max": {
|
|
6673
|
-
let e =
|
|
6674
|
-
return
|
|
6673
|
+
let e = C`${C.identifier(t)}.${C.identifier(n)}`;
|
|
6674
|
+
return C`max(${e})`.as(r);
|
|
6675
6675
|
}
|
|
6676
6676
|
case "avg": {
|
|
6677
|
-
let e =
|
|
6678
|
-
return
|
|
6677
|
+
let e = C`${C.identifier(t)}.${C.identifier(`__avg_sum__${n}`)}`, i = C`${C.identifier(t)}.${C.identifier(`__avg_count__${n}`)}`;
|
|
6678
|
+
return C`sum(${e}) / nullif(sum(${i}), 0)`.as(r);
|
|
6679
6679
|
}
|
|
6680
6680
|
default: {
|
|
6681
|
-
let e =
|
|
6682
|
-
return
|
|
6681
|
+
let e = C`${C.identifier(t)}.${C.identifier(n)}`;
|
|
6682
|
+
return C`coalesce(sum(${e}), 0)`.as(r);
|
|
6683
6683
|
}
|
|
6684
6684
|
}
|
|
6685
6685
|
}
|
|
@@ -6698,47 +6698,47 @@ function ai(e, t, n) {
|
|
|
6698
6698
|
let r = {};
|
|
6699
6699
|
for (let e of t) {
|
|
6700
6700
|
let t = fi(n, e);
|
|
6701
|
-
r[e] =
|
|
6701
|
+
r[e] = C`${t}`.as(e);
|
|
6702
6702
|
}
|
|
6703
6703
|
for (let t of e.groups) for (let e of t.measures) {
|
|
6704
|
-
let n =
|
|
6705
|
-
r[e] =
|
|
6704
|
+
let n = C`${C.identifier(t.alias)}.${C.identifier(e)}`;
|
|
6705
|
+
r[e] = C`coalesce(${n}, 0)`.as(e);
|
|
6706
6706
|
}
|
|
6707
6707
|
return r;
|
|
6708
6708
|
}
|
|
6709
|
-
function oi(e, t,
|
|
6710
|
-
if (t.length === 0) return
|
|
6711
|
-
let
|
|
6712
|
-
return
|
|
6709
|
+
function oi(e, t, n) {
|
|
6710
|
+
if (t.length === 0) return C`1 = 1`;
|
|
6711
|
+
let r = t.map((t) => b(n.get(t), C`${C.identifier(e)}.${C.identifier(t)}`));
|
|
6712
|
+
return r.length === 1 ? r[0] : w(...r);
|
|
6713
6713
|
}
|
|
6714
6714
|
function si(e, t, n, r, i, a, o) {
|
|
6715
|
-
let s = r.groups[0].alias, c = ai(r, a, r.groups.map((e) => e.alias)), l = t.db.with(...i).select(c).from(
|
|
6716
|
-
for (let e of a) u.set(e,
|
|
6715
|
+
let s = r.groups[0].alias, c = ai(r, a, r.groups.map((e) => e.alias)), l = t.db.with(...i).select(c).from(C`${C.identifier(s)}`), u = /* @__PURE__ */ new Map();
|
|
6716
|
+
for (let e of a) u.set(e, C`${C.identifier(s)}.${C.identifier(e)}`);
|
|
6717
6717
|
for (let e = 1; e < r.groups.length; e++) {
|
|
6718
6718
|
let t = r.groups[e].alias, n = oi(t, a, u);
|
|
6719
|
-
if (l = Q(l, o,
|
|
6719
|
+
if (l = Q(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)}`})`);
|
|
6720
6720
|
}
|
|
6721
6721
|
let d = n.queryBuilder.buildOrderBy(e, Object.keys(c));
|
|
6722
6722
|
return d.length > 0 && (l = l.orderBy(...d)), n.queryBuilder.applyLimitAndOffset(l, e);
|
|
6723
6723
|
}
|
|
6724
|
-
function ci(e, t, r, i, a
|
|
6725
|
-
let
|
|
6726
|
-
for (let e of
|
|
6727
|
-
for (let e of
|
|
6728
|
-
let n =
|
|
6729
|
-
|
|
6724
|
+
function ci(e, t, n, r, i, a) {
|
|
6725
|
+
let o = "mf_all_keys", s = r.groups.map((e) => C`select ${li(e.alias, a)} from ${C.identifier(e.alias)}`), c = C`${C.join(s, C` union `)}`, l = t.db.$with(o).as(c), u = {};
|
|
6726
|
+
for (let e of a) u[e] = C`${C.identifier(o)}.${C.identifier(e)}`.as(e);
|
|
6727
|
+
for (let e of r.groups) for (let t of e.measures) {
|
|
6728
|
+
let n = C`${C.identifier(e.alias)}.${C.identifier(t)}`;
|
|
6729
|
+
u[t] = C`coalesce(${n}, 0)`.as(t);
|
|
6730
6730
|
}
|
|
6731
|
-
let
|
|
6732
|
-
for (let e of
|
|
6733
|
-
let t =
|
|
6734
|
-
|
|
6731
|
+
let d = t.db.with(...i, l).select(u).from(C`${C.identifier(o)}`);
|
|
6732
|
+
for (let e of r.groups) {
|
|
6733
|
+
let t = a.map((t) => b(C`${C.identifier(o)}.${C.identifier(t)}`, C`${C.identifier(e.alias)}.${C.identifier(t)}`)), n = t.length === 1 ? t[0] : w(...t);
|
|
6734
|
+
d = d.leftJoin(C`${C.identifier(e.alias)}`, n);
|
|
6735
6735
|
}
|
|
6736
|
-
let
|
|
6737
|
-
return
|
|
6736
|
+
let f = n.queryBuilder.buildOrderBy(e, Object.keys(u));
|
|
6737
|
+
return f.length > 0 && (d = d.orderBy(...f)), n.queryBuilder.applyLimitAndOffset(d, e);
|
|
6738
6738
|
}
|
|
6739
6739
|
function li(e, t) {
|
|
6740
|
-
let n = t.map((t) =>
|
|
6741
|
-
return
|
|
6740
|
+
let n = t.map((t) => C`${C.identifier(e)}.${C.identifier(t)} as ${C.identifier(t)}`);
|
|
6741
|
+
return C.join(n, C`, `);
|
|
6742
6742
|
}
|
|
6743
6743
|
function ui(e, t, n) {
|
|
6744
6744
|
return !t || e === "innerJoin" ? "inner" : e === "leftJoin" ? "left" : n ? "full" : "left";
|
|
@@ -6748,9 +6748,9 @@ function di(e) {
|
|
|
6748
6748
|
return t === "postgres" || t === "duckdb";
|
|
6749
6749
|
}
|
|
6750
6750
|
function fi(e, t) {
|
|
6751
|
-
if (e.length === 1) return
|
|
6752
|
-
let n = e.map((e) =>
|
|
6753
|
-
for (let e = 1; e < n.length; e++) r =
|
|
6751
|
+
if (e.length === 1) return C`${C.identifier(e[0])}.${C.identifier(t)}`;
|
|
6752
|
+
let n = e.map((e) => C`${C.identifier(e)}.${C.identifier(t)}`), r = n[0];
|
|
6753
|
+
for (let e = 1; e < n.length; e++) r = C`coalesce(${r}, ${n[e]})`;
|
|
6754
6754
|
return r;
|
|
6755
6755
|
}
|
|
6756
6756
|
//#endregion
|
|
@@ -6788,7 +6788,7 @@ var pi = class {
|
|
|
6788
6788
|
}
|
|
6789
6789
|
materializeJoin(e) {
|
|
6790
6790
|
if (e.junctionTable) {
|
|
6791
|
-
let t =
|
|
6791
|
+
let t = oe(e.joinDef);
|
|
6792
6792
|
return {
|
|
6793
6793
|
cube: e.target.cube,
|
|
6794
6794
|
alias: e.alias,
|
|
@@ -6809,7 +6809,7 @@ var pi = class {
|
|
|
6809
6809
|
cube: e.target.cube,
|
|
6810
6810
|
alias: e.alias,
|
|
6811
6811
|
joinType: e.joinType,
|
|
6812
|
-
joinCondition:
|
|
6812
|
+
joinCondition: t(e.joinDef),
|
|
6813
6813
|
relationship: e.relationship
|
|
6814
6814
|
};
|
|
6815
6815
|
}
|
|
@@ -6947,42 +6947,42 @@ var mi = class {
|
|
|
6947
6947
|
resultCache;
|
|
6948
6948
|
filterCachePreloader;
|
|
6949
6949
|
rlsSetup;
|
|
6950
|
-
constructor(e, n, r
|
|
6951
|
-
if (this.dbExecutor = e, this.databaseAdapter = e.databaseAdapter, !this.databaseAdapter) throw Error(
|
|
6950
|
+
constructor(e, t, n, r) {
|
|
6951
|
+
if (this.dbExecutor = e, this.databaseAdapter = e.databaseAdapter, !this.databaseAdapter) throw Error(S("server.errors.dbAdapterRequired"));
|
|
6952
6952
|
this.queryBuilder = new gn(this.databaseAdapter);
|
|
6953
|
-
let
|
|
6954
|
-
this.drizzlePlanBuilder = new pi(this.queryBuilder,
|
|
6953
|
+
let i = new kn(), a = new jn(this.queryBuilder);
|
|
6954
|
+
this.drizzlePlanBuilder = new pi(this.queryBuilder, a, this.databaseAdapter), this.comparisonQueryBuilder = new sr(this.databaseAdapter), this.funnelQueryBuilder = new cr(this.databaseAdapter), this.flowQueryBuilder = new lr(this.databaseAdapter), this.retentionQueryBuilder = new hr(this.databaseAdapter), this.logicalPlanBuilder = new br(i), this.planOptimiser = r ?? new xr(), this.rlsSetup = n, this.modeRouter = new Qn({
|
|
6955
6955
|
comparison: this.comparisonQueryBuilder,
|
|
6956
6956
|
funnel: this.funnelQueryBuilder,
|
|
6957
6957
|
flow: this.flowQueryBuilder,
|
|
6958
6958
|
retention: this.retentionQueryBuilder
|
|
6959
|
-
}), this.resultCache = new
|
|
6960
|
-
}
|
|
6961
|
-
async withRLSContext(e,
|
|
6962
|
-
if (!this.rlsSetup) return
|
|
6963
|
-
let
|
|
6964
|
-
if (!
|
|
6965
|
-
let
|
|
6966
|
-
return
|
|
6967
|
-
await
|
|
6968
|
-
let
|
|
6969
|
-
return
|
|
6959
|
+
}), this.resultCache = new or(t), this.filterCachePreloader = new Zn(this.queryBuilder);
|
|
6960
|
+
}
|
|
6961
|
+
async withRLSContext(e, t) {
|
|
6962
|
+
if (!this.rlsSetup) return t();
|
|
6963
|
+
let n = this.dbExecutor.db;
|
|
6964
|
+
if (!n.transaction) throw Error(S("server.errors.rlsRequiresTransactions"));
|
|
6965
|
+
let r = this.rlsSetup;
|
|
6966
|
+
return n.transaction(async (n) => {
|
|
6967
|
+
await r(n, e);
|
|
6968
|
+
let i = Object.create(this.dbExecutor);
|
|
6969
|
+
return i.db = n, this.dbExecutor = i, t();
|
|
6970
6970
|
});
|
|
6971
6971
|
}
|
|
6972
|
-
async execute(e, n, r
|
|
6972
|
+
async execute(e, t, n, r) {
|
|
6973
6973
|
try {
|
|
6974
|
-
let
|
|
6975
|
-
this.modeRouter.validateForMode(
|
|
6976
|
-
let a = this.resultCache.generateKey(n, r
|
|
6977
|
-
return await this.resultCache.lookup(a,
|
|
6974
|
+
let i = this.modeRouter.resolveMode(t);
|
|
6975
|
+
this.modeRouter.validateForMode(i, e, t);
|
|
6976
|
+
let a = this.resultCache.generateKey(t, n, r?.cubeSetKey);
|
|
6977
|
+
return await this.resultCache.lookup(a, r?.skipCache ?? !1) || await this.withRLSContext(n, () => this.executeQueryByModeWithCache(i, e, t, n, a));
|
|
6978
6978
|
} catch (e) {
|
|
6979
6979
|
if (e instanceof Error) {
|
|
6980
|
-
let
|
|
6981
|
-
for (;
|
|
6982
|
-
let
|
|
6983
|
-
throw
|
|
6980
|
+
let t = e;
|
|
6981
|
+
for (; t.cause instanceof Error;) t = t.cause;
|
|
6982
|
+
let n = t.message, r = t;
|
|
6983
|
+
throw r.code && (n += ` [${r.code}]`), r.detail && (n += ` Detail: ${r.detail}`), r.hint && (n += ` Hint: ${r.hint}`), e.message = S("server.errors.queryExecutionFailed", { message: n }), e;
|
|
6984
6984
|
}
|
|
6985
|
-
throw Error(
|
|
6985
|
+
throw Error(S("server.errors.queryExecutionUnknown"), { cause: e });
|
|
6986
6986
|
}
|
|
6987
6987
|
}
|
|
6988
6988
|
buildLogicalPlan(e, t, n) {
|
|
@@ -7009,16 +7009,16 @@ var mi = class {
|
|
|
7009
7009
|
return l.data = this.comparisonQueryBuilder.sortComparisonResults(l.data, r.dimension), l;
|
|
7010
7010
|
}
|
|
7011
7011
|
buildComparisonExecutionPlan(e) {
|
|
7012
|
-
let
|
|
7013
|
-
if (!
|
|
7014
|
-
let
|
|
7015
|
-
if (
|
|
7016
|
-
let
|
|
7012
|
+
let t = this.comparisonQueryBuilder.getComparisonTimeDimension(e);
|
|
7013
|
+
if (!t || !t.compareDateRange) throw Error(S("server.errors.noCompareDateRange"));
|
|
7014
|
+
let n = this.comparisonQueryBuilder.normalizePeriods(t.compareDateRange);
|
|
7015
|
+
if (n.length < 2) throw Error(S("server.errors.compareDateRangeInvalid"));
|
|
7016
|
+
let r = n.map((t) => this.comparisonQueryBuilder.createPeriodQuery(e, t));
|
|
7017
7017
|
return {
|
|
7018
|
-
timeDimension:
|
|
7019
|
-
granularity:
|
|
7020
|
-
periods:
|
|
7021
|
-
periodQueries:
|
|
7018
|
+
timeDimension: t,
|
|
7019
|
+
granularity: t.granularity || "day",
|
|
7020
|
+
periods: n,
|
|
7021
|
+
periodQueries: r
|
|
7022
7022
|
};
|
|
7023
7023
|
}
|
|
7024
7024
|
async executeAnalysisQueryWithCache(e, t) {
|
|
@@ -7093,8 +7093,8 @@ var mi = class {
|
|
|
7093
7093
|
let l = this.drizzlePlanBuilder.build(s, c, a);
|
|
7094
7094
|
$("query", l);
|
|
7095
7095
|
let u = this.queryBuilder.collectNumericFields(e, t), d = {
|
|
7096
|
-
data:
|
|
7097
|
-
annotation:
|
|
7096
|
+
data: Xn(await this.dbExecutor.execute(l, u), t, this.databaseAdapter),
|
|
7097
|
+
annotation: Mn(s, t),
|
|
7098
7098
|
warnings: o.warnings?.length ? o.warnings : void 0,
|
|
7099
7099
|
total: t.total ? await this.executeTotalCount(s, c, a) : void 0
|
|
7100
7100
|
};
|
|
@@ -7106,7 +7106,7 @@ var mi = class {
|
|
|
7106
7106
|
limit: void 0,
|
|
7107
7107
|
offset: void 0,
|
|
7108
7108
|
order: void 0
|
|
7109
|
-
}, n), i = n.db.select({ total:
|
|
7109
|
+
}, n), i = n.db.select({ total: C`count(*)`.as("total") }).from(r.as("dc_total"));
|
|
7110
7110
|
$("total", i);
|
|
7111
7111
|
let a = await this.dbExecutor.execute(i), o = a?.[0] ? Object.values(a[0])[0] : void 0, s = Number(o);
|
|
7112
7112
|
return Number.isFinite(s) ? s : 0;
|
|
@@ -7185,14 +7185,14 @@ var mi = class {
|
|
|
7185
7185
|
build: (t, n) => this.retentionQueryBuilder.buildRetentionQuery(t, e, n)
|
|
7186
7186
|
});
|
|
7187
7187
|
}
|
|
7188
|
-
async dryRunAnalysis(e,
|
|
7189
|
-
if (!
|
|
7190
|
-
let
|
|
7191
|
-
if (!
|
|
7192
|
-
let
|
|
7188
|
+
async dryRunAnalysis(e, t, n) {
|
|
7189
|
+
if (!n.has(e)) throw Error(S(n.invalidConfigKey));
|
|
7190
|
+
let r = n.getConfig(e), i = n.validate(r);
|
|
7191
|
+
if (!i.isValid) throw Error(S(n.validationFailedKey, { errors: i.errors.join(", ") }));
|
|
7192
|
+
let a = this.createQueryContext(t), o = n.build(r, a).toSQL();
|
|
7193
7193
|
return {
|
|
7194
|
-
sql:
|
|
7195
|
-
params:
|
|
7194
|
+
sql: o.sql,
|
|
7195
|
+
params: o.params
|
|
7196
7196
|
};
|
|
7197
7197
|
}
|
|
7198
7198
|
async explainQuery(e, t, n, r) {
|
|
@@ -7219,7 +7219,7 @@ var mi = class {
|
|
|
7219
7219
|
funnel: () => this.executeAnalysisQueryWithCache(() => this.executeFunnelQuery(t, n, r), i),
|
|
7220
7220
|
flow: () => this.executeAnalysisQueryWithCache(() => this.executeFlowQuery(t, n, r), i),
|
|
7221
7221
|
retention: () => this.executeAnalysisQueryWithCache(() => this.executeRetentionQuery(t, n, r), i)
|
|
7222
|
-
}[
|
|
7222
|
+
}[_(e)]();
|
|
7223
7223
|
}
|
|
7224
7224
|
async generateSqlForMode(e, t, n, r) {
|
|
7225
7225
|
return {
|
|
@@ -7228,7 +7228,7 @@ var mi = class {
|
|
|
7228
7228
|
funnel: () => this.dryRunFunnel(t, n, r),
|
|
7229
7229
|
flow: () => this.dryRunFlow(t, n, r),
|
|
7230
7230
|
retention: () => this.dryRunRetention(t, n, r)
|
|
7231
|
-
}[
|
|
7231
|
+
}[_(e)]();
|
|
7232
7232
|
}
|
|
7233
7233
|
async generateComparisonSQL(e, t, n) {
|
|
7234
7234
|
let r = this.buildComparisonExecutionPlan(t).periodQueries[0];
|
|
@@ -7292,7 +7292,7 @@ function bi(e, t, n) {
|
|
|
7292
7292
|
let r = [];
|
|
7293
7293
|
if (!e.joins) return r;
|
|
7294
7294
|
for (let [, i] of Object.entries(e.joins)) {
|
|
7295
|
-
let e =
|
|
7295
|
+
let e = h(i.targetCube, t);
|
|
7296
7296
|
e && r.push({
|
|
7297
7297
|
targetCube: e.name,
|
|
7298
7298
|
relationship: i.relationship,
|
|
@@ -7358,7 +7358,7 @@ var Ci = class {
|
|
|
7358
7358
|
return !!this.db;
|
|
7359
7359
|
}
|
|
7360
7360
|
createDbExecutor() {
|
|
7361
|
-
if (!this.db) throw Error(
|
|
7361
|
+
if (!this.db) throw Error(S("server.errors.dbNotConfigured"));
|
|
7362
7362
|
return bt(this.db, this.schema, this.engineType);
|
|
7363
7363
|
}
|
|
7364
7364
|
createQueryExecutor(e = !1) {
|
|
@@ -7367,38 +7367,38 @@ var Ci = class {
|
|
|
7367
7367
|
formatSqlResult(e) {
|
|
7368
7368
|
let t = this.getEngineType() ?? "postgres";
|
|
7369
7369
|
return {
|
|
7370
|
-
sql:
|
|
7370
|
+
sql: de(e.sql, t),
|
|
7371
7371
|
params: e.params
|
|
7372
7372
|
};
|
|
7373
7373
|
}
|
|
7374
7374
|
registerCube(e) {
|
|
7375
7375
|
this.prepareCube(e, this.baseCubes), this.baseCubes.set(e.name, e), this.baseGeneration++, this.rebuildAllMergedSets(), this.metadataCache.clear();
|
|
7376
7376
|
}
|
|
7377
|
-
registerCubeSet(e,
|
|
7378
|
-
if (e === "") throw Error(
|
|
7379
|
-
let
|
|
7380
|
-
for (let e of
|
|
7377
|
+
registerCubeSet(e, t) {
|
|
7378
|
+
if (e === "") throw Error(S("server.errors.cubeSetIdEmpty"));
|
|
7379
|
+
let n = Date.now(), r = /* @__PURE__ */ new Map();
|
|
7380
|
+
for (let e of t) {
|
|
7381
7381
|
let t = new Map(this.baseCubes);
|
|
7382
|
-
for (let [e, n] of
|
|
7383
|
-
this.prepareCube(e, t),
|
|
7382
|
+
for (let [e, n] of r) t.set(e, n);
|
|
7383
|
+
this.prepareCube(e, t), r.set(e.name, e);
|
|
7384
7384
|
}
|
|
7385
|
-
let
|
|
7385
|
+
let i = ++this.registrationCounter, a = this.mergeWithBase(r), o = Date.now() - n;
|
|
7386
7386
|
this.cubeSets.set(e, {
|
|
7387
|
-
overlay:
|
|
7388
|
-
merged:
|
|
7389
|
-
generation:
|
|
7390
|
-
durationMs:
|
|
7387
|
+
overlay: r,
|
|
7388
|
+
merged: a,
|
|
7389
|
+
generation: i,
|
|
7390
|
+
durationMs: o
|
|
7391
7391
|
}), this.metadataCache.delete(e);
|
|
7392
|
-
let
|
|
7393
|
-
for (let e of
|
|
7394
|
-
let
|
|
7392
|
+
let s = 0;
|
|
7393
|
+
for (let e of r.values()) s += Object.keys(e.dimensions ?? {}).length;
|
|
7394
|
+
let c = {
|
|
7395
7395
|
setId: e,
|
|
7396
|
-
cubeCount:
|
|
7397
|
-
dimensionCount:
|
|
7398
|
-
generation:
|
|
7399
|
-
durationMs:
|
|
7396
|
+
cubeCount: a.size,
|
|
7397
|
+
dimensionCount: s,
|
|
7398
|
+
generation: i,
|
|
7399
|
+
durationMs: o
|
|
7400
7400
|
};
|
|
7401
|
-
Si(`registered cube set '${e}': ${
|
|
7401
|
+
Si(`registered cube set '${e}': ${r.size} cube(s), ${s} dimension(s), generation ${i}, ${o}ms`), this.onCubeSetRegistered?.(c);
|
|
7402
7402
|
}
|
|
7403
7403
|
unregisterCubeSet(e) {
|
|
7404
7404
|
let t = this.cubeSets.delete(e);
|
|
@@ -7436,14 +7436,14 @@ var Ci = class {
|
|
|
7436
7436
|
}
|
|
7437
7437
|
resolveSetId(e) {
|
|
7438
7438
|
if (!this.contextToCubeSetId) return "";
|
|
7439
|
-
let
|
|
7440
|
-
if (
|
|
7441
|
-
let
|
|
7442
|
-
if (!this.cubeSets.has(
|
|
7443
|
-
if (this.missingCubeSet === "throw") throw Error(
|
|
7439
|
+
let t = this.contextToCubeSetId(e);
|
|
7440
|
+
if (t == null || t === "") return "";
|
|
7441
|
+
let n = String(t);
|
|
7442
|
+
if (!this.cubeSets.has(n)) {
|
|
7443
|
+
if (this.missingCubeSet === "throw") throw Error(S("server.errors.cubeSetNotFound", { setId: n }));
|
|
7444
7444
|
return "";
|
|
7445
7445
|
}
|
|
7446
|
-
return
|
|
7446
|
+
return n;
|
|
7447
7447
|
}
|
|
7448
7448
|
resolveCubes(e) {
|
|
7449
7449
|
let t = this.resolveSetId(e);
|
|
@@ -7458,59 +7458,59 @@ var Ci = class {
|
|
|
7458
7458
|
for (let t of this.unresolvedJoinRefs(this.baseCubes)) e.add(t);
|
|
7459
7459
|
for (let t of this.cubeSets.values()) for (let n of this.unresolvedJoinRefs(t.merged)) e.add(n);
|
|
7460
7460
|
if (e.size > 0) {
|
|
7461
|
-
let
|
|
7462
|
-
throw Error(
|
|
7461
|
+
let t = Array.from(e, (e) => ` - ${e}`).join("\n");
|
|
7462
|
+
throw Error(S("server.errors.unresolvedCubeRefs", { details: t }));
|
|
7463
7463
|
}
|
|
7464
7464
|
}
|
|
7465
7465
|
*unresolvedJoinRefs(e) {
|
|
7466
|
-
for (let [
|
|
7467
|
-
let { targetCube:
|
|
7468
|
-
typeof
|
|
7469
|
-
cubeName:
|
|
7470
|
-
joinName:
|
|
7471
|
-
targetCube:
|
|
7466
|
+
for (let [t, n] of e) if (n.joins) for (let [r, i] of Object.entries(n.joins)) {
|
|
7467
|
+
let { targetCube: n } = i;
|
|
7468
|
+
typeof n == "string" && !e.has(n) && (yield S("server.errors.cubeRefUnresolved", {
|
|
7469
|
+
cubeName: t,
|
|
7470
|
+
joinName: r,
|
|
7471
|
+
targetCube: n
|
|
7472
7472
|
}));
|
|
7473
7473
|
}
|
|
7474
7474
|
}
|
|
7475
|
-
validateCalculatedMeasures(e,
|
|
7476
|
-
let
|
|
7477
|
-
for (let [
|
|
7478
|
-
if (!
|
|
7479
|
-
|
|
7475
|
+
validateCalculatedMeasures(e, t) {
|
|
7476
|
+
let n = [];
|
|
7477
|
+
for (let [r, i] of Object.entries(e.measures)) if (i.type === "calculated") {
|
|
7478
|
+
if (!i.calculatedSql) {
|
|
7479
|
+
n.push(S("server.validation.calculatedMeasure.mustHaveCalculatedSql", {
|
|
7480
7480
|
cubeName: e.name,
|
|
7481
|
-
fieldName:
|
|
7481
|
+
fieldName: r
|
|
7482
7482
|
}));
|
|
7483
7483
|
continue;
|
|
7484
7484
|
}
|
|
7485
|
-
let
|
|
7486
|
-
if (!
|
|
7487
|
-
|
|
7485
|
+
let a = pn(i.calculatedSql);
|
|
7486
|
+
if (!a.isValid) {
|
|
7487
|
+
n.push(S("server.validation.calculatedMeasure.invalidSyntax", {
|
|
7488
7488
|
cubeName: e.name,
|
|
7489
|
-
fieldName:
|
|
7490
|
-
errors:
|
|
7489
|
+
fieldName: r,
|
|
7490
|
+
errors: a.errors.join(", ")
|
|
7491
7491
|
}));
|
|
7492
7492
|
continue;
|
|
7493
7493
|
}
|
|
7494
|
-
let
|
|
7495
|
-
|
|
7496
|
-
let
|
|
7494
|
+
let o = new Map(t);
|
|
7495
|
+
o.set(e.name, e);
|
|
7496
|
+
let s = new H(o);
|
|
7497
7497
|
try {
|
|
7498
|
-
|
|
7498
|
+
s.validateDependencies(e);
|
|
7499
7499
|
} catch (e) {
|
|
7500
|
-
|
|
7500
|
+
n.push(e instanceof Error ? e.message : String(e));
|
|
7501
7501
|
}
|
|
7502
7502
|
}
|
|
7503
|
-
if (
|
|
7504
|
-
let
|
|
7505
|
-
|
|
7506
|
-
let
|
|
7507
|
-
|
|
7508
|
-
let
|
|
7509
|
-
|
|
7510
|
-
}
|
|
7511
|
-
if (
|
|
7503
|
+
if (n.length === 0) {
|
|
7504
|
+
let r = new Map(t);
|
|
7505
|
+
r.set(e.name, e);
|
|
7506
|
+
let i = new H(r);
|
|
7507
|
+
i.buildGraph(e);
|
|
7508
|
+
let a = i.detectCycle();
|
|
7509
|
+
a && n.push(S("server.validation.calculatedMeasure.circularDependency", { cycle: a.join(" -> ") }));
|
|
7510
|
+
}
|
|
7511
|
+
if (n.length > 0) throw Error(S("server.errors.calculatedMeasureValidation", {
|
|
7512
7512
|
cubeName: e.name,
|
|
7513
|
-
details:
|
|
7513
|
+
details: n.join("\n")
|
|
7514
7514
|
}));
|
|
7515
7515
|
}
|
|
7516
7516
|
getCube(e, t) {
|
|
@@ -7532,9 +7532,9 @@ var Ci = class {
|
|
|
7532
7532
|
async executeMultiCubeQuery(e, t, n) {
|
|
7533
7533
|
return this.execute(e, t, n);
|
|
7534
7534
|
}
|
|
7535
|
-
async executeQuery(e,
|
|
7536
|
-
if (!this.resolveCubes(
|
|
7537
|
-
return this.execute(
|
|
7535
|
+
async executeQuery(e, t, n) {
|
|
7536
|
+
if (!this.resolveCubes(n).get(e)) throw Error(S("server.errors.cubeNotFound", { cubeName: e }));
|
|
7537
|
+
return this.execute(t, n);
|
|
7538
7538
|
}
|
|
7539
7539
|
getMetadata(e) {
|
|
7540
7540
|
let t = this.resolveSetId(e), n = this.metadataCache.get(t);
|
|
@@ -7567,11 +7567,11 @@ var Ci = class {
|
|
|
7567
7567
|
meta: e.meta
|
|
7568
7568
|
};
|
|
7569
7569
|
}
|
|
7570
|
-
async generateSQL(e,
|
|
7571
|
-
let
|
|
7572
|
-
if (!
|
|
7573
|
-
let
|
|
7574
|
-
return this.formatSqlResult(
|
|
7570
|
+
async generateSQL(e, t, n) {
|
|
7571
|
+
let r = this.getCube(e, n);
|
|
7572
|
+
if (!r) throw Error(S("server.errors.cubeNotFound", { cubeName: e }));
|
|
7573
|
+
let i = await this.createQueryExecutor().generateSQL(r, t, n);
|
|
7574
|
+
return this.formatSqlResult(i);
|
|
7575
7575
|
}
|
|
7576
7576
|
async generateMultiCubeSQL(e, t) {
|
|
7577
7577
|
let n = await this.createQueryExecutor().generateMultiCubeSQL(this.resolveCubes(t), e, t);
|
|
@@ -7616,7 +7616,7 @@ var Ci = class {
|
|
|
7616
7616
|
return Array.from(this.resolveCubes(e).keys());
|
|
7617
7617
|
}
|
|
7618
7618
|
validateQuery(e, t) {
|
|
7619
|
-
return
|
|
7619
|
+
return r(this.resolveCubes(t), e);
|
|
7620
7620
|
}
|
|
7621
7621
|
analyzeQuery(e, t) {
|
|
7622
7622
|
return this.createQueryExecutor(!0).analyzeQuery(this.resolveCubes(t), e, t);
|