@finos/legend-cube-builder 0.0.4 → 0.0.5

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 (609) hide show
  1. package/README.md +9 -3
  2. package/docs/adding-an-operation.md +22 -12
  3. package/docs/demo/DEMO-FAST-NOTES.md +67 -0
  4. package/docs/demo/README.md +102 -0
  5. package/docs/demo/specs/duckdb-sales-pivot.cube.json +110 -0
  6. package/docs/demo/specs/trades-desks-1-joined.cube.json +123 -0
  7. package/docs/demo/specs/trades-desks-2-grouped.cube.json +140 -0
  8. package/docs/demo/specs/trades-desks-3-ranked.cube.json +158 -0
  9. package/docs/demo/specs/trades-desks-4-extended.cube.json +208 -0
  10. package/docs/demo/specs/trades-desks-5-final.cube.json +248 -0
  11. package/docs/hosting.md +50 -3
  12. package/docs/testing.md +32 -0
  13. package/lib/__lib__/LegendCubeCommand.d.ts +2 -0
  14. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
  15. package/lib/__lib__/LegendCubeCommand.js +7 -0
  16. package/lib/__lib__/LegendCubeCommand.js.map +1 -1
  17. package/lib/__lib__/LegendCubeFunctionLabels.d.ts +29 -0
  18. package/lib/__lib__/LegendCubeFunctionLabels.d.ts.map +1 -0
  19. package/lib/__lib__/LegendCubeFunctionLabels.js +31 -0
  20. package/lib/__lib__/LegendCubeFunctionLabels.js.map +1 -0
  21. package/lib/__lib__/LegendCubeHelpText.d.ts +5 -1
  22. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
  23. package/lib/__lib__/LegendCubeHelpText.js +14 -2
  24. package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
  25. package/lib/__lib__/LegendCubeLabels.d.ts +100 -8
  26. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
  27. package/lib/__lib__/LegendCubeLabels.js +129 -14
  28. package/lib/__lib__/LegendCubeLabels.js.map +1 -1
  29. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts +26 -0
  30. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts.map +1 -0
  31. package/lib/__lib__/LegendCubeProjectSourceLabels.js +26 -0
  32. package/lib/__lib__/LegendCubeProjectSourceLabels.js.map +1 -0
  33. package/lib/__lib__/LegendCubeServiceLabels.d.ts +27 -0
  34. package/lib/__lib__/LegendCubeServiceLabels.d.ts.map +1 -0
  35. package/lib/__lib__/LegendCubeServiceLabels.js +32 -0
  36. package/lib/__lib__/LegendCubeServiceLabels.js.map +1 -0
  37. package/lib/__lib__/LegendCubeTesting.d.ts +7 -0
  38. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
  39. package/lib/__lib__/LegendCubeTesting.js +7 -0
  40. package/lib/__lib__/LegendCubeTesting.js.map +1 -1
  41. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +1 -1
  42. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
  43. package/lib/__test-utils__/CubeEngineTestSupport.js +2 -2
  44. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
  45. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +8 -1
  46. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -1
  47. package/lib/__test-utils__/CubeExpressionTestUtils.js +20 -3
  48. package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -1
  49. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts +26 -0
  50. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts.map +1 -0
  51. package/lib/__test-utils__/CubeFunctionTestOutline.js +56 -0
  52. package/lib/__test-utils__/CubeFunctionTestOutline.js.map +1 -0
  53. package/lib/__test-utils__/CubeLambdaCorpus.d.ts +36 -0
  54. package/lib/__test-utils__/CubeLambdaCorpus.d.ts.map +1 -0
  55. package/lib/__test-utils__/CubeLambdaCorpus.js +83 -0
  56. package/lib/__test-utils__/CubeLambdaCorpus.js.map +1 -0
  57. package/lib/__test-utils__/CubePageTestUtils.d.ts +6 -0
  58. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
  59. package/lib/__test-utils__/CubePageTestUtils.js +21 -0
  60. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
  61. package/lib/__test-utils__/CubeTestApplication.d.ts +9 -0
  62. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
  63. package/lib/__test-utils__/CubeTestApplication.js +16 -0
  64. package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
  65. package/lib/__test-utils__/FakeCubeEngine.d.ts +5 -0
  66. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
  67. package/lib/__test-utils__/FakeCubeEngine.js +17 -0
  68. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
  69. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +7 -1
  70. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -1
  71. package/lib/__test-utils__/FakeCubeIngestCatalog.js +16 -0
  72. package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -1
  73. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts +26 -0
  74. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts.map +1 -0
  75. package/lib/__test-utils__/FakeCubeServiceCatalog.js +40 -0
  76. package/lib/__test-utils__/FakeCubeServiceCatalog.js.map +1 -0
  77. package/lib/components/CubeAddItems.d.ts.map +1 -1
  78. package/lib/components/CubeAddItems.js +9 -6
  79. package/lib/components/CubeAddItems.js.map +1 -1
  80. package/lib/components/CubeDialogTheme.d.ts +25 -0
  81. package/lib/components/CubeDialogTheme.d.ts.map +1 -0
  82. package/lib/components/CubeDialogTheme.js +25 -0
  83. package/lib/components/CubeDialogTheme.js.map +1 -0
  84. package/lib/components/CubeEditor.d.ts +12 -1
  85. package/lib/components/CubeEditor.d.ts.map +1 -1
  86. package/lib/components/CubeEditor.js +16 -14
  87. package/lib/components/CubeEditor.js.map +1 -1
  88. package/lib/components/CubeFileMenu.d.ts +28 -0
  89. package/lib/components/CubeFileMenu.d.ts.map +1 -0
  90. package/lib/components/CubeFileMenu.js +77 -0
  91. package/lib/components/CubeFileMenu.js.map +1 -0
  92. package/lib/components/CubeLambdaImportBanner.d.ts +26 -0
  93. package/lib/components/CubeLambdaImportBanner.d.ts.map +1 -0
  94. package/lib/components/CubeLambdaImportBanner.js +47 -0
  95. package/lib/components/CubeLambdaImportBanner.js.map +1 -0
  96. package/lib/components/CubeNodeIcon.d.ts.map +1 -1
  97. package/lib/components/CubeNodeIcon.js +5 -1
  98. package/lib/components/CubeNodeIcon.js.map +1 -1
  99. package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -1
  100. package/lib/components/CubeSchemaColumnsTable.js +2 -2
  101. package/lib/components/CubeSchemaColumnsTable.js.map +1 -1
  102. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
  103. package/lib/components/canvas/CubeCanvas.js +38 -5
  104. package/lib/components/canvas/CubeCanvas.js.map +1 -1
  105. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
  106. package/lib/components/canvas/CubeCanvasContextMenu.js +2 -1
  107. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
  108. package/lib/components/canvas/CubeCanvasElements.d.ts +18 -1
  109. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
  110. package/lib/components/canvas/CubeCanvasElements.js +58 -3
  111. package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
  112. package/lib/components/canvas/CubeCanvasLayout.js +1 -1
  113. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
  114. package/lib/components/canvas/CubeCanvasNode.js +8 -4
  115. package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
  116. package/lib/components/dev-settings/CubeDevSettings.d.ts +35 -0
  117. package/lib/components/dev-settings/CubeDevSettings.d.ts.map +1 -0
  118. package/lib/components/dev-settings/CubeDevSettings.js +50 -0
  119. package/lib/components/dev-settings/CubeDevSettings.js.map +1 -0
  120. package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -1
  121. package/lib/components/editors/CubeColumnChecklist.js +2 -2
  122. package/lib/components/editors/CubeColumnChecklist.js.map +1 -1
  123. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
  124. package/lib/components/editors/CubeColumnPicker.js +3 -3
  125. package/lib/components/editors/CubeColumnPicker.js.map +1 -1
  126. package/lib/components/editors/CubeConcatEditor.js +2 -2
  127. package/lib/components/editors/CubeConcatEditor.js.map +1 -1
  128. package/lib/components/editors/CubeExpressionFilterEditor.d.ts +25 -0
  129. package/lib/components/editors/CubeExpressionFilterEditor.d.ts.map +1 -0
  130. package/lib/components/editors/CubeExpressionFilterEditor.js +83 -0
  131. package/lib/components/editors/CubeExpressionFilterEditor.js.map +1 -0
  132. package/lib/components/editors/CubeExtendEditor.d.ts +2 -0
  133. package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -1
  134. package/lib/components/editors/CubeExtendEditor.js +3 -3
  135. package/lib/components/editors/CubeExtendEditor.js.map +1 -1
  136. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
  137. package/lib/components/editors/CubeFilterEditor.js +13 -2
  138. package/lib/components/editors/CubeFilterEditor.js.map +1 -1
  139. package/lib/components/editors/CubeFunctionSourceEditor.d.ts +25 -0
  140. package/lib/components/editors/CubeFunctionSourceEditor.d.ts.map +1 -0
  141. package/lib/components/editors/CubeFunctionSourceEditor.js +55 -0
  142. package/lib/components/editors/CubeFunctionSourceEditor.js.map +1 -0
  143. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
  144. package/lib/components/editors/CubeJoinEditor.js +16 -4
  145. package/lib/components/editors/CubeJoinEditor.js.map +1 -1
  146. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
  147. package/lib/components/editors/CubeNodeEditorPanel.js +18 -8
  148. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
  149. package/lib/components/editors/CubeNodeEditorPopper.d.ts +5 -1
  150. package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -1
  151. package/lib/components/editors/CubeNodeEditorPopper.js +10 -2
  152. package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -1
  153. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
  154. package/lib/components/editors/CubeNodeEditorRegistry.js +9 -1
  155. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
  156. package/lib/components/editors/CubePivotEditor.d.ts +26 -0
  157. package/lib/components/editors/CubePivotEditor.d.ts.map +1 -0
  158. package/lib/components/editors/CubePivotEditor.js +93 -0
  159. package/lib/components/editors/CubePivotEditor.js.map +1 -0
  160. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -1
  161. package/lib/components/editors/CubeRestrictEditor.js +2 -2
  162. package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
  163. package/lib/components/editors/CubeServiceSourceEditor.d.ts +25 -0
  164. package/lib/components/editors/CubeServiceSourceEditor.d.ts.map +1 -0
  165. package/lib/components/editors/CubeServiceSourceEditor.js +41 -0
  166. package/lib/components/editors/CubeServiceSourceEditor.js.map +1 -0
  167. package/lib/components/grid/CubeColumnFormatDialog.d.ts +28 -0
  168. package/lib/components/grid/CubeColumnFormatDialog.d.ts.map +1 -0
  169. package/lib/components/grid/CubeColumnFormatDialog.js +94 -0
  170. package/lib/components/grid/CubeColumnFormatDialog.js.map +1 -0
  171. package/lib/components/grid/CubeDrilldownBar.d.ts +37 -0
  172. package/lib/components/grid/CubeDrilldownBar.d.ts.map +1 -0
  173. package/lib/components/grid/CubeDrilldownBar.js +77 -0
  174. package/lib/components/grid/CubeDrilldownBar.js.map +1 -0
  175. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
  176. package/lib/components/grid/CubeGridRegion.js +40 -26
  177. package/lib/components/grid/CubeGridRegion.js.map +1 -1
  178. package/lib/components/grid/CubeGridValues.d.ts +31 -1
  179. package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
  180. package/lib/components/grid/CubeGridValues.js +108 -1
  181. package/lib/components/grid/CubeGridValues.js.map +1 -1
  182. package/lib/components/grid/CubeResultGrid.d.ts +68 -5
  183. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
  184. package/lib/components/grid/CubeResultGrid.js +308 -35
  185. package/lib/components/grid/CubeResultGrid.js.map +1 -1
  186. package/lib/components/grid/CubeRunStatsPanel.d.ts +28 -0
  187. package/lib/components/grid/CubeRunStatsPanel.d.ts.map +1 -0
  188. package/lib/components/grid/CubeRunStatsPanel.js +61 -0
  189. package/lib/components/grid/CubeRunStatsPanel.js.map +1 -0
  190. package/lib/components/grid/CubeServerSideGrid.d.ts +36 -0
  191. package/lib/components/grid/CubeServerSideGrid.d.ts.map +1 -0
  192. package/lib/components/grid/CubeServerSideGrid.js +114 -0
  193. package/lib/components/grid/CubeServerSideGrid.js.map +1 -0
  194. package/lib/components/grid/CubeSqlDialog.d.ts +24 -0
  195. package/lib/components/grid/CubeSqlDialog.d.ts.map +1 -0
  196. package/lib/components/grid/CubeSqlDialog.js +39 -0
  197. package/lib/components/grid/CubeSqlDialog.js.map +1 -0
  198. package/lib/components/grid/CubeSqlFormat.d.ts +20 -0
  199. package/lib/components/grid/CubeSqlFormat.d.ts.map +1 -0
  200. package/lib/components/grid/CubeSqlFormat.js +32 -0
  201. package/lib/components/grid/CubeSqlFormat.js.map +1 -0
  202. package/lib/components/palette/CubePalette.d.ts.map +1 -1
  203. package/lib/components/palette/CubePalette.js +32 -13
  204. package/lib/components/palette/CubePalette.js.map +1 -1
  205. package/lib/components/show-pure/CubeShowPureDialog.d.ts +4 -1
  206. package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -1
  207. package/lib/components/show-pure/CubeShowPureDialog.js +8 -4
  208. package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -1
  209. package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -1
  210. package/lib/components/source-picker/CubeDataProductTab.js +37 -16
  211. package/lib/components/source-picker/CubeDataProductTab.js.map +1 -1
  212. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -1
  213. package/lib/components/source-picker/CubeDirectConnectionTab.js +6 -4
  214. package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -1
  215. package/lib/components/source-picker/CubeFunctionSteps.d.ts +36 -0
  216. package/lib/components/source-picker/CubeFunctionSteps.d.ts.map +1 -0
  217. package/lib/components/source-picker/CubeFunctionSteps.js +76 -0
  218. package/lib/components/source-picker/CubeFunctionSteps.js.map +1 -0
  219. package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -1
  220. package/lib/components/source-picker/CubeIngestTab.js +39 -16
  221. package/lib/components/source-picker/CubeIngestTab.js.map +1 -1
  222. package/lib/components/source-picker/CubeInlineModelTab.d.ts +3 -2
  223. package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -1
  224. package/lib/components/source-picker/CubeInlineModelTab.js +23 -13
  225. package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -1
  226. package/lib/components/source-picker/CubePickerListItem.d.ts +47 -0
  227. package/lib/components/source-picker/CubePickerListItem.d.ts.map +1 -0
  228. package/lib/components/source-picker/CubePickerListItem.js +62 -0
  229. package/lib/components/source-picker/CubePickerListItem.js.map +1 -0
  230. package/lib/components/source-picker/CubeProjectTab.d.ts +4 -3
  231. package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -1
  232. package/lib/components/source-picker/CubeProjectTab.js +7 -4
  233. package/lib/components/source-picker/CubeProjectTab.js.map +1 -1
  234. package/lib/components/source-picker/CubeServiceTab.d.ts +27 -0
  235. package/lib/components/source-picker/CubeServiceTab.d.ts.map +1 -0
  236. package/lib/components/source-picker/CubeServiceTab.js +36 -0
  237. package/lib/components/source-picker/CubeServiceTab.js.map +1 -0
  238. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
  239. package/lib/components/source-picker/CubeSourcePicker.js +16 -3
  240. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
  241. package/lib/components/source-picker/CubeTablePreview.d.ts +29 -0
  242. package/lib/components/source-picker/CubeTablePreview.d.ts.map +1 -0
  243. package/lib/components/source-picker/CubeTablePreview.js +10 -0
  244. package/lib/components/source-picker/CubeTablePreview.js.map +1 -0
  245. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts +27 -0
  246. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts.map +1 -0
  247. package/lib/components/spec-transfer/CubeImportPureDialog.js +38 -0
  248. package/lib/components/spec-transfer/CubeImportPureDialog.js.map +1 -0
  249. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -1
  250. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +9 -3
  251. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
  252. package/lib/graph-manager/CubeDataProductCatalog.d.ts +10 -0
  253. package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -1
  254. package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -1
  255. package/lib/graph-manager/CubeEngine.d.ts +46 -1
  256. package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
  257. package/lib/graph-manager/CubeEngine.js.map +1 -1
  258. package/lib/graph-manager/CubeEngineClientSettings.d.ts +43 -0
  259. package/lib/graph-manager/CubeEngineClientSettings.d.ts.map +1 -0
  260. package/lib/graph-manager/CubeEngineClientSettings.js +51 -0
  261. package/lib/graph-manager/CubeEngineClientSettings.js.map +1 -0
  262. package/lib/graph-manager/CubeIngest.d.ts +5 -0
  263. package/lib/graph-manager/CubeIngest.d.ts.map +1 -1
  264. package/lib/graph-manager/CubeIngest.js +10 -0
  265. package/lib/graph-manager/CubeIngest.js.map +1 -1
  266. package/lib/graph-manager/CubeIngestCatalog.d.ts +26 -0
  267. package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -1
  268. package/lib/graph-manager/CubeIngestCatalog.js +6 -0
  269. package/lib/graph-manager/CubeIngestCatalog.js.map +1 -1
  270. package/lib/graph-manager/CubeLakehouseRuntime.d.ts +29 -0
  271. package/lib/graph-manager/CubeLakehouseRuntime.d.ts.map +1 -0
  272. package/lib/graph-manager/CubeLakehouseRuntime.js +40 -0
  273. package/lib/graph-manager/CubeLakehouseRuntime.js.map +1 -0
  274. package/lib/graph-manager/CubeProjectCatalog.d.ts +3 -3
  275. package/lib/graph-manager/CubeService.d.ts +20 -0
  276. package/lib/graph-manager/CubeService.d.ts.map +1 -0
  277. package/lib/graph-manager/CubeService.js +22 -0
  278. package/lib/graph-manager/CubeService.js.map +1 -0
  279. package/lib/graph-manager/CubeServiceCatalog.d.ts +31 -0
  280. package/lib/graph-manager/CubeServiceCatalog.d.ts.map +1 -0
  281. package/lib/graph-manager/CubeServiceCatalog.js +17 -0
  282. package/lib/graph-manager/CubeServiceCatalog.js.map +1 -0
  283. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +52 -5
  284. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
  285. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +63 -5
  286. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
  287. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +9 -6
  288. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -1
  289. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +12 -8
  290. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -1
  291. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts +30 -0
  292. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts.map +1 -0
  293. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js +229 -0
  294. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js.map +1 -0
  295. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -1
  296. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +18 -9
  297. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -1
  298. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +4 -9
  299. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -1
  300. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +2 -1
  301. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -1
  302. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts +34 -0
  303. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts.map +1 -0
  304. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js +332 -0
  305. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js.map +1 -0
  306. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
  307. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +49 -10
  308. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
  309. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +1 -1
  310. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
  311. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +3 -1
  312. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
  313. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +2 -1
  314. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -1
  315. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +2 -1
  316. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -1
  317. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +18 -0
  318. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
  319. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +74 -6
  320. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
  321. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -1
  322. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +7 -4
  323. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -1
  324. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts +31 -0
  325. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts.map +1 -0
  326. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js +69 -0
  327. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js.map +1 -0
  328. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
  329. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +6 -2
  330. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
  331. package/lib/index.css +2 -2
  332. package/lib/index.css.map +1 -1
  333. package/lib/index.d.ts +12 -3
  334. package/lib/index.d.ts.map +1 -1
  335. package/lib/index.js +10 -1
  336. package/lib/index.js.map +1 -1
  337. package/lib/stores/CubeAddPlacement.d.ts +10 -3
  338. package/lib/stores/CubeAddPlacement.d.ts.map +1 -1
  339. package/lib/stores/CubeAddPlacement.js +16 -5
  340. package/lib/stores/CubeAddPlacement.js.map +1 -1
  341. package/lib/stores/CubeDevSettingsState.d.ts +47 -0
  342. package/lib/stores/CubeDevSettingsState.d.ts.map +1 -0
  343. package/lib/stores/CubeDevSettingsState.js +99 -0
  344. package/lib/stores/CubeDevSettingsState.js.map +1 -0
  345. package/lib/stores/CubeEditorState.d.ts +173 -43
  346. package/lib/stores/CubeEditorState.d.ts.map +1 -1
  347. package/lib/stores/CubeEditorState.js +498 -113
  348. package/lib/stores/CubeEditorState.js.map +1 -1
  349. package/lib/stores/CubeEngineChecks.d.ts +59 -0
  350. package/lib/stores/CubeEngineChecks.d.ts.map +1 -0
  351. package/lib/stores/CubeEngineChecks.js +100 -0
  352. package/lib/stores/CubeEngineChecks.js.map +1 -0
  353. package/lib/stores/CubeExamples.d.ts.map +1 -1
  354. package/lib/stores/CubeExamples.js +39 -2
  355. package/lib/stores/CubeExamples.js.map +1 -1
  356. package/lib/stores/CubeExamplesState.d.ts +1 -1
  357. package/lib/stores/CubeExamplesState.d.ts.map +1 -1
  358. package/lib/stores/CubeExamplesState.js +2 -2
  359. package/lib/stores/CubeExamplesState.js.map +1 -1
  360. package/lib/stores/CubeExecutionState.d.ts.map +1 -1
  361. package/lib/stores/CubeExecutionState.js +24 -33
  362. package/lib/stores/CubeExecutionState.js.map +1 -1
  363. package/lib/stores/CubeExportState.d.ts +41 -0
  364. package/lib/stores/CubeExportState.d.ts.map +1 -0
  365. package/lib/stores/CubeExportState.js +134 -0
  366. package/lib/stores/CubeExportState.js.map +1 -0
  367. package/lib/stores/CubeExpressionFilterCheck.d.ts +51 -0
  368. package/lib/stores/CubeExpressionFilterCheck.d.ts.map +1 -0
  369. package/lib/stores/CubeExpressionFilterCheck.js +134 -0
  370. package/lib/stores/CubeExpressionFilterCheck.js.map +1 -0
  371. package/lib/stores/CubeExtendTyping.d.ts +6 -14
  372. package/lib/stores/CubeExtendTyping.d.ts.map +1 -1
  373. package/lib/stores/CubeExtendTyping.js +6 -33
  374. package/lib/stores/CubeExtendTyping.js.map +1 -1
  375. package/lib/stores/CubeFunctionRecheck.d.ts +30 -0
  376. package/lib/stores/CubeFunctionRecheck.d.ts.map +1 -0
  377. package/lib/stores/CubeFunctionRecheck.js +67 -0
  378. package/lib/stores/CubeFunctionRecheck.js.map +1 -0
  379. package/lib/stores/CubeGridFetcher.d.ts +75 -0
  380. package/lib/stores/CubeGridFetcher.d.ts.map +1 -0
  381. package/lib/stores/CubeGridFetcher.js +197 -0
  382. package/lib/stores/CubeGridFetcher.js.map +1 -0
  383. package/lib/stores/CubeGridQuickActions.d.ts +18 -6
  384. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
  385. package/lib/stores/CubeGridQuickActions.js +32 -12
  386. package/lib/stores/CubeGridQuickActions.js.map +1 -1
  387. package/lib/stores/CubeGridState.d.ts +136 -0
  388. package/lib/stores/CubeGridState.d.ts.map +1 -0
  389. package/lib/stores/CubeGridState.js +317 -0
  390. package/lib/stores/CubeGridState.js.map +1 -0
  391. package/lib/stores/CubeHost.d.ts +42 -0
  392. package/lib/stores/CubeHost.d.ts.map +1 -1
  393. package/lib/stores/CubeHost.js +4 -0
  394. package/lib/stores/CubeHost.js.map +1 -1
  395. package/lib/stores/CubeLambdaImportState.d.ts +118 -0
  396. package/lib/stores/CubeLambdaImportState.d.ts.map +1 -0
  397. package/lib/stores/CubeLambdaImportState.js +302 -0
  398. package/lib/stores/CubeLambdaImportState.js.map +1 -0
  399. package/lib/stores/CubeLambdaSources.d.ts +45 -0
  400. package/lib/stores/CubeLambdaSources.d.ts.map +1 -0
  401. package/lib/stores/CubeLambdaSources.js +261 -0
  402. package/lib/stores/CubeLambdaSources.js.map +1 -0
  403. package/lib/stores/CubeQueryRun.d.ts +59 -0
  404. package/lib/stores/CubeQueryRun.d.ts.map +1 -0
  405. package/lib/stores/CubeQueryRun.js +101 -0
  406. package/lib/stores/CubeQueryRun.js.map +1 -0
  407. package/lib/stores/CubeRunStatsState.d.ts +61 -0
  408. package/lib/stores/CubeRunStatsState.d.ts.map +1 -0
  409. package/lib/stores/CubeRunStatsState.js +54 -0
  410. package/lib/stores/CubeRunStatsState.js.map +1 -0
  411. package/lib/stores/CubeRunningStepLambda.d.ts +25 -0
  412. package/lib/stores/CubeRunningStepLambda.d.ts.map +1 -0
  413. package/lib/stores/CubeRunningStepLambda.js +45 -0
  414. package/lib/stores/CubeRunningStepLambda.js.map +1 -0
  415. package/lib/stores/CubeServiceRecheck.d.ts +29 -0
  416. package/lib/stores/CubeServiceRecheck.d.ts.map +1 -0
  417. package/lib/stores/CubeServiceRecheck.js +33 -0
  418. package/lib/stores/CubeServiceRecheck.js.map +1 -0
  419. package/lib/stores/CubeShowPureState.d.ts +14 -1
  420. package/lib/stores/CubeShowPureState.d.ts.map +1 -1
  421. package/lib/stores/CubeShowPureState.js +41 -11
  422. package/lib/stores/CubeShowPureState.js.map +1 -1
  423. package/lib/stores/CubeSourcePickerState.d.ts +20 -4
  424. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
  425. package/lib/stores/CubeSourcePickerState.js +75 -14
  426. package/lib/stores/CubeSourcePickerState.js.map +1 -1
  427. package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
  428. package/lib/stores/LocalModelCatalog.js +3 -1
  429. package/lib/stores/LocalModelCatalog.js.map +1 -1
  430. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts +91 -0
  431. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts.map +1 -0
  432. package/lib/stores/editors/CubeExpressionFilterDraft.js +254 -0
  433. package/lib/stores/editors/CubeExpressionFilterDraft.js.map +1 -0
  434. package/lib/stores/editors/CubeFunctionDraft.d.ts +34 -0
  435. package/lib/stores/editors/CubeFunctionDraft.d.ts.map +1 -0
  436. package/lib/stores/editors/CubeFunctionDraft.js +69 -0
  437. package/lib/stores/editors/CubeFunctionDraft.js.map +1 -0
  438. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +4 -2
  439. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
  440. package/lib/stores/editors/CubeNodeDraftRegistry.js +20 -3
  441. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
  442. package/lib/stores/editors/CubePivotDraft.d.ts +93 -0
  443. package/lib/stores/editors/CubePivotDraft.d.ts.map +1 -0
  444. package/lib/stores/editors/CubePivotDraft.js +267 -0
  445. package/lib/stores/editors/CubePivotDraft.js.map +1 -0
  446. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts +26 -0
  447. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts.map +1 -0
  448. package/lib/stores/fixtures/CubeSalesDuckDbModel.js +46 -0
  449. package/lib/stores/fixtures/CubeSalesDuckDbModel.js.map +1 -0
  450. package/lib/stores/fixtures/CubeTradesModel.d.ts +4 -0
  451. package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -1
  452. package/lib/stores/fixtures/CubeTradesModel.js +31 -1
  453. package/lib/stores/fixtures/CubeTradesModel.js.map +1 -1
  454. package/lib/stores/source-picker/CubeDataProductTabState.d.ts +34 -5
  455. package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -1
  456. package/lib/stores/source-picker/CubeDataProductTabState.js +111 -26
  457. package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -1
  458. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +25 -2
  459. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -1
  460. package/lib/stores/source-picker/CubeDirectConnectionTabState.js +183 -31
  461. package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -1
  462. package/lib/stores/source-picker/CubeIngestTabState.d.ts +22 -9
  463. package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -1
  464. package/lib/stores/source-picker/CubeIngestTabState.js +84 -29
  465. package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -1
  466. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +100 -4
  467. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -1
  468. package/lib/stores/source-picker/CubeInlineModelTabState.js +415 -28
  469. package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -1
  470. package/lib/stores/source-picker/CubeProjectTabState.d.ts +18 -3
  471. package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -1
  472. package/lib/stores/source-picker/CubeProjectTabState.js +26 -1
  473. package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -1
  474. package/lib/stores/source-picker/CubeServiceTabState.d.ts +74 -0
  475. package/lib/stores/source-picker/CubeServiceTabState.d.ts.map +1 -0
  476. package/lib/stores/source-picker/CubeServiceTabState.js +216 -0
  477. package/lib/stores/source-picker/CubeServiceTabState.js.map +1 -0
  478. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +15 -3
  479. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -1
  480. package/lib/stores/source-picker/CubeSourcePickerTab.js +21 -0
  481. package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -1
  482. package/package.json +10 -9
  483. package/src/__lib__/LegendCubeCommand.ts +7 -0
  484. package/src/__lib__/LegendCubeFunctionLabels.ts +41 -0
  485. package/src/__lib__/LegendCubeHelpText.ts +23 -1
  486. package/src/__lib__/LegendCubeLabels.ts +170 -13
  487. package/src/__lib__/LegendCubeProjectSourceLabels.ts +26 -0
  488. package/src/__lib__/LegendCubeServiceLabels.ts +41 -0
  489. package/src/__lib__/LegendCubeTesting.ts +7 -0
  490. package/src/__test-utils__/CubeEngineTestSupport.ts +2 -1
  491. package/src/__test-utils__/CubeExpressionTestUtils.ts +29 -2
  492. package/src/__test-utils__/CubeFunctionTestOutline.ts +78 -0
  493. package/src/__test-utils__/CubeLambdaCorpus.ts +137 -0
  494. package/src/__test-utils__/CubePageTestUtils.tsx +34 -0
  495. package/src/__test-utils__/CubeTestApplication.ts +25 -0
  496. package/src/__test-utils__/FakeCubeEngine.ts +27 -0
  497. package/src/__test-utils__/FakeCubeIngestCatalog.ts +18 -0
  498. package/src/__test-utils__/FakeCubeServiceCatalog.ts +57 -0
  499. package/src/components/CubeAddItems.tsx +13 -6
  500. package/src/components/CubeDialogTheme.ts +25 -0
  501. package/src/components/CubeEditor.tsx +155 -129
  502. package/src/components/CubeFileMenu.tsx +127 -0
  503. package/src/components/CubeLambdaImportBanner.tsx +97 -0
  504. package/src/components/CubeNodeIcon.tsx +7 -0
  505. package/src/components/CubeSchemaColumnsTable.tsx +7 -2
  506. package/src/components/canvas/CubeCanvas.tsx +52 -13
  507. package/src/components/canvas/CubeCanvasContextMenu.tsx +33 -2
  508. package/src/components/canvas/CubeCanvasElements.ts +76 -3
  509. package/src/components/canvas/CubeCanvasLayout.ts +1 -1
  510. package/src/components/canvas/CubeCanvasNode.tsx +30 -3
  511. package/src/components/dev-settings/CubeDevSettings.tsx +154 -0
  512. package/src/components/editors/CubeColumnChecklist.tsx +8 -2
  513. package/src/components/editors/CubeColumnPicker.tsx +6 -3
  514. package/src/components/editors/CubeConcatEditor.tsx +2 -2
  515. package/src/components/editors/CubeExpressionFilterEditor.tsx +193 -0
  516. package/src/components/editors/CubeExtendEditor.tsx +3 -3
  517. package/src/components/editors/CubeFilterEditor.tsx +13 -1
  518. package/src/components/editors/CubeFunctionSourceEditor.tsx +140 -0
  519. package/src/components/editors/CubeJoinEditor.tsx +23 -4
  520. package/src/components/editors/CubeNodeEditorPanel.tsx +22 -10
  521. package/src/components/editors/CubeNodeEditorPopper.tsx +9 -1
  522. package/src/components/editors/CubeNodeEditorRegistry.ts +12 -0
  523. package/src/components/editors/CubePivotEditor.tsx +277 -0
  524. package/src/components/editors/CubeRestrictEditor.tsx +8 -2
  525. package/src/components/editors/CubeServiceSourceEditor.tsx +77 -0
  526. package/src/components/grid/CubeColumnFormatDialog.tsx +289 -0
  527. package/src/components/grid/CubeDrilldownBar.tsx +219 -0
  528. package/src/components/grid/CubeGridRegion.tsx +170 -54
  529. package/src/components/grid/CubeGridValues.ts +146 -1
  530. package/src/components/grid/CubeResultGrid.tsx +443 -41
  531. package/src/components/grid/CubeRunStatsPanel.tsx +156 -0
  532. package/src/components/grid/CubeServerSideGrid.tsx +200 -0
  533. package/src/components/grid/CubeSqlDialog.tsx +90 -0
  534. package/src/components/grid/CubeSqlFormat.ts +37 -0
  535. package/src/components/palette/CubePalette.tsx +45 -12
  536. package/src/components/show-pure/CubeShowPureDialog.tsx +19 -5
  537. package/src/components/source-picker/CubeDataProductTab.tsx +169 -75
  538. package/src/components/source-picker/CubeDirectConnectionTab.tsx +42 -30
  539. package/src/components/source-picker/CubeFunctionSteps.tsx +244 -0
  540. package/src/components/source-picker/CubeIngestTab.tsx +159 -79
  541. package/src/components/source-picker/CubeInlineModelTab.tsx +110 -81
  542. package/src/components/source-picker/CubePickerListItem.tsx +118 -0
  543. package/src/components/source-picker/CubeProjectTab.tsx +6 -3
  544. package/src/components/source-picker/CubeServiceTab.tsx +151 -0
  545. package/src/components/source-picker/CubeSourcePicker.tsx +54 -18
  546. package/src/components/source-picker/CubeTablePreview.tsx +49 -0
  547. package/src/components/spec-transfer/CubeImportPureDialog.tsx +122 -0
  548. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +21 -8
  549. package/src/graph-manager/CubeDataProductCatalog.ts +11 -0
  550. package/src/graph-manager/CubeEngine.ts +51 -1
  551. package/src/graph-manager/CubeEngineClientSettings.ts +64 -0
  552. package/src/graph-manager/CubeIngest.ts +15 -0
  553. package/src/graph-manager/CubeIngestCatalog.ts +33 -0
  554. package/src/graph-manager/CubeLakehouseRuntime.ts +43 -0
  555. package/src/graph-manager/CubeProjectCatalog.ts +3 -3
  556. package/src/graph-manager/CubeService.ts +29 -0
  557. package/src/graph-manager/CubeServiceCatalog.ts +35 -0
  558. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +115 -5
  559. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +13 -7
  560. package/src/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.ts +312 -0
  561. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +35 -9
  562. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +6 -15
  563. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.ts +471 -0
  564. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +70 -15
  565. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +3 -1
  566. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +7 -1
  567. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +122 -7
  568. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +9 -4
  569. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.ts +92 -0
  570. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +6 -1
  571. package/src/index.ts +32 -2
  572. package/src/stores/CubeAddPlacement.ts +25 -5
  573. package/src/stores/CubeDevSettingsState.ts +117 -0
  574. package/src/stores/CubeEditorState.ts +687 -197
  575. package/src/stores/CubeEngineChecks.ts +240 -0
  576. package/src/stores/CubeExamples.ts +70 -1
  577. package/src/stores/CubeExamplesState.ts +4 -2
  578. package/src/stores/CubeExecutionState.ts +26 -57
  579. package/src/stores/CubeExportState.ts +196 -0
  580. package/src/stores/CubeExpressionFilterCheck.ts +218 -0
  581. package/src/stores/CubeExtendTyping.ts +6 -46
  582. package/src/stores/CubeFunctionRecheck.ts +97 -0
  583. package/src/stores/CubeGridFetcher.ts +302 -0
  584. package/src/stores/CubeGridQuickActions.ts +33 -11
  585. package/src/stores/CubeGridState.ts +450 -0
  586. package/src/stores/CubeHost.ts +48 -0
  587. package/src/stores/CubeLambdaImportState.ts +434 -0
  588. package/src/stores/CubeLambdaSources.ts +390 -0
  589. package/src/stores/CubeQueryRun.ts +169 -0
  590. package/src/stores/CubeRunStatsState.ts +91 -0
  591. package/src/stores/CubeRunningStepLambda.ts +62 -0
  592. package/src/stores/CubeServiceRecheck.ts +53 -0
  593. package/src/stores/CubeShowPureState.ts +51 -12
  594. package/src/stores/CubeSourcePickerState.ts +89 -13
  595. package/src/stores/LocalModelCatalog.ts +6 -1
  596. package/src/stores/editors/CubeExpressionFilterDraft.ts +385 -0
  597. package/src/stores/editors/CubeFunctionDraft.ts +92 -0
  598. package/src/stores/editors/CubeNodeDraftRegistry.ts +27 -2
  599. package/src/stores/editors/CubePivotDraft.ts +355 -0
  600. package/src/stores/fixtures/CubeSalesDuckDbModel.ts +54 -0
  601. package/src/stores/fixtures/CubeTradesModel.ts +36 -1
  602. package/src/stores/source-picker/CubeDataProductTabState.ts +162 -35
  603. package/src/stores/source-picker/CubeDirectConnectionTabState.ts +246 -47
  604. package/src/stores/source-picker/CubeIngestTabState.ts +112 -38
  605. package/src/stores/source-picker/CubeInlineModelTabState.ts +514 -34
  606. package/src/stores/source-picker/CubeProjectTabState.ts +35 -3
  607. package/src/stores/source-picker/CubeServiceTabState.ts +288 -0
  608. package/src/stores/source-picker/CubeSourcePickerTab.ts +31 -2
  609. package/tsconfig.json +50 -0
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ colSpec,
19
+ colSpecArray,
20
+ EmitRole,
21
+ type ExpressionCheck,
22
+ type ExpressionFilter,
23
+ foldColumnName,
24
+ func,
25
+ getExpressionFilterSignature,
26
+ type IR,
27
+ type JsonObject,
28
+ lambda,
29
+ lambdaJson,
30
+ type NodeRegistry,
31
+ originOf,
32
+ type Query,
33
+ QueryEmitter,
34
+ Schema,
35
+ type SchemaColumn,
36
+ TypeFamily,
37
+ } from '@finos/legend-cube';
38
+ import {
39
+ CubeEngineError,
40
+ CubeEngineErrorKind,
41
+ type NodeId,
42
+ } from '../graph-manager/CubeEngine.js';
43
+ import { withoutEngineContext } from './CubeExtendTyping.js';
44
+
45
+ // Checking a Filter by Expression's condition with the engine (PLAN §11.11):
46
+ // its input's relation, as Cube types any node, then `filter` with the
47
+ // condition. A condition that isn't one Boolean fails there with no location
48
+ // and the whole relation type, so the same call types the condition alone,
49
+ // as an extend column, which gives its type for Cube's own message.
50
+
51
+ /** The key of the lambda that filters the input with the condition */
52
+ const filterKeyOf = (filterId: string): NodeId => `${filterId}#filter`;
53
+
54
+ /** The key of the lambda that types the condition alone, as an extend column */
55
+ const conditionKeyOf = (filterId: string): NodeId => `${filterId}#condition`;
56
+
57
+ /** A name for the condition typed alone that no input column has, as databases that ignore case compare names */
58
+ export const getConditionColumnName = (input: Schema): string => {
59
+ const taken = new Set(input.names().map(foldColumnName));
60
+ let name = 'cube_condition';
61
+ for (let suffix = 2; taken.has(foldColumnName(name)); suffix += 1) {
62
+ name = `cube_condition_${suffix}`;
63
+ }
64
+ return name;
65
+ };
66
+
67
+ /**
68
+ * The lambdas that check a condition, by key: the input's relation filtered
69
+ * with it, and the input's relation extended with it under a name no input
70
+ * column has. A located lambda keeps its locations, so an error points into
71
+ * its text; a stored one is marked with the filter, so an error lands on it.
72
+ * The input must be valid.
73
+ */
74
+ export const buildCubeConditionCheckLambdas = (
75
+ query: Query,
76
+ filter: ExpressionFilter,
77
+ condition: JsonObject,
78
+ input: Schema,
79
+ registry: NodeRegistry,
80
+ located: boolean,
81
+ ): Map<NodeId, IR> => {
82
+ const [inputId] = query.getInputIds(filter.id);
83
+ if (inputId === undefined) {
84
+ throw new Error(
85
+ `Filter by expression "${filter.id}" has no input to check it on`,
86
+ );
87
+ }
88
+ const relation = new QueryEmitter(query, registry).emitRelation(inputId);
89
+ const origin = located ? undefined : originOf(filter.id, EmitRole.EXPRESSION);
90
+ return new Map<NodeId, IR>([
91
+ [
92
+ filterKeyOf(filter.id),
93
+ lambda([], [func('filter', [relation, lambdaJson(condition, origin)])]),
94
+ ],
95
+ [
96
+ conditionKeyOf(filter.id),
97
+ lambda(
98
+ [],
99
+ [
100
+ func('extend', [
101
+ relation,
102
+ colSpecArray([
103
+ colSpec(
104
+ getConditionColumnName(input),
105
+ lambdaJson(condition, origin),
106
+ ),
107
+ ]),
108
+ ]),
109
+ ],
110
+ ),
111
+ ],
112
+ ]);
113
+ };
114
+
115
+ /** A condition's type as the message names it: `Integer`, `Boolean[0..1]` */
116
+ const describeConditionType = (column: SchemaColumn): string =>
117
+ `${column.type.displayName}${column.nullable ? '[0..1]' : ''}`;
118
+
119
+ /** What checking a condition gave: the check to store, and the error the engine gave, if it failed */
120
+ export interface CubeConditionCheckResult {
121
+ readonly check: ExpressionCheck;
122
+ readonly error?: CubeEngineError | undefined;
123
+ }
124
+
125
+ /**
126
+ * The check the engine's answers give, for this input and this condition:
127
+ * checked when the filter types; else failed, with the condition's type when
128
+ * it types alone but isn't one Boolean, and the engine's error: the
129
+ * condition's own when it fails alone, as it names no `filter`, else the
130
+ * filter's (a network failure when there is neither)
131
+ */
132
+ export const readCubeConditionCheck = (
133
+ answers: ReadonlyMap<NodeId, Schema | CubeEngineError>,
134
+ filter: ExpressionFilter,
135
+ input: Schema,
136
+ upstream: string | undefined,
137
+ ): CubeConditionCheckResult => {
138
+ const signature = getExpressionFilterSignature(input, filter.lambda);
139
+ const filtered = answers.get(filterKeyOf(filter.id));
140
+ if (filtered instanceof Schema) {
141
+ return { check: { kind: 'checked', signature, upstream } };
142
+ }
143
+ const alone = answers.get(conditionKeyOf(filter.id));
144
+ const conditionColumn =
145
+ alone instanceof Schema ? alone.columns.at(-1) : undefined;
146
+ const resultType =
147
+ conditionColumn &&
148
+ !(
149
+ conditionColumn.type.family === TypeFamily.BOOLEAN &&
150
+ !conditionColumn.nullable
151
+ )
152
+ ? describeConditionType(conditionColumn)
153
+ : undefined;
154
+ const error =
155
+ (alone instanceof CubeEngineError ? alone : undefined) ??
156
+ filtered ??
157
+ new CubeEngineError(
158
+ CubeEngineErrorKind.NETWORK,
159
+ 'The engine gave no answer for this condition',
160
+ filter.id,
161
+ );
162
+ return {
163
+ check: {
164
+ kind: 'failed',
165
+ signature,
166
+ message: withoutEngineContext(error.detail),
167
+ resultType,
168
+ upstream,
169
+ },
170
+ error,
171
+ };
172
+ };
173
+
174
+ /** The digest of what the engine was given for the input, which the check recorded */
175
+ export const getCubeConditionCheckUpstream = (
176
+ check: ExpressionCheck,
177
+ ): string | undefined =>
178
+ check.kind === 'unresolved' ? undefined : check.upstream;
179
+
180
+ /**
181
+ * Whether the filter's check says its condition is one Boolean for this
182
+ * input: checked, for this schema and this condition, and for this input as
183
+ * the engine is given it, or recorded without it, as when loaded
184
+ */
185
+ export const isCubeConditionCheckCurrent = (
186
+ filter: ExpressionFilter,
187
+ input: Schema,
188
+ upstream: string | undefined,
189
+ ): boolean => {
190
+ const { check } = filter;
191
+ const recorded = getCubeConditionCheckUpstream(check);
192
+ return (
193
+ check.kind === 'checked' &&
194
+ filter.currentCheck(input) === check &&
195
+ (recorded === undefined || recorded === upstream)
196
+ );
197
+ };
198
+
199
+ /** Whether two checks say the same: the same kind, signature and input as the engine was given it, and the same failure */
200
+ export const isSameCubeConditionCheck = (
201
+ a: ExpressionCheck,
202
+ b: ExpressionCheck,
203
+ ): boolean => {
204
+ if (getCubeConditionCheckUpstream(a) !== getCubeConditionCheckUpstream(b)) {
205
+ return false;
206
+ }
207
+ if (a.kind === 'checked' && b.kind === 'checked') {
208
+ return a.signature === b.signature;
209
+ }
210
+ if (a.kind === 'failed' && b.kind === 'failed') {
211
+ return (
212
+ a.signature === b.signature &&
213
+ a.message === b.message &&
214
+ a.resultType === b.resultType
215
+ );
216
+ }
217
+ return a.kind === 'unresolved' && b.kind === 'unresolved';
218
+ };
@@ -15,18 +15,15 @@
15
15
  */
