@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
@@ -20,6 +20,7 @@ import {
20
20
  type ModelContext,
21
21
  RELATIONAL_TABLE_SOURCE_DEFINITION,
22
22
  RelationalTableSource,
23
+ Schema,
23
24
  } from '@finos/legend-cube';
24
25
  import { assertErrorThrown, type GeneratorFn } from '@finos/legend-shared';
25
26
  import {
@@ -63,6 +64,8 @@ import {
63
64
  import {
64
65
  type CubeSourcePickerTab,
65
66
  CubeSourcePickerTabKey,
67
+ CUBE_TABLE_PREVIEW_DELAY_MS,
68
+ generateCubeNodeIds,
66
69
  } from './CubeSourcePickerTab.js';
67
70
 
68
71
  /** An error as the tab shows it: its first line, with the rest on demand (R48) */
@@ -147,11 +150,19 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
147
150
  /** The schema's tables; none until they are listed */
148
151
  schemaTables: readonly CubeExploredTable[] | undefined;
149
152
  /** The picked table, by its stored (quoted) name */
150
- tableName: string | undefined;
153
+ /** The picked tables' stored names, in the order picked; several are added at once */
154
+ tableNames: readonly string[] = [];
151
155
  tableSearch = '';
152
156
  isTesting = false;
153
157
  isListing = false;
154
158
  isResolving = false;
159
+ /** The table, by its stored name, whose columns the tab shows under the list: the one picked last */
160
+ previewTableName: string | undefined;
161
+ /** The columns of each table previewed, or why they couldn't be read, by schema and stored name */
162
+ previewSchemas: ReadonlyMap<string, Schema | string> = new Map();
163
+ /** Counts the connection's changes, so a late preview is dropped */
164
+ private previewGeneration = 0;
165
+ private previewTimer: ReturnType<typeof setTimeout> | undefined;
155
166
  error: CubeDirectConnectionError | undefined;
156
167
  /** DuckDB only: a CSV to add to the setup SQL as a table, pasted or read from a file */
157
168
  csvText = '';
@@ -176,11 +187,16 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
176
187
  schemas: observable.ref,
177
188
  schemaName: observable,
178
189
  schemaTables: observable.ref,
179
- tableName: observable,
190
+ tableNames: observable.ref,
191
+ tableName: computed,
180
192
  tableSearch: observable,
181
193
  isTesting: observable,
182
194
  isListing: observable,
183
195
  isResolving: observable,
196
+ previewTableName: observable,
197
+ previewSchemas: observable.ref,
198
+ previewedColumns: computed,
199
+ loadPreview: flow,
184
200
  error: observable.ref,
185
201
  csvText: observable,
186
202
  csvTableName: observable,
@@ -203,6 +219,7 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
203
219
  setDuckDbPath: action,
204
220
  selectSchema: action,
205
221
  selectTable: action,
222
+ toggleTable: action,
206
223
  setTableSearch: action,
207
224
  setCsvText: action,
208
225
  setCsvTableName: action,
@@ -303,9 +320,20 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
303
320
  );
304
321
  }
305
322
 
323
+ /** The one picked table's stored name; none when several are */
324
+ get tableName(): string | undefined {
325
+ return this.tableNames.length === 1 ? this.tableNames[0] : undefined;
326
+ }
327
+
328
+ /** How many tables Add adds */
329
+ get pickedCount(): number {
330
+ return this.tableNames.length;
331
+ }
332
+
306
333
  get canConfirm(): boolean {
307
- const table = this.schemaTables?.find(
308
- (candidate) => candidate.storedName === this.tableName,
334
+ // a picked table hidden by the search still counts
335
+ const tables = this.tableNames.map((name) =>
336
+ this.schemaTables?.find((candidate) => candidate.storedName === name),
309
337
  );
310
338
  return (
311
339
  this.isOffered &&
@@ -315,8 +343,10 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
315
343
  this.connection !== undefined &&
316
344
  this.connection === this.testedConnection &&
317
345
  this.schemaName !== undefined &&
318
- table !== undefined &&
319
- isExploredTableSelectable(table)
346
+ tables.length > 0 &&
347
+ tables.every(
348
+ (table) => table !== undefined && isExploredTableSelectable(table),
349
+ )
320
350
  );
321
351
  }
322
352
 
@@ -434,9 +464,101 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
434
464
  }
