@finos/legend-cube-builder 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (971) hide show
  1. package/README.md +59 -20
  2. package/docs/adding-an-operation.md +112 -13
  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 +132 -7
  12. package/docs/testing.md +146 -9
  13. package/lib/__lib__/LegendCubeCommand.d.ts +4 -1
  14. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
  15. package/lib/__lib__/LegendCubeCommand.js +12 -0
  16. package/lib/__lib__/LegendCubeCommand.js.map +1 -1
  17. package/lib/__lib__/LegendCubeDataProductLabels.d.ts +45 -0
  18. package/lib/__lib__/LegendCubeDataProductLabels.d.ts.map +1 -0
  19. package/lib/__lib__/LegendCubeDataProductLabels.js +60 -0
  20. package/lib/__lib__/LegendCubeDataProductLabels.js.map +1 -0
  21. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts +56 -0
  22. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts.map +1 -0
  23. package/lib/__lib__/LegendCubeDirectConnectionLabels.js +76 -0
  24. package/lib/__lib__/LegendCubeDirectConnectionLabels.js.map +1 -0
  25. package/lib/__lib__/LegendCubeFunctionLabels.d.ts +29 -0
  26. package/lib/__lib__/LegendCubeFunctionLabels.d.ts.map +1 -0
  27. package/lib/__lib__/LegendCubeFunctionLabels.js +31 -0
  28. package/lib/__lib__/LegendCubeFunctionLabels.js.map +1 -0
  29. package/lib/__lib__/LegendCubeHelpText.d.ts +5 -1
  30. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
  31. package/lib/__lib__/LegendCubeHelpText.js +25 -3
  32. package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
  33. package/lib/__lib__/LegendCubeIngestLabels.d.ts +25 -0
  34. package/lib/__lib__/LegendCubeIngestLabels.d.ts.map +1 -0
  35. package/lib/__lib__/LegendCubeIngestLabels.js +29 -0
  36. package/lib/__lib__/LegendCubeIngestLabels.js.map +1 -0
  37. package/lib/__lib__/LegendCubeLabels.d.ts +171 -6
  38. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
  39. package/lib/__lib__/LegendCubeLabels.js +226 -13
  40. package/lib/__lib__/LegendCubeLabels.js.map +1 -1
  41. package/lib/__lib__/LegendCubeProjectLabels.d.ts +22 -0
  42. package/lib/__lib__/LegendCubeProjectLabels.d.ts.map +1 -0
  43. package/lib/__lib__/LegendCubeProjectLabels.js +23 -0
  44. package/lib/__lib__/LegendCubeProjectLabels.js.map +1 -0
  45. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts +26 -0
  46. package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts.map +1 -0
  47. package/lib/__lib__/LegendCubeProjectSourceLabels.js +26 -0
  48. package/lib/__lib__/LegendCubeProjectSourceLabels.js.map +1 -0
  49. package/lib/__lib__/LegendCubeServiceLabels.d.ts +27 -0
  50. package/lib/__lib__/LegendCubeServiceLabels.d.ts.map +1 -0
  51. package/lib/__lib__/LegendCubeServiceLabels.js +32 -0
  52. package/lib/__lib__/LegendCubeServiceLabels.js.map +1 -0
  53. package/lib/__lib__/LegendCubeTesting.d.ts +8 -0
  54. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
  55. package/lib/__lib__/LegendCubeTesting.js +8 -0
  56. package/lib/__lib__/LegendCubeTesting.js.map +1 -1
  57. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -1
  58. package/lib/__test-utils__/CubeCanvasTestUtils.js +1 -1
  59. package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -1
  60. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts +22 -0
  61. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts.map +1 -0
  62. package/lib/__test-utils__/CubeConnectionTestSupport.js +30 -0
  63. package/lib/__test-utils__/CubeConnectionTestSupport.js.map +1 -0
  64. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts +31 -0
  65. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts.map +1 -0
  66. package/lib/__test-utils__/CubeDirectConnectionFixtures.js +63 -0
  67. package/lib/__test-utils__/CubeDirectConnectionFixtures.js.map +1 -0
  68. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +13 -1
  69. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
  70. package/lib/__test-utils__/CubeEngineTestSupport.js +23 -2
  71. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
  72. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +44 -0
  73. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -0
  74. package/lib/__test-utils__/CubeExpressionTestUtils.js +100 -0
  75. package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -0
  76. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts +26 -0
  77. package/lib/__test-utils__/CubeFunctionTestOutline.d.ts.map +1 -0
  78. package/lib/__test-utils__/CubeFunctionTestOutline.js +56 -0
  79. package/lib/__test-utils__/CubeFunctionTestOutline.js.map +1 -0
  80. package/lib/__test-utils__/CubeLambdaCorpus.d.ts +36 -0
  81. package/lib/__test-utils__/CubeLambdaCorpus.d.ts.map +1 -0
  82. package/lib/__test-utils__/CubeLambdaCorpus.js +83 -0
  83. package/lib/__test-utils__/CubeLambdaCorpus.js.map +1 -0
  84. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +25 -0
  85. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -1
  86. package/lib/__test-utils__/CubeOperationsTestUtils.js +56 -10
  87. package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -1
  88. package/lib/__test-utils__/CubePageTestUtils.d.ts +18 -0
  89. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
  90. package/lib/__test-utils__/CubePageTestUtils.js +46 -1
  91. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
  92. package/lib/__test-utils__/CubeTestApplication.d.ts +14 -1
  93. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
  94. package/lib/__test-utils__/CubeTestApplication.js +25 -1
  95. package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
  96. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts +33 -0
  97. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts.map +1 -0
  98. package/lib/__test-utils__/FakeCubeConnectionExplorer.js +67 -0
  99. package/lib/__test-utils__/FakeCubeConnectionExplorer.js.map +1 -0
  100. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts +45 -0
  101. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts.map +1 -0
  102. package/lib/__test-utils__/FakeCubeDataProductCatalog.js +137 -0
  103. package/lib/__test-utils__/FakeCubeDataProductCatalog.js.map +1 -0
  104. package/lib/__test-utils__/FakeCubeEngine.d.ts +7 -0
  105. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
  106. package/lib/__test-utils__/FakeCubeEngine.js +31 -1
  107. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
  108. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +41 -0
  109. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -0
  110. package/lib/__test-utils__/FakeCubeIngestCatalog.js +123 -0
  111. package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -0
  112. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts +30 -0
  113. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts.map +1 -0
  114. package/lib/__test-utils__/FakeCubeProjectCatalog.js +64 -0
  115. package/lib/__test-utils__/FakeCubeProjectCatalog.js.map +1 -0
  116. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts +26 -0
  117. package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts.map +1 -0
  118. package/lib/__test-utils__/FakeCubeServiceCatalog.js +40 -0
  119. package/lib/__test-utils__/FakeCubeServiceCatalog.js.map +1 -0
  120. package/lib/components/CubeAddItems.d.ts +35 -0
  121. package/lib/components/CubeAddItems.d.ts.map +1 -0
  122. package/lib/components/CubeAddItems.js +85 -0
  123. package/lib/components/CubeAddItems.js.map +1 -0
  124. package/lib/components/CubeDialogTheme.d.ts +25 -0
  125. package/lib/components/CubeDialogTheme.d.ts.map +1 -0
  126. package/lib/components/CubeDialogTheme.js +25 -0
  127. package/lib/components/CubeDialogTheme.js.map +1 -0
  128. package/lib/components/CubeEditor.d.ts +17 -2
  129. package/lib/components/CubeEditor.d.ts.map +1 -1
  130. package/lib/components/CubeEditor.js +39 -17
  131. package/lib/components/CubeEditor.js.map +1 -1
  132. package/lib/components/CubeEntrySourceBanner.d.ts +23 -0
  133. package/lib/components/CubeEntrySourceBanner.d.ts.map +1 -0
  134. package/lib/components/CubeEntrySourceBanner.js +32 -0
  135. package/lib/components/CubeEntrySourceBanner.js.map +1 -0
  136. package/lib/components/CubeFileMenu.d.ts +28 -0
  137. package/lib/components/CubeFileMenu.d.ts.map +1 -0
  138. package/lib/components/CubeFileMenu.js +77 -0
  139. package/lib/components/CubeFileMenu.js.map +1 -0
  140. package/lib/components/CubeLambdaImportBanner.d.ts +26 -0
  141. package/lib/components/CubeLambdaImportBanner.d.ts.map +1 -0
  142. package/lib/components/CubeLambdaImportBanner.js +47 -0
  143. package/lib/components/CubeLambdaImportBanner.js.map +1 -0
  144. package/lib/components/CubeNodeIcon.d.ts.map +1 -1
  145. package/lib/components/CubeNodeIcon.js +12 -1
  146. package/lib/components/CubeNodeIcon.js.map +1 -1
  147. package/lib/components/CubeSchemaColumnsTable.d.ts +21 -0
  148. package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -0
  149. package/lib/components/CubeSchemaColumnsTable.js +6 -0
  150. package/lib/components/CubeSchemaColumnsTable.js.map +1 -0
  151. package/lib/components/canvas/CubeCanvas.d.ts +4 -3
  152. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
  153. package/lib/components/canvas/CubeCanvas.js +68 -16
  154. package/lib/components/canvas/CubeCanvas.js.map +1 -1
  155. package/lib/components/canvas/CubeCanvasContextMenu.d.ts +8 -4
  156. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
  157. package/lib/components/canvas/CubeCanvasContextMenu.js +20 -9
  158. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
  159. package/lib/components/canvas/CubeCanvasDnd.d.ts +7 -5
  160. package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -1
  161. package/lib/components/canvas/CubeCanvasDnd.js +14 -9
  162. package/lib/components/canvas/CubeCanvasDnd.js.map +1 -1
  163. package/lib/components/canvas/CubeCanvasElements.d.ts +18 -1
  164. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
  165. package/lib/components/canvas/CubeCanvasElements.js +63 -5
  166. package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
  167. package/lib/components/canvas/CubeCanvasLayout.js +1 -1
  168. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
  169. package/lib/components/canvas/CubeCanvasNode.js +35 -21
  170. package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
  171. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts +22 -0
  172. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts.map +1 -0
  173. package/lib/components/canvas/CubeCanvasNodeFocus.js +31 -0
  174. package/lib/components/canvas/CubeCanvasNodeFocus.js.map +1 -0
  175. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts +44 -0
  176. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts.map +1 -0
  177. package/lib/components/canvas/CubeNodeEditorAnchor.js +51 -0
  178. package/lib/components/canvas/CubeNodeEditorAnchor.js.map +1 -0
  179. package/lib/components/dev-settings/CubeDevSettings.d.ts +35 -0
  180. package/lib/components/dev-settings/CubeDevSettings.d.ts.map +1 -0
  181. package/lib/components/dev-settings/CubeDevSettings.js +50 -0
  182. package/lib/components/dev-settings/CubeDevSettings.js.map +1 -0
  183. package/lib/components/editors/CubeAggregationRowEditor.d.ts +48 -0
  184. package/lib/components/editors/CubeAggregationRowEditor.d.ts.map +1 -0
  185. package/lib/components/editors/CubeAggregationRowEditor.js +72 -0
  186. package/lib/components/editors/CubeAggregationRowEditor.js.map +1 -0
  187. package/lib/components/editors/CubeColumnChecklist.d.ts +42 -0
  188. package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -0
  189. package/lib/components/editors/CubeColumnChecklist.js +41 -0
  190. package/lib/components/editors/CubeColumnChecklist.js.map +1 -0
  191. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
  192. package/lib/components/editors/CubeColumnPicker.js +3 -3
  193. package/lib/components/editors/CubeColumnPicker.js.map +1 -1
  194. package/lib/components/editors/CubeConcatEditor.d.ts +33 -0
  195. package/lib/components/editors/CubeConcatEditor.d.ts.map +1 -0
  196. package/lib/components/editors/CubeConcatEditor.js +147 -0
  197. package/lib/components/editors/CubeConcatEditor.js.map +1 -0
  198. package/lib/components/editors/CubeDataProductSourceEditor.d.ts +25 -0
  199. package/lib/components/editors/CubeDataProductSourceEditor.d.ts.map +1 -0
  200. package/lib/components/editors/CubeDataProductSourceEditor.js +53 -0
  201. package/lib/components/editors/CubeDataProductSourceEditor.js.map +1 -0
  202. package/lib/components/editors/CubeDifferenceEditor.d.ts +25 -0
  203. package/lib/components/editors/CubeDifferenceEditor.d.ts.map +1 -0
  204. package/lib/components/editors/CubeDifferenceEditor.js +29 -0
  205. package/lib/components/editors/CubeDifferenceEditor.js.map +1 -0
  206. package/lib/components/editors/CubeExpressionFilterEditor.d.ts +25 -0
  207. package/lib/components/editors/CubeExpressionFilterEditor.d.ts.map +1 -0
  208. package/lib/components/editors/CubeExpressionFilterEditor.js +83 -0
  209. package/lib/components/editors/CubeExpressionFilterEditor.js.map +1 -0
  210. package/lib/components/editors/CubeExtendEditor.d.ts +27 -0
  211. package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -0
  212. package/lib/components/editors/CubeExtendEditor.js +86 -0
  213. package/lib/components/editors/CubeExtendEditor.js.map +1 -0
  214. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
  215. package/lib/components/editors/CubeFilterEditor.js +15 -4
  216. package/lib/components/editors/CubeFilterEditor.js.map +1 -1
  217. package/lib/components/editors/CubeFunctionSourceEditor.d.ts +25 -0
  218. package/lib/components/editors/CubeFunctionSourceEditor.d.ts.map +1 -0
  219. package/lib/components/editors/CubeFunctionSourceEditor.js +55 -0
  220. package/lib/components/editors/CubeFunctionSourceEditor.js.map +1 -0
  221. package/lib/components/editors/CubeGroupEditor.d.ts +28 -0
  222. package/lib/components/editors/CubeGroupEditor.d.ts.map +1 -0
  223. package/lib/components/editors/CubeGroupEditor.js +70 -0
  224. package/lib/components/editors/CubeGroupEditor.js.map +1 -0
  225. package/lib/components/editors/CubeIngestSourceEditor.d.ts +26 -0
  226. package/lib/components/editors/CubeIngestSourceEditor.d.ts.map +1 -0
  227. package/lib/components/editors/CubeIngestSourceEditor.js +47 -0
  228. package/lib/components/editors/CubeIngestSourceEditor.js.map +1 -0
  229. package/lib/components/editors/CubeJoinEditor.d.ts +2 -4
  230. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
  231. package/lib/components/editors/CubeJoinEditor.js +21 -39
  232. package/lib/components/editors/CubeJoinEditor.js.map +1 -1
  233. package/lib/components/editors/CubeJoinKeyRows.d.ts +34 -0
  234. package/lib/components/editors/CubeJoinKeyRows.d.ts.map +1 -0
  235. package/lib/components/editors/CubeJoinKeyRows.js +65 -0
  236. package/lib/components/editors/CubeJoinKeyRows.js.map +1 -0
  237. package/lib/components/editors/CubeNodeEditorPanel.d.ts +7 -5
  238. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
  239. package/lib/components/editors/CubeNodeEditorPanel.js +64 -16
  240. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
  241. package/lib/components/editors/CubeNodeEditorPopper.d.ts +44 -0
  242. package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -0
  243. package/lib/components/editors/CubeNodeEditorPopper.js +133 -0
  244. package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -0
  245. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
  246. package/lib/components/editors/CubeNodeEditorRegistry.js +23 -1
  247. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
  248. package/lib/components/editors/CubePartitionEditor.d.ts +30 -0
  249. package/lib/components/editors/CubePartitionEditor.d.ts.map +1 -0
  250. package/lib/components/editors/CubePartitionEditor.js +93 -0
  251. package/lib/components/editors/CubePartitionEditor.js.map +1 -0
  252. package/lib/components/editors/CubePivotEditor.d.ts +26 -0
  253. package/lib/components/editors/CubePivotEditor.d.ts.map +1 -0
  254. package/lib/components/editors/CubePivotEditor.js +93 -0
  255. package/lib/components/editors/CubePivotEditor.js.map +1 -0
  256. package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -1
  257. package/lib/components/editors/CubeRenameEditor.js +6 -4
  258. package/lib/components/editors/CubeRenameEditor.js.map +1 -1
  259. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -1
  260. package/lib/components/editors/CubeRestrictEditor.js +2 -2
  261. package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
  262. package/lib/components/editors/CubeServiceSourceEditor.d.ts +25 -0
  263. package/lib/components/editors/CubeServiceSourceEditor.d.ts.map +1 -0
  264. package/lib/components/editors/CubeServiceSourceEditor.js +41 -0
  265. package/lib/components/editors/CubeServiceSourceEditor.js.map +1 -0
  266. package/lib/components/editors/CubeSortEditor.d.ts.map +1 -1
  267. package/lib/components/editors/CubeSortEditor.js +10 -37
  268. package/lib/components/editors/CubeSortEditor.js.map +1 -1
  269. package/lib/components/editors/CubeSortRowEditor.d.ts +47 -0
  270. package/lib/components/editors/CubeSortRowEditor.d.ts.map +1 -0
  271. package/lib/components/editors/CubeSortRowEditor.js +62 -0
  272. package/lib/components/editors/CubeSortRowEditor.js.map +1 -0
  273. package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -1
  274. package/lib/components/editors/CubeSourceEditor.js +18 -5
  275. package/lib/components/editors/CubeSourceEditor.js.map +1 -1
  276. package/lib/components/editors/CubeWarehouseControl.d.ts +30 -0
  277. package/lib/components/editors/CubeWarehouseControl.d.ts.map +1 -0
  278. package/lib/components/editors/CubeWarehouseControl.js +44 -0
  279. package/lib/components/editors/CubeWarehouseControl.js.map +1 -0
  280. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts +31 -0
  281. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts.map +1 -0
  282. package/lib/components/editors/useCubeNodeEditorDismiss.js +83 -0
  283. package/lib/components/editors/useCubeNodeEditorDismiss.js.map +1 -0
  284. package/lib/components/examples/CubeExamplesDialog.d.ts +26 -0
  285. package/lib/components/examples/CubeExamplesDialog.d.ts.map +1 -0
  286. package/lib/components/examples/CubeExamplesDialog.js +68 -0
  287. package/lib/components/examples/CubeExamplesDialog.js.map +1 -0
  288. package/lib/components/grid/CubeColumnFormatDialog.d.ts +28 -0
  289. package/lib/components/grid/CubeColumnFormatDialog.d.ts.map +1 -0
  290. package/lib/components/grid/CubeColumnFormatDialog.js +94 -0
  291. package/lib/components/grid/CubeColumnFormatDialog.js.map +1 -0
  292. package/lib/components/grid/CubeDrilldownBar.d.ts +37 -0
  293. package/lib/components/grid/CubeDrilldownBar.d.ts.map +1 -0
  294. package/lib/components/grid/CubeDrilldownBar.js +77 -0
  295. package/lib/components/grid/CubeDrilldownBar.js.map +1 -0
  296. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
  297. package/lib/components/grid/CubeGridRegion.js +56 -31
  298. package/lib/components/grid/CubeGridRegion.js.map +1 -1
  299. package/lib/components/grid/CubeGridValues.d.ts +47 -1
  300. package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
  301. package/lib/components/grid/CubeGridValues.js +152 -1
  302. package/lib/components/grid/CubeGridValues.js.map +1 -1
  303. package/lib/components/grid/CubeResultGrid.d.ts +68 -5
  304. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
  305. package/lib/components/grid/CubeResultGrid.js +316 -31
  306. package/lib/components/grid/CubeResultGrid.js.map +1 -1
  307. package/lib/components/grid/CubeRunStatsPanel.d.ts +28 -0
  308. package/lib/components/grid/CubeRunStatsPanel.d.ts.map +1 -0
  309. package/lib/components/grid/CubeRunStatsPanel.js +61 -0
  310. package/lib/components/grid/CubeRunStatsPanel.js.map +1 -0
  311. package/lib/components/grid/CubeServerSideGrid.d.ts +36 -0
  312. package/lib/components/grid/CubeServerSideGrid.d.ts.map +1 -0
  313. package/lib/components/grid/CubeServerSideGrid.js +114 -0
  314. package/lib/components/grid/CubeServerSideGrid.js.map +1 -0
  315. package/lib/components/grid/CubeSqlDialog.d.ts +24 -0
  316. package/lib/components/grid/CubeSqlDialog.d.ts.map +1 -0
  317. package/lib/components/grid/CubeSqlDialog.js +39 -0
  318. package/lib/components/grid/CubeSqlDialog.js.map +1 -0
  319. package/lib/components/grid/CubeSqlFormat.d.ts +20 -0
  320. package/lib/components/grid/CubeSqlFormat.d.ts.map +1 -0
  321. package/lib/components/grid/CubeSqlFormat.js +32 -0
  322. package/lib/components/grid/CubeSqlFormat.js.map +1 -0
  323. package/lib/components/palette/CubePalette.d.ts.map +1 -1
  324. package/lib/components/palette/CubePalette.js +44 -14
  325. package/lib/components/palette/CubePalette.js.map +1 -1
  326. package/lib/components/show-pure/CubeShowPureDialog.d.ts +4 -1
  327. package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -1
  328. package/lib/components/show-pure/CubeShowPureDialog.js +8 -4
  329. package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -1
  330. package/lib/components/source-picker/CubeDataProductTab.d.ts +27 -0
  331. package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -0
  332. package/lib/components/source-picker/CubeDataProductTab.js +123 -0
  333. package/lib/components/source-picker/CubeDataProductTab.js.map +1 -0
  334. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts +27 -0
  335. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -0
  336. package/lib/components/source-picker/CubeDirectConnectionTab.js +89 -0
  337. package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -0
  338. package/lib/components/source-picker/CubeFunctionSteps.d.ts +36 -0
  339. package/lib/components/source-picker/CubeFunctionSteps.d.ts.map +1 -0
  340. package/lib/components/source-picker/CubeFunctionSteps.js +76 -0
  341. package/lib/components/source-picker/CubeFunctionSteps.js.map +1 -0
  342. package/lib/components/source-picker/CubeIngestTab.d.ts +28 -0
  343. package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -0
  344. package/lib/components/source-picker/CubeIngestTab.js +89 -0
  345. package/lib/components/source-picker/CubeIngestTab.js.map +1 -0
  346. package/lib/components/source-picker/CubeInlineModelTab.d.ts +38 -0
  347. package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -0
  348. package/lib/components/source-picker/CubeInlineModelTab.js +81 -0
  349. package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -0
  350. package/lib/components/source-picker/CubePickerListItem.d.ts +47 -0
  351. package/lib/components/source-picker/CubePickerListItem.d.ts.map +1 -0
  352. package/lib/components/source-picker/CubePickerListItem.js +62 -0
  353. package/lib/components/source-picker/CubePickerListItem.js.map +1 -0
  354. package/lib/components/source-picker/CubePickerStep.d.ts +27 -0
  355. package/lib/components/source-picker/CubePickerStep.d.ts.map +1 -0
  356. package/lib/components/source-picker/CubePickerStep.js +23 -0
  357. package/lib/components/source-picker/CubePickerStep.js.map +1 -0
  358. package/lib/components/source-picker/CubeProjectTab.d.ts +28 -0
  359. package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -0
  360. package/lib/components/source-picker/CubeProjectTab.js +53 -0
  361. package/lib/components/source-picker/CubeProjectTab.js.map +1 -0
  362. package/lib/components/source-picker/CubeServiceTab.d.ts +27 -0
  363. package/lib/components/source-picker/CubeServiceTab.d.ts.map +1 -0
  364. package/lib/components/source-picker/CubeServiceTab.js +36 -0
  365. package/lib/components/source-picker/CubeServiceTab.js.map +1 -0
  366. package/lib/components/source-picker/CubeSourcePicker.d.ts +6 -0
  367. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
  368. package/lib/components/source-picker/CubeSourcePicker.js +33 -58
  369. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
  370. package/lib/components/source-picker/CubeTablePreview.d.ts +29 -0
  371. package/lib/components/source-picker/CubeTablePreview.d.ts.map +1 -0
  372. package/lib/components/source-picker/CubeTablePreview.js +10 -0
  373. package/lib/components/source-picker/CubeTablePreview.js.map +1 -0
  374. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts +27 -0
  375. package/lib/components/spec-transfer/CubeImportPureDialog.d.ts.map +1 -0
  376. package/lib/components/spec-transfer/CubeImportPureDialog.js +38 -0
  377. package/lib/components/spec-transfer/CubeImportPureDialog.js.map +1 -0
  378. package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -1
  379. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +9 -3
  380. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
  381. package/lib/graph-manager/CubeConnectionExplorer.d.ts +90 -0
  382. package/lib/graph-manager/CubeConnectionExplorer.d.ts.map +1 -0
  383. package/lib/graph-manager/CubeConnectionExplorer.js +34 -0
  384. package/lib/graph-manager/CubeConnectionExplorer.js.map +1 -0
  385. package/lib/graph-manager/CubeDataProduct.d.ts +66 -0
  386. package/lib/graph-manager/CubeDataProduct.d.ts.map +1 -0
  387. package/lib/graph-manager/CubeDataProduct.js +102 -0
  388. package/lib/graph-manager/CubeDataProduct.js.map +1 -0
  389. package/lib/graph-manager/CubeDataProductCatalog.d.ts +177 -0
  390. package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -0
  391. package/lib/graph-manager/CubeDataProductCatalog.js +116 -0
  392. package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -0
  393. package/lib/graph-manager/CubeDirectConnection.d.ts +38 -0
  394. package/lib/graph-manager/CubeDirectConnection.d.ts.map +1 -0
  395. package/lib/graph-manager/CubeDirectConnection.js +48 -0
  396. package/lib/graph-manager/CubeDirectConnection.js.map +1 -0
  397. package/lib/graph-manager/CubeEngine.d.ts +83 -3
  398. package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
  399. package/lib/graph-manager/CubeEngine.js +4 -1
  400. package/lib/graph-manager/CubeEngine.js.map +1 -1
  401. package/lib/graph-manager/CubeEngineClientSettings.d.ts +43 -0
  402. package/lib/graph-manager/CubeEngineClientSettings.d.ts.map +1 -0
  403. package/lib/graph-manager/CubeEngineClientSettings.js +51 -0
  404. package/lib/graph-manager/CubeEngineClientSettings.js.map +1 -0
  405. package/lib/graph-manager/CubeIngest.d.ts +55 -0
  406. package/lib/graph-manager/CubeIngest.d.ts.map +1 -0
  407. package/lib/graph-manager/CubeIngest.js +98 -0
  408. package/lib/graph-manager/CubeIngest.js.map +1 -0
  409. package/lib/graph-manager/CubeIngestCatalog.d.ts +142 -0
  410. package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -0
  411. package/lib/graph-manager/CubeIngestCatalog.js +86 -0
  412. package/lib/graph-manager/CubeIngestCatalog.js.map +1 -0
  413. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts +26 -0
  414. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts.map +1 -0
  415. package/lib/graph-manager/CubeLakehouseEnvironment.js +17 -0
  416. package/lib/graph-manager/CubeLakehouseEnvironment.js.map +1 -0
  417. package/lib/graph-manager/CubeLakehouseRuntime.d.ts +29 -0
  418. package/lib/graph-manager/CubeLakehouseRuntime.d.ts.map +1 -0
  419. package/lib/graph-manager/CubeLakehouseRuntime.js +40 -0
  420. package/lib/graph-manager/CubeLakehouseRuntime.js.map +1 -0
  421. package/lib/graph-manager/CubeProject.d.ts +41 -0
  422. package/lib/graph-manager/CubeProject.d.ts.map +1 -0
  423. package/lib/graph-manager/CubeProject.js +84 -0
  424. package/lib/graph-manager/CubeProject.js.map +1 -0
  425. package/lib/graph-manager/CubeProjectCatalog.d.ts +35 -0
  426. package/lib/graph-manager/CubeProjectCatalog.d.ts.map +1 -0
  427. package/lib/graph-manager/CubeProjectCatalog.js +17 -0
  428. package/lib/graph-manager/CubeProjectCatalog.js.map +1 -0
  429. package/lib/graph-manager/CubeService.d.ts +20 -0
  430. package/lib/graph-manager/CubeService.d.ts.map +1 -0
  431. package/lib/graph-manager/CubeService.js +22 -0
  432. package/lib/graph-manager/CubeService.js.map +1 -0
  433. package/lib/graph-manager/CubeServiceCatalog.d.ts +31 -0
  434. package/lib/graph-manager/CubeServiceCatalog.d.ts.map +1 -0
  435. package/lib/graph-manager/CubeServiceCatalog.js +17 -0
  436. package/lib/graph-manager/CubeServiceCatalog.js.map +1 -0
  437. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +111 -2
  438. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
  439. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +108 -1
  440. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
  441. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts +44 -0
  442. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts.map +1 -0
  443. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js +192 -0
  444. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js.map +1 -0
  445. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +32 -0
  446. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -0
  447. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +88 -0
  448. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -0
  449. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts +41 -0
  450. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts.map +1 -0
  451. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js +246 -0
  452. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js.map +1 -0
  453. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts +43 -0
  454. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts.map +1 -0
  455. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js +112 -0
  456. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js.map +1 -0
  457. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -1
  458. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +30 -4
  459. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -1
  460. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts +23 -0
  461. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts.map +1 -0
  462. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js +68 -0
  463. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js.map +1 -0
  464. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts +30 -0
  465. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts.map +1 -0
  466. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js +229 -0
  467. package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js.map +1 -0
  468. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts +30 -0
  469. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -0
  470. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +149 -0
  471. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -0
  472. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +57 -0
  473. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -0
  474. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +120 -0
  475. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -0
  476. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts +33 -0
  477. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts.map +1 -0
  478. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js +94 -0
  479. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js.map +1 -0
  480. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts +34 -0
  481. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts.map +1 -0
  482. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js +332 -0
  483. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js.map +1 -0
  484. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
  485. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +111 -13
  486. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
  487. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +1 -1
  488. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
  489. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +3 -1
  490. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
  491. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts +67 -0
  492. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts.map +1 -0
  493. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js +238 -0
  494. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js.map +1 -0
  495. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +35 -0
  496. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -0
  497. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +65 -0
  498. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -0
  499. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts +104 -0
  500. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts.map +1 -0
  501. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js +484 -0
  502. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js.map +1 -0
  503. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +115 -3
  504. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
  505. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +654 -21
  506. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
  507. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts +69 -0
  508. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts.map +1 -0
  509. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js +270 -0
  510. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js.map +1 -0
  511. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts +35 -0
  512. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -0
  513. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +94 -0
  514. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -0
  515. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts +31 -0
  516. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts.map +1 -0
  517. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js +69 -0
  518. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js.map +1 -0
  519. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts +25 -0
  520. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts.map +1 -0
  521. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js +47 -0
  522. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js.map +1 -0
  523. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts +28 -0
  524. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts.map +1 -0
  525. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js +310 -0
  526. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js.map +1 -0
  527. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts +33 -0
  528. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts.map +1 -0
  529. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js +188 -0
  530. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js.map +1 -0
  531. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +1 -1
  532. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
  533. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +33 -3
  534. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
  535. package/lib/index.css +2 -2
  536. package/lib/index.css.map +1 -1
  537. package/lib/index.d.ts +22 -3
  538. package/lib/index.d.ts.map +1 -1
  539. package/lib/index.js +19 -1
  540. package/lib/index.js.map +1 -1
  541. package/lib/stores/CubeAddPlacement.d.ts +39 -0
  542. package/lib/stores/CubeAddPlacement.d.ts.map +1 -0
  543. package/lib/stores/CubeAddPlacement.js +51 -0
  544. package/lib/stores/CubeAddPlacement.js.map +1 -0
  545. package/lib/stores/CubeDataProductRecheck.d.ts +27 -0
  546. package/lib/stores/CubeDataProductRecheck.d.ts.map +1 -0
  547. package/lib/stores/CubeDataProductRecheck.js +54 -0
  548. package/lib/stores/CubeDataProductRecheck.js.map +1 -0
  549. package/lib/stores/CubeDataProductRuntimeState.d.ts +88 -0
  550. package/lib/stores/CubeDataProductRuntimeState.d.ts.map +1 -0
  551. package/lib/stores/CubeDataProductRuntimeState.js +190 -0
  552. package/lib/stores/CubeDataProductRuntimeState.js.map +1 -0
  553. package/lib/stores/CubeDataProductWarehouse.d.ts +19 -0
  554. package/lib/stores/CubeDataProductWarehouse.d.ts.map +1 -0
  555. package/lib/stores/CubeDataProductWarehouse.js +25 -0
  556. package/lib/stores/CubeDataProductWarehouse.js.map +1 -0
  557. package/lib/stores/CubeDevSettingsState.d.ts +47 -0
  558. package/lib/stores/CubeDevSettingsState.d.ts.map +1 -0
  559. package/lib/stores/CubeDevSettingsState.js +99 -0
  560. package/lib/stores/CubeDevSettingsState.js.map +1 -0
  561. package/lib/stores/CubeEditorState.d.ts +242 -28
  562. package/lib/stores/CubeEditorState.d.ts.map +1 -1
  563. package/lib/stores/CubeEditorState.js +751 -66
  564. package/lib/stores/CubeEditorState.js.map +1 -1
  565. package/lib/stores/CubeEngineChecks.d.ts +59 -0
  566. package/lib/stores/CubeEngineChecks.d.ts.map +1 -0
  567. package/lib/stores/CubeEngineChecks.js +100 -0
  568. package/lib/stores/CubeEngineChecks.js.map +1 -0
  569. package/lib/stores/CubeEntrySource.d.ts +78 -0
  570. package/lib/stores/CubeEntrySource.d.ts.map +1 -0
  571. package/lib/stores/CubeEntrySource.js +200 -0
  572. package/lib/stores/CubeEntrySource.js.map +1 -0
  573. package/lib/stores/CubeExamples.d.ts +43 -0
  574. package/lib/stores/CubeExamples.d.ts.map +1 -0
  575. package/lib/stores/CubeExamples.js +333 -0
  576. package/lib/stores/CubeExamples.js.map +1 -0
  577. package/lib/stores/CubeExamplesState.d.ts +45 -0
  578. package/lib/stores/CubeExamplesState.d.ts.map +1 -0
  579. package/lib/stores/CubeExamplesState.js +81 -0
  580. package/lib/stores/CubeExamplesState.js.map +1 -0
  581. package/lib/stores/CubeExecutionState.d.ts +6 -2
  582. package/lib/stores/CubeExecutionState.d.ts.map +1 -1
  583. package/lib/stores/CubeExecutionState.js +39 -38
  584. package/lib/stores/CubeExecutionState.js.map +1 -1
  585. package/lib/stores/CubeExportState.d.ts +41 -0
  586. package/lib/stores/CubeExportState.d.ts.map +1 -0
  587. package/lib/stores/CubeExportState.js +134 -0
  588. package/lib/stores/CubeExportState.js.map +1 -0
  589. package/lib/stores/CubeExpressionFilterCheck.d.ts +51 -0
  590. package/lib/stores/CubeExpressionFilterCheck.d.ts.map +1 -0
  591. package/lib/stores/CubeExpressionFilterCheck.js +134 -0
  592. package/lib/stores/CubeExpressionFilterCheck.js.map +1 -0
  593. package/lib/stores/CubeExtendTyping.d.ts +64 -0
  594. package/lib/stores/CubeExtendTyping.d.ts.map +1 -0
  595. package/lib/stores/CubeExtendTyping.js +149 -0
  596. package/lib/stores/CubeExtendTyping.js.map +1 -0
  597. package/lib/stores/CubeFunctionRecheck.d.ts +30 -0
  598. package/lib/stores/CubeFunctionRecheck.d.ts.map +1 -0
  599. package/lib/stores/CubeFunctionRecheck.js +67 -0
  600. package/lib/stores/CubeFunctionRecheck.js.map +1 -0
  601. package/lib/stores/CubeGridFetcher.d.ts +75 -0
  602. package/lib/stores/CubeGridFetcher.d.ts.map +1 -0
  603. package/lib/stores/CubeGridFetcher.js +197 -0
  604. package/lib/stores/CubeGridFetcher.js.map +1 -0
  605. package/lib/stores/CubeGridQuickActions.d.ts +27 -7
  606. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
  607. package/lib/stores/CubeGridQuickActions.js +79 -21
  608. package/lib/stores/CubeGridQuickActions.js.map +1 -1
  609. package/lib/stores/CubeGridState.d.ts +136 -0
  610. package/lib/stores/CubeGridState.d.ts.map +1 -0
  611. package/lib/stores/CubeGridState.js +317 -0
  612. package/lib/stores/CubeGridState.js.map +1 -0
  613. package/lib/stores/CubeHost.d.ts +74 -1
  614. package/lib/stores/CubeHost.d.ts.map +1 -1
  615. package/lib/stores/CubeHost.js +25 -1
  616. package/lib/stores/CubeHost.js.map +1 -1
  617. package/lib/stores/CubeIngestRecheck.d.ts +26 -0
  618. package/lib/stores/CubeIngestRecheck.d.ts.map +1 -0
  619. package/lib/stores/CubeIngestRecheck.js +53 -0
  620. package/lib/stores/CubeIngestRecheck.js.map +1 -0
  621. package/lib/stores/CubeLambdaImportState.d.ts +118 -0
  622. package/lib/stores/CubeLambdaImportState.d.ts.map +1 -0
  623. package/lib/stores/CubeLambdaImportState.js +302 -0
  624. package/lib/stores/CubeLambdaImportState.js.map +1 -0
  625. package/lib/stores/CubeLambdaSources.d.ts +45 -0
  626. package/lib/stores/CubeLambdaSources.d.ts.map +1 -0
  627. package/lib/stores/CubeLambdaSources.js +261 -0
  628. package/lib/stores/CubeLambdaSources.js.map +1 -0
  629. package/lib/stores/CubeNodeEditorState.d.ts +101 -5
  630. package/lib/stores/CubeNodeEditorState.d.ts.map +1 -1
  631. package/lib/stores/CubeNodeEditorState.js +221 -10
  632. package/lib/stores/CubeNodeEditorState.js.map +1 -1
  633. package/lib/stores/CubeQueryRun.d.ts +59 -0
  634. package/lib/stores/CubeQueryRun.d.ts.map +1 -0
  635. package/lib/stores/CubeQueryRun.js +101 -0
  636. package/lib/stores/CubeQueryRun.js.map +1 -0
  637. package/lib/stores/CubeRunStatsState.d.ts +61 -0
  638. package/lib/stores/CubeRunStatsState.d.ts.map +1 -0
  639. package/lib/stores/CubeRunStatsState.js +54 -0
  640. package/lib/stores/CubeRunStatsState.js.map +1 -0
  641. package/lib/stores/CubeRunningStepLambda.d.ts +25 -0
  642. package/lib/stores/CubeRunningStepLambda.d.ts.map +1 -0
  643. package/lib/stores/CubeRunningStepLambda.js +45 -0
  644. package/lib/stores/CubeRunningStepLambda.js.map +1 -0
  645. package/lib/stores/CubeServiceRecheck.d.ts +29 -0
  646. package/lib/stores/CubeServiceRecheck.d.ts.map +1 -0
  647. package/lib/stores/CubeServiceRecheck.js +33 -0
  648. package/lib/stores/CubeServiceRecheck.js.map +1 -0
  649. package/lib/stores/CubeShowPureState.d.ts +18 -2
  650. package/lib/stores/CubeShowPureState.d.ts.map +1 -1
  651. package/lib/stores/CubeShowPureState.js +46 -13
  652. package/lib/stores/CubeShowPureState.js.map +1 -1
  653. package/lib/stores/CubeSourcePickerState.d.ts +70 -65
  654. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
  655. package/lib/stores/CubeSourcePickerState.js +207 -267
  656. package/lib/stores/CubeSourcePickerState.js.map +1 -1
  657. package/lib/stores/CubeSpecTransferState.d.ts +2 -2
  658. package/lib/stores/CubeSpecTransferState.js +2 -2
  659. package/lib/stores/LocalModelCatalog.d.ts +2 -0
  660. package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
  661. package/lib/stores/LocalModelCatalog.js +19 -3
  662. package/lib/stores/LocalModelCatalog.js.map +1 -1
  663. package/lib/stores/editors/CubeAggregationRows.d.ts +80 -0
  664. package/lib/stores/editors/CubeAggregationRows.d.ts.map +1 -0
  665. package/lib/stores/editors/CubeAggregationRows.js +164 -0
  666. package/lib/stores/editors/CubeAggregationRows.js.map +1 -0
  667. package/lib/stores/editors/CubeConcatDraft.d.ts +30 -0
  668. package/lib/stores/editors/CubeConcatDraft.d.ts.map +1 -0
  669. package/lib/stores/editors/CubeConcatDraft.js +44 -0
  670. package/lib/stores/editors/CubeConcatDraft.js.map +1 -0
  671. package/lib/stores/editors/CubeDifferenceDraft.d.ts +49 -0
  672. package/lib/stores/editors/CubeDifferenceDraft.d.ts.map +1 -0
  673. package/lib/stores/editors/CubeDifferenceDraft.js +111 -0
  674. package/lib/stores/editors/CubeDifferenceDraft.js.map +1 -0
  675. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts +91 -0
  676. package/lib/stores/editors/CubeExpressionFilterDraft.d.ts.map +1 -0
  677. package/lib/stores/editors/CubeExpressionFilterDraft.js +254 -0
  678. package/lib/stores/editors/CubeExpressionFilterDraft.js.map +1 -0
  679. package/lib/stores/editors/CubeExtendDraft.d.ts +110 -0
  680. package/lib/stores/editors/CubeExtendDraft.d.ts.map +1 -0
  681. package/lib/stores/editors/CubeExtendDraft.js +359 -0
  682. package/lib/stores/editors/CubeExtendDraft.js.map +1 -0
  683. package/lib/stores/editors/CubeFunctionDraft.d.ts +34 -0
  684. package/lib/stores/editors/CubeFunctionDraft.d.ts.map +1 -0
  685. package/lib/stores/editors/CubeFunctionDraft.js +69 -0
  686. package/lib/stores/editors/CubeFunctionDraft.js.map +1 -0
  687. package/lib/stores/editors/CubeGroupDraft.d.ts +61 -0
  688. package/lib/stores/editors/CubeGroupDraft.d.ts.map +1 -0
  689. package/lib/stores/editors/CubeGroupDraft.js +106 -0
  690. package/lib/stores/editors/CubeGroupDraft.js.map +1 -0
  691. package/lib/stores/editors/CubeJoinDraft.d.ts +9 -10
  692. package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -1
  693. package/lib/stores/editors/CubeJoinDraft.js +92 -21
  694. package/lib/stores/editors/CubeJoinDraft.js.map +1 -1
  695. package/lib/stores/editors/CubeJoinKeyPairs.d.ts +38 -0
  696. package/lib/stores/editors/CubeJoinKeyPairs.d.ts.map +1 -0
  697. package/lib/stores/editors/CubeJoinKeyPairs.js +33 -0
  698. package/lib/stores/editors/CubeJoinKeyPairs.js.map +1 -0
  699. package/lib/stores/editors/CubeNodeDraft.d.ts +20 -6
  700. package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -1
  701. package/lib/stores/editors/CubeNodeDraft.js +23 -5
  702. package/lib/stores/editors/CubeNodeDraft.js.map +1 -1
  703. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +4 -2
  704. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
  705. package/lib/stores/editors/CubeNodeDraftRegistry.js +39 -3
  706. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
  707. package/lib/stores/editors/CubePartitionDraft.d.ts +70 -0
  708. package/lib/stores/editors/CubePartitionDraft.d.ts.map +1 -0
  709. package/lib/stores/editors/CubePartitionDraft.js +154 -0
  710. package/lib/stores/editors/CubePartitionDraft.js.map +1 -0
  711. package/lib/stores/editors/CubePivotDraft.d.ts +93 -0
  712. package/lib/stores/editors/CubePivotDraft.d.ts.map +1 -0
  713. package/lib/stores/editors/CubePivotDraft.js +267 -0
  714. package/lib/stores/editors/CubePivotDraft.js.map +1 -0
  715. package/lib/stores/editors/CubeSortDraft.d.ts +2 -10
  716. package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -1
  717. package/lib/stores/editors/CubeSortDraft.js +9 -35
  718. package/lib/stores/editors/CubeSortDraft.js.map +1 -1
  719. package/lib/stores/editors/CubeSortRows.d.ts +34 -0
  720. package/lib/stores/editors/CubeSortRows.d.ts.map +1 -0
  721. package/lib/stores/editors/CubeSortRows.js +50 -0
  722. package/lib/stores/editors/CubeSortRows.js.map +1 -0
  723. package/lib/stores/fixtures/CubeNorthwindModel.d.ts +7 -0
  724. package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -1
  725. package/lib/stores/fixtures/CubeNorthwindModel.js +99 -87
  726. package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -1
  727. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts +26 -0
  728. package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts.map +1 -0
  729. package/lib/stores/fixtures/CubeSalesDuckDbModel.js +46 -0
  730. package/lib/stores/fixtures/CubeSalesDuckDbModel.js.map +1 -0
  731. package/lib/stores/fixtures/CubeSampleSql.d.ts +34 -0
  732. package/lib/stores/fixtures/CubeSampleSql.d.ts.map +1 -0
  733. package/lib/stores/fixtures/CubeSampleSql.js +64 -0
  734. package/lib/stores/fixtures/CubeSampleSql.js.map +1 -0
  735. package/lib/stores/fixtures/CubeSportsModel.d.ts +27 -0
  736. package/lib/stores/fixtures/CubeSportsModel.d.ts.map +1 -0
  737. package/lib/stores/fixtures/CubeSportsModel.js +158 -0
  738. package/lib/stores/fixtures/CubeSportsModel.js.map +1 -0
  739. package/lib/stores/fixtures/CubeTradesModel.d.ts +33 -0
  740. package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -0
  741. package/lib/stores/fixtures/CubeTradesModel.js +227 -0
  742. package/lib/stores/fixtures/CubeTradesModel.js.map +1 -0
  743. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts +71 -0
  744. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts.map +1 -0
  745. package/lib/stores/source-picker/CubeCsvSetupSql.js +392 -0
  746. package/lib/stores/source-picker/CubeCsvSetupSql.js.map +1 -0
  747. package/lib/stores/source-picker/CubeDataProductTabState.d.ts +215 -0
  748. package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -0
  749. package/lib/stores/source-picker/CubeDataProductTabState.js +766 -0
  750. package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -0
  751. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +163 -0
  752. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -0
  753. package/lib/stores/source-picker/CubeDirectConnectionTabState.js +668 -0
  754. package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -0
  755. package/lib/stores/source-picker/CubeIngestTabState.d.ts +127 -0
  756. package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -0
  757. package/lib/stores/source-picker/CubeIngestTabState.js +510 -0
  758. package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -0
  759. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +203 -0
  760. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -0
  761. package/lib/stores/source-picker/CubeInlineModelTabState.js +734 -0
  762. package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -0
  763. package/lib/stores/source-picker/CubeProjectTabState.d.ts +77 -0
  764. package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -0
  765. package/lib/stores/source-picker/CubeProjectTabState.js +206 -0
  766. package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -0
  767. package/lib/stores/source-picker/CubeServiceTabState.d.ts +74 -0
  768. package/lib/stores/source-picker/CubeServiceTabState.d.ts.map +1 -0
  769. package/lib/stores/source-picker/CubeServiceTabState.js +216 -0
  770. package/lib/stores/source-picker/CubeServiceTabState.js.map +1 -0
  771. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +60 -0
  772. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -0
  773. package/lib/stores/source-picker/CubeSourcePickerTab.js +45 -0
  774. package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -0
  775. package/package.json +12 -7
  776. package/src/__lib__/LegendCubeCommand.ts +12 -0
  777. package/src/__lib__/LegendCubeDataProductLabels.ts +91 -0
  778. package/src/__lib__/LegendCubeDirectConnectionLabels.ts +111 -0
  779. package/src/__lib__/LegendCubeFunctionLabels.ts +41 -0
  780. package/src/__lib__/LegendCubeHelpText.ts +48 -2
  781. package/src/__lib__/LegendCubeIngestLabels.ts +40 -0
  782. package/src/__lib__/LegendCubeLabels.ts +327 -12
  783. package/src/__lib__/LegendCubeProjectLabels.ts +25 -0
  784. package/src/__lib__/LegendCubeProjectSourceLabels.ts +26 -0
  785. package/src/__lib__/LegendCubeServiceLabels.ts +41 -0
  786. package/src/__lib__/LegendCubeTesting.ts +8 -0
  787. package/src/__test-utils__/CubeCanvasTestUtils.ts +1 -1
  788. package/src/__test-utils__/CubeConnectionTestSupport.ts +45 -0
  789. package/src/__test-utils__/CubeDirectConnectionFixtures.ts +70 -0
  790. package/src/__test-utils__/CubeEngineTestSupport.ts +40 -1
  791. package/src/__test-utils__/CubeExpressionTestUtils.ts +146 -0
  792. package/src/__test-utils__/CubeFunctionTestOutline.ts +78 -0
  793. package/src/__test-utils__/CubeLambdaCorpus.ts +137 -0
  794. package/src/__test-utils__/CubeOperationsTestUtils.ts +93 -18
  795. package/src/__test-utils__/CubePageTestUtils.tsx +69 -0
  796. package/src/__test-utils__/CubeTestApplication.ts +46 -2
  797. package/src/__test-utils__/FakeCubeConnectionExplorer.ts +111 -0
  798. package/src/__test-utils__/FakeCubeDataProductCatalog.ts +227 -0
  799. package/src/__test-utils__/FakeCubeEngine.ts +52 -1
  800. package/src/__test-utils__/FakeCubeIngestCatalog.ts +198 -0
  801. package/src/__test-utils__/FakeCubeProjectCatalog.ts +89 -0
  802. package/src/__test-utils__/FakeCubeServiceCatalog.ts +57 -0
  803. package/src/components/CubeAddItems.tsx +186 -0
  804. package/src/components/CubeDialogTheme.ts +25 -0
  805. package/src/components/CubeEditor.tsx +195 -140
  806. package/src/components/CubeEntrySourceBanner.tsx +64 -0
  807. package/src/components/CubeFileMenu.tsx +127 -0
  808. package/src/components/CubeLambdaImportBanner.tsx +97 -0
  809. package/src/components/CubeNodeIcon.tsx +20 -0
  810. package/src/components/CubeSchemaColumnsTable.tsx +54 -0
  811. package/src/components/canvas/CubeCanvas.tsx +94 -20
  812. package/src/components/canvas/CubeCanvasContextMenu.tsx +64 -32
  813. package/src/components/canvas/CubeCanvasDnd.ts +16 -9
  814. package/src/components/canvas/CubeCanvasElements.ts +84 -5
  815. package/src/components/canvas/CubeCanvasLayout.ts +1 -1
  816. package/src/components/canvas/CubeCanvasNode.tsx +88 -43
  817. package/src/components/canvas/CubeCanvasNodeFocus.ts +37 -0
  818. package/src/components/canvas/CubeNodeEditorAnchor.ts +82 -0
  819. package/src/components/dev-settings/CubeDevSettings.tsx +154 -0
  820. package/src/components/editors/CubeAggregationRowEditor.tsx +224 -0
  821. package/src/components/editors/CubeColumnChecklist.tsx +136 -0
  822. package/src/components/editors/CubeColumnPicker.tsx +6 -3
  823. package/src/components/editors/CubeConcatEditor.tsx +374 -0
  824. package/src/components/editors/CubeDataProductSourceEditor.tsx +134 -0
  825. package/src/components/editors/CubeDifferenceEditor.tsx +87 -0
  826. package/src/components/editors/CubeExpressionFilterEditor.tsx +193 -0
  827. package/src/components/editors/CubeExtendEditor.tsx +271 -0
  828. package/src/components/editors/CubeFilterEditor.tsx +20 -1
  829. package/src/components/editors/CubeFunctionSourceEditor.tsx +140 -0
  830. package/src/components/editors/CubeGroupEditor.tsx +135 -0
  831. package/src/components/editors/CubeIngestSourceEditor.tsx +104 -0
  832. package/src/components/editors/CubeJoinEditor.tsx +34 -135
  833. package/src/components/editors/CubeJoinKeyRows.tsx +183 -0
  834. package/src/components/editors/CubeNodeEditorPanel.tsx +111 -36
  835. package/src/components/editors/CubeNodeEditorPopper.tsx +191 -0
  836. package/src/components/editors/CubeNodeEditorRegistry.ts +33 -0
  837. package/src/components/editors/CubePartitionEditor.tsx +208 -0
  838. package/src/components/editors/CubePivotEditor.tsx +277 -0
  839. package/src/components/editors/CubeRenameEditor.tsx +10 -5
  840. package/src/components/editors/CubeRestrictEditor.tsx +9 -3
  841. package/src/components/editors/CubeServiceSourceEditor.tsx +77 -0
  842. package/src/components/editors/CubeSortEditor.tsx +20 -142
  843. package/src/components/editors/CubeSortRowEditor.tsx +176 -0
  844. package/src/components/editors/CubeSourceEditor.tsx +42 -30
  845. package/src/components/editors/CubeWarehouseControl.tsx +113 -0
  846. package/src/components/editors/useCubeNodeEditorDismiss.ts +103 -0
  847. package/src/components/examples/CubeExamplesDialog.tsx +199 -0
  848. package/src/components/grid/CubeColumnFormatDialog.tsx +289 -0
  849. package/src/components/grid/CubeDrilldownBar.tsx +219 -0
  850. package/src/components/grid/CubeGridRegion.tsx +214 -60
  851. package/src/components/grid/CubeGridValues.ts +201 -1
  852. package/src/components/grid/CubeResultGrid.tsx +461 -43
  853. package/src/components/grid/CubeRunStatsPanel.tsx +156 -0
  854. package/src/components/grid/CubeServerSideGrid.tsx +200 -0
  855. package/src/components/grid/CubeSqlDialog.tsx +90 -0
  856. package/src/components/grid/CubeSqlFormat.ts +37 -0
  857. package/src/components/palette/CubePalette.tsx +70 -19
  858. package/src/components/show-pure/CubeShowPureDialog.tsx +19 -5
  859. package/src/components/source-picker/CubeDataProductTab.tsx +486 -0
  860. package/src/components/source-picker/CubeDirectConnectionTab.tsx +352 -0
  861. package/src/components/source-picker/CubeFunctionSteps.tsx +244 -0
  862. package/src/components/source-picker/CubeIngestTab.tsx +312 -0
  863. package/src/components/source-picker/CubeInlineModelTab.tsx +220 -0
  864. package/src/components/source-picker/CubePickerListItem.tsx +118 -0
  865. package/src/components/source-picker/CubePickerStep.tsx +49 -0
  866. package/src/components/source-picker/CubeProjectTab.tsx +117 -0
  867. package/src/components/source-picker/CubeServiceTab.tsx +151 -0
  868. package/src/components/source-picker/CubeSourcePicker.tsx +99 -228
  869. package/src/components/source-picker/CubeTablePreview.tsx +49 -0
  870. package/src/components/spec-transfer/CubeImportPureDialog.tsx +122 -0
  871. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +22 -9
  872. package/src/graph-manager/CubeConnectionExplorer.ts +106 -0
  873. package/src/graph-manager/CubeDataProduct.ts +150 -0
  874. package/src/graph-manager/CubeDataProductCatalog.ts +256 -0
  875. package/src/graph-manager/CubeDirectConnection.ts +67 -0
  876. package/src/graph-manager/CubeEngine.ts +94 -2
  877. package/src/graph-manager/CubeEngineClientSettings.ts +64 -0
  878. package/src/graph-manager/CubeIngest.ts +159 -0
  879. package/src/graph-manager/CubeIngestCatalog.ts +202 -0
  880. package/src/graph-manager/CubeLakehouseEnvironment.ts +27 -0
  881. package/src/graph-manager/CubeLakehouseRuntime.ts +43 -0
  882. package/src/graph-manager/CubeProject.ts +117 -0
  883. package/src/graph-manager/CubeProjectCatalog.ts +40 -0
  884. package/src/graph-manager/CubeService.ts +29 -0
  885. package/src/graph-manager/CubeServiceCatalog.ts +35 -0
  886. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +256 -2
  887. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.ts +251 -0
  888. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +107 -0
  889. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.ts +339 -0
  890. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectModel.ts +151 -0
  891. package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +45 -4
  892. package/src/graph-manager/protocol/pure/v1/V1_CubeExpression.ts +89 -0
  893. package/src/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.ts +312 -0
  894. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +227 -0
  895. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +174 -0
  896. package/src/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.ts +141 -0
  897. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.ts +471 -0
  898. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +153 -18
  899. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +3 -1
  900. package/src/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.ts +361 -0
  901. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +122 -0
  902. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.ts +744 -0
  903. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +1083 -25
  904. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.ts +459 -0
  905. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +152 -0
  906. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.ts +92 -0
  907. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.ts +61 -0
  908. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.ts +337 -0
  909. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.ts +206 -0
  910. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +48 -2
  911. package/src/index.ts +52 -2
  912. package/src/stores/CubeAddPlacement.ts +87 -0
  913. package/src/stores/CubeDataProductRecheck.ts +93 -0
  914. package/src/stores/CubeDataProductRuntimeState.ts +256 -0
  915. package/src/stores/CubeDataProductWarehouse.ts +40 -0
  916. package/src/stores/CubeDevSettingsState.ts +117 -0
  917. package/src/stores/CubeEditorState.ts +1030 -92
  918. package/src/stores/CubeEngineChecks.ts +240 -0
  919. package/src/stores/CubeEntrySource.ts +278 -0
  920. package/src/stores/CubeExamples.ts +526 -0
  921. package/src/stores/CubeExamplesState.ts +110 -0
  922. package/src/stores/CubeExecutionState.ts +50 -62
  923. package/src/stores/CubeExportState.ts +196 -0
  924. package/src/stores/CubeExpressionFilterCheck.ts +218 -0
  925. package/src/stores/CubeExtendTyping.ts +251 -0
  926. package/src/stores/CubeFunctionRecheck.ts +97 -0
  927. package/src/stores/CubeGridFetcher.ts +302 -0
  928. package/src/stores/CubeGridQuickActions.ts +97 -20
  929. package/src/stores/CubeGridState.ts +450 -0
  930. package/src/stores/CubeHost.ts +119 -1
  931. package/src/stores/CubeIngestRecheck.ts +92 -0
  932. package/src/stores/CubeLambdaImportState.ts +434 -0
  933. package/src/stores/CubeLambdaSources.ts +390 -0
  934. package/src/stores/CubeNodeEditorState.ts +278 -9
  935. package/src/stores/CubeQueryRun.ts +169 -0
  936. package/src/stores/CubeRunStatsState.ts +91 -0
  937. package/src/stores/CubeRunningStepLambda.ts +62 -0
  938. package/src/stores/CubeServiceRecheck.ts +53 -0
  939. package/src/stores/CubeShowPureState.ts +57 -15
  940. package/src/stores/CubeSourcePickerState.ts +231 -325
  941. package/src/stores/CubeSpecTransferState.ts +2 -2
  942. package/src/stores/LocalModelCatalog.ts +27 -3
  943. package/src/stores/editors/CubeAggregationRows.ts +299 -0
  944. package/src/stores/editors/CubeConcatDraft.ts +49 -0
  945. package/src/stores/editors/CubeDifferenceDraft.ts +147 -0
  946. package/src/stores/editors/CubeExpressionFilterDraft.ts +385 -0
  947. package/src/stores/editors/CubeExtendDraft.ts +532 -0
  948. package/src/stores/editors/CubeFunctionDraft.ts +92 -0
  949. package/src/stores/editors/CubeGroupDraft.ts +145 -0
  950. package/src/stores/editors/CubeJoinDraft.ts +130 -41
  951. package/src/stores/editors/CubeJoinKeyPairs.ts +68 -0
  952. package/src/stores/editors/CubeNodeDraft.ts +26 -6
  953. package/src/stores/editors/CubeNodeDraftRegistry.ts +52 -2
  954. package/src/stores/editors/CubePartitionDraft.ts +214 -0
  955. package/src/stores/editors/CubePivotDraft.ts +355 -0
  956. package/src/stores/editors/CubeSortDraft.ts +17 -54
  957. package/src/stores/editors/CubeSortRows.ts +84 -0
  958. package/src/stores/fixtures/CubeNorthwindModel.ts +103 -88
  959. package/src/stores/fixtures/CubeSalesDuckDbModel.ts +54 -0
  960. package/src/stores/fixtures/CubeSampleSql.ts +85 -0
  961. package/src/stores/fixtures/CubeSportsModel.ts +182 -0
  962. package/src/stores/fixtures/CubeTradesModel.ts +276 -0
  963. package/src/stores/source-picker/CubeCsvSetupSql.ts +444 -0
  964. package/src/stores/source-picker/CubeDataProductTabState.ts +966 -0
  965. package/src/stores/source-picker/CubeDirectConnectionTabState.ts +846 -0
  966. package/src/stores/source-picker/CubeIngestTabState.ts +625 -0
  967. package/src/stores/source-picker/CubeInlineModelTabState.ts +928 -0
  968. package/src/stores/source-picker/CubeProjectTabState.ts +250 -0
  969. package/src/stores/source-picker/CubeServiceTabState.ts +288 -0
  970. package/src/stores/source-picker/CubeSourcePickerTab.ts +79 -0
  971. package/tsconfig.json +139 -0
