@finos/legend-cube-builder 0.0.2 → 0.0.4

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 (761) hide show
  1. package/README.md +93 -1
  2. package/docs/adding-an-operation.md +181 -0
  3. package/docs/hosting.md +157 -0
  4. package/docs/testing.md +188 -0
  5. package/lib/__lib__/LegendCubeCommand.d.ts +2 -1
  6. package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
  7. package/lib/__lib__/LegendCubeCommand.js +5 -0
  8. package/lib/__lib__/LegendCubeCommand.js.map +1 -1
  9. package/lib/__lib__/LegendCubeDataProductLabels.d.ts +45 -0
  10. package/lib/__lib__/LegendCubeDataProductLabels.d.ts.map +1 -0
  11. package/lib/__lib__/LegendCubeDataProductLabels.js +60 -0
  12. package/lib/__lib__/LegendCubeDataProductLabels.js.map +1 -0
  13. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts +56 -0
  14. package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts.map +1 -0
  15. package/lib/__lib__/LegendCubeDirectConnectionLabels.js +76 -0
  16. package/lib/__lib__/LegendCubeDirectConnectionLabels.js.map +1 -0
  17. package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
  18. package/lib/__lib__/LegendCubeHelpText.js +21 -3
  19. package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
  20. package/lib/__lib__/LegendCubeIngestLabels.d.ts +25 -0
  21. package/lib/__lib__/LegendCubeIngestLabels.d.ts.map +1 -0
  22. package/lib/__lib__/LegendCubeIngestLabels.js +29 -0
  23. package/lib/__lib__/LegendCubeIngestLabels.js.map +1 -0
  24. package/lib/__lib__/LegendCubeLabels.d.ts +95 -3
  25. package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
  26. package/lib/__lib__/LegendCubeLabels.js +121 -4
  27. package/lib/__lib__/LegendCubeLabels.js.map +1 -1
  28. package/lib/__lib__/LegendCubeProjectLabels.d.ts +22 -0
  29. package/lib/__lib__/LegendCubeProjectLabels.d.ts.map +1 -0
  30. package/lib/__lib__/LegendCubeProjectLabels.js +23 -0
  31. package/lib/__lib__/LegendCubeProjectLabels.js.map +1 -0
  32. package/lib/__lib__/LegendCubeTesting.d.ts +1 -0
  33. package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
  34. package/lib/__lib__/LegendCubeTesting.js +1 -0
  35. package/lib/__lib__/LegendCubeTesting.js.map +1 -1
  36. package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -1
  37. package/lib/__test-utils__/CubeCanvasTestUtils.js +1 -1
  38. package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -1
  39. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts +22 -0
  40. package/lib/__test-utils__/CubeConnectionTestSupport.d.ts.map +1 -0
  41. package/lib/__test-utils__/CubeConnectionTestSupport.js +30 -0
  42. package/lib/__test-utils__/CubeConnectionTestSupport.js.map +1 -0
  43. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts +31 -0
  44. package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts.map +1 -0
  45. package/lib/__test-utils__/CubeDirectConnectionFixtures.js +63 -0
  46. package/lib/__test-utils__/CubeDirectConnectionFixtures.js.map +1 -0
  47. package/lib/__test-utils__/CubeEngineTestSupport.d.ts +18 -0
  48. package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
  49. package/lib/__test-utils__/CubeEngineTestSupport.js +51 -0
  50. package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
  51. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +37 -0
  52. package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -0
  53. package/lib/__test-utils__/CubeExpressionTestUtils.js +83 -0
  54. package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -0
  55. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +67 -0
  56. package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -0
  57. package/lib/__test-utils__/CubeOperationsTestUtils.js +138 -0
  58. package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -0
  59. package/lib/__test-utils__/CubePageTestUtils.d.ts +12 -0
  60. package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
  61. package/lib/__test-utils__/CubePageTestUtils.js +25 -1
  62. package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
  63. package/lib/__test-utils__/CubeTestApplication.d.ts +5 -1
  64. package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
  65. package/lib/__test-utils__/CubeTestApplication.js +9 -1
  66. package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
  67. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts +33 -0
  68. package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts.map +1 -0
  69. package/lib/__test-utils__/FakeCubeConnectionExplorer.js +67 -0
  70. package/lib/__test-utils__/FakeCubeConnectionExplorer.js.map +1 -0
  71. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts +45 -0
  72. package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts.map +1 -0
  73. package/lib/__test-utils__/FakeCubeDataProductCatalog.js +137 -0
  74. package/lib/__test-utils__/FakeCubeDataProductCatalog.js.map +1 -0
  75. package/lib/__test-utils__/FakeCubeEngine.d.ts +2 -0
  76. package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
  77. package/lib/__test-utils__/FakeCubeEngine.js +21 -2
  78. package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
  79. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +35 -0
  80. package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -0
  81. package/lib/__test-utils__/FakeCubeIngestCatalog.js +107 -0
  82. package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -0
  83. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts +30 -0
  84. package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts.map +1 -0
  85. package/lib/__test-utils__/FakeCubeProjectCatalog.js +64 -0
  86. package/lib/__test-utils__/FakeCubeProjectCatalog.js.map +1 -0
  87. package/lib/components/CubeAddItems.d.ts +35 -0
  88. package/lib/components/CubeAddItems.d.ts.map +1 -0
  89. package/lib/components/CubeAddItems.js +82 -0
  90. package/lib/components/CubeAddItems.js.map +1 -0
  91. package/lib/components/CubeEditor.d.ts +5 -1
  92. package/lib/components/CubeEditor.d.ts.map +1 -1
  93. package/lib/components/CubeEditor.js +33 -13
  94. package/lib/components/CubeEditor.js.map +1 -1
  95. package/lib/components/CubeEntrySourceBanner.d.ts +23 -0
  96. package/lib/components/CubeEntrySourceBanner.d.ts.map +1 -0
  97. package/lib/components/CubeEntrySourceBanner.js +32 -0
  98. package/lib/components/CubeEntrySourceBanner.js.map +1 -0
  99. package/lib/components/CubeNodeIcon.d.ts.map +1 -1
  100. package/lib/components/CubeNodeIcon.js +19 -2
  101. package/lib/components/CubeNodeIcon.js.map +1 -1
  102. package/lib/components/CubeSchemaColumnsTable.d.ts +21 -0
  103. package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -0
  104. package/lib/components/CubeSchemaColumnsTable.js +6 -0
  105. package/lib/components/CubeSchemaColumnsTable.js.map +1 -0
  106. package/lib/components/canvas/CubeCanvas.d.ts +4 -3
  107. package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
  108. package/lib/components/canvas/CubeCanvas.js +33 -12
  109. package/lib/components/canvas/CubeCanvas.js.map +1 -1
  110. package/lib/components/canvas/CubeCanvasContextMenu.d.ts +8 -4
  111. package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
  112. package/lib/components/canvas/CubeCanvasContextMenu.js +19 -9
  113. package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
  114. package/lib/components/canvas/CubeCanvasDnd.d.ts +7 -5
  115. package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -1
  116. package/lib/components/canvas/CubeCanvasDnd.js +14 -9
  117. package/lib/components/canvas/CubeCanvasDnd.js.map +1 -1
  118. package/lib/components/canvas/CubeCanvasElements.d.ts +2 -0
  119. package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
  120. package/lib/components/canvas/CubeCanvasElements.js +8 -4
  121. package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
  122. package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
  123. package/lib/components/canvas/CubeCanvasNode.js +30 -17
  124. package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
  125. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts +22 -0
  126. package/lib/components/canvas/CubeCanvasNodeFocus.d.ts.map +1 -0
  127. package/lib/components/canvas/CubeCanvasNodeFocus.js +31 -0
  128. package/lib/components/canvas/CubeCanvasNodeFocus.js.map +1 -0
  129. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts +44 -0
  130. package/lib/components/canvas/CubeNodeEditorAnchor.d.ts.map +1 -0
  131. package/lib/components/canvas/CubeNodeEditorAnchor.js +51 -0
  132. package/lib/components/canvas/CubeNodeEditorAnchor.js.map +1 -0
  133. package/lib/components/editors/CubeAggregationRowEditor.d.ts +48 -0
  134. package/lib/components/editors/CubeAggregationRowEditor.d.ts.map +1 -0
  135. package/lib/components/editors/CubeAggregationRowEditor.js +72 -0
  136. package/lib/components/editors/CubeAggregationRowEditor.js.map +1 -0
  137. package/lib/components/editors/CubeColumnChecklist.d.ts +42 -0
  138. package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -0
  139. package/lib/components/editors/CubeColumnChecklist.js +41 -0
  140. package/lib/components/editors/CubeColumnChecklist.js.map +1 -0
  141. package/lib/components/editors/CubeColumnPicker.d.ts +9 -2
  142. package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
  143. package/lib/components/editors/CubeColumnPicker.js +9 -4
  144. package/lib/components/editors/CubeColumnPicker.js.map +1 -1
  145. package/lib/components/editors/CubeConcatEditor.d.ts +33 -0
  146. package/lib/components/editors/CubeConcatEditor.d.ts.map +1 -0
  147. package/lib/components/editors/CubeConcatEditor.js +147 -0
  148. package/lib/components/editors/CubeConcatEditor.js.map +1 -0
  149. package/lib/components/editors/CubeDataProductSourceEditor.d.ts +25 -0
  150. package/lib/components/editors/CubeDataProductSourceEditor.d.ts.map +1 -0
  151. package/lib/components/editors/CubeDataProductSourceEditor.js +53 -0
  152. package/lib/components/editors/CubeDataProductSourceEditor.js.map +1 -0
  153. package/lib/components/editors/CubeDifferenceEditor.d.ts +25 -0
  154. package/lib/components/editors/CubeDifferenceEditor.d.ts.map +1 -0
  155. package/lib/components/editors/CubeDifferenceEditor.js +29 -0
  156. package/lib/components/editors/CubeDifferenceEditor.js.map +1 -0
  157. package/lib/components/editors/CubeDistinctEditor.d.ts +23 -0
  158. package/lib/components/editors/CubeDistinctEditor.d.ts.map +1 -0
  159. package/lib/components/editors/CubeDistinctEditor.js +24 -0
  160. package/lib/components/editors/CubeDistinctEditor.js.map +1 -0
  161. package/lib/components/editors/CubeExtendEditor.d.ts +25 -0
  162. package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -0
  163. package/lib/components/editors/CubeExtendEditor.js +86 -0
  164. package/lib/components/editors/CubeExtendEditor.js.map +1 -0
  165. package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
  166. package/lib/components/editors/CubeFilterEditor.js +3 -3
  167. package/lib/components/editors/CubeFilterEditor.js.map +1 -1
  168. package/lib/components/editors/CubeGroupEditor.d.ts +28 -0
  169. package/lib/components/editors/CubeGroupEditor.d.ts.map +1 -0
  170. package/lib/components/editors/CubeGroupEditor.js +70 -0
  171. package/lib/components/editors/CubeGroupEditor.js.map +1 -0
  172. package/lib/components/editors/CubeIngestSourceEditor.d.ts +26 -0
  173. package/lib/components/editors/CubeIngestSourceEditor.d.ts.map +1 -0
  174. package/lib/components/editors/CubeIngestSourceEditor.js +47 -0
  175. package/lib/components/editors/CubeIngestSourceEditor.js.map +1 -0
  176. package/lib/components/editors/CubeIntegerField.d.ts +29 -0
  177. package/lib/components/editors/CubeIntegerField.d.ts.map +1 -0
  178. package/lib/components/editors/CubeIntegerField.js +30 -0
  179. package/lib/components/editors/CubeIntegerField.js.map +1 -0
  180. package/lib/components/editors/CubeJoinEditor.d.ts +2 -4
  181. package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
  182. package/lib/components/editors/CubeJoinEditor.js +15 -37
  183. package/lib/components/editors/CubeJoinEditor.js.map +1 -1
  184. package/lib/components/editors/CubeJoinKeyRows.d.ts +34 -0
  185. package/lib/components/editors/CubeJoinKeyRows.d.ts.map +1 -0
  186. package/lib/components/editors/CubeJoinKeyRows.js +65 -0
  187. package/lib/components/editors/CubeJoinKeyRows.js.map +1 -0
  188. package/lib/components/editors/CubeNodeEditorPanel.d.ts +7 -5
  189. package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
  190. package/lib/components/editors/CubeNodeEditorPanel.js +53 -14
  191. package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
  192. package/lib/components/editors/CubeNodeEditorPopper.d.ts +40 -0
  193. package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -0
  194. package/lib/components/editors/CubeNodeEditorPopper.js +125 -0
  195. package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -0
  196. package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
  197. package/lib/components/editors/CubeNodeEditorRegistry.js +28 -1
  198. package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
  199. package/lib/components/editors/CubePartitionEditor.d.ts +30 -0
  200. package/lib/components/editors/CubePartitionEditor.d.ts.map +1 -0
  201. package/lib/components/editors/CubePartitionEditor.js +93 -0
  202. package/lib/components/editors/CubePartitionEditor.js.map +1 -0
  203. package/lib/components/editors/CubeRenameEditor.d.ts +26 -0
  204. package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -0
  205. package/lib/components/editors/CubeRenameEditor.js +60 -0
  206. package/lib/components/editors/CubeRenameEditor.js.map +1 -0
  207. package/lib/components/editors/CubeRestrictEditor.d.ts +26 -0
  208. package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -0
  209. package/lib/components/editors/CubeRestrictEditor.js +23 -0
  210. package/lib/components/editors/CubeRestrictEditor.js.map +1 -0
  211. package/lib/components/editors/CubeRowCountEditor.d.ts +25 -0
  212. package/lib/components/editors/CubeRowCountEditor.d.ts.map +1 -0
  213. package/lib/components/editors/CubeRowCountEditor.js +38 -0
  214. package/lib/components/editors/CubeRowCountEditor.js.map +1 -0
  215. package/lib/components/editors/CubeSliceEditor.d.ts +25 -0
  216. package/lib/components/editors/CubeSliceEditor.d.ts.map +1 -0
  217. package/lib/components/editors/CubeSliceEditor.js +40 -0
  218. package/lib/components/editors/CubeSliceEditor.js.map +1 -0
  219. package/lib/components/editors/CubeSortEditor.d.ts +27 -0
  220. package/lib/components/editors/CubeSortEditor.d.ts.map +1 -0
  221. package/lib/components/editors/CubeSortEditor.js +45 -0
  222. package/lib/components/editors/CubeSortEditor.js.map +1 -0
  223. package/lib/components/editors/CubeSortRowEditor.d.ts +47 -0
  224. package/lib/components/editors/CubeSortRowEditor.d.ts.map +1 -0
  225. package/lib/components/editors/CubeSortRowEditor.js +62 -0
  226. package/lib/components/editors/CubeSortRowEditor.js.map +1 -0
  227. package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -1
  228. package/lib/components/editors/CubeSourceEditor.js +18 -6
  229. package/lib/components/editors/CubeSourceEditor.js.map +1 -1
  230. package/lib/components/editors/CubeValueEditor.d.ts.map +1 -1
  231. package/lib/components/editors/CubeValueEditor.js +2 -1
  232. package/lib/components/editors/CubeValueEditor.js.map +1 -1
  233. package/lib/components/editors/CubeWarehouseControl.d.ts +30 -0
  234. package/lib/components/editors/CubeWarehouseControl.d.ts.map +1 -0
  235. package/lib/components/editors/CubeWarehouseControl.js +44 -0
  236. package/lib/components/editors/CubeWarehouseControl.js.map +1 -0
  237. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts +31 -0
  238. package/lib/components/editors/useCubeNodeEditorDismiss.d.ts.map +1 -0
  239. package/lib/components/editors/useCubeNodeEditorDismiss.js +83 -0
  240. package/lib/components/editors/useCubeNodeEditorDismiss.js.map +1 -0
  241. package/lib/components/examples/CubeExamplesDialog.d.ts +26 -0
  242. package/lib/components/examples/CubeExamplesDialog.d.ts.map +1 -0
  243. package/lib/components/examples/CubeExamplesDialog.js +68 -0
  244. package/lib/components/examples/CubeExamplesDialog.js.map +1 -0
  245. package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
  246. package/lib/components/grid/CubeGridRegion.js +20 -9
  247. package/lib/components/grid/CubeGridRegion.js.map +1 -1
  248. package/lib/components/grid/CubeGridValues.d.ts +16 -0
  249. package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
  250. package/lib/components/grid/CubeGridValues.js +44 -0
  251. package/lib/components/grid/CubeGridValues.js.map +1 -1
  252. package/lib/components/grid/CubeResultGrid.d.ts +14 -1
  253. package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
  254. package/lib/components/grid/CubeResultGrid.js +55 -7
  255. package/lib/components/grid/CubeResultGrid.js.map +1 -1
  256. package/lib/components/palette/CubePalette.d.ts.map +1 -1
  257. package/lib/components/palette/CubePalette.js +23 -12
  258. package/lib/components/palette/CubePalette.js.map +1 -1
  259. package/lib/components/source-picker/CubeDataProductTab.d.ts +27 -0
  260. package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -0
  261. package/lib/components/source-picker/CubeDataProductTab.js +102 -0
  262. package/lib/components/source-picker/CubeDataProductTab.js.map +1 -0
  263. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts +27 -0
  264. package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -0
  265. package/lib/components/source-picker/CubeDirectConnectionTab.js +87 -0
  266. package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -0
  267. package/lib/components/source-picker/CubeIngestTab.d.ts +28 -0
  268. package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -0
  269. package/lib/components/source-picker/CubeIngestTab.js +66 -0
  270. package/lib/components/source-picker/CubeIngestTab.js.map +1 -0
  271. package/lib/components/source-picker/CubeInlineModelTab.d.ts +37 -0
  272. package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -0
  273. package/lib/components/source-picker/CubeInlineModelTab.js +71 -0
  274. package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -0
  275. package/lib/components/source-picker/CubePickerStep.d.ts +27 -0
  276. package/lib/components/source-picker/CubePickerStep.d.ts.map +1 -0
  277. package/lib/components/source-picker/CubePickerStep.js +23 -0
  278. package/lib/components/source-picker/CubePickerStep.js.map +1 -0
  279. package/lib/components/source-picker/CubeProjectTab.d.ts +27 -0
  280. package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -0
  281. package/lib/components/source-picker/CubeProjectTab.js +50 -0
  282. package/lib/components/source-picker/CubeProjectTab.js.map +1 -0
  283. package/lib/components/source-picker/CubeSourcePicker.d.ts +6 -0
  284. package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
  285. package/lib/components/source-picker/CubeSourcePicker.js +20 -58
  286. package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
  287. package/lib/components/spec-transfer/CubeSpecTransferDialog.js +1 -1
  288. package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
  289. package/lib/graph-manager/CubeConnectionExplorer.d.ts +90 -0
  290. package/lib/graph-manager/CubeConnectionExplorer.d.ts.map +1 -0
  291. package/lib/graph-manager/CubeConnectionExplorer.js +34 -0
  292. package/lib/graph-manager/CubeConnectionExplorer.js.map +1 -0
  293. package/lib/graph-manager/CubeDataProduct.d.ts +66 -0
  294. package/lib/graph-manager/CubeDataProduct.d.ts.map +1 -0
  295. package/lib/graph-manager/CubeDataProduct.js +102 -0
  296. package/lib/graph-manager/CubeDataProduct.js.map +1 -0
  297. package/lib/graph-manager/CubeDataProductCatalog.d.ts +167 -0
  298. package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -0
  299. package/lib/graph-manager/CubeDataProductCatalog.js +116 -0
  300. package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -0
  301. package/lib/graph-manager/CubeDirectConnection.d.ts +38 -0
  302. package/lib/graph-manager/CubeDirectConnection.d.ts.map +1 -0
  303. package/lib/graph-manager/CubeDirectConnection.js +48 -0
  304. package/lib/graph-manager/CubeDirectConnection.js.map +1 -0
  305. package/lib/graph-manager/CubeEngine.d.ts +50 -2
  306. package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
  307. package/lib/graph-manager/CubeEngine.js +4 -1
  308. package/lib/graph-manager/CubeEngine.js.map +1 -1
  309. package/lib/graph-manager/CubeIngest.d.ts +50 -0
  310. package/lib/graph-manager/CubeIngest.d.ts.map +1 -0
  311. package/lib/graph-manager/CubeIngest.js +88 -0
  312. package/lib/graph-manager/CubeIngest.js.map +1 -0
  313. package/lib/graph-manager/CubeIngestCatalog.d.ts +116 -0
  314. package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -0
  315. package/lib/graph-manager/CubeIngestCatalog.js +80 -0
  316. package/lib/graph-manager/CubeIngestCatalog.js.map +1 -0
  317. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts +26 -0
  318. package/lib/graph-manager/CubeLakehouseEnvironment.d.ts.map +1 -0
  319. package/lib/graph-manager/CubeLakehouseEnvironment.js +17 -0
  320. package/lib/graph-manager/CubeLakehouseEnvironment.js.map +1 -0
  321. package/lib/graph-manager/CubeModelOutlineHelper.d.ts +8 -0
  322. package/lib/graph-manager/CubeModelOutlineHelper.d.ts.map +1 -1
  323. package/lib/graph-manager/CubeModelOutlineHelper.js +21 -0
  324. package/lib/graph-manager/CubeModelOutlineHelper.js.map +1 -1
  325. package/lib/graph-manager/CubeProject.d.ts +41 -0
  326. package/lib/graph-manager/CubeProject.d.ts.map +1 -0
  327. package/lib/graph-manager/CubeProject.js +84 -0
  328. package/lib/graph-manager/CubeProject.js.map +1 -0
  329. package/lib/graph-manager/CubeProjectCatalog.d.ts +35 -0
  330. package/lib/graph-manager/CubeProjectCatalog.d.ts.map +1 -0
  331. package/lib/graph-manager/CubeProjectCatalog.js +17 -0
  332. package/lib/graph-manager/CubeProjectCatalog.js.map +1 -0
  333. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +63 -1
  334. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
  335. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +50 -1
  336. package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
  337. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts +44 -0
  338. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts.map +1 -0
  339. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js +192 -0
  340. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js.map +1 -0
  341. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +29 -0
  342. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -0
  343. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +84 -0
  344. package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -0
  345. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts +41 -0
  346. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts.map +1 -0
  347. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js +246 -0
  348. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js.map +1 -0
  349. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts +43 -0
  350. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts.map +1 -0
  351. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js +112 -0
  352. package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js.map +1 -0
  353. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -1
  354. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +30 -4
  355. package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -1
  356. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts +23 -0
  357. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts.map +1 -0
  358. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js +68 -0
  359. package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js.map +1 -0
  360. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts +30 -0
  361. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -0
  362. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +140 -0
  363. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -0
  364. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +62 -0
  365. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -0
  366. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +119 -0
  367. package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -0
  368. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts +33 -0
  369. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts.map +1 -0
  370. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js +94 -0
  371. package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js.map +1 -0
  372. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
  373. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +63 -4
  374. package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
  375. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
  376. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +56 -3
  377. package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
  378. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts +67 -0
  379. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts.map +1 -0
  380. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js +238 -0
  381. package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js.map +1 -0
  382. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +34 -0
  383. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -0
  384. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +64 -0
  385. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -0
  386. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts +104 -0
  387. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts.map +1 -0
  388. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js +484 -0
  389. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js.map +1 -0
  390. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +97 -3
  391. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
  392. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +585 -20
  393. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
  394. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts +69 -0
  395. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts.map +1 -0
  396. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js +270 -0
  397. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js.map +1 -0
  398. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts +35 -0
  399. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -0
  400. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +91 -0
  401. package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -0
  402. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts +25 -0
  403. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts.map +1 -0
  404. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js +47 -0
  405. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js.map +1 -0
  406. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts +28 -0
  407. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts.map +1 -0
  408. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js +310 -0
  409. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js.map +1 -0
  410. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts +33 -0
  411. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts.map +1 -0
  412. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js +188 -0
  413. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js.map +1 -0
  414. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +1 -1
  415. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
  416. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +30 -4
  417. package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
  418. package/lib/index.css +2 -2
  419. package/lib/index.css.map +1 -1
  420. package/lib/index.d.ts +11 -1
  421. package/lib/index.d.ts.map +1 -1
  422. package/lib/index.js +10 -1
  423. package/lib/index.js.map +1 -1
  424. package/lib/stores/CubeAddPlacement.d.ts +32 -0
  425. package/lib/stores/CubeAddPlacement.d.ts.map +1 -0
  426. package/lib/stores/CubeAddPlacement.js +40 -0
  427. package/lib/stores/CubeAddPlacement.js.map +1 -0
  428. package/lib/stores/CubeDataProductRecheck.d.ts +27 -0
  429. package/lib/stores/CubeDataProductRecheck.d.ts.map +1 -0
  430. package/lib/stores/CubeDataProductRecheck.js +54 -0
  431. package/lib/stores/CubeDataProductRecheck.js.map +1 -0
  432. package/lib/stores/CubeDataProductRuntimeState.d.ts +88 -0
  433. package/lib/stores/CubeDataProductRuntimeState.d.ts.map +1 -0
  434. package/lib/stores/CubeDataProductRuntimeState.js +190 -0
  435. package/lib/stores/CubeDataProductRuntimeState.js.map +1 -0
  436. package/lib/stores/CubeDataProductWarehouse.d.ts +19 -0
  437. package/lib/stores/CubeDataProductWarehouse.d.ts.map +1 -0
  438. package/lib/stores/CubeDataProductWarehouse.js +25 -0
  439. package/lib/stores/CubeDataProductWarehouse.js.map +1 -0
  440. package/lib/stores/CubeEditorState.d.ts +133 -19
  441. package/lib/stores/CubeEditorState.d.ts.map +1 -1
  442. package/lib/stores/CubeEditorState.js +433 -52
  443. package/lib/stores/CubeEditorState.js.map +1 -1
  444. package/lib/stores/CubeEntrySource.d.ts +78 -0
  445. package/lib/stores/CubeEntrySource.d.ts.map +1 -0
  446. package/lib/stores/CubeEntrySource.js +200 -0
  447. package/lib/stores/CubeEntrySource.js.map +1 -0
  448. package/lib/stores/CubeExamples.d.ts +43 -0
  449. package/lib/stores/CubeExamples.d.ts.map +1 -0
  450. package/lib/stores/CubeExamples.js +296 -0
  451. package/lib/stores/CubeExamples.js.map +1 -0
  452. package/lib/stores/CubeExamplesState.d.ts +45 -0
  453. package/lib/stores/CubeExamplesState.d.ts.map +1 -0
  454. package/lib/stores/CubeExamplesState.js +81 -0
  455. package/lib/stores/CubeExamplesState.js.map +1 -0
  456. package/lib/stores/CubeExecutionState.d.ts +6 -2
  457. package/lib/stores/CubeExecutionState.d.ts.map +1 -1
  458. package/lib/stores/CubeExecutionState.js +34 -8
  459. package/lib/stores/CubeExecutionState.js.map +1 -1
  460. package/lib/stores/CubeExtendTyping.d.ts +72 -0
  461. package/lib/stores/CubeExtendTyping.d.ts.map +1 -0
  462. package/lib/stores/CubeExtendTyping.js +176 -0
  463. package/lib/stores/CubeExtendTyping.js.map +1 -0
  464. package/lib/stores/CubeGridQuickActions.d.ts +48 -0
  465. package/lib/stores/CubeGridQuickActions.d.ts.map +1 -0
  466. package/lib/stores/CubeGridQuickActions.js +124 -0
  467. package/lib/stores/CubeGridQuickActions.js.map +1 -0
  468. package/lib/stores/CubeHost.d.ts +32 -1
  469. package/lib/stores/CubeHost.d.ts.map +1 -1
  470. package/lib/stores/CubeHost.js +21 -1
  471. package/lib/stores/CubeHost.js.map +1 -1
  472. package/lib/stores/CubeIngestRecheck.d.ts +26 -0
  473. package/lib/stores/CubeIngestRecheck.d.ts.map +1 -0
  474. package/lib/stores/CubeIngestRecheck.js +53 -0
  475. package/lib/stores/CubeIngestRecheck.js.map +1 -0
  476. package/lib/stores/CubeNodeEditorState.d.ts +120 -6
  477. package/lib/stores/CubeNodeEditorState.d.ts.map +1 -1
  478. package/lib/stores/CubeNodeEditorState.js +275 -9
  479. package/lib/stores/CubeNodeEditorState.js.map +1 -1
  480. package/lib/stores/CubeShowPureState.d.ts +9 -3
  481. package/lib/stores/CubeShowPureState.d.ts.map +1 -1
  482. package/lib/stores/CubeShowPureState.js +28 -8
  483. package/lib/stores/CubeShowPureState.js.map +1 -1
  484. package/lib/stores/CubeSourcePickerState.d.ts +54 -65
  485. package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
  486. package/lib/stores/CubeSourcePickerState.js +155 -276
  487. package/lib/stores/CubeSourcePickerState.js.map +1 -1
  488. package/lib/stores/CubeSpecTransferState.d.ts +2 -2
  489. package/lib/stores/CubeSpecTransferState.js +2 -2
  490. package/lib/stores/LocalModelCatalog.d.ts +2 -0
  491. package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
  492. package/lib/stores/LocalModelCatalog.js +17 -3
  493. package/lib/stores/LocalModelCatalog.js.map +1 -1
  494. package/lib/stores/editors/CubeAggregationRows.d.ts +80 -0
  495. package/lib/stores/editors/CubeAggregationRows.d.ts.map +1 -0
  496. package/lib/stores/editors/CubeAggregationRows.js +164 -0
  497. package/lib/stores/editors/CubeAggregationRows.js.map +1 -0
  498. package/lib/stores/editors/CubeConcatDraft.d.ts +30 -0
  499. package/lib/stores/editors/CubeConcatDraft.d.ts.map +1 -0
  500. package/lib/stores/editors/CubeConcatDraft.js +44 -0
  501. package/lib/stores/editors/CubeConcatDraft.js.map +1 -0
  502. package/lib/stores/editors/CubeDifferenceDraft.d.ts +49 -0
  503. package/lib/stores/editors/CubeDifferenceDraft.d.ts.map +1 -0
  504. package/lib/stores/editors/CubeDifferenceDraft.js +111 -0
  505. package/lib/stores/editors/CubeDifferenceDraft.js.map +1 -0
  506. package/lib/stores/editors/CubeExtendDraft.d.ts +110 -0
  507. package/lib/stores/editors/CubeExtendDraft.d.ts.map +1 -0
  508. package/lib/stores/editors/CubeExtendDraft.js +359 -0
  509. package/lib/stores/editors/CubeExtendDraft.js.map +1 -0
  510. package/lib/stores/editors/CubeGroupDraft.d.ts +61 -0
  511. package/lib/stores/editors/CubeGroupDraft.d.ts.map +1 -0
  512. package/lib/stores/editors/CubeGroupDraft.js +106 -0
  513. package/lib/stores/editors/CubeGroupDraft.js.map +1 -0
  514. package/lib/stores/editors/CubeIntegerText.d.ts +24 -0
  515. package/lib/stores/editors/CubeIntegerText.d.ts.map +1 -0
  516. package/lib/stores/editors/CubeIntegerText.js +33 -0
  517. package/lib/stores/editors/CubeIntegerText.js.map +1 -0
  518. package/lib/stores/editors/CubeJoinDraft.d.ts +20 -13
  519. package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -1
  520. package/lib/stores/editors/CubeJoinDraft.js +109 -29
  521. package/lib/stores/editors/CubeJoinDraft.js.map +1 -1
  522. package/lib/stores/editors/CubeJoinKeyPairs.d.ts +38 -0
  523. package/lib/stores/editors/CubeJoinKeyPairs.d.ts.map +1 -0
  524. package/lib/stores/editors/CubeJoinKeyPairs.js +33 -0
  525. package/lib/stores/editors/CubeJoinKeyPairs.js.map +1 -0
  526. package/lib/stores/editors/CubeNodeDraft.d.ts +20 -6
  527. package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -1
  528. package/lib/stores/editors/CubeNodeDraft.js +23 -5
  529. package/lib/stores/editors/CubeNodeDraft.js.map +1 -1
  530. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +6 -0
  531. package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
  532. package/lib/stores/editors/CubeNodeDraftRegistry.js +42 -1
  533. package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
  534. package/lib/stores/editors/CubePartitionDraft.d.ts +70 -0
  535. package/lib/stores/editors/CubePartitionDraft.d.ts.map +1 -0
  536. package/lib/stores/editors/CubePartitionDraft.js +154 -0
  537. package/lib/stores/editors/CubePartitionDraft.js.map +1 -0
  538. package/lib/stores/editors/CubeRenameDraft.d.ts +44 -0
  539. package/lib/stores/editors/CubeRenameDraft.d.ts.map +1 -0
  540. package/lib/stores/editors/CubeRenameDraft.js +79 -0
  541. package/lib/stores/editors/CubeRenameDraft.js.map +1 -0
  542. package/lib/stores/editors/CubeRestrictDraft.d.ts +37 -0
  543. package/lib/stores/editors/CubeRestrictDraft.d.ts.map +1 -0
  544. package/lib/stores/editors/CubeRestrictDraft.js +73 -0
  545. package/lib/stores/editors/CubeRestrictDraft.js.map +1 -0
  546. package/lib/stores/editors/CubeRowCountDraft.d.ts +42 -0
  547. package/lib/stores/editors/CubeRowCountDraft.d.ts.map +1 -0
  548. package/lib/stores/editors/CubeRowCountDraft.js +55 -0
  549. package/lib/stores/editors/CubeRowCountDraft.js.map +1 -0
  550. package/lib/stores/editors/CubeSliceDraft.d.ts +42 -0
  551. package/lib/stores/editors/CubeSliceDraft.d.ts.map +1 -0
  552. package/lib/stores/editors/CubeSliceDraft.js +72 -0
  553. package/lib/stores/editors/CubeSliceDraft.js.map +1 -0
  554. package/lib/stores/editors/CubeSortDraft.d.ts +41 -0
  555. package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -0
  556. package/lib/stores/editors/CubeSortDraft.js +73 -0
  557. package/lib/stores/editors/CubeSortDraft.js.map +1 -0
  558. package/lib/stores/editors/CubeSortRows.d.ts +34 -0
  559. package/lib/stores/editors/CubeSortRows.d.ts.map +1 -0
  560. package/lib/stores/editors/CubeSortRows.js +50 -0
  561. package/lib/stores/editors/CubeSortRows.js.map +1 -0
  562. package/lib/stores/fixtures/CubeNorthwindModel.d.ts +7 -0
  563. package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -1
  564. package/lib/stores/fixtures/CubeNorthwindModel.js +99 -87
  565. package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -1
  566. package/lib/stores/fixtures/CubeSampleSql.d.ts +34 -0
  567. package/lib/stores/fixtures/CubeSampleSql.d.ts.map +1 -0
  568. package/lib/stores/fixtures/CubeSampleSql.js +64 -0
  569. package/lib/stores/fixtures/CubeSampleSql.js.map +1 -0
  570. package/lib/stores/fixtures/CubeSportsModel.d.ts +27 -0
  571. package/lib/stores/fixtures/CubeSportsModel.d.ts.map +1 -0
  572. package/lib/stores/fixtures/CubeSportsModel.js +158 -0
  573. package/lib/stores/fixtures/CubeSportsModel.js.map +1 -0
  574. package/lib/stores/fixtures/CubeTradesModel.d.ts +29 -0
  575. package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -0
  576. package/lib/stores/fixtures/CubeTradesModel.js +197 -0
  577. package/lib/stores/fixtures/CubeTradesModel.js.map +1 -0
  578. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts +71 -0
  579. package/lib/stores/source-picker/CubeCsvSetupSql.d.ts.map +1 -0
  580. package/lib/stores/source-picker/CubeCsvSetupSql.js +392 -0
  581. package/lib/stores/source-picker/CubeCsvSetupSql.js.map +1 -0
  582. package/lib/stores/source-picker/CubeDataProductTabState.d.ts +186 -0
  583. package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -0
  584. package/lib/stores/source-picker/CubeDataProductTabState.js +681 -0
  585. package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -0
  586. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +140 -0
  587. package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -0
  588. package/lib/stores/source-picker/CubeDirectConnectionTabState.js +516 -0
  589. package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -0
  590. package/lib/stores/source-picker/CubeIngestTabState.d.ts +114 -0
  591. package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -0
  592. package/lib/stores/source-picker/CubeIngestTabState.js +455 -0
  593. package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -0
  594. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +107 -0
  595. package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -0
  596. package/lib/stores/source-picker/CubeInlineModelTabState.js +347 -0
  597. package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -0
  598. package/lib/stores/source-picker/CubeProjectTabState.d.ts +62 -0
  599. package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -0
  600. package/lib/stores/source-picker/CubeProjectTabState.js +181 -0
  601. package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -0
  602. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +48 -0
  603. package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -0
  604. package/lib/stores/source-picker/CubeSourcePickerTab.js +24 -0
  605. package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -0
  606. package/package.json +12 -8
  607. package/src/__lib__/LegendCubeCommand.ts +5 -0
  608. package/src/__lib__/LegendCubeDataProductLabels.ts +91 -0
  609. package/src/__lib__/LegendCubeDirectConnectionLabels.ts +111 -0
  610. package/src/__lib__/LegendCubeHelpText.ts +46 -2
  611. package/src/__lib__/LegendCubeIngestLabels.ts +40 -0
  612. package/src/__lib__/LegendCubeLabels.ts +192 -4
  613. package/src/__lib__/LegendCubeProjectLabels.ts +25 -0
  614. package/src/__lib__/LegendCubeTesting.ts +1 -0
  615. package/src/__test-utils__/CubeCanvasTestUtils.ts +1 -1
  616. package/src/__test-utils__/CubeConnectionTestSupport.ts +45 -0
  617. package/src/__test-utils__/CubeDirectConnectionFixtures.ts +70 -0
  618. package/src/__test-utils__/CubeEngineTestSupport.ts +73 -0
  619. package/src/__test-utils__/CubeExpressionTestUtils.ts +119 -0
  620. package/src/__test-utils__/CubeOperationsTestUtils.ts +252 -0
  621. package/src/__test-utils__/CubePageTestUtils.tsx +35 -0
  622. package/src/__test-utils__/CubeTestApplication.ts +21 -2
  623. package/src/__test-utils__/FakeCubeConnectionExplorer.ts +111 -0
  624. package/src/__test-utils__/FakeCubeDataProductCatalog.ts +227 -0
  625. package/src/__test-utils__/FakeCubeEngine.ts +32 -2
  626. package/src/__test-utils__/FakeCubeIngestCatalog.ts +180 -0
  627. package/src/__test-utils__/FakeCubeProjectCatalog.ts +89 -0
  628. package/src/components/CubeAddItems.tsx +179 -0
  629. package/src/components/CubeEditor.tsx +73 -44
  630. package/src/components/CubeEntrySourceBanner.tsx +64 -0
  631. package/src/components/CubeNodeIcon.tsx +31 -1
  632. package/src/components/CubeSchemaColumnsTable.tsx +49 -0
  633. package/src/components/canvas/CubeCanvas.tsx +51 -14
  634. package/src/components/canvas/CubeCanvasContextMenu.tsx +31 -30
  635. package/src/components/canvas/CubeCanvasDnd.ts +16 -9
  636. package/src/components/canvas/CubeCanvasElements.ts +12 -3
  637. package/src/components/canvas/CubeCanvasNode.tsx +62 -36
  638. package/src/components/canvas/CubeCanvasNodeFocus.ts +37 -0
  639. package/src/components/canvas/CubeNodeEditorAnchor.ts +82 -0
  640. package/src/components/editors/CubeAggregationRowEditor.tsx +224 -0
  641. package/src/components/editors/CubeColumnChecklist.tsx +130 -0
  642. package/src/components/editors/CubeColumnPicker.tsx +36 -12
  643. package/src/components/editors/CubeConcatEditor.tsx +374 -0
  644. package/src/components/editors/CubeDataProductSourceEditor.tsx +134 -0
  645. package/src/components/editors/CubeDifferenceEditor.tsx +87 -0
  646. package/src/components/editors/CubeDistinctEditor.tsx +28 -0
  647. package/src/components/editors/CubeExtendEditor.tsx +271 -0
  648. package/src/components/editors/CubeFilterEditor.tsx +7 -0
  649. package/src/components/editors/CubeGroupEditor.tsx +135 -0
  650. package/src/components/editors/CubeIngestSourceEditor.tsx +104 -0
  651. package/src/components/editors/CubeIntegerField.tsx +51 -0
  652. package/src/components/editors/CubeJoinEditor.tsx +34 -131
  653. package/src/components/editors/CubeJoinKeyRows.tsx +183 -0
  654. package/src/components/editors/CubeNodeEditorPanel.tsx +103 -29
  655. package/src/components/editors/CubeNodeEditorPopper.tsx +183 -0
  656. package/src/components/editors/CubeNodeEditorRegistry.ts +41 -0
  657. package/src/components/editors/CubePartitionEditor.tsx +208 -0
  658. package/src/components/editors/CubeRenameEditor.tsx +148 -0
  659. package/src/components/editors/CubeRestrictEditor.tsx +103 -0
  660. package/src/components/editors/CubeRowCountEditor.tsx +53 -0
  661. package/src/components/editors/CubeSliceEditor.tsx +69 -0
  662. package/src/components/editors/CubeSortEditor.tsx +84 -0
  663. package/src/components/editors/CubeSortRowEditor.tsx +176 -0
  664. package/src/components/editors/CubeSourceEditor.tsx +42 -40
  665. package/src/components/editors/CubeValueEditor.tsx +2 -1
  666. package/src/components/editors/CubeWarehouseControl.tsx +113 -0
  667. package/src/components/editors/useCubeNodeEditorDismiss.ts +103 -0
  668. package/src/components/examples/CubeExamplesDialog.tsx +199 -0
  669. package/src/components/grid/CubeGridRegion.tsx +49 -10
  670. package/src/components/grid/CubeGridValues.ts +55 -0
  671. package/src/components/grid/CubeResultGrid.tsx +83 -13
  672. package/src/components/palette/CubePalette.tsx +33 -15
  673. package/src/components/source-picker/CubeDataProductTab.tsx +392 -0
  674. package/src/components/source-picker/CubeDirectConnectionTab.tsx +340 -0
  675. package/src/components/source-picker/CubeIngestTab.tsx +232 -0
  676. package/src/components/source-picker/CubeInlineModelTab.tsx +191 -0
  677. package/src/components/source-picker/CubePickerStep.tsx +49 -0
  678. package/src/components/source-picker/CubeProjectTab.tsx +114 -0
  679. package/src/components/source-picker/CubeSourcePicker.tsx +62 -227
  680. package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +1 -1
  681. package/src/graph-manager/CubeConnectionExplorer.ts +106 -0
  682. package/src/graph-manager/CubeDataProduct.ts +150 -0
  683. package/src/graph-manager/CubeDataProductCatalog.ts +245 -0
  684. package/src/graph-manager/CubeDirectConnection.ts +67 -0
  685. package/src/graph-manager/CubeEngine.ts +57 -1
  686. package/src/graph-manager/CubeIngest.ts +144 -0
  687. package/src/graph-manager/CubeIngestCatalog.ts +169 -0
  688. package/src/graph-manager/CubeLakehouseEnvironment.ts +27 -0
  689. package/src/graph-manager/CubeModelOutlineHelper.ts +26 -0
  690. package/src/graph-manager/CubeProject.ts +117 -0
  691. package/src/graph-manager/CubeProjectCatalog.ts +40 -0
  692. package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +145 -1
  693. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.ts +251 -0
  694. package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +101 -0
  695. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.ts +339 -0
  696. package/src/graph-manager/protocol/pure/v1/V1_CubeDirectModel.ts +151 -0
  697. package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +45 -4
  698. package/src/graph-manager/protocol/pure/v1/V1_CubeExpression.ts +89 -0
  699. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +201 -0
  700. package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +183 -0
  701. package/src/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.ts +141 -0
  702. package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +84 -4
  703. package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +89 -3
  704. package/src/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.ts +361 -0
  705. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +116 -0
  706. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.ts +744 -0
  707. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +967 -24
  708. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.ts +459 -0
  709. package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +147 -0
  710. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.ts +61 -0
  711. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.ts +337 -0
  712. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.ts +206 -0
  713. package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +48 -4
  714. package/src/index.ts +20 -0
  715. package/src/stores/CubeAddPlacement.ts +67 -0
  716. package/src/stores/CubeDataProductRecheck.ts +93 -0
  717. package/src/stores/CubeDataProductRuntimeState.ts +256 -0
  718. package/src/stores/CubeDataProductWarehouse.ts +40 -0
  719. package/src/stores/CubeEditorState.ts +621 -68
  720. package/src/stores/CubeEntrySource.ts +278 -0
  721. package/src/stores/CubeExamples.ts +457 -0
  722. package/src/stores/CubeExamplesState.ts +108 -0
  723. package/src/stores/CubeExecutionState.ts +60 -8
  724. package/src/stores/CubeExtendTyping.ts +291 -0
  725. package/src/stores/CubeGridQuickActions.ts +184 -0
  726. package/src/stores/CubeHost.ts +71 -1
  727. package/src/stores/CubeIngestRecheck.ts +92 -0
  728. package/src/stores/CubeNodeEditorState.ts +348 -10
  729. package/src/stores/CubeShowPureState.ts +33 -8
  730. package/src/stores/CubeSourcePickerState.ts +160 -330
  731. package/src/stores/CubeSpecTransferState.ts +2 -2
  732. package/src/stores/LocalModelCatalog.ts +22 -3
  733. package/src/stores/editors/CubeAggregationRows.ts +299 -0
  734. package/src/stores/editors/CubeConcatDraft.ts +49 -0
  735. package/src/stores/editors/CubeDifferenceDraft.ts +147 -0
  736. package/src/stores/editors/CubeExtendDraft.ts +532 -0
  737. package/src/stores/editors/CubeGroupDraft.ts +145 -0
  738. package/src/stores/editors/CubeIntegerText.ts +34 -0
  739. package/src/stores/editors/CubeJoinDraft.ts +170 -54
  740. package/src/stores/editors/CubeJoinKeyPairs.ts +68 -0
  741. package/src/stores/editors/CubeNodeDraft.ts +26 -6
  742. package/src/stores/editors/CubeNodeDraftRegistry.ts +60 -1
  743. package/src/stores/editors/CubePartitionDraft.ts +214 -0
  744. package/src/stores/editors/CubeRenameDraft.ts +110 -0
  745. package/src/stores/editors/CubeRestrictDraft.ts +83 -0
  746. package/src/stores/editors/CubeRowCountDraft.ts +69 -0
  747. package/src/stores/editors/CubeSliceDraft.ts +87 -0
  748. package/src/stores/editors/CubeSortDraft.ts +98 -0
  749. package/src/stores/editors/CubeSortRows.ts +84 -0
  750. package/src/stores/fixtures/CubeNorthwindModel.ts +103 -88
  751. package/src/stores/fixtures/CubeSampleSql.ts +85 -0
  752. package/src/stores/fixtures/CubeSportsModel.ts +182 -0
  753. package/src/stores/fixtures/CubeTradesModel.ts +241 -0
  754. package/src/stores/source-picker/CubeCsvSetupSql.ts +444 -0
  755. package/src/stores/source-picker/CubeDataProductTabState.ts +839 -0
  756. package/src/stores/source-picker/CubeDirectConnectionTabState.ts +647 -0
  757. package/src/stores/source-picker/CubeIngestTabState.ts +551 -0
  758. package/src/stores/source-picker/CubeInlineModelTabState.ts +448 -0
  759. package/src/stores/source-picker/CubeProjectTabState.ts +218 -0
  760. package/src/stores/source-picker/CubeSourcePickerTab.ts +50 -0
  761. package/tsconfig.json +104 -0
