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