@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
@@ -13,27 +13,40 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { DataProductAccessPointSource, IngestDatasetSource, buildSchemasAndValidity, createNodeRegistry, CubeDocument, diffSchemas, Extend, findLostSortOrders, isTypingError, MESSAGE_SORT_COLUMNS_CUT, MESSAGE_SORT_COLUMNS_DROPPED, MESSAGE_SORT_ORDER_LOST, QueryEmitter, RelationalTableSource, rereadQueryFilterValues, } from '@finos/legend-cube';
16
+ import { DataProductAccessPointSource, IngestDatasetSource, buildSchemasAndValidity, createNodeRegistry, CubeDocument, diffSchemas, dependsOnDatabaseType, findLostSortOrders, getDatabaseProblemOfType, getDatabaseProblems, isTypingError, MESSAGE_SORT_COLUMNS_CUT, MESSAGE_SORT_COLUMNS_DROPPED, MESSAGE_SORT_ORDER_LOST, QueryEmitter, RelationalTableSource, rereadQueryFilterValues, ServiceSource, foldColumnName, FunctionSource, copyQueryNode, SourceNode, } from '@finos/legend-cube';
17
17
  import { action, computed, flow, flowResult, makeObservable, observable, reaction, } from 'mobx';
18
18
  import { LEGEND_CUBE_COMMAND_KEY } from '../__lib__/LegendCubeCommand.js';
19
19
  import { LEGEND_CUBE_TEST_ID } from '../__lib__/LegendCubeTesting.js';
20
- import { CUBE_EDITOR_CLOSED_REASON, DEFAULT_ROW_LIMIT, getSchemaDriftWarning, getExtendRetypeWarning, getSourceRecheckWarning, LEGEND_CUBE_USER_DATA_KEY, MAX_UNDO_STEPS, } from '../__lib__/LegendCubeLabels.js';
20
+ import { CUBE_EDITOR_CLOSED_REASON, DEFAULT_ROW_LIMIT, getSchemaDriftWarning, getSourceRecheckWarning, LEGEND_CUBE_USER_DATA_KEY, MAX_UNDO_STEPS, } from '../__lib__/LegendCubeLabels.js';
21
21
  import { CUBE_DATA_PRODUCT_RECHECK_MESSAGE, getAccessPointDriftWarning, getAccessPointRecheckWarning, } from '../__lib__/LegendCubeDataProductLabels.js';
22
22
  import { CUBE_INGEST_RECHECK_MESSAGE, getDataSetDriftWarning, getDataSetRecheckWarning, } from '../__lib__/LegendCubeIngestLabels.js';
23
23
  import { isCubeDataProductModel } from '../graph-manager/CubeDataProduct.js';
24
24
  import { isCubeIngestModel } from '../graph-manager/CubeIngest.js';
25
+ import { isCubeServiceModel } from '../graph-manager/CubeService.js';
25
26
  import { CubeEngineError, CubeEngineErrorKind, } from '../graph-manager/CubeEngine.js';
27
+ import { CUBE_LAKEHOUSE_RUNTIME_KIND, getLakehouseDatabaseType, } from '../graph-manager/CubeLakehouseRuntime.js';
26
28
  import { getDatabaseType } from '../graph-manager/CubeModelOutlineHelper.js';
27
29
  import { recheckCubeDataProductSources } from './CubeDataProductRecheck.js';
28
30
  import { recheckCubeIngestSources } from './CubeIngestRecheck.js';
31
+ import { recheckCubeServiceSources } from './CubeServiceRecheck.js';
32
+ import { CUBE_FUNCTION_MESSAGE, getFunctionDriftWarning, getFunctionRecheckWarning, } from '../__lib__/LegendCubeFunctionLabels.js';
33
+ import { recheckCubeFunctionSources } from './CubeFunctionRecheck.js';
29
34
  import { CubeDataProductRuntimeState } from './CubeDataProductRuntimeState.js';
30
35
  import { CubeExamplesState } from './CubeExamplesState.js';
36
+ import { CubeExportState } from './CubeExportState.js';
37
+ import { CubeGridFetcher } from './CubeGridFetcher.js';
38
+ import { CubeGridState } from './CubeGridState.js';
39
+ import { CubeDevSettingsState } from './CubeDevSettingsState.js';
40
+ import { CubeRunStatsState } from './CubeRunStatsState.js';
31
41
  import { CubeExecutionState } from './CubeExecutionState.js';
42
+ import { CubeExpressionFilterDraft } from './editors/CubeExpressionFilterDraft.js';
32
43
  import { CubeExtendDraft } from './editors/CubeExtendDraft.js';
33
- import { buildCubeExtendTypingLambdas, createStaleCubeExtendTypingRule, getCubeExtendTypingUpstream, getCubeExtendUpstream, isCubeExtendTypingCurrent, isSameCubeExtendTyping, readCubeExtendTyping, } from './CubeExtendTyping.js';
44
+ import { buildCubeEngineCheckRequest, createStaleCubeEngineCheckRule, getCubeEngineCheckUpstream, isCubeEngineCheckedNode, } from './CubeEngineChecks.js';
45
+ import { getCubeExtendUpstream } from './CubeExtendTyping.js';
34
46
  import { loadCubeModelOutline } from './CubeHost.js';
35
47
  import { CubeNodeEditorState } from './CubeNodeEditorState.js';
36
48
  import { CubeShowPureState } from './CubeShowPureState.js';
49
+ import { CubeLambdaImportState } from './CubeLambdaImportState.js';
37
50
  import { CubeSourcePickerState } from './CubeSourcePickerState.js';
38
51
  import { CubeSpecTransferState } from './CubeSpecTransferState.js';
39
52
  const isValidRowLimit = (value) => value !== undefined && Number.isSafeInteger(value) && value >= 1;