@@ -15,19 +15,30 @@
15
15
  */
16
16
 
17
17
  import {
18
+ DataProductAccessPointSource,
19
+ IngestDatasetSource,
18
20
  buildSchemasAndValidity,
19
21
  createNodeRegistry,
20
22
  CubeDocument,
21
23
  diffSchemas,
24
+ Extend,
25
+ findLostSortOrders,
26
+ isTypingError,
27
+ type JsonObject,
28
+ MESSAGE_SORT_COLUMNS_CUT,
29
+ MESSAGE_SORT_COLUMNS_DROPPED,
30
+ MESSAGE_SORT_ORDER_LOST,
22
31
  type ModelContext,
23
32
  type NodeRegistry,
24
33
  type Query,
25
34
  QueryEmitter,
26
35
  type QueryNode,
36
+ type QueryRule,
27
37
  RelationalTableSource,
28
38
  rereadQueryFilterValues,
29
39
  type Schema,
30
40
  type SchemaInferenceResult,
41
+ type SourceDefinition,
31
42
  } from '@finos/legend-cube';
32
43
  import type { CommandRegistrar } from '@finos/legend-application';
33
44
  import type { GeneratorFn } from '@finos/legend-shared';
@@ -36,25 +47,57 @@ import {
36
47
  computed,
37
48
  flow,
38
49
  flowResult,
50
+ type IReactionDisposer,
39
51
  makeObservable,
40
52
  observable,
53
+ reaction,
41
54
  } from 'mobx';
