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