@@ -56,19 +69,52 @@ export class CubeEditorState {
56
69
  host;
57
70
  /** One registry for inference, emission and the saved spec */
58
71
  registry;
59
- /** The editor's own query rule: an Extend typed for another input than its own waits to be typed again (PLAN §11.7) */
60
- staleExtendTyping;
72
+ /**
73
+ * The editor's own query rule: an Extend typed, or a Filter by Expression
74
+ * checked, for another input than its own waits to be checked again (PLAN
75
+ * §11.7, §11.11)
76
+ */
77
+ staleEngineChecks;
78
+ /**
79
+ * The editor's query rule for the database a node runs on: `%` or `_`
80
+ * given to a pattern on DuckDB (PLAN §11.11), once the model's outline
81
+ * tells the database
82
+ */
83
+ databaseRefusals;
61
84
  execution;
85
+ /** The latest runs, fetches and exports (spec §12.6) */
86
+ runStats;
87
+ /** The Dev Settings, at the top left (PLAN §11.16) */
88
+ devSettings;
89
+ /** The grid's server-side levels (PLAN §11.10) */
90
+ gridFetcher;
91
+ /** The grid's mode and its server-side levels (PLAN §11.10) */
92
+ grid;
93
+ /** The results' export (spec §12.5) */
94
+ export;
62
95
  /** Where a lakehouse cube runs, a data product's or an ingest one's: its class and warehouse */
63
96
  dataProductRuntime;
64
97
  sourcePicker;
65
98
  specTransfer;
66
99
  examples;
67
100
  showPure;
101
+ /** Import Pure: the lambda the page opened on, read into the cube (PLAN §11.18) */
102
+ lambdaImport;
68
103
  nodeEditor;
69
104
  document;
70
105
  /** Earlier documents, oldest first */
71
106
  history = [];
107
+ /**
108
+ * The step copied last, as it was, with the cube's context then, which a
109
+ * pasted source needs; kept for the page, across cubes
110
+ */
111
+ copiedNode;
112
+ /**
113
+ * The changes undone, the latest last, to redo; a new change clears them.
114
+ * Each keeps whether it was read-only and whether undoing it left another
115
+ * cube (an import), so a redo restores both
116
+ */
117
+ redoStack = [];
72
118
  /** Engine errors by node id: shown with the node's own errors, never part of inference */
73
119
  hostIssues = new Map();
74
120
  /**
@@ -77,17 +123,28 @@ export class CubeEditorState {
77
123
  */
78
124
  warnings = new Map();
79
125
  /**
80
- * The outline of each model the cube used, loaded when an editor needs it,
81
- * e.g. for the Join's 'type unknown' warning; by reference, never observed
82
- * deeply
126
+ * The outline of each model the cube used, by the model's JSON
127
+ * (`modelKey`): loaded when the cube reads a table, or an editor or a run
128
+ * needs it, e.g. for the Join's 'type unknown' warning or the database a
129
+ * node runs on (PLAN §11.12); by reference, never observed deeply
83
130
  */
84
131
  modelOutlines = new Map();
132
+ /** Each model's key in `modelOutlines`, its JSON, worked out once per model object */
133
+ modelKeys = new WeakMap();
134
+ /** The outlines on their way, by model key, so a second load waits for the first */
135
+ loadingOutlines = new Map();
85
136
  /** Sources sent to the engine to be typed again, until it answers */
86
137
  pendingSources = new Set();
87
- /** Extends sent to the engine to be typed, until it answers (PLAN §11.7) */
88
- typingExtends = new Set();
89
- /** Types the Extends that wait for it, whenever one does (PLAN §11.7 Q4) */
90
- retyping;
138
+ /** Extends and Filters by Expression sent to the engine to be checked, until it answers (PLAN §11.7, §11.11) */
139
+ checkingNodes = new Set();
140
+ /** Checks the nodes that wait for the engine, whenever one does (PLAN §11.7 Q4) */
141
+ rechecking;
142
+ /**
143
+ * Loads the model's outline once the cube reads a table, so the database it
144
+ * runs on is known before any run: some nodes are refused there, or written
145
+ * another way (PLAN §11.4, §11.11, §11.12)
146
+ */
147
+ outlineLoading;
91
148
  /** The rows a run returns; kept per user, never in the cube */
92
149
  rowLimit;
93
150
  /** The palette shows icons only; kept per user, never in the cube */
@@ -104,15 +161,18 @@ export class CubeEditorState {
104
161
  constructor(host, document = new CubeDocument()) {
105
162
  makeObservable(this, {
106
163
  pendingSources: observable.ref,
107
- typingExtends: observable.ref,
108
- extendsToType: computed,
109
- isTypingExtends: computed,
110
- retypeExtends: flow,
164
+ checkingNodes: observable.ref,
165
+ nodesToCheck: computed,
166
+ isCheckingExpressions: computed,
167
+ checkExpressions: flow,
111
168
  modelOutlines: observable.ref,
112
169
  modelOutline: computed,
113
170
  loadModelOutline: flow,
114
171
  document: observable.ref,
115
172
  history: observable.ref,
173
+ redoStack: observable.ref,
174
+ canRedo: computed,
175
+ redo: action,
116
176
  hostIssues: observable.ref,
117
177
  warnings: observable.ref,
118
178
  derivedWarnings: computed,
@@ -126,10 +186,14 @@ export class CubeEditorState {
126
186
  hasEditsToApply: computed,
127
187
  executeEdited: action,
128
188
  undoEdited: action,
189
+ redoEdited: action,
129
190
  isDialogOpen: computed,
130
191
  applyDocument: action,
131
192
  undo: action,
132
193
  importDocument: action,
194
+ openDocument: action,
195
+ startNewCube: action,
196
+ isEmptyCube: computed,
133
197
  reresolveSources: flow,
134
198
  refreshSource: flow,
135
199
  applyQuery: action,
@@ -139,16 +203,28 @@ export class CubeEditorState {
139
203
  addConfiguredNode: action,
140
204
  dropNode: action,
141
205
  removeNode: action,
206
+ copiedNode: observable.ref,
207
+ canPaste: computed,
208
+ copyNode: action,
209
+ pasteNode: action,
210
+ duplicateNode: action,
142
211
  swapInputs: action,
143
212
  setShowGraph: action,
144
213
  setPaletteCollapsed: action,
145
214
  setHostIssue: action,
146
215
  clearHostIssues: action,
147
216
  setRowLimit: action,
217
+ setColumnWidth: action,
148
218
  });
149
219
  this.host = host;
150
220
  this.registry = createNodeRegistry();
151
- this.staleExtendTyping = createStaleCubeExtendTypingRule(this.registry, () => this.document.context?.model);
221
+ this.staleEngineChecks = createStaleCubeEngineCheckRule(this.registry, () => this.document.context?.model);
222
+ this.databaseRefusals = (query) => new Map(query.nodes
223
+ .map((node) => [
224
+ node.id,
225
+ this.getNodeDatabaseProblems(query, node),
226
+ ])
227
+ .filter(([, problems]) => problems.length > 0));
152
228
  this.document = document;
153
229
  const storedLimit = host.applicationStore.userDataService.getNumericValue(LEGEND_CUBE_USER_DATA_KEY.ROW_LIMIT);
154
230
  this.rowLimit = isValidRowLimit(storedLimit)
@@ -157,27 +233,43 @@ export class CubeEditorState {
157
233
  this.isPaletteCollapsed =
158
234
  host.applicationStore.userDataService.getBooleanValue(LEGEND_CUBE_USER_DATA_KEY.PALETTE_COLLAPSED) ?? false;
159
235
  this.execution = new CubeExecutionState(this);
236
+ this.runStats = new CubeRunStatsState();
237
+ this.devSettings = new CubeDevSettingsState(host);
238
+ this.gridFetcher = new CubeGridFetcher(this);
239
+ this.grid = new CubeGridState(this);
240
+ this.export = new CubeExportState(this);
160
241
  this.dataProductRuntime = new CubeDataProductRuntimeState(this);
161
242
  this.sourcePicker = new CubeSourcePickerState(this);
162
243
  this.specTransfer = new CubeSpecTransferState(this);
163
244
  this.examples = new CubeExamplesState(this);
164
245
  this.showPure = new CubeShowPureState(this);
246
+ this.lambdaImport = new CubeLambdaImportState(this);
165
247
  this.nodeEditor = new CubeNodeEditorState(this);
166
- this.retyping = reaction(() => this.extendsToType, (waiting) => {
248
+ this.rechecking = reaction(() => this.nodesToCheck, (waiting) => {
167
249
  if (waiting.length) {
168
- flowResult(this.retypeExtends(waiting)).catch(this.host.applicationStore.alertUnhandledError);
250
+ flowResult(this.checkExpressions(waiting)).catch(this.host.applicationStore.alertUnhandledError);
251
+ }
252
+ }, { fireImmediately: true });
253
+ // the model, while the cube reads a table: another model loads too
254
+ this.outlineLoading = reaction(() => this.document.query.nodes.some((node) => node instanceof RelationalTableSource)
255
+ ? this.document.context?.model
256
+ : undefined, (model) => {
257
+ if (model !== undefined) {
258
+ flowResult(this.loadModelOutline(model)).catch(this.host.applicationStore.alertUnhandledError);
169
259
  }
170
260
  }, { fireImmediately: true });
171
261
  }
172
262
  /**
173
263
  * Each node's schema and errors, query-level rules included, as the
174
- * emitter sees them, and an Extend typed for another input than its own
175
- * waiting (`ERR_TYPING`), which only the editor can tell
264
+ * emitter sees them; an Extend or a Filter by Expression checked for
265
+ * another input than its own waiting, and a filter its database would
266
+ * misread refused, which only the editor can tell
176
267
  */
177
268
  get analysis() {
178
269
  return buildSchemasAndValidity(this.document.query, [
179
270
  ...this.registry.queryRules,
180
- this.staleExtendTyping,
271
+ this.staleEngineChecks,
272
+ this.databaseRefusals,
181
273
  ]);
182
274
  }
183
275
  get emitter() {
@@ -192,37 +284,38 @@ export class CubeEditorState {
192
284
  return this.pendingSources.has(node);
193
285
  }
194
286
  /**
195
- * The Extends of the cube shown that wait for the engine to type their
196
- * columns, their input valid, and that aren't being typed (PLAN §11.7):
197
- * new expressions, or an input that changed
287
+ * The Extends and Filters by Expression of the cube shown that wait for
288
+ * the engine, their input valid, and that aren't being checked (PLAN §11.7,
289
+ * §11.11): new expressions, or an input that changed
198
290
  */
199
- get extendsToType() {
291
+ get nodesToCheck() {
200
292
  const { validity } = this.analysis;
201
- return this.document.query.nodes.filter((node) => node instanceof Extend &&
202
- !this.typingExtends.has(node) &&
293
+ return this.document.query.nodes.filter((node) => isCubeEngineCheckedNode(node) &&
294
+ !this.checkingNodes.has(node) &&
203
295
  (validity.get(node.id) ?? []).some(isTypingError));
204
296
  }
205
- /** The cube shown has Extends the engine is typing */
206
- get isTypingExtends() {
207
- return this.document.query.nodes.some((node) => this.typingExtends.has(node));
297
+ /** The cube shown has expressions the engine is checking: an Extend's columns, a filter's condition */
298
+ get isCheckingExpressions() {
299
+ return this.document.query.nodes.some((node) => this.checkingNodes.has(node));
208
300
  }
209
- /** The node waits for the engine to type it, or is being typed: an Extend (PLAN §11.7) */
301
+ /** The node waits for the engine to check it, or is being checked: an Extend or a Filter by Expression (PLAN §11.7, §11.11) */
210
302
  isTypingNode(node) {
211
- return (this.typingExtends.has(node) ||
303
+ return (this.checkingNodes.has(node) ||
212
304
  (this.analysis.validity.get(node.id) ?? []).some(isTypingError));
213
305
  }
214
306
  /**
215
- * Types Extends' columns with the engine, in one call, outside the undo
216
- * history (PLAN §11.7 Q4): each for the input it has now, its columns
217
- * after its input's relation, as typing types any node. The typing goes in
218
- * place of the very nodes sent, in the cube shown and the undo snapshots
219
- * that give the engine the same input; one the user changed meanwhile is
220
- * left to type again. Each typing records the input as the engine was given
221
- * it (`upstream`). A typing the engine couldn't give names the column it
222
- * failed on; when the engine can't be reached, a typing still current for
223
- * the input is kept, with a warning, as a source's saved columns are.
307
+ * Checks expressions with the engine, in one call, outside the undo history
308
+ * (PLAN §11.7 Q4, §11.11): an Extend's columns typed, a Filter by
309
+ * Expression's condition checked, each for the input it has now, after its
310
+ * input's relation, as typing types any node. The check goes in place of
311
+ * the very nodes sent, in the cube shown and the undo snapshots that give
312
+ * the engine the same input; one the user changed meanwhile is left to
313
+ * check again. Each check records the input as the engine was given it
314
+ * (`upstream`). A check the engine couldn't give says why; when the engine
315
+ * can't be reached, a check still current for the input is kept, with a
316
+ * warning, as a source's saved columns are.
224
317
  */
225
- *retypeExtends(nodes) {
318
+ *checkExpressions(nodes) {
226
319
  const { context, query } = this.document;
227
320
  if (!context) {
228
321
  return;
@@ -233,30 +326,18 @@ export class CubeEditorState {
233
326
  const [inputId] = query.getInputIds(node.id);
234
327
  const input = inputId === undefined ? undefined : schemas.get(inputId);
235
328
  if (query.getNode(node.id) !== node ||
236
- this.typingExtends.has(node) ||
237
- !input ||
238
- node.columns.some(({ lambda }) => lambda === undefined)) {
329
+ this.checkingNodes.has(node) ||
330
+ !input) {
239
331
  return [];
240
332
  }
241
- const columns = node.columns.map(({ name, lambda }) => ({
242
- name,
243
- lambda: lambda,
244
- }));
245
- return [
246
- {
247
- node,
248
- input,
249
- columns,
250
- upstream: getCubeExtendUpstream(emitter, node.id, context.model),
251
- lambdas: buildCubeExtendTypingLambdas(query, node, columns, this.registry, false),
252
- },
253
- ];
333
+ const request = buildCubeEngineCheckRequest(query, node, input, getCubeExtendUpstream(emitter, node.id, context.model), this.registry);
334
+ return request ? [request] : [];
254
335
  });
255
336
  if (!requests.length) {
256
337
  return;
257
338
  }
258
339
  const sent = requests.map(({ node }) => node);
259
- this.typingExtends = new Set([...this.typingExtends, ...sent]);
340
+ this.checkingNodes = new Set([...this.checkingNodes, ...sent]);
260
341
  let answers;
261
342
  try {
262
343
  answers = (yield this.host.engine.typeLambdas(context.model, new Map(requests.flatMap(({ lambdas }) => [...lambdas]))));
@@ -268,27 +349,25 @@ export class CubeEditorState {
268
349
  answers = new Map(requests.flatMap(({ lambdas }) => [...lambdas.keys()].map((key) => [key, failure])));
269
350
  }
270
351
  finally {
271
- this.typingExtends = new Set([...this.typingExtends].filter((node) => !sent.includes(node)));
352
+ this.checkingNodes = new Set([...this.checkingNodes].filter((node) => !sent.includes(node)));
272
353
  }
273
- // a typing that comes back the same leaves its node, and the query, alone
354
+ // a check that comes back the same leaves its node, and the query, alone
274
355
  const warnings = new Map(this.warnings);
275
- const replacements = new Map(requests.flatMap(({ node, input, columns, upstream }) => {
276
- const { typing, error } = readCubeExtendTyping(answers, node, input, columns, upstream);
277
- if (error?.kind === CubeEngineErrorKind.NETWORK &&
278
- isCubeExtendTypingCurrent(node, input, upstream)) {
279
- warnings.set(node.key, [getExtendRetypeWarning(error.firstLine)]);
356
+ const replacements = new Map(requests.flatMap((request) => {
357
+ const { node } = request;
358
+ const outcome = request.read(answers);
359
+ if (outcome.keptWarning !== undefined) {
360
+ warnings.set(node.key, [outcome.keptWarning]);
280
361
  return [];
281
362
  }
282
363
  warnings.delete(node.key);
283
- return isSameCubeExtendTyping(typing, node.typing)
284
- ? []
285
- : [[node, node.withTyping(typing)]];
364
+ return outcome.node ? [[node, outcome.node]] : [];
286
365
  }));
287
366
  this.warnings = warnings;
288
- // an undo snapshot whose input differs keeps the typing it had
367
+ // an undo snapshot whose input differs keeps the check it had
289
368
  const emitters = new Map([[query, emitter]]);
290
369
  this.replaceOutsideHistory(replacements, (snapshot, resolved) => {
291
- const upstream = getCubeExtendTypingUpstream(resolved.typing);
370
+ const upstream = getCubeEngineCheckUpstream(resolved);
292
371
  if (upstream === undefined) {
293
372
  return true;
294
373
  }
@@ -355,18 +434,34 @@ export class CubeEditorState {
355
434
  const model = this.document.context?.model;
356
435
  return model === undefined ? undefined : this.getModelOutline(model);
357
436
  }
437
+ /**
438
+ * A model's key for its outline: its JSON, so a cube imported on the same
439
+ * model, a new object with the same content, shares the outline loaded
440
+ */
441
+ modelKey(model) {
442
+ let key = this.modelKeys.get(model);
443
+ if (key === undefined) {
444
+ key = JSON.stringify(model);
445
+ this.modelKeys.set(model, key);
446
+ }
447
+ return key;
448
+ }
358
449
  /** The outline of a model, once loaded */
359
450
  getModelOutline(model) {
360
- return this.modelOutlines.get(model);
451
+ return this.modelOutlines.get(this.modelKey(model));
361
452
  }
362
453
  /**
363
454
  * The database type a run of the query up to the node needs, with the
364
- * model's runtime (PLAN §11.4), from the model's outline once it is loaded
365
- * (`loadModelOutline`): the type of the runtime's connections to the
366
- * databases the node reads. None without an outline, which writes every
367
- * operation the native way.
455
+ * model's runtime (PLAN §11.4): for a data product or ingest cube, the
456
+ * database its lakehouse runtime routes to (§11.12); else, from the model's
457
+ * outline once it is loaded (`loadModelOutline`), the type of the runtime's
458
+ * connections to the databases the node reads. None without an outline,
459
+ * which writes every operation the native way.
368
460
  */
369
461
  getRunDatabaseType(query, nodeId, model, runtime) {
462
+ if (isCubeDataProductModel(model) || isCubeIngestModel(model)) {
463
+ return getLakehouseDatabaseType(CUBE_LAKEHOUSE_RUNTIME_KIND);
464
+ }
370
465
  const outline = this.getModelOutline(model);
371
466
  if (!outline) {
372
467
  return undefined;
@@ -377,6 +472,12 @@ export class CubeEditorState {
377
472
  if (node instanceof RelationalTableSource) {
378
473
  databases.add(node.database);
379
474
  }
475
+ else if (node instanceof FunctionSource) {
476
+ // a function reads what Cube can't see: any database of the runtime
477
+ outline.runtimes
478
+ .find(({ path }) => path === runtime)
479
+ ?.connections?.forEach(({ storePath }) => databases.add(storePath));
480
+ }
380
481
  query
381
482
  .getInputIds(id)
382
483
  .forEach((inputId) => inputId !== undefined && visit(inputId));
@@ -385,26 +486,72 @@ export class CubeEditorState {
385
486
  return getDatabaseType(outline, runtime, [...databases]);
386
487
  }
387
488
  /**
388
- * Loads the outline of a model, the cube's by default, once per model. It
389
- * only adds warnings and database types, so a model that fails to load
390
- * shows none and runs every operation the native way.
489
+ * A node's problems on the database the query up to it runs on, with the
490
+ * cube's runtime (`getRunDatabaseType`): a Pivot where it can't run (PLAN
491
+ * §11.12); a filter giving `%` or `_` to a pattern on DuckDB, which would
492
+ * match them as wildcards (§11.11). None when the database isn't known.
493
+ */
494
+ getNodeDatabaseProblems(query, node) {
495
+ const { context } = this.document;
496
+ const runtime = context?.runtime;
497
+ if (!context || runtime === undefined || !dependsOnDatabaseType(node)) {
498
+ return [];
499
+ }
500
+ return getDatabaseProblems(node, this.getRunDatabaseType(query, node.id, context.model, runtime));
501
+ }
502
+ /**
503
+ * Why a node of the type can't be added after the node, on the database the
504
+ * query up to that node runs on (PLAN §11.12): a Pivot where it can't run.
505
+ * `undefined` when it can, or the database isn't known.
506
+ */
507
+ getAddDatabaseProblem(type, afterId) {
508
+ const { context, query } = this.document;
509
+ const runtime = context?.runtime;
510
+ if (!context || runtime === undefined || afterId === undefined) {
511
+ return undefined;
512
+ }
513
+ return getDatabaseProblemOfType(type, this.getRunDatabaseType(query, afterId, context.model, runtime));
514
+ }
515
+ /**
516
+ * Loads the outline of a model, the cube's by default, once per model: a
517
+ * load already on its way is waited for, not started again, e.g. a run's
518
+ * while the cube's opening load is still out. It only adds warnings,
519
+ * database types and a database's refusals (PLAN §11.11, §11.12), so a
520
+ * model that fails to load shows none and runs every operation the native
521
+ * way.
391
522
  */
392
523
  *loadModelOutline(model = this.document.context?.model) {
393
- if (model === undefined || this.modelOutlines.has(model)) {
524
+ if (model === undefined) {
394
525
  return;
395
526
  }
527
+ const key = this.modelKey(model);
528
+ if (this.modelOutlines.has(key)) {
529
+ return;
530
+ }
531
+ let loading = this.loadingOutlines.get(key);
532
+ if (!loading) {
533
+ loading = loadCubeModelOutline(this.host, model);
534
+ this.loadingOutlines.set(key, loading);
535
+ }
396
536
  try {
397
- const outline = (yield loadCubeModelOutline(this.host, model));
398
- this.modelOutlines = new Map([...this.modelOutlines, [model, outline]]);
537
+ const outline = (yield loading);
538
+ if (!this.modelOutlines.has(key)) {
539
+ this.modelOutlines = new Map([...this.modelOutlines, [key, outline]]);
540
+ }
399
541
  }
400
542
  catch {
401
543
  // no outline, no warning: nothing is blocked on it
402
544
  }
545
+ finally {
546
+ this.loadingOutlines.delete(key);
547
+ }
403
548
  }
404
- /** One of Cube's dialogs is open: the source picker, Import or Export, Show Pure */
549
+ /** One of Cube's dialogs is open: the source picker, Examples, the group rows' settings, Import or Export, Show Pure */
405
550
  get isDialogOpen() {
406
551
  return (this.sourcePicker.isOpen ||
407
552
  this.examples.isOpen ||
553
+ this.grid.isSettingsShown ||
554
+ this.grid.formatColumn !== undefined ||
408
555
  this.specTransfer.mode !== undefined ||
409
556
  this.showPure.isOpen);
410
557
  }
@@ -427,23 +574,33 @@ export class CubeEditorState {
427
574
  (this.execution.canExecute || this.hasEditsToApply),
428
575
  action: () => this.nodeEditor.runFromKeyboard(() => this.executeEdited(), isFocusInNodeEditor()),
429
576
  });
430
- // F10 in the Extend editor (PLAN §11.7)
577
+ // F10 in the Extend and Filter by Expression editors (PLAN §11.7, §11.11)
431
578
  commandService.registerCommand({
432
579
  key: LEGEND_CUBE_COMMAND_KEY.VALIDATE_EXPRESSIONS,
433
580
  trigger: () => {
434
581
  const { draft } = this.nodeEditor;
435
582
  return (!this.isDialogOpen &&
436
583
  !this.readOnly &&
437
- draft instanceof CubeExtendDraft &&
584
+ (draft instanceof CubeExtendDraft ||
585
+ draft instanceof CubeExpressionFilterDraft) &&
438
586
  !draft.validating);
439
587
  },
440
588
  action: () => {
441
589
  const { draft } = this.nodeEditor;
442
- if (draft instanceof CubeExtendDraft) {
590
+ if (draft instanceof CubeExtendDraft ||
591
+ draft instanceof CubeExpressionFilterDraft) {
443
592
  flowResult(draft.validate()).catch(this.host.applicationStore.alertUnhandledError);
444
593
  }
445
594
  },
446
595
  });
596
+ commandService.registerCommand({
597
+ key: LEGEND_CUBE_COMMAND_KEY.REDO,
598
+ trigger: () => !this.isDialogOpen &&
599
+ !this.nodeEditor.isHeld &&
600
+ this.canRedo &&
601
+ !isTypingText(),
602
+ action: () => this.nodeEditor.runFromKeyboard(() => this.redoEdited(), isFocusInNodeEditor()),
603
+ });
447
604
  commandService.registerCommand({
448
605
  key: LEGEND_CUBE_COMMAND_KEY.UNDO,
449
606
  trigger: () => !this.isDialogOpen &&
@@ -485,6 +642,9 @@ export class CubeEditorState {
485
642
  get canUndo() {
486
643
  return this.history.length > 0 && !this.readOnly;
487
644
  }
645
+ get canRedo() {
646
+ return this.redoStack.length > 0;
647
+ }
488
648
  /** The one way to change the cube; the document before goes to the undo history */
489
649
  applyDocument(next) {
490
650
  if (next === this.document) {
@@ -499,6 +659,36 @@ export class CubeEditorState {
499
659
  * without applying its edits, and drops the last run's rows and errors,
500
660
  * which belong to the cube before. Never runs the cube.
501
661
  */
662
+ /** Whether the cube is a new one: no name, no context, no node */
663
+ get isEmptyCube() {
664
+ const { document } = this;
665
+ return (document.name === undefined &&
666
+ document.context === undefined &&
667
+ document.query.nodes.length === 0);
668
+ }
669
+ /**
670
+ * Replaces the cube with a new, empty one, as an import does (one undo
671
+ * step, so Undo brings the cube back); a cube already new is left as it is
672
+ */
673
+ startNewCube() {
674
+ if (!this.isEmptyCube) {
675
+ this.importDocument(new CubeDocument(), false);
676
+ }
677
+ }
678
+ /**
679
+ * Opens the page on a cube read for it, as `initialDocument` opens one:
680
+ * no undo step, as there was no cube before it (Import Pure's
681
+ * `initialLambda`, PLAN §11.18). Its sources come typed; its expressions
682
+ * are checked as any are.
683
+ */
684
+ openDocument(next) {
685
+ this.execution.reset();
686
+ this.sourcePicker.close();
687
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
688
+ this.hostIssues = new Map();
689
+ this.document = next;
690
+ this.readOnly = false;
691
+ }
502
692
  importDocument(next, readOnly) {
503
693
  this.pushHistory();
504
694
  this.importedOver.add(this.document);
@@ -511,9 +701,9 @@ export class CubeEditorState {
511
701
  this.document = next;
512
702
  this.readOnly = readOnly;
513
703
  flowResult(this.reresolveSources()).catch(this.host.applicationStore.alertUnhandledError);
514
- // typed once on load too, as sources are checked again: the model may
515
- // have changed the types of its functions (PLAN §11.7)
516
- flowResult(this.retypeExtends(next.query.nodes.filter((node) => node instanceof Extend))).catch(this.host.applicationStore.alertUnhandledError);
704
+ // checked once on load too, as sources are checked again: the model may
705
+ // have changed the types of its functions (PLAN §11.7, §11.11)
706
+ flowResult(this.checkExpressions(next.query.nodes.filter(isCubeEngineCheckedNode))).catch(this.host.applicationStore.alertUnhandledError);
517
707
  }
518
708
  /**
519
709
  * Types the cube's sources again, outside the undo history (PLAN §10.3,
@@ -551,10 +741,22 @@ export class CubeEditorState {
551
741
  const dataSets = isCubeIngestModel(context.model)
552
742
  ? kept.filter((node) => node instanceof IngestDatasetSource)
553
743
  : [];
744
+ // a function on another kind of cube is the no-mix rule's to flag
745
+ const functions = isCubeDataProductModel(context.model) ||
746
+ isCubeIngestModel(context.model) ||
747
+ isCubeServiceModel(context.model)
748
+ ? []
749
+ : kept.filter((node) => node instanceof FunctionSource);
750
+ // services are typed in one place, still to come (PLAN §6.4)
751
+ const services = isCubeServiceModel(context.model)
752
+ ? kept.filter((node) => node instanceof ServiceSource)
753
+ : [];
554
754
  const sources = [
555
755
  ...tables,
756
+ ...functions,
556
757
  ...accessPoints,
557
758
  ...dataSets,
759
+ ...services,
558
760
  ];
559
761
  if (!sources.length) {
560
762
  return;
@@ -562,7 +764,7 @@ export class CubeEditorState {
562
764
  this.pendingSources = new Set([...this.pendingSources, ...sources]);
563
765
  let answers;
564
766
  try {
565
- const [tableAnswers, accessPointAnswers, dataSetAnswers] = (yield Promise.all([
767
+ const [tableAnswers, accessPointAnswers, dataSetAnswers, serviceAnswers, functionAnswers,] = (yield Promise.all([
566
768
  tables.length
567
769
  ? this.host.engine
568
770
  .resolveSchemas(context.model, new Map(tables.map((source) => [
@@ -572,9 +774,7 @@ export class CubeEditorState {
572
774
  .catch((error) => {
573
775
  const failure = error instanceof CubeEngineError
574
776
  ? error
575
- : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error
576
- ? error.message
577
- : String(error));
777
+ : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error ? error.message : String(error));
578
778
  return new Map(tables.map((source) => [source.id, failure]));
579
779
  })
580
780
  : new Map(),
@@ -584,11 +784,19 @@ export class CubeEditorState {
584
784
  dataSets.length
585
785
  ? recheckCubeIngestSources(this.host.ingestCatalog, context.model, dataSets, fresh)
586
786
  : new Map(),
787
+ services.length
788
+ ? recheckCubeServiceSources(this.host.serviceCatalog, context.model, services)
789
+ : new Map(),
790
+ functions.length
791
+ ? recheckCubeFunctionSources(this.host.engine, context.model, functions)
792
+ : new Map(),
587
793
  ]));
588
794
  answers = new Map([
589
795
  ...(tableAnswers ?? []),
590
796
  ...(accessPointAnswers ?? []),
591
797
  ...(dataSetAnswers ?? []),
798
+ ...(serviceAnswers ?? []),
799
+ ...(functionAnswers ?? []),
592
800
  ]);
593
801
  }
594
802
  finally {
@@ -600,12 +808,15 @@ export class CubeEditorState {
600
808
  sources.forEach((source) => {
601
809
  const isAccessPoint = source instanceof DataProductAccessPointSource;
602
810
  const isDataSet = source instanceof IngestDatasetSource;
811
+ const isFunction = source instanceof FunctionSource;
603
812
  const answer = answers.get(source.id) ??
604
813
  new CubeEngineError(CubeEngineErrorKind.COMPILE, isAccessPoint
605
814
  ? CUBE_DATA_PRODUCT_RECHECK_MESSAGE.NO_ANSWER
606
815
  : isDataSet
607
816
  ? CUBE_INGEST_RECHECK_MESSAGE.NO_ANSWER
608
- : 'The engine gave no schema for this table', source.id);
817
+ : isFunction
818
+ ? CUBE_FUNCTION_MESSAGE.NO_ANSWER
819
+ : 'The engine gave no schema for this table', source.id);
609
820
  const saved = source.resolution.kind === 'resolved'
610
821
  ? source.resolution.schema
611
822
  : undefined;
@@ -616,7 +827,9 @@ export class CubeEditorState {
616
827
  ? getAccessPointRecheckWarning(answer.firstLine)
617
828
  : isDataSet
618
829
  ? getDataSetRecheckWarning(answer.firstLine)
619
- : getSourceRecheckWarning(answer.firstLine),
830
+ : isFunction
831
+ ? getFunctionRecheckWarning(answer.firstLine)
832
+ : getSourceRecheckWarning(answer.firstLine),
620
833
  ]);
621
834
  }
622
835
  else if (source.resolution.kind !== 'failed' ||
@@ -641,7 +854,9 @@ export class CubeEditorState {
641
854
  ? getAccessPointDriftWarning(diff)
642
855
  : isDataSet
643
856
  ? getDataSetDriftWarning(diff)
644
- : getSchemaDriftWarning(diff),
857
+ : isFunction
858
+ ? getFunctionDriftWarning(diff)
859
+ : getSchemaDriftWarning(diff),
645
860
  ]);
646
861
  }
647
862
  replacements.set(source, resolved);
@@ -692,6 +907,11 @@ export class CubeEditorState {
692
907
  return next;
693
908
  };
694
909
  this.history = this.history.map(check);
910
+ // a change undone meanwhile is redone with the checked nodes too
911
+ this.redoStack = this.redoStack.map((entry) => ({
912
+ ...entry,
913
+ document: check(entry.document),
914
+ }));
695
915
  const next = check(this.document);
696
916
  if (next !== this.document) {
697
917
  this.replaceDocument(next);
@@ -707,7 +927,9 @@ export class CubeEditorState {
707
927
  const source = this.document.query.getNode(nodeId);
708
928
  if (source instanceof RelationalTableSource ||
709
929
  source instanceof DataProductAccessPointSource ||
710
- source instanceof IngestDatasetSource) {
930
+ source instanceof IngestDatasetSource ||
931
+ source instanceof ServiceSource ||
932
+ source instanceof FunctionSource) {
711
933
  // a Refresh reads the deployed artifact or definition again
712
934
  yield flowResult(this.reresolveSources([source], true));
713
935
  }
@@ -727,20 +949,80 @@ export class CubeEditorState {
727
949
  return;
728
950
  }
729
951
  this.history = this.history.slice(0, -1);
952
+ this.redoStack = [
953
+ ...this.redoStack,
954
+ {
955
+ document: this.document,
956
+ readOnly: this.readOnly,
957
+ opensAnotherCube: this.importedOver.has(previous),
958
+ },
959
+ ];
730
960
  this.readOnly = this.readOnlyDocuments.has(previous);
731
961
  if (this.importedOver.has(previous)) {
732
962
  // the cube before an import is another cube, as the import was
733
963
  this.sourcePicker.close();
734
964
  this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
735
965
  }
736
- const { query } = this.document;
737
- this.replaceDocument(previous.withQuery(previous.query === query ? query : previous.query.clone()));
966
+ const { query, meta } = this.document;
967
+ const restored = previous.withQuery(previous.query === query ? query : previous.query.clone());
968
+ // widths take no undo step, so the same cube keeps the ones set since
969
+ // (review of M7); the cube before an import keeps its own
970
+ this.replaceDocument(this.importedOver.has(previous)
971
+ ? restored
972
+ : restored.withMeta({
973
+ ...restored.meta,
974
+ presentation: {
975
+ ...restored.meta.presentation,
976
+ columnWidths: meta.presentation.columnWidths,
977
+ },
978
+ }));
738
979
  }
739
- pushHistory() {
980
+ /**
981
+ * Brings back the last change undone, as Ctrl+Shift+Z does: the cube shown
982
+ * goes back to the undo history, and a change that opened another cube
983
+ * (an import, New) closes the editor and the source dialog again
984
+ */
985
+ redo() {
986
+ const next = this.redoStack.at(-1);
987
+ if (!next) {
988
+ return;
989
+ }
990
+ this.redoStack = this.redoStack.slice(0, -1);
991
+ this.pushHistory(true);
992
+ if (next.opensAnotherCube) {
993
+ this.importedOver.add(this.history.at(-1));
994
+ this.sourcePicker.close();
995
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
996
+ }
997
+ this.readOnly = next.readOnly;
998
+ const { query, meta } = this.document;
999
+ const restored = next.document.withQuery(next.document.query === query ? query : next.document.query.clone());
1000
+ // widths take no undo step: the same cube keeps the ones set since
1001
+ this.replaceDocument(next.opensAnotherCube
1002
+ ? restored
1003
+ : restored.withMeta({
1004
+ ...restored.meta,
1005
+ presentation: {
1006
+ ...restored.meta.presentation,
1007
+ columnWidths: meta.presentation.columnWidths,
1008
+ },
1009
+ }));
1010
+ }
1011
+ /** Redo, as its button and Ctrl+Shift+Z do: finishes the node editor first */
1012
+ redoEdited() {
1013
+ if (this.nodeEditor.finishApplied() && this.canRedo) {
1014
+ this.redo();
1015
+ }
1016
+ }
1017
+ /** Keeps the cube shown for undo; a new change, not a redo, drops what was undone */
1018
+ pushHistory(keepRedo = false) {
740
1019
  if (this.readOnly) {
741
1020
  this.readOnlyDocuments.add(this.document);
742
1021
  }
743
1022
  this.history = [...this.history, this.document].slice(-MAX_UNDO_STEPS);
1023
+ if (!keepRedo) {
1024
+ this.redoStack = [];
1025
+ }
744
1026
  }
745
1027
  /**
746
1028
  * Engine errors belong to the query and the context they came from, so
@@ -775,15 +1057,32 @@ export class CubeEditorState {
775
1057
  }
776
1058
  }
777
1059
  /**
778
- * The kinds of source the host serves: data products and ingest data sets
779
- * only with their catalogs. The cube's kind may still disable one
780
- * (`canAddNode`)
1060
+ * The kinds of source the host serves: data products, ingest data sets and
1061
+ * services only with their catalogs, tables and functions only with a tab
1062
+ * that reads them (Studio offers ingest data sets alone). The cube's kind
1063
+ * may still disable one (`canAddNode`)
781
1064
  */
782
1065
  get offeredSources() {
783
- return this.registry.sources.filter((definition) => (definition.type !== DataProductAccessPointSource.TYPE ||
784
- this.sourcePicker.dataProductTab.isAvailable) &&
785
- (definition.type !== IngestDatasetSource.TYPE ||
786
- this.sourcePicker.ingestTab.isAvailable));
1066
+ const { modelTab, projectTab, projectFunctionTab, directTab, dataProductTab, ingestTab, serviceTab, } = this.sourcePicker;
1067
+ const isServed = (type) => {
1068
+ switch (type) {
1069
+ case DataProductAccessPointSource.TYPE:
1070
+ return dataProductTab.isAvailable;
1071
+ case IngestDatasetSource.TYPE:
1072
+ return ingestTab.isAvailable;
1073
+ case ServiceSource.TYPE:
1074
+ return serviceTab.isAvailable;
1075
+ case FunctionSource.TYPE:
1076
+ return modelTab.isAvailable || projectFunctionTab.isAvailable;
1077
+ case RelationalTableSource.TYPE:
1078
+ return (modelTab.isAvailable ||
1079
+ projectTab.isAvailable ||
1080
+ directTab.isAvailable);
1081
+ default:
1082
+ return true;
1083
+ }
1084
+ };
1085
+ return this.registry.sources.filter((definition) => isServed(definition.type));
787
1086
  }
788
1087
  /**
789
1088
  * Whether a node of the type can be added: a transform, unconnected or
@@ -816,14 +1115,16 @@ export class CubeEditorState {
816
1115
  addNode(type, afterId) {
817
1116
  const definition = this.registry.get(type);
818
1117
  if (!definition || !this.canAddNode(type, afterId)) {
819
- return;
1118
+ return undefined;
820
1119
  }
821
1120
  if (definition.kind === 'source') {
822
- this.sourcePicker.open(this.sourcePicker.tabForSourceType(type)?.key);
823
- return;
1121
+ this.sourcePicker.openForSourceType(type);
1122
+ return undefined;
824
1123
  }
825
1124
  const { query } = this.document;
826
- this.applyQuery(query.add(definition.create(query.generateId(type)), afterId));
1125
+ const id = query.generateId(type);
1126
+ this.applyQuery(query.add(definition.create(id), afterId));
1127
+ return id;
827
1128
  }
828
1129
  /**
829
1130
  * Adds a node made elsewhere, with its settings, as the grid's quick
@@ -875,6 +1176,69 @@ export class CubeEditorState {
875
1176
  ? this.document.withContext(undefined).withQuery(query)
876
1177
  : this.document.withQuery(query));
877
1178
  }
1179
+ /** Whether a step can be copied: a known type's, so its copy reads back */
1180
+ canCopyNode(nodeId) {
1181
+ const node = this.document.query.getNode(nodeId);
1182
+ return node !== undefined && this.registry.get(node.type) !== undefined;
1183
+ }
1184
+ /** Copies a step, as Cmd/Ctrl+C on it does, for Paste */
1185
+ copyNode(nodeId) {
1186
+ const node = this.document.query.getNode(nodeId);
1187
+ if (node && this.canCopyNode(nodeId)) {
1188
+ this.copiedNode = { node, context: this.document.context };
1189
+ }
1190
+ }
1191
+ /**
1192
+ * Whether the step copied can be pasted here: a transform always; a source
1193
+ * only into a cube of the same model and runtime, or an empty cube, which
1194
+ * takes them, as a first table does
1195
+ */
1196
+ get canPaste() {
1197
+ const copied = this.copiedNode;
1198
+ return (copied !== undefined &&
1199
+ !this.readOnly &&
1200
+ this.canTakeCopy(copied.node, copied.context));
1201
+ }
1202
+ /** Pastes the step copied: after the step given when it takes an input, else on its own; one undo step */
1203
+ pasteNode(afterId) {
1204
+ const copied = this.copiedNode;
1205
+ if (copied && this.canPaste) {
1206
+ this.addCopy(copied.node, copied.context, afterId);
1207
+ }
1208
+ }
1209
+ canDuplicateNode(nodeId) {
1210
+ return !this.readOnly && this.canCopyNode(nodeId);
1211
+ }
1212
+ /** A copy of the step after it, as Cmd/Ctrl+D does, leaving the step copied for Paste as it was */
1213
+ duplicateNode(nodeId) {
1214
+ const node = this.document.query.getNode(nodeId);
1215
+ if (node && this.canDuplicateNode(nodeId)) {
1216
+ this.addCopy(node, this.document.context, nodeId);
1217
+ }
1218
+ }
1219
+ canTakeCopy(node, context) {
1220
+ if (!(node instanceof SourceNode)) {
1221
+ return true;
1222
+ }
1223
+ const { document } = this;
1224
+ return (document.query.isEmpty ||
1225
+ JSON.stringify(document.context) === JSON.stringify(context));
1226
+ }
1227
+ addCopy(node, context, afterId) {
1228
+ const { document } = this;
1229
+ const copy = copyQueryNode(node, document.query.generateId(node.type), this.registry);
1230
+ if (!copy) {
1231
+ return;
1232
+ }
1233
+ const after = afterId !== undefined && document.query.canAdd(copy, afterId)
1234
+ ? afterId
1235
+ : undefined;
1236
+ const query = document.query.add(copy, after);
1237
+ // a source pasted into an empty cube brings its model and runtime
1238
+ this.applyDocument(copy instanceof SourceNode && document.query.isEmpty && context
1239
+ ? document.withContext(context).withQuery(query)
1240
+ : document.withQuery(query));
1241
+ }
878
1242
  canSwapInputs(nodeId) {
879
1243
  return !this.readOnly && this.document.query.canSwapInputs(nodeId);
880
1244
  }
@@ -897,6 +1261,26 @@ export class CubeEditorState {
897
1261
  }));
898
1262
  }
899
1263
  }
1264
+ /**
1265
+ * Keeps a grid column's width, which the cube saves (PLAN §11.10): by the
1266
+ * column's name, in any case. Presentation the user sets by dragging, so
1267
+ * no undo step, and the rows stay current.
1268
+ */
1269
+ setColumnWidth(column, width) {
1270
+ if (!Number.isFinite(width) || width <= 0) {
1271
+ return;
1272
+ }
1273
+ const { meta } = this.document;
1274
+ const { presentation } = meta;
1275
+ const others = presentation.columnWidths.filter((each) => foldColumnName(each.column) !== foldColumnName(column));
1276
+ this.replaceDocument(this.document.withMeta({
1277
+ ...meta,
1278
+ presentation: {
1279
+ ...presentation,
1280
+ columnWidths: [...others, { column, width: Math.round(width) }],
1281
+ },
1282
+ }));
1283
+ }
900
1284
  setHostIssue(nodeId, error) {
901
1285
  this.hostIssues = new Map([
902
1286
  ...this.hostIssues,
@@ -924,7 +1308,8 @@ export class CubeEditorState {
924
1308
  }
925
1309
  /** Stops any run; call when the page closes */
926
1310
  dispose() {
927
- this.retyping();
1311
+ this.rechecking();
1312
+ this.outlineLoading();
928
1313
  this.execution.stop();
929
1314
  this.nodeEditor.dispose();
930
1315
  }