@finos/legend-cube-builder 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/docs/adding-an-operation.md +22 -12
- package/docs/demo/DEMO-FAST-NOTES.md +67 -0
- package/docs/demo/README.md +102 -0
- package/docs/demo/specs/duckdb-sales-pivot.cube.json +110 -0
- package/docs/demo/specs/trades-desks-1-joined.cube.json +123 -0
- package/docs/demo/specs/trades-desks-2-grouped.cube.json +140 -0
- package/docs/demo/specs/trades-desks-3-ranked.cube.json +158 -0
- package/docs/demo/specs/trades-desks-4-extended.cube.json +208 -0
- package/docs/demo/specs/trades-desks-5-final.cube.json +248 -0
- package/docs/hosting.md +50 -3
- package/docs/testing.md +32 -0
- package/lib/__lib__/LegendCubeCommand.d.ts +2 -0
- package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeCommand.js +7 -0
- package/lib/__lib__/LegendCubeCommand.js.map +1 -1
- package/lib/__lib__/LegendCubeFunctionLabels.d.ts +29 -0
- package/lib/__lib__/LegendCubeFunctionLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeFunctionLabels.js +31 -0
- package/lib/__lib__/LegendCubeFunctionLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeHelpText.d.ts +5 -1
- package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeHelpText.js +14 -2
- package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
- package/lib/__lib__/LegendCubeLabels.d.ts +100 -8
- package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeLabels.js +129 -14
- package/lib/__lib__/LegendCubeLabels.js.map +1 -1
- package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts +26 -0
- package/lib/__lib__/LegendCubeProjectSourceLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeProjectSourceLabels.js +26 -0
- package/lib/__lib__/LegendCubeProjectSourceLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeServiceLabels.d.ts +27 -0
- package/lib/__lib__/LegendCubeServiceLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeServiceLabels.js +32 -0
- package/lib/__lib__/LegendCubeServiceLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeTesting.d.ts +7 -0
- package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeTesting.js +7 -0
- package/lib/__lib__/LegendCubeTesting.js.map +1 -1
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts +1 -1
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
- package/lib/__test-utils__/CubeEngineTestSupport.js +2 -2
- package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +8 -1
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -1
- package/lib/__test-utils__/CubeExpressionTestUtils.js +20 -3
- package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -1
- package/lib/__test-utils__/CubeFunctionTestOutline.d.ts +26 -0
- package/lib/__test-utils__/CubeFunctionTestOutline.d.ts.map +1 -0
- package/lib/__test-utils__/CubeFunctionTestOutline.js +56 -0
- package/lib/__test-utils__/CubeFunctionTestOutline.js.map +1 -0
- package/lib/__test-utils__/CubeLambdaCorpus.d.ts +36 -0
- package/lib/__test-utils__/CubeLambdaCorpus.d.ts.map +1 -0
- package/lib/__test-utils__/CubeLambdaCorpus.js +83 -0
- package/lib/__test-utils__/CubeLambdaCorpus.js.map +1 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts +6 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
- package/lib/__test-utils__/CubePageTestUtils.js +21 -0
- package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.d.ts +9 -0
- package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.js +16 -0
- package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
- package/lib/__test-utils__/FakeCubeEngine.d.ts +5 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
- package/lib/__test-utils__/FakeCubeEngine.js +17 -0
- package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +7 -1
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -1
- package/lib/__test-utils__/FakeCubeIngestCatalog.js +16 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -1
- package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts +26 -0
- package/lib/__test-utils__/FakeCubeServiceCatalog.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeServiceCatalog.js +40 -0
- package/lib/__test-utils__/FakeCubeServiceCatalog.js.map +1 -0
- package/lib/components/CubeAddItems.d.ts.map +1 -1
- package/lib/components/CubeAddItems.js +9 -6
- package/lib/components/CubeAddItems.js.map +1 -1
- package/lib/components/CubeDialogTheme.d.ts +25 -0
- package/lib/components/CubeDialogTheme.d.ts.map +1 -0
- package/lib/components/CubeDialogTheme.js +25 -0
- package/lib/components/CubeDialogTheme.js.map +1 -0
- package/lib/components/CubeEditor.d.ts +12 -1
- package/lib/components/CubeEditor.d.ts.map +1 -1
- package/lib/components/CubeEditor.js +16 -14
- package/lib/components/CubeEditor.js.map +1 -1
- package/lib/components/CubeFileMenu.d.ts +28 -0
- package/lib/components/CubeFileMenu.d.ts.map +1 -0
- package/lib/components/CubeFileMenu.js +77 -0
- package/lib/components/CubeFileMenu.js.map +1 -0
- package/lib/components/CubeLambdaImportBanner.d.ts +26 -0
- package/lib/components/CubeLambdaImportBanner.d.ts.map +1 -0
- package/lib/components/CubeLambdaImportBanner.js +47 -0
- package/lib/components/CubeLambdaImportBanner.js.map +1 -0
- package/lib/components/CubeNodeIcon.d.ts.map +1 -1
- package/lib/components/CubeNodeIcon.js +5 -1
- package/lib/components/CubeNodeIcon.js.map +1 -1
- package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -1
- package/lib/components/CubeSchemaColumnsTable.js +2 -2
- package/lib/components/CubeSchemaColumnsTable.js.map +1 -1
- package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvas.js +38 -5
- package/lib/components/canvas/CubeCanvas.js.map +1 -1
- package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasContextMenu.js +2 -1
- package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
- package/lib/components/canvas/CubeCanvasElements.d.ts +18 -1
- package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasElements.js +58 -3
- package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
- package/lib/components/canvas/CubeCanvasLayout.js +1 -1
- package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasNode.js +8 -4
- package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
- package/lib/components/dev-settings/CubeDevSettings.d.ts +35 -0
- package/lib/components/dev-settings/CubeDevSettings.d.ts.map +1 -0
- package/lib/components/dev-settings/CubeDevSettings.js +50 -0
- package/lib/components/dev-settings/CubeDevSettings.js.map +1 -0
- package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -1
- package/lib/components/editors/CubeColumnChecklist.js +2 -2
- package/lib/components/editors/CubeColumnChecklist.js.map +1 -1
- package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
- package/lib/components/editors/CubeColumnPicker.js +3 -3
- package/lib/components/editors/CubeColumnPicker.js.map +1 -1
- package/lib/components/editors/CubeConcatEditor.js +2 -2
- package/lib/components/editors/CubeConcatEditor.js.map +1 -1
- package/lib/components/editors/CubeExpressionFilterEditor.d.ts +25 -0
- package/lib/components/editors/CubeExpressionFilterEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeExpressionFilterEditor.js +83 -0
- package/lib/components/editors/CubeExpressionFilterEditor.js.map +1 -0
- package/lib/components/editors/CubeExtendEditor.d.ts +2 -0
- package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeExtendEditor.js +3 -3
- package/lib/components/editors/CubeExtendEditor.js.map +1 -1
- package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeFilterEditor.js +13 -2
- package/lib/components/editors/CubeFilterEditor.js.map +1 -1
- package/lib/components/editors/CubeFunctionSourceEditor.d.ts +25 -0
- package/lib/components/editors/CubeFunctionSourceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeFunctionSourceEditor.js +55 -0
- package/lib/components/editors/CubeFunctionSourceEditor.js.map +1 -0
- package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeJoinEditor.js +16 -4
- package/lib/components/editors/CubeJoinEditor.js.map +1 -1
- package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
- package/lib/components/editors/CubeNodeEditorPanel.js +18 -8
- package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
- package/lib/components/editors/CubeNodeEditorPopper.d.ts +5 -1
- package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -1
- package/lib/components/editors/CubeNodeEditorPopper.js +10 -2
- package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -1
- package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
- package/lib/components/editors/CubeNodeEditorRegistry.js +9 -1
- package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
- package/lib/components/editors/CubePivotEditor.d.ts +26 -0
- package/lib/components/editors/CubePivotEditor.d.ts.map +1 -0
- package/lib/components/editors/CubePivotEditor.js +93 -0
- package/lib/components/editors/CubePivotEditor.js.map +1 -0
- package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeRestrictEditor.js +2 -2
- package/lib/components/editors/CubeRestrictEditor.js.map +1 -1
- package/lib/components/editors/CubeServiceSourceEditor.d.ts +25 -0
- package/lib/components/editors/CubeServiceSourceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeServiceSourceEditor.js +41 -0
- package/lib/components/editors/CubeServiceSourceEditor.js.map +1 -0
- package/lib/components/grid/CubeColumnFormatDialog.d.ts +28 -0
- package/lib/components/grid/CubeColumnFormatDialog.d.ts.map +1 -0
- package/lib/components/grid/CubeColumnFormatDialog.js +94 -0
- package/lib/components/grid/CubeColumnFormatDialog.js.map +1 -0
- package/lib/components/grid/CubeDrilldownBar.d.ts +37 -0
- package/lib/components/grid/CubeDrilldownBar.d.ts.map +1 -0
- package/lib/components/grid/CubeDrilldownBar.js +77 -0
- package/lib/components/grid/CubeDrilldownBar.js.map +1 -0
- package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
- package/lib/components/grid/CubeGridRegion.js +40 -26
- package/lib/components/grid/CubeGridRegion.js.map +1 -1
- package/lib/components/grid/CubeGridValues.d.ts +31 -1
- package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
- package/lib/components/grid/CubeGridValues.js +108 -1
- package/lib/components/grid/CubeGridValues.js.map +1 -1
- package/lib/components/grid/CubeResultGrid.d.ts +68 -5
- package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
- package/lib/components/grid/CubeResultGrid.js +308 -35
- package/lib/components/grid/CubeResultGrid.js.map +1 -1
- package/lib/components/grid/CubeRunStatsPanel.d.ts +28 -0
- package/lib/components/grid/CubeRunStatsPanel.d.ts.map +1 -0
- package/lib/components/grid/CubeRunStatsPanel.js +61 -0
- package/lib/components/grid/CubeRunStatsPanel.js.map +1 -0
- package/lib/components/grid/CubeServerSideGrid.d.ts +36 -0
- package/lib/components/grid/CubeServerSideGrid.d.ts.map +1 -0
- package/lib/components/grid/CubeServerSideGrid.js +114 -0
- package/lib/components/grid/CubeServerSideGrid.js.map +1 -0
- package/lib/components/grid/CubeSqlDialog.d.ts +24 -0
- package/lib/components/grid/CubeSqlDialog.d.ts.map +1 -0
- package/lib/components/grid/CubeSqlDialog.js +39 -0
- package/lib/components/grid/CubeSqlDialog.js.map +1 -0
- package/lib/components/grid/CubeSqlFormat.d.ts +20 -0
- package/lib/components/grid/CubeSqlFormat.d.ts.map +1 -0
- package/lib/components/grid/CubeSqlFormat.js +32 -0
- package/lib/components/grid/CubeSqlFormat.js.map +1 -0
- package/lib/components/palette/CubePalette.d.ts.map +1 -1
- package/lib/components/palette/CubePalette.js +32 -13
- package/lib/components/palette/CubePalette.js.map +1 -1
- package/lib/components/show-pure/CubeShowPureDialog.d.ts +4 -1
- package/lib/components/show-pure/CubeShowPureDialog.d.ts.map +1 -1
- package/lib/components/show-pure/CubeShowPureDialog.js +8 -4
- package/lib/components/show-pure/CubeShowPureDialog.js.map +1 -1
- package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -1
- package/lib/components/source-picker/CubeDataProductTab.js +37 -16
- package/lib/components/source-picker/CubeDataProductTab.js.map +1 -1
- package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -1
- package/lib/components/source-picker/CubeDirectConnectionTab.js +6 -4
- package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -1
- package/lib/components/source-picker/CubeFunctionSteps.d.ts +36 -0
- package/lib/components/source-picker/CubeFunctionSteps.d.ts.map +1 -0
- package/lib/components/source-picker/CubeFunctionSteps.js +76 -0
- package/lib/components/source-picker/CubeFunctionSteps.js.map +1 -0
- package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -1
- package/lib/components/source-picker/CubeIngestTab.js +39 -16
- package/lib/components/source-picker/CubeIngestTab.js.map +1 -1
- package/lib/components/source-picker/CubeInlineModelTab.d.ts +3 -2
- package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -1
- package/lib/components/source-picker/CubeInlineModelTab.js +23 -13
- package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -1
- package/lib/components/source-picker/CubePickerListItem.d.ts +47 -0
- package/lib/components/source-picker/CubePickerListItem.d.ts.map +1 -0
- package/lib/components/source-picker/CubePickerListItem.js +62 -0
- package/lib/components/source-picker/CubePickerListItem.js.map +1 -0
- package/lib/components/source-picker/CubeProjectTab.d.ts +4 -3
- package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -1
- package/lib/components/source-picker/CubeProjectTab.js +7 -4
- package/lib/components/source-picker/CubeProjectTab.js.map +1 -1
- package/lib/components/source-picker/CubeServiceTab.d.ts +27 -0
- package/lib/components/source-picker/CubeServiceTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeServiceTab.js +36 -0
- package/lib/components/source-picker/CubeServiceTab.js.map +1 -0
- package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
- package/lib/components/source-picker/CubeSourcePicker.js +16 -3
- package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
- package/lib/components/source-picker/CubeTablePreview.d.ts +29 -0
- package/lib/components/source-picker/CubeTablePreview.d.ts.map +1 -0
- package/lib/components/source-picker/CubeTablePreview.js +10 -0
- package/lib/components/source-picker/CubeTablePreview.js.map +1 -0
- package/lib/components/spec-transfer/CubeImportPureDialog.d.ts +27 -0
- package/lib/components/spec-transfer/CubeImportPureDialog.d.ts.map +1 -0
- package/lib/components/spec-transfer/CubeImportPureDialog.js +38 -0
- package/lib/components/spec-transfer/CubeImportPureDialog.js.map +1 -0
- package/lib/components/spec-transfer/CubeSpecTransferDialog.d.ts.map +1 -1
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js +9 -3
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
- package/lib/graph-manager/CubeDataProductCatalog.d.ts +10 -0
- package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -1
- package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -1
- package/lib/graph-manager/CubeEngine.d.ts +46 -1
- package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
- package/lib/graph-manager/CubeEngine.js.map +1 -1
- package/lib/graph-manager/CubeEngineClientSettings.d.ts +43 -0
- package/lib/graph-manager/CubeEngineClientSettings.d.ts.map +1 -0
- package/lib/graph-manager/CubeEngineClientSettings.js +51 -0
- package/lib/graph-manager/CubeEngineClientSettings.js.map +1 -0
- package/lib/graph-manager/CubeIngest.d.ts +5 -0
- package/lib/graph-manager/CubeIngest.d.ts.map +1 -1
- package/lib/graph-manager/CubeIngest.js +10 -0
- package/lib/graph-manager/CubeIngest.js.map +1 -1
- package/lib/graph-manager/CubeIngestCatalog.d.ts +26 -0
- package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -1
- package/lib/graph-manager/CubeIngestCatalog.js +6 -0
- package/lib/graph-manager/CubeIngestCatalog.js.map +1 -1
- package/lib/graph-manager/CubeLakehouseRuntime.d.ts +29 -0
- package/lib/graph-manager/CubeLakehouseRuntime.d.ts.map +1 -0
- package/lib/graph-manager/CubeLakehouseRuntime.js +40 -0
- package/lib/graph-manager/CubeLakehouseRuntime.js.map +1 -0
- package/lib/graph-manager/CubeProjectCatalog.d.ts +3 -3
- package/lib/graph-manager/CubeService.d.ts +20 -0
- package/lib/graph-manager/CubeService.d.ts.map +1 -0
- package/lib/graph-manager/CubeService.js +22 -0
- package/lib/graph-manager/CubeService.js.map +1 -0
- package/lib/graph-manager/CubeServiceCatalog.d.ts +31 -0
- package/lib/graph-manager/CubeServiceCatalog.d.ts.map +1 -0
- package/lib/graph-manager/CubeServiceCatalog.js +17 -0
- package/lib/graph-manager/CubeServiceCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +52 -5
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +63 -5
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +9 -6
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +12 -8
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts +30 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js +229 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +18 -9
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +4 -9
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +2 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts +34 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js +332 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +49 -10
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +3 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +2 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +2 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +18 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +74 -6
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +7 -4
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts +31 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js +69 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +6 -2
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +12 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -1
- package/lib/index.js.map +1 -1
- package/lib/stores/CubeAddPlacement.d.ts +10 -3
- package/lib/stores/CubeAddPlacement.d.ts.map +1 -1
- package/lib/stores/CubeAddPlacement.js +16 -5
- package/lib/stores/CubeAddPlacement.js.map +1 -1
- package/lib/stores/CubeDevSettingsState.d.ts +47 -0
- package/lib/stores/CubeDevSettingsState.d.ts.map +1 -0
- package/lib/stores/CubeDevSettingsState.js +99 -0
- package/lib/stores/CubeDevSettingsState.js.map +1 -0
- package/lib/stores/CubeEditorState.d.ts +173 -43
- package/lib/stores/CubeEditorState.d.ts.map +1 -1
- package/lib/stores/CubeEditorState.js +498 -113
- package/lib/stores/CubeEditorState.js.map +1 -1
- package/lib/stores/CubeEngineChecks.d.ts +59 -0
- package/lib/stores/CubeEngineChecks.d.ts.map +1 -0
- package/lib/stores/CubeEngineChecks.js +100 -0
- package/lib/stores/CubeEngineChecks.js.map +1 -0
- package/lib/stores/CubeExamples.d.ts.map +1 -1
- package/lib/stores/CubeExamples.js +39 -2
- package/lib/stores/CubeExamples.js.map +1 -1
- package/lib/stores/CubeExamplesState.d.ts +1 -1
- package/lib/stores/CubeExamplesState.d.ts.map +1 -1
- package/lib/stores/CubeExamplesState.js +2 -2
- package/lib/stores/CubeExamplesState.js.map +1 -1
- package/lib/stores/CubeExecutionState.d.ts.map +1 -1
- package/lib/stores/CubeExecutionState.js +24 -33
- package/lib/stores/CubeExecutionState.js.map +1 -1
- package/lib/stores/CubeExportState.d.ts +41 -0
- package/lib/stores/CubeExportState.d.ts.map +1 -0
- package/lib/stores/CubeExportState.js +134 -0
- package/lib/stores/CubeExportState.js.map +1 -0
- package/lib/stores/CubeExpressionFilterCheck.d.ts +51 -0
- package/lib/stores/CubeExpressionFilterCheck.d.ts.map +1 -0
- package/lib/stores/CubeExpressionFilterCheck.js +134 -0
- package/lib/stores/CubeExpressionFilterCheck.js.map +1 -0
- package/lib/stores/CubeExtendTyping.d.ts +6 -14
- package/lib/stores/CubeExtendTyping.d.ts.map +1 -1
- package/lib/stores/CubeExtendTyping.js +6 -33
- package/lib/stores/CubeExtendTyping.js.map +1 -1
- package/lib/stores/CubeFunctionRecheck.d.ts +30 -0
- package/lib/stores/CubeFunctionRecheck.d.ts.map +1 -0
- package/lib/stores/CubeFunctionRecheck.js +67 -0
- package/lib/stores/CubeFunctionRecheck.js.map +1 -0
- package/lib/stores/CubeGridFetcher.d.ts +75 -0
- package/lib/stores/CubeGridFetcher.d.ts.map +1 -0
- package/lib/stores/CubeGridFetcher.js +197 -0
- package/lib/stores/CubeGridFetcher.js.map +1 -0
- package/lib/stores/CubeGridQuickActions.d.ts +18 -6
- package/lib/stores/CubeGridQuickActions.d.ts.map +1 -1
- package/lib/stores/CubeGridQuickActions.js +32 -12
- package/lib/stores/CubeGridQuickActions.js.map +1 -1
- package/lib/stores/CubeGridState.d.ts +136 -0
- package/lib/stores/CubeGridState.d.ts.map +1 -0
- package/lib/stores/CubeGridState.js +317 -0
- package/lib/stores/CubeGridState.js.map +1 -0
- package/lib/stores/CubeHost.d.ts +42 -0
- package/lib/stores/CubeHost.d.ts.map +1 -1
- package/lib/stores/CubeHost.js +4 -0
- package/lib/stores/CubeHost.js.map +1 -1
- package/lib/stores/CubeLambdaImportState.d.ts +118 -0
- package/lib/stores/CubeLambdaImportState.d.ts.map +1 -0
- package/lib/stores/CubeLambdaImportState.js +302 -0
- package/lib/stores/CubeLambdaImportState.js.map +1 -0
- package/lib/stores/CubeLambdaSources.d.ts +45 -0
- package/lib/stores/CubeLambdaSources.d.ts.map +1 -0
- package/lib/stores/CubeLambdaSources.js +261 -0
- package/lib/stores/CubeLambdaSources.js.map +1 -0
- package/lib/stores/CubeQueryRun.d.ts +59 -0
- package/lib/stores/CubeQueryRun.d.ts.map +1 -0
- package/lib/stores/CubeQueryRun.js +101 -0
- package/lib/stores/CubeQueryRun.js.map +1 -0
- package/lib/stores/CubeRunStatsState.d.ts +61 -0
- package/lib/stores/CubeRunStatsState.d.ts.map +1 -0
- package/lib/stores/CubeRunStatsState.js +54 -0
- package/lib/stores/CubeRunStatsState.js.map +1 -0
- package/lib/stores/CubeRunningStepLambda.d.ts +25 -0
- package/lib/stores/CubeRunningStepLambda.d.ts.map +1 -0
- package/lib/stores/CubeRunningStepLambda.js +45 -0
- package/lib/stores/CubeRunningStepLambda.js.map +1 -0
- package/lib/stores/CubeServiceRecheck.d.ts +29 -0
- package/lib/stores/CubeServiceRecheck.d.ts.map +1 -0
- package/lib/stores/CubeServiceRecheck.js +33 -0
- package/lib/stores/CubeServiceRecheck.js.map +1 -0
- package/lib/stores/CubeShowPureState.d.ts +14 -1
- package/lib/stores/CubeShowPureState.d.ts.map +1 -1
- package/lib/stores/CubeShowPureState.js +41 -11
- package/lib/stores/CubeShowPureState.js.map +1 -1
- package/lib/stores/CubeSourcePickerState.d.ts +20 -4
- package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
- package/lib/stores/CubeSourcePickerState.js +75 -14
- package/lib/stores/CubeSourcePickerState.js.map +1 -1
- package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
- package/lib/stores/LocalModelCatalog.js +3 -1
- package/lib/stores/LocalModelCatalog.js.map +1 -1
- package/lib/stores/editors/CubeExpressionFilterDraft.d.ts +91 -0
- package/lib/stores/editors/CubeExpressionFilterDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeExpressionFilterDraft.js +254 -0
- package/lib/stores/editors/CubeExpressionFilterDraft.js.map +1 -0
- package/lib/stores/editors/CubeFunctionDraft.d.ts +34 -0
- package/lib/stores/editors/CubeFunctionDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeFunctionDraft.js +69 -0
- package/lib/stores/editors/CubeFunctionDraft.js.map +1 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +4 -2
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
- package/lib/stores/editors/CubeNodeDraftRegistry.js +20 -3
- package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
- package/lib/stores/editors/CubePivotDraft.d.ts +93 -0
- package/lib/stores/editors/CubePivotDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubePivotDraft.js +267 -0
- package/lib/stores/editors/CubePivotDraft.js.map +1 -0
- package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts +26 -0
- package/lib/stores/fixtures/CubeSalesDuckDbModel.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeSalesDuckDbModel.js +46 -0
- package/lib/stores/fixtures/CubeSalesDuckDbModel.js.map +1 -0
- package/lib/stores/fixtures/CubeTradesModel.d.ts +4 -0
- package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -1
- package/lib/stores/fixtures/CubeTradesModel.js +31 -1
- package/lib/stores/fixtures/CubeTradesModel.js.map +1 -1
- package/lib/stores/source-picker/CubeDataProductTabState.d.ts +34 -5
- package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeDataProductTabState.js +111 -26
- package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -1
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +25 -2
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js +183 -31
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -1
- package/lib/stores/source-picker/CubeIngestTabState.d.ts +22 -9
- package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeIngestTabState.js +84 -29
- package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -1
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +100 -4
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeInlineModelTabState.js +415 -28
- package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -1
- package/lib/stores/source-picker/CubeProjectTabState.d.ts +18 -3
- package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeProjectTabState.js +26 -1
- package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -1
- package/lib/stores/source-picker/CubeServiceTabState.d.ts +74 -0
- package/lib/stores/source-picker/CubeServiceTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeServiceTabState.js +216 -0
- package/lib/stores/source-picker/CubeServiceTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +15 -3
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -1
- package/lib/stores/source-picker/CubeSourcePickerTab.js +21 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -1
- package/package.json +10 -9
- package/src/__lib__/LegendCubeCommand.ts +7 -0
- package/src/__lib__/LegendCubeFunctionLabels.ts +41 -0
- package/src/__lib__/LegendCubeHelpText.ts +23 -1
- package/src/__lib__/LegendCubeLabels.ts +170 -13
- package/src/__lib__/LegendCubeProjectSourceLabels.ts +26 -0
- package/src/__lib__/LegendCubeServiceLabels.ts +41 -0
- package/src/__lib__/LegendCubeTesting.ts +7 -0
- package/src/__test-utils__/CubeEngineTestSupport.ts +2 -1
- package/src/__test-utils__/CubeExpressionTestUtils.ts +29 -2
- package/src/__test-utils__/CubeFunctionTestOutline.ts +78 -0
- package/src/__test-utils__/CubeLambdaCorpus.ts +137 -0
- package/src/__test-utils__/CubePageTestUtils.tsx +34 -0
- package/src/__test-utils__/CubeTestApplication.ts +25 -0
- package/src/__test-utils__/FakeCubeEngine.ts +27 -0
- package/src/__test-utils__/FakeCubeIngestCatalog.ts +18 -0
- package/src/__test-utils__/FakeCubeServiceCatalog.ts +57 -0
- package/src/components/CubeAddItems.tsx +13 -6
- package/src/components/CubeDialogTheme.ts +25 -0
- package/src/components/CubeEditor.tsx +155 -129
- package/src/components/CubeFileMenu.tsx +127 -0
- package/src/components/CubeLambdaImportBanner.tsx +97 -0
- package/src/components/CubeNodeIcon.tsx +7 -0
- package/src/components/CubeSchemaColumnsTable.tsx +7 -2
- package/src/components/canvas/CubeCanvas.tsx +52 -13
- package/src/components/canvas/CubeCanvasContextMenu.tsx +33 -2
- package/src/components/canvas/CubeCanvasElements.ts +76 -3
- package/src/components/canvas/CubeCanvasLayout.ts +1 -1
- package/src/components/canvas/CubeCanvasNode.tsx +30 -3
- package/src/components/dev-settings/CubeDevSettings.tsx +154 -0
- package/src/components/editors/CubeColumnChecklist.tsx +8 -2
- package/src/components/editors/CubeColumnPicker.tsx +6 -3
- package/src/components/editors/CubeConcatEditor.tsx +2 -2
- package/src/components/editors/CubeExpressionFilterEditor.tsx +193 -0
- package/src/components/editors/CubeExtendEditor.tsx +3 -3
- package/src/components/editors/CubeFilterEditor.tsx +13 -1
- package/src/components/editors/CubeFunctionSourceEditor.tsx +140 -0
- package/src/components/editors/CubeJoinEditor.tsx +23 -4
- package/src/components/editors/CubeNodeEditorPanel.tsx +22 -10
- package/src/components/editors/CubeNodeEditorPopper.tsx +9 -1
- package/src/components/editors/CubeNodeEditorRegistry.ts +12 -0
- package/src/components/editors/CubePivotEditor.tsx +277 -0
- package/src/components/editors/CubeRestrictEditor.tsx +8 -2
- package/src/components/editors/CubeServiceSourceEditor.tsx +77 -0
- package/src/components/grid/CubeColumnFormatDialog.tsx +289 -0
- package/src/components/grid/CubeDrilldownBar.tsx +219 -0
- package/src/components/grid/CubeGridRegion.tsx +170 -54
- package/src/components/grid/CubeGridValues.ts +146 -1
- package/src/components/grid/CubeResultGrid.tsx +443 -41
- package/src/components/grid/CubeRunStatsPanel.tsx +156 -0
- package/src/components/grid/CubeServerSideGrid.tsx +200 -0
- package/src/components/grid/CubeSqlDialog.tsx +90 -0
- package/src/components/grid/CubeSqlFormat.ts +37 -0
- package/src/components/palette/CubePalette.tsx +45 -12
- package/src/components/show-pure/CubeShowPureDialog.tsx +19 -5
- package/src/components/source-picker/CubeDataProductTab.tsx +169 -75
- package/src/components/source-picker/CubeDirectConnectionTab.tsx +42 -30
- package/src/components/source-picker/CubeFunctionSteps.tsx +244 -0
- package/src/components/source-picker/CubeIngestTab.tsx +159 -79
- package/src/components/source-picker/CubeInlineModelTab.tsx +110 -81
- package/src/components/source-picker/CubePickerListItem.tsx +118 -0
- package/src/components/source-picker/CubeProjectTab.tsx +6 -3
- package/src/components/source-picker/CubeServiceTab.tsx +151 -0
- package/src/components/source-picker/CubeSourcePicker.tsx +54 -18
- package/src/components/source-picker/CubeTablePreview.tsx +49 -0
- package/src/components/spec-transfer/CubeImportPureDialog.tsx +122 -0
- package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +21 -8
- package/src/graph-manager/CubeDataProductCatalog.ts +11 -0
- package/src/graph-manager/CubeEngine.ts +51 -1
- package/src/graph-manager/CubeEngineClientSettings.ts +64 -0
- package/src/graph-manager/CubeIngest.ts +15 -0
- package/src/graph-manager/CubeIngestCatalog.ts +33 -0
- package/src/graph-manager/CubeLakehouseRuntime.ts +43 -0
- package/src/graph-manager/CubeProjectCatalog.ts +3 -3
- package/src/graph-manager/CubeService.ts +29 -0
- package/src/graph-manager/CubeServiceCatalog.ts +35 -0
- package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +115 -5
- package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +13 -7
- package/src/graph-manager/protocol/pure/v1/V1_CubeFunctionOutlineBuilder.ts +312 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +35 -9
- package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +6 -15
- package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaReader.ts +471 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +70 -15
- package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +3 -1
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +7 -1
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +122 -7
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +9 -4
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeServiceCatalog.ts +92 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +6 -1
- package/src/index.ts +32 -2
- package/src/stores/CubeAddPlacement.ts +25 -5
- package/src/stores/CubeDevSettingsState.ts +117 -0
- package/src/stores/CubeEditorState.ts +687 -197
- package/src/stores/CubeEngineChecks.ts +240 -0
- package/src/stores/CubeExamples.ts +70 -1
- package/src/stores/CubeExamplesState.ts +4 -2
- package/src/stores/CubeExecutionState.ts +26 -57
- package/src/stores/CubeExportState.ts +196 -0
- package/src/stores/CubeExpressionFilterCheck.ts +218 -0
- package/src/stores/CubeExtendTyping.ts +6 -46
- package/src/stores/CubeFunctionRecheck.ts +97 -0
- package/src/stores/CubeGridFetcher.ts +302 -0
- package/src/stores/CubeGridQuickActions.ts +33 -11
- package/src/stores/CubeGridState.ts +450 -0
- package/src/stores/CubeHost.ts +48 -0
- package/src/stores/CubeLambdaImportState.ts +434 -0
- package/src/stores/CubeLambdaSources.ts +390 -0
- package/src/stores/CubeQueryRun.ts +169 -0
- package/src/stores/CubeRunStatsState.ts +91 -0
- package/src/stores/CubeRunningStepLambda.ts +62 -0
- package/src/stores/CubeServiceRecheck.ts +53 -0
- package/src/stores/CubeShowPureState.ts +51 -12
- package/src/stores/CubeSourcePickerState.ts +89 -13
- package/src/stores/LocalModelCatalog.ts +6 -1
- package/src/stores/editors/CubeExpressionFilterDraft.ts +385 -0
- package/src/stores/editors/CubeFunctionDraft.ts +92 -0
- package/src/stores/editors/CubeNodeDraftRegistry.ts +27 -2
- package/src/stores/editors/CubePivotDraft.ts +355 -0
- package/src/stores/fixtures/CubeSalesDuckDbModel.ts +54 -0
- package/src/stores/fixtures/CubeTradesModel.ts +36 -1
- package/src/stores/source-picker/CubeDataProductTabState.ts +162 -35
- package/src/stores/source-picker/CubeDirectConnectionTabState.ts +246 -47
- package/src/stores/source-picker/CubeIngestTabState.ts +112 -38
- package/src/stores/source-picker/CubeInlineModelTabState.ts +514 -34
- package/src/stores/source-picker/CubeProjectTabState.ts +35 -3
- package/src/stores/source-picker/CubeServiceTabState.ts +288 -0
- package/src/stores/source-picker/CubeSourcePickerTab.ts +31 -2
- package/tsconfig.json +50 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
CubeLambdaReadError,
|
|
19
|
+
DATA_PRODUCT_ACCESS_POINT_SOURCE_DEFINITION,
|
|
20
|
+
DataProductAccessPointSource,
|
|
21
|
+
INGEST_DATASET_SOURCE_DEFINITION,
|
|
22
|
+
IngestDatasetSource,
|
|
23
|
+
RELATIONAL_TABLE_SOURCE_DEFINITION,
|
|
24
|
+
RelationalTableSource,
|
|
25
|
+
Schema,
|
|
26
|
+
type CubeContext,
|
|
27
|
+
type CubeSourceStep,
|
|
28
|
+
type IR,
|
|
29
|
+
} from '@finos/legend-cube';
|
|
30
|
+
import {
|
|
31
|
+
createCubeDataProductModel,
|
|
32
|
+
CUBE_DATA_PRODUCT_RUNTIME_PATH,
|
|
33
|
+
CUBE_DEFAULT_CONSUMER_WAREHOUSE,
|
|
34
|
+
getCubeDataProductProject,
|
|
35
|
+
type CubeDataProductEnvironmentType,
|
|
36
|
+
} from '../graph-manager/CubeDataProduct.js';
|
|
37
|
+
import type { CubeDataProductCandidate } from '../graph-manager/CubeDataProductCatalog.js';
|
|
38
|
+
import {
|
|
39
|
+
createCubeIngestModel,
|
|
40
|
+
CUBE_INGEST_RUNTIME_PATH,
|
|
41
|
+
getCubeIngestSettings,
|
|
42
|
+
} from '../graph-manager/CubeIngest.js';
|
|
43
|
+
import type { CubeIngestDataSet } from '../graph-manager/CubeIngestCatalog.js';
|
|
44
|
+
import type { CubeEditorState } from './CubeEditorState.js';
|
|
45
|
+
|
|
46
|
+
// Import Pure's sources (PLAN §11.18): each accessor of a lambda bound to the
|
|
47
|
+
// source step the source dialog would add for it, typed as the dialog types
|
|
48
|
+
// one, before the steps are read. A host with a project (Studio) binds within
|
|
49
|
+
// it; another binds within the cube's own model or source, and asks for a
|
|
50
|
+
// source first when the lambda alone doesn't say where its sources are.
|
|
51
|
+
|
|
52
|
+
export const CUBE_LAMBDA_SOURCES_MESSAGE = {
|
|
53
|
+
NONE: 'The query reads no source Cube knows: #>{…}#, #P{…}# or #I{…}#.',
|
|
54
|
+
MIXED:
|
|
55
|
+
'A cube reads one kind of source, and this query reads several: tables, data products or ingest data sets.',
|
|
56
|
+
NOT_YET: 'Cube reads tables, data products and ingest data sets so far.',
|
|
57
|
+
NO_INGEST: 'This page has no ingest data sets to read.',
|
|
58
|
+
NO_DATA_PRODUCTS: 'This page has no data products to read.',
|
|
59
|
+
INGEST_SETTINGS:
|
|
60
|
+
'Add an ingest data set first, so Cube knows which deployment the query reads, then import it.',
|
|
61
|
+
NO_DEFINITION: (definition: string): string =>
|
|
62
|
+
`Cube finds no ingest definition ${definition}.`,
|
|
63
|
+
NO_DATA_SET: (dataSet: string, definition: string): string =>
|
|
64
|
+
`Ingest definition ${definition} has no data set "${dataSet}".`,
|
|
65
|
+
DATA_SET_UNREADABLE: (
|
|
66
|
+
dataSet: string,
|
|
67
|
+
definition: string,
|
|
68
|
+
reason: string,
|
|
69
|
+
): string => `Cube can't read ${definition}.${dataSet}: ${reason}`,
|
|
70
|
+
NO_DATA_PRODUCT: (dataProduct: string): string =>
|
|
71
|
+
`Cube finds no data product ${dataProduct}.`,
|
|
72
|
+
DATA_PRODUCTS: (dataProduct: string): string =>
|
|
73
|
+
`Several data products are ${dataProduct}: add an access point of the one the query reads first, then import it.`,
|
|
74
|
+
NO_ACCESS_POINT: (accessPoint: string, dataProduct: string): string =>
|
|
75
|
+
`Data product ${dataProduct} has no access point "${accessPoint}".`,
|
|
76
|
+
ACCESS_POINT_UNREADABLE: (
|
|
77
|
+
accessPoint: string,
|
|
78
|
+
dataProduct: string,
|
|
79
|
+
reason: string,
|
|
80
|
+
): string => `Cube can't read ${dataProduct}.${accessPoint}: ${reason}`,
|
|
81
|
+
TABLE_MODEL:
|
|
82
|
+
'Add a table first, so Cube knows the model the query reads, then import it.',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/** What the lambda's sources bind to: the cube's model and runtime, and the step of each */
|
|
86
|
+
export interface CubeLambdaBinding {
|
|
87
|
+
readonly context: CubeContext;
|
|
88
|
+
readonly bindSource: (source: IR) => CubeSourceStep;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const keyOf = (source: IR): string =>
|
|
92
|
+
source.k === 'ingestAccessor' ||
|
|
93
|
+
source.k === 'dataProductAccessor' ||
|
|
94
|
+
source.k === 'storeAccessor'
|
|
95
|
+
? `${source.k}:${source.path.join('\u0000')}`
|
|
96
|
+
: `${source.k}`;
|
|
97
|
+
|
|
98
|
+
const bindingOf = (
|
|
99
|
+
context: CubeContext,
|
|
100
|
+
steps: ReadonlyMap<string, CubeSourceStep>,
|
|
101
|
+
): CubeLambdaBinding => ({
|
|
102
|
+
context,
|
|
103
|
+
bindSource: (source) => {
|
|
104
|
+
const step = steps.get(keyOf(source));
|
|
105
|
+
if (!step) {
|
|
106
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NOT_YET);
|
|
107
|
+
}
|
|
108
|
+
return step;
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
/** The warehouse a new cube runs on: the project runtime's, the viewer's last, the default */
|
|
113
|
+
const newCubeWarehouse = async (
|
|
114
|
+
editorState: CubeEditorState,
|
|
115
|
+
ownWarehouse: string | undefined,
|
|
116
|
+
): Promise<string> => {
|
|
117
|
+
if (ownWarehouse !== undefined) {
|
|
118
|
+
return ownWarehouse;
|
|
119
|
+
}
|
|
120
|
+
const runtime = editorState.host.project
|
|
121
|
+
? await editorState.host.project.resolveRuntime()
|
|
122
|
+
: undefined;
|
|
123
|
+
return (
|
|
124
|
+
runtime?.warehouse ??
|
|
125
|
+
editorState.dataProductRuntime.rememberedWarehouse ??
|
|
126
|
+
CUBE_DEFAULT_CONSUMER_WAREHOUSE
|
|
127
|
+
);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const bindIngestDataSets = async (
|
|
131
|
+
editorState: CubeEditorState,
|
|
132
|
+
sources: readonly Extract<IR, { readonly k: 'ingestAccessor' }>[],
|
|
133
|
+
): Promise<CubeLambdaBinding> => {
|
|
134
|
+
const catalog = editorState.host.ingestCatalog;
|
|
135
|
+
if (!catalog) {
|
|
136
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NO_INGEST);
|
|
137
|
+
}
|
|
138
|
+
const { context } = editorState.document;
|
|
139
|
+
const current = context ? getCubeIngestSettings(context.model) : undefined;
|
|
140
|
+
const environmentType =
|
|
141
|
+
current?.environmentType ??
|
|
142
|
+
(catalog.environmentTypes.length === 1
|
|
143
|
+
? catalog.environmentTypes[0]
|
|
144
|
+
: undefined);
|
|
145
|
+
if (environmentType === undefined) {
|
|
146
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.INGEST_SETTINGS);
|
|
147
|
+
}
|
|
148
|
+
let producerDeploymentId = current?.producerDeploymentId;
|
|
149
|
+
if (producerDeploymentId === undefined) {
|
|
150
|
+
const producers = await catalog.listProducers(environmentType);
|
|
151
|
+
producerDeploymentId =
|
|
152
|
+
producers.length === 1 ? producers[0]?.deploymentId : undefined;
|
|
153
|
+
}
|
|
154
|
+
if (producerDeploymentId === undefined) {
|
|
155
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.INGEST_SETTINGS);
|
|
156
|
+
}
|
|
157
|
+
const { candidates } = await catalog.listDefinitions(
|
|
158
|
+
environmentType,
|
|
159
|
+
producerDeploymentId,
|
|
160
|
+
);
|
|
161
|
+
const steps = new Map<string, CubeSourceStep>();
|
|
162
|
+
const described = new Map<string, readonly CubeIngestDataSet[]>();
|
|
163
|
+
for (const source of sources) {
|
|
164
|
+
const [definition, dataSetName] = source.path;
|
|
165
|
+
const candidate = candidates.find((each) => each.definition === definition);
|
|
166
|
+
if (!candidate) {
|
|
167
|
+
throw new CubeLambdaReadError(
|
|
168
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.NO_DEFINITION(definition),
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
const dataSets =
|
|
172
|
+
described.get(candidate.urn) ??
|
|
173
|
+
(await catalog.describe(candidate.urn, environmentType));
|
|
174
|
+
described.set(candidate.urn, dataSets);
|
|
175
|
+
const dataSet = dataSets.find((each) => each.name === dataSetName);
|
|
176
|
+
if (!dataSet) {
|
|
177
|
+
throw new CubeLambdaReadError(
|
|
178
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.NO_DATA_SET(dataSetName, definition),
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
const { schema } = dataSet;
|
|
182
|
+
if (!dataSet.isPickable || !schema) {
|
|
183
|
+
throw new CubeLambdaReadError(
|
|
184
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.DATA_SET_UNREADABLE(
|
|
185
|
+
dataSetName,
|
|
186
|
+
definition,
|
|
187
|
+
dataSet.disabledReason ?? '',
|
|
188
|
+
),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
steps.set(keyOf(source), {
|
|
192
|
+
type: IngestDatasetSource.TYPE,
|
|
193
|
+
create: (id) =>
|
|
194
|
+
INGEST_DATASET_SOURCE_DEFINITION.resolve(
|
|
195
|
+
INGEST_DATASET_SOURCE_DEFINITION.fromCoordinates(id, {
|
|
196
|
+
ingestDefinitionUrn: candidate.urn,
|
|
197
|
+
ingestDefinition: definition,
|
|
198
|
+
dataSet: dataSetName,
|
|
199
|
+
}),
|
|
200
|
+
{ kind: 'resolved', schema },
|
|
201
|
+
),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const warehouse =
|
|
205
|
+
current?.warehouse ??
|
|
206
|
+
(await catalog.resolveEnvironment(environmentType)).warehouse;
|
|
207
|
+
return bindingOf(
|
|
208
|
+
{
|
|
209
|
+
model: createCubeIngestModel({
|
|
210
|
+
environmentType,
|
|
211
|
+
producerDeploymentId,
|
|
212
|
+
warehouse: await newCubeWarehouse(editorState, warehouse),
|
|
213
|
+
}),
|
|
214
|
+
runtime: CUBE_INGEST_RUNTIME_PATH,
|
|
215
|
+
},
|
|
216
|
+
steps,
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const bindDataProducts = async (
|
|
221
|
+
editorState: CubeEditorState,
|
|
222
|
+
sources: readonly Extract<IR, { readonly k: 'dataProductAccessor' }>[],
|
|
223
|
+
): Promise<CubeLambdaBinding> => {
|
|
224
|
+
const catalog = editorState.host.dataProductCatalog;
|
|
225
|
+
if (!catalog) {
|
|
226
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NO_DATA_PRODUCTS);
|
|
227
|
+
}
|
|
228
|
+
const { context } = editorState.document;
|
|
229
|
+
const current = context
|
|
230
|
+
? getCubeDataProductProject(context.model)
|
|
231
|
+
: undefined;
|
|
232
|
+
const environmentType = (current?.environmentType ??
|
|
233
|
+
catalog.environmentTypes[0]) as CubeDataProductEnvironmentType;
|
|
234
|
+
const products = new Map<string, CubeDataProductCandidate>();
|
|
235
|
+
const steps = new Map<string, CubeSourceStep>();
|
|
236
|
+
for (const source of sources) {
|
|
237
|
+
const [dataProduct, accessPointId] = source.path;
|
|
238
|
+
let candidate = products.get(dataProduct);
|
|
239
|
+
if (!candidate) {
|
|
240
|
+
// a catalog searches titles and ids, not paths: by the product's name,
|
|
241
|
+
// then the whole list, each matched on its path
|
|
242
|
+
let found: CubeDataProductCandidate[] = [];
|
|
243
|
+
for (const text of [dataProduct.split('::').at(-1) ?? dataProduct, '']) {
|
|
244
|
+
found = (await catalog.search({ text, environmentType })).filter(
|
|
245
|
+
(each) =>
|
|
246
|
+
each.dataProductPath === dataProduct &&
|
|
247
|
+
(!current ||
|
|
248
|
+
(each.groupId === current.groupId &&
|
|
249
|
+
each.artifactId === current.artifactId &&
|
|
250
|
+
each.versionId === current.versionId)),
|
|
251
|
+
);
|
|
252
|
+
if (found.length) {
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (found.length > 1) {
|
|
257
|
+
throw new CubeLambdaReadError(
|
|
258
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.DATA_PRODUCTS(dataProduct),
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
candidate = found[0];
|
|
262
|
+
if (!candidate) {
|
|
263
|
+
throw new CubeLambdaReadError(
|
|
264
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.NO_DATA_PRODUCT(dataProduct),
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
products.set(dataProduct, candidate);
|
|
268
|
+
}
|
|
269
|
+
const product = candidate;
|
|
270
|
+
const { groups } = await catalog.describe(product);
|
|
271
|
+
const group = groups.find((each) =>
|
|
272
|
+
each.accessPoints.some((point) => point.id === accessPointId),
|
|
273
|
+
);
|
|
274
|
+
const accessPoint = group?.accessPoints.find(
|
|
275
|
+
(point) => point.id === accessPointId,
|
|
276
|
+
);
|
|
277
|
+
if (!group || !accessPoint) {
|
|
278
|
+
throw new CubeLambdaReadError(
|
|
279
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.NO_ACCESS_POINT(accessPointId, dataProduct),
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
const { schema } = accessPoint;
|
|
283
|
+
if (accessPoint.disabledReason !== undefined || !schema) {
|
|
284
|
+
throw new CubeLambdaReadError(
|
|
285
|
+
CUBE_LAMBDA_SOURCES_MESSAGE.ACCESS_POINT_UNREADABLE(
|
|
286
|
+
accessPointId,
|
|
287
|
+
dataProduct,
|
|
288
|
+
accessPoint.disabledReason ?? '',
|
|
289
|
+
),
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
steps.set(keyOf(source), {
|
|
293
|
+
type: DataProductAccessPointSource.TYPE,
|
|
294
|
+
create: (id) =>
|
|
295
|
+
DATA_PRODUCT_ACCESS_POINT_SOURCE_DEFINITION.resolve(
|
|
296
|
+
DATA_PRODUCT_ACCESS_POINT_SOURCE_DEFINITION.fromCoordinates(id, {
|
|
297
|
+
dataProduct,
|
|
298
|
+
accessPointGroup: group.id,
|
|
299
|
+
accessPoint: accessPointId,
|
|
300
|
+
dataProductId: product.id,
|
|
301
|
+
deploymentId: product.deploymentId,
|
|
302
|
+
}),
|
|
303
|
+
{ kind: 'resolved', schema },
|
|
304
|
+
),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
const [first] = [...products.values()];
|
|
308
|
+
if (!first) {
|
|
309
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NONE);
|
|
310
|
+
}
|
|
311
|
+
return bindingOf(
|
|
312
|
+
{
|
|
313
|
+
model: createCubeDataProductModel({
|
|
314
|
+
groupId: first.groupId,
|
|
315
|
+
artifactId: first.artifactId,
|
|
316
|
+
versionId: first.versionId,
|
|
317
|
+
environmentType: first.environmentType,
|
|
318
|
+
warehouse: await newCubeWarehouse(editorState, current?.warehouse),
|
|
319
|
+
}),
|
|
320
|
+
runtime: CUBE_DATA_PRODUCT_RUNTIME_PATH,
|
|
321
|
+
},
|
|
322
|
+
steps,
|
|
323
|
+
);
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
/** Tables of the cube's own model, typed by the engine in one call */
|
|
327
|
+
const bindTables = async (
|
|
328
|
+
editorState: CubeEditorState,
|
|
329
|
+
sources: readonly Extract<IR, { readonly k: 'storeAccessor' }>[],
|
|
330
|
+
): Promise<CubeLambdaBinding> => {
|
|
331
|
+
const { context } = editorState.document;
|
|
332
|
+
if (!context) {
|
|
333
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.TABLE_MODEL);
|
|
334
|
+
}
|
|
335
|
+
const typed = await editorState.host.engine.resolveSchemas(
|
|
336
|
+
context.model,
|
|
337
|
+
new Map(sources.map((source) => [keyOf(source), source.path])),
|
|
338
|
+
);
|
|
339
|
+
const steps = new Map<string, CubeSourceStep>();
|
|
340
|
+
sources.forEach((source) => {
|
|
341
|
+
const [database, schema, table] = source.path;
|
|
342
|
+
const columns = typed.get(keyOf(source));
|
|
343
|
+
steps.set(keyOf(source), {
|
|
344
|
+
type: RelationalTableSource.TYPE,
|
|
345
|
+
create: (id) => {
|
|
346
|
+
const node = RELATIONAL_TABLE_SOURCE_DEFINITION.fromCoordinates(id, {
|
|
347
|
+
database,
|
|
348
|
+
schema,
|
|
349
|
+
table,
|
|
350
|
+
});
|
|
351
|
+
// a table the engine can't type is read anyway, and shows its error
|
|
352
|
+
return columns instanceof Schema
|
|
353
|
+
? RELATIONAL_TABLE_SOURCE_DEFINITION.resolve(node, {
|
|
354
|
+
kind: 'resolved',
|
|
355
|
+
schema: columns,
|
|
356
|
+
})
|
|
357
|
+
: node;
|
|
358
|
+
},
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
return bindingOf(context, steps);
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* The cube's model and runtime and the step of each source, for a lambda's
|
|
366
|
+
* sources, all of one kind (PLAN §11.18). Throws a `CubeLambdaReadError` that
|
|
367
|
+
* names a source Cube can't bind, or what to add first.
|
|
368
|
+
*/
|
|
369
|
+
export const bindCubeLambdaSources = async (
|
|
370
|
+
editorState: CubeEditorState,
|
|
371
|
+
sources: readonly IR[],
|
|
372
|
+
): Promise<CubeLambdaBinding> => {
|
|
373
|
+
const kinds = new Set(sources.map((source) => source.k));
|
|
374
|
+
if (!kinds.size) {
|
|
375
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NONE);
|
|
376
|
+
}
|
|
377
|
+
if (kinds.size > 1) {
|
|
378
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.MIXED);
|
|
379
|
+
}
|
|
380
|
+
if (sources.every((source) => source.k === 'ingestAccessor')) {
|
|
381
|
+
return bindIngestDataSets(editorState, sources);
|
|
382
|
+
}
|
|
383
|
+
if (sources.every((source) => source.k === 'dataProductAccessor')) {
|
|
384
|
+
return bindDataProducts(editorState, sources);
|
|
385
|
+
}
|
|
386
|
+
if (sources.every((source) => source.k === 'storeAccessor')) {
|
|
387
|
+
return bindTables(editorState, sources);
|
|
388
|
+
}
|
|
389
|
+
throw new CubeLambdaReadError(CUBE_LAMBDA_SOURCES_MESSAGE.NOT_YET);
|
|
390
|
+
};
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
type IR,
|
|
19
|
+
type ModelContext,
|
|
20
|
+
needsDatabaseType,
|
|
21
|
+
type Query,
|
|
22
|
+
QueryEmitter,
|
|
23
|
+
type Schema,
|
|
24
|
+
} from '@finos/legend-cube';
|
|
25
|
+
import { flowResult } from 'mobx';
|
|
26
|
+
import {
|
|
27
|
+
CubeEngineError,
|
|
28
|
+
CubeEngineErrorKind,
|
|
29
|
+
type CubeResultValue,
|
|
30
|
+
} from '../graph-manager/CubeEngine.js';
|
|
31
|
+
import type { CubeEditorState } from './CubeEditorState.js';
|
|
32
|
+
|
|
33
|
+
/** A query to run up to its selected node, with what it runs in */
|
|
34
|
+
export interface CubeQueryRunRequest {
|
|
35
|
+
/** The query, its selected node the one to run */
|
|
36
|
+
readonly query: Query;
|
|
37
|
+
readonly model: ModelContext;
|
|
38
|
+
readonly runtime: string;
|
|
39
|
+
/** The schema Cube infers for the node: the engine's columns must be these */
|
|
40
|
+
readonly schema: Schema;
|
|
41
|
+
/** The most rows to keep: one more is fetched to tell whether there are more */
|
|
42
|
+
readonly rowLimit: number;
|
|
43
|
+
readonly abortController: AbortController;
|
|
44
|
+
/** What the Runs panel calls the run, e.g. `Execute` (PLAN §11.16) */
|
|
45
|
+
readonly label: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface CubeQueryRunResult {
|
|
49
|
+
/** At most `rowLimit` rows, by the schema's column positions */
|
|
50
|
+
readonly rows: readonly (readonly CubeResultValue[])[];
|
|
51
|
+
/** The engine returned more than `rowLimit` rows */
|
|
52
|
+
readonly limited: boolean;
|
|
53
|
+
readonly sql: readonly string[];
|
|
54
|
+
readonly durationMs: number;
|
|
55
|
+
/** The execution lambda that ran, its row limit included */
|
|
56
|
+
readonly lambda: IR;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Thrown when a run is aborted while it waits for the model's outline */
|
|
60
|
+
export class CubeQueryRunAborted extends Error {
|
|
61
|
+
constructor() {
|
|
62
|
+
super('The run was stopped');
|
|
63
|
+
this.name = 'CubeQueryRunAborted';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Runs the query and checks the engine's columns, keeping the lambda once it is written */
|
|
68
|
+
const runAndCheck = async (
|
|
69
|
+
editorState: CubeEditorState,
|
|
70
|
+
request: CubeQueryRunRequest,
|
|
71
|
+
sent: { lambda?: IR },
|
|
72
|
+
): Promise<CubeQueryRunResult> => {
|
|
73
|
+
const { query, model, runtime, schema, rowLimit, abortController } = request;
|
|
74
|
+
const nodeId = query.selected;
|
|
75
|
+
if (nodeId === undefined) {
|
|
76
|
+
throw new Error('A query to run has a selected node');
|
|
77
|
+
}
|
|
78
|
+
let databaseType: string | undefined;
|
|
79
|
+
if (needsDatabaseType(query, nodeId)) {
|
|
80
|
+
await flowResult(editorState.loadModelOutline(model));
|
|
81
|
+
if (abortController.signal.aborted) {
|
|
82
|
+
throw new CubeQueryRunAborted();
|
|
83
|
+
}
|
|
84
|
+
databaseType = editorState.getRunDatabaseType(
|
|
85
|
+
query,
|
|
86
|
+
nodeId,
|
|
87
|
+
model,
|
|
88
|
+
runtime,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const lambda = new QueryEmitter(
|
|
92
|
+
query,
|
|
93
|
+
editorState.registry,
|
|
94
|
+
).emitExecutionLambda({ rowLimit, runtime, databaseType });
|
|
95
|
+
sent.lambda = lambda;
|
|
96
|
+
const response = await editorState.host.engine.execute(model, lambda, {
|
|
97
|
+
abortController,
|
|
98
|
+
});
|
|
99
|
+
// rows are read by position, so the engine's columns must be the query's
|
|
100
|
+
if (response.columns.length !== schema.columns.length) {
|
|
101
|
+
throw new CubeEngineError(
|
|
102
|
+
CubeEngineErrorKind.EXECUTION,
|
|
103
|
+
`The engine returned ${response.columns.length} columns, but the query has ${schema.columns.length}`,
|
|
104
|
+
nodeId,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
const misplaced = schema.columns.findIndex(
|
|
108
|
+
(column, position) => response.columns[position] !== column.name,
|
|
109
|
+
);
|
|
110
|
+
if (misplaced !== -1) {
|
|
111
|
+
throw new CubeEngineError(
|
|
112
|
+
CubeEngineErrorKind.EXECUTION,
|
|
113
|
+
`The engine returned the column "${response.columns[misplaced]}" at position ${misplaced + 1}, but the query has "${schema.columns[misplaced]?.name}" there`,
|
|
114
|
+
nodeId,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
const limited = response.rows.length > rowLimit;
|
|
118
|
+
return {
|
|
119
|
+
rows: limited ? response.rows.slice(0, rowLimit) : response.rows,
|
|
120
|
+
limited,
|
|
121
|
+
sql: response.sql,
|
|
122
|
+
durationMs: response.durationMs,
|
|
123
|
+
lambda,
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Runs a query up to its selected node (PLAN §8.2, §9), as Execute and the
|
|
129
|
+
* grid's fetches do (PLAN §11.10): a Drop, Slice, Limit or Distinct is written
|
|
130
|
+
* for the database it runs on (PLAN §11.4), which the model's outline gives,
|
|
131
|
+
* loaded once and waited for only then; the row limit is the emitter's
|
|
132
|
+
* `limit(rowLimit + 1)`. The engine's columns are checked against the schema,
|
|
133
|
+
* since rows are read by position. Rejects with a `CubeEngineError`, or a
|
|
134
|
+
* `CubeQueryRunAborted` when aborted before the engine is called. Each run
|
|
135
|
+
* is recorded in the Runs panel under its label with the lambda it sent,
|
|
136
|
+
* one that failed too; a stopped one isn't (PLAN §11.16).
|
|
137
|
+
*/
|
|
138
|
+
export const runCubeQuery = async (
|
|
139
|
+
editorState: CubeEditorState,
|
|
140
|
+
request: CubeQueryRunRequest,
|
|
141
|
+
): Promise<CubeQueryRunResult> => {
|
|
142
|
+
const startedAt = Date.now();
|
|
143
|
+
const sent: { lambda?: IR } = {};
|
|
144
|
+
try {
|
|
145
|
+
const result = await runAndCheck(editorState, request, sent);
|
|
146
|
+
// a run stopped while it ran is let go of, even when it answers
|
|
147
|
+
if (!request.abortController.signal.aborted) {
|
|
148
|
+
editorState.runStats.record(request.label, result);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
if (
|
|
153
|
+
!request.abortController.signal.aborted &&
|
|
154
|
+
!(error instanceof CubeQueryRunAborted)
|
|
155
|
+
) {
|
|
156
|
+
editorState.runStats.record(request.label, {
|
|
157
|
+
durationMs: Date.now() - startedAt,
|
|
158
|
+
lambda: sent.lambda,
|
|
159
|
+
error:
|
|
160
|
+
error instanceof CubeEngineError
|
|
161
|
+
? error.firstLine
|
|
162
|
+
: error instanceof Error
|
|
163
|
+
? error.message
|
|
164
|
+
: String(error),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { IR } from '@finos/legend-cube';
|
|
18
|
+
import { action, makeObservable, observable } from 'mobx';
|
|
19
|
+
|
|
20
|
+
/** How many of the latest runs are kept (spec §12.6) */
|
|
21
|
+
export const MAX_CUBE_RUN_STATS = 15;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* One run on the engine: an Execute, a fetch of the grid's rows, an export,
|
|
25
|
+
* the Pivot editor's value load; one that failed too (PLAN §11.16)
|
|
26
|
+
*/
|
|
27
|
+
export interface CubeRunStat {
|
|
28
|
+
readonly id: number;
|
|
29
|
+
/** What ran, e.g. `Execute` or `Rows of SHIP_COUNTRY "France"` */
|
|
30
|
+
readonly label: string;
|
|
31
|
+
/** When it finished, in milliseconds since the epoch */
|
|
32
|
+
readonly finishedAt: number;
|
|
33
|
+
readonly durationMs: number;
|
|
34
|
+
/** The SQL statements the engine ran */
|
|
35
|
+
readonly sql: readonly string[];
|
|
36
|
+
/**
|
|
37
|
+
* The execution lambda sent, as it ran (its row limit included), for its
|
|
38
|
+
* Pure and JSON (PLAN §11.16); `undefined` when the run failed before one
|
|
39
|
+
* was written
|
|
40
|
+
*/
|
|
41
|
+
readonly lambda: IR | undefined;
|
|
42
|
+
/** Why the run failed, the engine's first line; `undefined` for one that ran */
|
|
43
|
+
readonly error: string | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** What a run gives to be recorded */
|
|
47
|
+
export interface CubeRunRecord {
|
|
48
|
+
readonly durationMs: number;
|
|
49
|
+
readonly sql?: readonly string[] | undefined;
|
|
50
|
+
readonly lambda: IR | undefined;
|
|
51
|
+
readonly error?: string | undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The latest runs of the page, newest first, at most `MAX_CUBE_RUN_STATS`
|
|
56
|
+
* (spec §12.6, PLAN §11.10): each Execute, fetch, export and Pivot value
|
|
57
|
+
* load records one, failed or not; a stopped one records nothing (PLAN
|
|
58
|
+
* §11.16). They are the page's, not the cube's, and aren't saved.
|
|
59
|
+
*/
|
|
60
|
+
export class CubeRunStatsState {
|
|
61
|
+
entries: readonly CubeRunStat[] = [];
|
|
62
|
+
private count = 0;
|
|
63
|
+
|
|
64
|
+
constructor() {
|
|
65
|
+
makeObservable<CubeRunStatsState, 'count'>(this, {
|
|
66
|
+
entries: observable.ref,
|
|
67
|
+
count: false,
|
|
68
|
+
record: action,
|
|
69
|
+
clear: action,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
record(label: string, run: CubeRunRecord): void {
|
|
74
|
+
this.entries = [
|
|
75
|
+
{
|
|
76
|
+
id: ++this.count,
|
|
77
|
+
label,
|
|
78
|
+
finishedAt: Date.now(),
|
|
79
|
+
durationMs: run.durationMs,
|
|
80
|
+
sql: run.sql ?? [],
|
|
81
|
+
lambda: run.lambda,
|
|
82
|
+
error: run.error,
|
|
83
|
+
},
|
|
84
|
+
...this.entries,
|
|
85
|
+
].slice(0, MAX_CUBE_RUN_STATS);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
clear(): void {
|
|
89
|
+
this.entries = [];
|
|
90
|
+
}
|
|
91
|
+
}
|