42
55
  import { LEGEND_CUBE_COMMAND_KEY } from '../__lib__/LegendCubeCommand.js';
56
+ import { LEGEND_CUBE_TEST_ID } from '../__lib__/LegendCubeTesting.js';
43
57
  import {
44
58
  CUBE_EDITOR_CLOSED_REASON,
45
59
  DEFAULT_ROW_LIMIT,
46
60
  getSchemaDriftWarning,
61
+ getExtendRetypeWarning,
47
62
  getSourceRecheckWarning,
48
63
  LEGEND_CUBE_USER_DATA_KEY,
49
64
  MAX_UNDO_STEPS,
50
65
  } from '../__lib__/LegendCubeLabels.js';
66
+ import {
67
+ CUBE_DATA_PRODUCT_RECHECK_MESSAGE,
68
+ getAccessPointDriftWarning,
69
+ getAccessPointRecheckWarning,
70
+ } from '../__lib__/LegendCubeDataProductLabels.js';
71
+ import {
72
+ CUBE_INGEST_RECHECK_MESSAGE,
73
+ getDataSetDriftWarning,
74
+ getDataSetRecheckWarning,
75
+ } from '../__lib__/LegendCubeIngestLabels.js';
76
+ import { isCubeDataProductModel } from '../graph-manager/CubeDataProduct.js';
77
+ import { isCubeIngestModel } from '../graph-manager/CubeIngest.js';
51
78
  import {
52
79
  CubeEngineError,
53
80
  CubeEngineErrorKind,
54
81
  type CubeModelOutline,
82
+ type NodeId,
55
83
  } from '../graph-manager/CubeEngine.js';
