@finos/legend-cube-builder 0.0.4 → 0.0.6

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 (719) hide show
  1. package/README.md +9 -3
  2. package/docs/adding-an-operation.md +24 -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 +83 -5
  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 +16 -2
  24. package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
  25. package/lib/__lib__/LegendCubeLabels.d.ts +130 -9
  26. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
  27. package/lib/__lib__/LegendCubeLabels.js +169 -17
  28. package/lib/__lib__/LegendCubeLabels.js.map +1 -1
  29. package/lib/__lib__/LegendCubeNavigation.d.ts +23 -0
  30. package/lib/__lib__/LegendCubeNavigation.d.ts.map +1 -0
  31. package/lib/__lib__/LegendCubeNavigation.js +33 -0
  32. package/lib/__lib__/LegendCubeNavigation.js.map +1 -0
  33. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts +26 -0
  34. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts.map +1 -0
  35. package/lib/__lib__/LegendCubeProjectSourceLabels.js +26 -0
  36. package/lib/__lib__/LegendCubeProjectSourceLabels.js.map +1 -0
  37. package/lib/__lib__/LegendCubeServiceLabels.d.ts +27 -0
  38. package/lib/__lib__/LegendCubeServiceLabels.d.ts.map +1 -0
  39. package/lib/__lib__/LegendCubeServiceLabels.js +32 -0
  40. package/lib/__lib__/LegendCubeServiceLabels.js.map +1 -0
  41. package/lib/__lib__/LegendCubeTesting.d.ts +10 -1
  42. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
  43. package/lib/__lib__/LegendCubeTesting.js +9 -0
  44. package/lib/__lib__/LegendCubeTesting.js.map +1 -1
  45. package/lib/__lib__/LegendCubeTour.d.ts +62 -0
  46. package/lib/__lib__/LegendCubeTour.d.ts.map +1 -0
  47. package/lib/__lib__/LegendCubeTour.js +149 -0
  48. package/lib/__lib__/LegendCubeTour.js.map +1 -0
  49. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +1 -1
  50. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
  51. package/lib/__test-utils__/CubeEngineTestSupport.js +2 -2
  52. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
  53. package/lib/__test-utils__/CubeExampleTestUtils.d.ts +34 -0
  54. package/lib/__test-utils__/CubeExampleTestUtils.d.ts.map +1 -0
  55. package/lib/__test-utils__/CubeExampleTestUtils.js +72 -0
  56. package/lib/__test-utils__/CubeExampleTestUtils.js.map +1 -0
  57. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +8 -1
  58. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -1
  59. package/lib/__test-utils__/CubeExpressionTestUtils.js +20 -3
  60. package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -1
  61. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts +26 -0
  62. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts.map +1 -0
  63. package/lib/__test-utils__/CubeFunctionTestOutline.js +56 -0
  64. package/lib/__test-utils__/CubeFunctionTestOutline.js.map +1 -0
  65. package/lib/__test-utils__/CubeLambdaCorpus.d.ts +36 -0
  66. package/lib/__test-utils__/CubeLambdaCorpus.d.ts.map +1 -0
  67. package/lib/__test-utils__/CubeLambdaCorpus.js +83 -0
  68. package/lib/__test-utils__/CubeLambdaCorpus.js.map +1 -0
  69. package/lib/__test-utils__/CubePageTestUtils.d.ts +6 -0
  70. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
  71. package/lib/__test-utils__/CubePageTestUtils.js +21 -0
  72. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
  73. package/lib/__test-utils__/CubeTestApplication.d.ts +9 -0
  74. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
  75. package/lib/__test-utils__/CubeTestApplication.js +16 -0
  76. package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
  77. package/lib/__test-utils__/CubeVariantTestUtils.d.ts +16 -0
  78. package/lib/__test-utils__/CubeVariantTestUtils.d.ts.map +1 -0
  79. package/lib/__test-utils__/CubeVariantTestUtils.js +66 -0
  80. package/lib/__test-utils__/CubeVariantTestUtils.js.map +1 -0
  81. package/lib/__test-utils__/FakeCubeEngine.d.ts +5 -0
  82. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
  83. package/lib/__test-utils__/FakeCubeEngine.js +17 -0
  84. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
  85. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +7 -1
  86. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -1
  87. package/lib/__test-utils__/FakeCubeIngestCatalog.js +16 -0
  88. package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -1
  89. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts +26 -0
  90. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts.map +1 -0
  91. package/lib/__test-utils__/FakeCubeServiceCatalog.js +40 -0
  92. package/lib/__test-utils__/FakeCubeServiceCatalog.js.map +1 -0
  93. package/lib/components/CubeAddItems.d.ts.map +1 -1
  94. package/lib/components/CubeAddItems.js +11 -7
  95. package/lib/components/CubeAddItems.js.map +1 -1
  96. package/lib/components/CubeDialogTheme.d.ts +25 -0
  97. package/lib/components/CubeDialogTheme.d.ts.map +1 -0
  98. package/lib/components/CubeDialogTheme.js +25 -0
  99. package/lib/components/CubeDialogTheme.js.map +1 -0
  100. package/lib/components/CubeEditor.d.ts +12 -1
  101. package/lib/components/CubeEditor.d.ts.map +1 -1
  102. package/lib/components/CubeEditor.js +22 -14
  103. package/lib/components/CubeEditor.js.map +1 -1
  104. package/lib/components/CubeFileMenu.d.ts +28 -0
  105. package/lib/components/CubeFileMenu.d.ts.map +1 -0
  106. package/lib/components/CubeFileMenu.js +78 -0
  107. package/lib/components/CubeFileMenu.js.map +1 -0
  108. package/lib/components/CubeLambdaImportBanner.d.ts +26 -0
  109. package/lib/components/CubeLambdaImportBanner.d.ts.map +1 -0
  110. package/lib/components/CubeLambdaImportBanner.js +47 -0
  111. package/lib/components/CubeLambdaImportBanner.js.map +1 -0
  112. package/lib/components/CubeNodeIcon.d.ts.map +1 -1
  113. package/lib/components/CubeNodeIcon.js +6 -1
  114. package/lib/components/CubeNodeIcon.js.map +1 -1
  115. package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -1
  116. package/lib/components/CubeSchemaColumnsTable.js +2 -2
  117. package/lib/components/CubeSchemaColumnsTable.js.map +1 -1
  118. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
  119. package/lib/components/canvas/CubeCanvas.js +40 -6
  120. package/lib/components/canvas/CubeCanvas.js.map +1 -1
  121. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
  122. package/lib/components/canvas/CubeCanvasContextMenu.js +2 -1
  123. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
  124. package/lib/components/canvas/CubeCanvasElements.d.ts +18 -1
  125. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
  126. package/lib/components/canvas/CubeCanvasElements.js +58 -3
  127. package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
  128. package/lib/components/canvas/CubeCanvasLayout.js +1 -1
  129. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
  130. package/lib/components/canvas/CubeCanvasNode.js +11 -4
  131. package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
  132. package/lib/components/dev-settings/CubeDevSettings.d.ts +35 -0
  133. package/lib/components/dev-settings/CubeDevSettings.d.ts.map +1 -0
  134. package/lib/components/dev-settings/CubeDevSettings.js +54 -0
  135. package/lib/components/dev-settings/CubeDevSettings.js.map +1 -0
  136. package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -1
  137. package/lib/components/editors/CubeColumnChecklist.js +2 -2
  138. package/lib/components/editors/CubeColumnChecklist.js.map +1 -1
  139. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
  140. package/lib/components/editors/CubeColumnPicker.js +6 -4
  141. package/lib/components/editors/CubeColumnPicker.js.map +1 -1
  142. package/lib/components/editors/CubeConcatEditor.js +2 -2
  143. package/lib/components/editors/CubeConcatEditor.js.map +1 -1
  144. package/lib/components/editors/CubeExplodeEditor.d.ts +26 -0
  145. package/lib/components/editors/CubeExplodeEditor.d.ts.map +1 -0
  146. package/lib/components/editors/CubeExplodeEditor.js +61 -0
  147. package/lib/components/editors/CubeExplodeEditor.js.map +1 -0
  148. package/lib/components/editors/CubeExpressionFilterEditor.d.ts +25 -0
  149. package/lib/components/editors/CubeExpressionFilterEditor.d.ts.map +1 -0
  150. package/lib/components/editors/CubeExpressionFilterEditor.js +86 -0
  151. package/lib/components/editors/CubeExpressionFilterEditor.js.map +1 -0
  152. package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -1
  153. package/lib/components/editors/CubeExtendEditor.js +13 -12
  154. package/lib/components/editors/CubeExtendEditor.js.map +1 -1
  155. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
  156. package/lib/components/editors/CubeFilterEditor.js +13 -2
  157. package/lib/components/editors/CubeFilterEditor.js.map +1 -1
  158. package/lib/components/editors/CubeFunctionSourceEditor.d.ts +25 -0
  159. package/lib/components/editors/CubeFunctionSourceEditor.d.ts.map +1 -0
  160. package/lib/components/editors/CubeFunctionSourceEditor.js +55 -0
  161. package/lib/components/editors/CubeFunctionSourceEditor.js.map +1 -0
  162. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
  163. package/lib/components/editors/CubeJoinEditor.js +16 -4
  164. package/lib/components/editors/CubeJoinEditor.js.map +1 -1
  165. package/lib/components/editors/CubeJsonFieldsTree.d.ts +46 -0
  166. package/lib/components/editors/CubeJsonFieldsTree.d.ts.map +1 -0
  167. package/lib/components/editors/CubeJsonFieldsTree.js +93 -0
  168. package/lib/components/editors/CubeJsonFieldsTree.js.map +1 -0
  169. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
  170. package/lib/components/editors/CubeNodeEditorPanel.js +18 -8
  171. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
  172. package/lib/components/editors/CubeNodeEditorPopper.d.ts +5 -1
  173. package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -1
  174. package/lib/components/editors/CubeNodeEditorPopper.js +10 -2
  175. package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -1
  176. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
  177. package/lib/components/editors/CubeNodeEditorRegistry.js +11 -1
  178. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
  179. package/lib/components/editors/CubePivotEditor.d.ts +26 -0
  180. package/lib/components/editors/CubePivotEditor.d.ts.map +1 -0
  181. package/lib/components/editors/CubePivotEditor.js +93 -0
  182. package/lib/components/editors/CubePivotEditor.js.map +1 -0
  183. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -1
  184. package/lib/components/editors/CubeRestrictEditor.js +2 -2
  185. package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
  186. package/lib/components/editors/CubeServiceSourceEditor.d.ts +25 -0
  187. package/lib/components/editors/CubeServiceSourceEditor.d.ts.map +1 -0
  188. package/lib/components/editors/CubeServiceSourceEditor.js +41 -0
  189. package/lib/components/editors/CubeServiceSourceEditor.js.map +1 -0
  190. package/lib/components/grid/CubeColumnFormatDialog.d.ts +28 -0
  191. package/lib/components/grid/CubeColumnFormatDialog.d.ts.map +1 -0
  192. package/lib/components/grid/CubeColumnFormatDialog.js +94 -0
  193. package/lib/components/grid/CubeColumnFormatDialog.js.map +1 -0
  194. package/lib/components/grid/CubeDrilldownBar.d.ts +37 -0
  195. package/lib/components/grid/CubeDrilldownBar.d.ts.map +1 -0
  196. package/lib/components/grid/CubeDrilldownBar.js +77 -0
  197. package/lib/components/grid/CubeDrilldownBar.js.map +1 -0
  198. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
  199. package/lib/components/grid/CubeGridRegion.js +43 -28
  200. package/lib/components/grid/CubeGridRegion.js.map +1 -1
  201. package/lib/components/grid/CubeGridValues.d.ts +36 -4
  202. package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
  203. package/lib/components/grid/CubeGridValues.js +116 -4
  204. package/lib/components/grid/CubeGridValues.js.map +1 -1
  205. package/lib/components/grid/CubeJsonExplorerDialog.d.ts +27 -0
  206. package/lib/components/grid/CubeJsonExplorerDialog.d.ts.map +1 -0
  207. package/lib/components/grid/CubeJsonExplorerDialog.js +102 -0
  208. package/lib/components/grid/CubeJsonExplorerDialog.js.map +1 -0
  209. package/lib/components/grid/CubeJsonViewerDialog.d.ts +27 -0
  210. package/lib/components/grid/CubeJsonViewerDialog.d.ts.map +1 -0
  211. package/lib/components/grid/CubeJsonViewerDialog.js +68 -0
  212. package/lib/components/grid/CubeJsonViewerDialog.js.map +1 -0
  213. package/lib/components/grid/CubeResultGrid.d.ts +81 -6
  214. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
  215. package/lib/components/grid/CubeResultGrid.js +400 -35
  216. package/lib/components/grid/CubeResultGrid.js.map +1 -1
  217. package/lib/components/grid/CubeRunStatsPanel.d.ts +28 -0
  218. package/lib/components/grid/CubeRunStatsPanel.d.ts.map +1 -0
  219. package/lib/components/grid/CubeRunStatsPanel.js +61 -0
  220. package/lib/components/grid/CubeRunStatsPanel.js.map +1 -0
  221. package/lib/components/grid/CubeServerSideGrid.d.ts +36 -0
  222. package/lib/components/grid/CubeServerSideGrid.d.ts.map +1 -0
  223. package/lib/components/grid/CubeServerSideGrid.js +116 -0
  224. package/lib/components/grid/CubeServerSideGrid.js.map +1 -0
  225. package/lib/components/grid/CubeSqlDialog.d.ts +24 -0
  226. package/lib/components/grid/CubeSqlDialog.d.ts.map +1 -0
  227. package/lib/components/grid/CubeSqlDialog.js +39 -0
  228. package/lib/components/grid/CubeSqlDialog.js.map +1 -0
  229. package/lib/components/grid/CubeSqlFormat.d.ts +20 -0
  230. package/lib/components/grid/CubeSqlFormat.d.ts.map +1 -0
  231. package/lib/components/grid/CubeSqlFormat.js +32 -0
  232. package/lib/components/grid/CubeSqlFormat.js.map +1 -0
  233. package/lib/components/palette/CubePalette.d.ts.map +1 -1
  234. package/lib/components/palette/CubePalette.js +36 -14
  235. package/lib/components/palette/CubePalette.js.map +1 -1
  236. package/lib/components/show-pure/CubeShowPureDialog.d.ts +4 -1
  237. package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -1
  238. package/lib/components/show-pure/CubeShowPureDialog.js +8 -4
  239. package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -1
  240. package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -1
  241. package/lib/components/source-picker/CubeDataProductTab.js +37 -16
  242. package/lib/components/source-picker/CubeDataProductTab.js.map +1 -1
  243. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -1
  244. package/lib/components/source-picker/CubeDirectConnectionTab.js +6 -4
  245. package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -1
  246. package/lib/components/source-picker/CubeFunctionSteps.d.ts +36 -0
  247. package/lib/components/source-picker/CubeFunctionSteps.d.ts.map +1 -0
  248. package/lib/components/source-picker/CubeFunctionSteps.js +76 -0
  249. package/lib/components/source-picker/CubeFunctionSteps.js.map +1 -0
  250. package/lib/components/source-picker/CubeIngestTab.d.ts +2 -2
  251. package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -1
  252. package/lib/components/source-picker/CubeIngestTab.js +49 -20
  253. package/lib/components/source-picker/CubeIngestTab.js.map +1 -1
  254. package/lib/components/source-picker/CubeInlineModelTab.d.ts +3 -2
  255. package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -1
  256. package/lib/components/source-picker/CubeInlineModelTab.js +23 -13
  257. package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -1
  258. package/lib/components/source-picker/CubePickerListItem.d.ts +47 -0
  259. package/lib/components/source-picker/CubePickerListItem.d.ts.map +1 -0
  260. package/lib/components/source-picker/CubePickerListItem.js +62 -0
  261. package/lib/components/source-picker/CubePickerListItem.js.map +1 -0
  262. package/lib/components/source-picker/CubeProjectTab.d.ts +4 -3
  263. package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -1
  264. package/lib/components/source-picker/CubeProjectTab.js +7 -4
  265. package/lib/components/source-picker/CubeProjectTab.js.map +1 -1
  266. package/lib/components/source-picker/CubeServiceTab.d.ts +27 -0
  267. package/lib/components/source-picker/CubeServiceTab.d.ts.map +1 -0
  268. package/lib/components/source-picker/CubeServiceTab.js +36 -0
  269. package/lib/components/source-picker/CubeServiceTab.js.map +1 -0
  270. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
  271. package/lib/components/source-picker/CubeSourcePicker.js +16 -3
  272. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
  273. package/lib/components/source-picker/CubeTablePreview.d.ts +29 -0
  274. package/lib/components/source-picker/CubeTablePreview.d.ts.map +1 -0
  275. package/lib/components/source-picker/CubeTablePreview.js +10 -0
  276. package/lib/components/source-picker/CubeTablePreview.js.map +1 -0
  277. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts +27 -0
  278. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts.map +1 -0
  279. package/lib/components/spec-transfer/CubeImportPureDialog.js +38 -0
  280. package/lib/components/spec-transfer/CubeImportPureDialog.js.map +1 -0
  281. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -1
  282. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +9 -3
  283. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
  284. package/lib/components/tour/CubeTour.d.ts +36 -0
  285. package/lib/components/tour/CubeTour.d.ts.map +1 -0
  286. package/lib/components/tour/CubeTour.js +183 -0
  287. package/lib/components/tour/CubeTour.js.map +1 -0
  288. package/lib/graph-manager/CubeDataProductCatalog.d.ts +10 -0
  289. package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -1
  290. package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -1
  291. package/lib/graph-manager/CubeEngine.d.ts +46 -1
  292. package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
  293. package/lib/graph-manager/CubeEngine.js.map +1 -1
  294. package/lib/graph-manager/CubeEngineClientSettings.d.ts +43 -0
  295. package/lib/graph-manager/CubeEngineClientSettings.d.ts.map +1 -0
  296. package/lib/graph-manager/CubeEngineClientSettings.js +51 -0
  297. package/lib/graph-manager/CubeEngineClientSettings.js.map +1 -0
  298. package/lib/graph-manager/CubeIngest.d.ts +5 -0
  299. package/lib/graph-manager/CubeIngest.d.ts.map +1 -1
  300. package/lib/graph-manager/CubeIngest.js +10 -0
  301. package/lib/graph-manager/CubeIngest.js.map +1 -1
  302. package/lib/graph-manager/CubeIngestCatalog.d.ts +26 -0
  303. package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -1
  304. package/lib/graph-manager/CubeIngestCatalog.js +6 -0
  305. package/lib/graph-manager/CubeIngestCatalog.js.map +1 -1
  306. package/lib/graph-manager/CubeLakehouseRuntime.d.ts +29 -0
  307. package/lib/graph-manager/CubeLakehouseRuntime.d.ts.map +1 -0
  308. package/lib/graph-manager/CubeLakehouseRuntime.js +40 -0
  309. package/lib/graph-manager/CubeLakehouseRuntime.js.map +1 -0
  310. package/lib/graph-manager/CubeProjectCatalog.d.ts +3 -3
  311. package/lib/graph-manager/CubeService.d.ts +20 -0
  312. package/lib/graph-manager/CubeService.d.ts.map +1 -0
  313. package/lib/graph-manager/CubeService.js +22 -0
  314. package/lib/graph-manager/CubeService.js.map +1 -0
  315. package/lib/graph-manager/CubeServiceCatalog.d.ts +31 -0
  316. package/lib/graph-manager/CubeServiceCatalog.d.ts.map +1 -0
  317. package/lib/graph-manager/CubeServiceCatalog.js +17 -0
  318. package/lib/graph-manager/CubeServiceCatalog.js.map +1 -0
  319. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +52 -5
  320. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
  321. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +63 -5
  322. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
  323. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +9 -6
  324. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -1
  325. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +12 -8
  326. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -1
  327. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts +30 -0
  328. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts.map +1 -0
  329. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js +229 -0
  330. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js.map +1 -0
  331. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -1
  332. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +18 -9
  333. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -1
  334. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +4 -9
  335. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -1
  336. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +2 -1
  337. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -1
  338. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts +34 -0
  339. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts.map +1 -0
  340. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js +332 -0
  341. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js.map +1 -0
  342. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
  343. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +49 -10
  344. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
  345. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +1 -1
  346. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
  347. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +3 -1
  348. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
  349. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +2 -1
  350. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -1
  351. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +2 -1
  352. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -1
  353. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +18 -0
  354. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
  355. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +74 -6
  356. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
  357. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -1
  358. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +7 -4
  359. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -1
  360. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts +31 -0
  361. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts.map +1 -0
  362. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js +69 -0
  363. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js.map +1 -0
  364. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
  365. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +6 -2
  366. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
  367. package/lib/index.css +2 -2
  368. package/lib/index.css.map +1 -1
  369. package/lib/index.d.ts +13 -3
  370. package/lib/index.d.ts.map +1 -1
  371. package/lib/index.js +11 -1
  372. package/lib/index.js.map +1 -1
  373. package/lib/stores/CubeAddPlacement.d.ts +10 -3
  374. package/lib/stores/CubeAddPlacement.d.ts.map +1 -1
  375. package/lib/stores/CubeAddPlacement.js +16 -5
  376. package/lib/stores/CubeAddPlacement.js.map +1 -1
  377. package/lib/stores/CubeDevSettingsState.d.ts +47 -0
  378. package/lib/stores/CubeDevSettingsState.d.ts.map +1 -0
  379. package/lib/stores/CubeDevSettingsState.js +99 -0
  380. package/lib/stores/CubeDevSettingsState.js.map +1 -0
  381. package/lib/stores/CubeEditorState.d.ts +189 -43
  382. package/lib/stores/CubeEditorState.d.ts.map +1 -1
  383. package/lib/stores/CubeEditorState.js +532 -117
  384. package/lib/stores/CubeEditorState.js.map +1 -1
  385. package/lib/stores/CubeEngineChecks.d.ts +59 -0
  386. package/lib/stores/CubeEngineChecks.d.ts.map +1 -0
  387. package/lib/stores/CubeEngineChecks.js +100 -0
  388. package/lib/stores/CubeEngineChecks.js.map +1 -0
  389. package/lib/stores/CubeExamples.d.ts.map +1 -1
  390. package/lib/stores/CubeExamples.js +136 -2
  391. package/lib/stores/CubeExamples.js.map +1 -1
  392. package/lib/stores/CubeExamplesState.d.ts +1 -1
  393. package/lib/stores/CubeExamplesState.d.ts.map +1 -1
  394. package/lib/stores/CubeExamplesState.js +6 -3
  395. package/lib/stores/CubeExamplesState.js.map +1 -1
  396. package/lib/stores/CubeExecutionState.d.ts.map +1 -1
  397. package/lib/stores/CubeExecutionState.js +24 -33
  398. package/lib/stores/CubeExecutionState.js.map +1 -1
  399. package/lib/stores/CubeExportState.d.ts +41 -0
  400. package/lib/stores/CubeExportState.d.ts.map +1 -0
  401. package/lib/stores/CubeExportState.js +134 -0
  402. package/lib/stores/CubeExportState.js.map +1 -0
  403. package/lib/stores/CubeExpressionFilterCheck.d.ts +51 -0
  404. package/lib/stores/CubeExpressionFilterCheck.d.ts.map +1 -0
  405. package/lib/stores/CubeExpressionFilterCheck.js +134 -0
  406. package/lib/stores/CubeExpressionFilterCheck.js.map +1 -0
  407. package/lib/stores/CubeExtendTyping.d.ts +6 -14
  408. package/lib/stores/CubeExtendTyping.d.ts.map +1 -1
  409. package/lib/stores/CubeExtendTyping.js +6 -33
  410. package/lib/stores/CubeExtendTyping.js.map +1 -1
  411. package/lib/stores/CubeFunctionRecheck.d.ts +30 -0
  412. package/lib/stores/CubeFunctionRecheck.d.ts.map +1 -0
  413. package/lib/stores/CubeFunctionRecheck.js +67 -0
  414. package/lib/stores/CubeFunctionRecheck.js.map +1 -0
  415. package/lib/stores/CubeGridFetcher.d.ts +75 -0
  416. package/lib/stores/CubeGridFetcher.d.ts.map +1 -0
  417. package/lib/stores/CubeGridFetcher.js +197 -0
  418. package/lib/stores/CubeGridFetcher.js.map +1 -0
  419. package/lib/stores/CubeGridQuickActions.d.ts +25 -6
  420. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
  421. package/lib/stores/CubeGridQuickActions.js +52 -23
  422. package/lib/stores/CubeGridQuickActions.js.map +1 -1
  423. package/lib/stores/CubeGridState.d.ts +136 -0
  424. package/lib/stores/CubeGridState.d.ts.map +1 -0
  425. package/lib/stores/CubeGridState.js +317 -0
  426. package/lib/stores/CubeGridState.js.map +1 -0
  427. package/lib/stores/CubeHost.d.ts +42 -0
  428. package/lib/stores/CubeHost.d.ts.map +1 -1
  429. package/lib/stores/CubeHost.js +4 -0
  430. package/lib/stores/CubeHost.js.map +1 -1
  431. package/lib/stores/CubeLambdaImportState.d.ts +118 -0
  432. package/lib/stores/CubeLambdaImportState.d.ts.map +1 -0
  433. package/lib/stores/CubeLambdaImportState.js +302 -0
  434. package/lib/stores/CubeLambdaImportState.js.map +1 -0
  435. package/lib/stores/CubeLambdaSources.d.ts +45 -0
  436. package/lib/stores/CubeLambdaSources.d.ts.map +1 -0
  437. package/lib/stores/CubeLambdaSources.js +261 -0
  438. package/lib/stores/CubeLambdaSources.js.map +1 -0
  439. package/lib/stores/CubePureText.d.ts +20 -0
  440. package/lib/stores/CubePureText.d.ts.map +1 -0
  441. package/lib/stores/CubePureText.js +24 -0
  442. package/lib/stores/CubePureText.js.map +1 -0
  443. package/lib/stores/CubeQueryRun.d.ts +59 -0
  444. package/lib/stores/CubeQueryRun.d.ts.map +1 -0
  445. package/lib/stores/CubeQueryRun.js +101 -0
  446. package/lib/stores/CubeQueryRun.js.map +1 -0
  447. package/lib/stores/CubeRunStatsState.d.ts +61 -0
  448. package/lib/stores/CubeRunStatsState.d.ts.map +1 -0
  449. package/lib/stores/CubeRunStatsState.js +54 -0
  450. package/lib/stores/CubeRunStatsState.js.map +1 -0
  451. package/lib/stores/CubeRunningStepLambda.d.ts +25 -0
  452. package/lib/stores/CubeRunningStepLambda.d.ts.map +1 -0
  453. package/lib/stores/CubeRunningStepLambda.js +45 -0
  454. package/lib/stores/CubeRunningStepLambda.js.map +1 -0
  455. package/lib/stores/CubeServiceRecheck.d.ts +29 -0
  456. package/lib/stores/CubeServiceRecheck.d.ts.map +1 -0
  457. package/lib/stores/CubeServiceRecheck.js +33 -0
  458. package/lib/stores/CubeServiceRecheck.js.map +1 -0
  459. package/lib/stores/CubeShowPureState.d.ts +14 -1
  460. package/lib/stores/CubeShowPureState.d.ts.map +1 -1
  461. package/lib/stores/CubeShowPureState.js +41 -11
  462. package/lib/stores/CubeShowPureState.js.map +1 -1
  463. package/lib/stores/CubeSourcePickerState.d.ts +20 -4
  464. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
  465. package/lib/stores/CubeSourcePickerState.js +75 -14
  466. package/lib/stores/CubeSourcePickerState.js.map +1 -1
  467. package/lib/stores/CubeTourState.d.ts +49 -0
  468. package/lib/stores/CubeTourState.d.ts.map +1 -0
  469. package/lib/stores/CubeTourState.js +92 -0
  470. package/lib/stores/CubeTourState.js.map +1 -0
  471. package/lib/stores/LegendCubeHost.d.ts +88 -0
  472. package/lib/stores/LegendCubeHost.d.ts.map +1 -0
  473. package/lib/stores/LegendCubeHost.js +149 -0
  474. package/lib/stores/LegendCubeHost.js.map +1 -0
  475. package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
  476. package/lib/stores/LocalModelCatalog.js +3 -1
  477. package/lib/stores/LocalModelCatalog.js.map +1 -1
  478. package/lib/stores/editors/CubeExplodeDraft.d.ts +87 -0
  479. package/lib/stores/editors/CubeExplodeDraft.d.ts.map +1 -0
  480. package/lib/stores/editors/CubeExplodeDraft.js +221 -0
  481. package/lib/stores/editors/CubeExplodeDraft.js.map +1 -0
  482. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts +94 -0
  483. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts.map +1 -0
  484. package/lib/stores/editors/CubeExpressionFilterDraft.js +258 -0
  485. package/lib/stores/editors/CubeExpressionFilterDraft.js.map +1 -0
  486. package/lib/stores/editors/CubeExtendDraft.d.ts +9 -0
  487. package/lib/stores/editors/CubeExtendDraft.d.ts.map +1 -1
  488. package/lib/stores/editors/CubeExtendDraft.js +26 -0
  489. package/lib/stores/editors/CubeExtendDraft.js.map +1 -1
  490. package/lib/stores/editors/CubeFunctionDraft.d.ts +34 -0
  491. package/lib/stores/editors/CubeFunctionDraft.d.ts.map +1 -0
  492. package/lib/stores/editors/CubeFunctionDraft.js +69 -0
  493. package/lib/stores/editors/CubeFunctionDraft.js.map +1 -0
  494. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +4 -2
  495. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
  496. package/lib/stores/editors/CubeNodeDraftRegistry.js +25 -3
  497. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
  498. package/lib/stores/editors/CubePivotDraft.d.ts +93 -0
  499. package/lib/stores/editors/CubePivotDraft.d.ts.map +1 -0
  500. package/lib/stores/editors/CubePivotDraft.js +267 -0
  501. package/lib/stores/editors/CubePivotDraft.js.map +1 -0
  502. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts +27 -0
  503. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts.map +1 -0
  504. package/lib/stores/fixtures/CubeSalesDuckDbModel.js +52 -0
  505. package/lib/stores/fixtures/CubeSalesDuckDbModel.js.map +1 -0
  506. package/lib/stores/fixtures/CubeTradesModel.d.ts +4 -0
  507. package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -1
  508. package/lib/stores/fixtures/CubeTradesModel.js +31 -1
  509. package/lib/stores/fixtures/CubeTradesModel.js.map +1 -1
  510. package/lib/stores/source-picker/CubeDataProductTabState.d.ts +34 -5
  511. package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -1
  512. package/lib/stores/source-picker/CubeDataProductTabState.js +111 -26
  513. package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -1
  514. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +25 -2
  515. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -1
  516. package/lib/stores/source-picker/CubeDirectConnectionTabState.js +183 -31
  517. package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -1
  518. package/lib/stores/source-picker/CubeIngestTabState.d.ts +62 -15
  519. package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -1
  520. package/lib/stores/source-picker/CubeIngestTabState.js +212 -60
  521. package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -1
  522. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +100 -4
  523. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -1
  524. package/lib/stores/source-picker/CubeInlineModelTabState.js +415 -28
  525. package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -1
  526. package/lib/stores/source-picker/CubeProjectTabState.d.ts +18 -3
  527. package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -1
  528. package/lib/stores/source-picker/CubeProjectTabState.js +26 -1
  529. package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -1
  530. package/lib/stores/source-picker/CubeServiceTabState.d.ts +74 -0
  531. package/lib/stores/source-picker/CubeServiceTabState.d.ts.map +1 -0
  532. package/lib/stores/source-picker/CubeServiceTabState.js +216 -0
  533. package/lib/stores/source-picker/CubeServiceTabState.js.map +1 -0
  534. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +15 -3
  535. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -1
  536. package/lib/stores/source-picker/CubeSourcePickerTab.js +21 -0
  537. package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -1
  538. package/lib/stores/variant/CubeJson.d.ts +48 -0
  539. package/lib/stores/variant/CubeJson.d.ts.map +1 -0
  540. package/lib/stores/variant/CubeJson.js +207 -0
  541. package/lib/stores/variant/CubeJson.js.map +1 -0
  542. package/lib/stores/variant/CubeJsonExplorerState.d.ts +88 -0
  543. package/lib/stores/variant/CubeJsonExplorerState.d.ts.map +1 -0
  544. package/lib/stores/variant/CubeJsonExplorerState.js +297 -0
  545. package/lib/stores/variant/CubeJsonExplorerState.js.map +1 -0
  546. package/lib/stores/variant/CubeJsonFieldsState.d.ts +83 -0
  547. package/lib/stores/variant/CubeJsonFieldsState.d.ts.map +1 -0
  548. package/lib/stores/variant/CubeJsonFieldsState.js +207 -0
  549. package/lib/stores/variant/CubeJsonFieldsState.js.map +1 -0
  550. package/lib/stores/variant/CubeJsonOffers.d.ts +76 -0
  551. package/lib/stores/variant/CubeJsonOffers.d.ts.map +1 -0
  552. package/lib/stores/variant/CubeJsonOffers.js +250 -0
  553. package/lib/stores/variant/CubeJsonOffers.js.map +1 -0
  554. package/lib/stores/variant/CubeJsonParse.d.ts +28 -0
  555. package/lib/stores/variant/CubeJsonParse.d.ts.map +1 -0
  556. package/lib/stores/variant/CubeJsonParse.js +53 -0
  557. package/lib/stores/variant/CubeJsonParse.js.map +1 -0
  558. package/lib/stores/variant/CubeJsonSampling.d.ts +41 -0
  559. package/lib/stores/variant/CubeJsonSampling.d.ts.map +1 -0
  560. package/lib/stores/variant/CubeJsonSampling.js +59 -0
  561. package/lib/stores/variant/CubeJsonSampling.js.map +1 -0
  562. package/lib/stores/variant/CubeJsonShape.d.ts +87 -0
  563. package/lib/stores/variant/CubeJsonShape.d.ts.map +1 -0
  564. package/lib/stores/variant/CubeJsonShape.js +209 -0
  565. package/lib/stores/variant/CubeJsonShape.js.map +1 -0
  566. package/lib/stores/variant/CubeJsonViewerState.d.ts +33 -0
  567. package/lib/stores/variant/CubeJsonViewerState.d.ts.map +1 -0
  568. package/lib/stores/variant/CubeJsonViewerState.js +53 -0
  569. package/lib/stores/variant/CubeJsonViewerState.js.map +1 -0
  570. package/package.json +10 -9
  571. package/src/__lib__/LegendCubeCommand.ts +7 -0
  572. package/src/__lib__/LegendCubeFunctionLabels.ts +41 -0
  573. package/src/__lib__/LegendCubeHelpText.ts +27 -1
  574. package/src/__lib__/LegendCubeLabels.ts +225 -16
  575. package/src/__lib__/LegendCubeNavigation.ts +48 -0
  576. package/src/__lib__/LegendCubeProjectSourceLabels.ts +26 -0
  577. package/src/__lib__/LegendCubeServiceLabels.ts +41 -0
  578. package/src/__lib__/LegendCubeTesting.ts +9 -0
  579. package/src/__lib__/LegendCubeTour.ts +173 -0
  580. package/src/__test-utils__/CubeEngineTestSupport.ts +2 -1
  581. package/src/__test-utils__/CubeExampleTestUtils.ts +119 -0
  582. package/src/__test-utils__/CubeExpressionTestUtils.ts +29 -2
  583. package/src/__test-utils__/CubeFunctionTestOutline.ts +78 -0
  584. package/src/__test-utils__/CubeLambdaCorpus.ts +137 -0
  585. package/src/__test-utils__/CubePageTestUtils.tsx +34 -0
  586. package/src/__test-utils__/CubeTestApplication.ts +25 -0
  587. package/src/__test-utils__/CubeVariantTestUtils.ts +103 -0
  588. package/src/__test-utils__/FakeCubeEngine.ts +27 -0
  589. package/src/__test-utils__/FakeCubeIngestCatalog.ts +18 -0
  590. package/src/__test-utils__/FakeCubeServiceCatalog.ts +57 -0
  591. package/src/components/CubeAddItems.tsx +15 -6
  592. package/src/components/CubeDialogTheme.ts +25 -0
  593. package/src/components/CubeEditor.tsx +170 -129
  594. package/src/components/CubeFileMenu.tsx +129 -0
  595. package/src/components/CubeLambdaImportBanner.tsx +97 -0
  596. package/src/components/CubeNodeIcon.tsx +9 -0
  597. package/src/components/CubeSchemaColumnsTable.tsx +7 -2
  598. package/src/components/canvas/CubeCanvas.tsx +65 -10
  599. package/src/components/canvas/CubeCanvasContextMenu.tsx +33 -2
  600. package/src/components/canvas/CubeCanvasElements.ts +76 -3
  601. package/src/components/canvas/CubeCanvasLayout.ts +1 -1
  602. package/src/components/canvas/CubeCanvasNode.tsx +37 -3
  603. package/src/components/dev-settings/CubeDevSettings.tsx +169 -0
  604. package/src/components/editors/CubeColumnChecklist.tsx +8 -2
  605. package/src/components/editors/CubeColumnPicker.tsx +9 -3
  606. package/src/components/editors/CubeConcatEditor.tsx +2 -2
  607. package/src/components/editors/CubeExplodeEditor.tsx +207 -0
  608. package/src/components/editors/CubeExpressionFilterEditor.tsx +210 -0
  609. package/src/components/editors/CubeExtendEditor.tsx +34 -21
  610. package/src/components/editors/CubeFilterEditor.tsx +13 -1
  611. package/src/components/editors/CubeFunctionSourceEditor.tsx +140 -0
  612. package/src/components/editors/CubeJoinEditor.tsx +23 -4
  613. package/src/components/editors/CubeJsonFieldsTree.tsx +316 -0
  614. package/src/components/editors/CubeNodeEditorPanel.tsx +22 -10
  615. package/src/components/editors/CubeNodeEditorPopper.tsx +9 -1
  616. package/src/components/editors/CubeNodeEditorRegistry.ts +15 -0
  617. package/src/components/editors/CubePivotEditor.tsx +277 -0
  618. package/src/components/editors/CubeRestrictEditor.tsx +8 -2
  619. package/src/components/editors/CubeServiceSourceEditor.tsx +77 -0
  620. package/src/components/grid/CubeColumnFormatDialog.tsx +289 -0
  621. package/src/components/grid/CubeDrilldownBar.tsx +219 -0
  622. package/src/components/grid/CubeGridRegion.tsx +190 -56
  623. package/src/components/grid/CubeGridValues.ts +154 -4
  624. package/src/components/grid/CubeJsonExplorerDialog.tsx +304 -0
  625. package/src/components/grid/CubeJsonViewerDialog.tsx +190 -0
  626. package/src/components/grid/CubeResultGrid.tsx +586 -42
  627. package/src/components/grid/CubeRunStatsPanel.tsx +156 -0
  628. package/src/components/grid/CubeServerSideGrid.tsx +213 -0
  629. package/src/components/grid/CubeSqlDialog.tsx +90 -0
  630. package/src/components/grid/CubeSqlFormat.ts +37 -0
  631. package/src/components/palette/CubePalette.tsx +54 -12
  632. package/src/components/show-pure/CubeShowPureDialog.tsx +19 -5
  633. package/src/components/source-picker/CubeDataProductTab.tsx +169 -75
  634. package/src/components/source-picker/CubeDirectConnectionTab.tsx +42 -30
  635. package/src/components/source-picker/CubeFunctionSteps.tsx +244 -0
  636. package/src/components/source-picker/CubeIngestTab.tsx +195 -83
  637. package/src/components/source-picker/CubeInlineModelTab.tsx +110 -81
  638. package/src/components/source-picker/CubePickerListItem.tsx +118 -0
  639. package/src/components/source-picker/CubeProjectTab.tsx +6 -3
  640. package/src/components/source-picker/CubeServiceTab.tsx +151 -0
  641. package/src/components/source-picker/CubeSourcePicker.tsx +54 -18
  642. package/src/components/source-picker/CubeTablePreview.tsx +49 -0
  643. package/src/components/spec-transfer/CubeImportPureDialog.tsx +122 -0
  644. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +21 -8
  645. package/src/components/tour/CubeTour.tsx +317 -0
  646. package/src/graph-manager/CubeDataProductCatalog.ts +11 -0
  647. package/src/graph-manager/CubeEngine.ts +51 -1
  648. package/src/graph-manager/CubeEngineClientSettings.ts +64 -0
  649. package/src/graph-manager/CubeIngest.ts +15 -0
  650. package/src/graph-manager/CubeIngestCatalog.ts +33 -0
  651. package/src/graph-manager/CubeLakehouseRuntime.ts +43 -0
  652. package/src/graph-manager/CubeProjectCatalog.ts +3 -3
  653. package/src/graph-manager/CubeService.ts +29 -0
  654. package/src/graph-manager/CubeServiceCatalog.ts +35 -0
  655. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +115 -5
  656. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +13 -7
  657. package/src/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.ts +312 -0
  658. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +35 -9
  659. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +6 -15
  660. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.ts +471 -0
  661. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +70 -15
  662. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +3 -1
  663. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +7 -1
  664. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +122 -7
  665. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +9 -4
  666. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.ts +92 -0
  667. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +6 -1
  668. package/src/index.ts +39 -2
  669. package/src/stores/CubeAddPlacement.ts +25 -5
  670. package/src/stores/CubeDevSettingsState.ts +117 -0
  671. package/src/stores/CubeEditorState.ts +722 -201
  672. package/src/stores/CubeEngineChecks.ts +240 -0
  673. package/src/stores/CubeExamples.ts +188 -1
  674. package/src/stores/CubeExamplesState.ts +13 -3
  675. package/src/stores/CubeExecutionState.ts +26 -57
  676. package/src/stores/CubeExportState.ts +196 -0
  677. package/src/stores/CubeExpressionFilterCheck.ts +218 -0
  678. package/src/stores/CubeExtendTyping.ts +6 -46
  679. package/src/stores/CubeFunctionRecheck.ts +97 -0
  680. package/src/stores/CubeGridFetcher.ts +302 -0
  681. package/src/stores/CubeGridQuickActions.ts +56 -23
  682. package/src/stores/CubeGridState.ts +450 -0
  683. package/src/stores/CubeHost.ts +48 -0
  684. package/src/stores/CubeLambdaImportState.ts +434 -0
  685. package/src/stores/CubeLambdaSources.ts +390 -0
  686. package/src/stores/CubePureText.ts +28 -0
  687. package/src/stores/CubeQueryRun.ts +169 -0
  688. package/src/stores/CubeRunStatsState.ts +91 -0
  689. package/src/stores/CubeRunningStepLambda.ts +62 -0
  690. package/src/stores/CubeServiceRecheck.ts +53 -0
  691. package/src/stores/CubeShowPureState.ts +51 -12
  692. package/src/stores/CubeSourcePickerState.ts +89 -13
  693. package/src/stores/CubeTourState.ts +116 -0
  694. package/src/stores/LegendCubeHost.ts +243 -0
  695. package/src/stores/LocalModelCatalog.ts +6 -1
  696. package/src/stores/editors/CubeExplodeDraft.ts +272 -0
  697. package/src/stores/editors/CubeExpressionFilterDraft.ts +389 -0
  698. package/src/stores/editors/CubeExtendDraft.ts +29 -0
  699. package/src/stores/editors/CubeFunctionDraft.ts +92 -0
  700. package/src/stores/editors/CubeNodeDraftRegistry.ts +34 -2
  701. package/src/stores/editors/CubePivotDraft.ts +355 -0
  702. package/src/stores/fixtures/CubeSalesDuckDbModel.ts +60 -0
  703. package/src/stores/fixtures/CubeTradesModel.ts +36 -1
  704. package/src/stores/source-picker/CubeDataProductTabState.ts +162 -35
  705. package/src/stores/source-picker/CubeDirectConnectionTabState.ts +246 -47
  706. package/src/stores/source-picker/CubeIngestTabState.ts +331 -106
  707. package/src/stores/source-picker/CubeInlineModelTabState.ts +514 -34
  708. package/src/stores/source-picker/CubeProjectTabState.ts +35 -3
  709. package/src/stores/source-picker/CubeServiceTabState.ts +288 -0
  710. package/src/stores/source-picker/CubeSourcePickerTab.ts +31 -2
  711. package/src/stores/variant/CubeJson.ts +229 -0
  712. package/src/stores/variant/CubeJsonExplorerState.ts +378 -0
  713. package/src/stores/variant/CubeJsonFieldsState.ts +252 -0
  714. package/src/stores/variant/CubeJsonOffers.ts +359 -0
  715. package/src/stores/variant/CubeJsonParse.ts +75 -0
  716. package/src/stores/variant/CubeJsonSampling.ts +90 -0
  717. package/src/stores/variant/CubeJsonShape.ts +279 -0
  718. package/src/stores/variant/CubeJsonViewerState.ts +59 -0
  719. package/tsconfig.json +72 -1