@@ -13,15 +13,40 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { buildSchemasAndValidity, createNodeRegistry, CubeDocument, diffSchemas, findLostSortOrders, MESSAGE_SORT_COLUMNS_CUT, MESSAGE_SORT_COLUMNS_DROPPED, MESSAGE_SORT_ORDER_LOST, QueryEmitter, RelationalTableSource, rereadQueryFilterValues, } from '@finos/legend-cube';
17
- import { action, computed, flow, flowResult, makeObservable, observable, } from 'mobx';
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
+ import { action, computed, flow, flowResult, makeObservable, observable, reaction, } from 'mobx';
18
18
  import { LEGEND_CUBE_COMMAND_KEY } from '../__lib__/LegendCubeCommand.js';
19
+ import { LEGEND_CUBE_TEST_ID } from '../__lib__/LegendCubeTesting.js';
19
20
  import { CUBE_EDITOR_CLOSED_REASON, DEFAULT_ROW_LIMIT, getSchemaDriftWarning, getSourceRecheckWarning, LEGEND_CUBE_USER_DATA_KEY, MAX_UNDO_STEPS, } from '../__lib__/LegendCubeLabels.js';
21
+ import { CUBE_DATA_PRODUCT_RECHECK_MESSAGE, getAccessPointDriftWarning, getAccessPointRecheckWarning, } from '../__lib__/LegendCubeDataProductLabels.js';
22
+ import { CUBE_INGEST_RECHECK_MESSAGE, getDataSetDriftWarning, getDataSetRecheckWarning, } from '../__lib__/LegendCubeIngestLabels.js';
23
+ import { isCubeDataProductModel } from '../graph-manager/CubeDataProduct.js';
24
+ import { isCubeIngestModel } from '../graph-manager/CubeIngest.js';
25
+ import { isCubeServiceModel } from '../graph-manager/CubeService.js';
20
26
  import { CubeEngineError, CubeEngineErrorKind, } from '../graph-manager/CubeEngine.js';