84
+ import { getDatabaseType } from '../graph-manager/CubeModelOutlineHelper.js';
85
+ import { recheckCubeDataProductSources } from './CubeDataProductRecheck.js';
86
+ import { recheckCubeIngestSources } from './CubeIngestRecheck.js';
87
+ import { CubeDataProductRuntimeState } from './CubeDataProductRuntimeState.js';
88
+ import { CubeExamplesState } from './CubeExamplesState.js';
56
89
  import { CubeExecutionState } from './CubeExecutionState.js';
57
- import type { CubeHost } from './CubeHost.js';
90
+ import { CubeExtendDraft } from './editors/CubeExtendDraft.js';
91
+ import {
92
+ buildCubeExtendTypingLambdas,
93
+ createStaleCubeExtendTypingRule,
94
+ getCubeExtendTypingUpstream,
95
+ getCubeExtendUpstream,
96
+ isCubeExtendTypingCurrent,
97
+ isSameCubeExtendTyping,
98
+ readCubeExtendTyping,
99
+ } from './CubeExtendTyping.js';
100
+ import { type CubeHost, loadCubeModelOutline } from './CubeHost.js';
58
101
  import { CubeNodeEditorState } from './CubeNodeEditorState.js';
59
102
  import { CubeShowPureState } from './CubeShowPureState.js';