@@ -13,27 +13,43 @@
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 { CubeTourState } from './CubeTourState.js';
37
+ import { CubeExportState } from './CubeExportState.js';
38
+ import { CubeGridFetcher } from './CubeGridFetcher.js';
39
+ import { CubeGridState } from './CubeGridState.js';
40
+ import { CubeDevSettingsState } from './CubeDevSettingsState.js';
41
+ import { CubeRunStatsState } from './CubeRunStatsState.js';
31
42
  import { CubeExecutionState } from './CubeExecutionState.js';
43
+ import { CubeExpressionFilterDraft } from './editors/CubeExpressionFilterDraft.js';
32
44
  import { CubeExtendDraft } from './editors/CubeExtendDraft.js';
33
- import { buildCubeExtendTypingLambdas, createStaleCubeExtendTypingRule, getCubeExtendTypingUpstream, getCubeExtendUpstream, isCubeExtendTypingCurrent, isSameCubeExtendTyping, readCubeExtendTyping, } from './CubeExtendTyping.js';
45
+ import { buildCubeEngineCheckRequest, createStaleCubeEngineCheckRule, getCubeEngineCheckUpstream, isCubeEngineCheckedNode, } from './CubeEngineChecks.js';
46
+ import { getCubeExtendUpstream } from './CubeExtendTyping.js';
34
47
  import { loadCubeModelOutline } from './CubeHost.js';