27
+ import { CUBE_LAKEHOUSE_RUNTIME_KIND, getLakehouseDatabaseType, } from '../graph-manager/CubeLakehouseRuntime.js';
21
28
  import { getDatabaseType } from '../graph-manager/CubeModelOutlineHelper.js';
29
+ import { recheckCubeDataProductSources } from './CubeDataProductRecheck.js';
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';
34
+ import { CubeDataProductRuntimeState } from './CubeDataProductRuntimeState.js';
35
+ import { CubeExamplesState } from './CubeExamplesState.js';
36
+ import { CubeExportState } from './CubeExportState.js';
37
+ import { CubeGridFetcher } from './CubeGridFetcher.js';
38
+ import { CubeGridState } from './CubeGridState.js';
39
+ import { CubeDevSettingsState } from './CubeDevSettingsState.js';
40
+ import { CubeRunStatsState } from './CubeRunStatsState.js';
22
41
  import { CubeExecutionState } from './CubeExecutionState.js';
42
+ import { CubeExpressionFilterDraft } from './editors/CubeExpressionFilterDraft.js';
43
+ import { CubeExtendDraft } from './editors/CubeExtendDraft.js';
44
+ import { buildCubeEngineCheckRequest, createStaleCubeEngineCheckRule, getCubeEngineCheckUpstream, isCubeEngineCheckedNode, } from './CubeEngineChecks.js';
45
+ import { getCubeExtendUpstream } from './CubeExtendTyping.js';
46
+ import { loadCubeModelOutline } from './CubeHost.js';
23
47
  import { CubeNodeEditorState } from './CubeNodeEditorState.js';