60
103
  import { CubeSourcePickerState } from './CubeSourcePickerState.js';
@@ -79,6 +122,18 @@ const isTypingText = (): boolean => {
79
122
  );
80
123
  };
81
124
 
125
+ /** Focus is in the node editor, whose shortcuts give it back to the node (PLAN §11.8) */
126
+ const isFocusInNodeEditor = (): boolean =>
127
+ document.activeElement?.closest(
128
+ `[data-testid="${LEGEND_CUBE_TEST_ID.NODE_EDITOR}"]`,
129
+ ) !== null && document.activeElement !== null;
130
+
131
+ /** A source Cube types again to see drift: a table, or a data product's access point */
132
+ type RecheckedSource =
133
+ | RelationalTableSource
134
+ | DataProductAccessPointSource
135
+ | IngestDatasetSource;
136
+
82
137
  /**
83
138
  * The state of one Cube page (PLAN §7.8). The document is immutable: every
84
139
  * edit makes a new one through `applyDocument`, which keeps the previous one
@@ -89,9 +144,14 @@ export class CubeEditorState implements CommandRegistrar {
89
144
  readonly host: CubeHost;
90
145
  /** One registry for inference, emission and the saved spec */
91
146
  readonly registry: NodeRegistry;
147
+ /** The editor's own query rule: an Extend typed for another input than its own waits to be typed again (PLAN §11.7) */
148
+ private readonly staleExtendTyping: QueryRule;
92
149
  readonly execution: CubeExecutionState;
150
+ /** Where a lakehouse cube runs, a data product's or an ingest one's: its class and warehouse */
151
+ readonly dataProductRuntime: CubeDataProductRuntimeState;
93
152
  readonly sourcePicker: CubeSourcePickerState;
94
153
  readonly specTransfer: CubeSpecTransferState;
154
+ readonly examples: CubeExamplesState;
95
155
  readonly showPure: CubeShowPureState;
96
156
  readonly nodeEditor: CubeNodeEditorState;
97
157
 
