drizzle-cube 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/README.md +3 -2
  2. package/dist/adapters/ActivityGridChart.config-C2kT9qd6.cjs +1 -0
  3. package/dist/adapters/ActivityGridChart.config-Crkwyx_5.js +2 -0
  4. package/dist/adapters/AreaChart.config-Cn4fTDQH.js +2 -0
  5. package/dist/adapters/AreaChart.config-DSBAn4xT.cjs +1 -0
  6. package/dist/adapters/BarChart.config-2r2_F09O.cjs +1 -0
  7. package/dist/adapters/BarChart.config-CorT50Sr.js +2 -0
  8. package/dist/adapters/BoxPlotChart.config-BM4SbL34.cjs +1 -0
  9. package/dist/adapters/BoxPlotChart.config-Dki3qfhN.js +2 -0
  10. package/dist/adapters/BubbleChart.config-DA768T1u.cjs +1 -0
  11. package/dist/adapters/BubbleChart.config-LJ2w0ZAz.js +2 -0
  12. package/dist/adapters/CandlestickChart.config-C00YG927.cjs +1 -0
  13. package/dist/adapters/CandlestickChart.config-D-vVDHaQ.js +2 -0
  14. package/dist/adapters/DataTable.config-Ml6Q3VEP.cjs +1 -0
  15. package/dist/adapters/DataTable.config-jwBiAUpg.js +2 -0
  16. package/dist/adapters/DotStripChart.config-C_dgJFje.js +2 -0
  17. package/dist/adapters/DotStripChart.config-D5M4xxNE.cjs +1 -0
  18. package/dist/adapters/FunnelChart.config-DBkjp0wh.js +2 -0
  19. package/dist/adapters/FunnelChart.config-Jc6DVjCx.cjs +1 -0
  20. package/dist/adapters/GaugeChart.config-BqW6WqXS.cjs +1 -0
  21. package/dist/adapters/GaugeChart.config-CyD4y_yf.js +2 -0
  22. package/dist/adapters/HeatMapChart.config-C_TKjH9_.cjs +1 -0
  23. package/dist/adapters/HeatMapChart.config-Di1KFl9H.js +2 -0
  24. package/dist/adapters/KpiDelta.config-qlIY4kju.js +2 -0
  25. package/dist/adapters/KpiDelta.config-zaqkGeS2.cjs +1 -0
  26. package/dist/adapters/KpiNumber.config-D1hq68b3.cjs +1 -0
  27. package/dist/adapters/KpiNumber.config-D9LpXMmo.js +2 -0
  28. package/dist/adapters/KpiText.config-BBBV_4aK.cjs +1 -0
  29. package/dist/adapters/KpiText.config-pqFid-lb.js +2 -0
  30. package/dist/adapters/LineChart.config-CFGa_jpk.js +2 -0
  31. package/dist/adapters/LineChart.config-DRTr24Jl.cjs +1 -0
  32. package/dist/adapters/MarkdownChart.config--Teyo7aa.cjs +1 -0
  33. package/dist/adapters/MarkdownChart.config-Cnptz8gx.js +2 -0
  34. package/dist/adapters/MeasureProfileChart.config-BlAnkNf6.js +2 -0
  35. package/dist/adapters/MeasureProfileChart.config-c4K6xVET.cjs +1 -0
  36. package/dist/adapters/PieChart.config-BX5FcoZn.cjs +1 -0
  37. package/dist/adapters/PieChart.config-DT1TCBFA.js +2 -0
  38. package/dist/adapters/ProportionBarChart.config-CN5ov6e6.js +2 -0
  39. package/dist/adapters/ProportionBarChart.config-DdrZQypv.cjs +1 -0
  40. package/dist/adapters/RadarChart.config-CYpWy1MI.js +2 -0
  41. package/dist/adapters/RadarChart.config-Cm14F-JW.cjs +1 -0
  42. package/dist/adapters/RadialBarChart.config-BXEmrEW0.js +2 -0
  43. package/dist/adapters/RadialBarChart.config-bJL8ZwT5.cjs +1 -0
  44. package/dist/adapters/RecordsTable.config-BifW_6cA.cjs +1 -0
  45. package/dist/adapters/RecordsTable.config-DOu5dLR9.js +2 -0
  46. package/dist/adapters/RetentionCombinedChart.config-BLTS46q4.js +2 -0
  47. package/dist/adapters/RetentionCombinedChart.config-DkIUp-uU.cjs +1 -0
  48. package/dist/adapters/RetentionHeatmap.config-Csnntt4P.js +2 -0
  49. package/dist/adapters/RetentionHeatmap.config-Xljn01Px.cjs +1 -0
  50. package/dist/adapters/SankeyChart.config-BExGzO93.cjs +1 -0
  51. package/dist/adapters/SankeyChart.config-DEBF3E7J.js +2 -0
  52. package/dist/adapters/ScatterChart.config-B9fxyVl8.cjs +1 -0
  53. package/dist/adapters/ScatterChart.config-CNWNsjv_.js +2 -0
  54. package/dist/adapters/SunburstChart.config-DyBJr_Ah.js +2 -0
  55. package/dist/adapters/SunburstChart.config-vXKPV3lF.cjs +1 -0
  56. package/dist/adapters/TreeMapChart.config-CoXSasFP.js +2 -0
  57. package/dist/adapters/TreeMapChart.config-iq-fCkIZ.cjs +1 -0
  58. package/dist/adapters/WaterfallChart.config-Coyj2j_7.cjs +1 -0
  59. package/dist/adapters/WaterfallChart.config-Dyf-p2Z2.js +2 -0
  60. package/dist/adapters/{compiler-DYAP3l3U.js → compiler-BKg3j2mm.js} +1261 -2447
  61. package/dist/adapters/compiler-BX6Ug_Uq.cjs +166 -0
  62. package/dist/adapters/core/index.cjs +1 -1
  63. package/dist/adapters/core/index.js +1 -1
  64. package/dist/adapters/{core-B05onvSN.js → core-Bmb7XMBz.js} +2 -2
  65. package/dist/adapters/{core-BkxueWec.cjs → core-JgUTMhxl.cjs} +1 -1
  66. package/dist/adapters/express/index.cjs +1 -1
  67. package/dist/adapters/express/index.js +5 -5
  68. package/dist/adapters/fastify/index.cjs +1 -1
  69. package/dist/adapters/fastify/index.js +23 -23
  70. package/dist/adapters/{handler-CP-6A8X3.cjs → handler-CTSg1daG.cjs} +8 -8
  71. package/dist/adapters/{handler-mwSVmP0z.js → handler-DtX1YNOn.js} +213 -209
  72. package/dist/adapters/hono/index.cjs +1 -1
  73. package/dist/adapters/hono/index.js +4 -4
  74. package/dist/adapters/mcp-app-html-Bu4j3yZM.cjs +1 -0
  75. package/dist/adapters/mcp-app-html-D3GsxPcx.js +5 -0
  76. package/dist/adapters/mcp-app-html.cjs +1 -1
  77. package/dist/adapters/mcp-app-html.js +1 -1
  78. package/dist/adapters/mcp-tools.cjs +1 -1
  79. package/dist/adapters/mcp-tools.js +3 -3
  80. package/dist/adapters/{mcp-transport-BH5avoaA.js → mcp-transport-BTmAXLo8.js} +8 -3
  81. package/dist/adapters/{mcp-transport-DXgZ-xcU.cjs → mcp-transport-DzxluRyH.cjs} +2 -2
  82. package/dist/adapters/nextjs/index.cjs +1 -1
  83. package/dist/adapters/nextjs/index.js +5 -5
  84. package/dist/adapters/{openai-B82IDfp4.cjs → openai-BwtOIJIk.cjs} +1 -1
  85. package/dist/adapters/{openai-BKDrN7u0.js → openai-CWnhWp3I.js} +1 -1
  86. package/dist/adapters/{openai-BaNGQmmK.cjs → openai-ClwjvwzT.cjs} +3 -3
  87. package/dist/adapters/{openai-CeNMQU8r.js → openai-Dqrs3PGo.js} +5 -5
  88. package/dist/adapters/utils-Du_UZbn5.cjs +139 -0
  89. package/dist/adapters/{utils-dyUxCOWT.js → utils-i2h5cwI3.js} +2731 -1418
  90. package/dist/adapters/utils.cjs +1 -1
  91. package/dist/adapters/utils.js +1 -1
  92. package/dist/cjs/client/hooks/queries/useExplainAI.d.ts +3 -2
  93. package/dist/cjs/client/types.d.ts +7 -0
  94. package/dist/cjs/server/adapters/base-adapter.d.ts +3 -3
  95. package/dist/cjs/server/ai/query-schema.d.ts +3 -3
  96. package/dist/cjs/server/builders/date-time-builder.d.ts +1 -2
  97. package/dist/cjs/server/builders/date-time-helpers.d.ts +19 -6
  98. package/dist/cjs/server/builders/filter-operators.d.ts +10 -1
  99. package/dist/cjs/server/execution/query-normalizer.d.ts +9 -0
  100. package/dist/cjs/server/physical-plan/drizzle-sql-builder.d.ts +25 -0
  101. package/dist/cjs/server/physical-plan/semi-join.d.ts +21 -0
  102. package/dist/cjs/server/prompts/single-step-prompt.d.ts +1 -1
  103. package/dist/client/charts.js +12 -12
  104. package/dist/client/chunks/{DashboardEditModal-3_odkGXU.js → DashboardEditModal-DfaeSZGf.js} +12 -12
  105. package/dist/client/chunks/DashboardEditModal-DfaeSZGf.js.map +1 -0
  106. package/dist/client/chunks/{DotStripChart-BGpjqpNU.js → DotStripChart-in6QHc0b.js} +3 -3
  107. package/dist/client/chunks/{DotStripChart-BGpjqpNU.js.map → DotStripChart-in6QHc0b.js.map} +1 -1
  108. package/dist/client/chunks/{ProportionBarChart-DuC16TT0.js → ProportionBarChart-CjuOm7NT.js} +3 -3
  109. package/dist/client/chunks/{ProportionBarChart-DuC16TT0.js.map → ProportionBarChart-CjuOm7NT.js.map} +1 -1
  110. package/dist/client/chunks/{RecordsTable-zy4EWyWx.js → RecordsTable-CXXsiaV1.js} +4 -4
  111. package/dist/client/chunks/{RecordsTable-zy4EWyWx.js.map → RecordsTable-CXXsiaV1.js.map} +1 -1
  112. package/dist/client/chunks/{RetentionCombinedChart-BrqSuLXT.js → RetentionCombinedChart-DFCeEFkx.js} +3 -3
  113. package/dist/client/chunks/{RetentionCombinedChart-BrqSuLXT.js.map → RetentionCombinedChart-DFCeEFkx.js.map} +1 -1
  114. package/dist/client/chunks/{RetentionHeatmap-DlGScG6X.js → RetentionHeatmap-jpshJ2Af.js} +2 -2
  115. package/dist/client/chunks/{RetentionHeatmap-DlGScG6X.js.map → RetentionHeatmap-jpshJ2Af.js.map} +1 -1
  116. package/dist/client/chunks/{analysis-builder-UhPaVPsn.js → analysis-builder-fPK8NgJW.js} +9 -9
  117. package/dist/client/chunks/{analysis-builder-UhPaVPsn.js.map → analysis-builder-fPK8NgJW.js.map} +1 -1
  118. package/dist/client/chunks/{analysis-builder-shared-DS_eJnM8.js → analysis-builder-shared--4LqPSum.js} +829 -775
  119. package/dist/client/chunks/analysis-builder-shared--4LqPSum.js.map +1 -0
  120. package/dist/client/chunks/{chart-activity-grid-cJI-MF_M.js → chart-activity-grid-DGazwi4C.js} +12 -5
  121. package/dist/client/chunks/chart-activity-grid-DGazwi4C.js.map +1 -0
  122. package/dist/client/chunks/{chart-area-11vKdaTE.js → chart-area-zyLGD-ym.js} +2 -2
  123. package/dist/client/chunks/{chart-area-11vKdaTE.js.map → chart-area-zyLGD-ym.js.map} +1 -1
  124. package/dist/client/chunks/{chart-bar-ByOYTFZp.js → chart-bar-DMCBq8qJ.js} +3 -3
  125. package/dist/client/chunks/{chart-bar-ByOYTFZp.js.map → chart-bar-DMCBq8qJ.js.map} +1 -1
  126. package/dist/client/chunks/{chart-box-plot-DKTdhdjk.js → chart-box-plot-5Z55A-it.js} +2 -2
  127. package/dist/client/chunks/{chart-box-plot-DKTdhdjk.js.map → chart-box-plot-5Z55A-it.js.map} +1 -1
  128. package/dist/client/chunks/{chart-bubble-lCNFaxsr.js → chart-bubble-YD28dX8w.js} +2 -2
  129. package/dist/client/chunks/{chart-bubble-lCNFaxsr.js.map → chart-bubble-YD28dX8w.js.map} +1 -1
  130. package/dist/client/chunks/{chart-candlestick-DQJ8byvB.js → chart-candlestick-BUMpBI08.js} +2 -2
  131. package/dist/client/chunks/{chart-candlestick-DQJ8byvB.js.map → chart-candlestick-BUMpBI08.js.map} +1 -1
  132. package/dist/client/chunks/{chart-data-table-DkkQtuY6.js → chart-data-table-BdMo3zVh.js} +4 -4
  133. package/dist/client/chunks/{chart-data-table-DkkQtuY6.js.map → chart-data-table-BdMo3zVh.js.map} +1 -1
  134. package/dist/client/chunks/{chart-funnel-BtjUJRcf.js → chart-funnel-BRyZS6ie.js} +2 -2
  135. package/dist/client/chunks/{chart-funnel-BtjUJRcf.js.map → chart-funnel-BRyZS6ie.js.map} +1 -1
  136. package/dist/client/chunks/{chart-gauge-Da-29BzE.js → chart-gauge-DxgHlZKp.js} +3 -3
  137. package/dist/client/chunks/{chart-gauge-Da-29BzE.js.map → chart-gauge-DxgHlZKp.js.map} +1 -1
  138. package/dist/client/chunks/{chart-heat-map-DK0IR2al.js → chart-heat-map-5jHm3f-V.js} +3 -3
  139. package/dist/client/chunks/{chart-heat-map-DK0IR2al.js.map → chart-heat-map-5jHm3f-V.js.map} +1 -1
  140. package/dist/client/chunks/{chart-kpi-delta-Cih5Vh_Z.js → chart-kpi-delta-C84P-mwu.js} +3 -3
  141. package/dist/client/chunks/{chart-kpi-delta-Cih5Vh_Z.js.map → chart-kpi-delta-C84P-mwu.js.map} +1 -1
  142. package/dist/client/chunks/{chart-kpi-number-Z5zpxeKR.js → chart-kpi-number-D9GqtBWw.js} +5 -5
  143. package/dist/client/chunks/{chart-kpi-number-Z5zpxeKR.js.map → chart-kpi-number-D9GqtBWw.js.map} +1 -1
  144. package/dist/client/chunks/{chart-kpi-text-glMTySe4.js → chart-kpi-text-D3HqxXzU.js} +3 -3
  145. package/dist/client/chunks/{chart-kpi-text-glMTySe4.js.map → chart-kpi-text-D3HqxXzU.js.map} +1 -1
  146. package/dist/client/chunks/{chart-line-D6Xkq1eW.js → chart-line-IEgiF8Nv.js} +3 -3
  147. package/dist/client/chunks/{chart-line-D6Xkq1eW.js.map → chart-line-IEgiF8Nv.js.map} +1 -1
  148. package/dist/client/chunks/{chart-markdown-BHBjzgfc.js → chart-markdown-B_2Ed7FJ.js} +3 -3
  149. package/dist/client/chunks/{chart-markdown-BHBjzgfc.js.map → chart-markdown-B_2Ed7FJ.js.map} +1 -1
  150. package/dist/client/chunks/{chart-measure-profile-Cl5xQZLF.js → chart-measure-profile-CWsPrQhH.js} +3 -3
  151. package/dist/client/chunks/{chart-measure-profile-Cl5xQZLF.js.map → chart-measure-profile-CWsPrQhH.js.map} +1 -1
  152. package/dist/client/chunks/{chart-pie-X3wVYu9v.js → chart-pie-BEB2sCXF.js} +3 -3
  153. package/dist/client/chunks/{chart-pie-X3wVYu9v.js.map → chart-pie-BEB2sCXF.js.map} +1 -1
  154. package/dist/client/chunks/{chart-radar-BExajFiU.js → chart-radar-BbSbXKbP.js} +3 -3
  155. package/dist/client/chunks/{chart-radar-BExajFiU.js.map → chart-radar-BbSbXKbP.js.map} +1 -1
  156. package/dist/client/chunks/{chart-radial-bar-CgGmC8WE.js → chart-radial-bar-CNYD7tkM.js} +3 -3
  157. package/dist/client/chunks/{chart-radial-bar-CgGmC8WE.js.map → chart-radial-bar-CNYD7tkM.js.map} +1 -1
  158. package/dist/client/chunks/{chart-sankey-DKj417mA.js → chart-sankey-DKnTIvSr.js} +2 -2
  159. package/dist/client/chunks/{chart-sankey-DKj417mA.js.map → chart-sankey-DKnTIvSr.js.map} +1 -1
  160. package/dist/client/chunks/{chart-scatter-DSNgbnEu.js → chart-scatter-CSWF6-lx.js} +3 -3
  161. package/dist/client/chunks/{chart-scatter-DSNgbnEu.js.map → chart-scatter-CSWF6-lx.js.map} +1 -1
  162. package/dist/client/chunks/{chart-sunburst-IUrLGpyo.js → chart-sunburst-CdGzCq7q.js} +3 -3
  163. package/dist/client/chunks/{chart-sunburst-IUrLGpyo.js.map → chart-sunburst-CdGzCq7q.js.map} +1 -1
  164. package/dist/client/chunks/{chart-tree-map-DS5X1Wiw.js → chart-tree-map-BiXB7EiM.js} +3 -3
  165. package/dist/client/chunks/{chart-tree-map-DS5X1Wiw.js.map → chart-tree-map-BiXB7EiM.js.map} +1 -1
  166. package/dist/client/chunks/{chart-waterfall-C1GZfgHw.js → chart-waterfall-5rSDeLEZ.js} +3 -3
  167. package/dist/client/chunks/{chart-waterfall-C1GZfgHw.js.map → chart-waterfall-5rSDeLEZ.js.map} +1 -1
  168. package/dist/client/chunks/{charts-core-DQXx0Xk-.js → charts-core-CKpkoMCa.js} +2 -2
  169. package/dist/client/chunks/{charts-core-DQXx0Xk-.js.map → charts-core-CKpkoMCa.js.map} +1 -1
  170. package/dist/client/chunks/charts-loader-BTI0UPK4.js +87 -0
  171. package/dist/client/chunks/{charts-loader-DuV9kYN8.js.map → charts-loader-BTI0UPK4.js.map} +1 -1
  172. package/dist/client/chunks/core-BWRP9s8x.js.map +1 -1
  173. package/dist/client/chunks/dashboardExport-Db3rmUP1.js.map +1 -1
  174. package/dist/client/chunks/dist-COqN0-Yj.js.map +1 -1
  175. package/dist/client/chunks/exceljs.min-CdNVdwM3.js.map +1 -1
  176. package/dist/client/chunks/{nl-NL-gaWTnOGQ.js → nl-NL-kRjxedTf.js} +8 -1
  177. package/dist/client/chunks/{nl-NL-gaWTnOGQ.js.map → nl-NL-kRjxedTf.js.map} +1 -1
  178. package/dist/client/chunks/{schema-visualization-DIn9gy5O.js → schema-visualization-BbvL74Sf.js} +3 -3
  179. package/dist/client/chunks/{schema-visualization-DIn9gy5O.js.map → schema-visualization-BbvL74Sf.js.map} +1 -1
  180. package/dist/client/chunks/{useDirtyStateTracking-giMoYB90.js → useDirtyStateTracking-BfG1lX_3.js} +4 -4
  181. package/dist/client/chunks/{useDirtyStateTracking-giMoYB90.js.map → useDirtyStateTracking-BfG1lX_3.js.map} +1 -1
  182. package/dist/client/chunks/{useExplainAI-CpFZbdn-.js → useExplainAI-CDFhgmpE.js} +5 -5
  183. package/dist/client/chunks/{useExplainAI-CpFZbdn-.js.map → useExplainAI-CDFhgmpE.js.map} +1 -1
  184. package/dist/client/chunks/{vendor-wyAsikWW.js → vendor-DeckzF1j.js} +2 -2
  185. package/dist/client/chunks/{vendor-wyAsikWW.js.map → vendor-DeckzF1j.js.map} +1 -1
  186. package/dist/client/components.js +1 -1
  187. package/dist/client/hooks/queries/useExplainAI.d.ts +3 -2
  188. package/dist/client/hooks.js +3 -3
  189. package/dist/client/icons.js +1 -1
  190. package/dist/client/index.js +13 -13
  191. package/dist/client/index.js.map +1 -1
  192. package/dist/client/providers.js +1 -1
  193. package/dist/client/schema.js +1 -1
  194. package/dist/client/types.d.ts +7 -0
  195. package/dist/client/utils.js +4 -4
  196. package/dist/client-bundle-stats.html +1 -1
  197. package/dist/mcp-app/mcp-app.html +6 -6
  198. package/dist/server/adapters/base-adapter.d.ts +3 -3
  199. package/dist/server/ai/query-schema.d.ts +3 -3
  200. package/dist/server/builders/date-time-builder.d.ts +1 -2
  201. package/dist/server/builders/date-time-helpers.d.ts +19 -6
  202. package/dist/server/builders/filter-operators.d.ts +10 -1
  203. package/dist/server/execution/query-normalizer.d.ts +9 -0
  204. package/dist/server/index.cjs +46 -39
  205. package/dist/server/index.js +2751 -2618
  206. package/dist/server/{openai-Cxii1K2N.cjs → openai-C6tdx3yN.cjs} +2 -2
  207. package/dist/server/{openai-aLi6lmJs.js → openai-D0vh48Oi.js} +2 -2
  208. package/dist/server/{openai-DC2ye24o.cjs → openai-D346-vmt.cjs} +1 -1
  209. package/dist/server/{openai-Jt2WUOXm.js → openai-SILGL2q_.js} +1 -1
  210. package/dist/server/physical-plan/drizzle-sql-builder.d.ts +25 -0
  211. package/dist/server/physical-plan/semi-join.d.ts +21 -0
  212. package/dist/server/prompts/single-step-prompt.d.ts +1 -1
  213. package/package.json +2 -2
  214. package/dist/adapters/ActivityGridChart.config-BXelP_3e.cjs +0 -1
  215. package/dist/adapters/ActivityGridChart.config-BjOOT9bc.js +0 -2
  216. package/dist/adapters/AreaChart.config-B9PiH7Kt.js +0 -2
  217. package/dist/adapters/AreaChart.config-Bv39EDi8.cjs +0 -1
  218. package/dist/adapters/BarChart.config-CU-XGdDO.cjs +0 -1
  219. package/dist/adapters/BarChart.config-D9OIP1uN.js +0 -2
  220. package/dist/adapters/BoxPlotChart.config-C3cLagI6.js +0 -2
  221. package/dist/adapters/BoxPlotChart.config-CMwswa9H.cjs +0 -1
  222. package/dist/adapters/BubbleChart.config--rvyga9s.js +0 -2
  223. package/dist/adapters/BubbleChart.config-DOCLeg91.cjs +0 -1
  224. package/dist/adapters/CandlestickChart.config-B8h__isO.cjs +0 -1
  225. package/dist/adapters/CandlestickChart.config-DPzi-8B_.js +0 -2
  226. package/dist/adapters/DataTable.config-Dn2PyQdy.cjs +0 -1
  227. package/dist/adapters/DataTable.config-wtCGsLPw.js +0 -2
  228. package/dist/adapters/DotStripChart.config-BFshbpk0.cjs +0 -1
  229. package/dist/adapters/DotStripChart.config-c-tbauT6.js +0 -2
  230. package/dist/adapters/FunnelChart.config-CZYDI4k-.js +0 -2
  231. package/dist/adapters/FunnelChart.config-Dc2pIfJy.cjs +0 -1
  232. package/dist/adapters/GaugeChart.config-C9LYrKB1.cjs +0 -1
  233. package/dist/adapters/GaugeChart.config-DD73ueqk.js +0 -2
  234. package/dist/adapters/HeatMapChart.config-5DgOpgpV.js +0 -2
  235. package/dist/adapters/HeatMapChart.config-BZgQ255E.cjs +0 -1
  236. package/dist/adapters/KpiDelta.config-BEB3XqML.cjs +0 -1
  237. package/dist/adapters/KpiDelta.config-DeRkPIxD.js +0 -2
  238. package/dist/adapters/KpiNumber.config-CxpTAKzR.cjs +0 -1
  239. package/dist/adapters/KpiNumber.config-DM1dRQL-.js +0 -2
  240. package/dist/adapters/KpiText.config-Dt59uikm.js +0 -2
  241. package/dist/adapters/KpiText.config-Dt_pW6mK.cjs +0 -1
  242. package/dist/adapters/LineChart.config-YeXia1kV.cjs +0 -1
  243. package/dist/adapters/LineChart.config-jX2ulNmq.js +0 -2
  244. package/dist/adapters/MarkdownChart.config-BAXU79ec.js +0 -2
  245. package/dist/adapters/MarkdownChart.config-BP6_9ET2.cjs +0 -1
  246. package/dist/adapters/MeasureProfileChart.config-BW2gdPaM.cjs +0 -1
  247. package/dist/adapters/MeasureProfileChart.config-CSxeKHnS.js +0 -2
  248. package/dist/adapters/PieChart.config-Ci3ZPY9U.cjs +0 -1
  249. package/dist/adapters/PieChart.config-DtCSYlvx.js +0 -2
  250. package/dist/adapters/ProportionBarChart.config-B71wPMKX.js +0 -2
  251. package/dist/adapters/ProportionBarChart.config-Bihgdn8v.cjs +0 -1
  252. package/dist/adapters/RadarChart.config-CC8jIJ78.js +0 -2
  253. package/dist/adapters/RadarChart.config-D7dCuKRM.cjs +0 -1
  254. package/dist/adapters/RadialBarChart.config-DC2nQk5q.js +0 -2
  255. package/dist/adapters/RadialBarChart.config-Dumbvnj1.cjs +0 -1
  256. package/dist/adapters/RecordsTable.config-BRqLDmY3.cjs +0 -1
  257. package/dist/adapters/RecordsTable.config-D1wlIO1v.js +0 -2
  258. package/dist/adapters/RetentionCombinedChart.config-DejP7Hcc.cjs +0 -1
  259. package/dist/adapters/RetentionCombinedChart.config-yDEDWwJt.js +0 -2
  260. package/dist/adapters/RetentionHeatmap.config-BSqTkHB8.cjs +0 -1
  261. package/dist/adapters/RetentionHeatmap.config-GRJjblsW.js +0 -2
  262. package/dist/adapters/SankeyChart.config-9b1eT_2V.js +0 -2
  263. package/dist/adapters/SankeyChart.config-n8ro9EZU.cjs +0 -1
  264. package/dist/adapters/ScatterChart.config-BHqhTxPV.cjs +0 -1
  265. package/dist/adapters/ScatterChart.config-Bub2V8Ge.js +0 -2
  266. package/dist/adapters/SunburstChart.config-CxG0NFqN.js +0 -2
  267. package/dist/adapters/SunburstChart.config-PmN9LEb5.cjs +0 -1
  268. package/dist/adapters/TreeMapChart.config-D2S3rG6P.js +0 -2
  269. package/dist/adapters/TreeMapChart.config-TC4dciRa.cjs +0 -1
  270. package/dist/adapters/WaterfallChart.config-BirJq5VE.cjs +0 -1
  271. package/dist/adapters/WaterfallChart.config-DYMzte7F.js +0 -2
  272. package/dist/adapters/compiler-CJVo3oya.cjs +0 -166
  273. package/dist/adapters/mcp-app-html-CUL2sMpA.js +0 -5
  274. package/dist/adapters/mcp-app-html-Ey6aj9WR.cjs +0 -1
  275. package/dist/adapters/utils-iMkgJr10.cjs +0 -132
  276. package/dist/client/chunks/DashboardEditModal-3_odkGXU.js.map +0 -1
  277. package/dist/client/chunks/analysis-builder-shared-DS_eJnM8.js.map +0 -1
  278. package/dist/client/chunks/chart-activity-grid-cJI-MF_M.js.map +0 -1
  279. package/dist/client/chunks/charts-loader-DuV9kYN8.js +0 -87