24
48
  import { CubeShowPureState } from './CubeShowPureState.js';
49
+ import { CubeLambdaImportState } from './CubeLambdaImportState.js';
25
50
  import { CubeSourcePickerState } from './CubeSourcePickerState.js';
26
51
  import { CubeSpecTransferState } from './CubeSpecTransferState.js';
27
52
  const isValidRowLimit = (value) => value !== undefined && Number.isSafeInteger(value) && value >= 1;
@@ -32,6 +57,8 @@ const isTypingText = () => {
32
57
  element instanceof HTMLTextAreaElement ||
33
58
  (element instanceof HTMLElement && element.isContentEditable));
34
59
  };
60
+ /** Focus is in the node editor, whose shortcuts give it back to the node (PLAN §11.8) */
61
+ const isFocusInNodeEditor = () => document.activeElement?.closest(`[data-testid="${LEGEND_CUBE_TEST_ID.NODE_EDITOR}"]`) !== null && document.activeElement !== null;
35
62
  /**
36
63
  * The state of one Cube page (PLAN §7.8). The document is immutable: every
37
64
  * edit makes a new one through `applyDocument`, which keeps the previous one
@@ -42,14 +69,52 @@ export class CubeEditorState {
42
69
  host;
43
70
  /** One registry for inference, emission and the saved spec */
