@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,240 @@
|
|
|
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
|
+
buildSchemasAndValidity,
|
|
19
|
+
ERR_CHECKING,
|
|
20
|
+
ERR_TYPING,
|
|
21
|
+
ExpressionFilter,
|
|
22
|
+
Extend,
|
|
23
|
+
type IR,
|
|
24
|
+
isTypingError,
|
|
25
|
+
type JsonObject,
|
|
26
|
+
type ModelContext,
|
|
27
|
+
type NodeRegistry,
|
|
28
|
+
type Query,
|
|
29
|
+
QueryEmitter,
|
|
30
|
+
type QueryNode,
|
|
31
|
+
type QueryRule,
|
|
32
|
+
type Schema,
|
|
33
|
+
} from '@finos/legend-cube';
|
|
34
|
+
import {
|
|
35
|
+
getConditionRecheckWarning,
|
|
36
|
+
getExtendRetypeWarning,
|
|
37
|
+
} from '../__lib__/LegendCubeLabels.js';
|
|
38
|
+
import {
|
|
39
|
+
type CubeEngineError,
|
|
40
|
+
CubeEngineErrorKind,
|
|
41
|
+
type NodeId,
|
|
42
|
+
} from '../graph-manager/CubeEngine.js';
|
|
43
|
+
import {
|
|
44
|
+
buildCubeConditionCheckLambdas,
|
|
45
|
+
getCubeConditionCheckUpstream,
|
|
46
|
+
isCubeConditionCheckCurrent,
|
|
47
|
+
isSameCubeConditionCheck,
|
|
48
|
+
readCubeConditionCheck,
|
|
49
|
+
} from './CubeExpressionFilterCheck.js';
|
|
50
|
+
import {
|
|
51
|
+
buildCubeExtendTypingLambdas,
|
|
52
|
+
getCubeExtendTypingUpstream,
|
|
53
|
+
getCubeExtendUpstream,
|
|
54
|
+
isCubeExtendTypingCurrent,
|
|
55
|
+
isSameCubeExtendTyping,
|
|
56
|
+
readCubeExtendTyping,
|
|
57
|
+
} from './CubeExtendTyping.js';
|
|
58
|
+
|
|
59
|
+
// The nodes the engine checks in the background, outside the undo history:
|
|
60
|
+
// an Extend, whose columns it types (PLAN §11.7), and a Filter by Expression,
|
|
61
|
+
// whose condition it checks (PLAN §11.11). One path serves both, so what
|
|
62
|
+
// M6.11's review fixed for Extends holds for filters too.
|
|
63
|
+
|
|
64
|
+
/** A node the engine checks: an Extend or a Filter by Expression */
|
|
65
|
+
export type CubeEngineCheckedNode = Extend | ExpressionFilter;
|
|
66
|
+
|
|
67
|
+
export const isCubeEngineCheckedNode = (
|
|
68
|
+
node: QueryNode,
|
|
69
|
+
): node is CubeEngineCheckedNode =>
|
|
70
|
+
node instanceof Extend || node instanceof ExpressionFilter;
|
|
71
|
+
|
|
72
|
+
/** The digest of what the engine was given for the node's input, which its last check recorded */
|
|
73
|
+
export const getCubeEngineCheckUpstream = (
|
|
74
|
+
node: CubeEngineCheckedNode,
|
|
75
|
+
): string | undefined =>
|
|
76
|
+
node instanceof Extend
|
|
77
|
+
? getCubeExtendTypingUpstream(node.typing)
|
|
78
|
+
: getCubeConditionCheckUpstream(node.check);
|
|
79
|
+
|
|
80
|
+
/** What the engine's answers make of a node: the node to store, when they say anything new */
|
|
81
|
+
export interface CubeEngineCheckOutcome {
|
|
82
|
+
/** The node with its new check, or `undefined` when the answers say what it says already */
|
|
83
|
+
readonly node: CubeEngineCheckedNode | undefined;
|
|
84
|
+
/** The engine's error, when the check failed */
|
|
85
|
+
readonly error?: CubeEngineError | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* When the engine couldn't be reached and the node's last check still
|
|
88
|
+
* holds for this input, the warning that keeps it, as a source keeps its
|
|
89
|
+
* saved columns
|
|
90
|
+
*/
|
|
91
|
+
readonly keptWarning?: string | undefined;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The lambdas that check one node, and how to read the engine's answers to them */
|
|
95
|
+
export interface CubeEngineCheckRequest {
|
|
96
|
+
readonly node: CubeEngineCheckedNode;
|
|
97
|
+
readonly lambdas: ReadonlyMap<NodeId, IR>;
|
|
98
|
+
read(
|
|
99
|
+
answers: ReadonlyMap<NodeId, Schema | CubeEngineError>,
|
|
100
|
+
): CubeEngineCheckOutcome;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** What to make of a node's new check: kept with a warning, offline, when the last one holds; else stored if new */
|
|
104
|
+
const outcomeOf = (
|
|
105
|
+
node: CubeEngineCheckedNode,
|
|
106
|
+
error: CubeEngineError | undefined,
|
|
107
|
+
stillCurrent: () => boolean,
|
|
108
|
+
isSame: boolean,
|
|
109
|
+
withCheck: () => CubeEngineCheckedNode,
|
|
110
|
+
warn: (firstLine: string) => string,
|
|
111
|
+
): CubeEngineCheckOutcome =>
|
|
112
|
+
error?.kind === CubeEngineErrorKind.NETWORK && stillCurrent()
|
|
113
|
+
? { node: undefined, error, keptWarning: warn(error.firstLine) }
|
|
114
|
+
: { node: isSame ? undefined : withCheck(), error };
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The request that checks a node for the input it has now, its lambdas
|
|
118
|
+
* marked with the node; `undefined` when it has nothing to send yet: an
|
|
119
|
+
* Extend column without a lambda, or a condition with a problem Cube finds
|
|
120
|
+
* itself. The input must be valid.
|
|
121
|
+
*/
|
|
122
|
+
export const buildCubeEngineCheckRequest = (
|
|
123
|
+
query: Query,
|
|
124
|
+
node: CubeEngineCheckedNode,
|
|
125
|
+
input: Schema,
|
|
126
|
+
upstream: string | undefined,
|
|
127
|
+
registry: NodeRegistry,
|
|
128
|
+
): CubeEngineCheckRequest | undefined => {
|
|
129
|
+
if (node instanceof Extend) {
|
|
130
|
+
if (node.columns.some(({ lambda }) => lambda === undefined)) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
const columns = node.columns.map(({ name, lambda }) => ({
|
|
134
|
+
name,
|
|
135
|
+
lambda: lambda as JsonObject,
|
|
136
|
+
}));
|
|
137
|
+
return {
|
|
138
|
+
node,
|
|
139
|
+
lambdas: buildCubeExtendTypingLambdas(
|
|
140
|
+
query,
|
|
141
|
+
node,
|
|
142
|
+
columns,
|
|
143
|
+
registry,
|
|
144
|
+
false,
|
|
145
|
+
),
|
|
146
|
+
read: (answers) => {
|
|
147
|
+
const { typing, error } = readCubeExtendTyping(
|
|
148
|
+
answers,
|
|
149
|
+
node,
|
|
150
|
+
input,
|
|
151
|
+
columns,
|
|
152
|
+
upstream,
|
|
153
|
+
);
|
|
154
|
+
return outcomeOf(
|
|
155
|
+
node,
|
|
156
|
+
error,
|
|
157
|
+
() => isCubeExtendTypingCurrent(node, input, upstream),
|
|
158
|
+
isSameCubeExtendTyping(typing, node.typing),
|
|
159
|
+
() => node.withTyping(typing),
|
|
160
|
+
getExtendRetypeWarning,
|
|
161
|
+
);
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const { lambda } = node;
|
|
166
|
+
if (lambda === undefined || node.getConditionProblem() !== undefined) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
node,
|
|
171
|
+
lambdas: buildCubeConditionCheckLambdas(
|
|
172
|
+
query,
|
|
173
|
+
node,
|
|
174
|
+
lambda,
|
|
175
|
+
input,
|
|
176
|
+
registry,
|
|
177
|
+
false,
|
|
178
|
+
),
|
|
179
|
+
read: (answers) => {
|
|
180
|
+
const { check, error } = readCubeConditionCheck(
|
|
181
|
+
answers,
|
|
182
|
+
node,
|
|
183
|
+
input,
|
|
184
|
+
upstream,
|
|
185
|
+
);
|
|
186
|
+
return outcomeOf(
|
|
187
|
+
node,
|
|
188
|
+
error,
|
|
189
|
+
() => isCubeConditionCheckCurrent(node, input, upstream),
|
|
190
|
+
isSameCubeConditionCheck(check, node.check),
|
|
191
|
+
() => node.withCheck(check),
|
|
192
|
+
getConditionRecheckWarning,
|
|
193
|
+
);
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* A query rule for the editor (PLAN §11.7, §11.11): a node whose check
|
|
200
|
+
* recorded another input than the engine would be given now waits to be
|
|
201
|
+
* checked again (`ERR_TYPING` for an Extend, `ERR_CHECKING` for a filter),
|
|
202
|
+
* e.g. after an Extend above it gains `->toOne()`, which Cube's schema
|
|
203
|
+
* doesn't show. A check that recorded nothing, as one loaded, is used as it
|
|
204
|
+
* is; a node that already waits, or whose input is invalid, is left to its
|
|
205
|
+
* own checks.
|
|
206
|
+
*/
|
|
207
|
+
export const createStaleCubeEngineCheckRule =
|
|
208
|
+
(
|
|
209
|
+
registry: NodeRegistry,
|
|
210
|
+
modelOf: () => ModelContext | undefined,
|
|
211
|
+
): QueryRule =>
|
|
212
|
+
(query) => {
|
|
213
|
+
const stale = new Map<string, readonly string[]>();
|
|
214
|
+
const model = modelOf();
|
|
215
|
+
const recorded = query.nodes.filter(
|
|
216
|
+
(node): node is CubeEngineCheckedNode =>
|
|
217
|
+
isCubeEngineCheckedNode(node) &&
|
|
218
|
+
getCubeEngineCheckUpstream(node) !== undefined,
|
|
219
|
+
);
|
|
220
|
+
if (!model || !recorded.length) {
|
|
221
|
+
return stale;
|
|
222
|
+
}
|
|
223
|
+
const { validity } = buildSchemasAndValidity(query, registry.queryRules);
|
|
224
|
+
const emitter = new QueryEmitter(query, registry);
|
|
225
|
+
recorded.forEach((node) => {
|
|
226
|
+
if ((validity.get(node.id) ?? []).some(isTypingError)) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const upstream = getCubeExtendUpstream(emitter, node.id, model);
|
|
230
|
+
if (
|
|
231
|
+
upstream !== undefined &&
|
|
232
|
+
upstream !== getCubeEngineCheckUpstream(node)
|
|
233
|
+
) {
|
|
234
|
+
stale.set(node.id, [
|
|
235
|
+
node instanceof Extend ? ERR_TYPING : ERR_CHECKING,
|
|
236
|
+
]);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return stale;
|
|
240
|
+
};
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
18
|
AggregationFunction,
|
|
19
|
+
Pivot,
|
|
19
20
|
ColumnComparisonFilter,
|
|
20
21
|
CompositeFilter,
|
|
21
22
|
CompositeFilterOperator,
|
|
@@ -55,6 +56,12 @@ import {
|
|
|
55
56
|
CUBE_TRADES_RUNTIME,
|
|
56
57
|
CUBE_TRADES_SCHEMA,
|
|
57
58
|
} from './fixtures/CubeTradesModel.js';
|
|
59
|
+
import {
|
|
60
|
+
CUBE_SALES_DATABASE,
|
|
61
|
+
CUBE_SALES_MODEL,
|
|
62
|
+
CUBE_SALES_RUNTIME,
|
|
63
|
+
CUBE_SALES_SCHEMA,
|
|
64
|
+
} from './fixtures/CubeSalesDuckDbModel.js';
|
|
58
65
|
|
|
59
66
|
// The example cubes the source dialog opens (PLAN §6.9): two over each
|
|
60
67
|
// bundled model. Each is built here rather than saved, so it has no schema
|
|
@@ -120,9 +127,21 @@ const TRADES: CubeExampleDataset = {
|
|
|
120
127
|
schema: CUBE_TRADES_SCHEMA,
|
|
121
128
|
};
|
|
122
129
|
|
|
130
|
+
const SALES: CubeExampleDataset = {
|
|
131
|
+
id: 'sales',
|
|
132
|
+
name: 'Sales (DuckDB)',
|
|
133
|
+
description:
|
|
134
|
+
'Made-up sales of tea and coffee by country and year, on DuckDB, which runs Pivot',
|
|
135
|
+
tables: ['sales'],
|
|
136
|
+
model: CUBE_SALES_MODEL,
|
|
137
|
+
runtime: CUBE_SALES_RUNTIME,
|
|
138
|
+
database: CUBE_SALES_DATABASE,
|
|
139
|
+
schema: CUBE_SALES_SCHEMA,
|
|
140
|
+
};
|
|
141
|
+
|
|
123
142
|
/** The datasets, in the order the examples show them */
|
|
124
143
|
export const CUBE_EXAMPLE_DATASETS: readonly CubeExampleDataset[] =
|
|
125
|
-
Object.freeze([NORTHWIND, SPORTS, TRADES]);
|
|
144
|
+
Object.freeze([NORTHWIND, SPORTS, TRADES, SALES]);
|
|
126
145
|
|
|
127
146
|
/**
|
|
128
147
|
* A cube over the model: the nodes in order, each after the one before it
|
|
@@ -454,4 +473,54 @@ export const CUBE_EXAMPLES: readonly CubeExample[] = Object.freeze([
|
|
|
454
473
|
]),
|
|
455
474
|
}),
|
|
456
475
|
),
|
|
476
|
+
example(
|
|
477
|
+
SALES,
|
|
478
|
+
'sales-by-year',
|
|
479
|
+
'Sales by country and year',
|
|
480
|
+
'Pivots the sales by year: a row per country, a column per year summing the amounts',
|
|
481
|
+
(table) => ({
|
|
482
|
+
nodes: [
|
|
483
|
+
table('relational101', '"sales"'),
|
|
484
|
+
new Pivot(
|
|
485
|
+
'pivot101',
|
|
486
|
+
['country'],
|
|
487
|
+
'year',
|
|
488
|
+
['2022', '2023', '2024'].map((value) => ({
|
|
489
|
+
kind: 'integer' as const,
|
|
490
|
+
value,
|
|
491
|
+
})),
|
|
492
|
+
{ column: 'amount', function: AggregationFunction.SUM },
|
|
493
|
+
),
|
|
494
|
+
new Sort('sort101', [
|
|
495
|
+
{ column: 'country', direction: SortDirection.ASC },
|
|
496
|
+
]),
|
|
497
|
+
],
|
|
498
|
+
connections: chain(['relational101', 'pivot101', 'sort101']),
|
|
499
|
+
}),
|
|
500
|
+
),
|
|
501
|
+
example(
|
|
502
|
+
SALES,
|
|
503
|
+
'sales-by-product',
|
|
504
|
+
'Sales count by country and product',
|
|
505
|
+
'Pivots the sales by product: a row per country, a column per product counting its sales',
|
|
506
|
+
(table) => ({
|
|
507
|
+
nodes: [
|
|
508
|
+
table('relational101', '"sales"'),
|
|
509
|
+
new Pivot(
|
|
510
|
+
'pivot101',
|
|
511
|
+
['country'],
|
|
512
|
+
'product',
|
|
513
|
+
['Coffee', 'Tea'].map((value) => ({
|
|
514
|
+
kind: 'string' as const,
|
|
515
|
+
value,
|
|
516
|
+
})),
|
|
517
|
+
{ column: undefined, function: AggregationFunction.COUNT_ROWS },
|
|
518
|
+
),
|
|
519
|
+
new Sort('sort101', [
|
|
520
|
+
{ column: 'country', direction: SortDirection.ASC },
|
|
521
|
+
]),
|
|
522
|
+
],
|
|
523
|
+
connections: chain(['relational101', 'pivot101', 'sort101']),
|
|
524
|
+
}),
|
|
525
|
+
),
|
|
457
526
|
]);
|
|
@@ -74,7 +74,7 @@ export class CubeExamplesState {
|
|
|
74
74
|
/**
|
|
75
75
|
* Starts a new cube on the dataset's model, in place of the cube (one undo
|
|
76
76
|
* step), and opens the source dialog's Sample Data tab on it to add a first
|
|
77
|
-
* table
|
|
77
|
+
* table, with a way back to the examples
|
|
78
78
|
*/
|
|
79
79
|
startOnDataset(dataset: CubeExampleDataset): void {
|
|
80
80
|
this.close();
|
|
@@ -84,7 +84,9 @@ export class CubeExamplesState {
|
|
|
84
84
|
}),
|
|
85
85
|
false,
|
|
86
86
|
);
|
|
87
|
-
this.editorState.sourcePicker.
|
|
87
|
+
this.editorState.sourcePicker.openFromExamples(
|
|
88
|
+
CubeSourcePickerTabKey.MODEL,
|
|
89
|
+
);
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
/** Opens the example in place of the cube, then runs it */
|
|
@@ -17,26 +17,19 @@
|
|
|
17
17
|
import {
|
|
18
18
|
type CubeContext,
|
|
19
19
|
isSchemasError,
|
|
20
|
-
needsDatabaseType,
|
|
21
20
|
type Query,
|
|
22
21
|
type Schema,
|
|
23
22
|
} from '@finos/legend-cube';
|
|
24
23
|
import { assertErrorThrown, type GeneratorFn } from '@finos/legend-shared';
|
|
25
|
-
import {
|
|
26
|
-
action,
|
|
27
|
-
computed,
|
|
28
|
-
flow,
|
|
29
|
-
flowResult,
|
|
30
|
-
makeObservable,
|
|
31
|
-
observable,
|
|
32
|
-
} from 'mobx';
|
|
24
|
+
import { action, computed, flow, makeObservable, observable } from 'mobx';
|
|
33
25
|
import {
|
|
34
26
|
CubeEngineError,
|
|
35
27
|
CubeEngineErrorKind,
|
|
36
|
-
type CubeResult,
|
|
37
28
|
type CubeResultValue,
|
|
38
29
|
} from '../graph-manager/CubeEngine.js';
|
|
30
|
+
import { CUBE_RUN_LABEL } from '../__lib__/LegendCubeLabels.js';
|
|
39
31
|
import type { CubeEditorState } from './CubeEditorState.js';
|
|
32
|
+
import { type CubeQueryRunResult, runCubeQuery } from './CubeQueryRun.js';
|
|
40
33
|
|
|
41
34
|
/** What the grid shows of a run: the rows within the limit, under the schema the run was made with */
|
|
42
35
|
export interface CubeExecutionResult {
|
|
@@ -157,7 +150,9 @@ export class CubeExecutionState {
|
|
|
157
150
|
}
|
|
158
151
|
const captureId = query.selected;
|
|
159
152
|
if (captureId === undefined) {
|
|
160
|
-
reasons.push(
|
|
153
|
+
reasons.push(
|
|
154
|
+
'Pick the step to run: Run this step, from its menu or editor.',
|
|
155
|
+
);
|
|
161
156
|
} else if (
|
|
162
157
|
!emitter.canEmit(captureId) ||
|
|
163
158
|
// as the editor sees it: an Extend typed for another input waits
|
|
@@ -176,7 +171,7 @@ export class CubeExecutionState {
|
|
|
176
171
|
if (this.isRunning || !this.canExecute) {
|
|
177
172
|
return;
|
|
178
173
|
}
|
|
179
|
-
const { document,
|
|
174
|
+
const { document, analysis, rowLimit } = this.editorState;
|
|
180
175
|
const { query, context } = document;
|
|
181
176
|
const warehouse = this.editorState.dataProductRuntime.effectiveWarehouse;
|
|
182
177
|
// checked by canExecute
|
|
@@ -192,64 +187,33 @@ export class CubeExecutionState {
|
|
|
192
187
|
this.runController = controller;
|
|
193
188
|
this.error = undefined;
|
|
194
189
|
this.editorState.clearHostIssues();
|
|
190
|
+
// an export's failure is of the run it exported
|
|
191
|
+
this.editorState.export.clearError();
|
|
195
192
|
try {
|
|
196
|
-
//
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
if (needsDatabaseType(query, captureId)) {
|
|
201
|
-
yield flowResult(this.editorState.loadModelOutline(model));
|
|
202
|
-
if (this.runController !== controller || controller.signal.aborted) {
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
databaseType = this.editorState.getRunDatabaseType(
|
|
206
|
-
query,
|
|
207
|
-
captureId,
|
|
208
|
-
model,
|
|
209
|
-
runtime,
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
const lambda = emitter.emitExecutionLambda({
|
|
213
|
-
rowLimit,
|
|
193
|
+
// the query, model and runtime are the ones captured
|
|
194
|
+
const run = (yield runCubeQuery(this.editorState, {
|
|
195
|
+
query,
|
|
196
|
+
model,
|
|
214
197
|
runtime,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const response = (yield host.engine.execute(model, lambda, {
|
|
198
|
+
schema,
|
|
199
|
+
rowLimit,
|
|
218
200
|
abortController: controller,
|
|
219
|
-
|
|
201
|
+
label: CUBE_RUN_LABEL.EXECUTE,
|
|
202
|
+
})) as CubeQueryRunResult;
|
|
220
203
|
if (this.runController !== controller) {
|
|
221
204
|
return;
|
|
222
205
|
}
|
|
223
|
-
// rows are read by position, so the engine's columns must be the query's
|
|
224
|
-
if (response.columns.length !== schema.columns.length) {
|
|
225
|
-
throw new CubeEngineError(
|
|
226
|
-
CubeEngineErrorKind.EXECUTION,
|
|
227
|
-
`The engine returned ${response.columns.length} columns, but the query has ${schema.columns.length}`,
|
|
228
|
-
captureId,
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
const misplaced = schema.columns.findIndex(
|
|
232
|
-
(column, position) => response.columns[position] !== column.name,
|
|
233
|
-
);
|
|
234
|
-
if (misplaced !== -1) {
|
|
235
|
-
throw new CubeEngineError(
|
|
236
|
-
CubeEngineErrorKind.EXECUTION,
|
|
237
|
-
`The engine returned the column "${response.columns[misplaced]}" at position ${misplaced + 1}, but the query has "${schema.columns[misplaced]?.name}" there`,
|
|
238
|
-
captureId,
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
const limited = response.rows.length > rowLimit;
|
|
242
206
|
this.result = {
|
|
243
207
|
id: ++this.runCount,
|
|
244
208
|
query,
|
|
245
209
|
context,
|
|
246
210
|
warehouse,
|
|
247
211
|
schema,
|
|
248
|
-
rows:
|
|
212
|
+
rows: run.rows,
|
|
249
213
|
rowLimit,
|
|
250
|
-
limited,
|
|
251
|
-
sql:
|
|
252
|
-
durationMs:
|
|
214
|
+
limited: run.limited,
|
|
215
|
+
sql: run.sql,
|
|
216
|
+
durationMs: run.durationMs,
|
|
253
217
|
};
|
|
254
218
|
} catch (error) {
|
|
255
219
|
// a stopped or replaced run shows nothing
|
|
@@ -301,6 +265,11 @@ export class CubeExecutionState {
|
|
|
301
265
|
/** Stops any run and forgets the last one's rows and error, e.g. when another cube is opened */
|
|
302
266
|
reset(): void {
|
|
303
267
|
this.stop();
|
|
268
|
+
this.editorState.gridFetcher.purge();
|
|
269
|
+
this.editorState.export.stop();
|
|
270
|
+
// an export's failure is of the run it exported (review of M7)
|
|
271
|
+
this.editorState.export.clearError();
|
|
272
|
+
this.editorState.grid.closeSettings();
|
|
304
273
|
this.result = undefined;
|
|
305
274
|
this.error = undefined;
|
|
306
275
|
}
|
|
@@ -0,0 +1,196 @@
|
|
|
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
|
+
checkDrilldown,
|
|
19
|
+
type ColumnDirection,
|
|
20
|
+
deriveDrilldownLevel,
|
|
21
|
+
type IR,
|
|
22
|
+
needsDatabaseType,
|
|
23
|
+
QueryEmitter,
|
|
24
|
+
} from '@finos/legend-cube';
|
|
25
|
+
import {
|
|
26
|
+
assertErrorThrown,
|
|
27
|
+
ContentType,
|
|
28
|
+
downloadFileUsingDataURI,
|
|
29
|
+
type GeneratorFn,
|
|
30
|
+
} from '@finos/legend-shared';
|
|
31
|
+
import {
|
|
32
|
+
action,
|
|
33
|
+
computed,
|
|
34
|
+
flow,
|
|
35
|
+
flowResult,
|
|
36
|
+
makeObservable,
|
|
37
|
+
observable,
|
|
38
|
+
} from 'mobx';
|
|
39
|
+
import {
|
|
40
|
+
CubeEngineError,
|
|
41
|
+
CubeEngineErrorKind,
|
|
42
|
+
} from '../graph-manager/CubeEngine.js';
|
|
43
|
+
import { CUBE_RUN_LABEL } from '../__lib__/LegendCubeLabels.js';
|
|
44
|
+
import type { CubeEditorState } from './CubeEditorState.js';
|
|
45
|
+
import type { CubeExecutionResult } from './CubeExecutionState.js';
|
|
46
|
+
|
|
47
|
+
export const CUBE_EXPORT_CONTEXT_CHANGED =
|
|
48
|
+
"The cube's model, runtime or warehouse changed since this run: execute again to export it.";
|
|
49
|
+
|
|
50
|
+
/** A file name for a cube's export, from its name, e.g. `Largest_buys.csv` */
|
|
51
|
+
export const getCubeExportFileName = (
|
|
52
|
+
name: string | undefined,
|
|
53
|
+
extension: 'csv' | 'xlsx',
|
|
54
|
+
): string => {
|
|
55
|
+
const base = name?.trim().replace(/[^\w.-]+/gu, '_') ?? '';
|
|
56
|
+
return `${base.length ? base : 'cube'}.${extension}`;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The results' export (spec §12.5, PLAN §11.10): CSV of the whole query,
|
|
61
|
+
* run on the engine with no row limit, sorted as the grid is, saved by the
|
|
62
|
+
* browser. Only the run on screen is exported, in the context it ran in. A
|
|
63
|
+
* failure is kept for the grid region; Stop aborts the export.
|
|
64
|
+
*/
|
|
65
|
+
export class CubeExportState {
|
|
66
|
+
readonly editorState: CubeEditorState;
|
|
67
|
+
error: CubeEngineError | undefined;
|
|
68
|
+
private controller: AbortController | undefined;
|
|
69
|
+
|
|
70
|
+
constructor(editorState: CubeEditorState) {
|
|
71
|
+
makeObservable<CubeExportState, 'controller'>(this, {
|
|
72
|
+
error: observable.ref,
|
|
73
|
+
controller: observable.ref,
|
|
74
|
+
isExporting: computed,
|
|
75
|
+
exportCsv: flow,
|
|
76
|
+
stop: action,
|
|
77
|
+
clearError: action,
|
|
78
|
+
});
|
|
79
|
+
this.editorState = editorState;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
get isExporting(): boolean {
|
|
83
|
+
return this.controller !== undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** The run's whole query as CSV, sorted as the grid is (by the run's column names) */
|
|
87
|
+
*exportCsv(
|
|
88
|
+
result: CubeExecutionResult,
|
|
89
|
+
sorts: readonly ColumnDirection[] = [],
|
|
90
|
+
): GeneratorFn<void> {
|
|
91
|
+
const { editorState } = this;
|
|
92
|
+
const model = result.context?.model;
|
|
93
|
+
const runtime = result.context?.runtime;
|
|
94
|
+
const captureId = result.query.selected;
|
|
95
|
+
if (this.isExporting || !model || !runtime || captureId === undefined) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.error = undefined;
|
|
99
|
+
// the warehouse is read from the page when the query runs
|
|
100
|
+
if (
|
|
101
|
+
result.context !== editorState.document.context ||
|
|
102
|
+
result.warehouse !== editorState.dataProductRuntime.effectiveWarehouse
|
|
103
|
+
) {
|
|
104
|
+
this.error = new CubeEngineError(
|
|
105
|
+
CubeEngineErrorKind.EXECUTION,
|
|
106
|
+
CUBE_EXPORT_CONTEXT_CHANGED,
|
|
107
|
+
captureId,
|
|
108
|
+
);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const controller = new AbortController();
|
|
112
|
+
this.controller = controller;
|
|
113
|
+
const startedAt = Date.now();
|
|
114
|
+
// kept for the Runs panel, once written (PLAN §11.16)
|
|
115
|
+
let lambda: IR | undefined;
|
|
116
|
+
try {
|
|
117
|
+
// the run's rows, sorted as the grid is: no drill-down level
|
|
118
|
+
const { query } = deriveDrilldownLevel({
|
|
119
|
+
query: result.query,
|
|
120
|
+
captureId,
|
|
121
|
+
schema: result.schema,
|
|
122
|
+
drilldown: checkDrilldown(
|
|
123
|
+
{ columns: [], aggregations: [] },
|
|
124
|
+
result.schema,
|
|
125
|
+
),
|
|
126
|
+
keys: [],
|
|
127
|
+
sorts,
|
|
128
|
+
});
|
|
129
|
+
const runId = query.selected as string;
|
|
130
|
+
let databaseType: string | undefined;
|
|
131
|
+
if (needsDatabaseType(query, runId)) {
|
|
132
|
+
yield flowResult(editorState.loadModelOutline(model));
|
|
133
|
+
databaseType = editorState.getRunDatabaseType(
|
|
134
|
+
query,
|
|
135
|
+
runId,
|
|
136
|
+
model,
|
|
137
|
+
runtime,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
if (controller.signal.aborted) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
lambda = new QueryEmitter(
|
|
144
|
+
query,
|
|
145
|
+
editorState.registry,
|
|
146
|
+
).emitExecutionLambda({ runtime, databaseType });
|
|
147
|
+
const csv = (yield editorState.host.engine.exportCsv(model, lambda, {
|
|
148
|
+
abortController: controller,
|
|
149
|
+
})) as string;
|
|
150
|
+
// stopped while it ran: `stop()` lets go of it
|
|
151
|
+
if (this.controller !== controller) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
downloadFileUsingDataURI(
|
|
155
|
+
getCubeExportFileName(editorState.document.name, 'csv'),
|
|
156
|
+
csv,
|
|
157
|
+
ContentType.TEXT_CSV,
|
|
158
|
+
);
|
|
159
|
+
editorState.runStats.record(CUBE_RUN_LABEL.EXPORT_CSV, {
|
|
160
|
+
durationMs: Date.now() - startedAt,
|
|
161
|
+
lambda,
|
|
162
|
+
});
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (controller.signal.aborted) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
assertErrorThrown(error);
|
|
168
|
+
this.error =
|
|
169
|
+
error instanceof CubeEngineError
|
|
170
|
+
? error
|
|
171
|
+
: new CubeEngineError(
|
|
172
|
+
CubeEngineErrorKind.EXECUTION,
|
|
173
|
+
error.message,
|
|
174
|
+
captureId,
|
|
175
|
+
);
|
|
176
|
+
editorState.runStats.record(CUBE_RUN_LABEL.EXPORT_CSV, {
|
|
177
|
+
durationMs: Date.now() - startedAt,
|
|
178
|
+
lambda,
|
|
179
|
+
error: this.error.firstLine,
|
|
180
|
+
});
|
|
181
|
+
} finally {
|
|
182
|
+
if (this.controller === controller) {
|
|
183
|
+
this.controller = undefined;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
stop(): void {
|
|
189
|
+
this.controller?.abort();
|
|
190
|
+
this.controller = undefined;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
clearError(): void {
|
|
194
|
+
this.error = undefined;
|
|
195
|
+
}
|
|
196
|
+
}
|