@@ -114,6 +174,10 @@ export class CubeEditorState implements CommandRegistrar {
114
174
  new Map();
115
175
  /** Sources sent to the engine to be typed again, until it answers */
116
176
  private pendingSources: ReadonlySet<QueryNode> = new Set();
177
+ /** Extends sent to the engine to be typed, until it answers (PLAN §11.7) */
178
+ private typingExtends: ReadonlySet<QueryNode> = new Set();
179
+ /** Types the Extends that wait for it, whenever one does (PLAN §11.7 Q4) */
180
+ private readonly retyping: IReactionDisposer;
117
181
  /** The rows a run returns; kept per user, never in the cube */
118
182
  rowLimit: number;
119
183
  /** The palette shows icons only; kept per user, never in the cube */
@@ -129,8 +193,15 @@ export class CubeEditorState implements CommandRegistrar {
129
193
  private readonly importedOver = new WeakSet<CubeDocument>();
130
194
 
131
195
  constructor(host: CubeHost, document = new CubeDocument()) {
132
- makeObservable<CubeEditorState, 'pendingSources' | 'modelOutlines'>(this, {
196
+ makeObservable<
197
+ CubeEditorState,
198
+ 'pendingSources' | 'modelOutlines' | 'typingExtends'
199
+ >(this, {
133
200
  pendingSources: observable.ref,
201
+ typingExtends: observable.ref,
202
+ extendsToType: computed,
203
+ isTypingExtends: computed,
204
+ retypeExtends: flow,
134
205
  modelOutlines: observable.ref,
135
206
  modelOutline: computed,
136
207
  loadModelOutline: flow,
@@ -138,6 +209,7 @@ export class CubeEditorState implements CommandRegistrar {
138
209
  history: observable.ref,
139
210
  hostIssues: observable.ref,
140
211
  warnings: observable.ref,
212
+ derivedWarnings: computed,
141
213
  isResolvingSources: computed,
142
214
  rowLimit: observable,
143
215
  isPaletteCollapsed: observable,
@@ -145,6 +217,9 @@ export class CubeEditorState implements CommandRegistrar {
145
217
  analysis: computed,
146
218
  emitter: computed,
147
219
  canUndo: computed,
220
+ hasEditsToApply: computed,
221
+ executeEdited: action,
222
+ undoEdited: action,
148
223
  isDialogOpen: computed,
149
224
  applyDocument: action,
150
225
  undo: action,
@@ -155,6 +230,7 @@ export class CubeEditorState implements CommandRegistrar {
155
230
  select: action,
156
231
  connect: action,
157
232
  addNode: action,
233
+ addConfiguredNode: action,
158
234
  dropNode: action,
159
235
  removeNode: action,
160
236
  swapInputs: action,
@@ -166,6 +242,10 @@ export class CubeEditorState implements CommandRegistrar {
166
242
  });
167
243
  this.host = host;
168
244
  this.registry = createNodeRegistry();
245
+ this.staleExtendTyping = createStaleCubeExtendTypingRule(
246
+ this.registry,
247
+ () => this.document.context?.model,
248
+ );
169
249
  this.document = document;
170
250
  const storedLimit = host.applicationStore.userDataService.getNumericValue(
171
251
  LEGEND_CUBE_USER_DATA_KEY.ROW_LIMIT,
@@ -178,18 +258,35 @@ export class CubeEditorState implements CommandRegistrar {
178
258
  LEGEND_CUBE_USER_DATA_KEY.PALETTE_COLLAPSED,
179
259
  ) ?? false;
180
260
  this.execution = new CubeExecutionState(this);
261
+ this.dataProductRuntime = new CubeDataProductRuntimeState(this);
181
262
  this.sourcePicker = new CubeSourcePickerState(this);
182
263
  this.specTransfer = new CubeSpecTransferState(this);
264
+ this.examples = new CubeExamplesState(this);
183
265
  this.showPure = new CubeShowPureState(this);
184
266
  this.nodeEditor = new CubeNodeEditorState(this);
267
+ this.retyping = reaction(
268
+ () => this.extendsToType,
269
+ (waiting) => {
270
+ if (waiting.length) {
271
+ flowResult(this.retypeExtends(waiting)).catch(
272
+ this.host.applicationStore.alertUnhandledError,
273
+ );
274
+ }
275
+ },
276
+ { fireImmediately: true },
277
+ );
185
278
  }
186
279
 
187
- /** Each node's schema and errors, query-level rules included, as the emitter sees them */
280
+ /**
281
+ * Each node's schema and errors, query-level rules included, as the
282
+ * emitter sees them, and an Extend typed for another input than its own
283
+ * waiting (`ERR_TYPING`), which only the editor can tell
284
+ */
188
285
  get analysis(): SchemaInferenceResult {
189
- return buildSchemasAndValidity(
190
- this.document.query,
191
- this.registry.queryRules,
192
- );
286
+ return buildSchemasAndValidity(this.document.query, [
287
+ ...this.registry.queryRules,
288
+ this.staleExtendTyping,
289
+ ]);
193
290
  }
194
291
 
195
292
  get emitter(): QueryEmitter {
@@ -208,6 +305,206 @@ export class CubeEditorState implements CommandRegistrar {
208
305
  return this.pendingSources.has(node);
209
306
  }
210
307
 
308
+ /**
309
+ * The Extends of the cube shown that wait for the engine to type their
310
+ * columns, their input valid, and that aren't being typed (PLAN §11.7):
311
+ * new expressions, or an input that changed
312
+ */
313
+ get extendsToType(): readonly Extend[] {
314
+ const { validity } = this.analysis;
315
+ return this.document.query.nodes.filter(
316
+ (node): node is Extend =>
317
+ node instanceof Extend &&
318
+ !this.typingExtends.has(node) &&
319
+ (validity.get(node.id) ?? []).some(isTypingError),
320
+ );
321
+ }
322
+
323
+ /** The cube shown has Extends the engine is typing */
324
+ get isTypingExtends(): boolean {
325
+ return this.document.query.nodes.some((node) =>
326
+ this.typingExtends.has(node),
327
+ );
328
+ }
329
+
330
+ /** The node waits for the engine to type it, or is being typed: an Extend (PLAN §11.7) */
331
+ isTypingNode(node: QueryNode): boolean {
332
+ return (
333
+ this.typingExtends.has(node) ||
334
+ (this.analysis.validity.get(node.id) ?? []).some(isTypingError)
335
+ );
336
+ }
337
+
338
+ /**
339
+ * Types Extends' columns with the engine, in one call, outside the undo
340
+ * history (PLAN §11.7 Q4): each for the input it has now, its columns
341
+ * after its input's relation, as typing types any node. The typing goes in
342
+ * place of the very nodes sent, in the cube shown and the undo snapshots
343
+ * that give the engine the same input; one the user changed meanwhile is
344
+ * left to type again. Each typing records the input as the engine was given
345
+ * it (`upstream`). A typing the engine couldn't give names the column it
346
+ * failed on; when the engine can't be reached, a typing still current for
347
+ * the input is kept, with a warning, as a source's saved columns are.
348
+ */
349
+ *retypeExtends(nodes: readonly Extend[]): GeneratorFn<void> {
350
+ const { context, query } = this.document;
351
+ if (!context) {
352
+ return;
353
+ }
354
+ const { schemas } = this.analysis;
355
+ const emitter = new QueryEmitter(query, this.registry);
356
+ const requests = nodes.flatMap((node) => {
357
+ const [inputId] = query.getInputIds(node.id);
358
+ const input = inputId === undefined ? undefined : schemas.get(inputId);
359
+ if (
360
+ query.getNode(node.id) !== node ||
361
+ this.typingExtends.has(node) ||
362
+ !input ||
363
+ node.columns.some(({ lambda }) => lambda === undefined)
364
+ ) {
365
+ return [];
366
+ }
367
+ const columns = node.columns.map(({ name, lambda }) => ({
368
+ name,
369
+ lambda: lambda as JsonObject,
370
+ }));
371
+ return [
372
+ {
373
+ node,
374
+ input,
375
+ columns,
376
+ upstream: getCubeExtendUpstream(emitter, node.id, context.model),
377
+ lambdas: buildCubeExtendTypingLambdas(
378
+ query,
379
+ node,
380
+ columns,
381
+ this.registry,
382
+ false,
383
+ ),
384
+ },
385
+ ];
386
+ });
387
+ if (!requests.length) {
388
+ return;
389
+ }
390
+ const sent = requests.map(({ node }) => node);
391
+ this.typingExtends = new Set([...this.typingExtends, ...sent]);
392
+ let answers: ReadonlyMap<NodeId, Schema | CubeEngineError>;
393
+ try {
394
+ answers = (yield this.host.engine.typeLambdas(
395
+ context.model,
396
+ new Map(requests.flatMap(({ lambdas }) => [...lambdas])),
397
+ )) as ReadonlyMap<NodeId, Schema | CubeEngineError>;
398
+ } catch (error) {
399
+ const failure =
400
+ error instanceof CubeEngineError
401
+ ? error
402
+ : new CubeEngineError(
403
+ CubeEngineErrorKind.NETWORK,
404
+ error instanceof Error ? error.message : String(error),
405
+ );
406
+ answers = new Map(
407
+ requests.flatMap(({ lambdas }) =>
408
+ [...lambdas.keys()].map((key) => [key, failure] as const),
409
+ ),
410
+ );
411
+ } finally {
412
+ this.typingExtends = new Set(
413
+ [...this.typingExtends].filter(
414
+ (node) => !sent.includes(node as Extend),
415
+ ),
416
+ );
417
+ }
418
+ // a typing that comes back the same leaves its node, and the query, alone
419
+ const warnings = new Map(this.warnings);
420
+ const replacements = new Map<QueryNode, QueryNode>(
421
+ requests.flatMap(({ node, input, columns, upstream }) => {
422
+ const { typing, error } = readCubeExtendTyping(
423
+ answers,
424
+ node,
425
+ input,
426
+ columns,
427
+ upstream,
428
+ );
429
+ if (
430
+ error?.kind === CubeEngineErrorKind.NETWORK &&
431
+ isCubeExtendTypingCurrent(node, input, upstream)
432
+ ) {
433
+ warnings.set(node.key, [getExtendRetypeWarning(error.firstLine)]);
434
+ return [];
435
+ }
436
+ warnings.delete(node.key);
437
+ return isSameCubeExtendTyping(typing, node.typing)
438
+ ? []
439
+ : [[node, node.withTyping(typing)] as const];
440
+ }),
441
+ );
442
+ this.warnings = warnings;
443
+ // an undo snapshot whose input differs keeps the typing it had
444
+ const emitters = new Map<Query, QueryEmitter>([[query, emitter]]);
445
+ this.replaceOutsideHistory(replacements, (snapshot, resolved) => {
446
+ const upstream = getCubeExtendTypingUpstream((resolved as Extend).typing);
447
+ if (upstream === undefined) {
448
+ return true;
449
+ }
450
+ let snapshotEmitter = emitters.get(snapshot);
451
+ if (!snapshotEmitter) {
452
+ snapshotEmitter = new QueryEmitter(snapshot, this.registry);
453
+ emitters.set(snapshot, snapshotEmitter);
454
+ }
455
+ return (
456
+ getCubeExtendUpstream(snapshotEmitter, resolved.id, context.model) ===
457
+ upstream
458
+ );
459
+ });
460
+ }
461
+
462
+ /**
463
+ * Warnings worked out from the query, by node id: a Sort whose order is
464
+ * lost before it is used (PLAN §11.4). Never stored and never errors, so
465
+ * Execute stays enabled; they go as soon as the query no longer loses it.
466
+ * A partial loss names each node that removes some of the Sort's columns,
467
+ * then the columns that came after a removed one. A loss waits until the
468
+ * Sort and every node it names have no errors, e.g. a Restrict just added,
469
+ * with no column yet: their own errors come first.
470
+ */
471
+ get derivedWarnings(): ReadonlyMap<string, readonly string[]> {
472
+ const { validity, schemas } = this.analysis;
473
+ const isValid = (nodeId: string): boolean =>
474
+ validity.get(nodeId)?.length === 0;
475
+ const { query } = this.document;
476
+ return new Map(
477
+ Array.from(findLostSortOrders(query, undefined, schemas))
478
+ .filter(
479
+ ([sortId, loss]) =>
480
+ isValid(sortId) &&
481
+ isValid(loss.nodeId) &&
482
+ (loss.removals ?? []).every(({ nodeId }) => isValid(nodeId)),
483
+ )
484
+ .map(([sortId, loss]) => [
485
+ sortId,
486
+ loss.removals
487
+ ? [
488
+ ...loss.removals.map(({ nodeId, columns }) =>
489
+ MESSAGE_SORT_COLUMNS_DROPPED(columns, nodeId),
490
+ ),
491
+ ...(loss.cutColumns?.length
492
+ ? [MESSAGE_SORT_COLUMNS_CUT(loss.cutColumns)]
493
+ : []),
494
+ ]
495
+ : [MESSAGE_SORT_ORDER_LOST(loss.nodeId)],
496
+ ]),
497
+ );
498
+ }
499
+
500
+ /** A node's warnings: the stored ones (by key), then the derived ones (by id) */
501
+ getNodeWarnings(node: QueryNode): readonly string[] {
502
+ return [
503
+ ...(this.warnings.get(node.key) ?? []),
504
+ ...(this.derivedWarnings.get(node.id) ?? []),
505
+ ];
506
+ }
507
+
211
508
  /**
212
509
  * The node's errors, each once: its own and those of the query rules, then
213
510
  * the first line of the engine's error on it
@@ -225,20 +522,59 @@ export class CubeEditorState implements CommandRegistrar {
225
522
  /** The outline of the cube's model, once an editor has loaded it */
226
523
  get modelOutline(): CubeModelOutline | undefined {
227
524
  const model = this.document.context?.model;
228
- return model === undefined ? undefined : this.modelOutlines.get(model);
525
+ return model === undefined ? undefined : this.getModelOutline(model);
526
+ }
527
+
528
+ /** The outline of a model, once loaded */
529
+ getModelOutline(model: ModelContext): CubeModelOutline | undefined {
530
+ return this.modelOutlines.get(model);
229
531
  }
230
532
 
231
533
  /**
232
- * Loads the outline of the cube's model, once per model. It only adds
233
- * warnings, so a model that fails to load shows none.
534
+ * The database type a run of the query up to the node needs, with the
535
+ * model's runtime (PLAN §11.4), from the model's outline once it is loaded
536
+ * (`loadModelOutline`): the type of the runtime's connections to the
537
+ * databases the node reads. None without an outline, which writes every
538
+ * operation the native way.
234
539
  */
235
- *loadModelOutline(): GeneratorFn<void> {
236
- const model = this.document.context?.model;
540
+ getRunDatabaseType(
541
+ query: Query,
542
+ nodeId: string,
543
+ model: ModelContext,
544
+ runtime: string,
545
+ ): string | undefined {
546
+ const outline = this.getModelOutline(model);
547
+ if (!outline) {
548
+ return undefined;
549
+ }
550
+ const databases = new Set<string>();
551
+ const visit = (id: string): void => {
552
+ const node = query.getNode(id);
553
+ if (node instanceof RelationalTableSource) {
554
+ databases.add(node.database);
555
+ }
556
+ query
557
+ .getInputIds(id)
558
+ .forEach((inputId) => inputId !== undefined && visit(inputId));
559
+ };
560
+ visit(nodeId);
561
+ return getDatabaseType(outline, runtime, [...databases]);
562
+ }
563
+
564
+ /**
565
+ * Loads the outline of a model, the cube's by default, once per model. It
566
+ * only adds warnings and database types, so a model that fails to load
567
+ * shows none and runs every operation the native way.
568
+ */
569
+ *loadModelOutline(
570
+ model: ModelContext | undefined = this.document.context?.model,
571
+ ): GeneratorFn<void> {
237
572
  if (model === undefined || this.modelOutlines.has(model)) {
238
573
  return;
239
574
  }
240
575
  try {
241
- const outline = (yield this.host.modelCatalog.loadOutline(
576
+ const outline = (yield loadCubeModelOutline(
577
+ this.host,
242
578
  model,
243
579
  )) as CubeModelOutline;
244
580
  this.modelOutlines = new Map([...this.modelOutlines, [model, outline]]);
@@ -251,6 +587,7 @@ export class CubeEditorState implements CommandRegistrar {
251
587
  get isDialogOpen(): boolean {
252
588
  return (
253
589
  this.sourcePicker.isOpen ||
590
+ this.examples.isOpen ||
254
591
  this.specTransfer.mode !== undefined ||
255
592
  this.showPure.isOpen
256
593
  );
@@ -260,27 +597,93 @@ export class CubeEditorState implements CommandRegistrar {
260
597
  * The page's keyboard shortcuts, while it is open (spec §17.12). Each does
261
598
  * nothing when its button can't be used, and nothing while a Cube dialog
262
599
  * is open, since a dialog doesn't stop the app's shortcuts (user's choice,
263
- * 2026-10-07). Undo leaves Ctrl+Z to a text field that has the focus.
600
+ * 2026-10-07), or while something opened from the node editor holds it
601
+ * open. Like their buttons, they finish the node editor first (PLAN §11.8):
602
+ * F9 runs the edited query, and Ctrl+Z undoes what finishing applied. Undo
603
+ * leaves Ctrl+Z to a text field that has the focus.
264
604
  */
265
605
  registerCommands(): void {
266
- const { commandService, alertUnhandledError } = this.host.applicationStore;
606
+ const { commandService } = this.host.applicationStore;
267
607
  commandService.registerCommand({
268
608
  key: LEGEND_CUBE_COMMAND_KEY.EXECUTE,
269
609
  trigger: () =>
270
610
  !this.isDialogOpen &&
271
- this.execution.canExecute &&
272
- !this.execution.isRunning,
611
+ !this.nodeEditor.isHeld &&
612
+ !this.execution.isRunning &&
613
+ (this.execution.canExecute || this.hasEditsToApply),
614
+ action: () =>
615
+ this.nodeEditor.runFromKeyboard(
616
+ () => this.executeEdited(),
617
+ isFocusInNodeEditor(),
618
+ ),
619
+ });
620
+ // F10 in the Extend editor (PLAN §11.7)
621
+ commandService.registerCommand({
622
+ key: LEGEND_CUBE_COMMAND_KEY.VALIDATE_EXPRESSIONS,
623
+ trigger: () => {
624
+ const { draft } = this.nodeEditor;
625
+ return (
626
+ !this.isDialogOpen &&
627
+ !this.readOnly &&
628
+ draft instanceof CubeExtendDraft &&
629
+ !draft.validating
630
+ );
631
+ },
273
632
  action: () => {
274
- flowResult(this.execution.execute()).catch(alertUnhandledError);
633
+ const { draft } = this.nodeEditor;
634
+ if (draft instanceof CubeExtendDraft) {
635
+ flowResult(draft.validate()).catch(
636
+ this.host.applicationStore.alertUnhandledError,
637
+ );
638
+ }
275
639
  },
276
640
  });
277
641
  commandService.registerCommand({
278
642
  key: LEGEND_CUBE_COMMAND_KEY.UNDO,
279
- trigger: () => !this.isDialogOpen && this.canUndo && !isTypingText(),
280
- action: () => this.undo(),
643
+ trigger: () =>
644
+ !this.isDialogOpen &&
645
+ !this.nodeEditor.isHeld &&
646
+ (this.canUndo || this.hasEditsToApply) &&
647
+ !isTypingText(),
648
+ action: () =>
649
+ this.nodeEditor.runFromKeyboard(
650
+ () => this.undoEdited(),
651
+ isFocusInNodeEditor(),
652
+ ),
281
653
  });
282
654
  }
283
655
 
656
+ /** The node editor has edits that closing it would apply */
657
+ get hasEditsToApply(): boolean {
658
+ return this.nodeEditor.hasChanges && !this.readOnly;
659
+ }
660
+
661
+ /**
662
+ * Execute, as its button and F9 do (spec §17.5): finishes the node editor
663
+ * first, so the edits run, then runs the query if it can; runs nothing
664
+ * when the edits had to be dropped, since the run would not be what the
665
+ * user edited
666
+ */
667
+ executeEdited(): void {
668
+ if (!this.nodeEditor.finishApplied() || !this.execution.canExecute) {
669
+ return;
670
+ }
671
+ flowResult(this.execution.execute()).catch(
672
+ this.host.applicationStore.alertUnhandledError,
673
+ );
674
+ }
675
+
676
+ /**
677
+ * Undo, as its button and Ctrl+Z do: finishes the node editor first, then
678
+ * undoes the last change, which drops the edits it just applied; when the
679
+ * edits had to be dropped instead, that was the undo
680
+ */
681
+ undoEdited(): void {
682
+ if (this.nodeEditor.finishApplied()) {
683
+ this.undo();
684
+ }
685
+ }
686
+
284
687
  deregisterCommands(): void {
285
688
  Object.values(LEGEND_CUBE_COMMAND_KEY).forEach((key) =>
286
689
  this.host.applicationStore.commandService.deregisterCommand(key),
@@ -320,11 +723,22 @@ export class CubeEditorState implements CommandRegistrar {
320
723
  flowResult(this.reresolveSources()).catch(
321
724
  this.host.applicationStore.alertUnhandledError,
322
725
  );
726
+ // typed once on load too, as sources are checked again: the model may
727
+ // have changed the types of its functions (PLAN §11.7)
728
+ flowResult(
729
+ this.retypeExtends(
730
+ next.query.nodes.filter(
731
+ (node): node is Extend => node instanceof Extend,
732
+ ),
733
+ ),
734
+ ).catch(this.host.applicationStore.alertUnhandledError);
323
735
  }
324
736
 
325
737
  /**
326
- * Types the cube's tables again, in one engine call, outside the undo
327
- * history (PLAN §10.3, Settled before M1.8):
738
+ * Types the cube's sources again, outside the undo history (PLAN §10.3,
739
+ * Settled before M1.8): its tables in one engine call, a data product
740
+ * cube's access points through the catalog, from the deployed artifact at
741
+ * the cube's version (PLAN §6.8). Warnings name the kind of source:
328
742
  * - a table whose columns are the saved ones is left as it is;
329
743
  * - a table that changed takes its new columns, with a warning listing the
330
744
  * changes;
@@ -339,60 +753,118 @@ export class CubeEditorState implements CommandRegistrar {
339
753
  * left alone.
340
754
  *
341
755
  * `only` types just these sources of the cube shown, e.g. one Refresh. A
342
- * table found unchanged loses any earlier warning.
756
+ * table found unchanged loses any earlier warning. `fresh` reads a data
757
+ * product's artifact again rather than what this page visit read.
343
758
  */
344
759
  *reresolveSources(
345
- only?: readonly RelationalTableSource[],
760
+ only?: readonly RecheckedSource[],
761
+ fresh = false,
346
762
  ): GeneratorFn<void> {
347
763
  const { context, query } = this.document;
348
- const sources = (only ?? query.nodes).filter(
764
+ if (!context) {
765
+ return;
766
+ }
767
+ const kept = (only ?? query.nodes).filter(
768
+ (node) => query.getNode(node.id) === node,
769
+ );
770
+ const tables = kept.filter(
349
771
  (node): node is RelationalTableSource =>
350
- node instanceof RelationalTableSource &&
351
- query.getNode(node.id) === node,
772
+ node instanceof RelationalTableSource,
352
773
  );
353
- if (!context || !sources.length) {
774
+ // an access point on a cube of tables is the no-mix rule's to flag
775
+ const accessPoints = isCubeDataProductModel(context.model)
776
+ ? kept.filter(
777
+ (node): node is DataProductAccessPointSource =>
778
+ node instanceof DataProductAccessPointSource,
779
+ )
780
+ : [];
781
+ const dataSets = isCubeIngestModel(context.model)
782
+ ? kept.filter(
783
+ (node): node is IngestDatasetSource =>
784
+ node instanceof IngestDatasetSource,
785
+ )
786
+ : [];
787
+ const sources: readonly RecheckedSource[] = [
788
+ ...tables,
789
+ ...accessPoints,
790
+ ...dataSets,
791
+ ];
792
+ if (!sources.length) {
354
793
  return;
355
794
  }
356
795
  this.pendingSources = new Set([...this.pendingSources, ...sources]);
357
796
  let answers: ReadonlyMap<string, Schema | CubeEngineError>;
358
797
  try {
359
- answers = (yield this.host.engine.resolveSchemas(
360
- context.model,
361
- new Map(
362
- sources.map((source) => [
363
- source.id,
364
- [source.database, source.schema, source.table],
365
- ]),
366
- ),
367
- )) as Map<string, Schema | CubeEngineError>;
368
- } catch (error) {
369
- const failure =
370
- error instanceof CubeEngineError
371
- ? error
372
- : new CubeEngineError(
373
- CubeEngineErrorKind.NETWORK,
374
- error instanceof Error ? error.message : String(error),
375
- );
376
- answers = new Map(sources.map((source) => [source.id, failure]));
798
+ const [tableAnswers, accessPointAnswers, dataSetAnswers] =
799
+ (yield Promise.all([
800
+ tables.length
801
+ ? this.host.engine
802
+ .resolveSchemas(
803
+ context.model,
804
+ new Map(
805
+ tables.map((source) => [
806
+ source.id,
807
+ [source.database, source.schema, source.table],
808
+ ]),
809
+ ),
810
+ )
811
+ .catch((error: unknown) => {
812
+ const failure =
813
+ error instanceof CubeEngineError
814
+ ? error
815
+ : new CubeEngineError(
816
+ CubeEngineErrorKind.NETWORK,
817
+ error instanceof Error
818
+ ? error.message
819
+ : String(error),
820
+ );
821
+ return new Map(tables.map((source) => [source.id, failure]));
822
+ })
823
+ : new Map(),
824
+ accessPoints.length
825
+ ? recheckCubeDataProductSources(
826
+ this.host.dataProductCatalog,
827
+ context.model,
828
+ accessPoints,
829
+ fresh,
830
+ )
831
+ : new Map(),
832
+ dataSets.length
833
+ ? recheckCubeIngestSources(
834
+ this.host.ingestCatalog,
835
+ context.model,
836
+ dataSets,
837
+ fresh,
838
+ )
839
+ : new Map(),
840
+ ])) as ReadonlyMap<string, Schema | CubeEngineError>[];
841
+ answers = new Map([
842
+ ...(tableAnswers ?? []),
843
+ ...(accessPointAnswers ?? []),
844
+ ...(dataSetAnswers ?? []),
845
+ ]);
377
846
  } finally {
378
847
  this.pendingSources = new Set(
379
848
  [...this.pendingSources].filter(
380
- (node) => !sources.includes(node as RelationalTableSource),
849
+ (node) => !sources.includes(node as RecheckedSource),
381
850
  ),
382
851
  );
383
852
  }
384
853
  const warnings = new Map(this.warnings);
385
854
  /** Each typed source, by the object that was sent, and what replaces it */
386
- const replacements = new Map<
387
- RelationalTableSource,
388
- RelationalTableSource
389
- >();
855
+ const replacements = new Map<RecheckedSource, RecheckedSource>();
390
856
  sources.forEach((source) => {
857
+ const isAccessPoint = source instanceof DataProductAccessPointSource;
858
+ const isDataSet = source instanceof IngestDatasetSource;
391
859
  const answer =
392
860
  answers.get(source.id) ??
393
861
  new CubeEngineError(
394
862
  CubeEngineErrorKind.COMPILE,
395
- 'The engine gave no schema for this table',
863
+ isAccessPoint
864
+ ? CUBE_DATA_PRODUCT_RECHECK_MESSAGE.NO_ANSWER
865
+ : isDataSet
866
+ ? CUBE_INGEST_RECHECK_MESSAGE.NO_ANSWER
867
+ : 'The engine gave no schema for this table',
396
868
  source.id,
397
869
  );
398
870
  const saved =
@@ -401,7 +873,13 @@ export class CubeEditorState implements CommandRegistrar {
401
873
  : undefined;
402
874
  if (answer instanceof CubeEngineError) {
403
875
  if (saved) {
404
- warnings.set(source.key, [getSourceRecheckWarning(answer.firstLine)]);
876
+ warnings.set(source.key, [
877
+ isAccessPoint
878
+ ? getAccessPointRecheckWarning(answer.firstLine)
879
+ : isDataSet
880
+ ? getDataSetRecheckWarning(answer.firstLine)
881
+ : getSourceRecheckWarning(answer.firstLine),
882
+ ]);
405
883
  } else if (
406
884
  source.resolution.kind !== 'failed' ||
407
885
  source.resolution.message !== answer.detail
@@ -423,13 +901,32 @@ export class CubeEditorState implements CommandRegistrar {
423
901
  schema: answer,
424
902
  });
425
903
  if (saved) {
904
+ const diff = diffSchemas(saved, answer);
426
905
  warnings.set(resolved.key, [
427
- getSchemaDriftWarning(diffSchemas(saved, answer)),
906
+ isAccessPoint
907
+ ? getAccessPointDriftWarning(diff)
908
+ : isDataSet
909
+ ? getDataSetDriftWarning(diff)
910
+ : getSchemaDriftWarning(diff),
428
911
  ]);
429
912
  }
430
913
  replacements.set(source, resolved);
431
914
  });
432
915
  this.warnings = warnings;
916
+ this.replaceOutsideHistory(replacements);
917
+ }
918
+
919
+ /**
920
+ * Puts nodes the engine checked in place of the very objects that were
921
+ * sent, outside the undo history: in the cube shown and in the undo
922
+ * snapshots taken meanwhile, so undoing an edit made meanwhile keeps them.
923
+ * A node the user changed meanwhile is a new object, and is left alone.
924
+ * Filter values saved as invalid text are read again against the columns.
925
+ */
926
+ private replaceOutsideHistory(
927
+ replacements: ReadonlyMap<QueryNode, QueryNode>,
928
+ accepts?: (query: Query, resolved: QueryNode) => boolean,
929
+ ): void {
433
930
  if (!replacements.size) {
434
931
  return;
435
932
  }
@@ -441,7 +938,10 @@ export class CubeEditorState implements CommandRegistrar {
441
938
  if (checked === undefined) {
442
939
  let replaced = document.query;
443
940
  replacements.forEach((resolved, source) => {
444
- if (replaced.getNode(source.id) === source) {
941
+ if (
942
+ replaced.getNode(source.id) === source &&
943
+ (accepts?.(document.query, resolved) ?? true)
944
+ ) {
445
945
  replaced = replaced.replace(resolved);
446
946
  }
447
947
  });
@@ -471,22 +971,30 @@ export class CubeEditorState implements CommandRegistrar {
471
971
  }
472
972
 
473
973
  /**
474
- * Types a table again with the engine, from its Source panel (spec §17.6),
475
- * as a re-check after an import does: no undo step, nothing changes when
476
- * its columns are the same, and a warning lists any change.
974
+ * Types a source again, from its Source panel (spec §17.6), as a re-check
975
+ * after an import does: a table with the engine, an access point through
976
+ * the catalog. No undo step, nothing changes when its columns are the
977
+ * same, and a warning lists any change.
477
978
  */
478
979
  *refreshSource(nodeId: string): GeneratorFn<void> {
479
980
  const source = this.document.query.getNode(nodeId);
480
- if (source instanceof RelationalTableSource) {
481
- yield flowResult(this.reresolveSources([source]));
981
+ if (
982
+ source instanceof RelationalTableSource ||
983
+ source instanceof DataProductAccessPointSource ||
984
+ source instanceof IngestDatasetSource
985
+ ) {
986
+ // a Refresh reads the deployed artifact or definition again
987
+ yield flowResult(this.reresolveSources([source], true));
482
988
  }
483
989
  }
484
990
 
485
991
  /**
486
992
  * Restores the document before the last edit; does nothing when there is
487
993
  * no history. A restored query is a new object (PLAN §4.3), so rows that
488
- * ran before the edit show as stale. An edit that left the query alone,
489
- * such as a rename, keeps it, with its rows and engine errors. Undoing an
994
+ * ran before the edit show as stale. An edit that left the query and the
995
+ * context alone, such as a rename, keeps them, with the rows and engine
996
+ * errors; undoing a warehouse edit brings back the context the rows ran
997
+ * with. Undoing an
490
998
  * import closes the node editor and the picker, as the import did.
491
999
  */
492
1000
  undo(): void {
@@ -516,9 +1024,16 @@ export class CubeEditorState implements CommandRegistrar {
516
1024
  this.history = [...this.history, this.document].slice(-MAX_UNDO_STEPS);
517
1025
  }
518
1026
 
519
- /** 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
+ */
520
1032
  private replaceDocument(next: CubeDocument): void {
521
- if (next.query !== this.document.query) {
1033
+ if (
1034
+ next.query !== this.document.query ||
1035
+ next.context !== this.document.context
1036
+ ) {
522
1037
  this.hostIssues = new Map();
523
1038
  this.execution.clearError();
524
1039
  }
@@ -547,10 +1062,27 @@ export class CubeEditorState implements CommandRegistrar {
547
1062
  }
548
1063
  }
549
1064
 
1065
+ /**
1066
+ * The kinds of source the host serves: data products and ingest data sets
1067
+ * only with their catalogs. The cube's kind may still disable one
1068
+ * (`canAddNode`)
1069
+ */
1070
+ get offeredSources(): readonly SourceDefinition[] {
1071
+ return this.registry.sources.filter(
1072
+ (definition) =>
1073
+ (definition.type !== DataProductAccessPointSource.TYPE ||
1074
+ this.sourcePicker.dataProductTab.isAvailable) &&
1075
+ (definition.type !== IngestDatasetSource.TYPE ||
1076
+ this.sourcePicker.ingestTab.isAvailable),
1077
+ );
1078
+ }
1079
+
550
1080
  /**
551
1081
  * Whether a node of the type can be added: a transform, unconnected or
552
1082
  * spliced in after `afterId`, when the query allows it; a source only
553
1083
  * unconnected, through the source picker. Never while the cube is read-only.
1084
+ * The low-level rule: the palette, drops and menus place nodes through
1085
+ * `CubeAddPlacement` (PLAN §11.8).
554
1086
  */
555
1087
  canAddNode(type: string, afterId?: string): boolean {
556
1088
  const definition = this.registry.get(type);
@@ -558,15 +1090,21 @@ export class CubeEditorState implements CommandRegistrar {
558
1090
  return false;
559
1091
  }
560
1092
  if (definition.kind === 'source') {
561
- return afterId === undefined;
1093
+ // through its tab, which the cube's kind may disable (PLAN §6.8)
1094
+ const tab = this.sourcePicker.tabForSourceType(type);
1095
+ return (
1096
+ afterId === undefined &&
1097
+ tab !== undefined &&
1098
+ this.sourcePicker.isTabEnabled(tab)
1099
+ );
562
1100
  }
563
1101
  const { query } = this.document;
564
1102
  return query.canAdd(definition.create(query.generateId(type)), afterId);
565
1103
  }
566
1104
 
567
1105
  /**
568
- * Adds a node of the type, as the palette and the context menu do (spec
569
- * §17.4): a transform with its default settings, unconnected or spliced in
1106
+ * Adds a node of the type (spec §17.4), the low-level add that
1107
+ * `CubeAddPlacement` places for the palette, drops and menus: a transform with its default settings, unconnected or spliced in
570
1108
  * after `afterId`; a source opens the source picker, which adds it once
571
1109
  * the engine has typed it. Does nothing `canAddNode` refuses.
572
1110
  */
@@ -576,7 +1114,7 @@ export class CubeEditorState implements CommandRegistrar {
576
1114
  return;
577
1115
  }
578
1116
  if (definition.kind === 'source') {
579
- this.sourcePicker.open();
1117
+ this.sourcePicker.open(this.sourcePicker.tabForSourceType(type)?.key);
580
1118
  return;
581
1119
  }
582
1120
  const { query } = this.document;
@@ -585,6 +1123,20 @@ export class CubeEditorState implements CommandRegistrar {
585
1123
  );
586
1124
  }
587
1125
 
1126
+ /**
1127
+ * Adds a node made elsewhere, with its settings, as the grid's quick
1128
+ * actions do (spec §12.4): spliced in after `afterId`, so it becomes the
1129
+ * node that runs when that one did, as one undo step. Does nothing in a
1130
+ * read-only cube, or when the query can't take it.
1131
+ */
1132
+ addConfiguredNode(node: QueryNode, afterId?: string): void {
1133
+ const { query } = this.document;
1134
+ if (this.readOnly || !query.canAdd(node, afterId)) {
1135
+ return;
1136
+ }
1137
+ this.applyQuery(query.add(node, afterId));
1138
+ }
1139
+
588
1140
  /** Whether dropping a node on another does anything: connect it, or else move it after it */
589
1141
  canDropNode(nodeId: string, targetId: string): boolean {
590
1142
  const { query } = this.document;
@@ -696,6 +1248,7 @@ export class CubeEditorState implements CommandRegistrar {
696
1248
 
697
1249
  /** Stops any run; call when the page closes */
698
1250
  dispose(): void {
1251
+ this.retyping();
699
1252
  this.execution.stop();
700
1253
  this.nodeEditor.dispose();
701
1254
  }