35
48
  import { CubeNodeEditorState } from './CubeNodeEditorState.js';
36
49
  import { CubeShowPureState } from './CubeShowPureState.js';
50
+ import { CubeJsonViewerState } from './variant/CubeJsonViewerState.js';
51
+ import { CubeJsonExplorerState } from './variant/CubeJsonExplorerState.js';
52
+ import { CubeLambdaImportState } from './CubeLambdaImportState.js';
37
53
  import { CubeSourcePickerState } from './CubeSourcePickerState.js';
38
54
  import { CubeSpecTransferState } from './CubeSpecTransferState.js';
39
55
  const isValidRowLimit = (value) => value !== undefined && Number.isSafeInteger(value) && value >= 1;
@@ -56,19 +72,58 @@ export class CubeEditorState {
56
72
  host;
57
73
  /** One registry for inference, emission and the saved spec */
58
74
  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;
75
+ /**
76
+ * The editor's own query rule: an Extend typed, or a Filter by Expression
77
+ * checked, for another input than its own waits to be checked again (PLAN
78
+ * §11.7, §11.11)
79
+ */
80
+ staleEngineChecks;
81
+ /**
82
+ * The editor's query rule for the database a node runs on: `%` or `_`
83
+ * given to a pattern on DuckDB (PLAN §11.11), once the model's outline
84
+ * tells the database
85
+ */
86
+ databaseRefusals;
61
87
  execution;
88
+ /** The latest runs, fetches and exports (spec §12.6) */
89
+ runStats;
90
+ /** The Dev Settings, at the top left (PLAN §11.16) */
91
+ devSettings;
92
+ /** The grid's server-side levels (PLAN §11.10) */
93
+ gridFetcher;
94
+ /** The grid's mode and its server-side levels (PLAN §11.10) */
95
+ grid;
96
+ /** The results' export (spec §12.5) */
97
+ export;
62
98
  /** Where a lakehouse cube runs, a data product's or an ingest one's: its class and warehouse */
63
99
  dataProductRuntime;
64
100
  sourcePicker;
65
101
  specTransfer;
66
102
  examples;
67
103
  showPure;
104
+ /** The editor's guided tour (PLAN §11.21) */
105
+ tour;
106
+ /** Open JSON: a Variant cell's document as a tree (PLAN §11.20) */
107
+ jsonViewer = new CubeJsonViewerState();
108
+ /** Explore JSON: a Variant column's fields, and the columns they can become (PLAN §11.20) */
109
+ jsonExplorer;
110
+ /** Import Pure: the lambda the page opened on, read into the cube (PLAN §11.18) */
111
+ lambdaImport;
68
112
  nodeEditor;
69
113
  document;
70
114
  /** Earlier documents, oldest first */
71
115
  history = [];
116
+ /**
117
+ * The step copied last, as it was, with the cube's context then, which a
118
+ * pasted source needs; kept for the page, across cubes
119
+ */
120
+ copiedNode;
121
+ /**
122
+ * The changes undone, the latest last, to redo; a new change clears them.
123
+ * Each keeps whether it was read-only and whether undoing it left another
124
+ * cube (an import), so a redo restores both
125
+ */
126
+ redoStack = [];
72
127
  /** Engine errors by node id: shown with the node's own errors, never part of inference */
73
128
  hostIssues = new Map();
74
129
  /**
@@ -77,17 +132,28 @@ export class CubeEditorState {
77
132
  */
78
133
  warnings = new Map();
79
134
  /**
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
135
+ * The outline of each model the cube used, by the model's JSON
136
+ * (`modelKey`): loaded when the cube reads a table, or an editor or a run
137
+ * needs it, e.g. for the Join's 'type unknown' warning or the database a
138
+ * node runs on (PLAN §11.12); by reference, never observed deeply
83
139
  */
84
140
  modelOutlines = new Map();
141
+ /** Each model's key in `modelOutlines`, its JSON, worked out once per model object */
142
+ modelKeys = new WeakMap();
143
+ /** The outlines on their way, by model key, so a second load waits for the first */
144
+ loadingOutlines = new Map();
85
145
  /** Sources sent to the engine to be typed again, until it answers */
86
146
  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;
147
+ /** Extends and Filters by Expression sent to the engine to be checked, until it answers (PLAN §11.7, §11.11) */
148
+ checkingNodes = new Set();
149
+ /** Checks the nodes that wait for the engine, whenever one does (PLAN §11.7 Q4) */
150
+ rechecking;
151
+ /**
152
+ * Loads the model's outline once the cube reads a table, so the database it
153
+ * runs on is known before any run: some nodes are refused there, or written
154
+ * another way (PLAN §11.4, §11.11, §11.12)
155
+ */
156
+ outlineLoading;
91
157
  /** The rows a run returns; kept per user, never in the cube */
92
158
  rowLimit;
93
159
  /** The palette shows icons only; kept per user, never in the cube */
@@ -104,15 +170,18 @@ export class CubeEditorState {
104
170
  constructor(host, document = new CubeDocument()) {
105
171
  makeObservable(this, {
106
172
  pendingSources: observable.ref,
107
- typingExtends: observable.ref,
108
- extendsToType: computed,
109
- isTypingExtends: computed,
110
- retypeExtends: flow,
173
+ checkingNodes: observable.ref,
174
+ nodesToCheck: computed,
175
+ isCheckingExpressions: computed,
176
+ checkExpressions: flow,
111
177
  modelOutlines: observable.ref,
112
178
  modelOutline: computed,
113
179
  loadModelOutline: flow,
114
180
  document: observable.ref,
115
181
  history: observable.ref,
182
+ redoStack: observable.ref,
183
+ canRedo: computed,
184
+ redo: action,
116
185
  hostIssues: observable.ref,
117
186
  warnings: observable.ref,
118
187
  derivedWarnings: computed,
@@ -126,10 +195,14 @@ export class CubeEditorState {
126
195
  hasEditsToApply: computed,
127
196
  executeEdited: action,
128
197
  undoEdited: action,
198
+ redoEdited: action,
129
199
  isDialogOpen: computed,
130
200
  applyDocument: action,
131
201
  undo: action,
132
202
  importDocument: action,
203
+ openDocument: action,
204
+ startNewCube: action,
205
+ isEmptyCube: computed,
133
206
  reresolveSources: flow,
134
207
  refreshSource: flow,
135
208
  applyQuery: action,
@@ -137,18 +210,31 @@ export class CubeEditorState {
137
210
  connect: action,
138
211
  addNode: action,
139
212
  addConfiguredNode: action,
213
+ addConfiguredNodes: action,
140
214
  dropNode: action,
141
215
  removeNode: action,
216
+ copiedNode: observable.ref,
217
+ canPaste: computed,
218
+ copyNode: action,
219
+ pasteNode: action,
220
+ duplicateNode: action,
142
221
  swapInputs: action,
143
222
  setShowGraph: action,
144
223
  setPaletteCollapsed: action,
145
224
  setHostIssue: action,
146
225
  clearHostIssues: action,
147
226
  setRowLimit: action,
227
+ setColumnWidth: action,
148
228
  });
149
229
  this.host = host;
150
230
  this.registry = createNodeRegistry();
151
- this.staleExtendTyping = createStaleCubeExtendTypingRule(this.registry, () => this.document.context?.model);
231
+ this.staleEngineChecks = createStaleCubeEngineCheckRule(this.registry, () => this.document.context?.model);
232
+ this.databaseRefusals = (query) => new Map(query.nodes
233
+ .map((node) => [
234
+ node.id,
235
+ this.getNodeDatabaseProblems(query, node),
236
+ ])
237
+ .filter(([, problems]) => problems.length > 0));
152
238
  this.document = document;
153
239
  const storedLimit = host.applicationStore.userDataService.getNumericValue(LEGEND_CUBE_USER_DATA_KEY.ROW_LIMIT);
154
240
  this.rowLimit = isValidRowLimit(storedLimit)
@@ -157,27 +243,45 @@ export class CubeEditorState {
157
243
  this.isPaletteCollapsed =
158
244
  host.applicationStore.userDataService.getBooleanValue(LEGEND_CUBE_USER_DATA_KEY.PALETTE_COLLAPSED) ?? false;
159
245
  this.execution = new CubeExecutionState(this);
246
+ this.runStats = new CubeRunStatsState();
247
+ this.devSettings = new CubeDevSettingsState(host);
248
+ this.gridFetcher = new CubeGridFetcher(this);
249
+ this.grid = new CubeGridState(this);
250
+ this.export = new CubeExportState(this);
160
251
  this.dataProductRuntime = new CubeDataProductRuntimeState(this);
161
252
  this.sourcePicker = new CubeSourcePickerState(this);
162
253
  this.specTransfer = new CubeSpecTransferState(this);
163
254
  this.examples = new CubeExamplesState(this);
164
255
  this.showPure = new CubeShowPureState(this);
256
+ this.tour = new CubeTourState(this);
257
+ this.jsonExplorer = new CubeJsonExplorerState(this);
258
+ this.lambdaImport = new CubeLambdaImportState(this);
165
259
  this.nodeEditor = new CubeNodeEditorState(this);
166
- this.retyping = reaction(() => this.extendsToType, (waiting) => {
260
+ this.rechecking = reaction(() => this.nodesToCheck, (waiting) => {
167
261
  if (waiting.length) {
168
- flowResult(this.retypeExtends(waiting)).catch(this.host.applicationStore.alertUnhandledError);
262
+ flowResult(this.checkExpressions(waiting)).catch(this.host.applicationStore.alertUnhandledError);
263
+ }
264
+ }, { fireImmediately: true });
265
+ // the model, while the cube reads a table: another model loads too
266
+ this.outlineLoading = reaction(() => this.document.query.nodes.some((node) => node instanceof RelationalTableSource)
267
+ ? this.document.context?.model
268
+ : undefined, (model) => {
269
+ if (model !== undefined) {
270
+ flowResult(this.loadModelOutline(model)).catch(this.host.applicationStore.alertUnhandledError);
169
271
  }
170
272
  }, { fireImmediately: true });
171
273
  }
172
274
  /**
173
275
  * 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
276
+ * emitter sees them; an Extend or a Filter by Expression checked for
277
+ * another input than its own waiting, and a filter its database would
278
+ * misread refused, which only the editor can tell
176
279
  */
177
280
  get analysis() {
178
281
  return buildSchemasAndValidity(this.document.query, [
179
282
  ...this.registry.queryRules,
180
- this.staleExtendTyping,
283
+ this.staleEngineChecks,
284
+ this.databaseRefusals,
181
285
  ]);
182
286
  }
183
287
  get emitter() {
@@ -192,37 +296,38 @@ export class CubeEditorState {
192
296
  return this.pendingSources.has(node);
193
297
  }
194
298
  /**
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
299
+ * The Extends and Filters by Expression of the cube shown that wait for
300
+ * the engine, their input valid, and that aren't being checked (PLAN §11.7,
301
+ * §11.11): new expressions, or an input that changed
198
302
  */
199
- get extendsToType() {
303
+ get nodesToCheck() {
200
304
  const { validity } = this.analysis;
201
- return this.document.query.nodes.filter((node) => node instanceof Extend &&
202
- !this.typingExtends.has(node) &&
305
+ return this.document.query.nodes.filter((node) => isCubeEngineCheckedNode(node) &&
306
+ !this.checkingNodes.has(node) &&
203
307
  (validity.get(node.id) ?? []).some(isTypingError));
204
308
  }
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));
309
+ /** The cube shown has expressions the engine is checking: an Extend's columns, a filter's condition */
310
+ get isCheckingExpressions() {
311
+ return this.document.query.nodes.some((node) => this.checkingNodes.has(node));
208
312
  }
209
- /** The node waits for the engine to type it, or is being typed: an Extend (PLAN §11.7) */
313
+ /** 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
314
  isTypingNode(node) {
211
- return (this.typingExtends.has(node) ||
315
+ return (this.checkingNodes.has(node) ||
212
316
  (this.analysis.validity.get(node.id) ?? []).some(isTypingError));
213
317
  }
214
318
  /**
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.
319
+ * Checks expressions with the engine, in one call, outside the undo history
320
+ * (PLAN §11.7 Q4, §11.11): an Extend's columns typed, a Filter by
321
+ * Expression's condition checked, each for the input it has now, after its
322
+ * input's relation, as typing types any node. The check goes in place of
323
+ * the very nodes sent, in the cube shown and the undo snapshots that give
324
+ * the engine the same input; one the user changed meanwhile is left to
325
+ * check again. Each check records the input as the engine was given it
326
+ * (`upstream`). A check the engine couldn't give says why; when the engine
327
+ * can't be reached, a check still current for the input is kept, with a
328
+ * warning, as a source's saved columns are.
224
329
  */
225
- *retypeExtends(nodes) {
330
+ *checkExpressions(nodes) {
226
331
  const { context, query } = this.document;
227
332
  if (!context) {
228
333
  return;
@@ -233,30 +338,18 @@ export class CubeEditorState {
233
338
  const [inputId] = query.getInputIds(node.id);
234
339
  const input = inputId === undefined ? undefined : schemas.get(inputId);
235
340
  if (query.getNode(node.id) !== node ||
236
- this.typingExtends.has(node) ||
237
- !input ||
238
- node.columns.some(({ lambda }) => lambda === undefined)) {
341
+ this.checkingNodes.has(node) ||
342
+ !input) {
239
343
  return [];
240
344
  }
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
- ];
345
+ const request = buildCubeEngineCheckRequest(query, node, input, getCubeExtendUpstream(emitter, node.id, context.model), this.registry);
346
+ return request ? [request] : [];
254
347
  });
255
348
  if (!requests.length) {
256
349
  return;
257
350
  }
258
351
  const sent = requests.map(({ node }) => node);
259
- this.typingExtends = new Set([...this.typingExtends, ...sent]);
352
+ this.checkingNodes = new Set([...this.checkingNodes, ...sent]);
260
353
  let answers;
261
354
  try {
262
355
  answers = (yield this.host.engine.typeLambdas(context.model, new Map(requests.flatMap(({ lambdas }) => [...lambdas]))));
@@ -268,27 +361,25 @@ export class CubeEditorState {
268
361
  answers = new Map(requests.flatMap(({ lambdas }) => [...lambdas.keys()].map((key) => [key, failure])));
269
362
  }
270
363
  finally {
271
- this.typingExtends = new Set([...this.typingExtends].filter((node) => !sent.includes(node)));
364
+ this.checkingNodes = new Set([...this.checkingNodes].filter((node) => !sent.includes(node)));
272
365
  }
273
- // a typing that comes back the same leaves its node, and the query, alone
366
+ // a check that comes back the same leaves its node, and the query, alone
274
367
  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)]);
368
+ const replacements = new Map(requests.flatMap((request) => {
369
+ const { node } = request;
370
+ const outcome = request.read(answers);
371
+ if (outcome.keptWarning !== undefined) {
372
+ warnings.set(node.key, [outcome.keptWarning]);
280
373
  return [];
281
374
  }
282
375
  warnings.delete(node.key);
283
- return isSameCubeExtendTyping(typing, node.typing)
284
- ? []
285
- : [[node, node.withTyping(typing)]];
376
+ return outcome.node ? [[node, outcome.node]] : [];
286
377
  }));
287
378
  this.warnings = warnings;
288
- // an undo snapshot whose input differs keeps the typing it had
379
+ // an undo snapshot whose input differs keeps the check it had
289
380
  const emitters = new Map([[query, emitter]]);
290
381
  this.replaceOutsideHistory(replacements, (snapshot, resolved) => {
291
- const upstream = getCubeExtendTypingUpstream(resolved.typing);
382
+ const upstream = getCubeEngineCheckUpstream(resolved);
292
383
  if (upstream === undefined) {
293
384
  return true;
294
385
  }
@@ -355,18 +446,34 @@ export class CubeEditorState {
355
446
  const model = this.document.context?.model;
356
447
  return model === undefined ? undefined : this.getModelOutline(model);
357
448
  }
449
+ /**
450
+ * A model's key for its outline: its JSON, so a cube imported on the same
451
+ * model, a new object with the same content, shares the outline loaded
452
+ */
453
+ modelKey(model) {
454
+ let key = this.modelKeys.get(model);
455
+ if (key === undefined) {
456
+ key = JSON.stringify(model);
457
+ this.modelKeys.set(model, key);
458
+ }
459
+ return key;
460
+ }
358
461
  /** The outline of a model, once loaded */
359
462
  getModelOutline(model) {
360
- return this.modelOutlines.get(model);
463
+ return this.modelOutlines.get(this.modelKey(model));
361
464
  }
362
465
  /**
363
466
  * 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.
467
+ * model's runtime (PLAN §11.4): for a data product or ingest cube, the
468
+ * database its lakehouse runtime routes to (§11.12); else, from the model's
469
+ * outline once it is loaded (`loadModelOutline`), the type of the runtime's
470
+ * connections to the databases the node reads. None without an outline,
471
+ * which writes every operation the native way.
368
472
  */
369
473
  getRunDatabaseType(query, nodeId, model, runtime) {
474
+ if (isCubeDataProductModel(model) || isCubeIngestModel(model)) {
475
+ return getLakehouseDatabaseType(CUBE_LAKEHOUSE_RUNTIME_KIND);
476
+ }
370
477
  const outline = this.getModelOutline(model);
371
478
  if (!outline) {
372
479
  return undefined;
@@ -377,6 +484,12 @@ export class CubeEditorState {
377
484
  if (node instanceof RelationalTableSource) {
378
485
  databases.add(node.database);
379
486
  }
487
+ else if (node instanceof FunctionSource) {
488
+ // a function reads what Cube can't see: any database of the runtime
489
+ outline.runtimes
490
+ .find(({ path }) => path === runtime)
491
+ ?.connections?.forEach(({ storePath }) => databases.add(storePath));
492
+ }
380
493
  query
381
494
  .getInputIds(id)
382
495
  .forEach((inputId) => inputId !== undefined && visit(inputId));
@@ -385,28 +498,75 @@ export class CubeEditorState {
385
498
  return getDatabaseType(outline, runtime, [...databases]);
386
499
  }
387
500
  /**
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.
501
+ * A node's problems on the database the query up to it runs on, with the
502
+ * cube's runtime (`getRunDatabaseType`): a Pivot where it can't run (PLAN
503
+ * §11.12); a filter giving `%` or `_` to a pattern on DuckDB, which would
504
+ * match them as wildcards (§11.11). None when the database isn't known.
505
+ */
506
+ getNodeDatabaseProblems(query, node) {
507
+ const { context } = this.document;
508
+ const runtime = context?.runtime;
509
+ if (!context || runtime === undefined || !dependsOnDatabaseType(node)) {
510
+ return [];
511
+ }
512
+ return getDatabaseProblems(node, this.getRunDatabaseType(query, node.id, context.model, runtime));
513
+ }
514
+ /**
515
+ * Why a node of the type can't be added after the node, on the database the
516
+ * query up to that node runs on (PLAN §11.12): a Pivot where it can't run.
517
+ * `undefined` when it can, or the database isn't known.
518
+ */
519
+ getAddDatabaseProblem(type, afterId) {
520
+ const { context, query } = this.document;
521
+ const runtime = context?.runtime;
522
+ if (!context || runtime === undefined || afterId === undefined) {
523
+ return undefined;
524
+ }
525
+ return getDatabaseProblemOfType(type, this.getRunDatabaseType(query, afterId, context.model, runtime));
526
+ }
527
+ /**
528
+ * Loads the outline of a model, the cube's by default, once per model: a
529
+ * load already on its way is waited for, not started again, e.g. a run's
530
+ * while the cube's opening load is still out. It only adds warnings,
531
+ * database types and a database's refusals (PLAN §11.11, §11.12), so a
532
+ * model that fails to load shows none and runs every operation the native
533
+ * way.
391
534
  */
392
535
  *loadModelOutline(model = this.document.context?.model) {
393
- if (model === undefined || this.modelOutlines.has(model)) {
536
+ if (model === undefined) {
537
+ return;
538
+ }
539
+ const key = this.modelKey(model);
540
+ if (this.modelOutlines.has(key)) {
394
541
  return;
395
542
  }
543
+ let loading = this.loadingOutlines.get(key);
544
+ if (!loading) {
545
+ loading = loadCubeModelOutline(this.host, model);
546
+ this.loadingOutlines.set(key, loading);
547
+ }
396
548
  try {
397
- const outline = (yield loadCubeModelOutline(this.host, model));
398
- this.modelOutlines = new Map([...this.modelOutlines, [model, outline]]);
549
+ const outline = (yield loading);
550
+ if (!this.modelOutlines.has(key)) {
551
+ this.modelOutlines = new Map([...this.modelOutlines, [key, outline]]);
552
+ }
399
553
  }
400
554
  catch {
401
555
  // no outline, no warning: nothing is blocked on it
402
556
  }
557
+ finally {
558
+ this.loadingOutlines.delete(key);
559
+ }
403
560
  }
404
- /** One of Cube's dialogs is open: the source picker, Import or Export, Show Pure */
561
+ /** One of Cube's dialogs is open: the source picker, Examples, the group rows' settings, Import or Export, Show Pure, or the tour */
405
562
  get isDialogOpen() {
406
563
  return (this.sourcePicker.isOpen ||
407
564
  this.examples.isOpen ||
565
+ this.grid.isSettingsShown ||
566
+ this.grid.formatColumn !== undefined ||
408
567
  this.specTransfer.mode !== undefined ||
409
- this.showPure.isOpen);
568
+ this.showPure.isOpen ||
569
+ this.tour.isOpen);
410
570
  }
411
571
  /**
412
572
  * The page's keyboard shortcuts, while it is open (spec §17.12). Each does
@@ -427,23 +587,33 @@ export class CubeEditorState {
427
587
  (this.execution.canExecute || this.hasEditsToApply),
428
588
  action: () => this.nodeEditor.runFromKeyboard(() => this.executeEdited(), isFocusInNodeEditor()),
429
589
  });
430
- // F10 in the Extend editor (PLAN §11.7)
590
+ // F10 in the Extend and Filter by Expression editors (PLAN §11.7, §11.11)
431
591
  commandService.registerCommand({
432
592
  key: LEGEND_CUBE_COMMAND_KEY.VALIDATE_EXPRESSIONS,
433
593
  trigger: () => {
434
594
  const { draft } = this.nodeEditor;
435
595
  return (!this.isDialogOpen &&
436
596
  !this.readOnly &&
437
- draft instanceof CubeExtendDraft &&
597
+ (draft instanceof CubeExtendDraft ||
598
+ draft instanceof CubeExpressionFilterDraft) &&
438
599
  !draft.validating);
439
600
  },
440
601
  action: () => {
441
602
  const { draft } = this.nodeEditor;
442
- if (draft instanceof CubeExtendDraft) {
603
+ if (draft instanceof CubeExtendDraft ||
604
+ draft instanceof CubeExpressionFilterDraft) {
443
605
  flowResult(draft.validate()).catch(this.host.applicationStore.alertUnhandledError);
444
606
  }
445
607
  },
446
608
  });
609
+ commandService.registerCommand({
610
+ key: LEGEND_CUBE_COMMAND_KEY.REDO,
611
+ trigger: () => !this.isDialogOpen &&
612
+ !this.nodeEditor.isHeld &&
613
+ this.canRedo &&
614
+ !isTypingText(),
615
+ action: () => this.nodeEditor.runFromKeyboard(() => this.redoEdited(), isFocusInNodeEditor()),
616
+ });
447
617
  commandService.registerCommand({
448
618
  key: LEGEND_CUBE_COMMAND_KEY.UNDO,
449
619
  trigger: () => !this.isDialogOpen &&
@@ -485,6 +655,9 @@ export class CubeEditorState {
485
655
  get canUndo() {
486
656
  return this.history.length > 0 && !this.readOnly;
487
657
  }
658
+ get canRedo() {
659
+ return this.redoStack.length > 0;
660
+ }
488
661
  /** The one way to change the cube; the document before goes to the undo history */
489
662
  applyDocument(next) {
490
663
  if (next === this.document) {
@@ -499,6 +672,36 @@ export class CubeEditorState {
499
672
  * without applying its edits, and drops the last run's rows and errors,
500
673
  * which belong to the cube before. Never runs the cube.
501
674
  */
675
+ /** Whether the cube is a new one: no name, no context, no node */
676
+ get isEmptyCube() {
677
+ const { document } = this;
678
+ return (document.name === undefined &&
679
+ document.context === undefined &&
680
+ document.query.nodes.length === 0);
681
+ }
682
+ /**
683
+ * Replaces the cube with a new, empty one, as an import does (one undo
684
+ * step, so Undo brings the cube back); a cube already new is left as it is
685
+ */
686
+ startNewCube() {
687
+ if (!this.isEmptyCube) {
688
+ this.importDocument(new CubeDocument(), false);
689
+ }
690
+ }
691
+ /**
692
+ * Opens the page on a cube read for it, as `initialDocument` opens one:
693
+ * no undo step, as there was no cube before it (Import Pure's
694
+ * `initialLambda`, PLAN §11.18). Its sources come typed; its expressions
695
+ * are checked as any are.
696
+ */
697
+ openDocument(next) {
698
+ this.execution.reset();
699
+ this.sourcePicker.close();
700
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
701
+ this.hostIssues = new Map();
702
+ this.document = next;
703
+ this.readOnly = false;
704
+ }
502
705
  importDocument(next, readOnly) {
503
706
  this.pushHistory();
504
707
  this.importedOver.add(this.document);
@@ -511,9 +714,9 @@ export class CubeEditorState {
511
714
  this.document = next;
512
715
  this.readOnly = readOnly;
513
716
  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);
717
+ // checked once on load too, as sources are checked again: the model may
718
+ // have changed the types of its functions (PLAN §11.7, §11.11)
719
+ flowResult(this.checkExpressions(next.query.nodes.filter(isCubeEngineCheckedNode))).catch(this.host.applicationStore.alertUnhandledError);
517
720
  }
518
721
  /**
519
722
  * Types the cube's sources again, outside the undo history (PLAN §10.3,
@@ -551,10 +754,22 @@ export class CubeEditorState {
551
754
  const dataSets = isCubeIngestModel(context.model)
552
755
  ? kept.filter((node) => node instanceof IngestDatasetSource)
553
756
  : [];
757
+ // a function on another kind of cube is the no-mix rule's to flag
758
+ const functions = isCubeDataProductModel(context.model) ||
759
+ isCubeIngestModel(context.model) ||
760
+ isCubeServiceModel(context.model)
761
+ ? []
762
+ : kept.filter((node) => node instanceof FunctionSource);
763
+ // services are typed in one place, still to come (PLAN §6.4)
764
+ const services = isCubeServiceModel(context.model)
765
+ ? kept.filter((node) => node instanceof ServiceSource)
766
+ : [];
554
767
  const sources = [
555
768
  ...tables,
769
+ ...functions,
556
770
  ...accessPoints,
557
771
  ...dataSets,
772
+ ...services,
558
773
  ];
559
774
  if (!sources.length) {
560
775
  return;
@@ -562,7 +777,7 @@ export class CubeEditorState {
562
777
  this.pendingSources = new Set([...this.pendingSources, ...sources]);
563
778
  let answers;
564
779
  try {
565
- const [tableAnswers, accessPointAnswers, dataSetAnswers] = (yield Promise.all([
780
+ const [tableAnswers, accessPointAnswers, dataSetAnswers, serviceAnswers, functionAnswers,] = (yield Promise.all([
566
781
  tables.length
567
782
  ? this.host.engine
568
783
  .resolveSchemas(context.model, new Map(tables.map((source) => [
@@ -572,9 +787,7 @@ export class CubeEditorState {
572
787
  .catch((error) => {
573
788
  const failure = error instanceof CubeEngineError
574
789
  ? error
575
- : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error
576
- ? error.message
577
- : String(error));
790
+ : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error ? error.message : String(error));
578
791
  return new Map(tables.map((source) => [source.id, failure]));
579
792
  })
580
793
  : new Map(),
@@ -584,11 +797,19 @@ export class CubeEditorState {
584
797
  dataSets.length
585
798
  ? recheckCubeIngestSources(this.host.ingestCatalog, context.model, dataSets, fresh)
586
799
  : new Map(),
800
+ services.length
801
+ ? recheckCubeServiceSources(this.host.serviceCatalog, context.model, services)
802
+ : new Map(),
803
+ functions.length
804
+ ? recheckCubeFunctionSources(this.host.engine, context.model, functions)
805
+ : new Map(),
587
806
  ]));
588
807
  answers = new Map([
589
808
  ...(tableAnswers ?? []),
590
809
  ...(accessPointAnswers ?? []),
591
810
  ...(dataSetAnswers ?? []),
811
+ ...(serviceAnswers ?? []),
812
+ ...(functionAnswers ?? []),
592
813
  ]);
593
814
  }
594
815
  finally {
@@ -600,12 +821,15 @@ export class CubeEditorState {
600
821
  sources.forEach((source) => {
601
822
  const isAccessPoint = source instanceof DataProductAccessPointSource;
602
823
  const isDataSet = source instanceof IngestDatasetSource;
824
+ const isFunction = source instanceof FunctionSource;
603
825
  const answer = answers.get(source.id) ??
604
826
  new CubeEngineError(CubeEngineErrorKind.COMPILE, isAccessPoint
605
827
  ? CUBE_DATA_PRODUCT_RECHECK_MESSAGE.NO_ANSWER
606
828
  : isDataSet
607
829
  ? CUBE_INGEST_RECHECK_MESSAGE.NO_ANSWER
608
- : 'The engine gave no schema for this table', source.id);
830
+ : isFunction
831
+ ? CUBE_FUNCTION_MESSAGE.NO_ANSWER
832
+ : 'The engine gave no schema for this table', source.id);
609
833
  const saved = source.resolution.kind === 'resolved'
610
834
  ? source.resolution.schema
611
835
  : undefined;
@@ -616,7 +840,9 @@ export class CubeEditorState {
616
840
  ? getAccessPointRecheckWarning(answer.firstLine)
617
841
  : isDataSet
618
842
  ? getDataSetRecheckWarning(answer.firstLine)
619
- : getSourceRecheckWarning(answer.firstLine),
843
+ : isFunction
844
+ ? getFunctionRecheckWarning(answer.firstLine)
845
+ : getSourceRecheckWarning(answer.firstLine),
620
846
  ]);
621
847
  }
622
848
  else if (source.resolution.kind !== 'failed' ||
@@ -641,7 +867,9 @@ export class CubeEditorState {
641
867
  ? getAccessPointDriftWarning(diff)
642
868
  : isDataSet
643
869
  ? getDataSetDriftWarning(diff)
644
- : getSchemaDriftWarning(diff),
870
+ : isFunction
871
+ ? getFunctionDriftWarning(diff)
872
+ : getSchemaDriftWarning(diff),
645
873
  ]);
646
874
  }
647
875
  replacements.set(source, resolved);
@@ -692,6 +920,11 @@ export class CubeEditorState {
692
920
  return next;
693
921
  };
694
922
  this.history = this.history.map(check);
923
+ // a change undone meanwhile is redone with the checked nodes too
924
+ this.redoStack = this.redoStack.map((entry) => ({
925
+ ...entry,
926
+ document: check(entry.document),
927
+ }));
695
928
  const next = check(this.document);
696
929
  if (next !== this.document) {
697
930
  this.replaceDocument(next);
@@ -707,7 +940,9 @@ export class CubeEditorState {
707
940
  const source = this.document.query.getNode(nodeId);
708
941
  if (source instanceof RelationalTableSource ||
709
942
  source instanceof DataProductAccessPointSource ||
710
- source instanceof IngestDatasetSource) {
943
+ source instanceof IngestDatasetSource ||
944
+ source instanceof ServiceSource ||
945
+ source instanceof FunctionSource) {
711
946
  // a Refresh reads the deployed artifact or definition again
712
947
  yield flowResult(this.reresolveSources([source], true));
713
948
  }
@@ -727,20 +962,80 @@ export class CubeEditorState {
727
962
  return;
728
963
  }
729
964
  this.history = this.history.slice(0, -1);
965
+ this.redoStack = [
966
+ ...this.redoStack,
967
+ {
968
+ document: this.document,
969
+ readOnly: this.readOnly,
970
+ opensAnotherCube: this.importedOver.has(previous),
971
+ },
972
+ ];
730
973
  this.readOnly = this.readOnlyDocuments.has(previous);
731
974
  if (this.importedOver.has(previous)) {
732
975
  // the cube before an import is another cube, as the import was
733
976
  this.sourcePicker.close();
734
977
  this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
735
978
  }
736
- const { query } = this.document;
737
- this.replaceDocument(previous.withQuery(previous.query === query ? query : previous.query.clone()));
979
+ const { query, meta } = this.document;
980
+ const restored = previous.withQuery(previous.query === query ? query : previous.query.clone());
981
+ // widths take no undo step, so the same cube keeps the ones set since
982
+ // (review of M7); the cube before an import keeps its own
983
+ this.replaceDocument(this.importedOver.has(previous)
984
+ ? restored
985
+ : restored.withMeta({
986
+ ...restored.meta,
987
+ presentation: {
988
+ ...restored.meta.presentation,
989
+ columnWidths: meta.presentation.columnWidths,
990
+ },
991
+ }));
738
992
  }
739
- pushHistory() {
993
+ /**
994
+ * Brings back the last change undone, as Ctrl+Shift+Z does: the cube shown
995
+ * goes back to the undo history, and a change that opened another cube
996
+ * (an import, New) closes the editor and the source dialog again
997
+ */
998
+ redo() {
999
+ const next = this.redoStack.at(-1);
1000
+ if (!next) {
1001
+ return;
1002
+ }
1003
+ this.redoStack = this.redoStack.slice(0, -1);
1004
+ this.pushHistory(true);
1005
+ if (next.opensAnotherCube) {
1006
+ this.importedOver.add(this.history.at(-1));
1007
+ this.sourcePicker.close();
1008
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
1009
+ }
1010
+ this.readOnly = next.readOnly;
1011
+ const { query, meta } = this.document;
1012
+ const restored = next.document.withQuery(next.document.query === query ? query : next.document.query.clone());
1013
+ // widths take no undo step: the same cube keeps the ones set since
1014
+ this.replaceDocument(next.opensAnotherCube
1015
+ ? restored
1016
+ : restored.withMeta({
1017
+ ...restored.meta,
1018
+ presentation: {
1019
+ ...restored.meta.presentation,
1020
+ columnWidths: meta.presentation.columnWidths,
1021
+ },
1022
+ }));
1023
+ }
1024
+ /** Redo, as its button and Ctrl+Shift+Z do: finishes the node editor first */
1025
+ redoEdited() {
1026
+ if (this.nodeEditor.finishApplied() && this.canRedo) {
1027
+ this.redo();
1028
+ }
1029
+ }
1030
+ /** Keeps the cube shown for undo; a new change, not a redo, drops what was undone */
1031
+ pushHistory(keepRedo = false) {
740
1032
  if (this.readOnly) {
741
1033
  this.readOnlyDocuments.add(this.document);
742
1034
  }
743
1035
  this.history = [...this.history, this.document].slice(-MAX_UNDO_STEPS);
1036
+ if (!keepRedo) {
1037
+ this.redoStack = [];
1038
+ }
744
1039
  }
745
1040
  /**
746
1041
  * Engine errors belong to the query and the context they came from, so
@@ -775,15 +1070,32 @@ export class CubeEditorState {
775
1070
  }
776
1071
  }
777
1072
  /**
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`)
1073
+ * The kinds of source the host serves: data products, ingest data sets and
1074
+ * services only with their catalogs, tables and functions only with a tab
1075
+ * that reads them (Studio offers ingest data sets alone). The cube's kind
1076
+ * may still disable one (`canAddNode`)
781
1077
  */
782
1078
  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));
1079
+ const { modelTab, projectTab, projectFunctionTab, directTab, dataProductTab, ingestTab, serviceTab, } = this.sourcePicker;
1080
+ const isServed = (type) => {
1081
+ switch (type) {
1082
+ case DataProductAccessPointSource.TYPE:
1083
+ return dataProductTab.isAvailable;
1084
+ case IngestDatasetSource.TYPE:
1085
+ return ingestTab.isAvailable;
1086
+ case ServiceSource.TYPE:
1087
+ return serviceTab.isAvailable;
1088
+ case FunctionSource.TYPE:
1089
+ return modelTab.isAvailable || projectFunctionTab.isAvailable;
1090
+ case RelationalTableSource.TYPE:
1091
+ return (modelTab.isAvailable ||
1092
+ projectTab.isAvailable ||
1093
+ directTab.isAvailable);
1094
+ default:
1095
+ return true;
1096
+ }
1097
+ };
1098
+ return this.registry.sources.filter((definition) => isServed(definition.type));
787
1099
  }
788
1100
  /**
789
1101
  * Whether a node of the type can be added: a transform, unconnected or
@@ -816,14 +1128,16 @@ export class CubeEditorState {
816
1128
  addNode(type, afterId) {
817
1129
  const definition = this.registry.get(type);
818
1130
  if (!definition || !this.canAddNode(type, afterId)) {
819
- return;
1131
+ return undefined;
820
1132
  }
821
1133
  if (definition.kind === 'source') {
822
- this.sourcePicker.open(this.sourcePicker.tabForSourceType(type)?.key);
823
- return;
1134
+ this.sourcePicker.openForSourceType(type);
1135
+ return undefined;
824
1136
  }
825
1137
  const { query } = this.document;
826
- this.applyQuery(query.add(definition.create(query.generateId(type)), afterId));
1138
+ const id = query.generateId(type);
1139
+ this.applyQuery(query.add(definition.create(id), afterId));
1140
+ return id;
827
1141
  }
828
1142
  /**
829
1143
  * Adds a node made elsewhere, with its settings, as the grid's quick
@@ -832,11 +1146,28 @@ export class CubeEditorState {
832
1146
  * read-only cube, or when the query can't take it.
833
1147
  */
834
1148
  addConfiguredNode(node, afterId) {
835
- const { query } = this.document;
836
- if (this.readOnly || !query.canAdd(node, afterId)) {
1149
+ this.addConfiguredNodes([node], afterId);
1150
+ }
1151
+ /**
1152
+ * Adds nodes made elsewhere one after another, the first spliced in after
1153
+ * `afterId`, as one undo step, the last then running when that one did
1154
+ * (Explore JSON's Extend then Explode Array). Does nothing in a read-only
1155
+ * cube, or when the query can't take one of them.
1156
+ */
1157
+ addConfiguredNodes(nodes, afterId) {
1158
+ if (this.readOnly || !nodes.length) {
837
1159
  return;
838
1160
  }
839
- this.applyQuery(query.add(node, afterId));
1161
+ let query = this.document.query;
1162
+ let after = afterId;
1163
+ for (const node of nodes) {
1164
+ if (!query.canAdd(node, after)) {
1165
+ return;
1166
+ }
1167
+ query = query.add(node, after);
1168
+ after = node.id;
1169
+ }
1170
+ this.applyQuery(query);
840
1171
  }
841
1172
  /** Whether dropping a node on another does anything: connect it, or else move it after it */
842
1173
  canDropNode(nodeId, targetId) {
@@ -875,6 +1206,69 @@ export class CubeEditorState {
875
1206
  ? this.document.withContext(undefined).withQuery(query)
876
1207
  : this.document.withQuery(query));
877
1208
  }
1209
+ /** Whether a step can be copied: a known type's, so its copy reads back */
1210
+ canCopyNode(nodeId) {
1211
+ const node = this.document.query.getNode(nodeId);
1212
+ return node !== undefined && this.registry.get(node.type) !== undefined;
1213
+ }
1214
+ /** Copies a step, as Cmd/Ctrl+C on it does, for Paste */
1215
+ copyNode(nodeId) {
1216
+ const node = this.document.query.getNode(nodeId);
1217
+ if (node && this.canCopyNode(nodeId)) {
1218
+ this.copiedNode = { node, context: this.document.context };
1219
+ }
1220
+ }
1221
+ /**
1222
+ * Whether the step copied can be pasted here: a transform always; a source
1223
+ * only into a cube of the same model and runtime, or an empty cube, which
1224
+ * takes them, as a first table does
1225
+ */
1226
+ get canPaste() {
1227
+ const copied = this.copiedNode;
1228
+ return (copied !== undefined &&
1229
+ !this.readOnly &&
1230
+ this.canTakeCopy(copied.node, copied.context));
1231
+ }
1232
+ /** Pastes the step copied: after the step given when it takes an input, else on its own; one undo step */
1233
+ pasteNode(afterId) {
1234
+ const copied = this.copiedNode;
1235
+ if (copied && this.canPaste) {
1236
+ this.addCopy(copied.node, copied.context, afterId);
1237
+ }
1238
+ }
1239
+ canDuplicateNode(nodeId) {
1240
+ return !this.readOnly && this.canCopyNode(nodeId);
1241
+ }
1242
+ /** A copy of the step after it, as Cmd/Ctrl+D does, leaving the step copied for Paste as it was */
1243
+ duplicateNode(nodeId) {
1244
+ const node = this.document.query.getNode(nodeId);
1245
+ if (node && this.canDuplicateNode(nodeId)) {
1246
+ this.addCopy(node, this.document.context, nodeId);
1247
+ }
1248
+ }
1249
+ canTakeCopy(node, context) {
1250
+ if (!(node instanceof SourceNode)) {
1251
+ return true;
1252
+ }
1253
+ const { document } = this;
1254
+ return (document.query.isEmpty ||
1255
+ JSON.stringify(document.context) === JSON.stringify(context));
1256
+ }
1257
+ addCopy(node, context, afterId) {
1258
+ const { document } = this;
1259
+ const copy = copyQueryNode(node, document.query.generateId(node.type), this.registry);
1260
+ if (!copy) {
1261
+ return;
1262
+ }
1263
+ const after = afterId !== undefined && document.query.canAdd(copy, afterId)
1264
+ ? afterId
1265
+ : undefined;
1266
+ const query = document.query.add(copy, after);
1267
+ // a source pasted into an empty cube brings its model and runtime
1268
+ this.applyDocument(copy instanceof SourceNode && document.query.isEmpty && context
1269
+ ? document.withContext(context).withQuery(query)
1270
+ : document.withQuery(query));
1271
+ }
878
1272
  canSwapInputs(nodeId) {
879
1273
  return !this.readOnly && this.document.query.canSwapInputs(nodeId);
880
1274
  }
@@ -897,6 +1291,26 @@ export class CubeEditorState {
897
1291
  }));
898
1292
  }
899
1293
  }
1294
+ /**
1295
+ * Keeps a grid column's width, which the cube saves (PLAN §11.10): by the
1296
+ * column's name, in any case. Presentation the user sets by dragging, so
1297
+ * no undo step, and the rows stay current.
1298
+ */
1299
+ setColumnWidth(column, width) {
1300
+ if (!Number.isFinite(width) || width <= 0) {
1301
+ return;
1302
+ }
1303
+ const { meta } = this.document;
1304
+ const { presentation } = meta;
1305
+ const others = presentation.columnWidths.filter((each) => foldColumnName(each.column) !== foldColumnName(column));
1306
+ this.replaceDocument(this.document.withMeta({
1307
+ ...meta,
1308
+ presentation: {
1309
+ ...presentation,
1310
+ columnWidths: [...others, { column, width: Math.round(width) }],
1311
+ },
1312
+ }));
1313
+ }
900
1314
  setHostIssue(nodeId, error) {
901
1315
  this.hostIssues = new Map([
902
1316
  ...this.hostIssues,
@@ -924,7 +1338,8 @@ export class CubeEditorState {
924
1338
  }
925
1339
  /** Stops any run; call when the page closes */
926
1340
  dispose() {
927
- this.retyping();
1341
+ this.rechecking();
1342
+ this.outlineLoading();
928
1343
  this.execution.stop();
929
1344
  this.nodeEditor.dispose();
930
1345
  }