435
465
  }
436
466
 
467
+ /** Picks the table alone, in place of any picked, and previews its columns */
437
468
  selectTable(storedName: string | undefined): void {
438
- this.tableName = storedName;
469
+ this.tableNames = storedName === undefined ? [] : [storedName];
470
+ this.error = undefined;
471
+ this.preview(storedName);
472
+ }
473
+
474
+ /** Adds the table to the picked ones, previewing it, or takes it out */
475
+ toggleTable(storedName: string): void {
476
+ const adding = !this.tableNames.includes(storedName);
477
+ this.tableNames = adding
478
+ ? [...this.tableNames, storedName]
479
+ : this.tableNames.filter((each) => each !== storedName);
439
480
  this.error = undefined;
481
+ this.preview(adding ? storedName : this.tableNames.at(-1));
482
+ }
483
+
484
+ private previewKey(storedName: string): string {
485
+ return `${this.schemaName ?? ''}\u0000${storedName}`;
486
+ }
487
+
488
+ /** The previewed table's columns, `undefined` while they load, or why they couldn't be read */
489
+ get previewedColumns(): Schema | string | undefined {
490
+ const name = this.previewTableName;
491
+ return name === undefined
492
+ ? undefined
493
+ : this.previewSchemas.get(this.previewKey(name));
494
+ }
495
+
496
+ /** Previews the table once the clicks pause (`CUBE_TABLE_PREVIEW_DELAY_MS`) */
497
+ private preview(storedName: string | undefined): void {
498
+ this.previewTableName = storedName;
499
+ this.cancelPreview();
500
+ if (storedName !== undefined) {
501
+ this.previewTimer = setTimeout(() => {
502
+ this.previewTimer = undefined;
503
+ flowResult(this.loadPreview(storedName)).catch(
504
+ this.editorState.host.applicationStore.alertUnhandledError,
505
+ );
506
+ }, CUBE_TABLE_PREVIEW_DELAY_MS);
507
+ }
508
+ }
509
+
510
+ private cancelPreview(): void {
511
+ if (this.previewTimer !== undefined) {
512
+ clearTimeout(this.previewTimer);
513
+ this.previewTimer = undefined;
514
+ }
515
+ }
516
+
517
+ /** Reads a table's columns from the engine, over the connection tested */
518
+ *loadPreview(storedName: string): GeneratorFn<void> {
519
+ const key = this.previewKey(storedName);
520
+ const table = this.schemaTables?.find(
521
+ (candidate) => candidate.storedName === storedName,
522
+ );
523
+ const connection = this.testedConnection;
524
+ const schemaName = this.schemaName;
525
+ if (
526
+ this.previewSchemas.has(key) ||
527
+ !table ||
528
+ !connection ||
529
+ schemaName === undefined
530
+ ) {
531
+ return;
532
+ }
533
+ const model =
534
+ this.editorState.document.context?.model ??
535
+ createCubeDirectModel(connection);
536
+ const coordinates = getCubeDirectTableCoordinates(schemaName, table);
537
+ const generation = this.previewGeneration;
538
+ const id = this.editorState.document.query.generateId(
539
+ RelationalTableSource.TYPE,
540
+ );
541
+ let answer: Schema | string;
542
+ try {
543
+ const typed = (yield this.editorState.host.engine.resolveSchemas(
544
+ model,
545
+ new Map([
546
+ [id, [coordinates.database, coordinates.schema, coordinates.table]],
547
+ ]),
548
+ )) as Awaited<
549
+ ReturnType<typeof this.editorState.host.engine.resolveSchemas>
550
+ >;
551
+ const schema = typed.get(id);
552
+ answer =
553
+ schema instanceof Schema
554
+ ? schema
555
+ : (schema?.message ?? CUBE_DIRECT_MESSAGE.NO_TABLE_SCHEMA);
556
+ } catch (error) {
557
+ answer = toError(error).message;
558
+ }
559
+ if (generation === this.previewGeneration) {
560
+ this.previewSchemas = new Map(this.previewSchemas).set(key, answer);
561
+ }
440
562
  }
