@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,218 @@
|
|
|
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
|
+
colSpec,
|
|
19
|
+
colSpecArray,
|
|
20
|
+
EmitRole,
|
|
21
|
+
type ExpressionCheck,
|
|
22
|
+
type ExpressionFilter,
|
|
23
|
+
foldColumnName,
|
|
24
|
+
func,
|
|
25
|
+
getExpressionFilterSignature,
|
|
26
|
+
type IR,
|
|
27
|
+
type JsonObject,
|
|
28
|
+
lambda,
|
|
29
|
+
lambdaJson,
|
|
30
|
+
type NodeRegistry,
|
|
31
|
+
originOf,
|
|
32
|
+
type Query,
|
|
33
|
+
QueryEmitter,
|
|
34
|
+
Schema,
|
|
35
|
+
type SchemaColumn,
|
|
36
|
+
TypeFamily,
|
|
37
|
+
} from '@finos/legend-cube';
|
|
38
|
+
import {
|
|
39
|
+
CubeEngineError,
|
|
40
|
+
CubeEngineErrorKind,
|
|
41
|
+
type NodeId,
|
|
42
|
+
} from '../graph-manager/CubeEngine.js';
|
|
43
|
+
import { withoutEngineContext } from './CubeExtendTyping.js';
|
|
44
|
+
|
|
45
|
+
// Checking a Filter by Expression's condition with the engine (PLAN §11.11):
|
|
46
|
+
// its input's relation, as Cube types any node, then `filter` with the
|
|
47
|
+
// condition. A condition that isn't one Boolean fails there with no location
|
|
48
|
+
// and the whole relation type, so the same call types the condition alone,
|
|
49
|
+
// as an extend column, which gives its type for Cube's own message.
|
|
50
|
+
|
|
51
|
+
/** The key of the lambda that filters the input with the condition */
|
|
52
|
+
const filterKeyOf = (filterId: string): NodeId => `${filterId}#filter`;
|
|
53
|
+
|
|
54
|
+
/** The key of the lambda that types the condition alone, as an extend column */
|
|
55
|
+
const conditionKeyOf = (filterId: string): NodeId => `${filterId}#condition`;
|
|
56
|
+
|
|
57
|
+
/** A name for the condition typed alone that no input column has, as databases that ignore case compare names */
|
|
58
|
+
export const getConditionColumnName = (input: Schema): string => {
|
|
59
|
+
const taken = new Set(input.names().map(foldColumnName));
|
|
60
|
+
let name = 'cube_condition';
|
|
61
|
+
for (let suffix = 2; taken.has(foldColumnName(name)); suffix += 1) {
|
|
62
|
+
name = `cube_condition_${suffix}`;
|
|
63
|
+
}
|
|
64
|
+
return name;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The lambdas that check a condition, by key: the input's relation filtered
|
|
69
|
+
* with it, and the input's relation extended with it under a name no input
|
|
70
|
+
* column has. A located lambda keeps its locations, so an error points into
|
|
71
|
+
* its text; a stored one is marked with the filter, so an error lands on it.
|
|
72
|
+
* The input must be valid.
|
|
73
|
+
*/
|
|
74
|
+
export const buildCubeConditionCheckLambdas = (
|
|
75
|
+
query: Query,
|
|
76
|
+
filter: ExpressionFilter,
|
|
77
|
+
condition: JsonObject,
|
|
78
|
+
input: Schema,
|
|
79
|
+
registry: NodeRegistry,
|
|
80
|
+
located: boolean,
|
|
81
|
+
): Map<NodeId, IR> => {
|
|
82
|
+
const [inputId] = query.getInputIds(filter.id);
|
|
83
|
+
if (inputId === undefined) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Filter by expression "${filter.id}" has no input to check it on`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
const relation = new QueryEmitter(query, registry).emitRelation(inputId);
|
|
89
|
+
const origin = located ? undefined : originOf(filter.id, EmitRole.EXPRESSION);
|
|
90
|
+
return new Map<NodeId, IR>([
|
|
91
|
+
[
|
|
92
|
+
filterKeyOf(filter.id),
|
|
93
|
+
lambda([], [func('filter', [relation, lambdaJson(condition, origin)])]),
|
|
94
|
+
],
|
|
95
|
+
[
|
|
96
|
+
conditionKeyOf(filter.id),
|
|
97
|
+
lambda(
|
|
98
|
+
[],
|
|
99
|
+
[
|
|
100
|
+
func('extend', [
|
|
101
|
+
relation,
|
|
102
|
+
colSpecArray([
|
|
103
|
+
colSpec(
|
|
104
|
+
getConditionColumnName(input),
|
|
105
|
+
lambdaJson(condition, origin),
|
|
106
|
+
),
|
|
107
|
+
]),
|
|
108
|
+
]),
|
|
109
|
+
],
|
|
110
|
+
),
|
|
111
|
+
],
|
|
112
|
+
]);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/** A condition's type as the message names it: `Integer`, `Boolean[0..1]` */
|
|
116
|
+
const describeConditionType = (column: SchemaColumn): string =>
|
|
117
|
+
`${column.type.displayName}${column.nullable ? '[0..1]' : ''}`;
|
|
118
|
+
|
|
119
|
+
/** What checking a condition gave: the check to store, and the error the engine gave, if it failed */
|
|
120
|
+
export interface CubeConditionCheckResult {
|
|
121
|
+
readonly check: ExpressionCheck;
|
|
122
|
+
readonly error?: CubeEngineError | undefined;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The check the engine's answers give, for this input and this condition:
|
|
127
|
+
* checked when the filter types; else failed, with the condition's type when
|
|
128
|
+
* it types alone but isn't one Boolean, and the engine's error: the
|
|
129
|
+
* condition's own when it fails alone, as it names no `filter`, else the
|
|
130
|
+
* filter's (a network failure when there is neither)
|
|
131
|
+
*/
|
|
132
|
+
export const readCubeConditionCheck = (
|
|
133
|
+
answers: ReadonlyMap<NodeId, Schema | CubeEngineError>,
|
|
134
|
+
filter: ExpressionFilter,
|
|
135
|
+
input: Schema,
|
|
136
|
+
upstream: string | undefined,
|
|
137
|
+
): CubeConditionCheckResult => {
|
|
138
|
+
const signature = getExpressionFilterSignature(input, filter.lambda);
|
|
139
|
+
const filtered = answers.get(filterKeyOf(filter.id));
|
|
140
|
+
if (filtered instanceof Schema) {
|
|
141
|
+
return { check: { kind: 'checked', signature, upstream } };
|
|
142
|
+
}
|
|
143
|
+
const alone = answers.get(conditionKeyOf(filter.id));
|
|
144
|
+
const conditionColumn =
|
|
145
|
+
alone instanceof Schema ? alone.columns.at(-1) : undefined;
|
|
146
|
+
const resultType =
|
|
147
|
+
conditionColumn &&
|
|
148
|
+
!(
|
|
149
|
+
conditionColumn.type.family === TypeFamily.BOOLEAN &&
|
|
150
|
+
!conditionColumn.nullable
|
|
151
|
+
)
|
|
152
|
+
? describeConditionType(conditionColumn)
|
|
153
|
+
: undefined;
|
|
154
|
+
const error =
|
|
155
|
+
(alone instanceof CubeEngineError ? alone : undefined) ??
|
|
156
|
+
filtered ??
|
|
157
|
+
new CubeEngineError(
|
|
158
|
+
CubeEngineErrorKind.NETWORK,
|
|
159
|
+
'The engine gave no answer for this condition',
|
|
160
|
+
filter.id,
|
|
161
|
+
);
|
|
162
|
+
return {
|
|
163
|
+
check: {
|
|
164
|
+
kind: 'failed',
|
|
165
|
+
signature,
|
|
166
|
+
message: withoutEngineContext(error.detail),
|
|
167
|
+
resultType,
|
|
168
|
+
upstream,
|
|
169
|
+
},
|
|
170
|
+
error,
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/** The digest of what the engine was given for the input, which the check recorded */
|
|
175
|
+
export const getCubeConditionCheckUpstream = (
|
|
176
|
+
check: ExpressionCheck,
|
|
177
|
+
): string | undefined =>
|
|
178
|
+
check.kind === 'unresolved' ? undefined : check.upstream;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Whether the filter's check says its condition is one Boolean for this
|
|
182
|
+
* input: checked, for this schema and this condition, and for this input as
|
|
183
|
+
* the engine is given it, or recorded without it, as when loaded
|
|
184
|
+
*/
|
|
185
|
+
export const isCubeConditionCheckCurrent = (
|
|
186
|
+
filter: ExpressionFilter,
|
|
187
|
+
input: Schema,
|
|
188
|
+
upstream: string | undefined,
|
|
189
|
+
): boolean => {
|
|
190
|
+
const { check } = filter;
|
|
191
|
+
const recorded = getCubeConditionCheckUpstream(check);
|
|
192
|
+
return (
|
|
193
|
+
check.kind === 'checked' &&
|
|
194
|
+
filter.currentCheck(input) === check &&
|
|
195
|
+
(recorded === undefined || recorded === upstream)
|
|
196
|
+
);
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/** Whether two checks say the same: the same kind, signature and input as the engine was given it, and the same failure */
|
|
200
|
+
export const isSameCubeConditionCheck = (
|
|
201
|
+
a: ExpressionCheck,
|
|
202
|
+
b: ExpressionCheck,
|
|
203
|
+
): boolean => {
|
|
204
|
+
if (getCubeConditionCheckUpstream(a) !== getCubeConditionCheckUpstream(b)) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
if (a.kind === 'checked' && b.kind === 'checked') {
|
|
208
|
+
return a.signature === b.signature;
|
|
209
|
+
}
|
|
210
|
+
if (a.kind === 'failed' && b.kind === 'failed') {
|
|
211
|
+
return (
|
|
212
|
+
a.signature === b.signature &&
|
|
213
|
+
a.message === b.message &&
|
|
214
|
+
a.resultType === b.resultType
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
return a.kind === 'unresolved' && b.kind === 'unresolved';
|
|
218
|
+
};
|
|
@@ -15,18 +15,15 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
buildSchemasAndValidity,
|
|
19
18
|
colSpec,
|
|
20
19
|
colSpecArray,
|
|
21
20
|
EmitRole,
|
|
22
|
-
|
|
23
|
-
Extend,
|
|
21
|
+
type Extend,
|
|
24
22
|
type ExtendTyping,
|
|
25
23
|
func,
|
|
26
24
|
getExtendSignature,
|
|
27
25
|
hashText,
|
|
28
26
|
type IR,
|
|
29
|
-
isTypingError,
|
|
30
27
|
type JsonObject,
|
|
31
28
|
lambda,
|
|
32
29
|
lambdaJson,
|
|
@@ -36,7 +33,6 @@ import {
|
|
|
36
33
|
printIR,
|
|
37
34
|
type Query,
|
|
38
35
|
QueryEmitter,
|
|
39
|
-
type QueryRule,
|
|
40
36
|
type Schema,
|
|
41
37
|
stableJsonText,
|
|
42
38
|
} from '@finos/legend-cube';
|
|
@@ -116,10 +112,11 @@ const digestModel = (model: ModelContext): string => {
|
|
|
116
112
|
};
|
|
117
113
|
|
|
118
114
|
/**
|
|
119
|
-
* What the engine is given for
|
|
120
|
-
* (PLAN §11.7): the input's
|
|
121
|
-
*
|
|
122
|
-
*
|
|
115
|
+
* What the engine is given for a node's input when it types an Extend or
|
|
116
|
+
* checks a Filter by Expression, digested (PLAN §11.7, §11.11): the input's
|
|
117
|
+
* relation as emitted, and the model. A typing or a check records it
|
|
118
|
+
* (`upstream`), since the engine sees more than Cube's schema does;
|
|
119
|
+
* `undefined` when the input can't be emitted, e.g. it is invalid.
|
|
123
120
|
*/
|
|
124
121
|
export const getCubeExtendUpstream = (
|
|
125
122
|
emitter: QueryEmitter,
|
|
@@ -162,43 +159,6 @@ export const isCubeExtendTypingCurrent = (
|
|
|
162
159
|
);
|
|
163
160
|
};
|
|
164
161
|
|
|
165
|
-
/**
|
|
166
|
-
* A query rule for the editor (PLAN §11.7): an Extend whose typing recorded
|
|
167
|
-
* another input than the engine would be given now waits to be typed again
|
|
168
|
-
* (`ERR_TYPING`), e.g. after an Extend above it gains `->toOne()`, which
|
|
169
|
-
* Cube's schema doesn't show. A typing that recorded nothing, as one loaded,
|
|
170
|
-
* is used as it is; an Extend that already waits, or whose input is invalid,
|
|
171
|
-
* is left to its own checks.
|
|
172
|
-
*/
|
|
173
|
-
export const createStaleCubeExtendTypingRule =
|
|
174
|
-
(
|
|
175
|
-
registry: NodeRegistry,
|
|
176
|
-
modelOf: () => ModelContext | undefined,
|
|
177
|
-
): QueryRule =>
|
|
178
|
-
(query) => {
|
|
179
|
-
const stale = new Map<string, readonly string[]>();
|
|
180
|
-
const model = modelOf();
|
|
181
|
-
const recorded = query.nodes.filter(
|
|
182
|
-
(node): node is Extend =>
|
|
183
|
-
node instanceof Extend && upstreamOf(node.typing) !== undefined,
|
|
184
|
-
);
|
|
185
|
-
if (!model || !recorded.length) {
|
|
186
|
-
return stale;
|
|
187
|
-
}
|
|
188
|
-
const { validity } = buildSchemasAndValidity(query, registry.queryRules);
|
|
189
|
-
const emitter = new QueryEmitter(query, registry);
|
|
190
|
-
recorded.forEach((node) => {
|
|
191
|
-
if ((validity.get(node.id) ?? []).some(isTypingError)) {
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
const upstream = getCubeExtendUpstream(emitter, node.id, model);
|
|
195
|
-
if (upstream !== undefined && upstream !== upstreamOf(node.typing)) {
|
|
196
|
-
stale.set(node.id, [ERR_TYPING]);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
return stale;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
162
|
/** What typing an Extend gave: the typing to store, and the error the engine gave, if it failed */
|
|
203
163
|
export interface CubeExtendTypingResult {
|
|
204
164
|
readonly typing: ExtendTyping;
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
emitFunctionSource,
|
|
19
|
+
type EnteredValue,
|
|
20
|
+
type FunctionSource,
|
|
21
|
+
getLiteralKinds,
|
|
22
|
+
type IR,
|
|
23
|
+
lambda,
|
|
24
|
+
type LiteralValue,
|
|
25
|
+
type ModelContext,
|
|
26
|
+
type Schema,
|
|
27
|
+
} from '@finos/legend-cube';
|
|
28
|
+
import {
|
|
29
|
+
CubeEngineError,
|
|
30
|
+
CubeEngineErrorKind,
|
|
31
|
+
type CubeEngine,
|
|
32
|
+
type NodeId,
|
|
33
|
+
} from '../graph-manager/CubeEngine.js';
|
|
34
|
+
|
|
35
|
+
/** A value of each kind, which only types the call: a function's columns don't depend on its values */
|
|
36
|
+
const PLACEHOLDERS: Readonly<Record<LiteralValue['kind'], LiteralValue>> = {
|
|
37
|
+
string: { kind: 'string', value: '' },
|
|
38
|
+
boolean: { kind: 'boolean', value: false },
|
|
39
|
+
integer: { kind: 'integer', value: '0' },
|
|
40
|
+
float: { kind: 'float', value: '0' },
|
|
41
|
+
decimal: { kind: 'decimal', value: '0' },
|
|
42
|
+
strictDate: { kind: 'strictDate', value: '2000-01-01' },
|
|
43
|
+
dateTime: { kind: 'dateTime', value: '2000-01-01T00:00:00' },
|
|
44
|
+
enum: { kind: 'enum', value: '' },
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The lambda that types a function source, `{| sales::ordersAbove(…)}`: its
|
|
49
|
+
* values where they are valid, else a placeholder of the parameter's type, or
|
|
50
|
+
* `[]` for an empty optional one
|
|
51
|
+
*/
|
|
52
|
+
export const buildCubeFunctionTypingLambda = (source: FunctionSource): IR => {
|
|
53
|
+
const values: EnteredValue[] = source.parameters.map((parameter, index) => {
|
|
54
|
+
const value = source.values[index];
|
|
55
|
+
if (value !== undefined && value.kind !== 'invalid') {
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
if (value === undefined && parameter.optional) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const [kind] = getLiteralKinds(parameter.type);
|
|
62
|
+
return kind ? PLACEHOLDERS[kind] : undefined;
|
|
63
|
+
});
|
|
64
|
+
return lambda([], [emitFunctionSource(source.withValues(values))]);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Types a cube's functions again with the engine (PLAN §6.5), in one call:
|
|
69
|
+
* their columns as the engine types the call. One answer per source,
|
|
70
|
+
* failures included; never rejects.
|
|
71
|
+
*/
|
|
72
|
+
export const recheckCubeFunctionSources = async (
|
|
73
|
+
engine: CubeEngine,
|
|
74
|
+
model: ModelContext,
|
|
75
|
+
sources: readonly FunctionSource[],
|
|
76
|
+
): Promise<Map<NodeId, Schema | CubeEngineError>> => {
|
|
77
|
+
try {
|
|
78
|
+
return await engine.typeLambdas(
|
|
79
|
+
model,
|
|
80
|
+
new Map(
|
|
81
|
+
sources.map((source) => [
|
|
82
|
+
source.id,
|
|
83
|
+
buildCubeFunctionTypingLambda(source),
|
|
84
|
+
]),
|
|
85
|
+
),
|
|
86
|
+
);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
const failure =
|
|
89
|
+
error instanceof CubeEngineError
|
|
90
|
+
? error
|
|
91
|
+
: new CubeEngineError(
|
|
92
|
+
CubeEngineErrorKind.NETWORK,
|
|
93
|
+
error instanceof Error ? error.message : String(error),
|
|
94
|
+
);
|
|
95
|
+
return new Map(sources.map((source) => [source.id, failure]));
|
|
96
|
+
}
|
|
97
|
+
};
|
|
@@ -0,0 +1,302 @@
|
|
|
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
|
+
checkDrilldown,
|
|
20
|
+
type ColumnDirection,
|
|
21
|
+
deriveDrilldownLevel,
|
|
22
|
+
type DrilldownCell,
|
|
23
|
+
type DrilldownLevel,
|
|
24
|
+
printIR,
|
|
25
|
+
QueryEmitter,
|
|
26
|
+
SortDirection,
|
|
27
|
+
} from '@finos/legend-cube';
|
|
28
|
+
import { NULL_CELL_TEXT } from '../__lib__/LegendCubeLabels.js';
|
|
29
|
+
import {
|
|
30
|
+
CubeEngineError,
|
|
31
|
+
CubeEngineErrorKind,
|
|
32
|
+
type CubeResultValue,
|
|
33
|
+
} from '../graph-manager/CubeEngine.js';
|
|
34
|
+
import type { CubeEditorState } from './CubeEditorState.js';
|
|
35
|
+
import type { CubeExecutionResult } from './CubeExecutionState.js';
|
|
36
|
+
import { type CubeQueryRunResult, runCubeQuery } from './CubeQueryRun.js';
|
|
37
|
+
|
|
38
|
+
/** A row of a level, by the run's column positions */
|
|
39
|
+
export interface CubeGridRow {
|
|
40
|
+
/** Each run column's value, `undefined` where the level shows none (a group row's column with no aggregation) */
|
|
41
|
+
readonly cells: readonly (CubeResultValue | undefined)[];
|
|
42
|
+
/** On a group row, how many of the run's rows the group holds */
|
|
43
|
+
readonly count?: number | undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The rows of one level of the grid: the run's rows, or groups of them */
|
|
47
|
+
export interface CubeGridLevelRows {
|
|
48
|
+
readonly level: DrilldownLevel;
|
|
49
|
+
readonly rows: readonly CubeGridRow[];
|
|
50
|
+
/** The engine returned more than the run's row limit */
|
|
51
|
+
readonly limited: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** An answer for rows the grid no longer shows: a newer run, or the grid purged its rows; it is dropped */
|
|
55
|
+
export class CubeGridFetchDropped extends Error {
|
|
56
|
+
constructor() {
|
|
57
|
+
super('The rows were asked for by a grid that no longer shows them');
|
|
58
|
+
this.name = 'CubeGridFetchDropped';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The most rows the cache holds across its levels; the oldest levels go first (PLAN §11.10) */
|
|
63
|
+
export const MAX_CUBE_GRID_CACHED_ROWS = 200_000;
|
|
64
|
+
|
|
65
|
+
export const CUBE_GRID_CONTEXT_CHANGED =
|
|
66
|
+
"The cube's model, runtime or warehouse changed since this run: execute again to see more of its rows.";
|
|
67
|
+
|
|
68
|
+
interface CachedLevel {
|
|
69
|
+
readonly promise: Promise<CubeGridLevelRows>;
|
|
70
|
+
/** Its rows, once answered; 0 until then */
|
|
71
|
+
rows: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** How a fetch is shown in the run stats, e.g. `Rows of SHIP_COUNTRY "France"` */
|
|
75
|
+
const describeFetch = (
|
|
76
|
+
level: DrilldownLevel,
|
|
77
|
+
keys: readonly DrilldownCell[],
|
|
78
|
+
levels: readonly string[],
|
|
79
|
+
sorts: readonly ColumnDirection[],
|
|
80
|
+
): string => {
|
|
81
|
+
const of = keys
|
|
82
|
+
.map(
|
|
83
|
+
(key, index) =>
|
|
84
|
+
`${levels[index]} ${key === null ? NULL_CELL_TEXT : JSON.stringify(String(key))}`,
|
|
85
|
+
)
|
|
86
|
+
.join(', ');
|
|
87
|
+
const sorted = sorts
|
|
88
|
+
.map(
|
|
89
|
+
({ column, direction }) =>
|
|
90
|
+
`${column} ${direction === SortDirection.DESC ? 'descending' : 'ascending'}`,
|
|
91
|
+
)
|
|
92
|
+
.join(', ');
|
|
93
|
+
return [
|
|
94
|
+
level.isLeaf ? 'Rows' : `Groups by ${level.groupColumns.at(-1)}`,
|
|
95
|
+
of ? ` of ${of}` : '',
|
|
96
|
+
sorted ? `, sorted by ${sorted}` : '',
|
|
97
|
+
].join('');
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Fetches the levels of the grid's server-side mode (PLAN §11.10): each a
|
|
102
|
+
* query derived from the run on screen, never the live cube, with the
|
|
103
|
+
* drill-down the cube has now and the grid's sort, run as Execute runs
|
|
104
|
+
* (`runCubeQuery`), with the run's model, runtime and row limit. Answers are
|
|
105
|
+
* cached by the derived query, the oldest dropped past
|
|
106
|
+
* `MAX_CUBE_GRID_CACHED_ROWS` rows. `purge()` drops them all, aborts the
|
|
107
|
+
* fetches in flight and drops their answers, as a new run does.
|
|
108
|
+
*/
|
|
109
|
+
export class CubeGridFetcher {
|
|
110
|
+
readonly editorState: CubeEditorState;
|
|
111
|
+
/** The most rows the cache holds */
|
|
112
|
+
readonly maxCachedRows: number;
|
|
113
|
+
/** Bumped by each purge: an answer of an older generation is dropped */
|
|
114
|
+
private generation = 0;
|
|
115
|
+
private resultId: number | undefined;
|
|
116
|
+
/** In the order last used, the oldest first */
|
|
117
|
+
private readonly cache = new Map<string, CachedLevel>();
|
|
118
|
+
private readonly controllers = new Set<AbortController>();
|
|
119
|
+
|
|
120
|
+
constructor(
|
|
121
|
+
editorState: CubeEditorState,
|
|
122
|
+
maxCachedRows = MAX_CUBE_GRID_CACHED_ROWS,
|
|
123
|
+
) {
|
|
124
|
+
this.editorState = editorState;
|
|
125
|
+
this.maxCachedRows = maxCachedRows;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** How many rows the cache holds */
|
|
129
|
+
get cachedRows(): number {
|
|
130
|
+
return Array.from(this.cache.values()).reduce(
|
|
131
|
+
(total, cached) => total + cached.rows,
|
|
132
|
+
0,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Drops every cached level, and aborts the fetches in flight, whose answers are then dropped */
|
|
137
|
+
purge(): void {
|
|
138
|
+
this.generation += 1;
|
|
139
|
+
this.cache.clear();
|
|
140
|
+
this.controllers.forEach((controller) => controller.abort());
|
|
141
|
+
this.controllers.clear();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The rows of the level under the expanded groups' keys (outermost first;
|
|
146
|
+
* none for the top level), sorted by the grid. Rejects with a
|
|
147
|
+
* `CubeEngineError`, or a `CubeGridFetchDropped` when the answer is for rows
|
|
148
|
+
* the grid no longer shows.
|
|
149
|
+
*/
|
|
150
|
+
fetchLevel(
|
|
151
|
+
result: CubeExecutionResult,
|
|
152
|
+
keys: readonly DrilldownCell[],
|
|
153
|
+
sorts: readonly ColumnDirection[],
|
|
154
|
+
): Promise<CubeGridLevelRows> {
|
|
155
|
+
if (result.id !== this.resultId) {
|
|
156
|
+
this.purge();
|
|
157
|
+
this.resultId = result.id;
|
|
158
|
+
}
|
|
159
|
+
const { editorState } = this;
|
|
160
|
+
const model = result.context?.model;
|
|
161
|
+
const runtime = result.context?.runtime;
|
|
162
|
+
const captureId = result.query.selected;
|
|
163
|
+
if (!model || !runtime || captureId === undefined) {
|
|
164
|
+
return Promise.reject(
|
|
165
|
+
new Error('A run has a model, a runtime and a node'),
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
// the warehouse is read from the page when the query runs, so a fetch
|
|
169
|
+
// under another one would run the run's query elsewhere
|
|
170
|
+
if (
|
|
171
|
+
result.context !== editorState.document.context ||
|
|
172
|
+
result.warehouse !== editorState.dataProductRuntime.effectiveWarehouse
|
|
173
|
+
) {
|
|
174
|
+
return Promise.reject(
|
|
175
|
+
new CubeEngineError(
|
|
176
|
+
CubeEngineErrorKind.EXECUTION,
|
|
177
|
+
CUBE_GRID_CONTEXT_CHANGED,
|
|
178
|
+
captureId,
|
|
179
|
+
),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
let level: DrilldownLevel;
|
|
183
|
+
const drilldown = checkDrilldown(
|
|
184
|
+
editorState.document.meta.drilldown ?? { columns: [], aggregations: [] },
|
|
185
|
+
result.schema,
|
|
186
|
+
);
|
|
187
|
+
try {
|
|
188
|
+
level = deriveDrilldownLevel({
|
|
189
|
+
query: result.query,
|
|
190
|
+
captureId,
|
|
191
|
+
schema: result.schema,
|
|
192
|
+
drilldown,
|
|
193
|
+
keys,
|
|
194
|
+
sorts,
|
|
195
|
+
});
|
|
196
|
+
} catch (error) {
|
|
197
|
+
return Promise.reject(
|
|
198
|
+
new CubeEngineError(
|
|
199
|
+
CubeEngineErrorKind.EXECUTION,
|
|
200
|
+
error instanceof Error ? error.message : String(error),
|
|
201
|
+
captureId,
|
|
202
|
+
),
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
const runId = level.query.selected as string;
|
|
206
|
+
// Cube's own checks first, so the engine never gets a query Cube knows is wrong
|
|
207
|
+
const { schemas, validity } = buildSchemasAndValidity(
|
|
208
|
+
level.query,
|
|
209
|
+
editorState.registry.queryRules,
|
|
210
|
+
);
|
|
211
|
+
const problem = (validity.get(runId) ?? [])[0];
|
|
212
|
+
const schema = schemas.get(runId);
|
|
213
|
+
if (problem !== undefined || !schema) {
|
|
214
|
+
return Promise.reject(
|
|
215
|
+
new CubeEngineError(
|
|
216
|
+
CubeEngineErrorKind.EXECUTION,
|
|
217
|
+
`These rows can't be fetched: ${problem ?? 'the query has no columns'}`,
|
|
218
|
+
captureId,
|
|
219
|
+
),
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
// the whole run, so a sort the row order keeps is in it
|
|
223
|
+
const key = printIR(
|
|
224
|
+
new QueryEmitter(level.query, editorState.registry).emitExecutionLambda({
|
|
225
|
+
rowLimit: result.rowLimit,
|
|
226
|
+
runtime,
|
|
227
|
+
}),
|
|
228
|
+
);
|
|
229
|
+
const cached = this.cache.get(key);
|
|
230
|
+
if (cached) {
|
|
231
|
+
// last used now
|
|
232
|
+
this.cache.delete(key);
|
|
233
|
+
this.cache.set(key, cached);
|
|
234
|
+
return cached.promise;
|
|
235
|
+
}
|
|
236
|
+
const generation = this.generation;
|
|
237
|
+
const controller = new AbortController();
|
|
238
|
+
this.controllers.add(controller);
|
|
239
|
+
const entry: CachedLevel = {
|
|
240
|
+
rows: 0,
|
|
241
|
+
promise: runCubeQuery(editorState, {
|
|
242
|
+
query: level.query,
|
|
243
|
+
model,
|
|
244
|
+
runtime,
|
|
245
|
+
schema,
|
|
246
|
+
rowLimit: result.rowLimit,
|
|
247
|
+
abortController: controller,
|
|
248
|
+
label: describeFetch(level, keys, drilldown.columns, sorts),
|
|
249
|
+
})
|
|
250
|
+
.then((run: CubeQueryRunResult): CubeGridLevelRows => {
|
|
251
|
+
if (generation !== this.generation) {
|
|
252
|
+
throw new CubeGridFetchDropped();
|
|
253
|
+
}
|
|
254
|
+
const positions = result.schema.columns.map(({ name }) => {
|
|
255
|
+
const output = level.columns.get(name);
|
|
256
|
+
return output === undefined
|
|
257
|
+
? -1
|
|
258
|
+
: schema.columns.findIndex((column) => column.name === output);
|
|
259
|
+
});
|
|
260
|
+
const countAt = level.countColumn
|
|
261
|
+
? schema.columns.findIndex(
|
|
262
|
+
(column) => column.name === level.countColumn,
|
|
263
|
+
)
|
|
264
|
+
: -1;
|
|
265
|
+
const rows = run.rows.map(
|
|
266
|
+
(row): CubeGridRow => ({
|
|
267
|
+
cells: positions.map((position) =>
|
|
268
|
+
position === -1 ? undefined : (row[position] ?? null),
|
|
269
|
+
),
|
|
270
|
+
...(countAt === -1 ? {} : { count: Number(row[countAt]) }),
|
|
271
|
+
}),
|
|
272
|
+
);
|
|
273
|
+
entry.rows = rows.length;
|
|
274
|
+
this.evict(key);
|
|
275
|
+
return { level, rows, limited: run.limited };
|
|
276
|
+
})
|
|
277
|
+
.catch((error: unknown) => {
|
|
278
|
+
if (this.cache.get(key) === entry) {
|
|
279
|
+
this.cache.delete(key);
|
|
280
|
+
}
|
|
281
|
+
throw generation !== this.generation
|
|
282
|
+
? new CubeGridFetchDropped()
|
|
283
|
+
: error;
|
|
284
|
+
})
|
|
285
|
+
.finally(() => this.controllers.delete(controller)),
|
|
286
|
+
};
|
|
287
|
+
this.cache.set(key, entry);
|
|
288
|
+
return entry.promise;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/** Drops the least recently used levels until the cache holds at most its rows, never the one just answered */
|
|
292
|
+
private evict(keep: string): void {
|
|
293
|
+
for (const [key] of this.cache) {
|
|
294
|
+
if (this.cachedRows <= this.maxCachedRows) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (key !== keep) {
|
|
298
|
+
this.cache.delete(key);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|