44
71
  registry;
72
+ /**
73
+ * The editor's own query rule: an Extend typed, or a Filter by Expression
74
+ * checked, for another input than its own waits to be checked again (PLAN
75
+ * §11.7, §11.11)
76
+ */
77
+ staleEngineChecks;
78
+ /**
79
+ * The editor's query rule for the database a node runs on: `%` or `_`
80
+ * given to a pattern on DuckDB (PLAN §11.11), once the model's outline
81
+ * tells the database
82
+ */
83
+ databaseRefusals;
45
84
  execution;
85
+ /** The latest runs, fetches and exports (spec §12.6) */
86
+ runStats;
87
+ /** The Dev Settings, at the top left (PLAN §11.16) */
88
+ devSettings;
89
+ /** The grid's server-side levels (PLAN §11.10) */
90
+ gridFetcher;
91
+ /** The grid's mode and its server-side levels (PLAN §11.10) */
92
+ grid;
93
+ /** The results' export (spec §12.5) */
94
+ export;
95
+ /** Where a lakehouse cube runs, a data product's or an ingest one's: its class and warehouse */
96
+ dataProductRuntime;
46
97
  sourcePicker;
47
98
  specTransfer;
99
+ examples;
48
100
  showPure;
101
+ /** Import Pure: the lambda the page opened on, read into the cube (PLAN §11.18) */
102
+ lambdaImport;
49
103
  nodeEditor;
50
104
  document;
51
105
  /** Earlier documents, oldest first */
52
106
  history = [];
107
+ /**
108
+ * The step copied last, as it was, with the cube's context then, which a
109
+ * pasted source needs; kept for the page, across cubes
110
+ */
111
+ copiedNode;
112
+ /**
113
+ * The changes undone, the latest last, to redo; a new change clears them.
114
+ * Each keeps whether it was read-only and whether undoing it left another
115
+ * cube (an import), so a redo restores both
116
+ */
117
+ redoStack = [];
53
118
  /** Engine errors by node id: shown with the node's own errors, never part of inference */
54
119
  hostIssues = new Map();
55
120
  /**
@@ -58,13 +123,28 @@ export class CubeEditorState {
58
123
  */
59
124
  warnings = new Map();
60
125
  /**
61
- * The outline of each model the cube used, loaded when an editor needs it,
62
- * e.g. for the Join's 'type unknown' warning; by reference, never observed
63
- * deeply
126
+ * The outline of each model the cube used, by the model's JSON
127
+ * (`modelKey`): loaded when the cube reads a table, or an editor or a run
128
+ * needs it, e.g. for the Join's 'type unknown' warning or the database a
129
+ * node runs on (PLAN §11.12); by reference, never observed deeply
64
130
  */
65
131
  modelOutlines = new Map();
132
+ /** Each model's key in `modelOutlines`, its JSON, worked out once per model object */
133
+ modelKeys = new WeakMap();
134
+ /** The outlines on their way, by model key, so a second load waits for the first */
135
+ loadingOutlines = new Map();
66
136
  /** Sources sent to the engine to be typed again, until it answers */
67
137
  pendingSources = new Set();
138
+ /** Extends and Filters by Expression sent to the engine to be checked, until it answers (PLAN §11.7, §11.11) */
139
+ checkingNodes = new Set();
140
+ /** Checks the nodes that wait for the engine, whenever one does (PLAN §11.7 Q4) */
141
+ rechecking;
142
+ /**
143
+ * Loads the model's outline once the cube reads a table, so the database it
144
+ * runs on is known before any run: some nodes are refused there, or written
145
+ * another way (PLAN §11.4, §11.11, §11.12)
146
+ */
147
+ outlineLoading;
68
148
  /** The rows a run returns; kept per user, never in the cube */
69
149
  rowLimit;
70
150
  /** The palette shows icons only; kept per user, never in the cube */