441
563
 
442
564
  setTableSearch(search: string): void {
@@ -476,6 +598,7 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
476
598
  this.isTesting = false;
477
599
  this.isListing = false;
478
600
  this.isResolving = false;
601
+ this.cancelPreview();
479
602
  }
480
603
 
481
604
  /** Lists the connection's schemas; with a single one, lists its tables */
@@ -558,58 +681,130 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
558
681
  const model: ModelContext =
559
682
  contextBefore?.model ??
560
683
  createCubeDirectModel(this.connection as CubeDirectConnection);
561
- const table = this.schemaTables?.find(
562
- (candidate) => candidate.storedName === this.tableName,
563
- ) as CubeExploredTable;
564
- const coordinates = getCubeDirectTableCoordinates(
565
- this.schemaName as string,
566
- table,
684
+ const tables = this.tableNames.map(
685
+ (name) =>
686
+ this.schemaTables?.find(
687
+ (candidate) => candidate.storedName === name,
688
+ ) as CubeExploredTable,
567
689
  );
568
- // the engine stamps the table's accessor with its node id, so the id comes first
569
- const id = editorState.document.query.generateId(
690
+ const schemaName = this.schemaName as string;
691
+ // the engine stamps each table's accessor with its node id, so the ids come first
692
+ const ids = generateCubeNodeIds(
693
+ editorState.document.query,
570
694
  RelationalTableSource.TYPE,
695
+ tables.length,
571
696
  );
697
+ this.cancelPreview();
572
698
  const request = ++this.confirmRequest;
573
699
  this.isResolving = true;
574
700
  this.error = undefined;
575
701
  try {
576
- const typed = (yield editorState.host.engine.resolveSchemas(
577
- model,
578
- new Map([
579
- [id, [coordinates.database, coordinates.schema, coordinates.table]],
580
- ]),
581
- )) as Awaited<ReturnType<typeof editorState.host.engine.resolveSchemas>>;
702
+ // a table previewed has its columns already: the engine types the others
703
+ const typed = new Map<string, Schema | CubeEngineError>();
704
+ const toType = new Map<string, readonly [string, string, string]>();
705
+ tables.forEach((table, index) => {
706
+ const id = ids[index] as string;
707
+ const schema = this.previewSchemas.get(
708
+ this.previewKey(table.storedName),
709
+ );
710
+ if (schema instanceof Schema) {
711
+ typed.set(id, schema);
712
+ } else {
713
+ const coordinates = getCubeDirectTableCoordinates(schemaName, table);
714
+ toType.set(id, [
715
+ coordinates.database,
716
+ coordinates.schema,
717
+ coordinates.table,
718
+ ]);
719
+ }
720
+ });
721
+ if (toType.size) {
722
+ const answer = (yield editorState.host.engine.resolveSchemas(
723
+ model,
724
+ toType,
725
+ )) as Awaited<
726
+ ReturnType<typeof editorState.host.engine.resolveSchemas>
727
+ >;
728
+ answer.forEach((schema, id) => typed.set(id, schema));
729
+ }
582
730
  if (request !== this.confirmRequest) {
583
731
  return false;
584
732
  }
585
- const schema = typed.get(id);
586
- if (schema === undefined || schema instanceof CubeEngineError) {
587
- throw (
588
- schema ??
589
- new CubeEngineError(
590
- CubeEngineErrorKind.COMPILE,
591
- CUBE_DIRECT_MESSAGE.NO_TABLE_SCHEMA,
592
- )
593
- );
594
- }
595
- const node = RELATIONAL_TABLE_SOURCE_DEFINITION.resolve(
596
- RELATIONAL_TABLE_SOURCE_DEFINITION.fromCoordinates(id, coordinates),
597
- { kind: 'resolved', schema },
598
- );
599
733
  const { document } = editorState;
600
- if (document.context !== contextBefore || !document.query.canAdd(node)) {
734
+ if (document.context !== contextBefore) {
601
735
  throw new Error(CUBE_DIRECT_MESSAGE.CUBE_CHANGED);
602
736
  }
603
- const query = document.query.add(node);
604
- editorState.applyDocument(
605
- document.context
606
- ? document.withQuery(query)
607
- : document
608
- .withContext({ model, runtime: CUBE_DIRECT_RUNTIME_PATH })
609
- .withQuery(query),
610
- );
611
- // what was tested is now the cube's connection
612
- this.testedConnection = this.connection;
737
+ // each table typed is added, in the order picked; the first one picked
738
+ // is the one that runs on an empty cube, as a single table would be
739
+ let query = document.query;
740
+ const added: string[] = [];
741
+ const failed: CubeDirectConnectionError[] = [];
742
+ // with several tables, each failure names its table
743
+ const named = (
744
+ table: CubeExploredTable,
745
+ error: CubeDirectConnectionError,
746
+ ): CubeDirectConnectionError =>
747
+ tables.length > 1
748
+ ? { ...error, message: `${table.name}: ${error.message}` }
749
+ : error;
750
+ tables.forEach((table, index) => {
751
+ const id = ids[index] as string;
752
+ const schema = typed.get(id);
753
+ if (schema === undefined || schema instanceof CubeEngineError) {
754
+ failed.push(
755
+ named(
756
+ table,
757
+ toError(
758
+ schema ??
759
+ new CubeEngineError(
760
+ CubeEngineErrorKind.COMPILE,
761
+ CUBE_DIRECT_MESSAGE.NO_TABLE_SCHEMA,
762
+ ),
763
+ ),
764
+ ),
765
+ );
766
+ return;
767
+ }
768
+ const node = RELATIONAL_TABLE_SOURCE_DEFINITION.resolve(
769
+ RELATIONAL_TABLE_SOURCE_DEFINITION.fromCoordinates(
770
+ id,
771
+ getCubeDirectTableCoordinates(schemaName, table),
772
+ ),
773
+ { kind: 'resolved', schema },
774
+ );
775
+ if (!query.canAdd(node)) {
776
+ failed.push(
777
+ named(table, { message: CUBE_DIRECT_MESSAGE.CUBE_CHANGED }),
778
+ );
779
+ return;
780
+ }
781
+ query = query.add(node);
782
+ added.push(table.storedName);
783
+ });
784
+ if (added.length) {
785
+ editorState.applyDocument(
786
+ document.context
787
+ ? document.withQuery(query)
788
+ : document
789
+ .withContext({ model, runtime: CUBE_DIRECT_RUNTIME_PATH })
790
+ .withQuery(query),
791
+ );
792
+ // what was tested is now the cube's connection
793
+ this.testedConnection = this.connection;
794
+ }
795
+ if (failed.length) {
796
+ // the tables added aren't picked any more, so Add again adds only the others
797
+ this.tableNames = this.tableNames.filter(
798
+ (name) => !added.includes(name),
799
+ );
800
+ this.error =
801
+ failed.length === 1
802
+ ? failed[0]
803
+ : {
804
+ message: failed.map((each) => each.message).join('\n'),
805
+ };
806
+ return false;
807
+ }
613
808
  this.resetTable();
614
809
  return true;
615
810
  } catch (error) {
@@ -626,6 +821,8 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
626
821
 
627
822
  /** Forgets what was read from the connection: it changed, or its answers are stale */
628
823
  private resetResults(): void {
824
+ this.previewGeneration++;
825
+ this.previewSchemas = new Map();
629
826
  this.testRequest++;
630
827
  this.listRequest++;
631
828
  this.confirmRequest++;
@@ -641,7 +838,9 @@ export class CubeDirectConnectionTabState implements CubeSourcePickerTab {
641
838
  }
642
839
 
643
840
  private resetTable(): void {
644
- this.tableName = undefined;
841
+ this.tableNames = [];
645
842
  this.tableSearch = '';
843
+ this.previewTableName = undefined;
844
+ this.cancelPreview();
646
845
  }
647
846
  }
@@ -53,6 +53,7 @@ import type { CubeEditorState } from '../CubeEditorState.js';
53
53
  import {
54
54
  type CubeSourcePickerTab,
55
55
  CubeSourcePickerTabKey,
56
+ generateCubeNodeIds,
56
57
  } from './CubeSourcePickerTab.js';
57
58
 
58
59
  /** What failed in the tab: its first line, and the rest on demand */
@@ -79,10 +80,10 @@ const toError = (error: unknown): CubeIngestTabError => {
79
80
  /**
80
81
  * The source dialog's Ingest tab (PLAN §6.7), as Data Cube's producer
81
82
  * source picks: the Mode (class), the viewer's environment for it, a
82
- * producer deployment, one of its SDLC-deployed definitions, then a data
83
- * set, typed from what the definition declares. The first Add saves the
84
- * class, the producer deployment and the warehouse as the cube's model;
85
- * then the tab offers only that deployment's definitions.
83
+ * producer deployment, one of its SDLC-deployed definitions, then one or
84
+ * several of its data sets, typed from what the definition declares. The
85
+ * first Add saves the class, the producer deployment and the warehouse as
86
+ * the cube's model; then the tab offers only that deployment's definitions.
86
87
  */
87
88
  export class CubeIngestTabState implements CubeSourcePickerTab {
88
89
  readonly key = CubeSourcePickerTabKey.INGEST;
@@ -97,7 +98,8 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
97
98
  definitionSearch = '';
98
99
  definition: CubeIngestDefinitionCandidate | undefined;
99
100
  dataSets: readonly CubeIngestDataSet[] | undefined;
100
- dataSetName: string | undefined;
101
+ /** The picked data sets, by name, in the order picked; several are added at once */
102
+ dataSetNames: readonly string[] = [];
101
103
  /** The warehouse of a cube without one yet: the one the viewer last picked, else the default */
102
104
  warehouse = CUBE_DEFAULT_CONSUMER_WAREHOUSE;
103
105
  isLoadingEnvironment = false;
@@ -124,7 +126,9 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
124
126
  definitionSearch: observable,
125
127
  definition: observable.ref,
126
128
  dataSets: observable.ref,
127
- dataSetName: observable,
129
+ dataSetNames: observable.ref,
130
+ dataSetName: computed,
131
+ pickedDataSets: computed,
128
132
  warehouse: observable,
129
133
  isLoadingEnvironment: observable,
130
134
  isListingDefinitions: observable,
@@ -143,6 +147,7 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
143
147
  setDefinitionSearch: action,
144
148
  selectDefinition: action,
145
149
  selectDataSet: action,
150
+ toggleDataSet: action,
146
151
  setWarehouse: action,
147
152
  retry: action,
148
153
  open: action,
@@ -194,8 +199,34 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
194
199
  );
195
200
  }
196
201
 
202
+ /** The data set picked last, the one previewed */
203
+ get dataSetName(): string | undefined {
204
+ return this.dataSetNames.at(-1);
205
+ }
206
+
207
+ /** The data set picked last, the one previewed */
197
208
  get dataSet(): CubeIngestDataSet | undefined {
198
- return this.dataSets?.find((each) => each.name === this.dataSetName);
209
+ return this.findDataSet(this.dataSetName);
210
+ }
211
+
212
+ /** The picked data sets, in the order picked */
213
+ get pickedDataSets(): readonly (CubeIngestDataSet | undefined)[] {
214
+ return this.dataSetNames.map((name) => this.findDataSet(name));
215
+ }
216
+
217
+ /** How many data sets Add adds */
218
+ get pickedCount(): number {
219
+ return this.dataSetNames.length;
220
+ }
221
+
222
+ isDataSetPicked(name: string): boolean {
223
+ return this.dataSetNames.includes(name);
224
+ }
225
+
226
+ private findDataSet(name: string | undefined): CubeIngestDataSet | undefined {
227
+ return name === undefined
228
+ ? undefined
229
+ : this.dataSets?.find((each) => each.name === name);
199
230
  }
200
231
 
201
232
  get canConfirm(): boolean {
@@ -206,7 +237,8 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
206
237
  !this.isAdding &&
207
238
  this.producerDeploymentId !== undefined &&
208
239
  this.definition !== undefined &&
209
- this.dataSet?.isPickable === true &&
240
+ this.pickedDataSets.length > 0 &&
241
+ this.pickedDataSets.every((each) => each?.isPickable === true) &&
210
242
  this.warehouse.trim() !== ''
211
243
  );
212
244
  }
@@ -255,10 +287,19 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
255
287
  }
256
288
  }
257
289
 
258
- /** Picks a data set that can be added */
290
+ /** Picks a data set that can be added, alone, in place of any picked */
259
291
  selectDataSet(name: string): void {
260
- if (this.dataSets?.find((each) => each.name === name)?.isPickable) {
261
- this.dataSetName = name;
292
+ if (this.findDataSet(name)?.isPickable) {
293
+ this.dataSetNames = [name];
294
+ }
295
+ }
296
+
297
+ /** Adds a data set that can be added to the picked ones, or takes it out */
298
+ toggleDataSet(name: string): void {
299
+ if (this.isDataSetPicked(name)) {
300
+ this.dataSetNames = this.dataSetNames.filter((each) => each !== name);
301
+ } else if (this.findDataSet(name)?.isPickable) {
302
+ this.dataSetNames = [...this.dataSetNames, name];
262
303
  }
263
304
  }
264
305
 
@@ -364,6 +405,20 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
364
405
  }
365
406
  this.environment = environment;
366
407
  this.producers = producers;
408
+ // a new cube starts on the environment's own warehouse, when it has one
409
+ if (!this.fixedSettings && environment.warehouse) {
410
+ this.warehouse = environment.warehouse;
411
+ }
412
+ // the only producer deployment is the one to read
413
+ const [onlyProducer] = producers;
414
+ if (
415
+ this.producerDeploymentId === undefined &&
416
+ producers.length === 1 &&
417
+ onlyProducer
418
+ ) {
419
+ this.producerDeploymentId = onlyProducer.deploymentId;
420
+ this.resetDefinitions();
421
+ }
367
422
  } catch (error) {
368
423
  if (request === this.environmentRequest) {
369
424
  this.loadedEnvironmentType = undefined;
@@ -427,9 +482,11 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
427
482
  if (request === this.describeRequest) {
428
483
  this.dataSets = dataSets;
429
484
  // the only data set that can be added is picked
430
- const pickable = dataSets.filter((each) => each.isPickable);
431
- this.dataSetName =
432
- pickable.length === 1 ? pickable[0]?.name : undefined;
485
+ const [onlyPickable, ...otherPickable] = dataSets.filter(
486
+ (each) => each.isPickable,
487
+ );
488
+ this.dataSetNames =
489
+ onlyPickable && !otherPickable.length ? [onlyPickable.name] : [];
433
490
  }
434
491
  } catch (error) {
435
492
  if (request === this.describeRequest) {
@@ -443,9 +500,10 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
443
500
  }
444
501
 
445
502
  /**
446
- * Adds the data set, already typed; the first saves the class, the
447
- * producer deployment and the warehouse as the cube's model, in the same
448
- * undo step, and remembers the warehouse for the viewer's next cubes
503
+ * Adds the picked data sets, already typed, in one undo step; the first
504
+ * saves the class, the producer deployment and the warehouse as the cube's
505
+ * model, in the same undo step, and remembers the warehouse for the
506
+ * viewer's next cubes
449
507
  */
450
508
  *confirm(): GeneratorFn<boolean> {
451
509
  if (!this.canConfirm) {
@@ -453,7 +511,7 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
453
511
  }
454
512
  const { editorState } = this;
455
513
  const definition = this.definition as CubeIngestDefinitionCandidate;
456
- const dataSet = this.dataSet as CubeIngestDataSet;
514
+ const picked = this.pickedDataSets as readonly CubeIngestDataSet[];
457
515
  const producerDeploymentId = this.producerDeploymentId as string;
458
516
  const warehouse = this.warehouse.trim();
459
517
  const request = ++this.confirmRequest;
@@ -466,29 +524,45 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
466
524
  return false;
467
525
  }
468
526
  const { document } = editorState;
469
- const id = document.query.generateId(IngestDatasetSource.TYPE);
470
- const node = INGEST_DATASET_SOURCE_DEFINITION.resolve(
471
- INGEST_DATASET_SOURCE_DEFINITION.fromCoordinates(id, {
472
- ingestDefinitionUrn: definition.urn,
473
- ingestDefinition: definition.definition,
474
- dataSet: dataSet.name,
475
- }),
476
- {
477
- kind: 'resolved',
478
- schema: dataSet.schema as NonNullable<CubeIngestDataSet['schema']>,
479
- },
527
+ const ids = generateCubeNodeIds(
528
+ document.query,
529
+ IngestDatasetSource.TYPE,
530
+ picked.length,
531
+ );
532
+ const nodes = picked.map((dataSet, index) =>
533
+ INGEST_DATASET_SOURCE_DEFINITION.resolve(
534
+ INGEST_DATASET_SOURCE_DEFINITION.fromCoordinates(
535
+ ids[index] as string,
536
+ {
537
+ ingestDefinitionUrn: definition.urn,
538
+ ingestDefinition: definition.definition,
539
+ dataSet: dataSet.name,
540
+ },
541
+ ),
542
+ {
543
+ kind: 'resolved',
544
+ schema: dataSet.schema as NonNullable<CubeIngestDataSet['schema']>,
545
+ },
546
+ ),
480
547
  );
481
548
  const settings = this.fixedSettings;
482
549
  if (
483
- (document.context !== undefined &&
484
- (!settings ||
485
- settings.environmentType !== this.environmentType ||
486
- settings.producerDeploymentId !== producerDeploymentId)) ||
487
- !document.query.canAdd(node)
550
+ document.context !== undefined &&
551
+ (!settings ||
552
+ settings.environmentType !== this.environmentType ||
553
+ settings.producerDeploymentId !== producerDeploymentId)
488
554
  ) {
489
555
  throw new Error(CUBE_INGEST_TAB_MESSAGE.CUBE_CHANGED);
490
556
  }
491
- const query = document.query.add(node);
557
+ // each data set is added in the order picked; the first one picked is
558
+ // the one that runs on an empty cube, as a single one would be
559
+ let query = document.query;
560
+ for (const node of nodes) {
561
+ if (!query.canAdd(node)) {
562
+ throw new Error(CUBE_INGEST_TAB_MESSAGE.CUBE_CHANGED);
563
+ }
564
+ query = query.add(node);
565
+ }
492
566
  editorState.applyDocument(
493
567
  document.context
494
568
  ? document.withQuery(query)
@@ -506,8 +580,8 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
506
580
  if (!settings) {
507
581
  editorState.dataProductRuntime.remember(warehouse);
508
582
  }
509
- // the definition stays open, to add another of its data sets
510
- this.dataSetName = undefined;
583
+ // the definition stays open, to add others of its data sets
584
+ this.dataSetNames = [];
511
585
  return true;
512
586
  } catch (error) {
513
587
  if (request === this.confirmRequest) {
@@ -546,6 +620,6 @@ export class CubeIngestTabState implements CubeSourcePickerTab {
546
620
  this.isDescribing = false;
547
621
  this.definition = undefined;
548
622
  this.dataSets = undefined;
549
- this.dataSetName = undefined;
623
+ this.dataSetNames = [];
550
624
  }
551
625
  }