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