16
16
 
17
17
  import {
18
- buildSchemasAndValidity,
19
18
  colSpec,
20
19
  colSpecArray,
21
20
  EmitRole,
22
- ERR_TYPING,
23
- Extend,
21
+ type Extend,
24
22
  type ExtendTyping,
25
23
  func,
26
24
  getExtendSignature,
27
25
  hashText,
28
26
  type IR,
29
- isTypingError,
30
27
  type JsonObject,
31
28
  lambda,
32
29
  lambdaJson,
@@ -36,7 +33,6 @@ import {
36
33
  printIR,
37
34
  type Query,
38
35
  QueryEmitter,
39
- type QueryRule,
40
36
  type Schema,
41
37
  stableJsonText,
42
38
  } from '@finos/legend-cube';
@@ -116,10 +112,11 @@ const digestModel = (model: ModelContext): string => {
116
112
  };
117
113
 
118
114
  /**
119
- * What the engine is given for an Extend's input when it types it, digested
120
- * (PLAN §11.7): the input's relation as emitted, and the model. A typing
121
- * records it (`upstream`), since the engine sees more than Cube's schema
122
- * does; `undefined` when the input can't be emitted, e.g. it is invalid.
115
+ * What the engine is given for a node's input when it types an Extend or
116
+ * checks a Filter by Expression, digested (PLAN §11.7, §11.11): the input's
117
+ * relation as emitted, and the model. A typing or a check records it
118
+ * (`upstream`), since the engine sees more than Cube's schema does;
119
+ * `undefined` when the input can't be emitted, e.g. it is invalid.
123
120
  */
124
121
  export const getCubeExtendUpstream = (
125
122
  emitter: QueryEmitter,
@@ -162,43 +159,6 @@ export const isCubeExtendTypingCurrent = (
162
159
  );
163
160
  };
164
161
 
165
- /**
166
- * A query rule for the editor (PLAN §11.7): an Extend whose typing recorded
167
- * another input than the engine would be given now waits to be typed again
168
- * (`ERR_TYPING`), e.g. after an Extend above it gains `->toOne()`, which
169
- * Cube's schema doesn't show. A typing that recorded nothing, as one loaded,
170
- * is used as it is; an Extend that already waits, or whose input is invalid,
171
- * is left to its own checks.
172
- */
173
- export const createStaleCubeExtendTypingRule =
174
- (
175
- registry: NodeRegistry,
176
- modelOf: () => ModelContext | undefined,
177
- ): QueryRule =>
178
- (query) => {
179
- const stale = new Map<string, readonly string[]>();
180
- const model = modelOf();
181
- const recorded = query.nodes.filter(
182
- (node): node is Extend =>
183
- node instanceof Extend && upstreamOf(node.typing) !== undefined,
184
- );
185
- if (!model || !recorded.length) {
186
- return stale;
187
- }
188
- const { validity } = buildSchemasAndValidity(query, registry.queryRules);
189
- const emitter = new QueryEmitter(query, registry);
190
- recorded.forEach((node) => {
191
- if ((validity.get(node.id) ?? []).some(isTypingError)) {
192
- return;
193
- }
194
- const upstream = getCubeExtendUpstream(emitter, node.id, model);
195
- if (upstream !== undefined && upstream !== upstreamOf(node.typing)) {
196
- stale.set(node.id, [ERR_TYPING]);
197
- }
198
- });
199
- return stale;
200
- };
201
-
202
162
  /** What typing an Extend gave: the typing to store, and the error the engine gave, if it failed */
203
163
  export interface CubeExtendTypingResult {
204
164
  readonly typing: ExtendTyping;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ emitFunctionSource,
19
+ type EnteredValue,
20
+ type FunctionSource,
21
+ getLiteralKinds,
22
+ type IR,
23
+ lambda,
24
+ type LiteralValue,
25
+ type ModelContext,
26
+ type Schema,
27
+ } from '@finos/legend-cube';
28
+ import {
29
+ CubeEngineError,
30
+ CubeEngineErrorKind,
31
+ type CubeEngine,
32
+ type NodeId,
33
+ } from '../graph-manager/CubeEngine.js';
34
+
35
+ /** A value of each kind, which only types the call: a function's columns don't depend on its values */
36
+ const PLACEHOLDERS: Readonly<Record<LiteralValue['kind'], LiteralValue>> = {
37
+ string: { kind: 'string', value: '' },
38
+ boolean: { kind: 'boolean', value: false },
39
+ integer: { kind: 'integer', value: '0' },
40
+ float: { kind: 'float', value: '0' },
41
+ decimal: { kind: 'decimal', value: '0' },
42
+ strictDate: { kind: 'strictDate', value: '2000-01-01' },
43
+ dateTime: { kind: 'dateTime', value: '2000-01-01T00:00:00' },
44
+ enum: { kind: 'enum', value: '' },
45
+ };
46
+
47
+ /**
48
+ * The lambda that types a function source, `{| sales::ordersAbove(…)}`: its
49
+ * values where they are valid, else a placeholder of the parameter's type, or
50
+ * `[]` for an empty optional one
51
+ */
52
+ export const buildCubeFunctionTypingLambda = (source: FunctionSource): IR => {
53
+ const values: EnteredValue[] = source.parameters.map((parameter, index) => {
54
+ const value = source.values[index];
55
+ if (value !== undefined && value.kind !== 'invalid') {
56
+ return value;
57
+ }
58
+ if (value === undefined && parameter.optional) {
59
+ return undefined;
60
+ }
61
+ const [kind] = getLiteralKinds(parameter.type);
62
+ return kind ? PLACEHOLDERS[kind] : undefined;
63
+ });
64
+ return lambda([], [emitFunctionSource(source.withValues(values))]);
65
+ };
66
+
67
+ /**
68
+ * Types a cube's functions again with the engine (PLAN §6.5), in one call:
69
+ * their columns as the engine types the call. One answer per source,
70
+ * failures included; never rejects.
71
+ */
72
+ export const recheckCubeFunctionSources = async (
73
+ engine: CubeEngine,
74
+ model: ModelContext,
75
+ sources: readonly FunctionSource[],
76
+ ): Promise<Map<NodeId, Schema | CubeEngineError>> => {
77
+ try {
78
+ return await engine.typeLambdas(
79
+ model,
80
+ new Map(
81
+ sources.map((source) => [
82
+ source.id,
83
+ buildCubeFunctionTypingLambda(source),
84
+ ]),
85
+ ),
86
+ );
87
+ } catch (error) {
88
+ const failure =
89
+ error instanceof CubeEngineError
90
+ ? error
91
+ : new CubeEngineError(
92
+ CubeEngineErrorKind.NETWORK,
93
+ error instanceof Error ? error.message : String(error),
94
+ );
95
+ return new Map(sources.map((source) => [source.id, failure]));
96
+ }
97
+ };
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ buildSchemasAndValidity,
19
+ checkDrilldown,
20
+ type ColumnDirection,
21
+ deriveDrilldownLevel,
22
+ type DrilldownCell,
23
+ type DrilldownLevel,
24
+ printIR,
25
+ QueryEmitter,
26
+ SortDirection,
27
+ } from '@finos/legend-cube';
28
+ import { NULL_CELL_TEXT } from '../__lib__/LegendCubeLabels.js';
29
+ import {
30
+ CubeEngineError,
31
+ CubeEngineErrorKind,
32
+ type CubeResultValue,
33
+ } from '../graph-manager/CubeEngine.js';
34
+ import type { CubeEditorState } from './CubeEditorState.js';
35
+ import type { CubeExecutionResult } from './CubeExecutionState.js';
36
+ import { type CubeQueryRunResult, runCubeQuery } from './CubeQueryRun.js';
37
+
38
+ /** A row of a level, by the run's column positions */
39
+ export interface CubeGridRow {
40
+ /** Each run column's value, `undefined` where the level shows none (a group row's column with no aggregation) */
41
+ readonly cells: readonly (CubeResultValue | undefined)[];
42
+ /** On a group row, how many of the run's rows the group holds */
43
+ readonly count?: number | undefined;
44
+ }
45
+
46
+ /** The rows of one level of the grid: the run's rows, or groups of them */
47
+ export interface CubeGridLevelRows {
48
+ readonly level: DrilldownLevel;
49
+ readonly rows: readonly CubeGridRow[];
50
+ /** The engine returned more than the run's row limit */
51
+ readonly limited: boolean;
52
+ }
53
+
54
+ /** An answer for rows the grid no longer shows: a newer run, or the grid purged its rows; it is dropped */
55
+ export class CubeGridFetchDropped extends Error {
56
+ constructor() {
57
+ super('The rows were asked for by a grid that no longer shows them');
58
+ this.name = 'CubeGridFetchDropped';
59
+ }
60
+ }
61
+
62
+ /** The most rows the cache holds across its levels; the oldest levels go first (PLAN §11.10) */
63
+ export const MAX_CUBE_GRID_CACHED_ROWS = 200_000;
64
+
65
+ export const CUBE_GRID_CONTEXT_CHANGED =
66
+ "The cube's model, runtime or warehouse changed since this run: execute again to see more of its rows.";
67
+
68
+ interface CachedLevel {
69
+ readonly promise: Promise<CubeGridLevelRows>;
70
+ /** Its rows, once answered; 0 until then */
71
+ rows: number;
72
+ }
73
+
74
+ /** How a fetch is shown in the run stats, e.g. `Rows of SHIP_COUNTRY "France"` */
75
+ const describeFetch = (
76
+ level: DrilldownLevel,
77
+ keys: readonly DrilldownCell[],
78
+ levels: readonly string[],
79
+ sorts: readonly ColumnDirection[],
80
+ ): string => {
81
+ const of = keys
82
+ .map(
83
+ (key, index) =>
84
+ `${levels[index]} ${key === null ? NULL_CELL_TEXT : JSON.stringify(String(key))}`,
85
+ )
86
+ .join(', ');
87
+ const sorted = sorts
88
+ .map(
89
+ ({ column, direction }) =>
90
+ `${column} ${direction === SortDirection.DESC ? 'descending' : 'ascending'}`,
91
+ )
92
+ .join(', ');
93
+ return [
94
+ level.isLeaf ? 'Rows' : `Groups by ${level.groupColumns.at(-1)}`,
95
+ of ? ` of ${of}` : '',
96
+ sorted ? `, sorted by ${sorted}` : '',
97
+ ].join('');
98
+ };
99
+
100
+ /**
101
+ * Fetches the levels of the grid's server-side mode (PLAN §11.10): each a
102
+ * query derived from the run on screen, never the live cube, with the
103
+ * drill-down the cube has now and the grid's sort, run as Execute runs
104
+ * (`runCubeQuery`), with the run's model, runtime and row limit. Answers are
105
+ * cached by the derived query, the oldest dropped past
106
+ * `MAX_CUBE_GRID_CACHED_ROWS` rows. `purge()` drops them all, aborts the
107
+ * fetches in flight and drops their answers, as a new run does.
108
+ */
109
+ export class CubeGridFetcher {
110
+ readonly editorState: CubeEditorState;
111
+ /** The most rows the cache holds */
112
+ readonly maxCachedRows: number;
113
+ /** Bumped by each purge: an answer of an older generation is dropped */
114
+ private generation = 0;
115
+ private resultId: number | undefined;
116
+ /** In the order last used, the oldest first */
117
+ private readonly cache = new Map<string, CachedLevel>();
118
+ private readonly controllers = new Set<AbortController>();
119
+
120
+ constructor(
121
+ editorState: CubeEditorState,
122
+ maxCachedRows = MAX_CUBE_GRID_CACHED_ROWS,
123
+ ) {
124
+ this.editorState = editorState;
125
+ this.maxCachedRows = maxCachedRows;
126
+ }
127
+
128
+ /** How many rows the cache holds */
129
+ get cachedRows(): number {
130
+ return Array.from(this.cache.values()).reduce(
131
+ (total, cached) => total + cached.rows,
132
+ 0,
133
+ );
134
+ }
135
+
136
+ /** Drops every cached level, and aborts the fetches in flight, whose answers are then dropped */
137
+ purge(): void {
138
+ this.generation += 1;
139
+ this.cache.clear();
140
+ this.controllers.forEach((controller) => controller.abort());
141
+ this.controllers.clear();
142
+ }
143
+
144
+ /**
145
+ * The rows of the level under the expanded groups' keys (outermost first;
146
+ * none for the top level), sorted by the grid. Rejects with a
147
+ * `CubeEngineError`, or a `CubeGridFetchDropped` when the answer is for rows
148
+ * the grid no longer shows.
149
+ */
150
+ fetchLevel(
151
+ result: CubeExecutionResult,
152
+ keys: readonly DrilldownCell[],
153
+ sorts: readonly ColumnDirection[],
154
+ ): Promise<CubeGridLevelRows> {
155
+ if (result.id !== this.resultId) {
156
+ this.purge();
157
+ this.resultId = result.id;
158
+ }
159
+ const { editorState } = this;
160
+ const model = result.context?.model;
161
+ const runtime = result.context?.runtime;
162
+ const captureId = result.query.selected;
163
+ if (!model || !runtime || captureId === undefined) {
164
+ return Promise.reject(
165
+ new Error('A run has a model, a runtime and a node'),
166
+ );
167
+ }
168
+ // the warehouse is read from the page when the query runs, so a fetch
169
+ // under another one would run the run's query elsewhere
170
+ if (
171
+ result.context !== editorState.document.context ||
172
+ result.warehouse !== editorState.dataProductRuntime.effectiveWarehouse
173
+ ) {
174
+ return Promise.reject(
175
+ new CubeEngineError(
176
+ CubeEngineErrorKind.EXECUTION,
177
+ CUBE_GRID_CONTEXT_CHANGED,
178
+ captureId,
179
+ ),
180
+ );
181
+ }
182
+ let level: DrilldownLevel;
183
+ const drilldown = checkDrilldown(
184
+ editorState.document.meta.drilldown ?? { columns: [], aggregations: [] },
185
+ result.schema,
186
+ );
187
+ try {
188
+ level = deriveDrilldownLevel({
189
+ query: result.query,
190
+ captureId,
191
+ schema: result.schema,
192
+ drilldown,
193
+ keys,
194
+ sorts,
195
+ });
196
+ } catch (error) {
197
+ return Promise.reject(
198
+ new CubeEngineError(
199
+ CubeEngineErrorKind.EXECUTION,
200
+ error instanceof Error ? error.message : String(error),
201
+ captureId,
202
+ ),
203
+ );
204
+ }
205
+ const runId = level.query.selected as string;
206
+ // Cube's own checks first, so the engine never gets a query Cube knows is wrong
207
+ const { schemas, validity } = buildSchemasAndValidity(
208
+ level.query,
209
+ editorState.registry.queryRules,
210
+ );
211
+ const problem = (validity.get(runId) ?? [])[0];
212
+ const schema = schemas.get(runId);
213
+ if (problem !== undefined || !schema) {
214
+ return Promise.reject(
215
+ new CubeEngineError(
216
+ CubeEngineErrorKind.EXECUTION,
217
+ `These rows can't be fetched: ${problem ?? 'the query has no columns'}`,
218
+ captureId,
219
+ ),
220
+ );
221
+ }
222
+ // the whole run, so a sort the row order keeps is in it
223
+ const key = printIR(
224
+ new QueryEmitter(level.query, editorState.registry).emitExecutionLambda({
225
+ rowLimit: result.rowLimit,
226
+ runtime,
227
+ }),
228
+ );
229
+ const cached = this.cache.get(key);
230
+ if (cached) {
231
+ // last used now
232
+ this.cache.delete(key);
233
+ this.cache.set(key, cached);
234
+ return cached.promise;
235
+ }
236
+ const generation = this.generation;
237
+ const controller = new AbortController();
238
+ this.controllers.add(controller);
239
+ const entry: CachedLevel = {
240
+ rows: 0,
241
+ promise: runCubeQuery(editorState, {
242
+ query: level.query,
243
+ model,
244
+ runtime,
245
+ schema,
246
+ rowLimit: result.rowLimit,
247
+ abortController: controller,
248
+ label: describeFetch(level, keys, drilldown.columns, sorts),
249
+ })
250
+ .then((run: CubeQueryRunResult): CubeGridLevelRows => {
251
+ if (generation !== this.generation) {
252
+ throw new CubeGridFetchDropped();
253
+ }
254
+ const positions = result.schema.columns.map(({ name }) => {
255
+ const output = level.columns.get(name);
256
+ return output === undefined
257
+ ? -1
258
+ : schema.columns.findIndex((column) => column.name === output);
259
+ });
260
+ const countAt = level.countColumn
261
+ ? schema.columns.findIndex(
262
+ (column) => column.name === level.countColumn,
263
+ )
264
+ : -1;
265
+ const rows = run.rows.map(
266
+ (row): CubeGridRow => ({
267
+ cells: positions.map((position) =>
268
+ position === -1 ? undefined : (row[position] ?? null),
269
+ ),
270
+ ...(countAt === -1 ? {} : { count: Number(row[countAt]) }),
271
+ }),
272
+ );
273
+ entry.rows = rows.length;
274
+ this.evict(key);
275
+ return { level, rows, limited: run.limited };
276
+ })
277
+ .catch((error: unknown) => {
278
+ if (this.cache.get(key) === entry) {
279
+ this.cache.delete(key);
280
+ }
281
+ throw generation !== this.generation
282
+ ? new CubeGridFetchDropped()
283
+ : error;
284
+ })
285
+ .finally(() => this.controllers.delete(controller)),
286
+ };
287
+ this.cache.set(key, entry);
288
+ return entry.promise;
289
+ }
290
+
291
+ /** Drops the least recently used levels until the cache holds at most its rows, never the one just answered */
292
+ private evict(keep: string): void {
293
+ for (const [key] of this.cache) {
294
+ if (this.cachedRows <= this.maxCachedRows) {
295
+ return;
296
+ }
297
+ if (key !== keep) {
298
+ this.cache.delete(key);
299
+ }
300
+ }
301
+ }
302
+ }