@@ -0,0 +1,166 @@
1
+ const e=require("./utils-Du_UZbn5.cjs");function t(t){return e.dt`${t} asc`}function n(t){return e.dt`${t} desc`}function r(t){return e.dt`count(${t||e.dt.raw(`*`)})`.mapWith(Number)}function i(t){return e.dt`count(distinct ${t})`.mapWith(Number)}function a(t){return e.dt`sum(${t})`.mapWith(String)}function o(t){return e.dt`max(${t})`.mapWith(e.pt(t,e.ft)?t:String)}function s(t){return e.dt`min(${t})`.mapWith(e.pt(t,e.ft)?t:String)}function c(t){return t&&t.length>0?e.dt`PARTITION BY ${e.dt.join(t,e.dt`, `)}`:e.dt``}function l(t){return t&&t.length>0?e.dt`ORDER BY ${e.dt.join(t.map(t=>t.direction===`desc`?e.dt`${t.field} DESC`:e.dt`${t.field} ASC`),e.dt`, `)}`:e.dt``}function u(e){return e===`unbounded`?`UNBOUNDED PRECEDING`:typeof e==`number`?`${e} PRECEDING`:`CURRENT ROW`}function d(e){return e===`unbounded`?`UNBOUNDED FOLLOWING`:e===`current`?`CURRENT ROW`:typeof e==`number`?`${e} FOLLOWING`:`CURRENT ROW`}function f(t){if(!t)return e.dt``;let n=t.type.toUpperCase(),r=u(t.start),i=d(t.end);return e.dt`${e.dt.raw(n)} BETWEEN ${e.dt.raw(r)} AND ${e.dt.raw(i)}`}function p(t,n,r){let i=[];t&&t.length>0&&i.push(c(t)),n&&n.length>0&&i.push(l(n)),r?.frame&&i.push(f(r.frame));let a=i.length>0?e.dt.join(i,e.dt` `):e.dt``;return e.dt`OVER (${a})`}function m(t,n,r,i){let a=i?.defaultValue===void 0?e.dt``:e.dt`, ${i.defaultValue}`;return e.dt`${e.dt.raw(t)}(${n}, ${i?.offset??1}${a}) ${r}`}var h={rank:`RANK`,denseRank:`DENSE_RANK`,rowNumber:`ROW_NUMBER`},g={firstValue:`FIRST_VALUE`,lastValue:`LAST_VALUE`,movingAvg:`AVG`,movingSum:`SUM`};function _(t,n,r,i){if(t===`lag`||t===`lead`)return m(t===`lag`?`LAG`:`LEAD`,n,r,i);if(t===`ntile`)return e.dt`NTILE(${i?.nTile??4}) ${r}`;let a=h[t];if(a)return e.dt`${e.dt.raw(a)}() ${r}`;let o=g[t];if(o)return e.dt`${e.dt.raw(o)}(${n}) ${r}`;throw Error(`Unsupported window function: ${t}`)}var v=class{preprocessCalculatedTemplate(e){return e}nullToZero(t){return e.dt`COALESCE(${t}, 0)`}caseInsensitiveLike(t,n,r){return r?e.dt`${t} NOT ILIKE ${n}`:e.dt`${t} ILIKE ${n}`}regexCondition(t,n,r){return r?e.dt`${t} !~* ${n}`:e.dt`${t} ~* ${n}`}buildStringCondition(t,n,r){switch(n){case`contains`:return this.caseInsensitiveLike(t,`%${r}%`,!1);case`notContains`:return this.caseInsensitiveLike(t,`%${r}%`,!0);case`startsWith`:return this.caseInsensitiveLike(t,`${r}%`,!1);case`notStartsWith`:return this.caseInsensitiveLike(t,`${r}%`,!0);case`endsWith`:return this.caseInsensitiveLike(t,`%${r}`,!1);case`notEndsWith`:return this.caseInsensitiveLike(t,`%${r}`,!0);case`like`:return e.dt`${t} LIKE ${r}`;case`notLike`:return e.dt`${t} NOT LIKE ${r}`;case`ilike`:return this.caseInsensitiveLike(t,r,!1);case`regex`:return this.regexCondition(t,r,!1);case`notRegex`:return this.regexCondition(t,r,!0);default:throw Error(`Unsupported string operator: ${n}`)}}buildConditionalAggregation(t,n,r){let i=t.toUpperCase();return t===`count`&&!n?e.dt`${e.dt.raw(i)}(CASE WHEN ${r} THEN 1 END)`:e.dt`${e.dt.raw(i)}(CASE WHEN ${r} THEN ${n} END)`}buildAvg(t){return this.nullToZero(e.dt`AVG(${t})`)}buildCaseWhen(t,n){let r=t.map(t=>e.dt`WHEN ${t.when} THEN ${t.then}`).reduce((t,n)=>e.dt`${t} ${n}`);return n===void 0?e.dt`CASE ${r} END`:e.dt`CASE ${r} ELSE ${n} END`}buildBooleanLiteral(t){return t?e.dt`TRUE`:e.dt`FALSE`}convertFilterValue(e){return e}prepareDateValue(e){return e}isTimestampInteger(){return!1}convertTimeDimensionResult(e){return e}buildStddev(t,n=!1){let r=n?`STDDEV_SAMP`:`STDDEV_POP`;return this.nullToZero(e.dt`${e.dt.raw(r)}(${t})`)}buildVariance(t,n=!1){let r=n?`VAR_SAMP`:`VAR_POP`;return this.nullToZero(e.dt`${e.dt.raw(r)}(${t})`)}buildWindowFunction(e,t,n,r,i){return _(e,t,p(n,r,i),i)}decimalTryCastPattern(){return`^ *[+-]?([0-9]+(\\.[0-9]+)?|\\.[0-9]+) *$`}integerTryCastPattern(){return`^ *[+-]?[0-9]+ *$`}timestampTryCastPattern(){return`^ *[0-9]{4}-[0-9]{2}-[0-9]{2}([ T][0-9]{2}:[0-9]{2}(:[0-9]{2}(\\.[0-9]+)?)?([+-][0-9]{2}:?[0-9]{2}|Z)?)? *$`}buildPattern(e,t){switch(e){case`contains`:case`notContains`:return`%${t}%`;case`startsWith`:return`${t}%`;case`endsWith`:return`%${t}`;default:return t}}parseISODuration(e){let t={years:0,months:0,days:0,hours:0,minutes:0,seconds:0},n=e.match(/^P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/);if(!n)throw Error(`Invalid ISO 8601 duration format: ${e}`);return t.years=parseInt(n[1]||`0`,10),t.months=parseInt(n[2]||`0`,10),t.days=parseInt(n[3]||`0`,10),t.hours=parseInt(n[4]||`0`,10),t.minutes=parseInt(n[5]||`0`,10),t.seconds=parseFloat(n[6]||`0`),t}durationToSeconds(e){let t=this.parseISODuration(e);return t.years*365*24*60*60+t.months*30*24*60*60+t.days*24*60*60+t.hours*60*60+t.minutes*60+t.seconds}},y=class extends v{getEngineType(){return`postgres`}buildIntervalFromISO(t){let n=this.parseISODuration(t),r=[];n.years&&r.push(`${n.years} years`),n.months&&r.push(`${n.months} months`),n.days&&r.push(`${n.days} days`),n.hours&&r.push(`${n.hours} hours`),n.minutes&&r.push(`${n.minutes} minutes`),n.seconds&&r.push(`${n.seconds} seconds`);let i=r.join(` `)||`0 seconds`;return e.dt`INTERVAL '${e.dt.raw(i)}'`}buildTimeDifferenceSeconds(t,n){return e.dt`EXTRACT(EPOCH FROM (${t} - ${n}))`}buildDateAddInterval(t,n){let r=this.buildIntervalFromISO(n);return e.dt`(${t} + ${r})`}buildConditionalAggregation(t,n,r){let i=t.toUpperCase();return t===`count`&&!n?e.dt`COUNT(*) FILTER (WHERE ${r})`:e.dt`${e.dt.raw(i)}(${n}) FILTER (WHERE ${r})`}buildDateDiffPeriods(t,n,r){switch(r){case`day`:return e.dt`(${n}::date - ${t}::date)`;case`week`:return e.dt`FLOOR((${n}::date - ${t}::date) / 7)`;case`month`:return e.dt`(EXTRACT(YEAR FROM AGE(${n}::timestamp, ${t}::timestamp)) * 12 + EXTRACT(MONTH FROM AGE(${n}::timestamp, ${t}::timestamp)))::integer`;default:throw Error(`Unsupported date diff unit: ${r}`)}}buildPeriodSeriesSubquery(t){return e.dt`(SELECT generate_series(0, ${t}) as period_number) p`}buildTimeDimension(t,n){switch(t){case`year`:return e.dt`DATE_TRUNC('year', ${n}::timestamp)`;case`quarter`:return e.dt`DATE_TRUNC('quarter', ${n}::timestamp)`;case`month`:return e.dt`DATE_TRUNC('month', ${n}::timestamp)`;case`week`:return e.dt`DATE_TRUNC('week', ${n}::timestamp)`;case`day`:return e.dt`DATE_TRUNC('day', ${n}::timestamp)::timestamp`;case`hour`:return e.dt`DATE_TRUNC('hour', ${n}::timestamp)`;case`minute`:return e.dt`DATE_TRUNC('minute', ${n}::timestamp)`;case`second`:return e.dt`DATE_TRUNC('second', ${n}::timestamp)`;default:return n}}castToType(t,n){switch(n){case`timestamp`:return e.dt`${t}::timestamp`;case`decimal`:return e.dt`${t}::decimal`;case`integer`:return e.dt`${t}::integer`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`CASE WHEN ${t} ~ ${this.timestampTryCastPattern()} THEN ${t}::timestamp ELSE NULL END`;case`decimal`:return e.dt`CASE WHEN ${t} ~ ${this.decimalTryCastPattern()} THEN ${t}::decimal ELSE NULL END`;case`integer`:return e.dt`CASE WHEN ${t} ~ ${this.integerTryCastPattern()} THEN ${t}::integer ELSE NULL END`;default:throw Error(`Unsupported cast type: ${n}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!0}}buildPercentile(t,n){let r=n/100;return e.dt`PERCENTILE_CONT(${r}) WITHIN GROUP (ORDER BY ${t})`}},b=class extends v{getEngineType(){return`mysql`}buildIntervalFromISO(t){let n=this.durationToSeconds(t);return e.dt`${n}`}buildTimeDifferenceSeconds(t,n){return e.dt`TIMESTAMPDIFF(SECOND, ${n}, ${t})`}buildDateAddInterval(t,n){let r=this.parseISODuration(n),i=t;return r.years&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.years} YEAR)`),r.months&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.months} MONTH)`),r.days&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.days} DAY)`),r.hours&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.hours} HOUR)`),r.minutes&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.minutes} MINUTE)`),r.seconds&&(i=e.dt`DATE_ADD(${i}, INTERVAL ${r.seconds} SECOND)`),i}buildDateDiffPeriods(t,n,r){let i=r.toUpperCase();return e.dt`TIMESTAMPDIFF(${e.dt.raw(i)}, ${t}, ${n})`}buildPeriodSeriesSubquery(t){return e.dt`(
2
+ WITH RECURSIVE periods(period_number) AS (
3
+ SELECT 0
4
+ UNION ALL
5
+ SELECT period_number + 1 FROM periods WHERE period_number < ${t}
6
+ )
7
+ SELECT period_number FROM periods
8
+ ) p`}buildTimeDimension(t,n){let r={year:`%Y-01-01 00:00:00`,quarter:`%Y-%q-01 00:00:00`,month:`%Y-%m-01 00:00:00`,week:`%Y-%u-01 00:00:00`,day:`%Y-%m-%d 00:00:00`,hour:`%Y-%m-%d %H:00:00`,minute:`%Y-%m-%d %H:%i:00`,second:`%Y-%m-%d %H:%i:%s`};switch(t){case`quarter`:return e.dt`DATE_ADD(MAKEDATE(YEAR(${n}), 1), INTERVAL (QUARTER(${n}) - 1) * 3 MONTH)`;case`week`:return e.dt`STR_TO_DATE(DATE_FORMAT(DATE_SUB(${n}, INTERVAL WEEKDAY(${n}) DAY), '%Y-%m-%d 00:00:00'), '%Y-%m-%d %H:%i:%s')`;default:{let i=r[t];return i?e.dt`STR_TO_DATE(DATE_FORMAT(${n}, ${i}), '%Y-%m-%d %H:%i:%s')`:n}}}caseInsensitiveLike(t,n,r){let i=n.toLowerCase();return r?e.dt`LOWER(${t}) NOT LIKE ${i}`:e.dt`LOWER(${t}) LIKE ${i}`}regexCondition(t,n,r){return r?e.dt`${t} NOT REGEXP ${n}`:e.dt`${t} REGEXP ${n}`}castToType(t,n){switch(n){case`timestamp`:return e.dt`CAST(${t} AS DATETIME)`;case`decimal`:return e.dt`CAST(${t} AS DECIMAL(10,2))`;case`integer`:return e.dt`CAST(${t} AS SIGNED INTEGER)`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`CASE WHEN ${t} REGEXP ${this.timestampTryCastPattern()} THEN CAST(${t} AS DATETIME) ELSE NULL END`;case`decimal`:return e.dt`CASE WHEN ${t} REGEXP ${this.decimalTryCastPattern()} THEN CAST(${t} AS DECIMAL(10,2)) ELSE NULL END`;case`integer`:return e.dt`CASE WHEN ${t} REGEXP ${this.integerTryCastPattern()} THEN CAST(${t} AS SIGNED INTEGER) ELSE NULL END`;default:throw Error(`Unsupported cast type: ${n}`)}}nullToZero(t){return e.dt`IFNULL(${t}, 0)`}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!0,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!0}}buildPercentile(e,t){return null}},ee=class extends v{getEngineType(){return`sqlite`}buildIntervalFromISO(t){let n=this.durationToSeconds(t);return e.dt`${n}`}buildTimeDifferenceSeconds(t,n){return e.dt`(${t} - ${n})`}buildDateAddInterval(t,n){let r=this.durationToSeconds(n);return e.dt`(${t} + ${r})`}buildDateDiffPeriods(t,n,r){switch(r){case`day`:return e.dt`CAST((julianday(datetime(${n}, 'unixepoch')) - julianday(datetime(${t}, 'unixepoch'))) AS INTEGER)`;case`week`:return e.dt`CAST((julianday(datetime(${n}, 'unixepoch')) - julianday(datetime(${t}, 'unixepoch'))) / 7 AS INTEGER)`;case`month`:return e.dt`((CAST(strftime('%Y', datetime(${n}, 'unixepoch')) AS INTEGER) - CAST(strftime('%Y', datetime(${t}, 'unixepoch')) AS INTEGER)) * 12 + (CAST(strftime('%m', datetime(${n}, 'unixepoch')) AS INTEGER) - CAST(strftime('%m', datetime(${t}, 'unixepoch')) AS INTEGER)))`;default:throw Error(`Unsupported date diff unit for SQLite: ${r}`)}}buildPeriodSeriesSubquery(t){return e.dt`(
9
+ WITH RECURSIVE periods(period_number) AS (
10
+ SELECT 0
11
+ UNION ALL
12
+ SELECT period_number + 1 FROM periods WHERE period_number < ${t}
13
+ )
14
+ SELECT period_number FROM periods
15
+ ) p`}buildTimeDimension(t,n){switch(t){case`year`:return e.dt`datetime(${n}, 'unixepoch', 'start of year')`;case`quarter`:{let t=e.dt`datetime(${n}, 'unixepoch')`;return e.dt`datetime(${t}, 'start of year',
16
+ '+' || (((CAST(strftime('%m', ${t}) AS INTEGER) - 1) / 3) * 3) || ' months')`}case`month`:return e.dt`datetime(${n}, 'unixepoch', 'start of month')`;case`week`:return e.dt`date(datetime(${n}, 'unixepoch'), 'weekday 1', '-6 days')`;case`day`:return e.dt`datetime(${n}, 'unixepoch', 'start of day')`;case`hour`:{let t=e.dt`datetime(${n}, 'unixepoch')`;return e.dt`datetime(strftime('%Y-%m-%d %H:00:00', ${t}))`}case`minute`:{let t=e.dt`datetime(${n}, 'unixepoch')`;return e.dt`datetime(strftime('%Y-%m-%d %H:%M:00', ${t}))`}case`second`:{let t=e.dt`datetime(${n}, 'unixepoch')`;return e.dt`datetime(strftime('%Y-%m-%d %H:%M:%S', ${t}))`}default:return e.dt`datetime(${n}, 'unixepoch')`}}caseInsensitiveLike(t,n,r){let i=n.toLowerCase();return r?e.dt`LOWER(${t}) NOT LIKE ${i}`:e.dt`LOWER(${t}) LIKE ${i}`}regexCondition(t,n,r){return r?e.dt`${t} NOT GLOB ${n}`:e.dt`${t} GLOB ${n}`}castToType(t,n){switch(n){case`timestamp`:return e.dt`datetime(${t} / 1000, 'unixepoch')`;case`decimal`:return e.dt`CAST(${t} AS REAL)`;case`integer`:return e.dt`CAST(${t} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`CASE WHEN TRIM(${t}) = '' OR TRIM(${t}) GLOB '*[^0-9-]*' THEN NULL ELSE datetime(${t} / 1000, 'unixepoch') END`;case`decimal`:return e.dt`CASE WHEN TRIM(${t}) = '' OR TRIM(${t}) GLOB '*[^0-9.+-]*' THEN NULL ELSE CAST(${t} AS REAL) END`;case`integer`:return e.dt`CASE WHEN TRIM(${t}) = '' OR TRIM(${t}) GLOB '*[^0-9+-]*' THEN NULL ELSE CAST(${t} AS INTEGER) END`;default:throw Error(`Unsupported cast type: ${n}`)}}nullToZero(t){return e.dt`IFNULL(${t}, 0)`}buildCaseWhen(t,n){let r=t.map(t=>t.then&&typeof t.then==`object`&&(t.then.queryChunks||t.then._||t.then.sql)?e.dt`WHEN ${t.when} THEN ${e.dt.raw(`(`)}${t.then}${e.dt.raw(`)`)}`:e.dt`WHEN ${t.when} THEN ${t.then}`).reduce((t,n)=>e.dt`${t} ${n}`);return n===void 0?e.dt`CASE ${r} END`:n&&typeof n==`object`&&(n.queryChunks||n._||n.sql)?e.dt`CASE ${r} ELSE ${e.dt.raw(`(`)}${n}${e.dt.raw(`)`)} END`:e.dt`CASE ${r} ELSE ${n} END`}buildBooleanLiteral(t){return t?e.dt`1`:e.dt`0`}preprocessCalculatedTemplate(e){return e.length>1e3?e:e.replace(/(\{[^}]+\})\s*\/\s*/g,(e,t)=>`${t.replace(/\{([^}]+)\}/,`CAST({$1} AS REAL)`)} / `)}convertFilterValue(e){return typeof e==`boolean`?+!!e:e instanceof Date?e.getTime():Array.isArray(e)?e.map(e=>this.convertFilterValue(e)):e}prepareDateValue(e){if(!(e instanceof Date)){if(typeof e==`number`)return e;if(typeof e==`string`)return new Date(e).getTime();throw Error(`prepareDateValue expects a Date object, got ${typeof e}`)}return e.getTime()}isTimestampInteger(){return!0}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildStddev(e,t=!1){return null}buildVariance(e,t=!1){return null}buildPercentile(e,t){return null}},te=class extends b{getEngineType(){return`singlestore`}},ne=class extends v{getEngineType(){return`duckdb`}buildIntervalFromISO(t){let n=this.parseISODuration(t),r=[];n.years&&r.push(`${n.years} years`),n.months&&r.push(`${n.months} months`),n.days&&r.push(`${n.days} days`),n.hours&&r.push(`${n.hours} hours`),n.minutes&&r.push(`${n.minutes} minutes`),n.seconds&&r.push(`${n.seconds} seconds`);let i=r.join(` `)||`0 seconds`;return e.dt`INTERVAL '${e.dt.raw(i)}'`}buildTimeDifferenceSeconds(t,n){return e.dt`(EPOCH(${t}) - EPOCH(${n}))`}buildDateAddInterval(t,n){let r=this.buildIntervalFromISO(n);return e.dt`(${t} + ${r})`}buildConditionalAggregation(t,n,r){let i=t.toUpperCase();return t===`count`&&!n?e.dt`COUNT(*) FILTER (WHERE ${r})`:e.dt`${e.dt.raw(i)}(${n}) FILTER (WHERE ${r})`}buildDateDiffPeriods(t,n,r){return e.dt`DATE_DIFF('${e.dt.raw(r)}', ${t}::timestamp, ${n}::timestamp)`}buildPeriodSeriesSubquery(t){return e.dt`(SELECT UNNEST(generate_series(0, ${t})) as period_number) p`}buildTimeDimension(t,n){switch(t){case`year`:return e.dt`DATE_TRUNC('year', ${n}::timestamp)`;case`quarter`:return e.dt`DATE_TRUNC('quarter', ${n}::timestamp)`;case`month`:return e.dt`DATE_TRUNC('month', ${n}::timestamp)`;case`week`:return e.dt`DATE_TRUNC('week', ${n}::timestamp)`;case`day`:return e.dt`DATE_TRUNC('day', ${n}::timestamp)::timestamp`;case`hour`:return e.dt`DATE_TRUNC('hour', ${n}::timestamp)`;case`minute`:return e.dt`DATE_TRUNC('minute', ${n}::timestamp)`;case`second`:return e.dt`DATE_TRUNC('second', ${n}::timestamp)`;default:return n}}regexCondition(t,n,r){return r?e.dt`NOT regexp_matches(${t}, ${n})`:e.dt`regexp_matches(${t}, ${n})`}castToType(t,n){switch(n){case`timestamp`:return e.dt`${t}::timestamp`;case`decimal`:return e.dt`${t}::decimal`;case`integer`:return e.dt`${t}::integer`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`TRY_CAST(${t} AS timestamp)`;case`decimal`:return e.dt`TRY_CAST(${t} AS decimal)`;case`integer`:return e.dt`TRY_CAST(${t} AS integer)`;default:throw Error(`Unsupported cast type: ${n}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildPercentile(t,n){let r=n/100;return e.dt`QUANTILE_CONT(${t}, ${r})`}},re=class extends v{getEngineType(){return`databend`}buildIntervalFromISO(t){let n=this.parseISODuration(t),r=[];if(n.years&&r.push(`${n.years} YEAR`),n.months&&r.push(`${n.months} MONTH`),n.days&&r.push(`${n.days} DAY`),n.hours&&r.push(`${n.hours} HOUR`),n.minutes&&r.push(`${n.minutes} MINUTE`),n.seconds&&r.push(`${n.seconds} SECOND`),r.length===0)return e.dt`INTERVAL 0 SECOND`;if(r.length===1)return e.dt`INTERVAL ${e.dt.raw(r[0])}`;let i=r.map(e=>`INTERVAL ${e}`);return e.dt`(${e.dt.raw(i.join(` + `))})`}buildTimeDifferenceSeconds(t,n){return e.dt`EXTRACT(EPOCH FROM TIMESTAMP_DIFF(${t}, ${n}))`}buildDateAddInterval(t,n){let r=this.buildIntervalFromISO(n);return e.dt`(${t} + ${r})`}buildDateDiffPeriods(t,n,r){return e.dt`DATE_DIFF('${e.dt.raw(r)}', ${t}::TIMESTAMP, ${n}::TIMESTAMP)`}buildPeriodSeriesSubquery(t){return e.dt`(SELECT number as period_number FROM numbers(${t+1})) p`}buildTimeDimension(t,n){switch(t){case`year`:return e.dt`DATE_TRUNC(YEAR, ${n}::TIMESTAMP)`;case`quarter`:return e.dt`DATE_TRUNC(QUARTER, ${n}::TIMESTAMP)`;case`month`:return e.dt`DATE_TRUNC(MONTH, ${n}::TIMESTAMP)`;case`week`:return e.dt`DATE_TRUNC(WEEK, ${n}::TIMESTAMP)`;case`day`:return e.dt`DATE_TRUNC(DAY, ${n}::TIMESTAMP)::TIMESTAMP`;case`hour`:return e.dt`DATE_TRUNC(HOUR, ${n}::TIMESTAMP)`;case`minute`:return e.dt`DATE_TRUNC(MINUTE, ${n}::TIMESTAMP)`;case`second`:return e.dt`DATE_TRUNC(SECOND, ${n}::TIMESTAMP)`;default:return n}}caseInsensitiveLike(t,n,r){return r?e.dt`LOWER(${t}) NOT LIKE LOWER(${n})`:e.dt`LOWER(${t}) LIKE LOWER(${n})`}regexCondition(t,n,r){return r?e.dt`NOT (${t} REGEXP ${n})`:e.dt`${t} REGEXP ${n}`}castToType(t,n){switch(n){case`timestamp`:return e.dt`${t}::TIMESTAMP`;case`decimal`:return e.dt`${t}::DECIMAL`;case`integer`:return e.dt`${t}::INTEGER`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`TRY_CAST(${t} AS TIMESTAMP)`;case`decimal`:return e.dt`TRY_CAST(${t} AS DECIMAL)`;case`integer`:return e.dt`TRY_CAST(${t} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${n}`)}}getCapabilities(){return{supportsPercentile:!1,supportsLateralJoins:!1,supportsPercentileSubqueries:!1,supportsLateralSubqueriesInCTE:!1}}buildVariance(t,n=!1){let r=n?`COVAR_SAMP`:`COVAR_POP`;return e.dt`COALESCE(${e.dt.raw(r)}(${t}, ${t}), 0)`}buildPercentile(e,t){throw Error(`Percentile functions are not yet supported for Databend`)}},ie=class extends v{getEngineType(){return`snowflake`}buildIntervalFromISO(t){let n=this.durationToSeconds(t);return e.dt`${n}`}buildTimeDifferenceSeconds(t,n){return e.dt`DATEDIFF('SECOND', ${n}, ${t})`}buildDateAddInterval(t,n){let r=this.parseISODuration(n),i=t;return r.years&&(i=e.dt`DATEADD('YEAR', ${r.years}, ${i})`),r.months&&(i=e.dt`DATEADD('MONTH', ${r.months}, ${i})`),r.days&&(i=e.dt`DATEADD('DAY', ${r.days}, ${i})`),r.hours&&(i=e.dt`DATEADD('HOUR', ${r.hours}, ${i})`),r.minutes&&(i=e.dt`DATEADD('MINUTE', ${r.minutes}, ${i})`),r.seconds&&(i=e.dt`DATEADD('SECOND', ${r.seconds}, ${i})`),i}buildDateDiffPeriods(t,n,r){let i=r.toUpperCase();return e.dt`DATEDIFF('${e.dt.raw(i)}', ${t}::TIMESTAMP, ${n}::TIMESTAMP)`}buildPeriodSeriesSubquery(t){return e.dt`(SELECT ROW_NUMBER() OVER (ORDER BY 1) - 1 AS period_number FROM TABLE(GENERATOR(ROWCOUNT => ${t+1}))) p`}buildTimeDimension(t,n){switch(t){case`year`:return e.dt`DATE_TRUNC('YEAR', ${n}::TIMESTAMP)`;case`quarter`:return e.dt`DATE_TRUNC('QUARTER', ${n}::TIMESTAMP)`;case`month`:return e.dt`DATE_TRUNC('MONTH', ${n}::TIMESTAMP)`;case`week`:return e.dt`DATE_TRUNC('WEEK', ${n}::TIMESTAMP)`;case`day`:return e.dt`DATE_TRUNC('DAY', ${n}::TIMESTAMP)::TIMESTAMP`;case`hour`:return e.dt`DATE_TRUNC('HOUR', ${n}::TIMESTAMP)`;case`minute`:return e.dt`DATE_TRUNC('MINUTE', ${n}::TIMESTAMP)`;case`second`:return e.dt`DATE_TRUNC('SECOND', ${n}::TIMESTAMP)`;default:return n}}regexCondition(t,n,r){return r?e.dt`NOT REGEXP_LIKE(${t}, ${n})`:e.dt`REGEXP_LIKE(${t}, ${n})`}castToType(t,n){switch(n){case`timestamp`:return e.dt`${t}::TIMESTAMP`;case`decimal`:return e.dt`${t}::DECIMAL`;case`integer`:return e.dt`${t}::INTEGER`;default:throw Error(`Unsupported cast type: ${n}`)}}tryCastToType(t,n){switch(n){case`timestamp`:return e.dt`TRY_CAST(${t} AS TIMESTAMP)`;case`decimal`:return e.dt`TRY_CAST(${t} AS DECIMAL)`;case`integer`:return e.dt`TRY_CAST(${t} AS INTEGER)`;default:throw Error(`Unsupported cast type: ${n}`)}}getCapabilities(){return{supportsPercentile:!0,supportsLateralJoins:!0,supportsPercentileSubqueries:!0,supportsLateralSubqueriesInCTE:!1}}buildPercentile(t,n){let r=(n/100).toString();return e.dt`PERCENTILE_CONT(${e.dt.raw(r)}) WITHIN GROUP (ORDER BY ${t})`}};function ae(e){switch(e){case`postgres`:return new y;case`mysql`:return new b;case`sqlite`:return new ee;case`singlestore`:return new te;case`duckdb`:return new ne;case`databend`:return new re;case`snowflake`:return new ie;default:throw Error(`Unsupported database engine: ${e}`)}}var x=class{db;schema;databaseAdapter;constructor(e,t,n){this.db=e,this.schema=t;let r=n||this.getEngineType();this.databaseAdapter=ae(r)}};function S(e,t,n,r){for(;e.length>0&&e[e.length-1].indent>=r;)e.pop();if(e.length===0)t.push(n);else{let t=e[e.length-1].op;t.children||=[],t.children.push(n)}e.push({indent:r,op:n})}function oe(e){let t=0;for(let n of e)if(n===` `||n===`│`||n===`├`||n===`└`||n===`─`)t++;else break;return t}function se(e,t){let n=e.match(/Planning Time:\s*([\d.]+)\s*ms/i);if(n){t.planningTime=parseFloat(n[1]);return}let r=e.match(/Execution Time:\s*([\d.]+)\s*ms/i);if(r){t.executionTime=parseFloat(r[1]);return}let i=le(e);if(!i)return;i.type.includes(`Seq Scan`)&&(t.hasSequentialScans=!0),i.index&&t.usedIndexes.push(i.index),t.operations.length===0&&i.estimatedCost!==void 0&&(t.totalCost=i.estimatedCost);let a=e.search(/\S/);S(t.stack,t.operations,i,a)}function ce(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,planningTime:void 0,executionTime:void 0,totalCost:void 0,stack:[]};for(let t of e)se(t,n);let r={database:`postgres`,planningTime:n.planningTime,executionTime:n.executionTime,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
17
+ `),sql:t}}function le(e){let t=e.replace(/^[\s->]+/,``).trim();if(!t)return null;let n=t.match(/^([A-Za-z][A-Za-z0-9 ]+?)(?:\s+using\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\w+)?(?:\s+\(cost=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)(?:\s+width=\d+)?\))?(?:\s+\(actual time=([\d.]+)\.\.([\d.]+)\s+rows=(\d+)\s+loops=(\d+)\))?/i);if(!n)return t.match(/^Filter:\s*(.+)$/i)||t.match(/^(Hash Cond|Join Filter|Index Cond):\s*(.+)$/i),null;let r=n[1].trim(),i=n[2]||void 0,a=n[3]||void 0,o=n[5]?parseFloat(n[5]):void 0,s=n[6]?parseInt(n[6],10):void 0,c=n[9]?parseInt(n[9],10):void 0,l={type:r,table:a,index:i,estimatedRows:s,estimatedCost:o};c!==void 0&&(l.actualRows=c);let u=e.match(/Filter:\s*(.+?)(?:\)|$)/i);return u&&(l.filter=u[1].trim()),l}function C(t,n,r){let i=[];if(r===`question`){let r=t.split(`?`);i.push(e.dt.raw(r[0]));for(let t=1;t<r.length;t++)i.push(e.dt`${n[t-1]}`),i.push(e.dt.raw(r[t]))}else{let r=/\$(\d+)/g,a=0,o;for(;(o=r.exec(t))!==null;){i.push(e.dt.raw(t.slice(a,o.index)));let r=parseInt(o[1],10)-1;i.push(e.dt`${n[r]}`),a=o.index+o[0].length}i.push(e.dt.raw(t.slice(a)))}return e.dt.join(i)}function w(e){return e&&typeof e==`object`?e:null}function ue(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=w(n);e&&t.push({id:e.id||1,select_type:e.select_type||`SIMPLE`,table:e.table||null,partitions:e.partitions||null,type:e.type||`ALL`,possible_keys:e.possible_keys||null,key:e.key||null,key_len:e.key_len||null,ref:e.ref||null,rows:Number(e.rows)||0,filtered:Number(e.filtered)||100,Extra:e.Extra||null})}return t}function de(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=w(n);e&&t.push({id:Number(e.id)||0,parent:Number(e.parent)||0,notused:Number(e.notused)||0,detail:String(e.detail||``)})}return t}function fe(e){let t=[];for(let n of e){let e=w(n);if(!e)continue;let r=e[`QUERY PLAN`]||e[`query plan`]||e.queryplan;typeof r==`string`&&t.push(r)}return t}function T(e){return Array.isArray(e)?e:e&&typeof e==`object`&&`rows`in e&&Array.isArray(e.rows)?e.rows:[]}function pe(e){return/^-?\d+(\.\d+)?$/.test(e)?e.includes(`.`)?parseFloat(e):parseInt(e,10):!isNaN(parseFloat(e))&&isFinite(parseFloat(e))?parseFloat(e):e}function me(e){switch(typeof e){case`number`:return e;case`bigint`:return Number(e);case`object`:return he(e);case`string`:return pe(e);default:return e}}function he(e){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e.constructor?.name===`Numeric`||e.constructor?.name===`Decimal`||`digits`in e||`sign`in e?parseFloat(e.toString()):e}var ge=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);let n=await this.db.execute(e),r=T(n);return r.length>0?r.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))n[r]=t&&t.includes(r)?this.coerceToNumber(i):i;return n}coerceToNumber(e){return e==null?e:me(e)}getEngineType(){return`postgres`}async explainQuery(t,n,r){let i=r?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);return ce(fe(T(await this.db.execute(e.dt`${e.dt.raw(i)} ${C(t,n,`dollar`)}`))),{sql:t,params:n})}async getTableIndexes(t){if(!t||t.length===0)return[];if(!this.db.execute)throw Error(`PostgreSQL database instance must have an execute method`);try{let n=t.map(e=>`'${e.toLowerCase()}'`).join(`,`),r=T(await this.db.execute(e.dt`
18
+ SELECT
19
+ t.relname as table_name,
20
+ i.relname as index_name,
21
+ array_to_string(array_agg(a.attname ORDER BY k.n), ',') as columns,
22
+ ix.indisunique as is_unique,
23
+ ix.indisprimary as is_primary
24
+ FROM pg_index ix
25
+ JOIN pg_class t ON t.oid = ix.indrelid
26
+ JOIN pg_class i ON i.oid = ix.indexrelid
27
+ JOIN pg_namespace n ON n.oid = t.relnamespace
28
+ JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
29
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
30
+ WHERE n.nspname = 'public'
31
+ AND t.relname IN (${e.dt.raw(n)})
32
+ GROUP BY t.relname, i.relname, ix.indisunique, ix.indisprimary
33
+ ORDER BY t.relname, i.relname
34
+ `));return r.length===0?[]:r.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:e.is_unique,is_primary:e.is_primary}))}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function E(e,t){return new ge(e,t,`postgres`)}function _e(e,t){let n=t?.toLowerCase()||``;switch(e.toLowerCase()){case`all`:return`Seq Scan`;case`index`:return n.includes(`using index`)?`Index Only Scan`:`Index Scan`;case`range`:return`Index Range Scan`;case`ref`:case`eq_ref`:return`Index Lookup`;case`const`:case`system`:return`Const Lookup`;case`null`:return`No Table`;default:return`MySQL ${e}`}}function ve(e,t){let n=[],r=[],i=!1,a=0;for(let t of e){let e=_e(t.type,t.Extra);t.type.toLowerCase()===`all`&&(i=!0),t.key&&r.push(t.key);let o={type:e,table:t.table||void 0,index:t.key||void 0,estimatedRows:t.rows,estimatedCost:t.rows};if(t.Extra){let e=[];t.Extra.includes(`Using where`)&&e.push(`WHERE filter applied`),t.Extra.includes(`Using filesort`)&&e.push(`Filesort required`),t.Extra.includes(`Using temporary`)&&e.push(`Temporary table required`),t.Extra.includes(`Using join buffer`)&&e.push(`Join buffer used`),e.length>0&&(o.details=e.join(`; `)),o.filter=t.Extra}n.push(o),a+=t.rows}return{operations:n,summary:{database:`mysql`,planningTime:void 0,executionTime:void 0,totalCost:a,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id select_type table type possible_keys key rows Extra`,...e.map(e=>`${e.id}\t${e.select_type}\t${e.table||`NULL`}\t${e.type}\t${e.possible_keys||`NULL`}\t${e.key||`NULL`}\t${e.rows}\t${e.Extra||``}`)].join(`
35
+ `),sql:t}}var D=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))n[r]=t&&t.includes(r)?this.coerceToNumber(i):i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`mysql`}async explainQuery(t,n,r){let i=r?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);return ve(ue(await this.db.execute(e.dt`${e.dt.raw(i)} ${C(t,n,`question`)}`)),{sql:t,params:n})}async getTableIndexes(t){if(!t||t.length===0)return[];if(!this.db.execute)throw Error(`MySQL database instance must have an execute method`);try{let n=t.map(e=>`'${e.toLowerCase()}'`).join(`,`),r=await this.db.execute(e.dt`
36
+ SELECT
37
+ TABLE_NAME as table_name,
38
+ INDEX_NAME as index_name,
39
+ GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
40
+ CASE WHEN NON_UNIQUE = 0 THEN TRUE ELSE FALSE END as is_unique,
41
+ CASE WHEN INDEX_NAME = 'PRIMARY' THEN TRUE ELSE FALSE END as is_primary
42
+ FROM INFORMATION_SCHEMA.STATISTICS
43
+ WHERE TABLE_SCHEMA = DATABASE()
44
+ AND LOWER(TABLE_NAME) IN (${e.dt.raw(n)})
45
+ GROUP BY TABLE_NAME, INDEX_NAME, NON_UNIQUE
46
+ ORDER BY TABLE_NAME, INDEX_NAME
47
+ `);return Array.isArray(r)?r.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:e.columns.split(`,`),is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function ye(e,t){return new D(e,t,`mysql`)}function be(e){let t=e.toLowerCase(),n=e.match(/^SCAN\s+(\S+)/i);if(n)return{type:`Seq Scan`,table:n[1]};let r=e.match(/^SEARCH\s+(\S+)\s+USING\s+(?:COVERING\s+)?INDEX\s+(\S+)(?:\s+\((.+)\))?/i);if(r)return{type:`Index Scan`,table:r[1],index:r[2],filter:r[3]};let i=e.match(/^SEARCH\s+(\S+)\s+USING\s+INTEGER\s+PRIMARY\s+KEY\s+\((.+)\)/i);if(i)return{type:`Primary Key Lookup`,table:i[1],filter:i[2]};let a=e.match(/^SEARCH\s+(\S+)/i);return a?{type:`Search`,table:a[1]}:t.includes(`temp b-tree`)?t.includes(`order by`)?{type:`Sort`}:t.includes(`group by`)?{type:`Group`}:t.includes(`distinct`)?{type:`Distinct`}:{type:`Temp B-Tree`}:t.includes(`compound`)?{type:`Compound Query`}:t.includes(`subquery`)?{type:`Subquery`}:t.includes(`co-routine`)?{type:`Coroutine`}:{type:e}}function xe(e,t){let n=[],r=[],i=!1,a=new Map;for(let t of e){let e=be(t.detail);e.type===`Seq Scan`&&(i=!0),e.index&&r.push(e.index);let o={type:e.type,table:e.table,index:e.index,filter:e.filter,details:t.detail};if(a.set(t.id,o),t.parent===0)n.push(o);else{let e=a.get(t.parent);e?(e.children||=[],e.children.push(o)):n.push(o)}}return{operations:n,summary:{database:`sqlite`,planningTime:void 0,executionTime:void 0,totalCost:void 0,hasSequentialScans:i,usedIndexes:[...new Set(r)]},raw:[`id parent detail`,...e.map(e=>`${e.id}\t${e.parent}\t${e.detail}`)].join(`
48
+ `),sql:t}}var Se=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`){let n=await e.execute();return Array.isArray(n)?this.convertNumericFieldsInPlace(n,t):n}try{if(this.db.all){let n=this.db.all(e);return Array.isArray(n)?this.convertNumericFieldsInPlace(n,t):n}if(this.db.run)return this.db.run(e);throw Error(`SQLite database instance must have an all() or run() method`)}catch(e){throw Error(`SQLite execution failed: ${e instanceof Error?e.message:`Unknown error`}`,{cause:e})}}convertNumericFieldsInPlace(e,t){if(!t||t.length===0)return e;for(let n=0;n<e.length;n++){let r=e[n];if(r&&typeof r==`object`)for(let e of t){let t=r[e];t!=null&&typeof t!=`number`&&(r[e]=this.coerceToNumber(t))}}return e}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`sqlite`}async explainQuery(t,n,r){let i;if(this.db.all)i=this.db.all(e.dt`EXPLAIN QUERY PLAN ${C(t,n,`question`)}`);else throw Error(`SQLite database instance must have an all() method for EXPLAIN`);return xe(de(i),{sql:t,params:n})}async getTableIndexes(t){if(!t||t.length===0)return[];if(!this.db.all)throw Error(`SQLite database instance must have an all() method`);try{let n=[];for(let r of t){let t=this.db.all(e.dt.raw(`SELECT name, "unique", origin FROM pragma_index_list('${r.toLowerCase()}')`));if(Array.isArray(t))for(let i of t){let t=i.name,a=!!i.unique,o=i.origin,s=this.db.all(e.dt.raw(`SELECT name FROM pragma_index_info('${t}') ORDER BY seqno`)),c=[];if(Array.isArray(s))for(let e of s){let t=e.name;typeof t==`string`&&c.push(t)}n.push({table_name:r.toLowerCase(),index_name:t,columns:c,is_unique:a,is_primary:o===`pk`})}}return n}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Ce(e,t){return new Se(e,t,`sqlite`)}var we=class extends D{getEngineType(){return`singlestore`}};function Te(e,t){return new we(e,t)}function Ee(e,t){if(/^[┌├└│─┐┤┘]+$/.test(e.trim())||/EXPLANATION|QUERY PLAN/i.test(e))return;let n=Oe(e);if(!n)return;(n.type.includes(`SEQ_SCAN`)||n.type.includes(`TABLE_SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`INDEX_SCAN`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=oe(e);S(t.stack,t.operations,n,r)}function De(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)Ee(t,n);let r={database:`duckdb`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
49
+ `),sql:t}}function Oe(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||t.match(/^\(cost=([\d.]+)\s+rows=(\d+)\)$/i))return null;let n=t.match(/^([A-Z_]+)(?:\s+(\S+))?(?:\s+on\s+(\S+))?(?:\s+\(cost=([\d.]+)\s+rows=(\d+)\))?/i);if(!n){let e=t.match(/^FILTER\s+(.+)$/i);return e?{type:`FILTER`,filter:e[1]}:null}let r=n[1].toUpperCase(),i=n[2]||void 0,a=n[3]||void 0,o=n[4]?parseFloat(n[4]):void 0,s=n[5]?parseInt(n[5],10):void 0;if(r===`INDEX_SCAN`){let e=i,t=a;a=e,i=t}return{type:r,table:i,index:a,estimatedRows:s,estimatedCost:o}}var ke=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[DuckDB] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))n[r]=t&&t.includes(r)?this.coerceToNumber(i):i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`duckdb`}async explainQuery(t,n,r){let i=r?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);let a=await this.db.execute(e.dt`${e.dt.raw(i)} ${C(t,n,`dollar`)}`),o=[];if(Array.isArray(a)){for(let e of a)if(e&&typeof e==`object`){let t=e.explain_value||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&o.push(t)}}return De(o,{sql:t,params:n})}async getTableIndexes(t){if(!t||t.length===0)return[];if(!this.db.execute)throw Error(`DuckDB database instance must have an execute method`);try{let n=t.map(e=>`'${e.toLowerCase()}'`).join(`,`),r=await this.db.execute(e.dt`
50
+ SELECT
51
+ table_name,
52
+ index_name,
53
+ LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY index_oid) as columns,
54
+ is_unique,
55
+ is_primary
56
+ FROM duckdb_indexes()
57
+ WHERE LOWER(table_name) IN (${e.dt.raw(n)})
58
+ GROUP BY table_name, index_name, is_unique, is_primary
59
+ ORDER BY table_name, index_name
60
+ `);return Array.isArray(r)?r.map(e=>({table_name:e.table_name,index_name:e.index_name,columns:typeof e.columns==`string`?e.columns.split(`,`):[],is_unique:!!e.is_unique,is_primary:!!e.is_primary})):[]}catch(e){return console.warn(`Failed to get table indexes:`,e),[]}}};function Ae(e,t){return new ke(e,t,`duckdb`)}function je(e,t){if(!e.trim())return;let n=Ne(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),n.type.includes(`IndexScan`)&&n.index&&t.usedIndexes.push(n.index),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=oe(e);S(t.stack,t.operations,n,r)}function Me(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)je(t,n);let r={database:`databend`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
61
+ `),sql:t}}function Ne(e){let t=e.replace(/[┌├└│─┐┤┘]/g,``).replace(/^\s*/,``).trim();if(!t||/^(filters|table|estimated rows|output columns|push downs):/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Pe=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Databend] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))n[r]=t&&t.includes(r)?this.coerceToNumber(i):i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`databend`}async explainQuery(t,n,r){let i=r?.analyze?`EXPLAIN ANALYZE`:`EXPLAIN`;if(!this.db.execute)throw Error(`Databend database instance must have an execute method`);let a=await this.db.execute(e.dt`${e.dt.raw(i)} ${C(t,n,`dollar`)}`),o=[];if(Array.isArray(a)){for(let e of a)if(e&&typeof e==`object`){let t=e.explain||e[`QUERY PLAN`]||e.query_plan||e.Plan||Object.values(e)[0];typeof t==`string`&&o.push(t)}}return Me(o,{sql:t,params:n})}async getTableIndexes(e){return!e||e.length,[]}};function Fe(e,t){return new Pe(e,t,`databend`)}function Ie(e,t){if(!e.trim())return;let n=ze(e);if(!n)return;(n.type.includes(`TableScan`)||n.type.includes(`SCAN`))&&(t.hasSequentialScans=!0),t.operations.length===0&&n.estimatedCost!==void 0&&(t.totalCost=n.estimatedCost);let r=Re(e);S(t.stack,t.operations,n,r)}function Le(e,t){let n={operations:[],usedIndexes:[],hasSequentialScans:!1,totalCost:void 0,stack:[]};for(let t of e)Ie(t,n);let r={database:`snowflake`,planningTime:void 0,executionTime:void 0,totalCost:n.totalCost,hasSequentialScans:n.hasSequentialScans,usedIndexes:[...new Set(n.usedIndexes)]};return{operations:n.operations,summary:r,raw:e.join(`
62
+ `),sql:t}}function Re(e){let t=0;for(let n of e)if(n===` `||n===`-`||n===`>`)t++;else break;return t}function ze(e){let t=e.replace(/^[\s\d:]*->/,``).trim();if(!t||/^(GlobalStats|partitions|bytes):/i.test(t)||/^\w+=\d+/.test(t))return null;let n=t.match(/^([A-Z][A-Za-z_]+(?:\s+[A-Z][A-Za-z_]+)*)(?:\s+(\S+))?/);if(!n)return null;let r=n[1],i=n[2]||void 0,a=t.match(/estimated rows:\s*(\d+)/i);return{type:r,table:i,estimatedRows:a?parseInt(a[1],10):void 0}}var Be=class extends x{async execute(e,t){if(e&&typeof e==`object`&&typeof e.execute==`function`)try{let n=await e.execute();return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}if(!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);try{let n=await this.db.execute(e);return Array.isArray(n)?n.map(e=>this.convertNumericFields(e,t)):n}catch(t){let n=this.extractSqlFromQuery(e);throw console.error(`[Snowflake] Query execution failed:`,{error:t instanceof Error?t.message:String(t),sql:n.sql,params:n.params}),t}}extractSqlFromQuery(e){try{if(e&&typeof e.toSQL==`function`){let{sql:t,params:n}=e.toSQL();return{sql:t,params:n}}if(e&&typeof e.getSQL==`function`){let t=e.getSQL();if(t&&typeof t.toSQL==`function`){let{sql:e,params:n}=t.toSQL();return{sql:e,params:n}}}return{sql:String(e),params:[]}}catch{return{sql:`[unable to extract SQL]`,params:[]}}}convertNumericFields(e,t){if(!e||typeof e!=`object`)return e;let n={};for(let[r,i]of Object.entries(e))n[r]=t&&t.includes(r)?this.coerceToNumber(i):i;return n}coerceToNumber(e){if(e==null||typeof e==`number`)return e;if(typeof e==`bigint`)return Number(e);if(e&&typeof e==`object`){if(typeof e.toString==`function`){let t=e.toString();if(/^-?\d+(\.\d+)?$/.test(t))return t.includes(`.`)?parseFloat(t):parseInt(t,10)}return e}if(typeof e==`string`){if(/^-?\d+(\.\d+)?$/.test(e))return e.includes(`.`)?parseFloat(e):parseInt(e,10);if(!isNaN(parseFloat(e))&&isFinite(parseFloat(e)))return parseFloat(e)}return e}getEngineType(){return`snowflake`}async explainQuery(t,n,r){if(r?.analyze,!this.db.execute)throw Error(`Snowflake database instance must have an execute method`);let i=await this.db.execute(e.dt`${e.dt.raw(`EXPLAIN`)} ${C(t,n,`question`)}`),a=[];if(Array.isArray(i)){for(let e of i)if(e&&typeof e==`object`){let t=e.content||e[`QUERY PLAN`]||e.plan||Object.values(e)[0];typeof t==`string`&&a.push(t)}}return Le(a,{sql:t,params:n})}async getTableIndexes(e){return[]}};function Ve(e,t){return new Be(e,t,`snowflake`)}function He(e,t,n){if(n)switch(n){case`postgres`:return E(e,t);case`mysql`:return ye(e,t);case`sqlite`:return Ce(e,t);case`singlestore`:return Te(e,t);case`duckdb`:return Ae(e,t);case`databend`:return Fe(e,t);case`snowflake`:return Ve(e,t)}if(e.all&&e.run)return Ce(e,t);if(e.execute)return E(e,t);throw Error(`Unable to determine database engine type. Please specify engineType parameter.`)}function O(e,t){if(!t.joins)return e;for(let n of t.joins)switch(n.type||`left`){case`left`:e=e.leftJoin(n.table,n.on);break;case`inner`:e=e.innerJoin(n.table,n.on);break;case`right`:e=e.rightJoin(n.table,n.on);break;case`full`:e=e.fullJoin(n.table,n.on)}return e}function Ue(t,n,r,i){if(r.length===1){let[{outer:a,inner:o}]=r,s=t.db.select({pk:o}).from(n.from);return s=O(s,n),i.length>0&&(s=s.where(i.length===1?i[0]:e.it(...i))),e.dt`${a} IN ${s}`}let a=e.it(...r.map(({outer:t,inner:n})=>e.at(n,t)),...i),o=t.db.select({one:e.dt`1`}).from(n.from);return o=O(o,n),o=o.where(a),e.dt`EXISTS ${o}`}var k=class{databaseAdapter;constructor(e){this.databaseAdapter=e}buildTimeDimensionExpression(t,n,r){let i=e.nt(t,r);return n?this.databaseAdapter.buildTimeDimension(n,i):i instanceof e.lt?i:e.dt`${i}`}buildDateRangeCondition(e,t){return t?Array.isArray(t)?t.length===1&&typeof t[0]==`string`?this.buildStringDateRangeCondition(e,t[0]):this.buildArrayDateRangeCondition(e,t):typeof t==`string`?this.buildStringDateRangeCondition(e,t):null:null}rangeBetween(t,n,r){return e.it(e.ot(t,n),e.st(t,r))}endOfDayValue(t){let n=e.B(this.databaseAdapter,t);return n.setUTCHours(23,59,59,999),e.z(this.databaseAdapter,n)}buildArrayDateRangeCondition(t,n){if(n.length<2)return null;let r=this.normalizeDate(n[0]),i=this.normalizeDate(n[1]);return!r||!i?null:(e.V(n[1])&&(i=this.endOfDayValue(i)),this.rangeBetween(t,r,i))}buildStringDateRangeCondition(t,n){let r=this.parseRelativeDateRange(n);if(r){let n=e.z(this.databaseAdapter,r.start),i=e.z(this.databaseAdapter,r.end);return this.rangeBetween(t,n,i)}let i=this.normalizeDate(n);if(!i)return null;let a=e.B(this.databaseAdapter,i),o=new Date(a);o.setUTCHours(0,0,0,0);let s=new Date(a);return s.setUTCHours(23,59,59,999),this.rangeBetween(t,e.z(this.databaseAdapter,o),e.z(this.databaseAdapter,s))}parseRelativeDateRange(t){return e.U(t)}normalizeDate(t){return e.H(this.databaseAdapter,t)}};function A(t){if(t.length!==0)return t.length===1?t[0]:e.it(...t)}function j(e){if(`type`in e&&`filters`in e){let t=e;if(t.type===`and`||t.type===`or`)return{isAnd:t.type===`and`,filters:t.filters??[]}}return null}function M(e){let t=e.split(`.`);return t.length>1?t[1]:t[0]}function We(t){return{noMapping:({cubeName:n})=>e.K(`${t}.noBindingKeyMapping`,{cubeName:n}),keyDimNotFound:({bindingKey:n})=>e.K(`${t}.bindingKeyDimNotFound`,{bindingKey:n}),mappingDimNotFound:({dimension:n})=>e.K(`${t}.bindingKeyMappingDimNotFound`,{dimension:n})}}function N(e,t,n,r){if(!n)return e;let i=n.get(t);if(!i)throw Error(r.cubeNotFound({cubeName:t}));return i}function P(t,n,r,i,a){if(typeof t==`string`){let[o]=t.split(`.`),s=M(t),c=N(n,o,a,i).dimensions?.[s];if(!c)throw Error(i.keyDimNotFound({bindingKey:t,cubeName:o,dimName:s}));return e.nt(c.sql,r)}let o=t.find(e=>e.cube===n.name);if(!o)throw Error(i.noMapping({cubeName:n.name}));let s=M(o.dimension),c=N(n,o.cube,a,i).dimensions?.[s];if(!c)throw Error(i.mappingDimNotFound({dimension:o.dimension,cubeName:o.cube,dimName:s}));return e.nt(c.sql,r)}function Ge(t,n,r,i){if(typeof t==`string`){let[,a]=t.split(`.`),o=n.dimensions?.[a];if(!o)throw Error(e.K(`${i}.timeDimNotFound`,{timeDimension:t}));return e.nt(o.sql,r)}let a=t.find(e=>e.cube===n.name);if(!a)throw Error(e.K(`${i}.noTimeDimMapping`,{cubeName:n.name}));let[,o]=a.dimension.split(`.`),s=n.dimensions?.[o];if(!s)throw Error(e.K(`${i}.timeDimMappingNotFound`,{dimension:a.dimension}));return e.nt(s.sql,r)}var F=class{databaseAdapter;dateTimeBuilder;constructor(e,t){this.databaseAdapter=e,this.dateTimeBuilder=t}buildFilterCondition(t,n,r,i,a){if(a!==void 0){if(n!==`inDateRange`)throw Error(`dateRange can only be used with 'inDateRange' operator, but got '${n}'. Use explicit date values in the 'values' array for other date operators.`);if(i&&i.type!==`time`)throw Error(`dateRange can only be used on time dimensions, but field '${i.name||`unknown`}' has type '${i.type}'`);return this.dateTimeBuilder.buildDateRangeCondition(t,a)}if(e.L.has(n))return e.R(n,{fieldExpr:t,values:r??[],filteredValues:[],value:void 0,field:i,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder});if(!r||r.length===0)return n===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let o=r.filter(e=>!(e==null||e===``||typeof e==`string`&&e.includes(`\0`))).map(this.databaseAdapter.convertFilterValue);if(o.length===0)return n===`equals`?this.databaseAdapter.buildBooleanLiteral(!1):null;let s=o[0];return e.R(n,{fieldExpr:t,values:r,filteredValues:o,value:s,field:i,databaseAdapter:this.databaseAdapter,dateTimeBuilder:this.dateTimeBuilder})}buildLogicalFilter(e,t,n){return`and`in e&&e.and?this.combineFilters(e.and,!0,t,n):`or`in e&&e.or?this.combineFilters(e.or,!1,t,n):null}combineFilters(t,n,r,i){let a=t.map(e=>this.buildSingleFilter(e,r,i)).filter(e=>e!==null);return a.length===0?null:a.length===1?a[0]:n?e.it(...a):e.ct(...a)}buildSingleFilter(t,n,r){if(`and`in t||`or`in t)return this.buildLogicalFilter(t,n,r);let i=j(t);if(i)return this.combineFilters(i.filters,i.isAnd,n,r);let a=t,[o,s]=a.member.split(`.`),c=n.get(o);if(!c)return null;let l=c.dimensions?.[s];if(!l)return null;let u=e.tt(l,r);return this.buildFilterCondition(u,a.operator,a.values,l,a.dateRange)}};function Ke(e){let t=[],n=[];for(let[n,r]of e)r.inDegree===0&&t.push(n);for(;t.length>0;){let r=t.shift();n.push(r);for(let[n,i]of e)i.dependencies.has(r)&&(i.inDegree--,i.inDegree===0&&t.push(n))}return n}var I=class{dependencyGraph;cubes;constructor(e){this.cubes=e instanceof Map?e:new Map([[e.name,e]]),this.dependencyGraph=new Map}extractDependencies(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`);n.push({measureName:t,cubeName:e.trim(),fieldName:r.trim()})}else n.push({measureName:t,cubeName:null,fieldName:t})}return n}buildGraph(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=`${e.name}.${t}`,i=this.extractDependencies(n.calculatedSql),a=new Set;for(let t of i){let n=`${t.cubeName||e.name}.${t.fieldName}`;a.add(n)}this.dependencyGraph.set(r,{id:r,dependencies:a,inDegree:0})}this.calculateInDegrees()}buildGraphForMultipleCubes(e){for(let t of e.values())this.buildGraph(t)}calculateInDegrees(){for(let e of this.dependencyGraph.values())e.inDegree=0;for(let e of this.dependencyGraph.values())for(let t of e.dependencies){let e=this.dependencyGraph.get(t);e&&e.inDegree++}}topologicalSort(e){let t=this.buildSubgraph(e),n=Ke(t);if(n.length<t.size){let e=this.detectCycle();throw Error(`Circular dependency detected in calculated measures: ${e?e.join(` -> `):`unknown cycle`}`)}return n}buildSubgraph(e){let t=new Map;for(let n of e){let e=this.dependencyGraph.get(n);e&&t.set(n,{id:e.id,dependencies:new Set(e.dependencies),inDegree:0})}for(let e of t.values()){let n=0;for(let r of e.dependencies)t.has(r)&&n++;e.inDegree=n}return t}detectCycle(){let e=new Set,t=new Set,n=[];for(let r of this.dependencyGraph.keys())if(!e.has(r)){let i=this.dfs(r,e,t,n);if(i)return i}return null}dfs(e,t,n,r){t.add(e),n.add(e),r.push(e);let i=this.dependencyGraph.get(e);if(!i)return r.pop(),n.delete(e),null;for(let e of i.dependencies)if(!t.has(e)){let i=this.dfs(e,t,n,r);if(i)return i}else if(n.has(e)){let t=r.indexOf(e);return[...r.slice(t),e]}return r.pop(),n.delete(e),null}getAllDependencies(e){let t=new Set,n=new Set,r=e=>{if(n.has(e))return;n.add(e);let i=this.dependencyGraph.get(e);if(i)for(let e of i.dependencies)t.add(e),r(e)};return r(e),t}validateDependencies(e){for(let[t,n]of Object.entries(e.measures))if(n.type===`calculated`&&n.calculatedSql){let r=this.extractDependencies(n.calculatedSql);for(let n of r){let r=n.cubeName||e.name,i=this.cubes.get(r);if(!i)throw Error(`Calculated measure '${e.name}.${t}' references unknown cube '${r}'`);if(!i.measures[n.fieldName])throw Error(`Calculated measure '${e.name}.${t}' references unknown measure '${n.measureName}'`);if(r===e.name&&n.fieldName===t)throw Error(`Calculated measure '${e.name}.${t}' cannot reference itself`)}}}populateDependencies(e){for(let[,t]of Object.entries(e.measures))t.type===`calculated`&&t.calculatedSql&&!t.dependencies&&(t.dependencies=this.extractDependencies(t.calculatedSql).map(e=>e.measureName))}static isCalculatedMeasure(e){return e.type===`calculated`&&!!e.calculatedSql}};function qe(t,n){let{cube:r,allCubes:i,resolvedMeasures:a}=n,o=L(t),s=new Map;for(let t of o){let{originalRef:n,cubeName:o,fieldName:c}=t,l=o||r.name;if(!i.get(l))throw Error(e.K(`server.validation.template.substituteTargetCubeNotFound`,{ref:`{${n}}`,cubeName:l}));let u=`${l}.${c}`,d=a.get(u);if(!d)throw Error(e.K(`server.validation.template.substituteMeasureNotResolved`,{ref:`{${n}}`,measureName:u}));let f=d(),p=e.dt`${f}`;s.set(n,p)}let c=[],l=[],u=0;for(let e of o){let n=`{${e.originalRef}}`,r=t.indexOf(n,u);if(r>=0){c.push(t.substring(u,r));let i=s.get(e.originalRef);i&&l.push(i),u=r+n.length}}if(c.push(t.substring(u)),l.length===0)return e.dt.raw(t);let d=[];for(let t=0;t<c.length;t++)c[t]&&d.push(new e.ut(c[t])),t<l.length&&d.push(l[t]);return e.dt.join(d,e.dt.raw(``))}function L(e){if(e.length>1e3)return[];let t=e.matchAll(/\{([^}]+)\}/g),n=[];for(let e of t){let t=e[1].trim();if(t.includes(`.`)){let[e,r]=t.split(`.`).map(e=>e.trim());n.push({originalRef:t,cubeName:e,fieldName:r})}else n.push({originalRef:t,cubeName:null,fieldName:t})}return n}function Je(t){let n=[],r=0;for(let i=0;i<t.length;i++)if(t[i]===`{`)r++;else if(t[i]===`}`&&(r--,r<0)){n.push(e.K(`server.validation.template.unmatchedClosingBrace`,{position:i}));break}r>0&&n.push(e.K(`server.validation.template.unmatchedOpeningBrace`)),/\{\s*\}/.test(t)&&n.push(e.K(`server.validation.template.emptyReference`)),/\{[^}]*\{/.test(t)&&n.push(e.K(`server.validation.template.nestedBraces`));let i=L(t);for(let t of i){let r=t.cubeName?`${t.cubeName}.${t.fieldName}`:t.fieldName;/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(r)||n.push(e.K(`server.validation.template.invalidMemberReference`,{ref:`{${t.originalRef}}`})),r.split(`.`).length>2&&n.push(e.K(`server.validation.template.multipleDots`,{ref:`{${t.originalRef}}`}))}return{isValid:n.length===0,errors:n}}function R(e,t){let n=L(e),r=new Set;for(let e of n){let n=`${e.cubeName||t}.${e.fieldName}`;r.add(n)}return Array.from(r)}var z=class t{databaseAdapter;constructor(e){this.databaseAdapter=e}buildResolvedMeasures(e,t,n,r){let i=new Map,a=[],o=[],s=new Set(e),c=new I(t);for(let e of t.values())c.buildGraph(e);for(let n of e)this.classifyRequestedMeasure(n,t,c,a,o,s);for(let e of s)this.classifyDependencyMeasure(e,t,a,o);for(let e of a){let[a,o]=e.split(`.`),s=t.get(a),c=s.measures[o];if(r){let t=r(e,c,s);i.set(e,()=>t)}else i.set(e,()=>this.buildMeasureExpression(c,n,s))}if(o.length>0){let e=c.topologicalSort(o);for(let r of e){let[e,a]=r.split(`.`),o=t.get(e),s=o.measures[a];i.set(r,()=>this.buildCalculatedMeasure(s,o,t,i,n))}}return i}classifyRequestedMeasure(e,n,r,i,a,o){let[s,c]=e.split(`.`),l=n.get(s)?.measures?.[c];if(l){if(t.isPostAggregationWindow(l)){let e=t.getWindowBaseMeasure(l,s);e&&o.add(e);return}if(!I.isCalculatedMeasure(l)){i.push(e);return}a.push(e),this.collectCalculatedDependencies(e,l,s,n,r,o)}}collectCalculatedDependencies(e,t,n,r,i,a){R(t.calculatedSql,n).forEach(e=>a.add(e));for(let t of i.getAllDependencies(e)){let[e,n]=t.split(`.`),i=r.get(e)?.measures?.[n];i&&I.isCalculatedMeasure(i)&&R(i.calculatedSql,e).forEach(e=>a.add(e))}}classifyDependencyMeasure(e,n,r,i){let[a,o]=e.split(`.`),s=n.get(a)?.measures?.[o];s&&(t.isPostAggregationWindow(s)||(I.isCalculatedMeasure(s)?i.includes(e)||i.push(e):r.includes(e)||r.push(e)))}buildCalculatedMeasure(e,t,n,r,i){if(!e.calculatedSql)throw Error(`Calculated measure '${t.name}.${e.name}' missing calculatedSql property`);return qe(this.databaseAdapter.preprocessCalculatedTemplate(e.calculatedSql),{cube:t,allCubes:n,resolvedMeasures:r,queryContext:i})}buildCTECalculatedMeasure(t,n,r,i,a){if(!t.calculatedSql)throw Error(`Calculated measure '${n.name}.${t.name||`unknown`}' missing calculatedSql property`);let o=new Map,s=R(t.calculatedSql,n.name);for(let t of s){let[n,a]=t.split(`.`),s=i.get(n);if(s&&s.measures[a]){let n=s.measures[a];if(r.measures.includes(t)){let i=e.dt`${e.dt.identifier(r.cteAlias)}.${e.dt.identifier(a)}`,s=this.reAggregateCteColumn(n.type,i);o.set(t,()=>s)}}}return this.buildCalculatedMeasure(t,n,i,o,a)}reAggregateCteColumn(e,t){switch(e){case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return s(t);case`max`:return o(t);default:return a(t)}}buildHavingMeasureExpression(e,t,n,r,i){let a=i?.preAggregationCTEs?.find(t=>t.cube.name===e);return a&&a.measures.includes(`${e}.${t}`)&&i?this.buildHavingCteMeasure(e,t,n,r,i,a):this.buildMeasureExpression(n,r)}buildHavingCteMeasure(t,n,r,i,a,o){if(r.type===`calculated`&&r.calculatedSql){let e=a.primaryCube.name===t?a.primaryCube:a.joinCubes?.find(e=>e.cube.name===t)?.cube;if(!e)throw Error(`Cube ${t} not found in query plan`);let n=new Map([[a.primaryCube.name,a.primaryCube]]);if(a.joinCubes)for(let e of a.joinCubes)n.set(e.cube.name,e.cube);return this.buildCTECalculatedMeasure(r,e,o,n,i)}let s=e.dt`${e.dt.identifier(o.cteAlias)}.${e.dt.identifier(n)}`;return this.reAggregateCteColumn(r.type,s)}buildMeasureExpression(n,r,i){if(n.type===`calculated`)throw Error(`Cannot build calculated measure '${n.name}' directly. Use buildCalculatedMeasure instead.`);if(t.isPostAggregationWindow(n))throw Error(`Post-aggregation window measure '${n.name}' should be built via buildPostAggregationWindowExpression, not buildMeasureExpression.`);if(!n.sql)throw Error(`Measure '${n.name}' of type '${n.type}' is missing required 'sql' property. Only calculated measures and post-aggregation window functions can omit 'sql'.`);let a=e.nt(n.sql,r);if(r.ungrouped)return a;let o=this.applyMeasureFilters(n,a,r);return this.applyAggregation(n,o,r,i)}applyMeasureFilters(t,n,r){if(!t.filters||t.filters.length===0)return n;let i=t.filters.map(t=>{let n=t(r);return n?e.dt`(${n})`:void 0}).filter(Boolean);if(i.length===0)return n;let a=i.length===1?i[0]:e.it(...i);return this.databaseAdapter.buildCaseWhen([{when:a,then:n}])}applyAggregation(e,t,n,c){switch(e.type){case`count`:return r(t);case`countDistinct`:return i(t);case`sum`:return a(t);case`avg`:return this.databaseAdapter.buildAvg(t);case`min`:return s(t);case`max`:return o(t);case`number`:return t;case`stddev`:case`stddevSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildStddev(t,e.type===`stddevSamp`||e.statisticalConfig?.useSample));case`variance`:case`varianceSamp`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildVariance(t,e.type===`varianceSamp`||e.statisticalConfig?.useSample));case`percentile`:case`median`:case`p95`:case`p99`:return this.buildStatistical(e,t,()=>this.databaseAdapter.buildPercentile(t,this.resolvePercentile(e)));case`lag`:case`lead`:case`rank`:case`denseRank`:case`rowNumber`:case`ntile`:case`firstValue`:case`lastValue`:case`movingAvg`:case`movingSum`:return this.buildWindowMeasure(e,t,n,c);default:return r(t)}}buildStatistical(t,n,r){let i=r();return i===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),e.dt`MAX(NULL)`):i}resolvePercentile(e){switch(e.type){case`median`:return 50;case`p95`:return 95;case`p99`:return 99;default:return e.statisticalConfig?.percentile??50}}buildWindowMeasure(t,n,r,i){let a=t.windowConfig||{},o=this.resolveWindowPartitions(a,r,i),s=this.resolveWindowOrder(a,r,i),c=this.databaseAdapter.buildWindowFunction(t.type,[`rank`,`denseRank`,`rowNumber`].includes(t.type)?null:n,o,s,{offset:a.offset,defaultValue:a.defaultValue,nTile:a.nTile,frame:a.frame});return c===null?(console.warn(`[drizzle-cube] ${t.type} not supported on ${this.databaseAdapter.getEngineType()}, returning NULL`),e.dt`NULL`):c}resolveWindowPartitions(t,n,r){if(!t.partitionBy||t.partitionBy.length===0||!r)return;let i=t.partitionBy.map(t=>{let i=t.includes(`.`)?t.split(`.`)[1]:t,a=r.dimensions?.[i];return a?e.nt(a.sql,n):(console.warn(`[drizzle-cube] Window function partition dimension '${t}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);return i.length>0?i:void 0}resolveWindowOrder(t,n,r){if(!t.orderBy||t.orderBy.length===0||!r)return;let i=t.orderBy.map(t=>{let i=t.field.includes(`.`)?t.field.split(`.`)[1]:t.field,a=r.dimensions?.[i];if(a)return{field:e.nt(a.sql,n),direction:t.direction};let o=r.measures?.[i];return o&&o.sql?{field:e.nt(o.sql,n),direction:t.direction}:(console.warn(`[drizzle-cube] Window function order field '${t.field}' not found in cube '${r.name}'`),null)}).filter(e=>e!==null);return i.length>0?i:void 0}static WINDOW_FUNCTION_TYPES=e.A;static isWindowFunction(t){return e.I(t)}static categorizeMeasures(e,n){let r=[],i=[];for(let a of e){let[e,o]=a.split(`.`),s=n.get(e);if(s?.measures?.[o]){let e=s.measures[o];t.isWindowFunction(e.type)?r.push(a):i.push(a)}}return{windowMeasures:r,aggregateMeasures:i}}static hasWindowFunctions(e,n){let{windowMeasures:r}=t.categorizeMeasures(e,n);return r.length>0}static isPostAggregationWindow(t){return e.F(t)}static getWindowBaseMeasure(t,n){return e.N(t,n)}static getDefaultWindowOperation(t){return e.M(t)}static categorizeForPostAggregation(t,n){return e.j(t,n)}static hasPostAggregationWindows(t,n){return e.P(t,n)}},Ye=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=e}isWindowFunctionType(e){return[`lag`,`lead`,`rank`,`denseRank`,`rowNumber`,`ntile`,`firstValue`,`lastValue`,`movingAvg`,`movingSum`].includes(e)}isAggregateFunctionType(e){return[`count`,`countDistinct`,`sum`,`avg`,`min`,`max`,`stddev`,`stddevSamp`,`variance`,`varianceSamp`,`median`,`p95`,`p99`,`percentile`,`number`].includes(e)}buildGroupByFields(e,t,n,r){if(t.ungrouped)return[];let i=[],a=e instanceof Map?e:new Map([[e.name,e]]),o=t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0,s=t.measures&&t.measures.length>0,c=o&&!s;if(!this.hasAggregateMeasures(t,a)&&!c)return[];for(let e of t.dimensions||[]){let t=this.resolveDimensionGroupField(e,a,n,r);t&&i.push(t)}for(let e of t.timeDimensions||[]){let t=this.resolveTimeDimensionGroupField(e,a,n,r);t&&i.push(t)}return this.addCorrelationKeys(t,a,i),i}addCorrelationKeys(e,t,n){let r=new Set;for(let i of e.dimensions||[]){let[e,a]=i.split(`.`),o=t.get(e)?.dimensions?.[a]?.correlatesOn;o&&!r.has(o)&&(r.add(o),n.push(o))}}hasAggregateMeasures(e,t){for(let n of e.measures||[]){let[e,r]=n.split(`.`),i=t.get(e)?.measures?.[r];if(i&&(this.isAggregateFunctionType(i.type)||i.type===`calculated`||this.isWindowOverAggregate(i,e,t)))return!0}return!1}isWindowOverAggregate(e,t,n){if(!z.isPostAggregationWindow(e))return!1;let r=z.getWindowBaseMeasure(e,t);if(!r)return!1;let[i,a]=r.split(`.`),o=n.get(i)?.measures?.[a];return!!o&&this.isAggregateFunctionType(o.type)}resolveDimensionGroupField(t,n,r,i){let[a,o]=t.split(`.`),s=n.get(a);if(!s?.dimensions?.[o])return null;let c=i?.preAggregationCTEs?.find(e=>e.cube.name===a);if(c){let t=c.joinKeys.find(e=>e.targetColumn===o);return t&&t.sourceColumnObj?t.sourceColumnObj:e.dt`${e.dt.identifier(c.cteAlias)}.${e.dt.identifier(o)}`}return e.nt(s.dimensions[o].sql,r)}resolveTimeDimensionGroupField(t,n,r,i){let[a,o]=t.dimension.split(`.`),s=n.get(a);if(!s?.dimensions?.[o])return null;let c=i?.preAggregationCTEs?.find(e=>e.cube.name===a);if(c){let n=c.joinKeys.find(e=>e.targetColumn===o);return n&&n.sourceColumnObj?this.dateTimeBuilder.buildTimeDimensionExpression(n.sourceColumnObj,t.granularity,r):e.dt`${e.dt.identifier(c.cteAlias)}.${e.dt.identifier(o)}`}return this.dateTimeBuilder.buildTimeDimensionExpression(s.dimensions[o].sql,t.granularity,r)}},Xe=class{dateTimeBuilder;filterBuilder;groupByBuilder;measureBuilder;constructor(e){this.dateTimeBuilder=new k(e),this.filterBuilder=new F(e,this.dateTimeBuilder),this.groupByBuilder=new Ye(this.dateTimeBuilder),this.measureBuilder=new z(e)}buildResolvedMeasures(e,t,n,r){return this.measureBuilder.buildResolvedMeasures(e,t,n,r)}buildSelections(t,n,i){let a={},o=t instanceof Map?t:new Map([[t.name,t]]);if(n.dimensions)for(let t of n.dimensions){let[n,r]=t.split(`.`),s=o.get(n);if(s&&s.dimensions&&s.dimensions[r]){let n=s.dimensions[r],o=e.nt(n.sql,i);a[t]=e.dt`${o}`.as(t)}}if(n.measures){let t=this.buildResolvedMeasures(n.measures,o,i);for(let r of n.measures){let n=t.get(r);if(n&&typeof n==`function`){let t=n();a[r]=e.dt`${t}`.as(r)}}}if(n.timeDimensions)for(let t of n.timeDimensions){let[n,r]=t.dimension.split(`.`),s=o.get(n);if(s&&s.dimensions&&s.dimensions[r]){let n=s.dimensions[r],o=this.buildTimeDimensionExpression(n.sql,t.granularity,i);a[t.dimension]=e.dt`${o}`.as(t.dimension)}}return Object.keys(a).length===0&&(a.count=r()),a}buildCalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCalculatedMeasure(e,t,n,r,i)}buildCTECalculatedMeasure(e,t,n,r,i){return this.measureBuilder.buildCTECalculatedMeasure(e,t,n,r,i)}buildHavingMeasureExpression(e,t,n,r,i){return this.measureBuilder.buildHavingMeasureExpression(e,t,n,r,i)}buildMeasureExpression(e,t,n){return this.measureBuilder.buildMeasureExpression(e,t,n)}buildTimeDimensionExpression(e,t,n){return this.dateTimeBuilder.buildTimeDimensionExpression(e,t,n)}buildWhereConditions(e,t,n,r,i){let a=[],o=e instanceof Map?e:new Map([[e.name,e]]),s=new Set;if(t.filters&&t.filters.length>0)for(let e of t.filters)this.appendWhereFilter(e,o,n,r,i,s,a);if(t.timeDimensions)for(let e of t.timeDimensions)this.appendTimeDimensionWhere(e,o,n,r,a);return a}appendWhereFilter(e,t,n,r,i,a,o){if(i&&`member`in e){let[n]=e.member.split(`.`);if(this.cubeIsInCTE(n,r))return;if(t.has(n)&&i.has(n)&&!a.has(n)){o.push(...i.get(n)),a.add(n);return}if(a.has(n))return}let s=this.processFilter(e,t,n,`where`,r);s&&o.push(s)}appendTimeDimensionWhere(t,n,r,i,a){let[o,s]=t.dimension.split(`.`),c=n.get(o);if(!c||!c.dimensions[s]||!t.dateRange||this.cubeIsInCTE(o,i))return;if(r.filterCache){let n=e.Z(t.dimension,t.dateRange),i=r.filterCache.get(n);if(i){a.push(i);return}}let l=c.dimensions[s],u=e.nt(l.sql,r),d=this.buildDateRangeCondition(u,t.dateRange);d&&a.push(d)}cubeIsInCTE(e,t){return!!t?.preAggregationCTEs?.some(t=>t.cube.name===e)}buildHavingConditions(e,t,n,r){let i=[],a=e instanceof Map?e:new Map([[e.name,e]]);if(t.filters&&t.filters.length>0)for(let e of t.filters){let t=this.processFilter(e,a,n,`having`,r);t&&i.push(t)}return i}processFilter(t,n,r,i,a){if(`and`in t||`or`in t){let o=t;if(o.and){let t=o.and.map(e=>this.processFilter(e,n,r,i,a)).filter(e=>e!==null);return t.length>0?e.it(...t):null}if(o.or){if(i===`where`&&this.orNeedsSemiJoins(o.or,n,a))return this.buildFilterWithSemiJoins(o,n,r,a);let t=o.or.map(e=>this.processFilter(e,n,r,i,a)).filter(e=>e!==null);return t.length>0?e.ct(...t):null}}let o=t,[s,c]=o.member.split(`.`),l=n.get(s);if(!l)return null;let u=l.dimensions[c],d=l.measures[c],f=u||d;if(!f)return null;if(i===`where`&&u)return this.processWhereDimensionFilter(t,o,u,f,s,r,a);if(i===`where`&&d)return null;if(i===`having`&&d){let e=this.buildHavingMeasureExpression(s,c,d,r,a);return this.buildFilterCondition(e,o.operator,o.values,f,o.dateRange)}return null}isCubeInScope(e,t,n){return t.has(e)&&!this.cubeIsInCTE(e,n)}orNeedsSemiJoins(t,n,r){let i=new Set(e.Y(t).map(e=>e.member.split(`.`)[0]));if(i.size<2)return!1;let a=[...i].filter(e=>this.isCubeInScope(e,n,r));return a.length>0&&a.length<i.size}buildFilterWithSemiJoins(t,n,r,i){if(`and`in t||`or`in t){let a=t,o=(a.and??a.or??[]).map(e=>this.buildFilterWithSemiJoins(e,n,r,i)).filter(e=>e!==null);return o.length===0?null:o.length===1?o[0]:a.and?e.it(...o):e.ct(...o)}let a=t,[o]=a.member.split(`.`);return this.isCubeInScope(o,n,i)?this.processFilter(a,n,r,`where`,i):this.buildSemiJoinLeaf(a,n,r,i)}buildSemiJoinLeaf(t,n,r,i){let[a,o]=t.member.split(`.`),s=this.knownCubes(n,i);if(s.get(a)?.measures?.[o])return null;let c=this.findSemiJoinPath(a,n,s,i);if(!c)throw Error(e.K(`server.errors.crossCubeOrFilterUnsupported`,{member:t.member,cubeName:a,contextCube:[...n.keys()].filter(e=>this.isCubeInScope(e,n,i)).join(`, `)}));let l=c[c.length-1].cube,u=this.buildWhereConditions(new Map([[l.name,l]]),{filters:[t]},r);if(u.length===0)return null;let d=null;for(let e=c.length-1;e>=0;e--){let{cube:t,keyPairs:n}=c[e],i=t.sql(r),a=d?[d]:u;d=Ue(r,i,n,i.where?[i.where,...a]:a)}return d}knownCubes(e,t){let n=new Map(e);if(t){let e=[t.primaryCube,...(t.joinCubes??[]).map(e=>e.cube),...(t.preAggregationCTEs??[]).map(e=>e.cube)];for(let t of e)n.has(t.name)||n.set(t.name,t)}return n}findSemiJoinPath(t,n,r,i){let a=i?.preAggregationCTEs?.find(e=>e.cube.name===t);if(a&&!(a.intermediateJoins&&a.intermediateJoins.length>0)){let e=[];for(let t of a.joinKeys)t.sourceColumnObj&&t.targetColumnObj&&e.push({outer:t.sourceColumnObj,inner:t.targetColumnObj});if(e.length>0&&e.length===a.joinKeys.length)return[{cube:a.cube,keyPairs:e}]}let o=new e.q(r),s=null;for(let e of n.keys()){if(!this.isCubeInScope(e,n,i))continue;let r=o.findPath(e,t);r&&r.length>0&&(!s||r.length<s.length)&&(s=r)}if(!s)return null;let c=[];for(let t of s){let n=r.get(t.toCube)??(t.reversed?null:e.et(t.joinDef.targetCube,r));if(!n||!Ze(t.joinDef))return null;c.push({cube:n,keyPairs:t.joinDef.on.map(e=>t.reversed?{outer:e.target,inner:e.source}:{outer:e.source,inner:e.target})})}return c}processWhereDimensionFilter(t,n,r,i,a,o,s){if(this.cubeIsInCTE(a,s))return null;let c=r.type===`time`;if(o.filterCache){let n=e.X(t),r=o.filterCache.get(n);if(r)return r}let l=c?e.nt(r.sql,o):typeof r.sql==`function`?r.sql(o):r.sql;return this.buildFilterCondition(l,n.operator,n.values,i,n.dateRange)}buildFilterCondition(e,t,n,r,i){return this.filterBuilder.buildFilterCondition(e,t,n,r,i)}buildDateRangeCondition(e,t){return this.dateTimeBuilder.buildDateRangeCondition(e,t)}buildGroupByFields(e,t,n,r){return this.groupByBuilder.buildGroupByFields(e,t,n,r)}buildOrderBy(r,i){let a=[],o=i||[...r.measures||[],...r.dimensions||[],...r.timeDimensions?.map(e=>e.dimension)||[]];if(r.order&&Object.keys(r.order).length>0)for(let[i,s]of Object.entries(r.order)){if(!o.includes(i))throw Error(`Cannot order by '${i}': field is not selected in the query`);let r=s===`desc`?n(e.dt.identifier(i)):t(e.dt.identifier(i));a.push(r)}if(r.timeDimensions&&r.timeDimensions.length>0){let n=new Set(Object.keys(r.order||{})),i=[...r.timeDimensions].sort((e,t)=>e.dimension.localeCompare(t.dimension));for(let r of i)n.has(r.dimension)||a.push(t(e.dt.identifier(r.dimension)))}return a}collectNumericFields(e,t){let n=[],r=e instanceof Map?e:new Map([[e.name,e]]);if(t.measures&&n.push(...t.measures),t.dimensions)for(let e of t.dimensions){let[t,i]=e.split(`.`),a=r.get(t);if(a){let t=a.dimensions[i];t&&t.type===`number`&&n.push(e)}}return n}applyLimitAndOffset(e,t){let n=t.limit;t.offset!==void 0&&t.offset>0&&n===void 0&&(n=50);let r=e;if(n!==void 0){if(n<0)throw Error(`Limit must be non-negative`);r=r.limit(n)}if(t.offset!==void 0){if(t.offset<0)throw Error(`Offset must be non-negative`);r=r.offset(t.offset)}return r}buildFilterConditionPublic(e,t,n,r,i){return this.buildFilterCondition(e,t,n,r,i)}buildLogicalFilter(e,t,n){return this.filterBuilder.buildLogicalFilter(e,t,n)}};function Ze(e){return e.relationship!==`belongsToMany`&&e.on.length>0&&e.on.every(e=>!e.as)}var Qe=class{queryBuilder;constructor(e){this.queryBuilder=e}buildPreAggregationCTE(t,n,r,i,a){let o=t.cube,s=o.sql(r),c=!!(t.intermediateJoins&&t.intermediateJoins.length>0),l=this.buildCTESelections(t,o,n,r,c);if(Object.keys(l).length===0)return null;let u=r.db.select(l).from(s.from);u=O(u,s),u=this.applyIntermediateJoins(u,t,r,c);let d=this.buildCTEWhereConditions(t,o,n,r,i,a,s);if(d.length>0){let t=d.length===1?d[0]:e.it(...d);u=u.where(t)}let f=this.buildCTEGroupByFields(t,o,n,r,c);return f.length>0&&(u=u.groupBy(...f)),r.db.$with(t.cteAlias).as(u)}buildCTESelections(e,t,n,r,i){let a={};return this.addJoinKeySelections(a,e,t,i),this.addDownstreamKeySelections(a,e),this.addMeasureSelections(a,e,t,r),this.addDimensionSelections(a,t,n,r),a}addJoinKeySelections(t,n,r,i){if(i&&n.intermediateJoins){let e=n.intermediateJoins[0].primaryJoinColumn;e&&(t[e.name]=e);return}for(let i of n.joinKeys)if(i.targetColumnObj){t[i.targetColumn]=i.targetColumnObj;for(let[n,a]of Object.entries(r.dimensions||{}))a.sql===i.targetColumnObj&&n!==i.targetColumn&&(t[n]=e.dt`${i.targetColumnObj}`.as(n))}}addDownstreamKeySelections(e,t){if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&(e[t.sourceColumn]=t.sourceColumnObj)}addMeasureSelections(t,n,r,i){let a=new Map([[r.name,r]]),o=this.queryBuilder.buildResolvedMeasures(n.measures,a,i);for(let r of n.measures){let[,n]=r.split(`.`),i=o.get(r);i&&(t[n]=e.dt`${i()}`.as(n))}}addDimensionSelections(t,n,r,i){let a=n.name;for(let o of r.dimensions||[]){let[r,s]=o.split(`.`);if(r===a&&n.dimensions?.[s]){let r=this.queryBuilder.buildMeasureExpression({sql:n.dimensions[s].sql,type:`number`},i);t[s]=e.dt`${r}`.as(s)}}for(let o of r.timeDimensions||[]){let[r,s]=o.dimension.split(`.`);if(r===a&&n.dimensions?.[s]){let r=this.queryBuilder.buildTimeDimensionExpression(n.dimensions[s].sql,o.granularity,i);t[s]=e.dt`${r}`.as(s)}}}applyIntermediateJoins(t,n,r,i){if(!i||!n.intermediateJoins)return t;let a=[...n.intermediateJoins].reverse();for(let n of a){let i=n.cube.sql(r),a=[e.at(n.cteJoinColumn,n.joinDef.on[0]?.target)];i.where&&a.push(i.where),t=t.leftJoin(i.from,e.it(...a))}return t}buildCTEWhereConditions(e,t,n,r,i,a,o){let s=i?{...i,preAggregationCTEs:i.preAggregationCTEs?.filter(e=>e.cube.name!==t.name)}:void 0,c=this.queryBuilder.buildWhereConditions(t,n,r,s,a),l=this.buildCTETimeFilters(e,t,n,r),u=[];return o.where&&u.push(o.where),u.push(...c,...l),u}buildCTETimeFilters(e,t,n,r){let i=t.name,a=[];for(let e of n.timeDimensions||[]){let[n,o]=e.dimension.split(`.`);if(n===i&&t.dimensions?.[o]&&e.dateRange){let n=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[o].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(n,e.dateRange);i&&a.push(i)}}for(let e of n.filters||[]){if(`and`in e||`or`in e||!(`member`in e)||!(`operator`in e))continue;let n=e,[o,s]=n.member.split(`.`);if(o===i&&t.dimensions?.[s]&&n.operator===`inDateRange`){let e=this.queryBuilder.buildMeasureExpression({sql:t.dimensions[s].sql,type:`number`},r),i=this.queryBuilder.buildDateRangeCondition(e,n.dateRange??n.values);i&&a.push(i)}}for(let t of e.propagatingFilters||[]){let e=this.buildPropagatingFilterSubquery(t,r);e&&a.push(e)}return a}buildCTEGroupByFields(t,n,r,i,a){let o=n.name,s=[],c=new Set;this.addJoinKeyGroupBy(e=>{let t=e?.name||(typeof e==`string`?e:null);t&&!c.has(t)?(c.add(t),s.push(e)):t||s.push(e)},t,a);for(let t of r.dimensions||[]){let[r,a]=t.split(`.`);r===o&&n.dimensions?.[a]&&s.push(e.nt(n.dimensions[a].sql,i))}for(let e of r.timeDimensions||[]){let[t,r]=e.dimension.split(`.`);t===o&&n.dimensions?.[r]&&s.push(this.queryBuilder.buildTimeDimensionExpression(n.dimensions[r].sql,e.granularity,i))}return s}addJoinKeyGroupBy(e,t,n){if(n&&t.intermediateJoins){let n=t.intermediateJoins[0];n.primaryJoinColumn&&e(n.primaryJoinColumn)}else for(let n of t.joinKeys)n.targetColumnObj&&e(n.targetColumnObj);if(t.downstreamJoinKeys)for(let n of t.downstreamJoinKeys)for(let t of n.joinKeys)t.sourceColumnObj&&e(t.sourceColumnObj)}buildCTEJoinCondition(t,n,r){let i=r.preAggregationCTEs?.find(e=>e.cube.name===t.cube.name);if(!i)throw Error(`CTE info not found for cube ${t.cube.name}`);let a=[];if(i.intermediateJoins&&i.intermediateJoins.length>0){let t=i.intermediateJoins[0],o=this.resolveCTEJoinSourceColumn(i.joinKeys[0],i,r),s=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(t.primaryJoinColumn.name)}`;a.push(e.at(o,s))}else for(let t of i.joinKeys){let o=this.resolveCTEJoinSourceColumn(t,i,r),s=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(t.targetColumn)}`;a.push(e.at(o,s))}return a.length===1?a[0]:e.it(...a)}resolveCTEJoinSourceColumn(t,n,r){if(!t)throw Error(`Missing join key while building CTE join condition for '${n.cube.name}'`);let i=t.sourceColumnObj||e.dt.identifier(t.sourceColumn);if(!t.sourceColumnObj||!r.preAggregationCTEs)return i;for(let i of r.preAggregationCTEs)if(i.cube.name!==n.cube.name){for(let[n,r]of Object.entries(i.cube.dimensions||{}))if(typeof r.sql!=`function`&&r.sql===t.sourceColumnObj)return e.dt`${e.dt.identifier(i.cteAlias)}.${e.dt.identifier(n)}`}return i}buildPropagatingFilterSubquery(e,t){let n=e.sourceCube,r=n.sql(t),i=[];if(r.where&&i.push(r.where),e.preBuiltFilterSQL)i.push(e.preBuiltFilterSQL);else{let r={filters:e.filters},a=new Map([[n.name,n]]),o=this.queryBuilder.buildWhereConditions(a,r,t);i.push(...o)}return i.length===0?null:Ue(t,r,e.joinConditions.map(({source:e,target:t})=>({outer:t,inner:e})),i)}};function $e(e,t){let n=et(e);return{measures:nt(t,n),dimensions:rt(t,n),segments:{},timeDimensions:it(t,n)}}function et(e){let t=[e.primaryCube].filter(Boolean);if(e.joinCubes&&e.joinCubes.length>0&&t.push(...e.joinCubes.map(e=>e.cube).filter(Boolean)),e.multiFactMerge?.groups?.length)for(let n of e.multiFactMerge.groups)n.queryPlan.primaryCube&&t.push(n.queryPlan.primaryCube),n.queryPlan.joinCubes?.length&&t.push(...n.queryPlan.joinCubes.map(e=>e.cube).filter(Boolean));return t}function tt(e,t,n){return e.find(e=>e?.name===t)?.dimensions?.[n]}function nt(e,t){let n={};if(!e.measures)return n;for(let r of e.measures){let[e,i]=r.split(`.`),a=t.find(t=>t?.name===e)?.measures?.[i];a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function rt(e,t){let n={};if(!e.dimensions)return n;for(let r of e.dimensions){let[e,i]=r.split(`.`),a=tt(t,e,i);a&&(n[r]={title:a.title||i,shortTitle:a.title||i,type:a.type})}return n}function it(e,t){let n={};if(!e.timeDimensions)return n;for(let r of e.timeDimensions){let[e,i]=r.dimension.split(`.`),a=tt(t,e,i);a&&(n[r.dimension]={title:a.title||i,shortTitle:a.title||i,type:a.type,granularity:r.granularity})}return n}var at=1e4;function ot(e,t,n){let r=[],i=B(new Date(e),n),a=B(new Date(t),n);for(;i<=a&&r.length<1e4;)r.push(new Date(i)),i=st(i,n);return r}function B(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCMilliseconds(0);break;case`minute`:n.setUTCSeconds(0,0);break;case`hour`:n.setUTCMinutes(0,0,0);break;case`day`:n.setUTCHours(0,0,0,0);break;case`week`:{let e=n.getUTCDay(),t=e===0?6:e-1;n.setUTCDate(n.getUTCDate()-t),n.setUTCHours(0,0,0,0);break}case`month`:n.setUTCDate(1),n.setUTCHours(0,0,0,0);break;case`quarter`:{let e=Math.floor(n.getUTCMonth()/3)*3;n.setUTCMonth(e,1),n.setUTCHours(0,0,0,0);break}case`year`:n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)}return n}function st(e,t){let n=new Date(e);switch(t){case`second`:n.setUTCSeconds(n.getUTCSeconds()+1);break;case`minute`:n.setUTCMinutes(n.getUTCMinutes()+1);break;case`hour`:n.setUTCHours(n.getUTCHours()+1);break;case`day`:n.setUTCDate(n.getUTCDate()+1);break;case`week`:n.setUTCDate(n.getUTCDate()+7);break;case`month`:n.setUTCMonth(n.getUTCMonth()+1);break;case`quarter`:n.setUTCMonth(n.getUTCMonth()+3);break;case`year`:n.setUTCFullYear(n.getUTCFullYear()+1)}return n}function ct(e,t){let n=null;if(e instanceof Date)n=e;else if(typeof e==`string`){let t=new Date(e);isNaN(t.getTime())||(n=t)}return!n||isNaN(n.getTime())?null:B(n,t).toISOString()}function lt(e,t){return t.length===0?`__all__`:t.map(t=>String(e[t]??``)).join(`|||`)}function ut(e,t){let{timeDimensionKey:n,granularity:r,dateRange:i,dimensions:a}=t,o=ot(i[0],i[1],r);if(o.length===0)return e;if(o.length>=1e4)return console.warn(`[drizzle-cube] Skipping gap filling for "${n}": the ${r} range exceeds the ${at}-bucket limit. Returning unfilled data.`),e;let s=dt(e,n,r,a),c=[];for(let[e,n]of s){let e=n.size>0?n.values().next().value:null;for(let r of o){let i=r.toISOString(),a=n.get(i);c.push(a??ft(i,e??null,t))}}return c}function dt(e,t,n,r){let i=new Map;for(let a of e){let e=lt(a,r),o=ct(a[t],n)??String(a[t]),s=i.get(e);s||(s=new Map,i.set(e,s)),s.set(o,a)}return i.size===0&&r.length===0&&i.set(`__all__`,new Map),i}function ft(e,t,n){let{timeDimensionKey:r,fillValue:i,measures:a,dimensions:o}=n,s={[r]:e};if(t)for(let e of o)s[e]=t[e];for(let e of a)s[e]=i;return s}function V(t){if(!t)return null;if(Array.isArray(t)){if(t.length<2)return null;let e=new Date(t[0]),n=new Date(t[1]);return isNaN(e.getTime())||isNaN(n.getTime())?null:[e,n]}let n=e.W(t);if(n)return[n.start,n.end];let r=new Date(t);return isNaN(r.getTime())?null:[r,r]}function pt(e,t,n){if(!t.timeDimensions||t.timeDimensions.length===0)return e;let r=t.timeDimensions.filter(e=>{let n=e.fillMissingDates!==!1,r=!!e.granularity,i=e.dateRange||H(e.dimension,t.filters);return n&&r&&i});if(r.length===0)return e;let i=t.fillMissingDatesValue===void 0?0:t.fillMissingDatesValue,a=new Set(t.timeDimensions.map(e=>e.dimension)),o=(t.dimensions||[]).filter(e=>!a.has(e)),s=e;for(let e of r){let r=V(e.dateRange)||mt(e.dimension,t.filters);if(!r)continue;let a={timeDimensionKey:e.dimension,granularity:e.granularity,dateRange:r,fillValue:i,measures:n,dimensions:o};s=ut(s,a)}return s}function H(e,t){if(!t)return null;for(let n of t){if(`member`in n&&`operator`in n&&n.member===e&&n.operator===`inDateRange`)return n;if(`and`in n&&n.and){let t=H(e,n.and);if(t)return t}if(`or`in n&&n.or){let t=H(e,n.or);if(t)return t}}return null}function mt(t,n){let r=H(t,n);if(!r)return null;if(r.dateRange){let e=V(r.dateRange);if(e)return e}let i=r.values;if(!i||i.length===0)return null;if(i.length===1&&typeof i[0]==`string`){let t=e.W(i[0]);return t?[t.start,t.end]:V(i)}return i.length>=2?V(i):null}function ht(e,t,n){return pt(Array.isArray(e)?e.map(e=>{let r={...e};if(t.timeDimensions){for(let e of t.timeDimensions)if(e.dimension in r){let t=r[e.dimension];if(typeof t==`string`&&t.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/)){let e=t.replace(` `,`T`),n=!e.endsWith(`Z`)&&!e.includes(`+`)?e+`Z`:e;t=new Date(n)}t=n.convertTimeDimensionResult(t),r[e.dimension]=t}}return r}):[e],t,t.measures||[])}var gt=class{queryBuilder;constructor(e){this.queryBuilder=e}preload(t,n,r,i){if(t.filters&&t.filters.length>0)for(let a of e.Y(t.filters))this.preloadRegularFilter(a,n,r,i);if(t.timeDimensions)for(let e of t.timeDimensions)this.preloadTimeDimensionFilter(e,n,r,i)}resolveMemberDimension(e,t){let[n,r]=e.split(`.`),i=t.get(n);return i?i.dimensions?.[r]??null:null}preloadRegularFilter(t,n,r,i){let a=e.X(t);if(n.has(a))return;let o=this.resolveMemberDimension(t.member,r);if(!o||[`arrayContains`,`arrayOverlaps`,`arrayContained`].includes(t.operator))return;let s=e.tt(o,i),c=this.queryBuilder.buildFilterConditionPublic(s,t.operator,t.values,o,t.dateRange);c&&n.set(a,c)}preloadTimeDimensionFilter(t,n,r,i){if(!t.dateRange)return;let a=e.Z(t.dimension,t.dateRange);if(n.has(a))return;let o=this.resolveMemberDimension(t.dimension,r);if(!o)return;let s=e.nt(o.sql,i),c=this.queryBuilder.buildDateRangeCondition(s,t.dateRange);c&&n.set(a,c)}},_t=class{builders;constructor(e){this.builders=e}resolveMode(t){let n=[];if(this.builders.comparison.hasComparison(t)&&n.push(`comparison`),this.builders.funnel.hasFunnel(t)&&n.push(`funnel`),this.builders.flow.hasFlow(t)&&n.push(`flow`),this.builders.retention.hasRetention(t)&&n.push(`retention`),n.length===0)return`regular`;if(n.length>1)throw Error(e.K(`server.errors.queryContainsMultipleModes`,{modes:n.join(`, `)}));return n[0]}validateForMode(t,n,r){let i=()=>{let t=e.C(n,r);if(!t.isValid)throw new e.S(e.K(`server.errors.queryValidationFailed`,{errors:t.errors.join(`, `)}),t.issues)};({regular:i,comparison:i,funnel:()=>{let t=this.builders.funnel.validateConfig(r.funnel,n);if(!t.isValid)throw Error(e.K(`server.errors.funnelValidationFailed`,{errors:t.errors.join(`, `)}))},flow:()=>{let t=this.builders.flow.validateConfig(r.flow,n);if(!t.isValid)throw Error(e.K(`server.errors.flowValidationFailed`,{errors:t.errors.join(`, `)}))},retention:()=>{let t=this.builders.retention.validateConfig(r.retention,n);if(!t.isValid)throw Error(e.K(`server.errors.retentionValidationFailed`,{errors:t.errors.join(`, `)}))}})[e.rt(t)]()}};function vt(e,t,n={},r){let i=n.keyPrefix??`drizzle-cube:`,a=yt(e),o=`${i}query:${G(JSON.stringify(a))}`;if(n.includeSecurityContext!==!1){let e=G(n.securityContextSerializer?n.securityContextSerializer(t):JSON.stringify(W(t)));o+=`:ctx:${e}`}return r&&(o+=`:cubes:${r}`),o}function yt(e){return{measures:e.measures?[...e.measures].sort():void 0,dimensions:e.dimensions?[...e.dimensions].sort():void 0,filters:e.filters?U(e.filters):void 0,timeDimensions:e.timeDimensions?Ct(e.timeDimensions):void 0,limit:e.limit,offset:e.offset,order:e.order?W(e.order):void 0,fillMissingDatesValue:e.fillMissingDatesValue,ungrouped:e.ungrouped,total:e.total,funnel:e.funnel?bt(e.funnel):void 0,flow:e.flow?xt(e.flow):void 0,retention:e.retention?St(e.retention):void 0}}function bt(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,steps:e.steps.map(e=>{let t={name:e.name,filter:e.filter?Array.isArray(e.filter)?U(e.filter):U([e.filter])[0]:void 0,timeToConvert:e.timeToConvert};return`cube`in e&&e.cube&&(t.cube=e.cube),t}),includeTimeMetrics:e.includeTimeMetrics,globalTimeWindow:e.globalTimeWindow}}function xt(e){return{bindingKey:e.bindingKey,timeDimension:e.timeDimension,eventDimension:e.eventDimension,startingStep:{name:e.startingStep.name,filter:e.startingStep.filter?Array.isArray(e.startingStep.filter)?U(e.startingStep.filter):U([e.startingStep.filter])[0]:void 0},stepsBefore:e.stepsBefore,stepsAfter:e.stepsAfter,entityLimit:e.entityLimit,outputMode:e.outputMode,joinStrategy:e.joinStrategy}}function St(e){return{timeDimension:e.timeDimension,bindingKey:e.bindingKey,dateRange:e.dateRange,granularity:e.granularity,periods:e.periods,retentionType:e.retentionType,cohortFilters:e.cohortFilters?Array.isArray(e.cohortFilters)?U(e.cohortFilters):U([e.cohortFilters])[0]:void 0,activityFilters:e.activityFilters?Array.isArray(e.activityFilters)?U(e.activityFilters):U([e.activityFilters])[0]:void 0,breakdownDimensions:e.breakdownDimensions}}function U(e){return[...e].map(e=>{if(`and`in e&&e.and)return{and:U(e.and)};if(`or`in e&&e.or)return{or:U(e.or)};let t=e;return{...t,values:t.values?[...t.values].sort():t.values}}).sort((e,t)=>JSON.stringify(e).localeCompare(JSON.stringify(t)))}function Ct(e){return[...e].map(e=>({dimension:e.dimension,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange?[...e.compareDateRange].sort((e,t)=>{let n=Array.isArray(e)?e.join(`-`):e,r=Array.isArray(t)?t.join(`-`):t;return n.localeCompare(r)}):void 0})).sort((e,t)=>e.dimension.localeCompare(t.dimension))}function W(e){return typeof e!=`object`||!e?e:Array.isArray(e)?e.map(W):Object.keys(e).sort().reduce((t,n)=>(t[n]=W(e[n]),t),{})}function G(e){let t=2166136261,n=2246822519,r=3266489917,i=668265263,a=16777619;for(let o=0;o<e.length;o++){let s=e.charCodeAt(o);t=Math.imul(t^s,a)>>>0,n=Math.imul(n^s+o&65535,a)>>>0,r=Math.imul(r^(s^o&255),a)>>>0,i=Math.imul(i^s+Math.imul(o,131)&65535,a)>>>0}return t=(t^e.length)>>>0,t.toString(16).padStart(8,`0`)+n.toString(16).padStart(8,`0`)+r.toString(16).padStart(8,`0`)+i.toString(16).padStart(8,`0`)}var wt=class{cacheConfig;constructor(e){this.cacheConfig=e}generateKey(e,t,n){if(this.cacheConfig?.enabled!==!1&&this.cacheConfig?.provider)return vt(e,t,this.cacheConfig,n)}async lookup(e,t){if(e&&this.cacheConfig?.provider){if(t){this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:0});return}try{let t=Date.now(),n=await this.cacheConfig.provider.get(e);if(n)return this.cacheConfig.onCacheEvent?.({type:`hit`,key:e,durationMs:Date.now()-t}),{...n.value,cache:n.metadata?{hit:!0,cachedAt:new Date(n.metadata.cachedAt).toISOString(),ttlMs:n.metadata.ttlMs,ttlRemainingMs:n.metadata.ttlRemainingMs}:{hit:!0,cachedAt:new Date().toISOString(),ttlMs:0,ttlRemainingMs:0}};this.cacheConfig.onCacheEvent?.({type:`miss`,key:e,durationMs:Date.now()-t})}catch(e){this.cacheConfig.onError?.(e,`get`)}}}async store(e,t){if(e&&this.cacheConfig?.provider)try{let n=Date.now();await this.cacheConfig.provider.set(e,t,this.cacheConfig.defaultTtlMs??3e5),this.cacheConfig.onCacheEvent?.({type:`set`,key:e,durationMs:Date.now()-n})}catch(e){this.cacheConfig.onError?.(e,`set`)}}},Tt=class{dateTimeBuilder;constructor(e){this.dateTimeBuilder=new k(e)}hasComparison(t){return e.T(t)}getComparisonTimeDimension(e){return e.timeDimensions?.find(e=>e.compareDateRange&&e.compareDateRange.length>=2)}normalizePeriods(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n],i,a,o;if(typeof r==`string`){let e=this.dateTimeBuilder.parseRelativeDateRange(r);if(e)i=e.start,a=e.end,o=r;else{let e=new Date(r);if(!isNaN(e.getTime()))i=new Date(e),i.setUTCHours(0,0,0,0),a=new Date(e),a.setUTCHours(23,59,59,999),o=r;else continue}}else{if(i=new Date(r[0]),a=new Date(r[1]),isNaN(i.getTime())||isNaN(a.getTime()))continue;/^\d{4}-\d{2}-\d{2}$/.test(r[1])&&a.setUTCHours(23,59,59,999),o=`${r[0]} - ${r[1]}`}t.push({start:i,end:a,label:o,index:n})}return t}createPeriodQuery(e,t){return{...e,timeDimensions:e.timeDimensions?.map(e=>e.compareDateRange?{...e,dateRange:[t.start.toISOString(),t.end.toISOString()],compareDateRange:void 0}:e)}}calculatePeriodDayIndex(e,t,n){let r=typeof e==`string`?new Date(e):e,i=t.getTime(),a=r.getTime();switch(n){case`second`:return Math.floor((a-i)/1e3);case`minute`:return Math.floor((a-i)/6e4);case`hour`:return Math.floor((a-i)/36e5);case`day`:return Math.floor((a-i)/864e5);case`week`:return Math.floor((a-i)/6048e5);case`month`:{let e=t.getUTCFullYear(),n=t.getUTCMonth(),i=r.getUTCFullYear(),a=r.getUTCMonth();return(i-e)*12+(a-n)}case`quarter`:{let e=t.getUTCFullYear(),n=Math.floor(t.getUTCMonth()/3),i=r.getUTCFullYear(),a=Math.floor(r.getUTCMonth()/3);return(i-e)*4+(a-n)}case`year`:return r.getUTCFullYear()-t.getUTCFullYear();default:return Math.floor((a-i)/864e5)}}addPeriodMetadata(e,t,n,r){return e.map(e=>{let i=e[n],a=0;if(i){let e=typeof i==`string`?new Date(i):i instanceof Date?i:null;e&&!isNaN(e.getTime())&&(a=this.calculatePeriodDayIndex(e,t.start,r))}return{...e,__period:t.label,__periodIndex:t.index,__periodDayIndex:a}})}mergeComparisonResults(e,t,n){let r=[],i={measures:{},dimensions:{},segments:{},timeDimensions:{}},a=e.map(e=>e.period);for(let{result:a,period:o}of e){let e=this.addPeriodMetadata(a.data,o,t.dimension,n);r.push(...e),i={measures:{...i.measures,...a.annotation.measures},dimensions:{...i.dimensions,...a.annotation.dimensions},segments:{...i.segments,...a.annotation.segments},timeDimensions:{...i.timeDimensions,...a.annotation.timeDimensions}}}let o={ranges:a.map(e=>[e.start.toISOString().split(`T`)[0],e.end.toISOString().split(`T`)[0]]),labels:a.map(e=>e.label),timeDimension:t.dimension,granularity:n};return{data:r,annotation:{...i,periods:o}}}sortComparisonResults(e,t){return[...e].sort((e,n)=>{let r=e.__periodIndex-n.__periodIndex;if(r!==0)return r;let i=e[t],a=n[t];return typeof i==`string`&&typeof a==`string`?new Date(i).getTime()-new Date(a).getTime():0})}},Et=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new k(e),this.filterBuilder=new F(e,this.dateTimeBuilder)}hasFunnel(t){return e.D(t)}validateConfig(t,n){let r=[];t.steps.length<2&&r.push(e.K(`server.validation.funnel.minSteps`)),this.validateBindingKey(t,n,r),this.validateTimeDimension(t,n,r);for(let e=0;e<t.steps.length;e++)this.validateStep(t,t.steps[e],e,n,r);return{isValid:r.length===0,errors:r}}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.K(`server.validation.funnel.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.K(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.K(`server.validation.funnel.bindingKeyCubeNotFound`,{cubeName:i}));return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.K(`server.validation.funnel.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.K(`server.validation.funnel.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateTimeDimension(t,n,r){if(typeof t.timeDimension!=`string`)return;let[i,a]=t.timeDimension.split(`.`);if(!i||!a){r.push(e.K(`server.validation.funnel.invalidTimeDimFormat`,{timeDimension:t.timeDimension}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.K(`server.validation.funnel.timeDimNotFound`,{dimName:a,cubeName:i})):r.push(e.K(`server.validation.funnel.timeDimCubeNotFound`,{cubeName:i}))}validateStep(t,n,r,i,a){n.name||a.push(e.K(`server.validation.funnel.stepMustHaveName`,{step:r})),`cube`in n&&n.cube&&!i.get(n.cube)&&a.push(e.K(`server.validation.funnel.stepCubeNotFound`,{step:r,cube:n.cube})),n.filter&&this.validateStepFilters(t,n,r,i,a),n.timeToConvert&&r>0&&(/^P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$/.test(n.timeToConvert)||a.push(e.K(`server.validation.funnel.stepTimeToConvertFormat`,{step:r,value:n.timeToConvert})))}validateStepFilters(t,n,r,i,a){let o;`cube`in n&&n.cube?o=n.cube:typeof t.bindingKey==`string`&&([o]=t.bindingKey.split(`.`));let s=o?new e.q(i):null,c=Array.isArray(n.filter)?n.filter:[n.filter];for(let t of c){if(!(`member`in t))continue;let[n,c]=t.member.split(`.`),l=i.get(n);if(!l){a.push(e.K(`server.validation.funnel.stepFilterCubeNotFound`,{step:r,cubeName:n}));continue}if(l.dimensions?.[c]||(l.measures?.[c]?a.push(e.K(`server.validation.funnel.stepFilterIsMeasure`,{step:r,member:`${n}.${c}`})):a.push(e.K(`server.validation.funnel.stepFilterMemberNotFound`,{step:r,field:c,cubeName:n}))),o&&n!==o&&s){let t=s.findPath(o,n);(!t||t.length===0)&&a.push(e.K(`server.validation.funnel.stepFilterNoJoinPath`,{step:r,member:`${n}.${c}`,stepCube:o}))}}}buildFunnelQuery(e,t,n){let r=this.resolveSteps(e,t,n),i=[];for(let e=0;e<r.length;e++){let t=e>0?i[e-1]:void 0;i.push(this.buildStepCTE(r[e],n,t))}let a=this.buildFunnelResultsCTE(i,r,e,n),o=this.buildAggregationCTE(a,i,r,e,n),s=[...i,a,o];return n.db.with(...s).select().from(o)}transformResult(e,t){if(!e||e.length===0)return[];let n=e[0],r=[],i=Number(n.step_0_count)||0;for(let e=0;e<t.steps.length;e++){let a=t.steps[e],o=Number(n[`step_${e}_count`])||0,s=e>0&&Number(n[`step_${e-1}_count`])||0,c={step:a.name,stepIndex:e,count:o,conversionRate:e===0?null:s>0?o/s:0,cumulativeConversionRate:i>0?o/i:0};t.includeTimeMetrics&&e>0&&this.applyTimeMetrics(c,n,e),r.push(c)}return r}applyTimeMetrics(e,t,n){let r=e=>t[e]===null?null:Number(t[e]);e.avgSecondsToConvert=r(`step_${n}_avg_seconds`),e.minSecondsToConvert=r(`step_${n}_min_seconds`),e.maxSecondsToConvert=r(`step_${n}_max_seconds`),t[`step_${n}_median_seconds`]!==void 0&&(e.medianSecondsToConvert=r(`step_${n}_median_seconds`)),t[`step_${n}_p90_seconds`]!==void 0&&(e.p90SecondsToConvert=r(`step_${n}_p90_seconds`))}extractFilterCubeNames(e){let t=new Set;if(!e.filter)return t;let n=Array.isArray(e.filter)?e.filter:[e.filter],r=e=>{let n=j(e);if(`and`in e&&e.and)for(let t of e.and)r(t);else if(`or`in e&&e.or)for(let t of e.or)r(t);else if(n)for(let e of n.filters)r(e);else if(`member`in e){let[n]=e.member.split(`.`);t.add(n)}};for(let e of n)r(e);return t}resolveSteps(t,n,r){let i=new e.q(n);return t.steps.map((e,a)=>{let o=this.resolveCubeForStep(e,t,n),s=this.resolveBindingKey(t,o,r),c=this.resolveTimeDimension(t,o,r),l=this.buildStepFilters(e,o,n,r),u=this.extractFilterCubeNames(e),d=[];for(let e of u)if(e!==o.name){let t=n.get(e);if(t){let n=i.findPath(o.name,e);n&&n.length>0&&d.push({cube:t,joinPath:n})}}return{name:e.name,index:a,cube:o,bindingKeyExpr:s,timeExpr:c,filterConditions:l,timeToConvert:e.timeToConvert,joinedCubes:d}})}resolveCubeForStep(t,n,r){if(`cube`in t&&t.cube){let n=r.get(t.cube);if(!n)throw Error(e.K(`server.errors.funnel.cubeNotFoundForStep`,{cube:t.cube}));return n}if(typeof n.bindingKey==`string`){let[t]=n.bindingKey.split(`.`),i=r.get(t);if(!i)throw Error(e.K(`server.errors.funnel.cubeNotFoundForBindingKey`,{bindingKey:n.bindingKey}));return i}throw Error(e.K(`server.errors.funnel.cannotResolveCubeForStep`))}resolveBindingKey(e,t,n){return P(e.bindingKey,t,n,We(`server.errors.funnel`))}resolveTimeDimension(e,t,n){return Ge(e.timeDimension,t,n,`server.errors.funnel`)}buildStepFilters(e,t,n,r){if(!e.filter)return[];let i=Array.isArray(e.filter)?e.filter:[e.filter],a=[];for(let e of i){let i=this.buildFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildFilterCondition(e,t,n,r){let i=`and`in e||`or`in e,a=j(e);return i||a?this.buildLogicalFilterCondition(e,a,t,n,r):this.buildSimpleFilterCondition(e,t,n,r)}buildLogicalFilterCondition(t,n,r,i,a){let o,s;if(n)o=n.isAnd,s=n.filters;else{let e=t;o=`and`in e&&!!e.and,s=e.and||e.or||[]}let c=[];for(let e of s){let t=this.buildFilterCondition(e,r,i,a);t&&c.push(t)}return c.length===0?null:c.length===1?c[0]:o?e.it(...c):e.dt`(${e.dt.join(c,e.dt` OR `)})`}buildSimpleFilterCondition(t,n,r,i){let[a,o]=t.member.split(`.`),s=t.dateRange!==void 0;if(!e.L.has(t.operator)&&!s&&(!t.values||t.values.length===0||t.values[0]===void 0||t.values[0]===``))return null;let c=r.get(a);if(!c)return null;if(a!==n.name){let t=new e.q(r).findPath(n.name,a);if(!t||t.length===0)return null}let l=c.dimensions?.[o];if(!l)return null;let u=e.tt(l,i);return this.filterBuilder.buildFilterCondition(u,t.operator,t.values||[],l,t.dateRange)}buildStepCTE(e,t,n){return e.index===0?this.buildFirstStepCTE(e,t):this.buildSubsequentStepCTE(e,t,n)}buildFirstStepCTE(t,n){let r=`step_${t.index}`,i=t.cube.sql(n),a=[];i.where&&a.push(i.where),a.push(...t.filterConditions);let o=n.db.select({binding_key:e.dt`${t.bindingKeyExpr}`.as(`binding_key`),step_time:e.dt`MIN(${t.timeExpr})`.as(`step_time`)}).from(i.from);return o=this.addCrossJoinsToQuery(o,t,n,a),a.length>0&&(o=o.where(A(a))),o=o.groupBy(t.bindingKeyExpr),n.db.$with(r).as(o)}buildSubsequentStepCTE(t,n,r){let i=`step_${t.index}`,a=`step_${t.index-1}`,o=t.cube.sql(n),s=[];o.where&&s.push(o.where),s.push(...t.filterConditions);let c=e.dt`${e.dt.identifier(a)}.step_time`,l=e.dt`${t.timeExpr} > ${c}`;if(t.timeToConvert){let n=this.databaseAdapter.buildDateAddInterval(c,t.timeToConvert);l=e.dt`${l} AND ${t.timeExpr} <= ${n}`}s.push(l);let u=n.db.select({binding_key:e.dt`${t.bindingKeyExpr}`.as(`binding_key`),step_time:e.dt`MIN(${t.timeExpr})`.as(`step_time`)}).from(o.from).innerJoin(r,e.dt`${t.bindingKeyExpr} = ${e.dt.identifier(a)}.binding_key`);return u=this.addCrossJoinsToQuery(u,t,n,s),s.length>0&&(u=u.where(A(s))),u=u.groupBy(t.bindingKeyExpr),n.db.$with(i).as(u)}addCrossJoinsToQuery(t,n,r,i){if(n.joinedCubes.length===0)return t;for(let a of n.joinedCubes)for(let n of a.joinPath){let o=n.joinDef,s=[];for(let t of o.on)t.as?s.push(t.as(t.source,t.target)):s.push(e.at(t.source,t.target));let c=A(s),l=a.cube.sql(r);t=t.leftJoin(l.from,c),l.where&&i.push(l.where)}return t}buildFunnelResultsCTE(t,n,r,i){let a={binding_key:e.dt`s0.binding_key`,step_0_time:e.dt`s0.step_time`};for(let t=1;t<n.length;t++)a[`step_${t}_time`]=e.dt`s${e.dt.raw(String(t))}.step_time`;let o=e.dt`${e.dt.identifier(`step_0`)} s0`;for(let t=1;t<n.length;t++)o=e.dt`${o}
63
+ LEFT JOIN ${e.dt.identifier(`step_${t}`)} s${e.dt.raw(String(t))} ON s0.binding_key = s${e.dt.raw(String(t))}.binding_key`;let s=Object.entries(a).map(([t,n])=>e.dt`${n} AS ${e.dt.identifier(t)}`),c=e.dt`SELECT ${e.dt.join(s,e.dt`, `)} FROM ${o}`;return i.db.$with(`funnel_joined`).as(c)}buildAggregationCTE(t,n,r,i,a){let o={};o.step_0_count=e.dt`COUNT(*)`.as(`step_0_count`);for(let t=1;t<r.length;t++)o[`step_${t}_count`]=e.dt`COUNT(${e.dt.identifier(`step_${t}_time`)})`.as(`step_${t}_count`);if(i.includeTimeMetrics)for(let t=1;t<r.length;t++){let n=e.dt.identifier(`step_${t}_time`),r=e.dt.identifier(`step_${t-1}_time`),i=this.databaseAdapter.buildTimeDifferenceSeconds(e.dt`${n}`,e.dt`${r}`),a=e.dt`${n} IS NOT NULL`;if(o[`step_${t}_avg_seconds`]=this.databaseAdapter.buildConditionalAggregation(`avg`,i,a).as(`step_${t}_avg_seconds`),o[`step_${t}_min_seconds`]=this.databaseAdapter.buildConditionalAggregation(`min`,i,a).as(`step_${t}_min_seconds`),o[`step_${t}_max_seconds`]=this.databaseAdapter.buildConditionalAggregation(`max`,i,a).as(`step_${t}_max_seconds`),this.databaseAdapter.getCapabilities().supportsPercentileSubqueries){let r=this.databaseAdapter.buildPercentile(i,50);r&&(o[`step_${t}_median_seconds`]=e.dt`(SELECT ${r} FROM ${e.dt.identifier(`funnel_joined`)} WHERE ${n} IS NOT NULL)`.as(`step_${t}_median_seconds`));let a=this.databaseAdapter.buildPercentile(i,90);a&&(o[`step_${t}_p90_seconds`]=e.dt`(SELECT ${a} FROM ${e.dt.identifier(`funnel_joined`)} WHERE ${n} IS NOT NULL)`.as(`step_${t}_p90_seconds`))}}let s=a.db.select(o).from(t);return a.db.$with(`funnel_metrics`).as(s)}},Dt=class{filterBuilder;dateTimeBuilder;databaseAdapter;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new k(e),this.filterBuilder=new F(e,this.dateTimeBuilder)}hasFlow(t){return e.E(t)}validateConfig(t,n){let r=[],i=[],a=this.databaseAdapter.getEngineType(),o=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE;return a===`sqlite`?(r.push(e.K(`server.validation.flow.sqliteNotSupported`)),{isValid:!1,errors:r,warnings:i}):(this.validateBindingKey(t,n,r),typeof t.timeDimension==`string`&&this.validateMemberDimension(t.timeDimension,n,r,{invalidFormat:()=>e.K(`server.validation.flow.invalidTimeDimFormat`,{timeDimension:t.timeDimension}),cubeNotFound:t=>e.K(`server.validation.flow.timeDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.K(`server.validation.flow.timeDimNotFound`,{dimName:t,cubeName:n})}),t.eventDimension?this.validateMemberDimension(t.eventDimension,n,r,{invalidFormat:()=>e.K(`server.validation.flow.invalidEventDimFormat`,{eventDimension:t.eventDimension}),cubeNotFound:t=>e.K(`server.validation.flow.eventDimCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.K(`server.validation.flow.eventDimNotFound`,{dimName:t,cubeName:n})}):r.push(e.K(`server.validation.flow.eventDimRequired`)),this.validateStartingStep(t,r,i),this.validateDepthBounds(t,r,i),this.validateJoinStrategy(t,o,r),{isValid:r.length===0,errors:r,warnings:i})}validateMemberDimension(e,t,n,r){let[i,a]=e.split(`.`);if(!i||!a){n.push(r.invalidFormat());return}let o=t.get(i);o?o.dimensions?.[a]||n.push(r.dimNotFound(a,i)):n.push(r.cubeNotFound(i))}validateBindingKey(t,n,r){if(typeof t.bindingKey==`string`){this.validateMemberDimension(t.bindingKey,n,r,{invalidFormat:()=>e.K(`server.validation.flow.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}),cubeNotFound:t=>e.K(`server.validation.flow.bindingKeyCubeNotFound`,{cubeName:t}),dimNotFound:(t,n)=>e.K(`server.validation.flow.bindingKeyDimNotFound`,{dimName:t,cubeName:n})});return}if(Array.isArray(t.bindingKey))for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.K(`server.validation.flow.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let[,a]=i.dimension.split(`.`);t.dimensions?.[a]||r.push(e.K(`server.validation.flow.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}}validateStartingStep(t,n,r){if(!t.startingStep){n.push(e.K(`server.validation.flow.startingStepRequired`));return}t.startingStep.filter||n.push(e.K(`server.validation.flow.startingStepFilterRequired`)),t.startingStep.name||r.push(e.K(`server.validation.flow.startingStepNameMissing`))}validateDepthBounds(t,n,r){(t.stepsBefore<0||t.stepsBefore>5)&&n.push(e.K(`server.validation.flow.stepsBeforeRange`,{value:t.stepsBefore})),(t.stepsAfter<0||t.stepsAfter>5)&&n.push(e.K(`server.validation.flow.stepsAfterRange`,{value:t.stepsAfter})),(t.stepsBefore>=4||t.stepsAfter>=4)&&r.push(e.K(`server.validation.flow.highStepDepthWarning`))}validateJoinStrategy(t,n,r){t.joinStrategy&&![`auto`,`lateral`,`window`].includes(t.joinStrategy)?r.push(e.K(`server.validation.flow.invalidJoinStrategy`,{joinStrategy:t.joinStrategy})):t.joinStrategy===`lateral`&&!n&&r.push(e.K(`server.validation.flow.lateralNotSupported`))}buildFlowQuery(t,n,r){if(this.databaseAdapter.getEngineType()===`sqlite`)throw Error(e.K(`server.validation.flow.sqliteNotSupported`));let i=this.databaseAdapter.getCapabilities().supportsLateralSubqueriesInCTE,a=t.joinStrategy??`auto`,o=a===`lateral`||a===`auto`&&i;if(a===`lateral`&&!i)throw Error(e.K(`server.validation.flow.lateralNotSupportedExec`));let s={...t,stepsBefore:t.outputMode===`sunburst`?0:t.stepsBefore},c=this.resolveFlowConfig(s,n,r),l=[],u=this.buildStartingEntitiesCTE(s,c,r);l.push(u);let d=o?this.buildDirectionalCTEsLateral(`before`,s,c,r):this.buildDirectionalCTEsWindow(`before`,s,c,r);l.push(...d);let f=o?this.buildDirectionalCTEsLateral(`after`,s,c,r):this.buildDirectionalCTEsWindow(`after`,s,c,r);l.push(...f);let p=this.buildNodesAggregationCTE(s,r);l.push(p);let m=this.buildLinksAggregationCTE(s,r);l.push(m);let h=this.buildFinalResultCTE(r);return l.push(h),r.db.with(...l).select().from(h)}transformResult(e){if(!e||e.length===0)return{nodes:[],links:[]};let t=[],n=[];for(let r of e){let e=r.record_type;e===`node`?t.push({id:String(r.id),name:String(r.name),layer:Number(r.layer),value:Number(r.value)}):e===`link`&&n.push({source:String(r.source_id),target:String(r.target_id),value:Number(r.value)})}return t.sort((e,t)=>e.layer-t.layer),{nodes:t,links:n}}resolveFlowConfig(e,t,n){let r=this.resolveCube(e,t);return{cube:r,cubeBase:r.sql(n),bindingKeyExpr:this.resolveBindingKey(e,r,n),timeExpr:this.resolveTimeDimension(e,r,n),eventExpr:this.resolveEventDimension(e,r,n),startingStepFilters:this.buildStartingStepFilters(e,r,n)}}resolveCube(t,n){let r;if(typeof t.bindingKey==`string`)[r]=t.bindingKey.split(`.`);else if(Array.isArray(t.bindingKey)&&t.bindingKey.length>0)r=t.bindingKey[0].cube;else throw Error(e.K(`server.errors.flow.cannotResolveCube`));let i=n.get(r);if(!i)throw Error(e.K(`server.errors.flow.cubeNotFound`,{cubeName:r}));return i}resolveBindingKey(e,t,n){return P(e.bindingKey,t,n,We(`server.errors.flow`))}resolveTimeDimension(e,t,n){return Ge(e.timeDimension,t,n,`server.errors.flow`)}resolveEventDimension(t,n,r){let[,i]=t.eventDimension.split(`.`),a=n.dimensions?.[i];if(!a)throw Error(e.K(`server.errors.flow.eventDimNotFound`,{eventDimension:t.eventDimension}));return e.nt(a.sql,r)}buildStartingStepFilters(e,t,n){if(!e.startingStep.filter)return[];let r=Array.isArray(e.startingStep.filter)?e.startingStep.filter:[e.startingStep.filter],i=[];for(let e of r){let r=this.buildFilterCondition(e,t,n);r&&i.push(r)}return i}buildFilterCondition(t,n,r){if(`and`in t||`or`in t){let e=t,i=e.and||e.or||[],a=this.buildSubConditions(i,n,r);return this.combineConditions(a,`and`in t)}let i=j(t);if(i){let e=this.buildSubConditions(i.filters,n,r);return this.combineConditions(e,i.isAnd)}let a=t,[,o]=a.member.split(`.`),s=n.dimensions?.[o];if(!s)return null;let c=e.tt(s,r);return this.filterBuilder.buildFilterCondition(c,a.operator,a.values||[],s,a.dateRange)}buildSubConditions(e,t,n){let r=[];for(let i of e){let e=this.buildFilterCondition(i,t,n);e&&r.push(e)}return r}combineConditions(t,n){return t.length===0?null:t.length===1?t[0]:n?e.it(...t):e.dt`(${e.dt.join(t,e.dt` OR `)})`}buildStartingEntitiesCTE(t,n,r){let{cubeBase:i,bindingKeyExpr:a,timeExpr:o,eventExpr:s,startingStepFilters:c}=n,l=[];i.where&&l.push(i.where),l.push(...c);let u=r.db.select({binding_key:e.dt`${a}`.as(`binding_key`),start_time:e.dt`MIN(${o})`.as(`start_time`),event_type:e.dt`${s}`.as(`event_type`),event_path:e.dt`${s}`.as(`event_path`)}).from(i.from);return l.length>0&&(u=u.where(A(l))),u=u.groupBy(a,s),t.entityLimit&&(u=u.limit(t.entityLimit)),r.db.$with(`starting_entities`).as(u)}buildDirectionalCTEsLateral(t,n,r,i){let{cubeBase:a,bindingKeyExpr:o,timeExpr:s,eventExpr:c}=r,l=[],u=n.outputMode===`sunburst`,d=t===`before`,f=d?n.stepsBefore:n.stepsAfter,p=d?e.dt`<`:e.dt`>`,m=d?e.dt`DESC`:e.dt`ASC`;for(let n=1;n<=f;n++){let r=n===1?`starting_entities`:`${t}_step_${n-1}`,f=n===1?`start_time`:`step_time`,h=`${t}_step_${n}`,g=[];a.where&&g.push(a.where),g.push(e.dt`${o} = ${e.dt.identifier(r)}.binding_key`,e.dt`${s} ${p} ${e.dt.identifier(r)}.${e.dt.identifier(f)}`);let _=A(g),v=u?d?e.dt`${c} || ${`→`} || ${e.dt.identifier(r)}.event_path`:e.dt`${e.dt.identifier(r)}.event_path || ${`→`} || ${c}`:e.dt`${c}`,y=i.db.select({binding_key:e.dt`${o}`.as(`binding_key`),step_time:e.dt`${s}`.as(`step_time`),event_type:e.dt`${c}`.as(`event_type`),event_path:v.as(`event_path`)}).from(a.from).where(_).orderBy(e.dt`${s} ${m}`).limit(1),b=i.db.$with(h).as(i.db.select({binding_key:e.dt`e.binding_key`.as(`binding_key`),step_time:e.dt`e.step_time`.as(`step_time`),event_type:e.dt`e.event_type`.as(`event_type`),event_path:e.dt`e.event_path`.as(`event_path`)}).from(e.dt`${e.dt.identifier(r)}`).crossJoinLateral(y.as(`e`)));l.push(b)}return l}buildDirectionalCTEsWindow(t,n,r,i){let{cubeBase:a,bindingKeyExpr:o,timeExpr:s,eventExpr:c}=r,l=[],u=n.outputMode===`sunburst`,d=t===`before`,f=d?n.stepsBefore:n.stepsAfter,p=d?e.dt`<`:e.dt`>`,m=d?e.dt`DESC`:e.dt`ASC`;for(let n=1;n<=f;n++){let r=n===1?`starting_entities`:`${t}_step_${n-1}`,f=n===1?`start_time`:`step_time`,h=`${t}_step_${n}`,g=[];a.where&&g.push(a.where),g.push(e.dt`${s} ${p} ${e.dt.identifier(r)}.${e.dt.identifier(f)}`);let _=A(g),v=u?d?e.dt`${c} || ${`→`} || ${e.dt.identifier(r)}.event_path`:e.dt`${e.dt.identifier(r)}.event_path || ${`→`} || ${c}`:e.dt`${c}`,y=i.db.select({binding_key:e.dt`${o}`.as(`binding_key`),step_time:e.dt`${s}`.as(`step_time`),event_type:e.dt`${c}`.as(`event_type`),event_path:v.as(`event_path`),rn:e.dt`ROW_NUMBER() OVER (PARTITION BY ${o} ORDER BY ${s} ${m})`.as(`rn`)}).from(a.from).innerJoin(e.dt`${e.dt.identifier(r)}`,e.dt`${o} = ${e.dt.identifier(r)}.binding_key`).where(_),b=i.db.select({binding_key:e.dt`binding_key`.as(`binding_key`),step_time:e.dt`step_time`.as(`step_time`),event_type:e.dt`event_type`.as(`event_type`),event_path:e.dt`event_path`.as(`event_path`)}).from(y.as(`ranked`)).where(e.dt`rn = 1`);l.push(i.db.$with(h).as(b))}return l}buildNodeArm(t,n,r,i){let a=e.dt.raw(`'${t}_'`),o=e.dt.raw(String(n)),s=e.dt.identifier(r);return i?e.dt`
64
+ SELECT
65
+ ${a} || event_path AS node_id,
66
+ event_type AS name,
67
+ ${o} AS layer,
68
+ COUNT(*) AS value
69
+ FROM ${s}
70
+ GROUP BY event_path, event_type
71
+ `:e.dt`
72
+ SELECT
73
+ ${a} || event_type AS node_id,
74
+ event_type AS name,
75
+ ${o} AS layer,
76
+ COUNT(*) AS value
77
+ FROM ${s}
78
+ GROUP BY event_type
79
+ `}buildAdjacentLinkArm(t,n,r,i,a){let o=e.dt.raw(`'${t}_'`),s=e.dt.raw(`'${n}_'`),c=e.dt.identifier(r),l=e.dt.identifier(i);return a?e.dt`
80
+ SELECT
81
+ ${o} || f.event_path AS source_id,
82
+ ${s} || t.event_path AS target_id,
83
+ COUNT(*) AS value
84
+ FROM ${c} f
85
+ INNER JOIN ${l} t ON f.binding_key = t.binding_key
86
+ GROUP BY f.event_path, t.event_path
87
+ `:e.dt`
88
+ SELECT
89
+ ${o} || f.event_type AS source_id,
90
+ ${s} || t.event_type AS target_id,
91
+ COUNT(*) AS value
92
+ FROM ${c} f
93
+ INNER JOIN ${l} t ON f.binding_key = t.binding_key
94
+ GROUP BY f.event_type, t.event_type
95
+ `}buildNodesAggregationCTE(t,n){let r=[],i=t.outputMode===`sunburst`;for(let e=t.stepsBefore;e>=1;e--)r.push(this.buildNodeArm(`before_${e}`,-e,`before_step_${e}`,i));r.push(e.dt`
96
+ SELECT
97
+ ${e.dt.raw(`'start_'`)} || event_type AS node_id,
98
+ event_type AS name,
99
+ 0 AS layer,
100
+ COUNT(*) AS value
101
+ FROM starting_entities
102
+ GROUP BY event_type
103
+ `);for(let e=1;e<=t.stepsAfter;e++)r.push(this.buildNodeArm(`after_${e}`,e,`after_step_${e}`,i));let a=e.dt.join(r,e.dt` UNION ALL `),o=n.db.select({node_id:e.dt`node_id`.as(`node_id`),name:e.dt`name`.as(`name`),layer:e.dt`layer`.as(`layer`),value:e.dt`value`.as(`value`)}).from(e.dt`(${a}) AS nodes_union`);return n.db.$with(`nodes_agg`).as(o)}buildLinksAggregationCTE(t,n){let r=[],i=t.outputMode===`sunburst`;for(let e=t.stepsBefore;e>=2;e--)r.push(this.buildAdjacentLinkArm(`before_${e}`,`before_${e-1}`,`before_step_${e}`,`before_step_${e-1}`,i));t.stepsBefore>=1&&(i?r.push(e.dt`
104
+ SELECT
105
+ ${e.dt.raw(`'before_1_'`)} || b.event_path AS source_id,
106
+ ${e.dt.raw(`'start_'`)} || s.event_type AS target_id,
107
+ COUNT(*) AS value
108
+ FROM before_step_1 b
109
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
110
+ GROUP BY b.event_path, s.event_type
111
+ `):r.push(e.dt`
112
+ SELECT
113
+ ${e.dt.raw(`'before_1_'`)} || b.event_type AS source_id,
114
+ ${e.dt.raw(`'start_'`)} || s.event_type AS target_id,
115
+ COUNT(*) AS value
116
+ FROM before_step_1 b
117
+ INNER JOIN starting_entities s ON b.binding_key = s.binding_key
118
+ GROUP BY b.event_type, s.event_type
119
+ `)),t.stepsAfter>=1&&(i?r.push(e.dt`
120
+ SELECT
121
+ ${e.dt.raw(`'start_'`)} || s.event_type AS source_id,
122
+ ${e.dt.raw(`'after_1_'`)} || a.event_path AS target_id,
123
+ COUNT(*) AS value
124
+ FROM starting_entities s
125
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
126
+ GROUP BY s.event_type, a.event_path
127
+ `):r.push(e.dt`
128
+ SELECT
129
+ ${e.dt.raw(`'start_'`)} || s.event_type AS source_id,
130
+ ${e.dt.raw(`'after_1_'`)} || a.event_type AS target_id,
131
+ COUNT(*) AS value
132
+ FROM starting_entities s
133
+ INNER JOIN after_step_1 a ON s.binding_key = a.binding_key
134
+ GROUP BY s.event_type, a.event_type
135
+ `));for(let e=1;e<t.stepsAfter;e++)r.push(this.buildAdjacentLinkArm(`after_${e}`,`after_${e+1}`,`after_step_${e}`,`after_step_${e+1}`,i));if(r.length===0){let t=n.db.select({source_id:e.dt`NULL`.as(`source_id`),target_id:e.dt`NULL`.as(`target_id`),value:e.dt`0`.as(`value`)}).from(e.dt`(SELECT 1) AS empty`).where(e.dt`1 = 0`);return n.db.$with(`links_agg`).as(t)}let a=e.dt.join(r,e.dt` UNION ALL `),o=n.db.select({source_id:e.dt`source_id`.as(`source_id`),target_id:e.dt`target_id`.as(`target_id`),value:e.dt`value`.as(`value`)}).from(e.dt`(${a}) AS links_union`);return n.db.$with(`links_agg`).as(o)}buildFinalResultCTE(t){let n=e.dt`
136
+ SELECT
137
+ 'node' AS record_type,
138
+ node_id AS id,
139
+ name AS name,
140
+ layer AS layer,
141
+ value AS value,
142
+ NULL AS source_id,
143
+ NULL AS target_id
144
+ FROM nodes_agg
145
+ UNION ALL
146
+ SELECT
147
+ 'link' AS record_type,
148
+ NULL AS id,
149
+ NULL AS name,
150
+ NULL AS layer,
151
+ value AS value,
152
+ source_id AS source_id,
153
+ target_id AS target_id
154
+ FROM links_agg
155
+ WHERE source_id IS NOT NULL
156
+ `,r=t.db.select({record_type:e.dt`record_type`.as(`record_type`),id:e.dt`id`.as(`id`),name:e.dt`name`.as(`name`),layer:e.dt`layer`.as(`layer`),value:e.dt`value`.as(`value`),source_id:e.dt`source_id`.as(`source_id`),target_id:e.dt`target_id`.as(`target_id`)}).from(e.dt`(${n}) AS final_union`);return t.db.$with(`final_result`).as(r)}};function Ot(e){return Array.isArray(e)}function K(e){return typeof e==`object`&&!!e&&`cube`in e}function q(e){if(K(e))return e.cube;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(0,t)}function J(e){if(K(e))return e.dimension;let t=e.indexOf(`.`);if(t===-1)throw Error(`Invalid time dimension format: ${e}. Expected 'CubeName.dimensionName'`);return e.substring(t+1)}var kt={noMapping:({cubeName:t})=>e.K(`server.validation.retention.noBindingKeyMapping`,{cubeName:t}),cubeNotFound:({cubeName:t})=>e.K(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:t}),keyDimNotFound:({bindingKey:t,cubeName:n})=>e.K(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n}),mappingDimNotFound:({dimension:t,cubeName:n})=>e.K(`server.validation.retention.bindingKeyDimNotFound`,{dimName:t,cubeName:n})},At=class{databaseAdapter;filterBuilder;dateTimeBuilder;constructor(e){this.databaseAdapter=e,this.dateTimeBuilder=new k(e),this.filterBuilder=new F(e,this.dateTimeBuilder)}hasRetention(t){return e.O(t)}validateConfig(t,n){let r=[],i=this.databaseAdapter.getEngineType();return(i===`sqlite`||i===`mysql`||i===`singlestore`)&&r.push(e.K(`server.validation.retention.engineNotSupported`,{engine:i})),this.validateTimeDimension(t,n,r),this.validateBindingKey(t,n,r),this.validateBreakdownDimensions(t,n,r),this.validatePeriodsAndEnums(t,r),this.validateDateRange(t,r),{isValid:r.length===0,errors:r}}validateTimeDimension(t,n,r){try{let i=q(t.timeDimension),a=J(t.timeDimension),o=n.get(i);o?o.dimensions?.[a]||r.push(e.K(`server.validation.retention.timeDimNotFound`,{dimName:a})):r.push(e.K(`server.validation.retention.cubeNotFound`,{cubeName:i}))}catch{r.push(e.K(`server.validation.retention.invalidTimeDimFormat`,{timeDimension:t.timeDimension}))}}validateBindingKey(t,n,r){if(Ot(t.bindingKey)){for(let i of t.bindingKey){let t=n.get(i.cube);if(!t){r.push(e.K(`server.validation.retention.bindingKeyMappingCubeNotFound`,{cubeName:i.cube}));continue}let a=M(i.dimension);t.dimensions?.[a]||r.push(e.K(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i.cube}))}return}let[i,a]=t.bindingKey.split(`.`);if(!i||!a){r.push(e.K(`server.validation.retention.invalidBindingKeyFormat`,{bindingKey:t.bindingKey}));return}let o=n.get(i);o?o.dimensions?.[a]||r.push(e.K(`server.validation.retention.bindingKeyDimNotFound`,{dimName:a,cubeName:i})):r.push(e.K(`server.validation.retention.bindingKeyCubeNotFound`,{cubeName:i}))}validateBreakdownDimensions(t,n,r){if(t.breakdownDimensions&&t.breakdownDimensions.length!==0)for(let i of t.breakdownDimensions){let[t,a]=i.split(`.`);if(!t||!a){r.push(e.K(`server.validation.retention.invalidBreakdownDimFormat`,{dimension:i}));continue}let o=n.get(t);o?o.dimensions?.[a]||r.push(e.K(`server.validation.retention.breakdownDimNotFound`,{dimName:a,cubeName:t})):r.push(e.K(`server.validation.retention.breakdownDimCubeNotFound`,{cubeName:t}))}}validatePeriodsAndEnums(t,n){t.periods<1&&n.push(e.K(`server.validation.retention.periodsMin`)),t.periods>52&&n.push(e.K(`server.validation.retention.periodsMax`)),[`day`,`week`,`month`].includes(t.granularity)||n.push(e.K(`server.validation.retention.invalidGranularity`,{granularity:t.granularity})),[`classic`,`rolling`].includes(t.retentionType)||n.push(e.K(`server.validation.retention.invalidRetentionType`,{retentionType:t.retentionType}))}validateDateRange(t,n){if(!t.dateRange){n.push(e.K(`server.validation.retention.dateRangeRequired`));return}if(t.dateRange.start?isNaN(new Date(t.dateRange.start).getTime())&&n.push(e.K(`server.validation.retention.dateRangeInvalidStart`)):n.push(e.K(`server.validation.retention.dateRangeStartRequired`)),t.dateRange.end?isNaN(new Date(t.dateRange.end).getTime())&&n.push(e.K(`server.validation.retention.dateRangeInvalidEnd`)):n.push(e.K(`server.validation.retention.dateRangeEndRequired`)),t.dateRange.start&&t.dateRange.end){let r=new Date(t.dateRange.start),i=new Date(t.dateRange.end);!isNaN(r.getTime())&&!isNaN(i.getTime())&&r>i&&n.push(e.K(`server.validation.retention.dateRangeStartBeforeEnd`))}}buildRetentionQuery(t,n,r){let i=this.resolveConfig(t,n,r),a=i.breakdowns.length,o=this.buildCohortBaseCTE(t,i,r),s=this.buildActivityPeriodsCTE(t,i,r),c=this.buildCohortSizesCTE(t,r,a),l=this.buildRetentionCountsCTE(t,r,a),u=i.breakdowns.length>0,d={period:e.dt`rc.period_number`.as(`period`),cohort_size:e.dt`cs.cohort_size`.as(`cohort_size`),retained_users:e.dt`rc.retained_users`.as(`retained_users`),retention_rate:e.dt`CAST(rc.retained_users AS NUMERIC) / NULLIF(cs.cohort_size, 0)`.as(`retention_rate`)};for(let t=0;t<i.breakdowns.length;t++)d[`breakdown_${t}`]=e.dt.raw(`rc.breakdown_${t}`).as(`breakdown_${t}`);let f=r.db.with(o,s,c,l).select(d).from(e.dt`retention_counts rc`);if(u){let t=i.breakdowns.map((t,n)=>e.dt`COALESCE(CAST(rc.breakdown_${e.dt.raw(String(n))} AS TEXT), '') = COALESCE(CAST(cs.breakdown_${e.dt.raw(String(n))} AS TEXT), '')`),n=t.length===1?t[0]:e.dt.join(t,e.dt` AND `);f=f.innerJoin(e.dt`cohort_sizes cs`,n)}else f=f.innerJoin(e.dt`cohort_sizes cs`,e.dt`1 = 1`);let p=[];for(let t=0;t<i.breakdowns.length;t++)p.push(e.dt.raw(`rc.breakdown_${t}`));return p.push(e.dt`rc.period_number`),f=f.orderBy(...p),f}transformResult(e,t){let n=t.breakdownDimensions||[],r=Math.min(n.length,100),i=r>0;return e.map(e=>{let t={period:Number(e.period),cohortSize:Number(e.cohort_size),retainedUsers:Number(e.retained_users),retentionRate:e.retention_rate===null?0:Number(e.retention_rate)};if(i){let i={};for(let t=0;t<r;t++){let r=n[t],a=e[`breakdown_${t}`];i[r]=a===void 0?null:String(a)}t.breakdownValues=i}return t})}resolveConfig(t,n,r){let i=q(t.timeDimension),a=J(t.timeDimension),o=n.get(i);if(!o)throw Error(e.K(`server.validation.retention.cubeNotFound`,{cubeName:i}));let s=o.dimensions?.[a];if(!s)throw Error(e.K(`server.validation.retention.timeDimNotFound`,{dimName:a}));let c=e.nt(s.sql,r),l=P(t.bindingKey,o,r,kt,n),u=this.buildFilterConditions(t.cohortFilters,o,n,r),d=this.buildFilterConditions(t.activityFilters,o,n,r),f=[];if(t.breakdownDimensions&&t.breakdownDimensions.length>0)for(let i of t.breakdownDimensions){let[t,a]=i.split(`.`),o=n.get(t);if(o&&o.dimensions?.[a]){let t=e.nt(o.dimensions[a].sql,r);f.push({dimension:i,expr:t})}}return{cube:o,bindingKeyExpr:l,timeExpr:c,cohortFilterConditions:u,activityFilterConditions:d,breakdowns:f}}buildFilterConditions(e,t,n,r){if(!e)return[];let i=Array.isArray(e)?e:[e],a=[];for(let e of i){let i=this.buildSingleFilterCondition(e,t,n,r);i&&a.push(i)}return a}buildSingleFilterCondition(t,n,r,i){if(`and`in t||`or`in t){let a=t,o=[],s=`and`in a&&!!a.and,c=a.and||a.or||[];for(let e of c){let t=this.buildSingleFilterCondition(e,n,r,i);t&&o.push(t)}return o.length===0?null:o.length===1?o[0]:s?e.it(...o):e.dt`(${e.dt.join(o,e.dt` OR `)})`}let a=t,[o,s]=a.member.split(`.`),c=r.get(o);if(!c)return null;let l=c.dimensions?.[s];if(!l)return null;let u=e.tt(l,i);return this.filterBuilder.buildFilterCondition(u,a.operator,a.values||[],l,a.dateRange)}buildCohortBaseCTE(t,n,r){let i=n.cube.sql(r),a=[];if(i.where&&a.push(i.where),a.push(...n.cohortFilterConditions),t.dateRange){let e=this.buildDateRangeCondition(n.timeExpr,t.dateRange);a.push(e)}let o=this.databaseAdapter.buildTimeDimension(t.granularity,n.timeExpr),s={binding_key:e.dt`${n.bindingKeyExpr}`.as(`binding_key`),cohort_entry:e.dt`MIN(${o})`.as(`cohort_entry`)};for(let t=0;t<n.breakdowns.length;t++){let{expr:r}=n.breakdowns[t];s[`breakdown_${t}`]=e.dt`MIN(${r})`.as(`breakdown_${t}`)}let c=r.db.select(s).from(i.from);a.length>0&&(c=c.where(A(a)));let l=[n.bindingKeyExpr];for(let e=0;e<n.breakdowns.length;e++)l.push(n.breakdowns[e].expr);if(c=c.groupBy(...l),t.dateRange){let e=this.buildDateRangeHavingCondition(o,t.dateRange);c=c.having(e)}return r.db.$with(`cohort_base`).as(c)}buildDateRangeCondition(t,n){let r=this.databaseAdapter.castToType(e.dt`${n.start}`,`timestamp`),i=this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(e.dt`${n.end}`,`timestamp`),`P1D`);return e.dt`${t} >= ${r} AND ${t} < ${i}`}buildDateRangeHavingCondition(t,n){let r=this.databaseAdapter.castToType(e.dt`${n.start}`,`timestamp`),i=this.databaseAdapter.buildDateAddInterval(this.databaseAdapter.castToType(e.dt`${n.end}`,`timestamp`),`P1D`);return e.dt`MIN(${t}) >= ${r} AND MIN(${t}) < ${i}`}buildActivityPeriodsCTE(t,n,r){let i=n.cube.sql(r),a=[];i.where&&a.push(i.where),a.push(...n.activityFilterConditions),a.push(e.dt`${n.timeExpr} >= cohort_base.cohort_entry`);let o=this.databaseAdapter.buildTimeDimension(t.granularity,n.timeExpr),s=this.buildPeriodNumberExpression(e.dt`cohort_base.cohort_entry`,o,t.granularity),c={binding_key:e.dt`cohort_base.binding_key`.as(`binding_key`),period_number:s.as(`period_number`)};for(let t=0;t<n.breakdowns.length;t++)c[`breakdown_${t}`]=e.dt.raw(`cohort_base.breakdown_${t}`).as(`breakdown_${t}`);let l=r.db.select(c).from(i.from).innerJoin(e.dt`cohort_base`,e.dt`${n.bindingKeyExpr} = cohort_base.binding_key`);a.length>0&&(l=l.where(A(a)));let u=[e.dt`cohort_base.binding_key`,s];for(let t=0;t<n.breakdowns.length;t++)u.push(e.dt.raw(`cohort_base.breakdown_${t}`));return l=l.groupBy(...u),r.db.$with(`activity_periods`).as(l)}buildCohortSizesCTE(t,n,r){if(r>0){let t={cohort_size:e.dt`COUNT(*)`.as(`cohort_size`)},i=[];for(let n=0;n<r;n++)t[`breakdown_${n}`]=e.dt.raw(`breakdown_${n}`).as(`breakdown_${n}`),i.push(e.dt.raw(`breakdown_${n}`));let a=n.db.select(t).from(e.dt`cohort_base`).groupBy(...i);return n.db.$with(`cohort_sizes`).as(a)}let i=n.db.select({cohort_size:e.dt`COUNT(*)`.as(`cohort_size`)}).from(e.dt`cohort_base`);return n.db.$with(`cohort_sizes`).as(i)}buildRetentionCountsCTE(t,n,r){let i;if(t.retentionType===`rolling`)i=this.buildRollingRetentionCountsQuery(t,n,r);else{let a={period_number:e.dt`period_number`.as(`period_number`),retained_users:e.dt`COUNT(DISTINCT binding_key)`.as(`retained_users`)},o=[e.dt`period_number`];for(let t=0;t<r;t++)a[`breakdown_${t}`]=e.dt.raw(`breakdown_${t}`).as(`breakdown_${t}`),o.push(e.dt.raw(`breakdown_${t}`));let s=Math.min(t.periods,52);i=n.db.select(a).from(e.dt`activity_periods`).where(e.dt`period_number >= 0 AND period_number <= ${s}`).groupBy(...o)}return n.db.$with(`retention_counts`).as(i)}buildRollingRetentionCountsQuery(t,n,r){let i=[];for(let e=0;e<r;e++)i.push(`breakdown_${e}`);let a=i.length>0?`, ${i.join(`, `)}`:``,o=Math.min(t.periods,52),s=e.dt`(
157
+ SELECT
158
+ binding_key,
159
+ ${e.dt.raw(i.map(e=>`${e}`).join(`, `)+(i.length>0?`,`:``))}
160
+ MAX(period_number) as max_period
161
+ FROM activity_periods
162
+ WHERE period_number >= 0 AND period_number <= ${o}
163
+ GROUP BY binding_key${e.dt.raw(a)}
164
+ )`,c=this.databaseAdapter.buildPeriodSeriesSubquery(o),l={period_number:e.dt`p.period_number`.as(`period_number`),retained_users:e.dt`COUNT(DISTINCT CASE WHEN ump.max_period >= p.period_number THEN ump.binding_key END)`.as(`retained_users`)},u=[e.dt`p.period_number`];for(let t=0;t<r;t++)l[`breakdown_${t}`]=e.dt.raw(`ump.breakdown_${t}`).as(`breakdown_${t}`),u.push(e.dt.raw(`ump.breakdown_${t}`));return n.db.select(l).from(e.dt`${s} ump`).innerJoin(c,e.dt`TRUE`).groupBy(...u)}buildPeriodNumberExpression(e,t,n){return this.databaseAdapter.buildDateDiffPeriods(e,t,n)}};function Y(e){return{name:e.name,cube:e}}function X(t,n){return t.measures?t.measures.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.K(`server.errors.cubeNotFoundForMeasure`,{cubeName:r,measure:t}));return{name:t,cube:Y(a),localName:i}}):[]}function jt(t,n){return t.dimensions?t.dimensions.map(t=>{let[r,i]=t.split(`.`),a=n.get(r);if(!a)throw Error(e.K(`server.errors.cubeNotFoundForDimension`,{cubeName:r,dimension:t}));return{name:t,cube:Y(a),localName:i}}):[]}function Mt(t,n){return t.timeDimensions?t.timeDimensions.map(t=>{let[r,i]=t.dimension.split(`.`),a=n.get(r);if(!a)throw Error(e.K(`server.errors.cubeNotFoundForTimeDimension`,{cubeName:r,timeDimension:t.dimension}));return{name:t.dimension,cube:Y(a),localName:i,granularity:t.granularity,dateRange:t.dateRange,fillMissingDates:t.fillMissingDates,compareDateRange:t.compareDateRange}}):[]}function Nt(e,t){return{measures:X(e,t),dimensions:jt(e,t),timeDimensions:Mt(e,t)}}function Pt(e,t){return{measures:e.measures.map(e=>{let[n,r]=e.split(`.`);return{name:e,cube:{name:n,cube:t.get(n)},localName:r}}),dimensions:[],timeDimensions:[]}}var Ft=class{queryPlanner;constructor(e){this.queryPlanner=e}plan(e,t,n){return this.planWithAnalysis(e,t,n).plan}planWithAnalysis(t,n,r){let i=Array.from(this.queryPlanner.analyzeCubeUsage(n));if(i.length===0)throw Error(e.K(`server.errors.noCubesInQuery`));let a=this.queryPlanner.analyzePrimaryCube(i,n,t),o=a.selectedCube,s=t.get(o);if(!s)throw Error(e.K(`server.errors.primaryCubeNotFound`,{cubeName:o}));let c=i.filter(e=>e!==o).map(e=>this.queryPlanner.analyzeJoinPathForTarget(t,o,e,n)),l=i.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,s,i,r,n):[],u=i.length>1?this.queryPlanner.buildPreAggregationCTEs(t,s,l,n,r)??[]:[],d=this.queryPlanner.buildWarnings(n,u),f=this.buildSourceFromPhases(s,l,u,t,n,r),p=f.source,m=this.buildQueryNode(p,n,t,d),h=this.buildPreAggregationAnalysis(u),g=new Map;for(let e of i){let n=t.get(e);n&&g.set(e,n)}let _=e.P(n.measures??[],g),v=[...c.filter(e=>!e.pathFound&&e.error).map(e=>e.error),...d.map(e=>e.message)];return{plan:m,analysis:{timestamp:new Date().toISOString(),cubeCount:i.length,cubesInvolved:[...i].sort(),primaryCube:a,joinPaths:c,preAggregations:h,querySummary:{queryType:u.length>0?`multi_cube_cte`:i.length>1?`multi_cube_join`:`single_cube`,measureStrategy:f.strategy,joinCount:l.length,cteCount:u.length,hasPreAggregation:u.length>0,hasWindowFunctions:_},warnings:v.length>0?v:void 0,planningTrace:{steps:[{phase:`cube_usage`,decision:`Identified ${i.length} cube${i.length===1?``:`s`} from query members`,details:{cubesInvolved:[...i].sort()}},{phase:`primary_cube_selection`,decision:`Selected '${a.selectedCube}' as primary cube (${a.reason})`,details:{selectedCube:a.selectedCube,reason:a.reason,candidates:a.candidates?.map(e=>e.cubeName)}},{phase:`join_planning`,decision:`Planned ${l.length} join${l.length===1?``:`s`}`,details:{joinCount:l.length,joinTargets:l.map(e=>e.target.name),pathSelection:c.map(e=>({targetCube:e.targetCube,strategy:e.selection?.strategy,selectedRank:e.selection?.selectedRank,selectedScore:e.selection?.selectedScore}))}},{phase:`cte_planning`,decision:`Planned ${u.length} pre-aggregation CTE${u.length===1?``:`s`}`,details:{cteCount:u.length,cubes:u.map(e=>e.cube.name)}},{phase:`measure_strategy`,decision:`Selected '${f.strategy}' measure strategy`,details:{strategy:f.strategy,regularMeasures:f.classification.regular.map(e=>e.name),multipliedMeasures:f.classification.multiplied.map(e=>e.name),deduplicationSafeMeasures:f.classification.deduplicationSafe.map(e=>e.name),sourceType:p.type}},{phase:`warnings`,decision:d.length>0?`Generated ${d.length} planning warning${d.length===1?``:`s`}`:`No planning warnings generated`,details:{warningCodes:d.map(e=>e.code)}}]}}}}buildSourceFromPhases(e,t,n,r,i,a){let o=this.tryBuildMultiFactMergeSource(i,r,a);if(o)return{source:o,strategy:`multiFactMerge`,classification:{regular:X(i,r),multiplied:[],deduplicationSafe:[]}};let s=this.buildSimpleSourceFromPhases(e,t,n,r,i),c=this.classifyMeasuresForStrategy(s.schema.measures,n),l=this.selectMeasureStrategy(c,i,r);return l===`keysDeduplication`?{source:this.buildKeysDeduplicationSource(s,c),strategy:l,classification:c}:{source:s,strategy:l,classification:c}}buildSimpleSourceFromPhases(e,t,n,r,i){let a=Y(e),o=t,s=n.map(e=>{let t=Y(e.cube);return{type:`ctePreAggregate`,schema:Pt(e,r),cube:t,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType??`aggregate`,cteReason:e.cteReason??`hasMany`}});return{type:`simpleSource`,schema:Nt(i,r),primaryCube:a,joins:o,ctes:s}}tryBuildMultiFactMergeSource(e,t,n){if(!e.measures||e.measures.length<2)return null;let r=new Set;for(let t of e.measures){let[e]=t.split(`.`);e&&r.add(e)}if(r.size<2)return null;let i=new Set;for(let t of e.dimensions??[]){let[e]=t.split(`.`);e&&i.add(e)}for(let t of e.timeDimensions??[]){let[e]=t.dimension.split(`.`);e&&i.add(e)}if(i.size!==1)return null;let a=Array.from(i)[0];if(r.has(a)||!t.get(a))return null;let o=Array.from(r);if(!o.every(e=>this.hasDirectJoinToSharedDimension(t.get(e),a,t)))return null;let s=jt(e,t),c=Mt(e,t),l={measures:X(e,t),dimensions:s,timeDimensions:c},u=[];for(let r of o){let i=(e.measures??[]).filter(e=>e.startsWith(`${r}.`)),o=new Set([r,a]),s={measures:i,dimensions:e.dimensions,timeDimensions:e.timeDimensions,filters:this.projectFiltersToAllowedCubes(e.filters,o)},c=this.buildGroupQueryNode(s,t,n);if(!c)return null;u.push(c)}return u.length<2?null:{type:`multiFactMerge`,schema:l,groups:u,sharedDimensions:s,mergeStrategy:`fullJoin`}}hasDirectJoinToSharedDimension(t,n,r){if(!t?.joins)return!1;for(let[,i]of Object.entries(t.joins)){let t=e.et(i.targetCube,r);if(t&&t.name===n&&(i.relationship===`belongsTo`||i.relationship===`hasOne`))return!0}return!1}buildGroupQueryNode(e,t,n){let r=Array.from(this.queryPlanner.analyzeCubeUsage(e));if(r.length===0)return null;let i=this.queryPlanner.analyzePrimaryCube(r,e,t),a=t.get(i.selectedCube);if(!a)return null;let o=r.length>1?this.queryPlanner.buildJoinPlanForPrimary(t,a,r,n,e):[],s=r.length>1?this.queryPlanner.buildPreAggregationCTEs(t,a,o,e,n)??[]:[],c=this.queryPlanner.buildWarnings(e,s),l=this.buildSourceFromPhases(a,o,s,t,e,n);return this.buildQueryNode(l.source,e,t,c)}projectFiltersToAllowedCubes(e,t){if(!e||e.length===0)return;let n=e.map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length>0?n:void 0}projectFilterNodeToAllowedCubes(e,t){if(`member`in e){let[n]=e.member.split(`.`);return n&&t.has(n)?e:null}if(`and`in e){let n=(e.and??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{and:n}}if(`or`in e){let n=(e.or??[]).map(e=>this.projectFilterNodeToAllowedCubes(e,t)).filter(e=>!!e);return n.length===0?null:n.length===1?n[0]:{or:n}}return null}classifyMeasuresForStrategy(e,t){let n={regular:[],multiplied:[],deduplicationSafe:[]},r=new Set(t.filter(e=>e.cteReason===`fanOutPrevention`).map(e=>e.cube.name));for(let t of e){let e=t.cube.cube,i=e.measures?.[t.localName];if(!i||!r.has(e.name)){n.regular.push(t);continue}this.isDeduplicationSafeMeasure(i)?n.deduplicationSafe.push(t):n.multiplied.push(t)}return n}selectMeasureStrategy(e,t,n){return e.multiplied.length===0?`simple`:e.multiplied.every(e=>this.getPrimaryKeyColumns(e.cube.cube).length>0)&&this.isKeysDeduplicationExecutionSupported(e,t,n)?`keysDeduplication`:`ctePreAggregateFallback`}isKeysDeduplicationExecutionSupported(e,t,n){let r=new Set(e.multiplied.map(e=>e.cube.name));if(r.size!==1)return!1;let i=Array.from(r)[0],a=t.measures??[];if(a.length===0)return!1;let o=n.get(i);if(!o)return!1;for(let e of a){let[t,r]=e.split(`.`);if(t!==i){let e=n.get(t)?.measures?.[r];if(!e||![`sum`,`count`,`number`,`min`,`max`].includes(e.type))return!1;continue}let a=o.measures?.[r];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!this.queryHasMeasureFilter(t,i,o)}queryHasMeasureFilter(e,t,n){let r=e=>{let[r,i]=e.split(`.`);return r===t&&!!n.measures?.[i]},i=e=>{if(!e)return!1;for(let t of e){if(`and`in t){if(i(t.and))return!0;continue}if(`or`in t){if(i(t.or))return!0;continue}if(`member`in t&&r(t.member))return!0}return!1};return i(e.filters)}buildKeysDeduplicationSource(e,t){let n=this.deduplicateColumnRefs(t.multiplied.flatMap(e=>this.getPrimaryKeyColumns(e.cube.cube))),r=t.regular.length>0?t.regular.map(e=>e.name):void 0;return{type:`keysDeduplication`,schema:e.schema,keysSource:e,measureSource:e,joinOn:n,regularMeasures:r}}isDeduplicationSafeMeasure(e){return e.type===`countDistinct`||e.type===`countDistinctApprox`}getPrimaryKeyColumns(e){let t=[];for(let[n,r]of Object.entries(e.dimensions??{}))r.primaryKey&&typeof r.sql!=`function`&&t.push({column:r.sql,alias:`${e.name}.${n}`});return t}deduplicateColumnRefs(e){let t=new Map;for(let n of e){let e=n.alias??String(n.column?.name??``);t.has(e)||t.set(e,n)}return Array.from(t.values())}buildQueryNode(e,t,n,r){let i=Nt(t,n),{measures:a,dimensions:o,timeDimensions:s}=i,c=this.buildOrderByRefs(t);return{type:`query`,schema:i,source:e,dimensions:o,measures:a,filters:t.filters??[],timeDimensions:s,orderBy:c,limit:t.limit,offset:t.offset,ungrouped:t.ungrouped,warnings:r}}buildPreAggregationAnalysis(e){return e.map(e=>({cubeName:e.cube.name,cteAlias:e.cteAlias,reason:e.cteReason===`fanOutPrevention`?`Potential fan-out from hasMany joins - pre-aggregate ${e.cube.name} to preserve correctness`:`hasMany relationship requires pre-aggregation for ${e.cube.name}`,reasonType:e.cteReason,measures:e.measures,joinKeys:e.joinKeys.map(e=>({sourceColumn:e.sourceColumn,targetColumn:e.targetColumn})),cteType:e.cteType}))}buildOrderByRefs(e){return e.order?Object.entries(e.order).map(([e,t])=>({name:e,direction:t})):[]}},It=class{name=`identity`;optimise(e){return e}};function Lt(e,t,n,r){let i=Rt(e,n,r),a=[],o=new Map,s=new Map;if(e.preAggregationCTEs&&e.preAggregationCTEs.length>0)for(let c of e.preAggregationCTEs){let l=r.cteBuilder.buildPreAggregationCTE(c,t,n,e,i);l&&(a.push(l),o.set(c.cube.name,c.cteAlias),zt(c,s))}return{preBuiltFilterMap:i,ctes:a,cteAliasMap:o,downstreamCubeMap:s}}function Rt(t,n,r){let i=new Map;if(!t.preAggregationCTEs||t.preAggregationCTEs.length===0)return i;for(let a of t.preAggregationCTEs)if(a.propagatingFilters&&a.propagatingFilters.length!==0)for(let t of a.propagatingFilters){let a=t.sourceCube.name;if(!i.has(a)){let e={filters:t.filters},o=new Map([[a,t.sourceCube]]),s=r.queryBuilder.buildWhereConditions(o,e,n);i.set(a,s)}let o=i.get(a);o&&o.length>0&&(t.preBuiltFilterSQL=o.length===1?o[0]:e.it(...o))}return i}function zt(e,t){if(e.downstreamJoinKeys)for(let n of e.downstreamJoinKeys)t.set(n.targetCubeName,{cteAlias:e.cteAlias,joinKeys:n.joinKeys})}function Bt(t,n,r,i,a,o){if(r.measures)for(let s of r.measures){let[c,l]=s.split(`.`),u=a.get(c);if(!u?.measures?.[l])continue;let d=u.measures[l];if(!z.isPostAggregationWindow(d))continue;let f=z.getWindowBaseMeasure(d,c);if(!f)continue;let[p,m]=f.split(`.`),h=a.get(p);if(!h?.measures?.[m])continue;let g=h.measures[m],_=n.preAggregationCTEs?.find(e=>e.cube?.name===p&&e.measures?.includes(f)),v;if(_){let t=e.dt`${e.dt.identifier(_.cteAlias)}.${e.dt.identifier(m)}`;v=e.dt`sum(${t})`}else v=o.queryBuilder.buildMeasureExpression(g,i,h);t[f]||(t[f]=e.dt`${v}`.as(f));let y=Vt(d,v,r,i,u,n,o);y&&(t[s]=e.dt`${y}`.as(s))}}function Vt(t,n,r,i,a,o,s){let c=t.windowConfig||{},l=(t,n)=>{if(!o.preAggregationCTEs)return null;let r=o.preAggregationCTEs.find(e=>e.cube?.name===t);return r&&r.cteAlias?e.dt`${e.dt.identifier(r.cteAlias)}.${e.dt.identifier(n)}`:null},u;if(c.orderBy&&c.orderBy.length>0)u=c.orderBy.map(t=>{let o=t.field.includes(`.`)?t.field.split(`.`)[1]:t.field;if(r.timeDimensions)for(let e of r.timeDimensions){let[n,r]=e.dimension.split(`.`);if(r===o){let c=l(n,o);if(c)return{field:c,direction:t.direction};let u=a.dimensions?.[r];if(u)return{field:s.queryBuilder.buildTimeDimensionExpression(u.sql,e.granularity,i),direction:t.direction}}}let u=a.dimensions?.[o];return u?{field:e.nt(u.sql,i),direction:t.direction}:o===(c.measure?.includes(`.`)?c.measure.split(`.`)[1]:c.measure)||t.field===c.measure?{field:n,direction:t.direction}:null}).filter(e=>e!==null);else if(r.timeDimensions&&r.timeDimensions.length>0){let e=r.timeDimensions[0],[t,n]=e.dimension.split(`.`),o=l(t,n);if(o)u=[{field:o,direction:`asc`}];else{let r=a.name===t?a:void 0;if(r?.dimensions?.[n]){let t=r.dimensions[n];u=[{field:s.queryBuilder.buildTimeDimensionExpression(t.sql,e.granularity,i),direction:`asc`}]}}}let d;c.partitionBy&&c.partitionBy.length>0&&(d=c.partitionBy.map(t=>{let n=t.includes(`.`)?t.split(`.`)[1]:t,r=a.dimensions?.[n];return r?e.nt(r.sql,i):null}).filter(e=>e!==null));let f=s.databaseAdapter.buildWindowFunction(t.type,n,d,u,{offset:c.offset,defaultValue:c.defaultValue,nTile:c.nTile,frame:c.frame});if(!f)return null;switch(c.operation||z.getDefaultWindowOperation(t.type)){case`difference`:return e.dt`${n} - ${f}`;case`ratio`:return e.dt`${n} / NULLIF(${f}, 0)`;case`percentChange`:return e.dt`((${n} - ${f}) / NULLIF(${f}, 0)) * 100`;default:return f}}function Ht(e,t,n,r,i){let a={...i.queryBuilder.buildSelections(e.joinCubes.length>0?r:e.primaryCube,t,n)};if(e.preAggregationCTEs)for(let o of e.preAggregationCTEs)Ut(a,o,t,n,r,i),Gt(a,o,r);return Bt(a,e,t,n,r,i),a}function Ut(t,n,r,i,a,o){let s=n.cube.name;for(let c of n.measures){if(!t[c])continue;let[,l]=c.split(`.`),u=a.get(s);if(!u?.measures?.[l])continue;let d=u.measures[l],f=e.dt`${e.dt.identifier(n.cteAlias)}.${e.dt.identifier(l)}`,p;p=d.type===`calculated`&&d.calculatedSql?o.queryBuilder.buildCTECalculatedMeasure(d,u,n,a,i):Wt(d,f,n,r,a,o),t[c]=e.dt`${p}`.as(c)}}function Wt(e,t,n,r,i,c){let l=n.cteReason===`fanOutPrevention`,u=Kt(n,r,i),d=l||u;switch(e.type){case`count`:case`countDistinct`:case`sum`:return d?o(t):a(t);case`avg`:return d?o(t):c.databaseAdapter.buildAvg(t);case`min`:return s(t);case`max`:return o(t);case`number`:return o(t);default:return d?o(t):a(t)}}function Gt(t,n,r){let i=n.cube.name;for(let a in t){let[o,s]=a.split(`.`);if(o!==i)continue;let c=r.get(i),l=c&&c.dimensions?.[s],u=a.startsWith(i+`.`);if(!l&&!u)continue;let d=n.joinKeys.find(e=>e.targetColumn===s);if(!d&&c?.dimensions?.[s]){let e=c.dimensions[s].sql;d=n.joinKeys.find(t=>t.targetColumnObj===e)}(d||u&&c?.dimensions?.[s])&&(t[a]=e.dt`${e.dt.identifier(n.cteAlias)}.${e.dt.identifier(s)}`.as(a))}}function Kt(e,t,n){return e.cteReason!==`hasMany`||e.downstreamJoinKeys&&e.downstreamJoinKeys.length>0||e.intermediateJoins&&e.intermediateJoins.length>0||!(t.dimensions&&t.dimensions.length>0||t.timeDimensions&&t.timeDimensions.length>0)||t.dimensions?.some(t=>t.startsWith(`${e.cube.name}.`))||t.timeDimensions?.some(t=>t.dimension.startsWith(`${e.cube.name}.`))?!1:e.joinKeys.length>0&&e.joinKeys.every(e=>!!e.sourceColumnObj&&qt(e.sourceColumnObj,t,n))}function qt(e,t,n){if(t.dimensions)for(let r of t.dimensions){let[t,i]=r.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}if(t.timeDimensions)for(let r of t.timeDimensions){if(r.granularity)continue;let[t,i]=r.dimension.split(`.`);if(n.get(t)?.dimensions?.[i]?.sql===e)return!0}return!1}function Z(e,t,n,r){switch(t){case`inner`:return e.innerJoin(n,r);case`right`:return e.rightJoin(n,r);case`full`:return e.fullJoin(n,r);default:return e.leftJoin(n,r)}}function Q(e){let t=new Map;if(t.set(e.primaryCube.name,e.primaryCube),e.joinCubes)for(let n of e.joinCubes)t.set(n.cube.name,n.cube);return t}function Jt(e,t,n,r,i,a){let o=[],s=Yt(t,n,r,i);s=Xt(s,n.joins);let c=new Set,l=Zt(e);if(e.joinCubes&&e.joinCubes.length>0)for(let n of e.joinCubes){let r=n.cube.name;(!l.has(r)||i.cteAliasMap.has(r))&&(s=Qt(s,n,e,i,t,o),s=tn(s,n,e,i,t,a,c))}return{drizzleQuery:s,allWhereConditions:o,cubesWithSecurityInJoin:c,absorbedIntermediateCubes:l}}function Yt(e,t,n,r){return r.ctes.length>0?e.db.with(...r.ctes).select(n).from(t.from):e.db.select(n).from(t.from)}function Xt(e,t){if(!t)return e;let n=e;for(let e of t)n=Z(n,e.type??`left`,e.table,e.on);return n}function Zt(e){let t=new Set;if(e.preAggregationCTEs){for(let n of e.preAggregationCTEs)if(n.intermediateJoins&&n.intermediateJoins.length>0)for(let e of n.intermediateJoins)t.add(e.cube.name)}return t}function Qt(e,t,n,r,i,a){let o=t.junctionTable;if(!o)return e;let s=$t(o,t,n,r),c=[];if(o.securitySql){let e=o.securitySql(i.securityContext);Array.isArray(e)?c.push(...e):c.push(e)}try{let t=Z(e,o.joinType??`left`,o.table,s);return c.length>0&&a.push(...c),t}catch{return e}}function $t(t,n,r,i){let a=t.joinCondition,o=t.sourceCubeName?i.cteAliasMap.get(t.sourceCubeName):void 0;if(!o)return a;let s=(r.preAggregationCTEs?.find(e=>e.cube.name===t.sourceCubeName))?.downstreamJoinKeys?.find(e=>e.targetCubeName===n.cube.name);if(s&&s.joinKeys.length>0){let t=[];for(let n of s.joinKeys){let r=e.dt`${e.dt.identifier(o)}.${e.dt.identifier(n.sourceColumn)}`,i=n.targetColumnObj;i&&t.push(e.at(i,r))}t.length>0&&(a=e.it(...t))}return a}function en(t,n,r,i,a,o){if(n)return{joinTarget:e.dt`${e.dt.identifier(n)}`,joinCondition:o.cteBuilder.buildCTEJoinCondition(t,n,i),securityCondition:void 0,joinCubeBase:void 0};let s=r.downstreamCubeMap.get(t.cube.name),c=t.cube.sql(a),l;if(s&&!t.junctionTable){let t=[];for(let n of s.joinKeys){let r=e.dt`${e.dt.identifier(s.cteAlias)}.${e.dt.identifier(n.sourceColumn)}`,i=n.targetColumnObj||e.dt.identifier(n.targetColumn);t.push(e.at(r,i))}l=t.length===1?t[0]:e.it(...t)}else l=t.joinCondition;return{joinTarget:c.from,joinCondition:l,securityCondition:c.where,joinCubeBase:c}}function tn(t,n,r,i,a,o,s){let{joinTarget:c,joinCondition:l,securityCondition:u,joinCubeBase:d}=en(n,i.cteAliasMap.get(n.cube.name),i,r,a,o),f=n.joinType||`left`,p=f!==`inner`&&u?e.it(l,u):l;try{let e;return f===`inner`?e=t.innerJoin(c,l):(e=Z(t,f,c,p),u&&s.add(n.cube.name)),Xt(e,d?.joins)}catch{return t}}function nn(t,n,r,i,a,o,s,c){let l=rn(t,n,r,i,a,o,s,c),u=s.drizzleQuery;if(l.length>0){let t=l.length===1?l[0]:e.it(...l);u=u.where(t)}return an(u,t,n,r,i,c)}function rn(e,t,n,r,i,a,o,s){let c=[...o.allWhereConditions];if(i.where&&c.push(i.where),e.joinCubes&&e.joinCubes.length>0)for(let t of e.joinCubes){let e=t.cube.name;if(a.cteAliasMap.get(e)||o.absorbedIntermediateCubes.has(e)||o.cubesWithSecurityInJoin.has(e))continue;let r=t.cube.sql(n);r.where&&c.push(r.where)}let l=s.queryBuilder.buildWhereConditions(e.joinCubes.length>0?r:e.primaryCube,t,n,e,a.preBuiltFilterMap);return l.length>0&&c.push(...l),c}function an(t,n,r,i,a,o){let s=n.joinCubes.length>0?a:n.primaryCube,c=t,l=o.queryBuilder.buildGroupByFields(s,r,i,n);if(l.length>0&&(c=c.groupBy(...l)),!r.ungrouped){let t=o.queryBuilder.buildHavingConditions(s,r,i,n);if(t.length>0){let n=t.length===1?t[0]:e.it(...t);c=c.having(n)}}let u=o.queryBuilder.buildOrderBy(r);return u.length>0&&(c=c.orderBy(...u)),o.queryBuilder.applyLimitAndOffset(c,r)}function on(e,t,n,r){let i=e.keysDeduplication;if(!i?.multipliedCubeName||!t.measures?.length)return null;let a=e.joinCubes.length>0?Q(e):new Map([[e.primaryCube.name,e.primaryCube]]),o=a.get(i.multipliedCubeName);if(!o||!hn(t,o,i.multipliedCubeName))return null;let s=i.primaryKeyDimensions.length>0?i.primaryKeyDimensions:_n(o);if(s.length===0)return null;let c=`${i.multipliedCubeName.toLowerCase()}_keys`,l=`${i.multipliedCubeName.toLowerCase()}_pk_agg`,u=i.regularMeasures??[],d=sn(t,n,r,a,o,s,u);if(!d)return null;let f=cn(e,t,n,r,a,c,d.keysSelections,d.keyGroupBy),p=dn(t,n,r,o,s,d.multipliedMeasures,l);return p?mn(t,n,r,a,o,{keysAlias:c,aggAlias:l,keysCte:f,aggCte:p,pkDimensions:s,pkAliases:d.pkAliases,multipliedMeasures:d.multipliedMeasures,regularMeasureNames:u}):null}function sn(t,n,r,i,a,o,s){let c={},l=[];if(t.dimensions)for(let r of t.dimensions){let[t,a]=r.split(`.`),o=i.get(t),s=o?.dimensions?.[a];if(!o||!s)return null;let u=e.nt(s.sql,n);c[r]=e.dt`${u}`.as(r),l.push(u)}if(t.timeDimensions)for(let a of t.timeDimensions){let[t,o]=a.dimension.split(`.`),s=i.get(t),u=s?.dimensions?.[o];if(!s||!u)return null;let d=r.queryBuilder.buildTimeDimensionExpression(u.sql,a.granularity,n);c[a.dimension]=e.dt`${d}`.as(a.dimension),l.push(d)}let u=[];for(let t of o){let r=a.dimensions?.[t];if(!r)return null;let i=e.nt(r.sql,n),o=`__pk__${t}`;c[o]=e.dt`${i}`.as(o),l.push(i),u.push(o)}let d=new Set(s),f=t.measures.filter(e=>!d.has(e));if(s.length>0){let t=r.queryBuilder.buildResolvedMeasures(s,i,n);for(let n of s){let r=t.get(n);if(!r)return null;let i=`__reg__${n.replace(`.`,`__`)}`;c[i]=e.dt`${r()}`.as(i)}}return{keysSelections:c,keyGroupBy:l,pkAliases:u,multipliedMeasures:f}}function cn(e,t,n,r,i,a,o,s){let c=e.primaryCube.sql(n),l=[];c.where&&l.push(c.where);let u=n.db.select(o).from(c.from);if(c.joins)for(let e of c.joins)u=Z(u,e.type??`left`,e.table,e.on);for(let t of e.joinCubes)u=ln(u,t,n,l);return l.push(...r.queryBuilder.buildWhereConditions(i,t,n)),u=pn(u,l),s.length>0&&(u=u.groupBy(...s)),n.db.$with(a).as(u)}function ln(e,t,n,r){let i=e;t.junctionTable&&(i=Z(i,t.junctionTable.joinType??`left`,t.junctionTable.table,t.junctionTable.joinCondition),un(t.junctionTable.securitySql,n,r));let a=t.cube.sql(n);if(i=Z(i,t.joinType??`left`,a.from,t.joinCondition),a.joins)for(let e of a.joins)i=Z(i,e.type??`left`,e.table,e.on);return a.where&&r.push(a.where),i}function un(e,t,n){if(!e)return;let r=e(t.securityContext);Array.isArray(r)?n.push(...r):n.push(r)}function dn(e,t,n,r,i,a,o){let s=r.sql(t),c=fn(t,n,r,i,a);if(!c)return null;let l=t.db.select(c.aggSelections).from(s.from);if(s.joins)for(let e of s.joins)l=Z(l,e.type??`left`,e.table,e.on);let u=[];return s.where&&u.push(s.where),u.push(...n.queryBuilder.buildWhereConditions(r,e,t)),l=pn(l,u),c.aggGroupBy.length>0&&(l=l.groupBy(...c.aggGroupBy)),t.db.$with(o).as(l)}function fn(t,n,r,i,a){let o={},s=[];for(let n of i){let i=r.dimensions?.[n];if(!i)return null;let a=e.nt(i.sql,t);o[n]=e.dt`${a}`.as(n),s.push(a)}let c=new Set;for(let e of a){let[,t]=e.split(`.`);r.measures?.[t]?.type===`avg`&&c.add(t)}let l=a.filter(e=>{let[,t]=e.split(`.`);return!c.has(t)});if(l.length>0){let i=n.queryBuilder.buildResolvedMeasures(l,new Map([[r.name,r]]),t);for(let t of l){let[,n]=t.split(`.`),r=i.get(t);if(!r||typeof r!=`function`)return null;o[n]=e.dt`${r()}`.as(n)}}for(let n of a){let[,i]=n.split(`.`);if(!c.has(i))continue;let a=r.measures?.[i];if(!a?.sql)return null;let s=e.nt(a.sql,t),l=`__avg_sum__${i}`,u=`__avg_count__${i}`;o[l]=e.dt`sum(${s})`.as(l),o[u]=e.dt`count(${s})`.as(u)}return{aggSelections:o,aggGroupBy:s}}function pn(t,n){return n.length===0?t:t.where(n.length===1?n[0]:e.it(...n))}function mn(t,n,r,i,a,o){let{keysAlias:s,aggAlias:c,keysCte:l,aggCte:u,pkDimensions:d,pkAliases:f,multipliedMeasures:p,regularMeasureNames:m}=o,h={};for(let n of t.dimensions??[])h[n]=e.dt`${e.dt.identifier(s)}.${e.dt.identifier(n)}`.as(n);for(let n of t.timeDimensions??[])h[n.dimension]=e.dt`${e.dt.identifier(s)}.${e.dt.identifier(n.dimension)}`.as(n.dimension);for(let e of p){let[,t]=e.split(`.`),n=a.measures?.[t];h[e]=vn(n?.type??`sum`,c,t,e)}for(let e of m){let[t,n]=e.split(`.`),r=i.get(t)?.measures?.[n],a=`__reg__${e.replace(`.`,`__`)}`;h[e]=vn(r?.type??`sum`,s,a,e)}let g=n.db.with(l,u).select(h).from(e.dt`${e.dt.identifier(s)}`),_=f.map((t,n)=>e.at(e.dt`${e.dt.identifier(s)}.${e.dt.identifier(t)}`,e.dt`${e.dt.identifier(c)}.${e.dt.identifier(d[n])}`)),v=_.length===1?_[0]:e.it(..._);g=g.leftJoin(e.dt`${e.dt.identifier(c)}`,v);let y=[...(t.dimensions??[]).map(t=>e.dt`${e.dt.identifier(s)}.${e.dt.identifier(t)}`),...(t.timeDimensions??[]).map(t=>e.dt`${e.dt.identifier(s)}.${e.dt.identifier(t.dimension)}`)];y.length>0&&(g=g.groupBy(...y));let b=r.queryBuilder.buildOrderBy(t,Object.keys(h));return b.length>0&&(g=g.orderBy(...b)),r.queryBuilder.applyLimitAndOffset(g,t)}function hn(e,t,n){if(!e.measures?.length)return!1;for(let r of e.measures){let[e,i]=r.split(`.`);if(e!==n)continue;let a=t.measures?.[i];if(!a||![`sum`,`count`,`number`,`min`,`max`,`avg`].includes(a.type))return!1}return!gn(e,t,n)}function gn(e,t,n){let r=e=>{if(!e)return!1;for(let i of e){if(`and`in i){if(r(i.and))return!0;continue}if(`or`in i){if(r(i.or))return!0;continue}if(`member`in i){let[e,r]=i.member.split(`.`);if(e===n&&t.measures?.[r])return!0}}return!1};return r(e.filters)}function _n(e){return Object.entries(e.dimensions??{}).filter(([,e])=>!!e.primaryKey).map(([e])=>e)}function vn(t,n,r,i){switch(t){case`min`:{let t=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(r)}`;return e.dt`min(${t})`.as(i)}case`max`:{let t=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(r)}`;return e.dt`max(${t})`.as(i)}case`avg`:{let t=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(`__avg_sum__${r}`)}`,a=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(`__avg_count__${r}`)}`;return e.dt`sum(${t}) / nullif(sum(${a}), 0)`.as(i)}default:{let t=e.dt`${e.dt.identifier(n)}.${e.dt.identifier(r)}`;return e.dt`coalesce(sum(${t}), 0)`.as(i)}}}function yn(e,t,n,r,i){let a=e.multiFactMerge;if(!a||a.groups.length<2)return null;let o=[...t.dimensions??[],...(t.timeDimensions??[]).map(e=>e.dimension)],s=Array.from(new Set(o)),c=s.length>0,l=En(r),u=c&&a.mergeStrategy===`fullJoin`&&!l,d=a.groups.map(e=>{let t=i(e.queryPlan,e.query,n);return n.db.$with(e.alias).as(t)});return u?Cn(t,n,r,a,d,s):Sn(t,n,r,a,d,s,Tn(a.mergeStrategy,c,l))}function bn(t,n,r){let i={};for(let t of n){let n=Dn(r,t);i[t]=e.dt`${n}`.as(t)}for(let n of t.groups)for(let t of n.measures){let r=e.dt`${e.dt.identifier(n.alias)}.${e.dt.identifier(t)}`;i[t]=e.dt`coalesce(${r}, 0)`.as(t)}return i}function xn(t,n,r){if(n.length===0)return e.dt`1 = 1`;let i=n.map(n=>e.at(r.get(n),e.dt`${e.dt.identifier(t)}.${e.dt.identifier(n)}`));return i.length===1?i[0]:e.it(...i)}function Sn(t,n,r,i,a,o,s){let c=i.groups[0].alias,l=bn(i,o,i.groups.map(e=>e.alias)),u=n.db.with(...a).select(l).from(e.dt`${e.dt.identifier(c)}`),d=new Map;for(let t of o)d.set(t,e.dt`${e.dt.identifier(c)}.${e.dt.identifier(t)}`);for(let t=1;t<i.groups.length;t++){let n=i.groups[t].alias,r=xn(n,o,d);if(u=Z(u,s,e.dt`${e.dt.identifier(n)}`,r),o.length>0&&s===`full`)for(let t of o)d.set(t,e.dt`coalesce(${d.get(t)}, ${e.dt`${e.dt.identifier(n)}.${e.dt.identifier(t)}`})`)}let f=r.queryBuilder.buildOrderBy(t,Object.keys(l));return f.length>0&&(u=u.orderBy(...f)),r.queryBuilder.applyLimitAndOffset(u,t)}function Cn(t,n,r,i,a,o){let s=`mf_all_keys`,c=i.groups.map(t=>e.dt`select ${wn(t.alias,o)} from ${e.dt.identifier(t.alias)}`),l=e.dt`${e.dt.join(c,e.dt` union `)}`,u=n.db.$with(s).as(l),d={};for(let t of o)d[t]=e.dt`${e.dt.identifier(s)}.${e.dt.identifier(t)}`.as(t);for(let t of i.groups)for(let n of t.measures){let r=e.dt`${e.dt.identifier(t.alias)}.${e.dt.identifier(n)}`;d[n]=e.dt`coalesce(${r}, 0)`.as(n)}let f=n.db.with(...a,u).select(d).from(e.dt`${e.dt.identifier(s)}`);for(let t of i.groups){let n=o.map(n=>e.at(e.dt`${e.dt.identifier(s)}.${e.dt.identifier(n)}`,e.dt`${e.dt.identifier(t.alias)}.${e.dt.identifier(n)}`)),r=n.length===1?n[0]:e.it(...n);f=f.leftJoin(e.dt`${e.dt.identifier(t.alias)}`,r)}let p=r.queryBuilder.buildOrderBy(t,Object.keys(d));return p.length>0&&(f=f.orderBy(...p)),r.queryBuilder.applyLimitAndOffset(f,t)}function wn(t,n){let r=n.map(n=>e.dt`${e.dt.identifier(t)}.${e.dt.identifier(n)} as ${e.dt.identifier(n)}`);return e.dt.join(r,e.dt`, `)}function Tn(e,t,n){return!t||e===`innerJoin`?`inner`:e===`leftJoin`?`left`:n?`full`:`left`}function En(e){let t=e.databaseAdapter.getEngineType();return t===`postgres`||t===`duckdb`}function Dn(t,n){if(t.length===1)return e.dt`${e.dt.identifier(t[0])}.${e.dt.identifier(n)}`;let r=t.map(t=>e.dt`${e.dt.identifier(t)}.${e.dt.identifier(n)}`),i=r[0];for(let t=1;t<r.length;t++)i=e.dt`coalesce(${i}, ${r[t]})`;return i}var On=class{queryBuilder;cteBuilder;databaseAdapter;constructor(e,t,n){this.queryBuilder=e,this.cteBuilder=t,this.databaseAdapter=n}derivePhysicalPlanContext(e){let t=e.source;if(t.type===`multiFactMerge`)return this.derivePhysicalPlanContextFromMultiFact(e,t);if(t.type===`fullKeyAggregate`)return this.derivePhysicalPlanContextFromFullKeyAggregate(e,t);let n=this.resolvePhysicalSimpleSource(t),r=this.resolveKeysDeduplicationMeta(t);return{primaryCube:n.primaryCube.cube,joinCubes:n.joins.map(e=>this.materializeJoin(e)),preAggregationCTEs:n.ctes.map(e=>({cube:e.cube.cube,alias:e.alias,cteAlias:e.cteAlias,joinKeys:e.joinKeys,measures:e.measures,propagatingFilters:e.propagatingFilters,downstreamJoinKeys:e.downstreamJoinKeys,intermediateJoins:e.intermediateJoins,cteType:e.cteType,cteReason:e.cteReason})),keysDeduplication:r,warnings:e.warnings.length>0?e.warnings:void 0}}materializeJoin(t){if(t.junctionTable){let n=e.$(t.joinDef);return{cube:t.target.cube,alias:t.alias,joinType:t.joinType,joinCondition:n.junctionJoins[1].condition,relationship:t.relationship,junctionTable:{table:t.junctionTable.table,alias:t.junctionTable.alias,joinType:t.junctionTable.joinType,joinCondition:n.junctionJoins[0].condition,securitySql:t.joinDef.through?.securitySql,sourceCubeName:t.junctionTable.sourceCubeName}}}return{cube:t.target.cube,alias:t.alias,joinType:t.joinType,joinCondition:e.Q(t.joinDef),relationship:t.relationship}}derivePhysicalPlanContextFromMultiFact(e,t){let n=t.groups.map((e,t)=>{if(e.type!==`query`)return null;let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`mf_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}}).filter(e=>!!e);if(n.length===0)throw Error(`multiFactMerge requires at least one query group`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:t.mergeStrategy,sharedDimensions:t.sharedDimensions.map(e=>e.name),groups:n}}}derivePhysicalPlanContextFromFullKeyAggregate(e,t){let n=t.subqueries.map((e,t)=>{if(e.type!==`query`)throw Error(`fullKeyAggregate currently requires query subqueries`);let n=e,r=this.derivePhysicalPlanContext(n),i=this.toSemanticQuery(n);return{alias:`fka_group_${t+1}`,query:i,queryPlan:r,measures:i.measures??[]}});if(n.length===0)throw Error(`fullKeyAggregate requires at least one subquery`);let r=n[0];return{primaryCube:r.queryPlan.primaryCube,joinCubes:r.queryPlan.joinCubes,preAggregationCTEs:r.queryPlan.preAggregationCTEs,warnings:e.warnings.length>0?e.warnings:void 0,multiFactMerge:{mergeStrategy:`fullJoin`,sharedDimensions:t.dimensions.map(e=>e.name),groups:n}}}toSemanticQuery(e){let t=e.orderBy.length>0?Object.fromEntries(e.orderBy.map(e=>[e.name,e.direction])):void 0;return{measures:e.measures.map(e=>e.name),dimensions:e.dimensions.map(e=>e.name),timeDimensions:e.timeDimensions.map(e=>({dimension:e.name,granularity:e.granularity,dateRange:e.dateRange,fillMissingDates:e.fillMissingDates,compareDateRange:e.compareDateRange})),filters:e.filters,order:t,limit:e.limit,offset:e.offset,ungrouped:e.ungrouped}}resolvePhysicalSimpleSource(e){switch(e.type){case`simpleSource`:return e;case`keysDeduplication`:return this.resolvePhysicalSimpleSourceFromKeysDedup(e);default:throw Error(`Current SQL builder does not support logical node '${e.type}' in physical conversion`)}}resolvePhysicalSimpleSourceFromKeysDedup(e){let t=e.measureSource;if(t.type===`simpleSource`)return t;let n=e.keysSource;if(n.type===`simpleSource`)return n;throw Error(`keysDeduplication requires at least one simpleSource child for SQL physical conversion`)}resolveKeysDeduplicationMeta(e){if(e.type!==`keysDeduplication`)return;let t=e,n=new Set;for(let e of t.joinOn){if(!e.alias)continue;let[t,r]=e.alias.split(`.`);t&&r&&n.add(t)}let r=n.size===1?Array.from(n)[0]:``;return r?{multipliedCubeName:r,primaryKeyDimensions:t.joinOn.map(e=>e.alias?.split(`.`)[1]??``).filter(Boolean),regularMeasures:t.regularMeasures}:void 0}build(e,t,n){let r={queryBuilder:this.queryBuilder,cteBuilder:this.cteBuilder,databaseAdapter:this.databaseAdapter},i=yn(e,t,n,r,(e,t,n)=>this.build(e,t,n));if(i)return i;let a=on(e,t,n,r);if(a)return a;let o=Lt(e,t,n,r),s=e.primaryCube.sql(n),c=e.joinCubes.length>0?Q(e):new Map([[e.primaryCube.name,e.primaryCube]]);return nn(e,t,n,c,s,o,Jt(e,n,s,Ht(e,t,n,c,r),o,r),r)}};function $(e,t){if(typeof process<`u`&&process.env?.DC_DEBUG)try{let{sql:n,params:r}=t.toSQL();console.log(`\n[DC_DEBUG] ${e}`),console.log(n),r.length>0&&console.log(`params:`,r),console.log()}catch{}}var kn=class{dbExecutor;queryBuilder;drizzlePlanBuilder;databaseAdapter;comparisonQueryBuilder;funnelQueryBuilder;flowQueryBuilder;retentionQueryBuilder;logicalPlanBuilder;planOptimiser;modeRouter;resultCache;filterCachePreloader;rlsSetup;constructor(t,n,r,i){if(this.dbExecutor=t,this.databaseAdapter=t.databaseAdapter,!this.databaseAdapter)throw Error(e.K(`server.errors.dbAdapterRequired`));this.queryBuilder=new Xe(this.databaseAdapter);let a=new e.k,o=new Qe(this.queryBuilder);this.drizzlePlanBuilder=new On(this.queryBuilder,o,this.databaseAdapter),this.comparisonQueryBuilder=new Tt(this.databaseAdapter),this.funnelQueryBuilder=new Et(this.databaseAdapter),this.flowQueryBuilder=new Dt(this.databaseAdapter),this.retentionQueryBuilder=new At(this.databaseAdapter),this.logicalPlanBuilder=new Ft(a),this.planOptimiser=i??new It,this.rlsSetup=r,this.modeRouter=new _t({comparison:this.comparisonQueryBuilder,funnel:this.funnelQueryBuilder,flow:this.flowQueryBuilder,retention:this.retentionQueryBuilder}),this.resultCache=new wt(n),this.filterCachePreloader=new gt(this.queryBuilder)}async withRLSContext(t,n){if(!this.rlsSetup)return n();let r=this.dbExecutor.db;if(!r.transaction)throw Error(e.K(`server.errors.rlsRequiresTransactions`));let i=this.rlsSetup;return r.transaction(async e=>{await i(e,t);let r=Object.create(this.dbExecutor);return r.db=e,this.dbExecutor=r,n()})}async execute(t,n,r,i){try{let e=this.modeRouter.resolveMode(n);this.modeRouter.validateForMode(e,t,n);let a=this.resultCache.generateKey(n,r,i?.cubeSetKey);return await this.resultCache.lookup(a,i?.skipCache??!1)||await this.withRLSContext(r,()=>this.executeQueryByModeWithCache(e,t,n,r,a))}catch(t){if(t instanceof Error){let n=t;for(;n.cause instanceof Error;)n=n.cause;let r=n.message,i=n;throw i.code&&(r+=` [${i.code}]`),i.detail&&(r+=` Detail: ${i.detail}`),i.hint&&(r+=` Hint: ${i.hint}`),t.message=e.K(`server.errors.queryExecutionFailed`,{message:r}),t}throw Error(e.K(`server.errors.queryExecutionUnknown`),{cause:t})}}buildLogicalPlan(t,n,r){n=e.w(n);let i=new e.J,a=this.createQueryContext(r,i,n);return this.filterCachePreloader.preload(n,i,t,a),this.buildRegularQueryArtifacts(t,n,a).optimisedPlan}analyzeQuery(t,n,r){n=e.w(n);let i=new e.J,a=this.createQueryContext(r,i,n);return this.filterCachePreloader.preload(n,i,t,a),this.buildRegularQueryArtifacts(t,n,a).analysis}async executeQuery(e,t,n){let r=new Map;return r.set(e.name,e),this.execute(r,t,n)}async executeComparisonQueryWithCache(e,t,n,r){let i=await this.executeComparisonQuery(e,t,n);return await this.resultCache.store(r,i),i}async executeComparisonQuery(e,t,n){let{timeDimension:r,periods:i,granularity:a,periodQueries:o}=this.buildComparisonExecutionPlan(t),s=o.map(async(t,r)=>({result:await this.executeStandardQuery(e,t,n),period:i[r]})),c=await Promise.all(s),l=this.comparisonQueryBuilder.mergeComparisonResults(c,r,a);return l.data=this.comparisonQueryBuilder.sortComparisonResults(l.data,r.dimension),l}buildComparisonExecutionPlan(t){let n=this.comparisonQueryBuilder.getComparisonTimeDimension(t);if(!n||!n.compareDateRange)throw Error(e.K(`server.errors.noCompareDateRange`));let r=this.comparisonQueryBuilder.normalizePeriods(n.compareDateRange);if(r.length<2)throw Error(e.K(`server.errors.compareDateRangeInvalid`));let i=r.map(e=>this.comparisonQueryBuilder.createPeriodQuery(t,e));return{timeDimension:n,granularity:n.granularity||`day`,periods:r,periodQueries:i}}async executeAnalysisQueryWithCache(e,t){let n=await e();return await this.resultCache.store(t,n),n}async executeFunnelQuery(e,t,n){let r=t.funnel,i=this.createQueryContext(n),a=this.funnelQueryBuilder.buildFunnelQuery(r,e,i);$(`funnel query`,a);let o=await a,s=this.funnelQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.funnel={config:r,steps:r.steps.map((e,t)=>({name:e.name,index:t,timeToConvert:e.timeToConvert}))},{data:s,annotation:c}}async executeFlowQuery(e,t,n){let r=t.flow,i=this.createQueryContext(n),a=this.flowQueryBuilder.buildFlowQuery(r,e,i);$(`flow query`,a);let o=await a,s=this.flowQueryBuilder.transformResult(o),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.flow={config:r,startingStep:{name:r.startingStep.name},stepsBefore:r.stepsBefore,stepsAfter:r.stepsAfter},{data:[s],annotation:c}}async executeRetentionQuery(e,t,n){let r=t.retention,i=this.createQueryContext(n),a=this.retentionQueryBuilder.buildRetentionQuery(r,e,i);$(`retention query`,a);let o=await a,s=this.retentionQueryBuilder.transformResult(o,r),c={measures:{},dimensions:{},segments:{},timeDimensions:{}};return c.retention={config:r,granularity:r.granularity,periods:r.periods,retentionType:r.retentionType,breakdownDimensions:r.breakdownDimensions},{data:s,annotation:c}}async executeStandardQuery(t,n,r,i){n=e.w(n);let a=new e.J,o=this.createQueryContext(r,a,n);this.filterCachePreloader.preload(n,a,t,o);let{optimisedPlan:s}=this.buildRegularQueryArtifacts(t,n,o),c=this.drizzlePlanBuilder.derivePhysicalPlanContext(s),l=this.drizzlePlanBuilder.toSemanticQuery(s);this.validateSecurityContext(c,o);let u=this.drizzlePlanBuilder.build(c,l,o);$(`query`,u);let d=this.queryBuilder.collectNumericFields(t,n),f={data:ht(await this.dbExecutor.execute(u,d),n,this.databaseAdapter),annotation:$e(c,n),warnings:s.warnings?.length?s.warnings:void 0,total:n.total?await this.executeTotalCount(c,l,o):void 0};return await this.resultCache.store(i,f),f}async executeTotalCount(t,n,r){let i=this.drizzlePlanBuilder.build(t,{...n,limit:void 0,offset:void 0,order:void 0},r),a=r.db.select({total:e.dt`count(*)`.as(`total`)}).from(i.as(`dc_total`));$(`total`,a);let o=await this.dbExecutor.execute(a),s=o?.[0]?Object.values(o[0])[0]:void 0,c=Number(s);return Number.isFinite(c)?c:0}createQueryContext(e,t,n){return{db:this.dbExecutor.db,schema:this.dbExecutor.schema,securityContext:e,filterCache:t,ungrouped:n?.ungrouped,cast:(e,t)=>this.databaseAdapter.castToType(e,t),tryCast:(e,t)=>this.databaseAdapter.tryCastToType(e,t)}}getOptimiserEngineType(){return this.dbExecutor.getEngineType?.()??`postgres`}buildRegularQueryArtifacts(e,t,n){let r=this.logicalPlanBuilder.planWithAnalysis(e,t,n),i=this.planOptimiser.optimise(r.plan,{engineType:this.getOptimiserEngineType()});return{logicalPlan:r.plan,analysis:r.analysis,optimisedPlan:i}}validateSecurityContext(e,t){let n=typeof process<`u`?process.env.NODE_ENV:void 0,r=typeof process<`u`?process.env?.DRIZZLE_CUBE_WARN_SECURITY:void 0;if(n!==`development`&&!r)return;let i=[e.primaryCube];for(let t of e.joinCubes||[])i.push(t.cube);for(let t of e.preAggregationCTEs||[])i.push(t.cube);let a=new Set;for(let e of i)if(!a.has(e.name)){a.add(e.name);try{if(e.public||this.rlsSetup)continue;e.sql(t).where||console.warn(`[drizzle-cube] WARNING: Cube '${e.name}' has no security filtering. If this cube contains public data, add 'public: true' to suppress this warning. Otherwise, ensure sql() returns: { from: table, where: eq(table.orgId, ctx.securityContext.orgId) }. For databases that support Row Level Security (e.g. PostgreSQL), you can configure rlsSetup to run session-level commands (SET LOCAL, SET ROLE) instead.`)}catch{}}}async generateSQL(e,t,n){let r=new Map;return r.set(e.name,e),this.generateUnifiedSQL(r,t,n)}async generateMultiCubeSQL(e,t,n){return this.generateUnifiedSQL(e,t,n)}async dryRunFunnel(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.funnelQueryBuilder.hasFunnel(e),invalidConfigKey:`server.errors.invalidFunnelConfig`,getConfig:e=>e.funnel,validate:t=>this.funnelQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.funnelValidationFailed`,build:(t,n)=>this.funnelQueryBuilder.buildFunnelQuery(t,e,n)})}async dryRunFlow(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.flowQueryBuilder.hasFlow(e),invalidConfigKey:`server.errors.invalidFlowConfig`,getConfig:e=>e.flow,validate:t=>this.flowQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.flowValidationFailed`,build:(t,n)=>this.flowQueryBuilder.buildFlowQuery(t,e,n)})}async dryRunRetention(e,t,n){return this.dryRunAnalysis(t,n,{has:e=>this.retentionQueryBuilder.hasRetention(e),invalidConfigKey:`server.errors.invalidRetentionConfig`,getConfig:e=>e.retention,validate:t=>this.retentionQueryBuilder.validateConfig(t,e),validationFailedKey:`server.errors.retentionValidationFailed`,build:(t,n)=>this.retentionQueryBuilder.buildRetentionQuery(t,e,n)})}async dryRunAnalysis(t,n,r){if(!r.has(t))throw Error(e.K(r.invalidConfigKey));let i=r.getConfig(t),a=r.validate(i);if(!a.isValid)throw Error(e.K(r.validationFailedKey,{errors:a.errors.join(`, `)}));let o=this.createQueryContext(n),s=r.build(i,o).toSQL();return{sql:s.sql,params:s.params}}async explainQuery(e,t,n,r){let i=await this.dryRunSQL(e,t,n);return this.withRLSContext(n,()=>this.dbExecutor.explainQuery(i.sql,i.params||[],r))}async dryRunSQL(e,t,n){let r=this.modeRouter.resolveMode(t);return this.modeRouter.validateForMode(r,e,t),this.generateSqlForMode(r,e,t,n)}async generateUnifiedSQL(t,n,r){n=e.w(n);let i=new e.J,a=this.createQueryContext(r,i,n);this.filterCachePreloader.preload(n,i,t,a);let{optimisedPlan:o}=this.buildRegularQueryArtifacts(t,n,a),s=this.drizzlePlanBuilder.derivePhysicalPlanContext(o),c=this.drizzlePlanBuilder.toSemanticQuery(o),l=this.drizzlePlanBuilder.build(s,c,a).toSQL();return{sql:l.sql,params:l.params}}async executeQueryByModeWithCache(t,n,r,i,a){return{regular:()=>this.executeStandardQuery(n,r,i,a),comparison:()=>this.executeComparisonQueryWithCache(n,r,i,a),funnel:()=>this.executeAnalysisQueryWithCache(()=>this.executeFunnelQuery(n,r,i),a),flow:()=>this.executeAnalysisQueryWithCache(()=>this.executeFlowQuery(n,r,i),a),retention:()=>this.executeAnalysisQueryWithCache(()=>this.executeRetentionQuery(n,r,i),a)}[e.rt(t)]()}async generateSqlForMode(t,n,r,i){return{regular:()=>this.generateUnifiedSQL(n,r,i),comparison:()=>this.generateComparisonSQL(n,r,i),funnel:()=>this.dryRunFunnel(n,r,i),flow:()=>this.dryRunFlow(n,r,i),retention:()=>this.dryRunRetention(n,r,i)}[e.rt(t)]()}async generateComparisonSQL(e,t,n){let r=this.buildComparisonExecutionPlan(t).periodQueries[0];return this.generateUnifiedSQL(e,r,n)}},An=[`year`,`quarter`,`month`,`week`,`day`,`hour`];function jn(e,t){return t.includes(`.`)?t:`${e}.${t}`}function Mn(e,t){if(!t.includes(`.`))return t;let n=`${e}.`;return t.startsWith(n)?t.slice(n.length):null}function Nn(e){let t=Object.keys(e.measures),n=[];for(let r=0;r<t.length;r++){let i=t[r],a=e.measures[i];if(a.shown===!1)continue;let o;a.drillMembers&&a.drillMembers.length>0&&(o=a.drillMembers.map(t=>jn(e.name,t))),n.push({name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,drillMembers:o})}return n}function Pn(e){let t=Object.keys(e.dimensions),n=[];for(let r=0;r<t.length;r++){let i=t[r],a=e.dimensions[i];if(a.shown===!1)continue;let o=a.type===`time`?a.granularities||An:void 0;n.push({name:`${e.name}.${i}`,title:a.title||i,shortTitle:a.title||i,type:a.type,format:void 0,description:a.description,synonyms:a.synonyms,granularities:o})}return n}function Fn(t,n,r){let i=[];if(!t.joins)return i;for(let[,a]of Object.entries(t.joins)){let t=e.et(a.targetCube,n);t&&i.push({targetCube:t.name,relationship:a.relationship,joinFields:a.on.map(e=>({sourceField:r(e.source),targetField:r(e.target)}))})}return i}function In(e){let t=[];if(!e.hierarchies)return t;for(let[,n]of Object.entries(e.hierarchies)){let r=n.levels.filter(t=>{let n=Mn(e.name,t);return n===null||e.dimensions[n]?.shown!==!1}).map(t=>jn(e.name,t));r.length!==0&&t.push({name:n.name,title:n.title||n.name,cubeName:e.name,levels:r})}return t}Object.freeze({});function Ln(e){if(typeof process>`u`)return;let t=process.env?.DC_DEBUG;(t===`true`||t===`cubesets`)&&console.log(`[DC_DEBUG] ${e}`)}var Rn=class{baseCubes=new Map;cubeSets=new Map;metadataCache=new Map;baseGeneration=0;registrationCounter=0;contextToCubeSetId;missingCubeSet=`base`;onCubeSetRegistered;cacheConfig;rlsSetup;planOptimiser;db;schema;engineType;constructor(e){e?.databaseExecutor?(this.db=e.databaseExecutor.db,this.schema=e.databaseExecutor.schema,this.engineType=e.databaseExecutor.getEngineType()):e?.drizzle&&(this.db=e.drizzle,this.schema=e.schema,this.engineType=e.engineType),this.cacheConfig=e?.cache,this.rlsSetup=e?.rlsSetup,this.planOptimiser=e?.planOptimiser,this.contextToCubeSetId=e?.contextToCubeSetId,this.missingCubeSet=e?.missingCubeSet??`base`,this.onCubeSetRegistered=e?.onCubeSetRegistered}setDatabaseExecutor(e){this.db=e.db,this.schema=e.schema,this.engineType=e.getEngineType()}getEngineType(){return this.engineType}setDrizzle(e,t,n){this.db=e,this.schema=t,this.engineType=n}hasExecutor(){return!!this.db}createDbExecutor(){if(!this.db)throw Error(e.K(`server.errors.dbNotConfigured`));return He(this.db,this.schema,this.engineType)}createQueryExecutor(e=!1){return new kn(this.createDbExecutor(),e?this.cacheConfig:void 0,this.rlsSetup,this.planOptimiser)}formatSqlResult(t){let n=this.getEngineType()??`postgres`;return{sql:e.x(t.sql,n),params:t.params}}registerCube(e){this.prepareCube(e,this.baseCubes),this.baseCubes.set(e.name,e),this.baseGeneration++,this.rebuildAllMergedSets(),this.metadataCache.clear()}registerCubeSet(t,n){if(t===``)throw Error(e.K(`server.errors.cubeSetIdEmpty`));let r=Date.now(),i=new Map;for(let e of n){let t=new Map(this.baseCubes);for(let[e,n]of i)t.set(e,n);this.prepareCube(e,t),i.set(e.name,e)}let a=++this.registrationCounter,o=this.mergeWithBase(i),s=Date.now()-r;this.cubeSets.set(t,{overlay:i,merged:o,generation:a,durationMs:s}),this.metadataCache.delete(t);let c=0;for(let e of i.values())c+=Object.keys(e.dimensions??{}).length;let l={setId:t,cubeCount:o.size,dimensionCount:c,generation:a,durationMs:s};Ln(`registered cube set '${t}': ${i.size} cube(s), ${c} dimension(s), generation ${a}, ${s}ms`),this.onCubeSetRegistered?.(l)}unregisterCubeSet(e){let t=this.cubeSets.delete(e);return t&&this.metadataCache.delete(e),t}hasCubeSet(e){return this.cubeSets.has(e)}getCubeSetIds(){return Array.from(this.cubeSets.keys())}getCubeSetStats(){let e=0,t=0,n;for(let[r,i]of this.cubeSets)e+=i.merged.size,t+=i.durationMs,(!n||i.durationMs>n.durationMs)&&(n={setId:r,durationMs:i.durationMs});return{setCount:this.cubeSets.size,cubeCount:e,totalRegistrationMs:t,slowestSet:n}}prepareCube(e,t){this.validateCalculatedMeasures(e,t),new I(t).populateDependencies(e)}mergeWithBase(e){let t=new Map(this.baseCubes);for(let[n,r]of e)t.set(n,r);return t}rebuildAllMergedSets(){for(let e of this.cubeSets.values())e.merged=this.mergeWithBase(e.overlay)}resolveSetId(t){if(!this.contextToCubeSetId)return``;let n=this.contextToCubeSetId(t);if(n==null||n===``)return``;let r=String(n);if(!this.cubeSets.has(r)){if(this.missingCubeSet===`throw`)throw Error(e.K(`server.errors.cubeSetNotFound`,{setId:r}));return``}return r}resolveCubes(e){let t=this.resolveSetId(e);return t===``?this.baseCubes:this.cubeSets.get(t)?.merged??this.baseCubes}cubeSetCacheKey(e){let t=this.cubeSets.get(e)?.generation??0;return`${e}:${this.baseGeneration}.${t}`}validateCubeReferences(){let t=new Set;for(let e of this.unresolvedJoinRefs(this.baseCubes))t.add(e);for(let e of this.cubeSets.values())for(let n of this.unresolvedJoinRefs(e.merged))t.add(n);if(t.size>0){let n=Array.from(t,e=>` - ${e}`).join(`
165
+ `);throw Error(e.K(`server.errors.unresolvedCubeRefs`,{details:n}))}}*unresolvedJoinRefs(t){for(let[n,r]of t)if(r.joins)for(let[i,a]of Object.entries(r.joins)){let{targetCube:r}=a;typeof r==`string`&&!t.has(r)&&(yield e.K(`server.errors.cubeRefUnresolved`,{cubeName:n,joinName:i,targetCube:r}))}}validateCalculatedMeasures(t,n){let r=[];for(let[i,a]of Object.entries(t.measures))if(a.type===`calculated`){if(!a.calculatedSql){r.push(e.K(`server.validation.calculatedMeasure.mustHaveCalculatedSql`,{cubeName:t.name,fieldName:i}));continue}let o=Je(a.calculatedSql);if(!o.isValid){r.push(e.K(`server.validation.calculatedMeasure.invalidSyntax`,{cubeName:t.name,fieldName:i,errors:o.errors.join(`, `)}));continue}let s=new Map(n);s.set(t.name,t);let c=new I(s);try{c.validateDependencies(t)}catch(e){r.push(e instanceof Error?e.message:String(e))}}if(r.length===0){let i=new Map(n);i.set(t.name,t);let a=new I(i);a.buildGraph(t);let o=a.detectCycle();o&&r.push(e.K(`server.validation.calculatedMeasure.circularDependency`,{cycle:o.join(` -> `)}))}if(r.length>0)throw Error(e.K(`server.errors.calculatedMeasureValidation`,{cubeName:t.name,details:r.join(`
166
+ `)}))}getCube(e,t){return this.resolveCubes(t).get(e)}getAllCubes(e){return Array.from(this.resolveCubes(e).values())}getAllCubesMap(e){return this.resolveCubes(e)}async execute(e,t,n){let r=this.createQueryExecutor(!0),i=this.resolveSetId(t);return r.execute(this.cubeSetId2Cubes(i),e,t,{...n,cubeSetKey:this.cubeSetCacheKey(i)})}async executeMultiCubeQuery(e,t,n){return this.execute(e,t,n)}async executeQuery(t,n,r){if(!this.resolveCubes(r).get(t))throw Error(e.K(`server.errors.cubeNotFound`,{cubeName:t}));return this.execute(n,r)}getMetadata(e){let t=this.resolveSetId(e),n=this.metadataCache.get(t);if(n)return n;let r=this.cubeSetId2Cubes(t),i=Array.from(r.values()).map(e=>this.generateCubeMetadata(e,r));return this.metadataCache.set(t,i),i}getColumnName(e){if(e&&e.name||e&&e.columnType&&e.name)return e.name;if(typeof e==`string`)return e;if(e&&typeof e==`object`){if(e._.name)return e._.name;if(e.name)return e.name;if(e.columnName)return e.columnName}return`unknown_column`}generateCubeMetadata(e,t){let n=Nn(e),r=Pn(e),i=Fn(e,t,e=>this.getColumnName(e)),a=In(e);return{name:e.name,title:e.title||e.name,description:e.description,exampleQuestions:e.exampleQuestions,measures:n,dimensions:r,segments:[],relationships:i.length>0?i:void 0,hierarchies:a.length>0?a:void 0,meta:e.meta}}async generateSQL(t,n,r){let i=this.getCube(t,r);if(!i)throw Error(e.K(`server.errors.cubeNotFound`,{cubeName:t}));let a=await this.createQueryExecutor().generateSQL(i,n,r);return this.formatSqlResult(a)}async generateMultiCubeSQL(e,t){let n=await this.createQueryExecutor().generateMultiCubeSQL(this.resolveCubes(t),e,t);return this.formatSqlResult(n)}async dryRun(e,t){let n=await this.createQueryExecutor().dryRunSQL(this.resolveCubes(t),e,t);return this.formatSqlResult(n)}async dryRunFunnel(e,t){return this.dryRun(e,t)}async dryRunFlow(e,t){return this.dryRun(e,t)}async dryRunRetention(e,t){return this.dryRun(e,t)}async explainQuery(e,t,n){return this.createQueryExecutor().explainQuery(this.resolveCubes(t),e,t,n)}hasCube(e,t){return this.resolveCubes(t).has(e)}unregisterCube(e){return this.removeCube(e)}removeCube(e){let t=this.baseCubes.delete(e);return t&&(this.baseGeneration++,this.rebuildAllMergedSets(),this.invalidateMetadataCache()),t}clearCubes(){this.baseCubes.clear(),this.baseGeneration++,this.rebuildAllMergedSets(),this.invalidateMetadataCache()}invalidateMetadataCache(){this.metadataCache.clear()}cubeSetId2Cubes(e){return e===``?this.baseCubes:this.cubeSets.get(e)?.merged??this.baseCubes}getCubeNames(e){return Array.from(this.resolveCubes(e).keys())}validateQuery(t,n){return e.C(this.resolveCubes(n),t)}analyzeQuery(e,t){return this.createQueryExecutor(!0).analyzeQuery(this.resolveCubes(t),e,t)}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Rn}});
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-BkxueWec.cjs");exports.REST_CACHE_CONTROL=e.i,exports.createCubeHttpHandler=e.t,exports.resolveSecurityContext=e.n,exports.withLocaleFromHeaders=e.r,exports.withRestCacheHeaders=e.a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../core-JgUTMhxl.cjs");exports.REST_CACHE_CONTROL=e.i,exports.createCubeHttpHandler=e.t,exports.resolveSecurityContext=e.n,exports.withLocaleFromHeaders=e.r,exports.withRestCacheHeaders=e.a;
@@ -1,2 +1,2 @@
1
- import { a as e, i as t, n, r, t as i } from "../core-B05onvSN.js";
1
+ import { a as e, i as t, n, r, t as i } from "../core-Bmb7XMBz.js";
2
2
  export { t as REST_CACHE_CONTROL, i as createCubeHttpHandler, n as resolveSecurityContext, r as withLocaleFromHeaders, e as withRestCacheHeaders };
@@ -1,5 +1,5 @@
1
- import { a as e, i as t, l as n, o as r, r as i, u as a } from "./utils-dyUxCOWT.js";
2
- import { C as o, S as s, _ as c, a as l, b as u, c as d, g as f, h as p, i as m, l as h, m as g, p as _, r as v, s as y, v as b, w as x, x as S, y as C } from "./mcp-transport-BH5avoaA.js";
1
+ import { a as e, i as t, l as n, o as r, r as i, u as a } from "./utils-i2h5cwI3.js";
2
+ import { C as o, S as s, _ as c, a as l, b as u, c as d, g as f, h as p, i as m, l as h, m as g, p as _, r as v, s as y, v as b, w as x, x as S, y as C } from "./mcp-transport-BTmAXLo8.js";
3
3
  //#region src/adapters/locale.ts
4
4
  var w = "x-dc-locale";
5
5
  function T(e) {