@@ -81,11 +161,18 @@ export class CubeEditorState {
81
161
  constructor(host, document = new CubeDocument()) {
82
162
  makeObservable(this, {
83
163
  pendingSources: observable.ref,
164
+ checkingNodes: observable.ref,
165
+ nodesToCheck: computed,
166
+ isCheckingExpressions: computed,
167
+ checkExpressions: flow,
84
168
  modelOutlines: observable.ref,
85
169
  modelOutline: computed,
86
170
  loadModelOutline: flow,
87
171
  document: observable.ref,
88
172
  history: observable.ref,
173
+ redoStack: observable.ref,
174
+ canRedo: computed,
175
+ redo: action,
89
176
  hostIssues: observable.ref,
90
177
  warnings: observable.ref,
91
178
  derivedWarnings: computed,
@@ -96,10 +183,17 @@ export class CubeEditorState {
96
183
  analysis: computed,
97
184
  emitter: computed,
98
185
  canUndo: computed,
186
+ hasEditsToApply: computed,
187
+ executeEdited: action,
188
+ undoEdited: action,
189
+ redoEdited: action,
99
190
  isDialogOpen: computed,
100
191
  applyDocument: action,
101
192
  undo: action,
102
193
  importDocument: action,
194
+ openDocument: action,
195
+ startNewCube: action,
196
+ isEmptyCube: computed,
103
197
  reresolveSources: flow,
104
198
  refreshSource: flow,
105
199
  applyQuery: action,
@@ -109,15 +203,28 @@ export class CubeEditorState {
109
203
  addConfiguredNode: action,
110
204
  dropNode: action,
111
205
  removeNode: action,
206
+ copiedNode: observable.ref,
207
+ canPaste: computed,
208
+ copyNode: action,
209
+ pasteNode: action,
210
+ duplicateNode: action,
112
211
  swapInputs: action,
113
212
  setShowGraph: action,
114
213
  setPaletteCollapsed: action,
115
214
  setHostIssue: action,
116
215
  clearHostIssues: action,
117
216
  setRowLimit: action,
217
+ setColumnWidth: action,
118
218
  });
119
219
  this.host = host;
120
220
  this.registry = createNodeRegistry();
221
+ this.staleEngineChecks = createStaleCubeEngineCheckRule(this.registry, () => this.document.context?.model);
222
+ this.databaseRefusals = (query) => new Map(query.nodes
223
+ .map((node) => [
224
+ node.id,
225
+ this.getNodeDatabaseProblems(query, node),
226
+ ])
227
+ .filter(([, problems]) => problems.length > 0));
121
228
  this.document = document;
122
229
  const storedLimit = host.applicationStore.userDataService.getNumericValue(LEGEND_CUBE_USER_DATA_KEY.ROW_LIMIT);
123
230
  this.rowLimit = isValidRowLimit(storedLimit)
@@ -126,14 +233,44 @@ export class CubeEditorState {
126
233
  this.isPaletteCollapsed =
127
234
  host.applicationStore.userDataService.getBooleanValue(LEGEND_CUBE_USER_DATA_KEY.PALETTE_COLLAPSED) ?? false;
128
235
  this.execution = new CubeExecutionState(this);
236
+ this.runStats = new CubeRunStatsState();
237
+ this.devSettings = new CubeDevSettingsState(host);
238
+ this.gridFetcher = new CubeGridFetcher(this);
239
+ this.grid = new CubeGridState(this);
240
+ this.export = new CubeExportState(this);
241
+ this.dataProductRuntime = new CubeDataProductRuntimeState(this);
129
242
  this.sourcePicker = new CubeSourcePickerState(this);
130
243
  this.specTransfer = new CubeSpecTransferState(this);
244
+ this.examples = new CubeExamplesState(this);
131
245
  this.showPure = new CubeShowPureState(this);
246
+ this.lambdaImport = new CubeLambdaImportState(this);
132
247
  this.nodeEditor = new CubeNodeEditorState(this);
248
+ this.rechecking = reaction(() => this.nodesToCheck, (waiting) => {
249
+ if (waiting.length) {
250
+ flowResult(this.checkExpressions(waiting)).catch(this.host.applicationStore.alertUnhandledError);
251
+ }
252
+ }, { fireImmediately: true });
253
+ // the model, while the cube reads a table: another model loads too
254
+ this.outlineLoading = reaction(() => this.document.query.nodes.some((node) => node instanceof RelationalTableSource)
255
+ ? this.document.context?.model
256
+ : undefined, (model) => {
257
+ if (model !== undefined) {
258
+ flowResult(this.loadModelOutline(model)).catch(this.host.applicationStore.alertUnhandledError);
259
+ }
260
+ }, { fireImmediately: true });
133
261
  }
134
- /** Each node's schema and errors, query-level rules included, as the emitter sees them */
262
+ /**
263
+ * Each node's schema and errors, query-level rules included, as the
264
+ * emitter sees them; an Extend or a Filter by Expression checked for
265
+ * another input than its own waiting, and a filter its database would
266
+ * misread refused, which only the editor can tell
267
+ */
135
268
  get analysis() {
136
- return buildSchemasAndValidity(this.document.query, this.registry.queryRules);
269
+ return buildSchemasAndValidity(this.document.query, [
270
+ ...this.registry.queryRules,
271
+ this.staleEngineChecks,
272
+ this.databaseRefusals,
273
+ ]);
137
274
  }
138
275
  get emitter() {
139
276
  return new QueryEmitter(this.document.query, this.registry);
@@ -146,6 +283,103 @@ export class CubeEditorState {
146
283
  isPendingSource(node) {
147
284
  return this.pendingSources.has(node);
148
285
  }
286
+ /**
287
+ * The Extends and Filters by Expression of the cube shown that wait for
288
+ * the engine, their input valid, and that aren't being checked (PLAN §11.7,
289
+ * §11.11): new expressions, or an input that changed
290
+ */
291
+ get nodesToCheck() {
292
+ const { validity } = this.analysis;
293
+ return this.document.query.nodes.filter((node) => isCubeEngineCheckedNode(node) &&
294
+ !this.checkingNodes.has(node) &&
295
+ (validity.get(node.id) ?? []).some(isTypingError));
296
+ }
297
+ /** The cube shown has expressions the engine is checking: an Extend's columns, a filter's condition */
298
+ get isCheckingExpressions() {
299
+ return this.document.query.nodes.some((node) => this.checkingNodes.has(node));
300
+ }
301
+ /** The node waits for the engine to check it, or is being checked: an Extend or a Filter by Expression (PLAN §11.7, §11.11) */
302
+ isTypingNode(node) {
303
+ return (this.checkingNodes.has(node) ||
304
+ (this.analysis.validity.get(node.id) ?? []).some(isTypingError));
305
+ }
306
+ /**
307
+ * Checks expressions with the engine, in one call, outside the undo history
308
+ * (PLAN §11.7 Q4, §11.11): an Extend's columns typed, a Filter by
309
+ * Expression's condition checked, each for the input it has now, after its
310
+ * input's relation, as typing types any node. The check goes in place of
311
+ * the very nodes sent, in the cube shown and the undo snapshots that give
312
+ * the engine the same input; one the user changed meanwhile is left to
313
+ * check again. Each check records the input as the engine was given it
314
+ * (`upstream`). A check the engine couldn't give says why; when the engine
315
+ * can't be reached, a check still current for the input is kept, with a
316
+ * warning, as a source's saved columns are.
317
+ */
318
+ *checkExpressions(nodes) {
319
+ const { context, query } = this.document;
320
+ if (!context) {
321
+ return;
322
+ }
323
+ const { schemas } = this.analysis;
324
+ const emitter = new QueryEmitter(query, this.registry);
325
+ const requests = nodes.flatMap((node) => {
326
+ const [inputId] = query.getInputIds(node.id);
327
+ const input = inputId === undefined ? undefined : schemas.get(inputId);
328
+ if (query.getNode(node.id) !== node ||
329
+ this.checkingNodes.has(node) ||
330
+ !input) {
331
+ return [];
332
+ }
333
+ const request = buildCubeEngineCheckRequest(query, node, input, getCubeExtendUpstream(emitter, node.id, context.model), this.registry);
334
+ return request ? [request] : [];
335
+ });
336
+ if (!requests.length) {
337
+ return;
338
+ }
339
+ const sent = requests.map(({ node }) => node);
340
+ this.checkingNodes = new Set([...this.checkingNodes, ...sent]);
341
+ let answers;
342
+ try {
343
+ answers = (yield this.host.engine.typeLambdas(context.model, new Map(requests.flatMap(({ lambdas }) => [...lambdas]))));
344
+ }
345
+ catch (error) {
346
+ const failure = error instanceof CubeEngineError
347
+ ? error
348
+ : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error ? error.message : String(error));
349
+ answers = new Map(requests.flatMap(({ lambdas }) => [...lambdas.keys()].map((key) => [key, failure])));
350
+ }
351
+ finally {
352
+ this.checkingNodes = new Set([...this.checkingNodes].filter((node) => !sent.includes(node)));
353
+ }
354
+ // a check that comes back the same leaves its node, and the query, alone
355
+ const warnings = new Map(this.warnings);
356
+ const replacements = new Map(requests.flatMap((request) => {
357
+ const { node } = request;
358
+ const outcome = request.read(answers);
359
+ if (outcome.keptWarning !== undefined) {
360
+ warnings.set(node.key, [outcome.keptWarning]);
361
+ return [];
362
+ }
363
+ warnings.delete(node.key);
364
+ return outcome.node ? [[node, outcome.node]] : [];
365
+ }));
366
+ this.warnings = warnings;
367
+ // an undo snapshot whose input differs keeps the check it had
368
+ const emitters = new Map([[query, emitter]]);
369
+ this.replaceOutsideHistory(replacements, (snapshot, resolved) => {
370
+ const upstream = getCubeEngineCheckUpstream(resolved);
371
+ if (upstream === undefined) {
372
+ return true;
373
+ }
374
+ let snapshotEmitter = emitters.get(snapshot);
375
+ if (!snapshotEmitter) {
376
+ snapshotEmitter = new QueryEmitter(snapshot, this.registry);
377
+ emitters.set(snapshot, snapshotEmitter);
378
+ }
379
+ return (getCubeExtendUpstream(snapshotEmitter, resolved.id, context.model) ===
380
+ upstream);
381
+ });
382
+ }
149
383
  /**
150
384
  * Warnings worked out from the query, by node id: a Sort whose order is
151
385
  * lost before it is used (PLAN §11.4). Never stored and never errors, so
@@ -200,18 +434,34 @@ export class CubeEditorState {
200
434
  const model = this.document.context?.model;
201
435
  return model === undefined ? undefined : this.getModelOutline(model);
202
436
  }
437
+ /**
438
+ * A model's key for its outline: its JSON, so a cube imported on the same
439
+ * model, a new object with the same content, shares the outline loaded
440
+ */
441
+ modelKey(model) {
442
+ let key = this.modelKeys.get(model);
443
+ if (key === undefined) {
444
+ key = JSON.stringify(model);
445
+ this.modelKeys.set(model, key);
446
+ }
447
+ return key;
448
+ }
203
449
  /** The outline of a model, once loaded */
204
450
  getModelOutline(model) {
205
- return this.modelOutlines.get(model);
451
+ return this.modelOutlines.get(this.modelKey(model));
206
452
  }
207
453
  /**
208
454
  * The database type a run of the query up to the node needs, with the
209
- * model's runtime (PLAN §11.4), from the model's outline once it is loaded
210
- * (`loadModelOutline`): the type of the runtime's connections to the
211
- * databases the node reads. None without an outline, which writes every
212
- * operation the native way.
455
+ * model's runtime (PLAN §11.4): for a data product or ingest cube, the
456
+ * database its lakehouse runtime routes to (§11.12); else, from the model's
457
+ * outline once it is loaded (`loadModelOutline`), the type of the runtime's
458
+ * connections to the databases the node reads. None without an outline,
459
+ * which writes every operation the native way.
213
460
  */
214
461
  getRunDatabaseType(query, nodeId, model, runtime) {
462
+ if (isCubeDataProductModel(model) || isCubeIngestModel(model)) {
463
+ return getLakehouseDatabaseType(CUBE_LAKEHOUSE_RUNTIME_KIND);
464
+ }
215
465
  const outline = this.getModelOutline(model);
216
466
  if (!outline) {
217
467
  return undefined;
@@ -222,6 +472,12 @@ export class CubeEditorState {
222
472
  if (node instanceof RelationalTableSource) {
223
473
  databases.add(node.database);
224
474
  }
475
+ else if (node instanceof FunctionSource) {
476
+ // a function reads what Cube can't see: any database of the runtime
477
+ outline.runtimes
478
+ .find(({ path }) => path === runtime)
479
+ ?.connections?.forEach(({ storePath }) => databases.add(storePath));
480
+ }
225
481
  query
226
482
  .getInputIds(id)
227
483
  .forEach((inputId) => inputId !== undefined && visit(inputId));
@@ -230,25 +486,72 @@ export class CubeEditorState {
230
486
  return getDatabaseType(outline, runtime, [...databases]);
231
487
  }
232
488
  /**
233
- * Loads the outline of a model, the cube's by default, once per model. It
234
- * only adds warnings and database types, so a model that fails to load
235
- * shows none and runs every operation the native way.
489
+ * A node's problems on the database the query up to it runs on, with the
490
+ * cube's runtime (`getRunDatabaseType`): a Pivot where it can't run (PLAN
491
+ * §11.12); a filter giving `%` or `_` to a pattern on DuckDB, which would
492
+ * match them as wildcards (§11.11). None when the database isn't known.
493
+ */
494
+ getNodeDatabaseProblems(query, node) {
495
+ const { context } = this.document;
496
+ const runtime = context?.runtime;
497
+ if (!context || runtime === undefined || !dependsOnDatabaseType(node)) {
498
+ return [];
499
+ }
500
+ return getDatabaseProblems(node, this.getRunDatabaseType(query, node.id, context.model, runtime));
501
+ }
502
+ /**
503
+ * Why a node of the type can't be added after the node, on the database the
504
+ * query up to that node runs on (PLAN §11.12): a Pivot where it can't run.
505
+ * `undefined` when it can, or the database isn't known.
506
+ */
507
+ getAddDatabaseProblem(type, afterId) {
508
+ const { context, query } = this.document;
509
+ const runtime = context?.runtime;
510
+ if (!context || runtime === undefined || afterId === undefined) {
511
+ return undefined;
512
+ }
513
+ return getDatabaseProblemOfType(type, this.getRunDatabaseType(query, afterId, context.model, runtime));
514
+ }
515
+ /**
516
+ * Loads the outline of a model, the cube's by default, once per model: a
517
+ * load already on its way is waited for, not started again, e.g. a run's
518
+ * while the cube's opening load is still out. It only adds warnings,
519
+ * database types and a database's refusals (PLAN §11.11, §11.12), so a
520
+ * model that fails to load shows none and runs every operation the native
521
+ * way.
236
522
  */
237
523
  *loadModelOutline(model = this.document.context?.model) {
238
- if (model === undefined || this.modelOutlines.has(model)) {
524
+ if (model === undefined) {
525
+ return;
526
+ }
527
+ const key = this.modelKey(model);
528
+ if (this.modelOutlines.has(key)) {
239
529
  return;
240
530
  }
531
+ let loading = this.loadingOutlines.get(key);
532
+ if (!loading) {
533
+ loading = loadCubeModelOutline(this.host, model);
534
+ this.loadingOutlines.set(key, loading);
535
+ }
241
536
  try {
242
- const outline = (yield this.host.modelCatalog.loadOutline(model));
243
- this.modelOutlines = new Map([...this.modelOutlines, [model, outline]]);
537
+ const outline = (yield loading);
538
+ if (!this.modelOutlines.has(key)) {
539
+ this.modelOutlines = new Map([...this.modelOutlines, [key, outline]]);
540
+ }
244
541
  }
245
542
  catch {
246
543
  // no outline, no warning: nothing is blocked on it
247
544
  }
545
+ finally {
546
+ this.loadingOutlines.delete(key);
547
+ }
248
548
  }
249
- /** One of Cube's dialogs is open: the source picker, Import or Export, Show Pure */
549
+ /** One of Cube's dialogs is open: the source picker, Examples, the group rows' settings, Import or Export, Show Pure */
250
550
  get isDialogOpen() {
251
551
  return (this.sourcePicker.isOpen ||
552
+ this.examples.isOpen ||
553
+ this.grid.isSettingsShown ||
554
+ this.grid.formatColumn !== undefined ||
252
555
  this.specTransfer.mode !== undefined ||
253
556
  this.showPure.isOpen);
254
557
  }
@@ -256,31 +559,92 @@ export class CubeEditorState {
256
559
  * The page's keyboard shortcuts, while it is open (spec §17.12). Each does
257
560
  * nothing when its button can't be used, and nothing while a Cube dialog
258
561
  * is open, since a dialog doesn't stop the app's shortcuts (user's choice,
259
- * 2026-10-07). Undo leaves Ctrl+Z to a text field that has the focus.
562
+ * 2026-10-07), or while something opened from the node editor holds it
563
+ * open. Like their buttons, they finish the node editor first (PLAN §11.8):
564
+ * F9 runs the edited query, and Ctrl+Z undoes what finishing applied. Undo
565
+ * leaves Ctrl+Z to a text field that has the focus.
260
566
  */
261
567
  registerCommands() {
262
- const { commandService, alertUnhandledError } = this.host.applicationStore;
568
+ const { commandService } = this.host.applicationStore;
263
569
  commandService.registerCommand({
264
570
  key: LEGEND_CUBE_COMMAND_KEY.EXECUTE,
265
571
  trigger: () => !this.isDialogOpen &&
266
- this.execution.canExecute &&
267
- !this.execution.isRunning,
572
+ !this.nodeEditor.isHeld &&
573
+ !this.execution.isRunning &&
574
+ (this.execution.canExecute || this.hasEditsToApply),
575
+ action: () => this.nodeEditor.runFromKeyboard(() => this.executeEdited(), isFocusInNodeEditor()),
576
+ });
577
+ // F10 in the Extend and Filter by Expression editors (PLAN §11.7, §11.11)
578
+ commandService.registerCommand({
579
+ key: LEGEND_CUBE_COMMAND_KEY.VALIDATE_EXPRESSIONS,
580
+ trigger: () => {
581
+ const { draft } = this.nodeEditor;
582
+ return (!this.isDialogOpen &&
583
+ !this.readOnly &&
584
+ (draft instanceof CubeExtendDraft ||
585
+ draft instanceof CubeExpressionFilterDraft) &&
586
+ !draft.validating);
587
+ },
268
588
  action: () => {
269
- flowResult(this.execution.execute()).catch(alertUnhandledError);
589
+ const { draft } = this.nodeEditor;
590
+ if (draft instanceof CubeExtendDraft ||
591
+ draft instanceof CubeExpressionFilterDraft) {
592
+ flowResult(draft.validate()).catch(this.host.applicationStore.alertUnhandledError);
593
+ }
270
594
  },
271
595
  });
596
+ commandService.registerCommand({
597
+ key: LEGEND_CUBE_COMMAND_KEY.REDO,
598
+ trigger: () => !this.isDialogOpen &&
599
+ !this.nodeEditor.isHeld &&
600
+ this.canRedo &&
601
+ !isTypingText(),
602
+ action: () => this.nodeEditor.runFromKeyboard(() => this.redoEdited(), isFocusInNodeEditor()),
603
+ });
272
604
  commandService.registerCommand({
273
605
  key: LEGEND_CUBE_COMMAND_KEY.UNDO,
274
- trigger: () => !this.isDialogOpen && this.canUndo && !isTypingText(),
275
- action: () => this.undo(),
606
+ trigger: () => !this.isDialogOpen &&
607
+ !this.nodeEditor.isHeld &&
608
+ (this.canUndo || this.hasEditsToApply) &&
609
+ !isTypingText(),
610
+ action: () => this.nodeEditor.runFromKeyboard(() => this.undoEdited(), isFocusInNodeEditor()),
276
611
  });
277
612
  }
613
+ /** The node editor has edits that closing it would apply */
614
+ get hasEditsToApply() {
615
+ return this.nodeEditor.hasChanges && !this.readOnly;
616
+ }
617
+ /**
618
+ * Execute, as its button and F9 do (spec §17.5): finishes the node editor
619
+ * first, so the edits run, then runs the query if it can; runs nothing
620
+ * when the edits had to be dropped, since the run would not be what the
621
+ * user edited
622
+ */
623
+ executeEdited() {
624
+ if (!this.nodeEditor.finishApplied() || !this.execution.canExecute) {
625
+ return;
626
+ }
627
+ flowResult(this.execution.execute()).catch(this.host.applicationStore.alertUnhandledError);
628
+ }
629
+ /**
630
+ * Undo, as its button and Ctrl+Z do: finishes the node editor first, then
631
+ * undoes the last change, which drops the edits it just applied; when the
632
+ * edits had to be dropped instead, that was the undo
633
+ */
634
+ undoEdited() {
635
+ if (this.nodeEditor.finishApplied()) {
636
+ this.undo();
637
+ }
638
+ }
278
639
  deregisterCommands() {
279
640
  Object.values(LEGEND_CUBE_COMMAND_KEY).forEach((key) => this.host.applicationStore.commandService.deregisterCommand(key));
280
641
  }
281
642
  get canUndo() {
282
643
  return this.history.length > 0 && !this.readOnly;
283
644
  }
645
+ get canRedo() {
646
+ return this.redoStack.length > 0;
647
+ }
284
648
  /** The one way to change the cube; the document before goes to the undo history */
285
649
  applyDocument(next) {
286
650
  if (next === this.document) {
@@ -295,6 +659,36 @@ export class CubeEditorState {
295
659
  * without applying its edits, and drops the last run's rows and errors,
296
660
  * which belong to the cube before. Never runs the cube.
297
661
  */
662
+ /** Whether the cube is a new one: no name, no context, no node */
663
+ get isEmptyCube() {
664
+ const { document } = this;
665
+ return (document.name === undefined &&
666
+ document.context === undefined &&
667
+ document.query.nodes.length === 0);
668
+ }
669
+ /**
670
+ * Replaces the cube with a new, empty one, as an import does (one undo
671
+ * step, so Undo brings the cube back); a cube already new is left as it is
672
+ */
673
+ startNewCube() {
674
+ if (!this.isEmptyCube) {
675
+ this.importDocument(new CubeDocument(), false);
676
+ }
677
+ }
678
+ /**
679
+ * Opens the page on a cube read for it, as `initialDocument` opens one:
680
+ * no undo step, as there was no cube before it (Import Pure's
681
+ * `initialLambda`, PLAN §11.18). Its sources come typed; its expressions
682
+ * are checked as any are.
683
+ */
684
+ openDocument(next) {
685
+ this.execution.reset();
686
+ this.sourcePicker.close();
687
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
688
+ this.hostIssues = new Map();
689
+ this.document = next;
690
+ this.readOnly = false;
691
+ }
298
692
  importDocument(next, readOnly) {
299
693
  this.pushHistory();
300
694
  this.importedOver.add(this.document);
@@ -307,10 +701,15 @@ export class CubeEditorState {
307
701
  this.document = next;
308
702
  this.readOnly = readOnly;
309
703
  flowResult(this.reresolveSources()).catch(this.host.applicationStore.alertUnhandledError);
704
+ // checked once on load too, as sources are checked again: the model may
705
+ // have changed the types of its functions (PLAN §11.7, §11.11)
706
+ flowResult(this.checkExpressions(next.query.nodes.filter(isCubeEngineCheckedNode))).catch(this.host.applicationStore.alertUnhandledError);
310
707
  }
311
708
  /**
312
- * Types the cube's tables again, in one engine call, outside the undo
313
- * history (PLAN §10.3, Settled before M1.8):
709
+ * Types the cube's sources again, outside the undo history (PLAN §10.3,
710
+ * Settled before M1.8): its tables in one engine call, a data product
711
+ * cube's access points through the catalog, from the deployed artifact at
712
+ * the cube's version (PLAN §6.8). Warnings name the kind of source:
314
713
  * - a table whose columns are the saved ones is left as it is;
315
714
  * - a table that changed takes its new columns, with a warning listing the
316
715
  * changes;
@@ -325,28 +724,80 @@ export class CubeEditorState {
325
724
  * left alone.
326
725
  *
327
726
  * `only` types just these sources of the cube shown, e.g. one Refresh. A
328
- * table found unchanged loses any earlier warning.
727
+ * table found unchanged loses any earlier warning. `fresh` reads a data
728
+ * product's artifact again rather than what this page visit read.
329
729
  */
330
- *reresolveSources(only) {
730
+ *reresolveSources(only, fresh = false) {
331
731
  const { context, query } = this.document;
332
- const sources = (only ?? query.nodes).filter((node) => node instanceof RelationalTableSource &&
333
- query.getNode(node.id) === node);
334
- if (!context || !sources.length) {
732
+ if (!context) {
733
+ return;
734
+ }
735
+ const kept = (only ?? query.nodes).filter((node) => query.getNode(node.id) === node);
736
+ const tables = kept.filter((node) => node instanceof RelationalTableSource);
737
+ // an access point on a cube of tables is the no-mix rule's to flag
738
+ const accessPoints = isCubeDataProductModel(context.model)
739
+ ? kept.filter((node) => node instanceof DataProductAccessPointSource)
740
+ : [];
741
+ const dataSets = isCubeIngestModel(context.model)
742
+ ? kept.filter((node) => node instanceof IngestDatasetSource)
743
+ : [];
744
+ // a function on another kind of cube is the no-mix rule's to flag
745
+ const functions = isCubeDataProductModel(context.model) ||
746
+ isCubeIngestModel(context.model) ||
747
+ isCubeServiceModel(context.model)
748
+ ? []
749
+ : kept.filter((node) => node instanceof FunctionSource);
750
+ // services are typed in one place, still to come (PLAN §6.4)
751
+ const services = isCubeServiceModel(context.model)
752
+ ? kept.filter((node) => node instanceof ServiceSource)
753
+ : [];
754
+ const sources = [
755
+ ...tables,
756
+ ...functions,
757
+ ...accessPoints,
758
+ ...dataSets,
759
+ ...services,
760
+ ];
761
+ if (!sources.length) {
335
762
  return;
336
763
  }
337
764
  this.pendingSources = new Set([...this.pendingSources, ...sources]);
338
765
  let answers;
339
766
  try {
340
- answers = (yield this.host.engine.resolveSchemas(context.model, new Map(sources.map((source) => [
341
- source.id,
342
- [source.database, source.schema, source.table],
343
- ]))));
344
- }
345
- catch (error) {
346
- const failure = error instanceof CubeEngineError
347
- ? error
348
- : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error ? error.message : String(error));
349
- answers = new Map(sources.map((source) => [source.id, failure]));
767
+ const [tableAnswers, accessPointAnswers, dataSetAnswers, serviceAnswers, functionAnswers,] = (yield Promise.all([
768
+ tables.length
769
+ ? this.host.engine
770
+ .resolveSchemas(context.model, new Map(tables.map((source) => [
771
+ source.id,
772
+ [source.database, source.schema, source.table],
773
+ ])))
774
+ .catch((error) => {
775
+ const failure = error instanceof CubeEngineError
776
+ ? error
777
+ : new CubeEngineError(CubeEngineErrorKind.NETWORK, error instanceof Error ? error.message : String(error));
778
+ return new Map(tables.map((source) => [source.id, failure]));
779
+ })
780
+ : new Map(),
781
+ accessPoints.length
782
+ ? recheckCubeDataProductSources(this.host.dataProductCatalog, context.model, accessPoints, fresh)
783
+ : new Map(),
784
+ dataSets.length
785
+ ? recheckCubeIngestSources(this.host.ingestCatalog, context.model, dataSets, fresh)
786
+ : new Map(),
787
+ services.length
788
+ ? recheckCubeServiceSources(this.host.serviceCatalog, context.model, services)
789
+ : new Map(),
790
+ functions.length
791
+ ? recheckCubeFunctionSources(this.host.engine, context.model, functions)
792
+ : new Map(),
793
+ ]));
794
+ answers = new Map([
795
+ ...(tableAnswers ?? []),
796
+ ...(accessPointAnswers ?? []),
797
+ ...(dataSetAnswers ?? []),
798
+ ...(serviceAnswers ?? []),
799
+ ...(functionAnswers ?? []),
800
+ ]);
350
801
  }
351
802
  finally {
352
803
  this.pendingSources = new Set([...this.pendingSources].filter((node) => !sources.includes(node)));
@@ -355,14 +806,31 @@ export class CubeEditorState {
355
806
  /** Each typed source, by the object that was sent, and what replaces it */
356
807
  const replacements = new Map();
357
808
  sources.forEach((source) => {
809
+ const isAccessPoint = source instanceof DataProductAccessPointSource;
810
+ const isDataSet = source instanceof IngestDatasetSource;
811
+ const isFunction = source instanceof FunctionSource;
358
812
  const answer = answers.get(source.id) ??
359
- new CubeEngineError(CubeEngineErrorKind.COMPILE, 'The engine gave no schema for this table', source.id);
813
+ new CubeEngineError(CubeEngineErrorKind.COMPILE, isAccessPoint
814
+ ? CUBE_DATA_PRODUCT_RECHECK_MESSAGE.NO_ANSWER
815
+ : isDataSet
816
+ ? CUBE_INGEST_RECHECK_MESSAGE.NO_ANSWER
817
+ : isFunction
818
+ ? CUBE_FUNCTION_MESSAGE.NO_ANSWER
819
+ : 'The engine gave no schema for this table', source.id);
360
820
  const saved = source.resolution.kind === 'resolved'
361
821
  ? source.resolution.schema
362
822
  : undefined;
363
823
  if (answer instanceof CubeEngineError) {
364
824
  if (saved) {
365
- warnings.set(source.key, [getSourceRecheckWarning(answer.firstLine)]);
825
+ warnings.set(source.key, [
826
+ isAccessPoint
827
+ ? getAccessPointRecheckWarning(answer.firstLine)
828
+ : isDataSet
829
+ ? getDataSetRecheckWarning(answer.firstLine)
830
+ : isFunction
831
+ ? getFunctionRecheckWarning(answer.firstLine)
832
+ : getSourceRecheckWarning(answer.firstLine),
833
+ ]);
366
834
  }
367
835
  else if (source.resolution.kind !== 'failed' ||
368
836
  source.resolution.message !== answer.detail) {
@@ -380,13 +848,30 @@ export class CubeEditorState {
380
848
  schema: answer,
381
849
  });
382
850
  if (saved) {
851
+ const diff = diffSchemas(saved, answer);
383
852
  warnings.set(resolved.key, [
384
- getSchemaDriftWarning(diffSchemas(saved, answer)),
853
+ isAccessPoint
854
+ ? getAccessPointDriftWarning(diff)
855
+ : isDataSet
856
+ ? getDataSetDriftWarning(diff)
857
+ : isFunction
858
+ ? getFunctionDriftWarning(diff)
859
+ : getSchemaDriftWarning(diff),
385
860
  ]);
386
861
  }
387
862
  replacements.set(source, resolved);
388
863
  });
389
864
  this.warnings = warnings;
865
+ this.replaceOutsideHistory(replacements);
866
+ }
867
+ /**
868
+ * Puts nodes the engine checked in place of the very objects that were
869
+ * sent, outside the undo history: in the cube shown and in the undo
870
+ * snapshots taken meanwhile, so undoing an edit made meanwhile keeps them.
871
+ * A node the user changed meanwhile is a new object, and is left alone.
872
+ * Filter values saved as invalid text are read again against the columns.
873
+ */
874
+ replaceOutsideHistory(replacements, accepts) {
390
875
  if (!replacements.size) {
391
876
  return;
392
877
  }
@@ -398,7 +883,8 @@ export class CubeEditorState {
398
883
  if (checked === undefined) {
399
884
  let replaced = document.query;
400
885
  replacements.forEach((resolved, source) => {
401
- if (replaced.getNode(source.id) === source) {
886
+ if (replaced.getNode(source.id) === source &&
887
+ (accepts?.(document.query, resolved) ?? true)) {
402
888
  replaced = replaced.replace(resolved);
403
889
  }
404
890
  });
@@ -421,27 +907,40 @@ export class CubeEditorState {
421
907
  return next;
422
908
  };
423
909
  this.history = this.history.map(check);
910
+ // a change undone meanwhile is redone with the checked nodes too
911
+ this.redoStack = this.redoStack.map((entry) => ({
912
+ ...entry,
913
+ document: check(entry.document),
914
+ }));
424
915
  const next = check(this.document);
425
916
  if (next !== this.document) {
426
917
  this.replaceDocument(next);
427
918
  }
428
919
  }
429
920
  /**
430
- * Types a table again with the engine, from its Source panel (spec §17.6),
431
- * as a re-check after an import does: no undo step, nothing changes when
432
- * its columns are the same, and a warning lists any change.
921
+ * Types a source again, from its Source panel (spec §17.6), as a re-check
922
+ * after an import does: a table with the engine, an access point through
923
+ * the catalog. No undo step, nothing changes when its columns are the
924
+ * same, and a warning lists any change.
433
925
  */
434
926
  *refreshSource(nodeId) {
435
927
  const source = this.document.query.getNode(nodeId);
436
- if (source instanceof RelationalTableSource) {
437
- yield flowResult(this.reresolveSources([source]));
928
+ if (source instanceof RelationalTableSource ||
929
+ source instanceof DataProductAccessPointSource ||
930
+ source instanceof IngestDatasetSource ||
931
+ source instanceof ServiceSource ||
932
+ source instanceof FunctionSource) {
933
+ // a Refresh reads the deployed artifact or definition again
934
+ yield flowResult(this.reresolveSources([source], true));
438
935
  }
439
936
  }
440
937
  /**
441
938
  * Restores the document before the last edit; does nothing when there is
442
939
  * no history. A restored query is a new object (PLAN §4.3), so rows that
443
- * ran before the edit show as stale. An edit that left the query alone,
444
- * such as a rename, keeps it, with its rows and engine errors. Undoing an
940
+ * ran before the edit show as stale. An edit that left the query and the
941
+ * context alone, such as a rename, keeps them, with the rows and engine
942
+ * errors; undoing a warehouse edit brings back the context the rows ran
943
+ * with. Undoing an
445
944
  * import closes the node editor and the picker, as the import did.
446
945
  */
447
946
  undo() {
@@ -450,24 +949,89 @@ export class CubeEditorState {
450
949
  return;
451
950
  }
452
951
  this.history = this.history.slice(0, -1);
952
+ this.redoStack = [
953
+ ...this.redoStack,
954
+ {
955
+ document: this.document,
956
+ readOnly: this.readOnly,
957
+ opensAnotherCube: this.importedOver.has(previous),
958
+ },
959
+ ];
453
960
  this.readOnly = this.readOnlyDocuments.has(previous);
454
961
  if (this.importedOver.has(previous)) {
455
962
  // the cube before an import is another cube, as the import was
456
963
  this.sourcePicker.close();
457
964
  this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
458
965
  }
459
- const { query } = this.document;
460
- this.replaceDocument(previous.withQuery(previous.query === query ? query : previous.query.clone()));
966
+ const { query, meta } = this.document;
967
+ const restored = previous.withQuery(previous.query === query ? query : previous.query.clone());
968
+ // widths take no undo step, so the same cube keeps the ones set since
969
+ // (review of M7); the cube before an import keeps its own
970
+ this.replaceDocument(this.importedOver.has(previous)
971
+ ? restored
972
+ : restored.withMeta({
973
+ ...restored.meta,
974
+ presentation: {
975
+ ...restored.meta.presentation,
976
+ columnWidths: meta.presentation.columnWidths,
977
+ },
978
+ }));
979
+ }
980
+ /**
981
+ * Brings back the last change undone, as Ctrl+Shift+Z does: the cube shown
982
+ * goes back to the undo history, and a change that opened another cube
983
+ * (an import, New) closes the editor and the source dialog again
984
+ */
985
+ redo() {
986
+ const next = this.redoStack.at(-1);
987
+ if (!next) {
988
+ return;
989
+ }
990
+ this.redoStack = this.redoStack.slice(0, -1);
991
+ this.pushHistory(true);
992
+ if (next.opensAnotherCube) {
993
+ this.importedOver.add(this.history.at(-1));
994
+ this.sourcePicker.close();
995
+ this.nodeEditor.discard(CUBE_EDITOR_CLOSED_REASON.CUBE_REPLACED);
996
+ }
997
+ this.readOnly = next.readOnly;
998
+ const { query, meta } = this.document;
999
+ const restored = next.document.withQuery(next.document.query === query ? query : next.document.query.clone());
1000
+ // widths take no undo step: the same cube keeps the ones set since
1001
+ this.replaceDocument(next.opensAnotherCube
1002
+ ? restored
1003
+ : restored.withMeta({
1004
+ ...restored.meta,
1005
+ presentation: {
1006
+ ...restored.meta.presentation,
1007
+ columnWidths: meta.presentation.columnWidths,
1008
+ },
1009
+ }));
1010
+ }
1011
+ /** Redo, as its button and Ctrl+Shift+Z do: finishes the node editor first */
1012
+ redoEdited() {
1013
+ if (this.nodeEditor.finishApplied() && this.canRedo) {
1014
+ this.redo();
1015
+ }
461
1016
  }
462
- pushHistory() {
1017
+ /** Keeps the cube shown for undo; a new change, not a redo, drops what was undone */
1018
+ pushHistory(keepRedo = false) {
463
1019
  if (this.readOnly) {
464
1020
  this.readOnlyDocuments.add(this.document);
465
1021
  }
466
1022
  this.history = [...this.history, this.document].slice(-MAX_UNDO_STEPS);
1023
+ if (!keepRedo) {
1024
+ this.redoStack = [];
1025
+ }
467
1026
  }
468
- /** Engine errors belong to the query they came from, so they are dropped when the query changes */
1027
+ /**
1028
+ * Engine errors belong to the query and the context they came from, so
1029
+ * they are dropped when either changes, e.g. a data product cube's
1030
+ * warehouse
1031
+ */
469
1032
  replaceDocument(next) {
470
- if (next.query !== this.document.query) {
1033
+ if (next.query !== this.document.query ||
1034
+ next.context !== this.document.context) {
471
1035
  this.hostIssues = new Map();
472
1036
  this.execution.clearError();
473
1037
  }
@@ -492,10 +1056,40 @@ export class CubeEditorState {
492
1056
  this.applyQuery(query.connect(sourceId, targetId, port));
493
1057
  }
494
1058
  }
1059
+ /**
1060
+ * The kinds of source the host serves: data products, ingest data sets and
1061
+ * services only with their catalogs, tables and functions only with a tab
1062
+ * that reads them (Studio offers ingest data sets alone). The cube's kind
1063
+ * may still disable one (`canAddNode`)
1064
+ */
1065
+ get offeredSources() {
1066
+ const { modelTab, projectTab, projectFunctionTab, directTab, dataProductTab, ingestTab, serviceTab, } = this.sourcePicker;
1067
+ const isServed = (type) => {
1068
+ switch (type) {
1069
+ case DataProductAccessPointSource.TYPE:
1070
+ return dataProductTab.isAvailable;
1071
+ case IngestDatasetSource.TYPE:
1072
+ return ingestTab.isAvailable;
1073
+ case ServiceSource.TYPE:
1074
+ return serviceTab.isAvailable;
1075
+ case FunctionSource.TYPE:
1076
+ return modelTab.isAvailable || projectFunctionTab.isAvailable;
1077
+ case RelationalTableSource.TYPE:
1078
+ return (modelTab.isAvailable ||
1079
+ projectTab.isAvailable ||
1080
+ directTab.isAvailable);
1081
+ default:
1082
+ return true;
1083
+ }
1084
+ };
1085
+ return this.registry.sources.filter((definition) => isServed(definition.type));
1086
+ }
495
1087
  /**
496
1088
  * Whether a node of the type can be added: a transform, unconnected or
497
1089
  * spliced in after `afterId`, when the query allows it; a source only
498
1090
  * unconnected, through the source picker. Never while the cube is read-only.
1091
+ * The low-level rule: the palette, drops and menus place nodes through
1092
+ * `CubeAddPlacement` (PLAN §11.8).
499
1093
  */
500
1094
  canAddNode(type, afterId) {
501
1095
  const definition = this.registry.get(type);
@@ -503,28 +1097,34 @@ export class CubeEditorState {
503
1097
  return false;
504
1098
  }
505
1099
  if (definition.kind === 'source') {
506
- return afterId === undefined;
1100
+ // through its tab, which the cube's kind may disable (PLAN §6.8)
1101
+ const tab = this.sourcePicker.tabForSourceType(type);
1102
+ return (afterId === undefined &&
1103
+ tab !== undefined &&
1104
+ this.sourcePicker.isTabEnabled(tab));
507
1105
  }
508
1106
  const { query } = this.document;
509
1107
  return query.canAdd(definition.create(query.generateId(type)), afterId);
510
1108
  }
511
1109
  /**
512
- * Adds a node of the type, as the palette and the context menu do (spec
513
- * §17.4): a transform with its default settings, unconnected or spliced in
1110
+ * Adds a node of the type (spec §17.4), the low-level add that
1111
+ * `CubeAddPlacement` places for the palette, drops and menus: a transform with its default settings, unconnected or spliced in
514
1112
  * after `afterId`; a source opens the source picker, which adds it once
515
1113
  * the engine has typed it. Does nothing `canAddNode` refuses.
516
1114
  */
517
1115
  addNode(type, afterId) {
518
1116
  const definition = this.registry.get(type);
519
1117
  if (!definition || !this.canAddNode(type, afterId)) {
520
- return;
1118
+ return undefined;
521
1119
  }
522
1120
  if (definition.kind === 'source') {
523
- this.sourcePicker.open();
524
- return;
1121
+ this.sourcePicker.openForSourceType(type);
1122
+ return undefined;
525
1123
  }
526
1124
  const { query } = this.document;
527
- this.applyQuery(query.add(definition.create(query.generateId(type)), afterId));
1125
+ const id = query.generateId(type);
1126
+ this.applyQuery(query.add(definition.create(id), afterId));
1127
+ return id;
528
1128
  }
529
1129
  /**
530
1130
  * Adds a node made elsewhere, with its settings, as the grid's quick
@@ -576,6 +1176,69 @@ export class CubeEditorState {
576
1176
  ? this.document.withContext(undefined).withQuery(query)
577
1177
  : this.document.withQuery(query));
578
1178
  }
1179
+ /** Whether a step can be copied: a known type's, so its copy reads back */
1180
+ canCopyNode(nodeId) {
1181
+ const node = this.document.query.getNode(nodeId);
1182
+ return node !== undefined && this.registry.get(node.type) !== undefined;
1183
+ }
1184
+ /** Copies a step, as Cmd/Ctrl+C on it does, for Paste */
1185
+ copyNode(nodeId) {
1186
+ const node = this.document.query.getNode(nodeId);
1187
+ if (node && this.canCopyNode(nodeId)) {
1188
+ this.copiedNode = { node, context: this.document.context };
1189
+ }
1190
+ }
1191
+ /**
1192
+ * Whether the step copied can be pasted here: a transform always; a source
1193
+ * only into a cube of the same model and runtime, or an empty cube, which
1194
+ * takes them, as a first table does
1195
+ */
1196
+ get canPaste() {
1197
+ const copied = this.copiedNode;
1198
+ return (copied !== undefined &&
1199
+ !this.readOnly &&
1200
+ this.canTakeCopy(copied.node, copied.context));
1201
+ }
1202
+ /** Pastes the step copied: after the step given when it takes an input, else on its own; one undo step */
1203
+ pasteNode(afterId) {
1204
+ const copied = this.copiedNode;
1205
+ if (copied && this.canPaste) {
1206
+ this.addCopy(copied.node, copied.context, afterId);
1207
+ }
1208
+ }
1209
+ canDuplicateNode(nodeId) {
1210
+ return !this.readOnly && this.canCopyNode(nodeId);
1211
+ }
1212
+ /** A copy of the step after it, as Cmd/Ctrl+D does, leaving the step copied for Paste as it was */
1213
+ duplicateNode(nodeId) {
1214
+ const node = this.document.query.getNode(nodeId);
1215
+ if (node && this.canDuplicateNode(nodeId)) {
1216
+ this.addCopy(node, this.document.context, nodeId);
1217
+ }
1218
+ }
1219
+ canTakeCopy(node, context) {
1220
+ if (!(node instanceof SourceNode)) {
1221
+ return true;
1222
+ }
1223
+ const { document } = this;
1224
+ return (document.query.isEmpty ||
1225
+ JSON.stringify(document.context) === JSON.stringify(context));
1226
+ }
1227
+ addCopy(node, context, afterId) {
1228
+ const { document } = this;
1229
+ const copy = copyQueryNode(node, document.query.generateId(node.type), this.registry);
1230
+ if (!copy) {
1231
+ return;
1232
+ }
1233
+ const after = afterId !== undefined && document.query.canAdd(copy, afterId)
1234
+ ? afterId
1235
+ : undefined;
1236
+ const query = document.query.add(copy, after);
1237
+ // a source pasted into an empty cube brings its model and runtime
1238
+ this.applyDocument(copy instanceof SourceNode && document.query.isEmpty && context
1239
+ ? document.withContext(context).withQuery(query)
1240
+ : document.withQuery(query));
1241
+ }
579
1242
  canSwapInputs(nodeId) {
580
1243
  return !this.readOnly && this.document.query.canSwapInputs(nodeId);
581
1244
  }
@@ -598,6 +1261,26 @@ export class CubeEditorState {
598
1261
  }));
599
1262
  }
600
1263
  }
1264
+ /**
1265
+ * Keeps a grid column's width, which the cube saves (PLAN §11.10): by the
1266
+ * column's name, in any case. Presentation the user sets by dragging, so
1267
+ * no undo step, and the rows stay current.
1268
+ */
1269
+ setColumnWidth(column, width) {
1270
+ if (!Number.isFinite(width) || width <= 0) {
1271
+ return;
1272
+ }
1273
+ const { meta } = this.document;
1274
+ const { presentation } = meta;
1275
+ const others = presentation.columnWidths.filter((each) => foldColumnName(each.column) !== foldColumnName(column));
1276
+ this.replaceDocument(this.document.withMeta({
1277
+ ...meta,
1278
+ presentation: {
1279
+ ...presentation,
1280
+ columnWidths: [...others, { column, width: Math.round(width) }],
1281
+ },
1282
+ }));
1283
+ }
601
1284
  setHostIssue(nodeId, error) {
602
1285
  this.hostIssues = new Map([
603
1286
  ...this.hostIssues,
@@ -625,6 +1308,8 @@ export class CubeEditorState {
625
1308
  }
626
1309
  /** Stops any run; call when the page closes */
627
1310
  dispose() {
1311
+ this.rechecking();
1312
+ this.outlineLoading();
628
1313
  this.execution.stop();
629
1314
  this.nodeEditor.dispose();
630
1315
  }