@finos/legend-cube-builder 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -19
- package/docs/adding-an-operation.md +102 -13
- package/docs/hosting.md +82 -4
- package/docs/testing.md +114 -9
- package/lib/__lib__/LegendCubeCommand.d.ts +2 -1
- package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeCommand.js +5 -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__/LegendCubeHelpText.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeHelpText.js +12 -2
- 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 +76 -3
- package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeLabels.js +102 -4
- 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__/LegendCubeTesting.d.ts +1 -0
- package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeTesting.js +1 -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 +12 -0
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
- package/lib/__test-utils__/CubeEngineTestSupport.js +21 -0
- package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +37 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.js +83 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.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 +12 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
- package/lib/__test-utils__/CubePageTestUtils.js +25 -1
- package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.d.ts +5 -1
- package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.js +9 -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 +2 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
- package/lib/__test-utils__/FakeCubeEngine.js +14 -1
- package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +35 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.js +107 -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/components/CubeAddItems.d.ts +35 -0
- package/lib/components/CubeAddItems.d.ts.map +1 -0
- package/lib/components/CubeAddItems.js +82 -0
- package/lib/components/CubeAddItems.js.map +1 -0
- package/lib/components/CubeEditor.d.ts +5 -1
- package/lib/components/CubeEditor.d.ts.map +1 -1
- package/lib/components/CubeEditor.js +33 -13
- 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/CubeNodeIcon.d.ts.map +1 -1
- package/lib/components/CubeNodeIcon.js +8 -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 +31 -12
- 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 +19 -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.map +1 -1
- package/lib/components/canvas/CubeCanvasElements.js +6 -3
- package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
- package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasNode.js +30 -20
- 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/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/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/CubeExtendEditor.d.ts +25 -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 +3 -3
- package/lib/components/editors/CubeFilterEditor.js.map +1 -1
- 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 +7 -37
- 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 +51 -13
- package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
- package/lib/components/editors/CubeNodeEditorPopper.d.ts +40 -0
- package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -0
- package/lib/components/editors/CubeNodeEditorPopper.js +125 -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 +15 -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/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.js +1 -1
- package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
- 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/CubeGridRegion.d.ts.map +1 -1
- package/lib/components/grid/CubeGridRegion.js +19 -8
- package/lib/components/grid/CubeGridRegion.js.map +1 -1
- package/lib/components/grid/CubeGridValues.d.ts +16 -0
- package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
- package/lib/components/grid/CubeGridValues.js +44 -0
- package/lib/components/grid/CubeGridValues.js.map +1 -1
- package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
- package/lib/components/grid/CubeResultGrid.js +14 -2
- package/lib/components/grid/CubeResultGrid.js.map +1 -1
- package/lib/components/palette/CubePalette.d.ts.map +1 -1
- package/lib/components/palette/CubePalette.js +23 -12
- package/lib/components/palette/CubePalette.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 +102 -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 +87 -0
- package/lib/components/source-picker/CubeDirectConnectionTab.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 +66 -0
- package/lib/components/source-picker/CubeIngestTab.js.map +1 -0
- package/lib/components/source-picker/CubeInlineModelTab.d.ts +37 -0
- package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeInlineModelTab.js +71 -0
- package/lib/components/source-picker/CubeInlineModelTab.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 +27 -0
- package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeProjectTab.js +50 -0
- package/lib/components/source-picker/CubeProjectTab.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 +20 -58
- package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js +1 -1
- 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 +167 -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 +37 -2
- 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/CubeIngest.d.ts +50 -0
- package/lib/graph-manager/CubeIngest.d.ts.map +1 -0
- package/lib/graph-manager/CubeIngest.js +88 -0
- package/lib/graph-manager/CubeIngest.js.map +1 -0
- package/lib/graph-manager/CubeIngestCatalog.d.ts +116 -0
- package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -0
- package/lib/graph-manager/CubeIngestCatalog.js +80 -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/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/protocol/pure/CubeEngineBuilder.d.ts +63 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +50 -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 +29 -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 +84 -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_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 +140 -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 +62 -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 +119 -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_CubeLambdaSerializer.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +63 -4
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.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 +34 -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 +64 -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 +97 -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 +585 -20
- 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 +91 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.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 +27 -1
- 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 +11 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -1
- package/lib/index.js.map +1 -1
- package/lib/stores/CubeAddPlacement.d.ts +32 -0
- package/lib/stores/CubeAddPlacement.d.ts.map +1 -0
- package/lib/stores/CubeAddPlacement.js +40 -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/CubeEditorState.d.ts +100 -16
- package/lib/stores/CubeEditorState.d.ts.map +1 -1
- package/lib/stores/CubeEditorState.js +347 -47
- package/lib/stores/CubeEditorState.js.map +1 -1
- 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 +296 -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 +15 -5
- package/lib/stores/CubeExecutionState.js.map +1 -1
- package/lib/stores/CubeExtendTyping.d.ts +72 -0
- package/lib/stores/CubeExtendTyping.d.ts.map +1 -0
- package/lib/stores/CubeExtendTyping.js +176 -0
- package/lib/stores/CubeExtendTyping.js.map +1 -0
- package/lib/stores/CubeGridQuickActions.d.ts +14 -6
- package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
- package/lib/stores/CubeGridQuickActions.js +53 -15
- package/lib/stores/CubeGridQuickActions.js.map +1 -1
- package/lib/stores/CubeHost.d.ts +32 -1
- package/lib/stores/CubeHost.d.ts.map +1 -1
- package/lib/stores/CubeHost.js +21 -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/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/CubeShowPureState.d.ts +5 -2
- package/lib/stores/CubeShowPureState.d.ts.map +1 -1
- package/lib/stores/CubeShowPureState.js +7 -4
- package/lib/stores/CubeShowPureState.js.map +1 -1
- package/lib/stores/CubeSourcePickerState.d.ts +54 -65
- package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
- package/lib/stores/CubeSourcePickerState.js +155 -276
- 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 +17 -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/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/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.map +1 -1
- package/lib/stores/editors/CubeNodeDraftRegistry.js +20 -1
- 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/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/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 +29 -0
- package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeTradesModel.js +197 -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 +186 -0
- package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeDataProductTabState.js +681 -0
- package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +140 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js +516 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeIngestTabState.d.ts +114 -0
- package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeIngestTabState.js +455 -0
- package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +107 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.js +347 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeProjectTabState.d.ts +62 -0
- package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeProjectTabState.js +181 -0
- package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +48 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.js +24 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -0
- package/package.json +10 -6
- package/src/__lib__/LegendCubeCommand.ts +5 -0
- package/src/__lib__/LegendCubeDataProductLabels.ts +91 -0
- package/src/__lib__/LegendCubeDirectConnectionLabels.ts +111 -0
- package/src/__lib__/LegendCubeHelpText.ts +25 -1
- package/src/__lib__/LegendCubeIngestLabels.ts +40 -0
- package/src/__lib__/LegendCubeLabels.ts +162 -4
- package/src/__lib__/LegendCubeProjectLabels.ts +25 -0
- package/src/__lib__/LegendCubeTesting.ts +1 -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 +38 -0
- package/src/__test-utils__/CubeExpressionTestUtils.ts +119 -0
- package/src/__test-utils__/CubeOperationsTestUtils.ts +93 -18
- package/src/__test-utils__/CubePageTestUtils.tsx +35 -0
- package/src/__test-utils__/CubeTestApplication.ts +21 -2
- package/src/__test-utils__/FakeCubeConnectionExplorer.ts +111 -0
- package/src/__test-utils__/FakeCubeDataProductCatalog.ts +227 -0
- package/src/__test-utils__/FakeCubeEngine.ts +25 -1
- package/src/__test-utils__/FakeCubeIngestCatalog.ts +180 -0
- package/src/__test-utils__/FakeCubeProjectCatalog.ts +89 -0
- package/src/components/CubeAddItems.tsx +179 -0
- package/src/components/CubeEditor.tsx +73 -44
- package/src/components/CubeEntrySourceBanner.tsx +64 -0
- package/src/components/CubeNodeIcon.tsx +13 -0
- package/src/components/CubeSchemaColumnsTable.tsx +49 -0
- package/src/components/canvas/CubeCanvas.tsx +49 -14
- package/src/components/canvas/CubeCanvasContextMenu.tsx +31 -30
- package/src/components/canvas/CubeCanvasDnd.ts +16 -9
- package/src/components/canvas/CubeCanvasElements.ts +8 -2
- package/src/components/canvas/CubeCanvasNode.tsx +61 -43
- package/src/components/canvas/CubeCanvasNodeFocus.ts +37 -0
- package/src/components/canvas/CubeNodeEditorAnchor.ts +82 -0
- package/src/components/editors/CubeAggregationRowEditor.tsx +224 -0
- package/src/components/editors/CubeColumnChecklist.tsx +130 -0
- 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/CubeExtendEditor.tsx +271 -0
- package/src/components/editors/CubeFilterEditor.tsx +7 -0
- package/src/components/editors/CubeGroupEditor.tsx +135 -0
- package/src/components/editors/CubeIngestSourceEditor.tsx +104 -0
- package/src/components/editors/CubeJoinEditor.tsx +12 -132
- package/src/components/editors/CubeJoinKeyRows.tsx +183 -0
- package/src/components/editors/CubeNodeEditorPanel.tsx +91 -28
- package/src/components/editors/CubeNodeEditorPopper.tsx +183 -0
- package/src/components/editors/CubeNodeEditorRegistry.ts +21 -0
- package/src/components/editors/CubePartitionEditor.tsx +208 -0
- package/src/components/editors/CubeRenameEditor.tsx +10 -5
- package/src/components/editors/CubeRestrictEditor.tsx +1 -1
- 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/CubeGridRegion.tsx +48 -10
- package/src/components/grid/CubeGridValues.ts +55 -0
- package/src/components/grid/CubeResultGrid.tsx +24 -8
- package/src/components/palette/CubePalette.tsx +33 -15
- package/src/components/source-picker/CubeDataProductTab.tsx +392 -0
- package/src/components/source-picker/CubeDirectConnectionTab.tsx +340 -0
- package/src/components/source-picker/CubeIngestTab.tsx +232 -0
- package/src/components/source-picker/CubeInlineModelTab.tsx +191 -0
- package/src/components/source-picker/CubePickerStep.tsx +49 -0
- package/src/components/source-picker/CubeProjectTab.tsx +114 -0
- package/src/components/source-picker/CubeSourcePicker.tsx +62 -227
- package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +1 -1
- package/src/graph-manager/CubeConnectionExplorer.ts +106 -0
- package/src/graph-manager/CubeDataProduct.ts +150 -0
- package/src/graph-manager/CubeDataProductCatalog.ts +245 -0
- package/src/graph-manager/CubeDirectConnection.ts +67 -0
- package/src/graph-manager/CubeEngine.ts +43 -1
- package/src/graph-manager/CubeIngest.ts +144 -0
- package/src/graph-manager/CubeIngestCatalog.ts +169 -0
- package/src/graph-manager/CubeLakehouseEnvironment.ts +27 -0
- package/src/graph-manager/CubeProject.ts +117 -0
- package/src/graph-manager/CubeProjectCatalog.ts +40 -0
- package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +145 -1
- package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.ts +251 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +101 -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_CubeIngestDefinition.ts +201 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +183 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.ts +141 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +84 -4
- package/src/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.ts +361 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +116 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.ts +744 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +967 -24
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.ts +459 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +147 -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 +42 -1
- package/src/index.ts +20 -0
- package/src/stores/CubeAddPlacement.ts +67 -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/CubeEditorState.ts +511 -63
- package/src/stores/CubeEntrySource.ts +278 -0
- package/src/stores/CubeExamples.ts +457 -0
- package/src/stores/CubeExamplesState.ts +108 -0
- package/src/stores/CubeExecutionState.ts +24 -5
- package/src/stores/CubeExtendTyping.ts +291 -0
- package/src/stores/CubeGridQuickActions.ts +69 -14
- package/src/stores/CubeHost.ts +71 -1
- package/src/stores/CubeIngestRecheck.ts +92 -0
- package/src/stores/CubeNodeEditorState.ts +278 -9
- package/src/stores/CubeShowPureState.ts +7 -4
- package/src/stores/CubeSourcePickerState.ts +160 -330
- package/src/stores/CubeSpecTransferState.ts +2 -2
- package/src/stores/LocalModelCatalog.ts +22 -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/CubeExtendDraft.ts +532 -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 +25 -0
- package/src/stores/editors/CubePartitionDraft.ts +214 -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/CubeSampleSql.ts +85 -0
- package/src/stores/fixtures/CubeSportsModel.ts +182 -0
- package/src/stores/fixtures/CubeTradesModel.ts +241 -0
- package/src/stores/source-picker/CubeCsvSetupSql.ts +444 -0
- package/src/stores/source-picker/CubeDataProductTabState.ts +839 -0
- package/src/stores/source-picker/CubeDirectConnectionTabState.ts +647 -0
- package/src/stores/source-picker/CubeIngestTabState.ts +551 -0
- package/src/stores/source-picker/CubeInlineModelTabState.ts +448 -0
- package/src/stores/source-picker/CubeProjectTabState.ts +218 -0
- package/src/stores/source-picker/CubeSourcePickerTab.ts +50 -0
- package/tsconfig.json +89 -0
|
@@ -24,19 +24,77 @@ import {
|
|
|
24
24
|
} from '@finos/legend-cube';
|
|
25
25
|
import { V1_EngineServerClient, V1_RenderStyle } from '@finos/legend-graph';
|
|
26
26
|
import {
|
|
27
|
+
ContentType,
|
|
28
|
+
HttpHeader,
|
|
29
|
+
parseLosslessJSON,
|
|
27
30
|
type PlainObject,
|
|
28
31
|
stringifyLosslessJSON,
|
|
29
32
|
type TracerService,
|
|
30
33
|
} from '@finos/legend-shared';
|
|
34
|
+
import type {
|
|
35
|
+
CubeDirectConnection,
|
|
36
|
+
CubeDirectDatabaseType,
|
|
37
|
+
} from '../../../CubeConnectionExplorer.js';
|
|
38
|
+
import {
|
|
39
|
+
checkCubeDataProductModel,
|
|
40
|
+
CUBE_DATA_PRODUCT_RUNTIME_PATH,
|
|
41
|
+
type CubeDataProductProject,
|
|
42
|
+
getCubeDataProductProject,
|
|
43
|
+
getEffectiveCubeWarehouse,
|
|
44
|
+
isCubeDataProductModel,
|
|
45
|
+
} from '../../../CubeDataProduct.js';
|
|
46
|
+
import {
|
|
47
|
+
checkCubeIngestModel,
|
|
48
|
+
CUBE_INGEST_RUNTIME_PATH,
|
|
49
|
+
type CubeIngestSettings,
|
|
50
|
+
getCubeIngestSettings,
|
|
51
|
+
isCubeIngestModel,
|
|
52
|
+
} from '../../../CubeIngest.js';
|
|
53
|
+
import type { CubeLakehouseEnvironment } from '../../../CubeLakehouseEnvironment.js';
|
|
54
|
+
import {
|
|
55
|
+
checkCubeProjectModel,
|
|
56
|
+
isCubeProjectModel,
|
|
57
|
+
} from '../../../CubeProject.js';
|
|
58
|
+
import {
|
|
59
|
+
CUBE_DIRECT_DATABASE_PATH,
|
|
60
|
+
CUBE_DIRECT_MODEL_TYPE,
|
|
61
|
+
CUBE_DIRECT_RUNTIME_PATH,
|
|
62
|
+
getCubeDirectConnection,
|
|
63
|
+
} from '../../../CubeDirectConnection.js';
|
|
31
64
|
import {
|
|
32
65
|
type AccessorPath,
|
|
33
66
|
type CubeEngine,
|
|
34
67
|
CubeEngineError,
|
|
35
68
|
CubeEngineErrorKind,
|
|
36
69
|
type CubeModelOutline,
|
|
70
|
+
type CubeParsedExpression,
|
|
37
71
|
type CubeResult,
|
|
38
72
|
type NodeId,
|
|
39
73
|
} from '../../../CubeEngine.js';
|
|
74
|
+
import {
|
|
75
|
+
V1_canonicalCubeDirectConnection,
|
|
76
|
+
V1_checkCubeDirectConnection,
|
|
77
|
+
} from './V1_CubeDirectConnection.js';
|
|
78
|
+
import {
|
|
79
|
+
V1_buildCubeDataProductExecutionContext,
|
|
80
|
+
V1_buildCubeDataProductTypingContext,
|
|
81
|
+
V1_hasCubeDataProductAccessor,
|
|
82
|
+
} from './V1_CubeDataProductModel.js';
|
|
83
|
+
import {
|
|
84
|
+
V1_buildCubeIngestExecutionContext,
|
|
85
|
+
V1_buildCubeIngestTypingContext,
|
|
86
|
+
V1_checkCubeIngestAccessors,
|
|
87
|
+
V1_collectCubeIngestAccessors,
|
|
88
|
+
type V1_CubeIngestDefinitionSource,
|
|
89
|
+
V1_getCubeIngestUrns,
|
|
90
|
+
V1_hasCubeIngestAccessor,
|
|
91
|
+
} from './V1_CubeIngestModel.js';
|
|
92
|
+
import {
|
|
93
|
+
V1_buildCubeDirectModelContext,
|
|
94
|
+
V1_collectCubeStoreAccessors,
|
|
95
|
+
V1_CUBE_DIRECT_DATABASE,
|
|
96
|
+
type V1_CubeDirectTable,
|
|
97
|
+
} from './V1_CubeDirectModel.js';
|
|
40
98
|
import {
|
|
41
99
|
V1_buildCubeEngineError,
|
|
42
100
|
V1_toCubeEngineError,
|
|
@@ -45,23 +103,37 @@ import {
|
|
|
45
103
|
V1_CubeUnreadableResultError,
|
|
46
104
|
V1_readCubeExecutionResult,
|
|
47
105
|
} from './V1_CubeExecutionResultReader.js';
|
|
106
|
+
import { V1_readCubeExpression } from './V1_CubeExpression.js';
|
|
48
107
|
import { V1_serializeCubeLambda } from './V1_CubeLambdaSerializer.js';
|
|
49
108
|
import { V1_buildCubeModelOutline } from './V1_CubeModelOutlineBuilder.js';
|
|
50
109
|
import { V1_buildCubeSchema } from './V1_CubeRelationTypeAdapter.js';
|
|
110
|
+
import {
|
|
111
|
+
V1_buildCubeSchemaExplorationInput,
|
|
112
|
+
V1_buildExploredDatabase,
|
|
113
|
+
type V1_CubeExploredTablePath,
|
|
114
|
+
V1_toCubeExplorationError,
|
|
115
|
+
V1_unquoteCubeName,
|
|
116
|
+
} from './V1_CubeSchemaExploration.js';
|
|
51
117
|
|
|
52
118
|
/** The engine client's configuration, as the host gives it (legend-graph doesn't export its type) */
|
|
53
119
|
export type V1_CubeEngineConfig = ConstructorParameters<
|
|
54
120
|
typeof V1_EngineServerClient
|
|
55
121
|
>[0];
|
|
56
122
|
|
|
57
|
-
/**
|
|
123
|
+
/** Pure text (PLAN §6.2.2); the other kind run is a direct connection (§6.8) */
|
|
58
124
|
const TEXT_MODEL_TYPE = 'text';
|
|
59
125
|
|
|
60
126
|
const EXECUTION_CLIENT_VERSION = 'vX_X_X';
|
|
61
127
|
|
|
128
|
+
/** The engine client's trace name for its grammar-to-JSON calls */
|
|
129
|
+
const GRAMMAR_TO_JSON_TRACE = 'transform Pure code to protocol';
|
|
130
|
+
|
|
62
131
|
/**
|
|
63
|
-
* The node an execution lambda runs: the one its
|
|
64
|
-
*
|
|
132
|
+
* The node an execution lambda runs: the one its outermost call is stamped
|
|
133
|
+
* with, `from` in `{| <relation>->limit(…)->from(runtime)}` and `limit` in
|
|
134
|
+
* the let form, `{| {| <lets>; <relation>}->from(runtime)->limit(…)}` (PLAN
|
|
135
|
+
* §8.6), or the capture's sort or `from` when Show Pure leaves the limit out,
|
|
136
|
+
* where errors without a stamp go
|
|
65
137
|
*/
|
|
66
138
|
const captureNodeOf = (executionLambda: IR): NodeId | undefined => {
|
|
67
139
|
const from =
|
|
@@ -69,10 +141,131 @@ const captureNodeOf = (executionLambda: IR): NodeId | undefined => {
|
|
|
69
141
|
return from?.k === 'func' ? from.origin?.nodeId : undefined;
|
|
70
142
|
};
|
|
71
143
|
|
|
144
|
+
/** Why a lambda can't run on the cube's model: data products and database tables are kept apart (PLAN §6.8) */
|
|
145
|
+
const DATA_PRODUCT_ONLY = 'Only a data product cube can read data products';
|
|
146
|
+
const TABLES_IN_DATA_PRODUCT_CUBE =
|
|
147
|
+
"A data product cube can't read database tables";
|
|
148
|
+
const NO_LAKEHOUSE =
|
|
149
|
+
"This page can't run data products: its host has no lakehouse";
|
|
150
|
+
/** Why a lambda can't run on the cube's model: ingest data sets are kept apart too (PLAN §6.7) */
|
|
151
|
+
const INGEST_ONLY = 'Only an ingest cube can read ingest data sets';
|
|
152
|
+
const OTHER_SOURCES_IN_INGEST_CUBE =
|
|
153
|
+
'An ingest cube reads ingest data sets only';
|
|
154
|
+
const NO_INGEST =
|
|
155
|
+
"This page can't read ingest data sets: its host has no ingest servers";
|
|
156
|
+
|
|
157
|
+
/** The kinds of model a cube's sources must match */
|
|
158
|
+
enum CubeSourceFamily {
|
|
159
|
+
DATA_PRODUCT = 'dataProduct',
|
|
160
|
+
INGEST = 'ingest',
|
|
161
|
+
TABLES = 'tables',
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const familyOf = (model: ModelContext): CubeSourceFamily =>
|
|
165
|
+
isCubeDataProductModel(model)
|
|
166
|
+
? CubeSourceFamily.DATA_PRODUCT
|
|
167
|
+
: isCubeIngestModel(model)
|
|
168
|
+
? CubeSourceFamily.INGEST
|
|
169
|
+
: CubeSourceFamily.TABLES;
|
|
170
|
+
|
|
171
|
+
/** Why a lambda reads a source its cube's kind can't, if it does */
|
|
172
|
+
const foreignSourceProblemOf = (
|
|
173
|
+
family: CubeSourceFamily,
|
|
174
|
+
ir: IR,
|
|
175
|
+
): string | undefined => {
|
|
176
|
+
const readsTables = V1_collectCubeStoreAccessors(ir).length > 0;
|
|
177
|
+
const readsDataProducts = V1_hasCubeDataProductAccessor(ir);
|
|
178
|
+
const readsIngest = V1_hasCubeIngestAccessor(ir);
|
|
179
|
+
switch (family) {
|
|
180
|
+
case CubeSourceFamily.DATA_PRODUCT:
|
|
181
|
+
return readsTables
|
|
182
|
+
? TABLES_IN_DATA_PRODUCT_CUBE
|
|
183
|
+
: readsIngest
|
|
184
|
+
? INGEST_ONLY
|
|
185
|
+
: undefined;
|
|
186
|
+
case CubeSourceFamily.INGEST:
|
|
187
|
+
return readsTables || readsDataProducts
|
|
188
|
+
? OTHER_SOURCES_IN_INGEST_CUBE
|
|
189
|
+
: undefined;
|
|
190
|
+
default:
|
|
191
|
+
return readsDataProducts
|
|
192
|
+
? DATA_PRODUCT_ONLY
|
|
193
|
+
: readsIngest
|
|
194
|
+
? INGEST_ONLY
|
|
195
|
+
: undefined;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/** An error of the host's ingest servers, placed on a node */
|
|
200
|
+
const toIngestError = (
|
|
201
|
+
error: unknown,
|
|
202
|
+
kind: CubeEngineErrorKind,
|
|
203
|
+
nodeId: NodeId | undefined,
|
|
204
|
+
): CubeEngineError =>
|
|
205
|
+
error instanceof CubeEngineError
|
|
206
|
+
? new CubeEngineError(error.kind, error.detail, nodeId)
|
|
207
|
+
: new CubeEngineError(
|
|
208
|
+
kind,
|
|
209
|
+
error instanceof Error ? error.message : String(error),
|
|
210
|
+
nodeId,
|
|
211
|
+
);
|
|
212
|
+
|
|
72
213
|
/** The message for a model of a kind this version can't run (PLAN §8.7) */
|
|
73
214
|
export const V1_unsupportedModelMessage = (type: string): string =>
|
|
74
215
|
`This cube's model kind "${type}" isn't supported yet.`;
|
|
75
216
|
|
|
217
|
+
/** A table of a direct-connection cube, as the database stores its names */
|
|
218
|
+
const directTableOf = (path: AccessorPath): V1_CubeExploredTablePath => [
|
|
219
|
+
V1_unquoteCubeName(path[1]),
|
|
220
|
+
V1_unquoteCubeName(path[2]),
|
|
221
|
+
];
|
|
222
|
+
|
|
223
|
+
const tableKey = (path: V1_CubeExploredTablePath): string =>
|
|
224
|
+
JSON.stringify(path);
|
|
225
|
+
|
|
226
|
+
/** The error of a table a direct-connection cube's database doesn't have */
|
|
227
|
+
const missingTableError = (
|
|
228
|
+
path: V1_CubeExploredTablePath,
|
|
229
|
+
kind: CubeEngineErrorKind,
|
|
230
|
+
nodeId: NodeId | undefined,
|
|
231
|
+
): CubeEngineError =>
|
|
232
|
+
new CubeEngineError(
|
|
233
|
+
kind,
|
|
234
|
+
`The database has no table ${path[1]} in schema ${path[0]}`,
|
|
235
|
+
nodeId,
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
/** The error of a table that isn't in a direct-connection cube's one Database */
|
|
239
|
+
const foreignTableError = (
|
|
240
|
+
path: AccessorPath,
|
|
241
|
+
kind: CubeEngineErrorKind,
|
|
242
|
+
nodeId: NodeId | undefined,
|
|
243
|
+
): CubeEngineError =>
|
|
244
|
+
new CubeEngineError(
|
|
245
|
+
kind,
|
|
246
|
+
`The table is in "${path[0]}", not in the cube's database connection`,
|
|
247
|
+
nodeId,
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
/** A lambda's problem with a direct-connection cube's tables, if any */
|
|
251
|
+
const tableProblemOf = (
|
|
252
|
+
accessors: readonly AccessorPath[],
|
|
253
|
+
missing: ReadonlySet<string>,
|
|
254
|
+
kind: CubeEngineErrorKind,
|
|
255
|
+
nodeId: NodeId | undefined,
|
|
256
|
+
): CubeEngineError | undefined => {
|
|
257
|
+
const foreign = accessors.find(
|
|
258
|
+
(path) => path[0] !== CUBE_DIRECT_DATABASE_PATH,
|
|
259
|
+
);
|
|
260
|
+
if (foreign) {
|
|
261
|
+
return foreignTableError(foreign, kind, nodeId);
|
|
262
|
+
}
|
|
263
|
+
const absent = accessors
|
|
264
|
+
.map(directTableOf)
|
|
265
|
+
.find((path) => missing.has(tableKey(path)));
|
|
266
|
+
return absent ? missingTableError(absent, kind, nodeId) : undefined;
|
|
267
|
+
};
|
|
268
|
+
|
|
76
269
|
/**
|
|
77
270
|
* The Legend engine behind the Cube engine port (PLAN §8.7). It sends the
|
|
78
271
|
* cube's saved model context as it is, lambdas as protocol JSON with lossless
|
|
@@ -81,11 +274,130 @@ export const V1_unsupportedModelMessage = (type: string): string =>
|
|
|
81
274
|
*/
|
|
82
275
|
export class V1_LegendCubeEngine implements CubeEngine {
|
|
83
276
|
readonly client: V1_EngineServerClient;
|
|
277
|
+
/**
|
|
278
|
+
* The tables this session has read from direct connections, by connection
|
|
279
|
+
* and table: picking or re-checking a table reads it again, and typing and
|
|
280
|
+
* running reuse what was read
|
|
281
|
+
*/
|
|
282
|
+
private readonly directTables = new Map<string, V1_CubeDirectTable>();
|
|
283
|
+
|
|
284
|
+
/** The viewer's lakehouse environment, which data product runs need */
|
|
285
|
+
private readonly lakehouseEnvironment: CubeLakehouseEnvironment | undefined;
|
|
286
|
+
/** The warehouse the viewer last picked, for a data product cube without its own */
|
|
287
|
+
private readonly getRememberedWarehouse: () => string | undefined;
|
|
288
|
+
/** The deployed ingest definitions, which ingest cubes read */
|
|
289
|
+
private readonly ingestDefinitions: V1_CubeIngestDefinitionSource | undefined;
|
|
84
290
|
|
|
85
|
-
constructor(
|
|
291
|
+
constructor(
|
|
292
|
+
config: V1_CubeEngineConfig,
|
|
293
|
+
tracerService: TracerService,
|
|
294
|
+
options?: {
|
|
295
|
+
lakehouseEnvironment?: CubeLakehouseEnvironment | undefined;
|
|
296
|
+
getRememberedWarehouse?: (() => string | undefined) | undefined;
|
|
297
|
+
ingestDefinitions?: V1_CubeIngestDefinitionSource | undefined;
|
|
298
|
+
},
|
|
299
|
+
) {
|
|
86
300
|
this.client = new V1_EngineServerClient(config);
|
|
87
301
|
// every call throws without one
|
|
88
302
|
this.client.setTracerService(tracerService);
|
|
303
|
+
this.lakehouseEnvironment = options?.lakehouseEnvironment;
|
|
304
|
+
this.getRememberedWarehouse =
|
|
305
|
+
options?.getRememberedWarehouse ?? (() => undefined);
|
|
306
|
+
this.ingestDefinitions = options?.ingestDefinitions;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/** An ingest model's settings, or an unsupported-model error naming its problems */
|
|
310
|
+
private ingestSettingsOf(
|
|
311
|
+
model: ModelContext,
|
|
312
|
+
nodeId?: NodeId,
|
|
313
|
+
): CubeIngestSettings {
|
|
314
|
+
const settings = getCubeIngestSettings(model);
|
|
315
|
+
if (!settings) {
|
|
316
|
+
throw new CubeEngineError(
|
|
317
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
318
|
+
checkCubeIngestModel(model).join('\n'),
|
|
319
|
+
nodeId,
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
return settings;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* The definitions the URNs name, read from the host's ingest servers, each
|
|
327
|
+
* once; a definition that can't be read gives its error instead
|
|
328
|
+
*/
|
|
329
|
+
private async ingestDefinitionsOf(
|
|
330
|
+
urns: readonly string[],
|
|
331
|
+
settings: CubeIngestSettings,
|
|
332
|
+
): Promise<Map<string, PlainObject | CubeEngineError>> {
|
|
333
|
+
const source = this.ingestDefinitions;
|
|
334
|
+
return new Map(
|
|
335
|
+
await Promise.all(
|
|
336
|
+
urns.map(
|
|
337
|
+
async (urn): Promise<[string, PlainObject | CubeEngineError]> => {
|
|
338
|
+
if (!source) {
|
|
339
|
+
return [
|
|
340
|
+
urn,
|
|
341
|
+
new CubeEngineError(
|
|
342
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
343
|
+
NO_INGEST,
|
|
344
|
+
),
|
|
345
|
+
];
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
return [
|
|
349
|
+
urn,
|
|
350
|
+
await source.getDefinitionElement(
|
|
351
|
+
urn,
|
|
352
|
+
settings.environmentType,
|
|
353
|
+
),
|
|
354
|
+
];
|
|
355
|
+
} catch (error) {
|
|
356
|
+
return [
|
|
357
|
+
urn,
|
|
358
|
+
toIngestError(error, CubeEngineErrorKind.NETWORK, undefined),
|
|
359
|
+
];
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
),
|
|
363
|
+
),
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** A data product model's project, or an unsupported-model error naming its problems */
|
|
368
|
+
private dataProductProjectOf(
|
|
369
|
+
model: ModelContext,
|
|
370
|
+
nodeId?: NodeId,
|
|
371
|
+
): CubeDataProductProject {
|
|
372
|
+
const project = getCubeDataProductProject(model);
|
|
373
|
+
if (!project) {
|
|
374
|
+
throw new CubeEngineError(
|
|
375
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
376
|
+
checkCubeDataProductModel(model).join('\n'),
|
|
377
|
+
nodeId,
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
return project;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Checks a tables cube's model can be sent to the engine: Pure text, or a
|
|
385
|
+
* project pointer at a released version (PLAN §6.3); else an
|
|
386
|
+
* unsupported-model error
|
|
387
|
+
*/
|
|
388
|
+
private checkTablesModel(model: ModelContext, nodeId?: NodeId): void {
|
|
389
|
+
if (isCubeProjectModel(model)) {
|
|
390
|
+
const problems = checkCubeProjectModel(model);
|
|
391
|
+
if (problems.length) {
|
|
392
|
+
throw new CubeEngineError(
|
|
393
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
394
|
+
problems.join('\n'),
|
|
395
|
+
nodeId,
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
this.textOf(model, nodeId);
|
|
89
401
|
}
|
|
90
402
|
|
|
91
403
|
/** The model's Pure text, or an unsupported-model error for any other kind */
|
|
@@ -100,7 +412,128 @@ export class V1_LegendCubeEngine implements CubeEngine {
|
|
|
100
412
|
return model.code;
|
|
101
413
|
}
|
|
102
414
|
|
|
415
|
+
/**
|
|
416
|
+
* A direct-connection model's connection, or an unsupported-model error when
|
|
417
|
+
* Cube can't use it (an imported cube then shows its saved schemas)
|
|
418
|
+
*/
|
|
419
|
+
private directConnectionOf(
|
|
420
|
+
model: ModelContext,
|
|
421
|
+
nodeId?: NodeId,
|
|
422
|
+
): CubeDirectConnection {
|
|
423
|
+
const connection = getCubeDirectConnection(model);
|
|
424
|
+
const problems = V1_checkCubeDirectConnection(connection);
|
|
425
|
+
if (!connection || problems.length) {
|
|
426
|
+
throw new CubeEngineError(
|
|
427
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
428
|
+
problems.join('\n'),
|
|
429
|
+
nodeId,
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
return connection;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* The model a call on a direct-connection cube runs on, holding the tables
|
|
437
|
+
* it needs, and those its database doesn't have. Tables this session
|
|
438
|
+
* hasn't read are read in one call; `fresh` reads them all again
|
|
439
|
+
*/
|
|
440
|
+
private async directContextFor(
|
|
441
|
+
connection: CubeDirectConnection,
|
|
442
|
+
tables: readonly V1_CubeExploredTablePath[],
|
|
443
|
+
fresh: boolean,
|
|
444
|
+
): Promise<{ context: PlainObject; missing: ReadonlySet<string> }> {
|
|
445
|
+
const connectionKey = V1_canonicalCubeDirectConnection(connection);
|
|
446
|
+
const cacheKey = (path: V1_CubeExploredTablePath): string =>
|
|
447
|
+
JSON.stringify([connectionKey, ...path]);
|
|
448
|
+
const needed = [
|
|
449
|
+
...new Map(tables.map((path) => [tableKey(path), path])).values(),
|
|
450
|
+
];
|
|
451
|
+
const toRead = fresh
|
|
452
|
+
? needed
|
|
453
|
+
: needed.filter((path) => !this.directTables.has(cacheKey(path)));
|
|
454
|
+
if (toRead.length) {
|
|
455
|
+
const { database, missing } = V1_buildExploredDatabase(
|
|
456
|
+
await this.client.buildDatabase(
|
|
457
|
+
V1_buildCubeSchemaExplorationInput(
|
|
458
|
+
connection,
|
|
459
|
+
connection.databaseType as CubeDirectDatabaseType,
|
|
460
|
+
V1_CUBE_DIRECT_DATABASE,
|
|
461
|
+
{ kind: 'columns', tables: toRead },
|
|
462
|
+
),
|
|
463
|
+
),
|
|
464
|
+
toRead,
|
|
465
|
+
);
|
|
466
|
+
(database.schemas as PlainObject[]).forEach((schema) =>
|
|
467
|
+
(schema.tables as PlainObject[]).forEach((definition) => {
|
|
468
|
+
const path: V1_CubeExploredTablePath = [
|
|
469
|
+
V1_unquoteCubeName(schema.name as string),
|
|
470
|
+
V1_unquoteCubeName(definition.name as string),
|
|
471
|
+
];
|
|
472
|
+
this.directTables.set(cacheKey(path), { path, definition });
|
|
473
|
+
}),
|
|
474
|
+
);
|
|
475
|
+
missing.forEach((path) => this.directTables.delete(cacheKey(path)));
|
|
476
|
+
}
|
|
477
|
+
const found: V1_CubeDirectTable[] = [];
|
|
478
|
+
const missing = new Set<string>();
|
|
479
|
+
needed.forEach((path) => {
|
|
480
|
+
const table = this.directTables.get(cacheKey(path));
|
|
481
|
+
if (table) {
|
|
482
|
+
found.push(table);
|
|
483
|
+
} else {
|
|
484
|
+
missing.add(tableKey(path));
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
return {
|
|
488
|
+
context: V1_buildCubeDirectModelContext(connection, found),
|
|
489
|
+
missing,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
|
|
103
493
|
async loadModel(model: ModelContext): Promise<CubeModelOutline> {
|
|
494
|
+
if (isCubeIngestModel(model)) {
|
|
495
|
+
this.ingestSettingsOf(model);
|
|
496
|
+
// its data sets are listed through the ingest catalog
|
|
497
|
+
return {
|
|
498
|
+
databases: [],
|
|
499
|
+
runtimes: [{ path: CUBE_INGEST_RUNTIME_PATH, storePaths: [] }],
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
if (isCubeDataProductModel(model)) {
|
|
503
|
+
this.dataProductProjectOf(model);
|
|
504
|
+
// its access points are listed through the data product catalog
|
|
505
|
+
return {
|
|
506
|
+
databases: [],
|
|
507
|
+
runtimes: [{ path: CUBE_DATA_PRODUCT_RUNTIME_PATH, storePaths: [] }],
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
if (model._type === CUBE_DIRECT_MODEL_TYPE) {
|
|
511
|
+
const connection = this.directConnectionOf(model);
|
|
512
|
+
// its tables are listed through the connection explorer; its one
|
|
513
|
+
// connection gives the database type operations are written for
|
|
514
|
+
return {
|
|
515
|
+
databases: [],
|
|
516
|
+
runtimes: [
|
|
517
|
+
{
|
|
518
|
+
path: CUBE_DIRECT_RUNTIME_PATH,
|
|
519
|
+
storePaths: [CUBE_DIRECT_DATABASE_PATH],
|
|
520
|
+
connections: [
|
|
521
|
+
{
|
|
522
|
+
storePath: CUBE_DIRECT_DATABASE_PATH,
|
|
523
|
+
databaseType: connection.databaseType as string,
|
|
524
|
+
},
|
|
525
|
+
],
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
if (isCubeProjectModel(model)) {
|
|
531
|
+
// its Databases and runtimes are listed through the project catalog
|
|
532
|
+
throw new CubeEngineError(
|
|
533
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
534
|
+
`A project's outline comes from its depot, through the project catalog`,
|
|
535
|
+
);
|
|
536
|
+
}
|
|
104
537
|
const code = this.textOf(model);
|
|
105
538
|
try {
|
|
106
539
|
return V1_buildCubeModelOutline(
|
|
@@ -115,31 +548,277 @@ export class V1_LegendCubeEngine implements CubeEngine {
|
|
|
115
548
|
model: ModelContext,
|
|
116
549
|
accessors: ReadonlyMap<NodeId, AccessorPath>,
|
|
117
550
|
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
[
|
|
551
|
+
const lambdas = new Map(
|
|
552
|
+
[...accessors].map(([nodeId, path]) => [
|
|
553
|
+
nodeId,
|
|
554
|
+
lambda([], [storeAccessor(path, { nodeId, role: EmitRole.ACCESSOR })]),
|
|
555
|
+
]),
|
|
556
|
+
);
|
|
557
|
+
if (isCubeDataProductModel(model) || isCubeIngestModel(model)) {
|
|
558
|
+
return Promise.resolve(
|
|
559
|
+
new Map(
|
|
560
|
+
[...accessors.keys()].map((nodeId) => [
|
|
561
|
+
nodeId,
|
|
562
|
+
new CubeEngineError(
|
|
563
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
564
|
+
isCubeIngestModel(model)
|
|
565
|
+
? OTHER_SOURCES_IN_INGEST_CUBE
|
|
566
|
+
: TABLES_IN_DATA_PRODUCT_CUBE,
|
|
567
|
+
nodeId,
|
|
568
|
+
),
|
|
569
|
+
]),
|
|
570
|
+
),
|
|
571
|
+
);
|
|
572
|
+
}
|
|
573
|
+
// a table is read again from its database whenever it is resolved
|
|
574
|
+
return model._type === CUBE_DIRECT_MODEL_TYPE
|
|
575
|
+
? this.typeDirect(model, lambdas, true)
|
|
576
|
+
: this.typeAll(model, lambdas);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
async typeLambdas(
|
|
580
|
+
model: ModelContext,
|
|
581
|
+
lambdas: ReadonlyMap<NodeId, IR>,
|
|
582
|
+
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
583
|
+
const family = familyOf(model);
|
|
584
|
+
// a lambda reading another kind of source is refused before any call
|
|
585
|
+
const refused = new Map<NodeId, CubeEngineError>();
|
|
586
|
+
const typable = new Map<NodeId, IR>();
|
|
587
|
+
lambdas.forEach((ir, nodeId) => {
|
|
588
|
+
const problem = foreignSourceProblemOf(family, ir);
|
|
589
|
+
if (problem) {
|
|
590
|
+
refused.set(
|
|
591
|
+
nodeId,
|
|
592
|
+
new CubeEngineError(CubeEngineErrorKind.COMPILE, problem, nodeId),
|
|
593
|
+
);
|
|
594
|
+
} else {
|
|
595
|
+
typable.set(nodeId, ir);
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
const typed =
|
|
599
|
+
family === CubeSourceFamily.DATA_PRODUCT
|
|
600
|
+
? await this.typeDataProduct(model, typable)
|
|
601
|
+
: family === CubeSourceFamily.INGEST
|
|
602
|
+
? await this.typeIngest(model, typable)
|
|
603
|
+
: model._type === CUBE_DIRECT_MODEL_TYPE
|
|
604
|
+
? await this.typeDirect(model, typable, false)
|
|
605
|
+
: await this.typeAll(model, typable);
|
|
606
|
+
// in the order the lambdas were given
|
|
607
|
+
return new Map(
|
|
608
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
609
|
+
nodeId,
|
|
610
|
+
(refused.get(nodeId) ?? typed.get(nodeId)) as Schema | CubeEngineError,
|
|
611
|
+
]),
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Types lambdas on a data product cube: on its project at its saved
|
|
617
|
+
* version, with no runtime. The open-source engine reads no data product,
|
|
618
|
+
* so there every lambda fails as the engine says
|
|
619
|
+
*/
|
|
620
|
+
private async typeDataProduct(
|
|
621
|
+
model: ModelContext,
|
|
622
|
+
lambdas: ReadonlyMap<NodeId, IR>,
|
|
623
|
+
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
624
|
+
let project: CubeDataProductProject;
|
|
625
|
+
try {
|
|
626
|
+
project = this.dataProductProjectOf(model);
|
|
627
|
+
} catch (error) {
|
|
628
|
+
return new Map(
|
|
629
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
122
630
|
nodeId,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
631
|
+
new CubeEngineError(
|
|
632
|
+
(error as CubeEngineError).kind,
|
|
633
|
+
(error as CubeEngineError).detail,
|
|
634
|
+
nodeId,
|
|
126
635
|
),
|
|
127
636
|
]),
|
|
637
|
+
);
|
|
638
|
+
}
|
|
639
|
+
return this.typeOn(V1_buildCubeDataProductTypingContext(project), lambdas);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Types lambdas on an ingest cube: on the definitions they read, as the
|
|
644
|
+
* ingest servers serve them, with no runtime. A lambda whose data sets
|
|
645
|
+
* can't be read on the cube, or whose definition can't be fetched, fails
|
|
646
|
+
* on its own node. The open-source engine reads no ingest definition
|
|
647
|
+
*/
|
|
648
|
+
private async typeIngest(
|
|
649
|
+
model: ModelContext,
|
|
650
|
+
lambdas: ReadonlyMap<NodeId, IR>,
|
|
651
|
+
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
652
|
+
const typed = new Map<NodeId, Schema | CubeEngineError>();
|
|
653
|
+
if (!lambdas.size) {
|
|
654
|
+
return typed;
|
|
655
|
+
}
|
|
656
|
+
let settings: CubeIngestSettings;
|
|
657
|
+
try {
|
|
658
|
+
settings = this.ingestSettingsOf(model);
|
|
659
|
+
} catch (error) {
|
|
660
|
+
return new Map(
|
|
661
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
662
|
+
nodeId,
|
|
663
|
+
toIngestError(error, CubeEngineErrorKind.COMPILE, nodeId),
|
|
664
|
+
]),
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
const accessorsOf = new Map(
|
|
668
|
+
[...lambdas].map(([nodeId, ir]) => [
|
|
669
|
+
nodeId,
|
|
670
|
+
V1_collectCubeIngestAccessors(ir),
|
|
671
|
+
]),
|
|
672
|
+
);
|
|
673
|
+
const checked = new Map<NodeId, IR>();
|
|
674
|
+
lambdas.forEach((ir, nodeId) => {
|
|
675
|
+
const problem = V1_checkCubeIngestAccessors(
|
|
676
|
+
accessorsOf.get(nodeId) ?? [],
|
|
677
|
+
settings,
|
|
678
|
+
);
|
|
679
|
+
if (problem) {
|
|
680
|
+
typed.set(
|
|
681
|
+
nodeId,
|
|
682
|
+
new CubeEngineError(CubeEngineErrorKind.COMPILE, problem, nodeId),
|
|
683
|
+
);
|
|
684
|
+
} else {
|
|
685
|
+
checked.set(nodeId, ir);
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
const definitions = await this.ingestDefinitionsOf(
|
|
689
|
+
V1_getCubeIngestUrns(
|
|
690
|
+
[...checked.keys()].flatMap((nodeId) => accessorsOf.get(nodeId) ?? []),
|
|
128
691
|
),
|
|
692
|
+
settings,
|
|
693
|
+
);
|
|
694
|
+
const typable = new Map<NodeId, IR>();
|
|
695
|
+
checked.forEach((ir, nodeId) => {
|
|
696
|
+
const failure = V1_getCubeIngestUrns(accessorsOf.get(nodeId) ?? [])
|
|
697
|
+
.map((urn) => definitions.get(urn))
|
|
698
|
+
.find((read) => read instanceof CubeEngineError);
|
|
699
|
+
if (failure) {
|
|
700
|
+
typed.set(
|
|
701
|
+
nodeId,
|
|
702
|
+
toIngestError(failure, CubeEngineErrorKind.COMPILE, nodeId),
|
|
703
|
+
);
|
|
704
|
+
} else {
|
|
705
|
+
typable.set(nodeId, ir);
|
|
706
|
+
}
|
|
707
|
+
});
|
|
708
|
+
const elements = [...definitions.values()].filter(
|
|
709
|
+
(read): read is PlainObject => !(read instanceof CubeEngineError),
|
|
710
|
+
);
|
|
711
|
+
(
|
|
712
|
+
await this.typeOn(V1_buildCubeIngestTypingContext(elements), typable)
|
|
713
|
+
).forEach((schema, nodeId) => typed.set(nodeId, schema));
|
|
714
|
+
// in the order the lambdas were given
|
|
715
|
+
return new Map(
|
|
716
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
717
|
+
nodeId,
|
|
718
|
+
typed.get(nodeId) as Schema | CubeEngineError,
|
|
719
|
+
]),
|
|
129
720
|
);
|
|
130
721
|
}
|
|
131
722
|
|
|
132
|
-
|
|
723
|
+
/**
|
|
724
|
+
* Types lambdas on a direct-connection cube: the tables they use are read
|
|
725
|
+
* from its database in one call, then typed in one batch on the model built
|
|
726
|
+
* from them
|
|
727
|
+
*/
|
|
728
|
+
private async typeDirect(
|
|
133
729
|
model: ModelContext,
|
|
134
730
|
lambdas: ReadonlyMap<NodeId, IR>,
|
|
731
|
+
fresh: boolean,
|
|
135
732
|
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
136
|
-
|
|
733
|
+
const typed = new Map<NodeId, Schema | CubeEngineError>();
|
|
734
|
+
if (!lambdas.size) {
|
|
735
|
+
return typed;
|
|
736
|
+
}
|
|
737
|
+
const failAll = (
|
|
738
|
+
toError: (nodeId: NodeId) => CubeEngineError,
|
|
739
|
+
): Map<NodeId, CubeEngineError> =>
|
|
740
|
+
new Map([...lambdas.keys()].map((nodeId) => [nodeId, toError(nodeId)]));
|
|
741
|
+
let connection: CubeDirectConnection;
|
|
742
|
+
try {
|
|
743
|
+
connection = this.directConnectionOf(model);
|
|
744
|
+
} catch (error) {
|
|
745
|
+
return failAll(
|
|
746
|
+
(nodeId) =>
|
|
747
|
+
new CubeEngineError(
|
|
748
|
+
(error as CubeEngineError).kind,
|
|
749
|
+
(error as CubeEngineError).detail,
|
|
750
|
+
nodeId,
|
|
751
|
+
),
|
|
752
|
+
);
|
|
753
|
+
}
|
|
754
|
+
const accessorsOf = new Map(
|
|
755
|
+
[...lambdas].map(([nodeId, ir]) => [
|
|
756
|
+
nodeId,
|
|
757
|
+
V1_collectCubeStoreAccessors(ir),
|
|
758
|
+
]),
|
|
759
|
+
);
|
|
760
|
+
const tables = [...accessorsOf.values()]
|
|
761
|
+
.flat()
|
|
762
|
+
.filter((path) => path[0] === CUBE_DIRECT_DATABASE_PATH)
|
|
763
|
+
.map(directTableOf);
|
|
764
|
+
let built: { context: PlainObject; missing: ReadonlySet<string> };
|
|
765
|
+
try {
|
|
766
|
+
built = await this.directContextFor(connection, tables, fresh);
|
|
767
|
+
} catch (error) {
|
|
768
|
+
return failAll((nodeId) =>
|
|
769
|
+
V1_toCubeExplorationError(error, CubeEngineErrorKind.COMPILE, nodeId),
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
const typable = new Map<NodeId, IR>();
|
|
773
|
+
lambdas.forEach((ir, nodeId) => {
|
|
774
|
+
const problem = tableProblemOf(
|
|
775
|
+
accessorsOf.get(nodeId) ?? [],
|
|
776
|
+
built.missing,
|
|
777
|
+
CubeEngineErrorKind.COMPILE,
|
|
778
|
+
nodeId,
|
|
779
|
+
);
|
|
780
|
+
if (problem) {
|
|
781
|
+
typed.set(nodeId, problem);
|
|
782
|
+
} else {
|
|
783
|
+
typable.set(nodeId, ir);
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
(await this.typeOn(built.context, typable)).forEach((schema, nodeId) =>
|
|
787
|
+
typed.set(nodeId, schema),
|
|
788
|
+
);
|
|
789
|
+
// in the order the lambdas were given
|
|
790
|
+
return new Map(
|
|
791
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
792
|
+
nodeId,
|
|
793
|
+
typed.get(nodeId) as Schema | CubeEngineError,
|
|
794
|
+
]),
|
|
795
|
+
);
|
|
137
796
|
}
|
|
138
797
|
|
|
139
|
-
/** Types every lambda in one batch call: one entry per key, whatever fails */
|
|
798
|
+
/** Types every lambda in one batch call on a text model: one entry per key, whatever fails */
|
|
140
799
|
private async typeAll(
|
|
141
800
|
model: ModelContext,
|
|
142
801
|
lambdas: ReadonlyMap<NodeId, IR>,
|
|
802
|
+
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
803
|
+
if (lambdas.size) {
|
|
804
|
+
try {
|
|
805
|
+
this.checkTablesModel(model);
|
|
806
|
+
} catch (error) {
|
|
807
|
+
return new Map(
|
|
808
|
+
[...lambdas.keys()].map((nodeId) => [
|
|
809
|
+
nodeId,
|
|
810
|
+
V1_toCubeEngineError(error, nodeId, CubeEngineErrorKind.COMPILE),
|
|
811
|
+
]),
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
return this.typeOn(model, lambdas);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
/** Types every lambda in one batch call on a model context: one entry per key, whatever fails */
|
|
819
|
+
private async typeOn(
|
|
820
|
+
context: ModelContext | PlainObject,
|
|
821
|
+
lambdas: ReadonlyMap<NodeId, IR>,
|
|
143
822
|
): Promise<Map<NodeId, Schema | CubeEngineError>> {
|
|
144
823
|
const typed = new Map<NodeId, Schema | CubeEngineError>();
|
|
145
824
|
if (!lambdas.size) {
|
|
@@ -154,9 +833,8 @@ export class V1_LegendCubeEngine implements CubeEngine {
|
|
|
154
833
|
);
|
|
155
834
|
let response: PlainObject;
|
|
156
835
|
try {
|
|
157
|
-
this.textOf(model);
|
|
158
836
|
const body = stringifyLosslessJSON({
|
|
159
|
-
model,
|
|
837
|
+
model: context,
|
|
160
838
|
lambdas: Object.fromEntries(
|
|
161
839
|
[...lambdas].map(([nodeId, ir]) => [
|
|
162
840
|
nodeId,
|
|
@@ -218,16 +896,15 @@ export class V1_LegendCubeEngine implements CubeEngine {
|
|
|
218
896
|
): Promise<CubeResult> {
|
|
219
897
|
const captureId = captureNodeOf(executionLambda);
|
|
220
898
|
const startedAt = Date.now();
|
|
899
|
+
const context = await this.executionContextOf(
|
|
900
|
+
model,
|
|
901
|
+
executionLambda,
|
|
902
|
+
captureId,
|
|
903
|
+
options?.abortController,
|
|
904
|
+
);
|
|
221
905
|
let text: string;
|
|
222
906
|
try {
|
|
223
|
-
this.
|
|
224
|
-
const body = stringifyLosslessJSON({
|
|
225
|
-
clientVersion: EXECUTION_CLIENT_VERSION,
|
|
226
|
-
function: V1_serializeCubeLambda(executionLambda),
|
|
227
|
-
model,
|
|
228
|
-
context: { _type: 'BaseExecutionContext' },
|
|
229
|
-
parameterValues: [],
|
|
230
|
-
});
|
|
907
|
+
const body = this.executionBodyOf(model, context, executionLambda);
|
|
231
908
|
// `returnAsResponse` leaves the body unread, so it can be read losslessly
|
|
232
909
|
const response = (await this.client.runQuery(
|
|
233
910
|
body as unknown as PlainObject,
|
|
@@ -261,6 +938,272 @@ export class V1_LegendCubeEngine implements CubeEngine {
|
|
|
261
938
|
}
|
|
262
939
|
}
|
|
263
940
|
|
|
941
|
+
/**
|
|
942
|
+
* The model a run on a data product cube runs on (PLAN §6.8): its project at
|
|
943
|
+
* the saved version, and a lakehouse runtime at Cube's fixed path, in the
|
|
944
|
+
* viewer's environment, with the cube's warehouse, else the default
|
|
945
|
+
*/
|
|
946
|
+
private async dataProductExecutionContext(
|
|
947
|
+
model: ModelContext,
|
|
948
|
+
executionLambda: IR,
|
|
949
|
+
captureId: NodeId | undefined,
|
|
950
|
+
): Promise<PlainObject> {
|
|
951
|
+
const project = this.dataProductProjectOf(model, captureId);
|
|
952
|
+
if (V1_collectCubeStoreAccessors(executionLambda).length) {
|
|
953
|
+
throw new CubeEngineError(
|
|
954
|
+
CubeEngineErrorKind.EXECUTION,
|
|
955
|
+
TABLES_IN_DATA_PRODUCT_CUBE,
|
|
956
|
+
captureId,
|
|
957
|
+
);
|
|
958
|
+
}
|
|
959
|
+
if (!this.lakehouseEnvironment) {
|
|
960
|
+
throw new CubeEngineError(
|
|
961
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
962
|
+
NO_LAKEHOUSE,
|
|
963
|
+
captureId,
|
|
964
|
+
);
|
|
965
|
+
}
|
|
966
|
+
let environment: string;
|
|
967
|
+
try {
|
|
968
|
+
environment = await this.lakehouseEnvironment.resolveEnvironment(project);
|
|
969
|
+
} catch (error) {
|
|
970
|
+
throw error instanceof CubeEngineError
|
|
971
|
+
? new CubeEngineError(error.kind, error.detail, captureId)
|
|
972
|
+
: new CubeEngineError(
|
|
973
|
+
CubeEngineErrorKind.EXECUTION,
|
|
974
|
+
error instanceof Error ? error.message : String(error),
|
|
975
|
+
captureId,
|
|
976
|
+
);
|
|
977
|
+
}
|
|
978
|
+
return V1_buildCubeDataProductExecutionContext(
|
|
979
|
+
project,
|
|
980
|
+
environment,
|
|
981
|
+
getEffectiveCubeWarehouse(project, this.getRememberedWarehouse()),
|
|
982
|
+
);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
/**
|
|
986
|
+
* The model a run on an ingest cube runs on (PLAN §6.7): the definitions it
|
|
987
|
+
* reads, as the ingest servers serve them, and a lakehouse runtime at
|
|
988
|
+
* Cube's fixed path, in the environment of the cube's class, with the
|
|
989
|
+
* cube's warehouse, else the one the viewer last picked, else the default
|
|
990
|
+
*/
|
|
991
|
+
private async ingestExecutionContext(
|
|
992
|
+
model: ModelContext,
|
|
993
|
+
executionLambda: IR,
|
|
994
|
+
captureId: NodeId | undefined,
|
|
995
|
+
): Promise<PlainObject> {
|
|
996
|
+
const settings = this.ingestSettingsOf(model, captureId);
|
|
997
|
+
const accessors = V1_collectCubeIngestAccessors(executionLambda);
|
|
998
|
+
const problem = V1_checkCubeIngestAccessors(accessors, settings);
|
|
999
|
+
if (problem) {
|
|
1000
|
+
throw new CubeEngineError(
|
|
1001
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1002
|
+
problem,
|
|
1003
|
+
captureId,
|
|
1004
|
+
);
|
|
1005
|
+
}
|
|
1006
|
+
const source = this.ingestDefinitions;
|
|
1007
|
+
if (!source) {
|
|
1008
|
+
throw new CubeEngineError(
|
|
1009
|
+
CubeEngineErrorKind.UNSUPPORTED_MODEL,
|
|
1010
|
+
NO_INGEST,
|
|
1011
|
+
captureId,
|
|
1012
|
+
);
|
|
1013
|
+
}
|
|
1014
|
+
const definitions = await this.ingestDefinitionsOf(
|
|
1015
|
+
V1_getCubeIngestUrns(accessors),
|
|
1016
|
+
settings,
|
|
1017
|
+
);
|
|
1018
|
+
const elements: PlainObject[] = [];
|
|
1019
|
+
definitions.forEach((read) => {
|
|
1020
|
+
if (read instanceof CubeEngineError) {
|
|
1021
|
+
throw toIngestError(read, CubeEngineErrorKind.EXECUTION, captureId);
|
|
1022
|
+
}
|
|
1023
|
+
elements.push(read);
|
|
1024
|
+
});
|
|
1025
|
+
let environment: string;
|
|
1026
|
+
try {
|
|
1027
|
+
environment = await source.getRuntimeEnvironment(
|
|
1028
|
+
settings.environmentType,
|
|
1029
|
+
);
|
|
1030
|
+
} catch (error) {
|
|
1031
|
+
throw toIngestError(error, CubeEngineErrorKind.EXECUTION, captureId);
|
|
1032
|
+
}
|
|
1033
|
+
return V1_buildCubeIngestExecutionContext(
|
|
1034
|
+
elements,
|
|
1035
|
+
environment,
|
|
1036
|
+
getEffectiveCubeWarehouse(settings, this.getRememberedWarehouse()),
|
|
1037
|
+
);
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
/**
|
|
1041
|
+
* The model a run on a direct-connection cube runs on: the tables it uses,
|
|
1042
|
+
* read from its database when this session hasn't read them. A run stopped
|
|
1043
|
+
* meanwhile goes no further
|
|
1044
|
+
*/
|
|
1045
|
+
private async directExecutionContext(
|
|
1046
|
+
model: ModelContext,
|
|
1047
|
+
executionLambda: IR,
|
|
1048
|
+
captureId: NodeId | undefined,
|
|
1049
|
+
abortController: AbortController | undefined,
|
|
1050
|
+
): Promise<PlainObject> {
|
|
1051
|
+
const connection = this.directConnectionOf(model, captureId);
|
|
1052
|
+
const accessors = V1_collectCubeStoreAccessors(executionLambda);
|
|
1053
|
+
const foreign = accessors.find(
|
|
1054
|
+
(path) => path[0] !== CUBE_DIRECT_DATABASE_PATH,
|
|
1055
|
+
);
|
|
1056
|
+
if (foreign) {
|
|
1057
|
+
throw foreignTableError(
|
|
1058
|
+
foreign,
|
|
1059
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1060
|
+
captureId,
|
|
1061
|
+
);
|
|
1062
|
+
}
|
|
1063
|
+
let built: { context: PlainObject; missing: ReadonlySet<string> };
|
|
1064
|
+
try {
|
|
1065
|
+
built = await this.directContextFor(
|
|
1066
|
+
connection,
|
|
1067
|
+
accessors.map(directTableOf),
|
|
1068
|
+
false,
|
|
1069
|
+
);
|
|
1070
|
+
} catch (error) {
|
|
1071
|
+
throw V1_toCubeExplorationError(
|
|
1072
|
+
error,
|
|
1073
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1074
|
+
captureId,
|
|
1075
|
+
);
|
|
1076
|
+
}
|
|
1077
|
+
const problem = tableProblemOf(
|
|
1078
|
+
accessors,
|
|
1079
|
+
built.missing,
|
|
1080
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1081
|
+
captureId,
|
|
1082
|
+
);
|
|
1083
|
+
if (problem) {
|
|
1084
|
+
throw problem;
|
|
1085
|
+
}
|
|
1086
|
+
if (abortController?.signal.aborted) {
|
|
1087
|
+
throw new CubeEngineError(
|
|
1088
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1089
|
+
'The run was stopped',
|
|
1090
|
+
captureId,
|
|
1091
|
+
);
|
|
1092
|
+
}
|
|
1093
|
+
return built.context;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
/**
|
|
1097
|
+
* The model a run of the lambda runs on: the cube's, or the context its
|
|
1098
|
+
* data products, ingest data sets or direct connection need. A lambda
|
|
1099
|
+
* reading another kind of source is refused first
|
|
1100
|
+
*/
|
|
1101
|
+
private async executionContextOf(
|
|
1102
|
+
model: ModelContext,
|
|
1103
|
+
executionLambda: IR,
|
|
1104
|
+
captureId: NodeId | undefined,
|
|
1105
|
+
abortController: AbortController | undefined,
|
|
1106
|
+
): Promise<ModelContext | PlainObject> {
|
|
1107
|
+
const family = familyOf(model);
|
|
1108
|
+
const problem = foreignSourceProblemOf(family, executionLambda);
|
|
1109
|
+
if (problem) {
|
|
1110
|
+
throw new CubeEngineError(
|
|
1111
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1112
|
+
problem,
|
|
1113
|
+
captureId,
|
|
1114
|
+
);
|
|
1115
|
+
}
|
|
1116
|
+
return family === CubeSourceFamily.DATA_PRODUCT
|
|
1117
|
+
? this.dataProductExecutionContext(model, executionLambda, captureId)
|
|
1118
|
+
: family === CubeSourceFamily.INGEST
|
|
1119
|
+
? this.ingestExecutionContext(model, executionLambda, captureId)
|
|
1120
|
+
: model._type === CUBE_DIRECT_MODEL_TYPE
|
|
1121
|
+
? this.directExecutionContext(
|
|
1122
|
+
model,
|
|
1123
|
+
executionLambda,
|
|
1124
|
+
captureId,
|
|
1125
|
+
abortController,
|
|
1126
|
+
)
|
|
1127
|
+
: model;
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
/** The body of a run, or of its plan, as text, so numbers keep every digit */
|
|
1131
|
+
private executionBodyOf(
|
|
1132
|
+
model: ModelContext,
|
|
1133
|
+
context: ModelContext | PlainObject,
|
|
1134
|
+
executionLambda: IR,
|
|
1135
|
+
): string {
|
|
1136
|
+
if (
|
|
1137
|
+
model._type !== CUBE_DIRECT_MODEL_TYPE &&
|
|
1138
|
+
familyOf(model) === CubeSourceFamily.TABLES
|
|
1139
|
+
) {
|
|
1140
|
+
this.checkTablesModel(model);
|
|
1141
|
+
}
|
|
1142
|
+
return stringifyLosslessJSON({
|
|
1143
|
+
clientVersion: EXECUTION_CLIENT_VERSION,
|
|
1144
|
+
function: V1_serializeCubeLambda(executionLambda),
|
|
1145
|
+
model: context,
|
|
1146
|
+
context: { _type: 'BaseExecutionContext' },
|
|
1147
|
+
parameterValues: [],
|
|
1148
|
+
});
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
async planLambda(model: ModelContext, executionLambda: IR): Promise<void> {
|
|
1152
|
+
const captureId = captureNodeOf(executionLambda);
|
|
1153
|
+
const context = await this.executionContextOf(
|
|
1154
|
+
model,
|
|
1155
|
+
executionLambda,
|
|
1156
|
+
captureId,
|
|
1157
|
+
undefined,
|
|
1158
|
+
);
|
|
1159
|
+
try {
|
|
1160
|
+
await this.client.generatePlan(
|
|
1161
|
+
this.executionBodyOf(
|
|
1162
|
+
model,
|
|
1163
|
+
context,
|
|
1164
|
+
executionLambda,
|
|
1165
|
+
) as unknown as PlainObject,
|
|
1166
|
+
);
|
|
1167
|
+
} catch (error) {
|
|
1168
|
+
throw V1_toCubeEngineError(
|
|
1169
|
+
error,
|
|
1170
|
+
captureId,
|
|
1171
|
+
CubeEngineErrorKind.EXECUTION,
|
|
1172
|
+
);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
async parseExpression(
|
|
1177
|
+
code: string,
|
|
1178
|
+
sourceId: string,
|
|
1179
|
+
): Promise<CubeParsedExpression> {
|
|
1180
|
+
let text: string;
|
|
1181
|
+
try {
|
|
1182
|
+
// unread, so it can be read losslessly: a literal keeps its digits
|
|
1183
|
+
const response = await this.client.postWithTracing<Response>(
|
|
1184
|
+
this.client.getTraceData(GRAMMAR_TO_JSON_TRACE),
|
|
1185
|
+
`${this.client._grammarToJSON()}/valueSpecification`,
|
|
1186
|
+
code,
|
|
1187
|
+
{},
|
|
1188
|
+
{ [HttpHeader.CONTENT_TYPE]: ContentType.TEXT_PLAIN },
|
|
1189
|
+
{ sourceId, returnSourceInformation: true },
|
|
1190
|
+
{ enableCompression: true },
|
|
1191
|
+
{ skipProcessing: true },
|
|
1192
|
+
);
|
|
1193
|
+
text = await response.text();
|
|
1194
|
+
} catch (error) {
|
|
1195
|
+
throw V1_toCubeEngineError(error, undefined, CubeEngineErrorKind.COMPILE);
|
|
1196
|
+
}
|
|
1197
|
+
try {
|
|
1198
|
+
return V1_readCubeExpression(parseLosslessJSON(text));
|
|
1199
|
+
} catch (error) {
|
|
1200
|
+
throw new CubeEngineError(
|
|
1201
|
+
CubeEngineErrorKind.COMPILE,
|
|
1202
|
+
(error as Error).message,
|
|
1203
|
+
);
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
|
|
264
1207
|
async renderPure(lambdaIR: IR): Promise<string> {
|
|
265
1208
|
try {
|
|
266
1209
|
// sent as text, as typing and execution are: the serialized lambda holds
|