@finos/legend-cube-builder 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -1
- package/docs/adding-an-operation.md +181 -0
- package/docs/hosting.md +157 -0
- package/docs/testing.md +188 -0
- package/lib/__lib__/LegendCubeCommand.d.ts +2 -1
- package/lib/__lib__/LegendCubeCommand.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeCommand.js +5 -0
- package/lib/__lib__/LegendCubeCommand.js.map +1 -1
- package/lib/__lib__/LegendCubeDataProductLabels.d.ts +45 -0
- package/lib/__lib__/LegendCubeDataProductLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeDataProductLabels.js +60 -0
- package/lib/__lib__/LegendCubeDataProductLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts +56 -0
- package/lib/__lib__/LegendCubeDirectConnectionLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeDirectConnectionLabels.js +76 -0
- package/lib/__lib__/LegendCubeDirectConnectionLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeHelpText.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeHelpText.js +21 -3
- package/lib/__lib__/LegendCubeHelpText.js.map +1 -1
- package/lib/__lib__/LegendCubeIngestLabels.d.ts +25 -0
- package/lib/__lib__/LegendCubeIngestLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeIngestLabels.js +29 -0
- package/lib/__lib__/LegendCubeIngestLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeLabels.d.ts +95 -3
- package/lib/__lib__/LegendCubeLabels.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeLabels.js +121 -4
- package/lib/__lib__/LegendCubeLabels.js.map +1 -1
- package/lib/__lib__/LegendCubeProjectLabels.d.ts +22 -0
- package/lib/__lib__/LegendCubeProjectLabels.d.ts.map +1 -0
- package/lib/__lib__/LegendCubeProjectLabels.js +23 -0
- package/lib/__lib__/LegendCubeProjectLabels.js.map +1 -0
- package/lib/__lib__/LegendCubeTesting.d.ts +1 -0
- package/lib/__lib__/LegendCubeTesting.d.ts.map +1 -1
- package/lib/__lib__/LegendCubeTesting.js +1 -0
- package/lib/__lib__/LegendCubeTesting.js.map +1 -1
- package/lib/__test-utils__/CubeCanvasTestUtils.d.ts.map +1 -1
- package/lib/__test-utils__/CubeCanvasTestUtils.js +1 -1
- package/lib/__test-utils__/CubeCanvasTestUtils.js.map +1 -1
- package/lib/__test-utils__/CubeConnectionTestSupport.d.ts +22 -0
- package/lib/__test-utils__/CubeConnectionTestSupport.d.ts.map +1 -0
- package/lib/__test-utils__/CubeConnectionTestSupport.js +30 -0
- package/lib/__test-utils__/CubeConnectionTestSupport.js.map +1 -0
- package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts +31 -0
- package/lib/__test-utils__/CubeDirectConnectionFixtures.d.ts.map +1 -0
- package/lib/__test-utils__/CubeDirectConnectionFixtures.js +63 -0
- package/lib/__test-utils__/CubeDirectConnectionFixtures.js.map +1 -0
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts +18 -0
- package/lib/__test-utils__/CubeEngineTestSupport.d.ts.map +1 -1
- package/lib/__test-utils__/CubeEngineTestSupport.js +51 -0
- package/lib/__test-utils__/CubeEngineTestSupport.js.map +1 -1
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts +37 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.d.ts.map +1 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.js +83 -0
- package/lib/__test-utils__/CubeExpressionTestUtils.js.map +1 -0
- package/lib/__test-utils__/CubeOperationsTestUtils.d.ts +67 -0
- package/lib/__test-utils__/CubeOperationsTestUtils.d.ts.map +1 -0
- package/lib/__test-utils__/CubeOperationsTestUtils.js +138 -0
- package/lib/__test-utils__/CubeOperationsTestUtils.js.map +1 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts +12 -0
- package/lib/__test-utils__/CubePageTestUtils.d.ts.map +1 -1
- package/lib/__test-utils__/CubePageTestUtils.js +25 -1
- package/lib/__test-utils__/CubePageTestUtils.js.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.d.ts +5 -1
- package/lib/__test-utils__/CubeTestApplication.d.ts.map +1 -1
- package/lib/__test-utils__/CubeTestApplication.js +9 -1
- package/lib/__test-utils__/CubeTestApplication.js.map +1 -1
- package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts +33 -0
- package/lib/__test-utils__/FakeCubeConnectionExplorer.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeConnectionExplorer.js +67 -0
- package/lib/__test-utils__/FakeCubeConnectionExplorer.js.map +1 -0
- package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts +45 -0
- package/lib/__test-utils__/FakeCubeDataProductCatalog.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeDataProductCatalog.js +137 -0
- package/lib/__test-utils__/FakeCubeDataProductCatalog.js.map +1 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts +2 -0
- package/lib/__test-utils__/FakeCubeEngine.d.ts.map +1 -1
- package/lib/__test-utils__/FakeCubeEngine.js +21 -2
- package/lib/__test-utils__/FakeCubeEngine.js.map +1 -1
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts +35 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.js +107 -0
- package/lib/__test-utils__/FakeCubeIngestCatalog.js.map +1 -0
- package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts +30 -0
- package/lib/__test-utils__/FakeCubeProjectCatalog.d.ts.map +1 -0
- package/lib/__test-utils__/FakeCubeProjectCatalog.js +64 -0
- package/lib/__test-utils__/FakeCubeProjectCatalog.js.map +1 -0
- package/lib/components/CubeAddItems.d.ts +35 -0
- package/lib/components/CubeAddItems.d.ts.map +1 -0
- package/lib/components/CubeAddItems.js +82 -0
- package/lib/components/CubeAddItems.js.map +1 -0
- package/lib/components/CubeEditor.d.ts +5 -1
- package/lib/components/CubeEditor.d.ts.map +1 -1
- package/lib/components/CubeEditor.js +33 -13
- package/lib/components/CubeEditor.js.map +1 -1
- package/lib/components/CubeEntrySourceBanner.d.ts +23 -0
- package/lib/components/CubeEntrySourceBanner.d.ts.map +1 -0
- package/lib/components/CubeEntrySourceBanner.js +32 -0
- package/lib/components/CubeEntrySourceBanner.js.map +1 -0
- package/lib/components/CubeNodeIcon.d.ts.map +1 -1
- package/lib/components/CubeNodeIcon.js +19 -2
- package/lib/components/CubeNodeIcon.js.map +1 -1
- package/lib/components/CubeSchemaColumnsTable.d.ts +21 -0
- package/lib/components/CubeSchemaColumnsTable.d.ts.map +1 -0
- package/lib/components/CubeSchemaColumnsTable.js +6 -0
- package/lib/components/CubeSchemaColumnsTable.js.map +1 -0
- package/lib/components/canvas/CubeCanvas.d.ts +4 -3
- package/lib/components/canvas/CubeCanvas.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvas.js +33 -12
- package/lib/components/canvas/CubeCanvas.js.map +1 -1
- package/lib/components/canvas/CubeCanvasContextMenu.d.ts +8 -4
- package/lib/components/canvas/CubeCanvasContextMenu.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasContextMenu.js +19 -9
- package/lib/components/canvas/CubeCanvasContextMenu.js.map +1 -1
- package/lib/components/canvas/CubeCanvasDnd.d.ts +7 -5
- package/lib/components/canvas/CubeCanvasDnd.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasDnd.js +14 -9
- package/lib/components/canvas/CubeCanvasDnd.js.map +1 -1
- package/lib/components/canvas/CubeCanvasElements.d.ts +2 -0
- package/lib/components/canvas/CubeCanvasElements.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasElements.js +8 -4
- package/lib/components/canvas/CubeCanvasElements.js.map +1 -1
- package/lib/components/canvas/CubeCanvasNode.d.ts.map +1 -1
- package/lib/components/canvas/CubeCanvasNode.js +30 -17
- package/lib/components/canvas/CubeCanvasNode.js.map +1 -1
- package/lib/components/canvas/CubeCanvasNodeFocus.d.ts +22 -0
- package/lib/components/canvas/CubeCanvasNodeFocus.d.ts.map +1 -0
- package/lib/components/canvas/CubeCanvasNodeFocus.js +31 -0
- package/lib/components/canvas/CubeCanvasNodeFocus.js.map +1 -0
- package/lib/components/canvas/CubeNodeEditorAnchor.d.ts +44 -0
- package/lib/components/canvas/CubeNodeEditorAnchor.d.ts.map +1 -0
- package/lib/components/canvas/CubeNodeEditorAnchor.js +51 -0
- package/lib/components/canvas/CubeNodeEditorAnchor.js.map +1 -0
- package/lib/components/editors/CubeAggregationRowEditor.d.ts +48 -0
- package/lib/components/editors/CubeAggregationRowEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeAggregationRowEditor.js +72 -0
- package/lib/components/editors/CubeAggregationRowEditor.js.map +1 -0
- package/lib/components/editors/CubeColumnChecklist.d.ts +42 -0
- package/lib/components/editors/CubeColumnChecklist.d.ts.map +1 -0
- package/lib/components/editors/CubeColumnChecklist.js +41 -0
- package/lib/components/editors/CubeColumnChecklist.js.map +1 -0
- package/lib/components/editors/CubeColumnPicker.d.ts +9 -2
- package/lib/components/editors/CubeColumnPicker.d.ts.map +1 -1
- package/lib/components/editors/CubeColumnPicker.js +9 -4
- package/lib/components/editors/CubeColumnPicker.js.map +1 -1
- package/lib/components/editors/CubeConcatEditor.d.ts +33 -0
- package/lib/components/editors/CubeConcatEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeConcatEditor.js +147 -0
- package/lib/components/editors/CubeConcatEditor.js.map +1 -0
- package/lib/components/editors/CubeDataProductSourceEditor.d.ts +25 -0
- package/lib/components/editors/CubeDataProductSourceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeDataProductSourceEditor.js +53 -0
- package/lib/components/editors/CubeDataProductSourceEditor.js.map +1 -0
- package/lib/components/editors/CubeDifferenceEditor.d.ts +25 -0
- package/lib/components/editors/CubeDifferenceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeDifferenceEditor.js +29 -0
- package/lib/components/editors/CubeDifferenceEditor.js.map +1 -0
- package/lib/components/editors/CubeDistinctEditor.d.ts +23 -0
- package/lib/components/editors/CubeDistinctEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeDistinctEditor.js +24 -0
- package/lib/components/editors/CubeDistinctEditor.js.map +1 -0
- package/lib/components/editors/CubeExtendEditor.d.ts +25 -0
- package/lib/components/editors/CubeExtendEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeExtendEditor.js +86 -0
- package/lib/components/editors/CubeExtendEditor.js.map +1 -0
- package/lib/components/editors/CubeFilterEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeFilterEditor.js +3 -3
- package/lib/components/editors/CubeFilterEditor.js.map +1 -1
- package/lib/components/editors/CubeGroupEditor.d.ts +28 -0
- package/lib/components/editors/CubeGroupEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeGroupEditor.js +70 -0
- package/lib/components/editors/CubeGroupEditor.js.map +1 -0
- package/lib/components/editors/CubeIngestSourceEditor.d.ts +26 -0
- package/lib/components/editors/CubeIngestSourceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeIngestSourceEditor.js +47 -0
- package/lib/components/editors/CubeIngestSourceEditor.js.map +1 -0
- package/lib/components/editors/CubeIntegerField.d.ts +29 -0
- package/lib/components/editors/CubeIntegerField.d.ts.map +1 -0
- package/lib/components/editors/CubeIntegerField.js +30 -0
- package/lib/components/editors/CubeIntegerField.js.map +1 -0
- package/lib/components/editors/CubeJoinEditor.d.ts +2 -4
- package/lib/components/editors/CubeJoinEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeJoinEditor.js +15 -37
- package/lib/components/editors/CubeJoinEditor.js.map +1 -1
- package/lib/components/editors/CubeJoinKeyRows.d.ts +34 -0
- package/lib/components/editors/CubeJoinKeyRows.d.ts.map +1 -0
- package/lib/components/editors/CubeJoinKeyRows.js +65 -0
- package/lib/components/editors/CubeJoinKeyRows.js.map +1 -0
- package/lib/components/editors/CubeNodeEditorPanel.d.ts +7 -5
- package/lib/components/editors/CubeNodeEditorPanel.d.ts.map +1 -1
- package/lib/components/editors/CubeNodeEditorPanel.js +53 -14
- package/lib/components/editors/CubeNodeEditorPanel.js.map +1 -1
- package/lib/components/editors/CubeNodeEditorPopper.d.ts +40 -0
- package/lib/components/editors/CubeNodeEditorPopper.d.ts.map +1 -0
- package/lib/components/editors/CubeNodeEditorPopper.js +125 -0
- package/lib/components/editors/CubeNodeEditorPopper.js.map +1 -0
- package/lib/components/editors/CubeNodeEditorRegistry.d.ts.map +1 -1
- package/lib/components/editors/CubeNodeEditorRegistry.js +28 -1
- package/lib/components/editors/CubeNodeEditorRegistry.js.map +1 -1
- package/lib/components/editors/CubePartitionEditor.d.ts +30 -0
- package/lib/components/editors/CubePartitionEditor.d.ts.map +1 -0
- package/lib/components/editors/CubePartitionEditor.js +93 -0
- package/lib/components/editors/CubePartitionEditor.js.map +1 -0
- package/lib/components/editors/CubeRenameEditor.d.ts +26 -0
- package/lib/components/editors/CubeRenameEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeRenameEditor.js +60 -0
- package/lib/components/editors/CubeRenameEditor.js.map +1 -0
- package/lib/components/editors/CubeRestrictEditor.d.ts +26 -0
- package/lib/components/editors/CubeRestrictEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeRestrictEditor.js +23 -0
- package/lib/components/editors/CubeRestrictEditor.js.map +1 -0
- package/lib/components/editors/CubeRowCountEditor.d.ts +25 -0
- package/lib/components/editors/CubeRowCountEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeRowCountEditor.js +38 -0
- package/lib/components/editors/CubeRowCountEditor.js.map +1 -0
- package/lib/components/editors/CubeSliceEditor.d.ts +25 -0
- package/lib/components/editors/CubeSliceEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeSliceEditor.js +40 -0
- package/lib/components/editors/CubeSliceEditor.js.map +1 -0
- package/lib/components/editors/CubeSortEditor.d.ts +27 -0
- package/lib/components/editors/CubeSortEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeSortEditor.js +45 -0
- package/lib/components/editors/CubeSortEditor.js.map +1 -0
- package/lib/components/editors/CubeSortRowEditor.d.ts +47 -0
- package/lib/components/editors/CubeSortRowEditor.d.ts.map +1 -0
- package/lib/components/editors/CubeSortRowEditor.js +62 -0
- package/lib/components/editors/CubeSortRowEditor.js.map +1 -0
- package/lib/components/editors/CubeSourceEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeSourceEditor.js +18 -6
- package/lib/components/editors/CubeSourceEditor.js.map +1 -1
- package/lib/components/editors/CubeValueEditor.d.ts.map +1 -1
- package/lib/components/editors/CubeValueEditor.js +2 -1
- package/lib/components/editors/CubeValueEditor.js.map +1 -1
- package/lib/components/editors/CubeWarehouseControl.d.ts +30 -0
- package/lib/components/editors/CubeWarehouseControl.d.ts.map +1 -0
- package/lib/components/editors/CubeWarehouseControl.js +44 -0
- package/lib/components/editors/CubeWarehouseControl.js.map +1 -0
- package/lib/components/editors/useCubeNodeEditorDismiss.d.ts +31 -0
- package/lib/components/editors/useCubeNodeEditorDismiss.d.ts.map +1 -0
- package/lib/components/editors/useCubeNodeEditorDismiss.js +83 -0
- package/lib/components/editors/useCubeNodeEditorDismiss.js.map +1 -0
- package/lib/components/examples/CubeExamplesDialog.d.ts +26 -0
- package/lib/components/examples/CubeExamplesDialog.d.ts.map +1 -0
- package/lib/components/examples/CubeExamplesDialog.js +68 -0
- package/lib/components/examples/CubeExamplesDialog.js.map +1 -0
- package/lib/components/grid/CubeGridRegion.d.ts.map +1 -1
- package/lib/components/grid/CubeGridRegion.js +20 -9
- package/lib/components/grid/CubeGridRegion.js.map +1 -1
- package/lib/components/grid/CubeGridValues.d.ts +16 -0
- package/lib/components/grid/CubeGridValues.d.ts.map +1 -1
- package/lib/components/grid/CubeGridValues.js +44 -0
- package/lib/components/grid/CubeGridValues.js.map +1 -1
- package/lib/components/grid/CubeResultGrid.d.ts +14 -1
- package/lib/components/grid/CubeResultGrid.d.ts.map +1 -1
- package/lib/components/grid/CubeResultGrid.js +55 -7
- package/lib/components/grid/CubeResultGrid.js.map +1 -1
- package/lib/components/palette/CubePalette.d.ts.map +1 -1
- package/lib/components/palette/CubePalette.js +23 -12
- package/lib/components/palette/CubePalette.js.map +1 -1
- package/lib/components/source-picker/CubeDataProductTab.d.ts +27 -0
- package/lib/components/source-picker/CubeDataProductTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeDataProductTab.js +102 -0
- package/lib/components/source-picker/CubeDataProductTab.js.map +1 -0
- package/lib/components/source-picker/CubeDirectConnectionTab.d.ts +27 -0
- package/lib/components/source-picker/CubeDirectConnectionTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeDirectConnectionTab.js +87 -0
- package/lib/components/source-picker/CubeDirectConnectionTab.js.map +1 -0
- package/lib/components/source-picker/CubeIngestTab.d.ts +28 -0
- package/lib/components/source-picker/CubeIngestTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeIngestTab.js +66 -0
- package/lib/components/source-picker/CubeIngestTab.js.map +1 -0
- package/lib/components/source-picker/CubeInlineModelTab.d.ts +37 -0
- package/lib/components/source-picker/CubeInlineModelTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeInlineModelTab.js +71 -0
- package/lib/components/source-picker/CubeInlineModelTab.js.map +1 -0
- package/lib/components/source-picker/CubePickerStep.d.ts +27 -0
- package/lib/components/source-picker/CubePickerStep.d.ts.map +1 -0
- package/lib/components/source-picker/CubePickerStep.js +23 -0
- package/lib/components/source-picker/CubePickerStep.js.map +1 -0
- package/lib/components/source-picker/CubeProjectTab.d.ts +27 -0
- package/lib/components/source-picker/CubeProjectTab.d.ts.map +1 -0
- package/lib/components/source-picker/CubeProjectTab.js +50 -0
- package/lib/components/source-picker/CubeProjectTab.js.map +1 -0
- package/lib/components/source-picker/CubeSourcePicker.d.ts +6 -0
- package/lib/components/source-picker/CubeSourcePicker.d.ts.map +1 -1
- package/lib/components/source-picker/CubeSourcePicker.js +20 -58
- package/lib/components/source-picker/CubeSourcePicker.js.map +1 -1
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js +1 -1
- package/lib/components/spec-transfer/CubeSpecTransferDialog.js.map +1 -1
- package/lib/graph-manager/CubeConnectionExplorer.d.ts +90 -0
- package/lib/graph-manager/CubeConnectionExplorer.d.ts.map +1 -0
- package/lib/graph-manager/CubeConnectionExplorer.js +34 -0
- package/lib/graph-manager/CubeConnectionExplorer.js.map +1 -0
- package/lib/graph-manager/CubeDataProduct.d.ts +66 -0
- package/lib/graph-manager/CubeDataProduct.d.ts.map +1 -0
- package/lib/graph-manager/CubeDataProduct.js +102 -0
- package/lib/graph-manager/CubeDataProduct.js.map +1 -0
- package/lib/graph-manager/CubeDataProductCatalog.d.ts +167 -0
- package/lib/graph-manager/CubeDataProductCatalog.d.ts.map +1 -0
- package/lib/graph-manager/CubeDataProductCatalog.js +116 -0
- package/lib/graph-manager/CubeDataProductCatalog.js.map +1 -0
- package/lib/graph-manager/CubeDirectConnection.d.ts +38 -0
- package/lib/graph-manager/CubeDirectConnection.d.ts.map +1 -0
- package/lib/graph-manager/CubeDirectConnection.js +48 -0
- package/lib/graph-manager/CubeDirectConnection.js.map +1 -0
- package/lib/graph-manager/CubeEngine.d.ts +50 -2
- package/lib/graph-manager/CubeEngine.d.ts.map +1 -1
- package/lib/graph-manager/CubeEngine.js +4 -1
- package/lib/graph-manager/CubeEngine.js.map +1 -1
- package/lib/graph-manager/CubeIngest.d.ts +50 -0
- package/lib/graph-manager/CubeIngest.d.ts.map +1 -0
- package/lib/graph-manager/CubeIngest.js +88 -0
- package/lib/graph-manager/CubeIngest.js.map +1 -0
- package/lib/graph-manager/CubeIngestCatalog.d.ts +116 -0
- package/lib/graph-manager/CubeIngestCatalog.d.ts.map +1 -0
- package/lib/graph-manager/CubeIngestCatalog.js +80 -0
- package/lib/graph-manager/CubeIngestCatalog.js.map +1 -0
- package/lib/graph-manager/CubeLakehouseEnvironment.d.ts +26 -0
- package/lib/graph-manager/CubeLakehouseEnvironment.d.ts.map +1 -0
- package/lib/graph-manager/CubeLakehouseEnvironment.js +17 -0
- package/lib/graph-manager/CubeLakehouseEnvironment.js.map +1 -0
- package/lib/graph-manager/CubeModelOutlineHelper.d.ts +8 -0
- package/lib/graph-manager/CubeModelOutlineHelper.d.ts.map +1 -1
- package/lib/graph-manager/CubeModelOutlineHelper.js +21 -0
- package/lib/graph-manager/CubeModelOutlineHelper.js.map +1 -1
- package/lib/graph-manager/CubeProject.d.ts +41 -0
- package/lib/graph-manager/CubeProject.d.ts.map +1 -0
- package/lib/graph-manager/CubeProject.js +84 -0
- package/lib/graph-manager/CubeProject.js.map +1 -0
- package/lib/graph-manager/CubeProjectCatalog.d.ts +35 -0
- package/lib/graph-manager/CubeProjectCatalog.d.ts.map +1 -0
- package/lib/graph-manager/CubeProjectCatalog.js +17 -0
- package/lib/graph-manager/CubeProjectCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts +63 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js +50 -1
- package/lib/graph-manager/protocol/pure/CubeEngineBuilder.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts +44 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js +192 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts +29 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js +84 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts +41 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js +246 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts +43 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js +112 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeDirectModel.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js +30 -4
- package/lib/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts +23 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js +68 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeExpression.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts +30 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js +140 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts +62 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js +119 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeIngestModel.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts +33 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js +94 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js +63 -4
- package/lib/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js +56 -3
- package/lib/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts +67 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js +238 -0
- package/lib/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts +34 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js +64 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts +104 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js +484 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts +97 -3
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js +585 -20
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts +69 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js +270 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts +35 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js +91 -0
- package/lib/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts +25 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js +47 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts +28 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js +310 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts +33 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.d.ts.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js +188 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.js.map +1 -0
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts +1 -1
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js +30 -4
- package/lib/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +11 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -1
- package/lib/index.js.map +1 -1
- package/lib/stores/CubeAddPlacement.d.ts +32 -0
- package/lib/stores/CubeAddPlacement.d.ts.map +1 -0
- package/lib/stores/CubeAddPlacement.js +40 -0
- package/lib/stores/CubeAddPlacement.js.map +1 -0
- package/lib/stores/CubeDataProductRecheck.d.ts +27 -0
- package/lib/stores/CubeDataProductRecheck.d.ts.map +1 -0
- package/lib/stores/CubeDataProductRecheck.js +54 -0
- package/lib/stores/CubeDataProductRecheck.js.map +1 -0
- package/lib/stores/CubeDataProductRuntimeState.d.ts +88 -0
- package/lib/stores/CubeDataProductRuntimeState.d.ts.map +1 -0
- package/lib/stores/CubeDataProductRuntimeState.js +190 -0
- package/lib/stores/CubeDataProductRuntimeState.js.map +1 -0
- package/lib/stores/CubeDataProductWarehouse.d.ts +19 -0
- package/lib/stores/CubeDataProductWarehouse.d.ts.map +1 -0
- package/lib/stores/CubeDataProductWarehouse.js +25 -0
- package/lib/stores/CubeDataProductWarehouse.js.map +1 -0
- package/lib/stores/CubeEditorState.d.ts +133 -19
- package/lib/stores/CubeEditorState.d.ts.map +1 -1
- package/lib/stores/CubeEditorState.js +433 -52
- package/lib/stores/CubeEditorState.js.map +1 -1
- package/lib/stores/CubeEntrySource.d.ts +78 -0
- package/lib/stores/CubeEntrySource.d.ts.map +1 -0
- package/lib/stores/CubeEntrySource.js +200 -0
- package/lib/stores/CubeEntrySource.js.map +1 -0
- package/lib/stores/CubeExamples.d.ts +43 -0
- package/lib/stores/CubeExamples.d.ts.map +1 -0
- package/lib/stores/CubeExamples.js +296 -0
- package/lib/stores/CubeExamples.js.map +1 -0
- package/lib/stores/CubeExamplesState.d.ts +45 -0
- package/lib/stores/CubeExamplesState.d.ts.map +1 -0
- package/lib/stores/CubeExamplesState.js +81 -0
- package/lib/stores/CubeExamplesState.js.map +1 -0
- package/lib/stores/CubeExecutionState.d.ts +6 -2
- package/lib/stores/CubeExecutionState.d.ts.map +1 -1
- package/lib/stores/CubeExecutionState.js +34 -8
- package/lib/stores/CubeExecutionState.js.map +1 -1
- package/lib/stores/CubeExtendTyping.d.ts +72 -0
- package/lib/stores/CubeExtendTyping.d.ts.map +1 -0
- package/lib/stores/CubeExtendTyping.js +176 -0
- package/lib/stores/CubeExtendTyping.js.map +1 -0
- package/lib/stores/CubeGridQuickActions.d.ts +48 -0
- package/lib/stores/CubeGridQuickActions.d.ts.map +1 -0
- package/lib/stores/CubeGridQuickActions.js +124 -0
- package/lib/stores/CubeGridQuickActions.js.map +1 -0
- package/lib/stores/CubeHost.d.ts +32 -1
- package/lib/stores/CubeHost.d.ts.map +1 -1
- package/lib/stores/CubeHost.js +21 -1
- package/lib/stores/CubeHost.js.map +1 -1
- package/lib/stores/CubeIngestRecheck.d.ts +26 -0
- package/lib/stores/CubeIngestRecheck.d.ts.map +1 -0
- package/lib/stores/CubeIngestRecheck.js +53 -0
- package/lib/stores/CubeIngestRecheck.js.map +1 -0
- package/lib/stores/CubeNodeEditorState.d.ts +120 -6
- package/lib/stores/CubeNodeEditorState.d.ts.map +1 -1
- package/lib/stores/CubeNodeEditorState.js +275 -9
- package/lib/stores/CubeNodeEditorState.js.map +1 -1
- package/lib/stores/CubeShowPureState.d.ts +9 -3
- package/lib/stores/CubeShowPureState.d.ts.map +1 -1
- package/lib/stores/CubeShowPureState.js +28 -8
- package/lib/stores/CubeShowPureState.js.map +1 -1
- package/lib/stores/CubeSourcePickerState.d.ts +54 -65
- package/lib/stores/CubeSourcePickerState.d.ts.map +1 -1
- package/lib/stores/CubeSourcePickerState.js +155 -276
- package/lib/stores/CubeSourcePickerState.js.map +1 -1
- package/lib/stores/CubeSpecTransferState.d.ts +2 -2
- package/lib/stores/CubeSpecTransferState.js +2 -2
- package/lib/stores/LocalModelCatalog.d.ts +2 -0
- package/lib/stores/LocalModelCatalog.d.ts.map +1 -1
- package/lib/stores/LocalModelCatalog.js +17 -3
- package/lib/stores/LocalModelCatalog.js.map +1 -1
- package/lib/stores/editors/CubeAggregationRows.d.ts +80 -0
- package/lib/stores/editors/CubeAggregationRows.d.ts.map +1 -0
- package/lib/stores/editors/CubeAggregationRows.js +164 -0
- package/lib/stores/editors/CubeAggregationRows.js.map +1 -0
- package/lib/stores/editors/CubeConcatDraft.d.ts +30 -0
- package/lib/stores/editors/CubeConcatDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeConcatDraft.js +44 -0
- package/lib/stores/editors/CubeConcatDraft.js.map +1 -0
- package/lib/stores/editors/CubeDifferenceDraft.d.ts +49 -0
- package/lib/stores/editors/CubeDifferenceDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeDifferenceDraft.js +111 -0
- package/lib/stores/editors/CubeDifferenceDraft.js.map +1 -0
- package/lib/stores/editors/CubeExtendDraft.d.ts +110 -0
- package/lib/stores/editors/CubeExtendDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeExtendDraft.js +359 -0
- package/lib/stores/editors/CubeExtendDraft.js.map +1 -0
- package/lib/stores/editors/CubeGroupDraft.d.ts +61 -0
- package/lib/stores/editors/CubeGroupDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeGroupDraft.js +106 -0
- package/lib/stores/editors/CubeGroupDraft.js.map +1 -0
- package/lib/stores/editors/CubeIntegerText.d.ts +24 -0
- package/lib/stores/editors/CubeIntegerText.d.ts.map +1 -0
- package/lib/stores/editors/CubeIntegerText.js +33 -0
- package/lib/stores/editors/CubeIntegerText.js.map +1 -0
- package/lib/stores/editors/CubeJoinDraft.d.ts +20 -13
- package/lib/stores/editors/CubeJoinDraft.d.ts.map +1 -1
- package/lib/stores/editors/CubeJoinDraft.js +109 -29
- package/lib/stores/editors/CubeJoinDraft.js.map +1 -1
- package/lib/stores/editors/CubeJoinKeyPairs.d.ts +38 -0
- package/lib/stores/editors/CubeJoinKeyPairs.d.ts.map +1 -0
- package/lib/stores/editors/CubeJoinKeyPairs.js +33 -0
- package/lib/stores/editors/CubeJoinKeyPairs.js.map +1 -0
- package/lib/stores/editors/CubeNodeDraft.d.ts +20 -6
- package/lib/stores/editors/CubeNodeDraft.d.ts.map +1 -1
- package/lib/stores/editors/CubeNodeDraft.js +23 -5
- package/lib/stores/editors/CubeNodeDraft.js.map +1 -1
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts +6 -0
- package/lib/stores/editors/CubeNodeDraftRegistry.d.ts.map +1 -1
- package/lib/stores/editors/CubeNodeDraftRegistry.js +42 -1
- package/lib/stores/editors/CubeNodeDraftRegistry.js.map +1 -1
- package/lib/stores/editors/CubePartitionDraft.d.ts +70 -0
- package/lib/stores/editors/CubePartitionDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubePartitionDraft.js +154 -0
- package/lib/stores/editors/CubePartitionDraft.js.map +1 -0
- package/lib/stores/editors/CubeRenameDraft.d.ts +44 -0
- package/lib/stores/editors/CubeRenameDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeRenameDraft.js +79 -0
- package/lib/stores/editors/CubeRenameDraft.js.map +1 -0
- package/lib/stores/editors/CubeRestrictDraft.d.ts +37 -0
- package/lib/stores/editors/CubeRestrictDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeRestrictDraft.js +73 -0
- package/lib/stores/editors/CubeRestrictDraft.js.map +1 -0
- package/lib/stores/editors/CubeRowCountDraft.d.ts +42 -0
- package/lib/stores/editors/CubeRowCountDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeRowCountDraft.js +55 -0
- package/lib/stores/editors/CubeRowCountDraft.js.map +1 -0
- package/lib/stores/editors/CubeSliceDraft.d.ts +42 -0
- package/lib/stores/editors/CubeSliceDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeSliceDraft.js +72 -0
- package/lib/stores/editors/CubeSliceDraft.js.map +1 -0
- package/lib/stores/editors/CubeSortDraft.d.ts +41 -0
- package/lib/stores/editors/CubeSortDraft.d.ts.map +1 -0
- package/lib/stores/editors/CubeSortDraft.js +73 -0
- package/lib/stores/editors/CubeSortDraft.js.map +1 -0
- package/lib/stores/editors/CubeSortRows.d.ts +34 -0
- package/lib/stores/editors/CubeSortRows.d.ts.map +1 -0
- package/lib/stores/editors/CubeSortRows.js +50 -0
- package/lib/stores/editors/CubeSortRows.js.map +1 -0
- package/lib/stores/fixtures/CubeNorthwindModel.d.ts +7 -0
- package/lib/stores/fixtures/CubeNorthwindModel.d.ts.map +1 -1
- package/lib/stores/fixtures/CubeNorthwindModel.js +99 -87
- package/lib/stores/fixtures/CubeNorthwindModel.js.map +1 -1
- package/lib/stores/fixtures/CubeSampleSql.d.ts +34 -0
- package/lib/stores/fixtures/CubeSampleSql.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeSampleSql.js +64 -0
- package/lib/stores/fixtures/CubeSampleSql.js.map +1 -0
- package/lib/stores/fixtures/CubeSportsModel.d.ts +27 -0
- package/lib/stores/fixtures/CubeSportsModel.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeSportsModel.js +158 -0
- package/lib/stores/fixtures/CubeSportsModel.js.map +1 -0
- package/lib/stores/fixtures/CubeTradesModel.d.ts +29 -0
- package/lib/stores/fixtures/CubeTradesModel.d.ts.map +1 -0
- package/lib/stores/fixtures/CubeTradesModel.js +197 -0
- package/lib/stores/fixtures/CubeTradesModel.js.map +1 -0
- package/lib/stores/source-picker/CubeCsvSetupSql.d.ts +71 -0
- package/lib/stores/source-picker/CubeCsvSetupSql.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeCsvSetupSql.js +392 -0
- package/lib/stores/source-picker/CubeCsvSetupSql.js.map +1 -0
- package/lib/stores/source-picker/CubeDataProductTabState.d.ts +186 -0
- package/lib/stores/source-picker/CubeDataProductTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeDataProductTabState.js +681 -0
- package/lib/stores/source-picker/CubeDataProductTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts +140 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js +516 -0
- package/lib/stores/source-picker/CubeDirectConnectionTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeIngestTabState.d.ts +114 -0
- package/lib/stores/source-picker/CubeIngestTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeIngestTabState.js +455 -0
- package/lib/stores/source-picker/CubeIngestTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts +107 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.js +347 -0
- package/lib/stores/source-picker/CubeInlineModelTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeProjectTabState.d.ts +62 -0
- package/lib/stores/source-picker/CubeProjectTabState.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeProjectTabState.js +181 -0
- package/lib/stores/source-picker/CubeProjectTabState.js.map +1 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts +48 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.d.ts.map +1 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.js +24 -0
- package/lib/stores/source-picker/CubeSourcePickerTab.js.map +1 -0
- package/package.json +12 -8
- package/src/__lib__/LegendCubeCommand.ts +5 -0
- package/src/__lib__/LegendCubeDataProductLabels.ts +91 -0
- package/src/__lib__/LegendCubeDirectConnectionLabels.ts +111 -0
- package/src/__lib__/LegendCubeHelpText.ts +46 -2
- package/src/__lib__/LegendCubeIngestLabels.ts +40 -0
- package/src/__lib__/LegendCubeLabels.ts +192 -4
- package/src/__lib__/LegendCubeProjectLabels.ts +25 -0
- package/src/__lib__/LegendCubeTesting.ts +1 -0
- package/src/__test-utils__/CubeCanvasTestUtils.ts +1 -1
- package/src/__test-utils__/CubeConnectionTestSupport.ts +45 -0
- package/src/__test-utils__/CubeDirectConnectionFixtures.ts +70 -0
- package/src/__test-utils__/CubeEngineTestSupport.ts +73 -0
- package/src/__test-utils__/CubeExpressionTestUtils.ts +119 -0
- package/src/__test-utils__/CubeOperationsTestUtils.ts +252 -0
- package/src/__test-utils__/CubePageTestUtils.tsx +35 -0
- package/src/__test-utils__/CubeTestApplication.ts +21 -2
- package/src/__test-utils__/FakeCubeConnectionExplorer.ts +111 -0
- package/src/__test-utils__/FakeCubeDataProductCatalog.ts +227 -0
- package/src/__test-utils__/FakeCubeEngine.ts +32 -2
- package/src/__test-utils__/FakeCubeIngestCatalog.ts +180 -0
- package/src/__test-utils__/FakeCubeProjectCatalog.ts +89 -0
- package/src/components/CubeAddItems.tsx +179 -0
- package/src/components/CubeEditor.tsx +73 -44
- package/src/components/CubeEntrySourceBanner.tsx +64 -0
- package/src/components/CubeNodeIcon.tsx +31 -1
- package/src/components/CubeSchemaColumnsTable.tsx +49 -0
- package/src/components/canvas/CubeCanvas.tsx +51 -14
- package/src/components/canvas/CubeCanvasContextMenu.tsx +31 -30
- package/src/components/canvas/CubeCanvasDnd.ts +16 -9
- package/src/components/canvas/CubeCanvasElements.ts +12 -3
- package/src/components/canvas/CubeCanvasNode.tsx +62 -36
- package/src/components/canvas/CubeCanvasNodeFocus.ts +37 -0
- package/src/components/canvas/CubeNodeEditorAnchor.ts +82 -0
- package/src/components/editors/CubeAggregationRowEditor.tsx +224 -0
- package/src/components/editors/CubeColumnChecklist.tsx +130 -0
- package/src/components/editors/CubeColumnPicker.tsx +36 -12
- package/src/components/editors/CubeConcatEditor.tsx +374 -0
- package/src/components/editors/CubeDataProductSourceEditor.tsx +134 -0
- package/src/components/editors/CubeDifferenceEditor.tsx +87 -0
- package/src/components/editors/CubeDistinctEditor.tsx +28 -0
- package/src/components/editors/CubeExtendEditor.tsx +271 -0
- package/src/components/editors/CubeFilterEditor.tsx +7 -0
- package/src/components/editors/CubeGroupEditor.tsx +135 -0
- package/src/components/editors/CubeIngestSourceEditor.tsx +104 -0
- package/src/components/editors/CubeIntegerField.tsx +51 -0
- package/src/components/editors/CubeJoinEditor.tsx +34 -131
- package/src/components/editors/CubeJoinKeyRows.tsx +183 -0
- package/src/components/editors/CubeNodeEditorPanel.tsx +103 -29
- package/src/components/editors/CubeNodeEditorPopper.tsx +183 -0
- package/src/components/editors/CubeNodeEditorRegistry.ts +41 -0
- package/src/components/editors/CubePartitionEditor.tsx +208 -0
- package/src/components/editors/CubeRenameEditor.tsx +148 -0
- package/src/components/editors/CubeRestrictEditor.tsx +103 -0
- package/src/components/editors/CubeRowCountEditor.tsx +53 -0
- package/src/components/editors/CubeSliceEditor.tsx +69 -0
- package/src/components/editors/CubeSortEditor.tsx +84 -0
- package/src/components/editors/CubeSortRowEditor.tsx +176 -0
- package/src/components/editors/CubeSourceEditor.tsx +42 -40
- package/src/components/editors/CubeValueEditor.tsx +2 -1
- package/src/components/editors/CubeWarehouseControl.tsx +113 -0
- package/src/components/editors/useCubeNodeEditorDismiss.ts +103 -0
- package/src/components/examples/CubeExamplesDialog.tsx +199 -0
- package/src/components/grid/CubeGridRegion.tsx +49 -10
- package/src/components/grid/CubeGridValues.ts +55 -0
- package/src/components/grid/CubeResultGrid.tsx +83 -13
- package/src/components/palette/CubePalette.tsx +33 -15
- package/src/components/source-picker/CubeDataProductTab.tsx +392 -0
- package/src/components/source-picker/CubeDirectConnectionTab.tsx +340 -0
- package/src/components/source-picker/CubeIngestTab.tsx +232 -0
- package/src/components/source-picker/CubeInlineModelTab.tsx +191 -0
- package/src/components/source-picker/CubePickerStep.tsx +49 -0
- package/src/components/source-picker/CubeProjectTab.tsx +114 -0
- package/src/components/source-picker/CubeSourcePicker.tsx +62 -227
- package/src/components/spec-transfer/CubeSpecTransferDialog.tsx +1 -1
- package/src/graph-manager/CubeConnectionExplorer.ts +106 -0
- package/src/graph-manager/CubeDataProduct.ts +150 -0
- package/src/graph-manager/CubeDataProductCatalog.ts +245 -0
- package/src/graph-manager/CubeDirectConnection.ts +67 -0
- package/src/graph-manager/CubeEngine.ts +57 -1
- package/src/graph-manager/CubeIngest.ts +144 -0
- package/src/graph-manager/CubeIngestCatalog.ts +169 -0
- package/src/graph-manager/CubeLakehouseEnvironment.ts +27 -0
- package/src/graph-manager/CubeModelOutlineHelper.ts +26 -0
- package/src/graph-manager/CubeProject.ts +117 -0
- package/src/graph-manager/CubeProjectCatalog.ts +40 -0
- package/src/graph-manager/protocol/pure/CubeEngineBuilder.ts +145 -1
- package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductArtifact.ts +251 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeDataProductModel.ts +101 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeDirectConnection.ts +339 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeDirectModel.ts +151 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeEngineErrors.ts +45 -4
- package/src/graph-manager/protocol/pure/v1/V1_CubeExpression.ts +89 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeIngestDefinition.ts +201 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeIngestModel.ts +183 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLakehouseEnvironmentResolver.ts +141 -0
- package/src/graph-manager/protocol/pure/v1/V1_CubeLambdaSerializer.ts +84 -4
- package/src/graph-manager/protocol/pure/v1/V1_CubeModelOutlineBuilder.ts +89 -3
- package/src/graph-manager/protocol/pure/v1/V1_CubeSchemaExploration.ts +361 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeConnectionExplorer.ts +116 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeDataProductCatalog.ts +744 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeEngine.ts +967 -24
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeIngestCatalog.ts +459 -0
- package/src/graph-manager/protocol/pure/v1/V1_LegendCubeProjectCatalog.ts +147 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeConnectionExplorerTestUtils.ts +61 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductFixtures.ts +337 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeDataProductSearchFixtures.ts +206 -0
- package/src/graph-manager/protocol/pure/v1/__test-utils__/V1_CubeEngineTestUtils.ts +48 -4
- package/src/index.ts +20 -0
- package/src/stores/CubeAddPlacement.ts +67 -0
- package/src/stores/CubeDataProductRecheck.ts +93 -0
- package/src/stores/CubeDataProductRuntimeState.ts +256 -0
- package/src/stores/CubeDataProductWarehouse.ts +40 -0
- package/src/stores/CubeEditorState.ts +621 -68
- package/src/stores/CubeEntrySource.ts +278 -0
- package/src/stores/CubeExamples.ts +457 -0
- package/src/stores/CubeExamplesState.ts +108 -0
- package/src/stores/CubeExecutionState.ts +60 -8
- package/src/stores/CubeExtendTyping.ts +291 -0
- package/src/stores/CubeGridQuickActions.ts +184 -0
- package/src/stores/CubeHost.ts +71 -1
- package/src/stores/CubeIngestRecheck.ts +92 -0
- package/src/stores/CubeNodeEditorState.ts +348 -10
- package/src/stores/CubeShowPureState.ts +33 -8
- package/src/stores/CubeSourcePickerState.ts +160 -330
- package/src/stores/CubeSpecTransferState.ts +2 -2
- package/src/stores/LocalModelCatalog.ts +22 -3
- package/src/stores/editors/CubeAggregationRows.ts +299 -0
- package/src/stores/editors/CubeConcatDraft.ts +49 -0
- package/src/stores/editors/CubeDifferenceDraft.ts +147 -0
- package/src/stores/editors/CubeExtendDraft.ts +532 -0
- package/src/stores/editors/CubeGroupDraft.ts +145 -0
- package/src/stores/editors/CubeIntegerText.ts +34 -0
- package/src/stores/editors/CubeJoinDraft.ts +170 -54
- package/src/stores/editors/CubeJoinKeyPairs.ts +68 -0
- package/src/stores/editors/CubeNodeDraft.ts +26 -6
- package/src/stores/editors/CubeNodeDraftRegistry.ts +60 -1
- package/src/stores/editors/CubePartitionDraft.ts +214 -0
- package/src/stores/editors/CubeRenameDraft.ts +110 -0
- package/src/stores/editors/CubeRestrictDraft.ts +83 -0
- package/src/stores/editors/CubeRowCountDraft.ts +69 -0
- package/src/stores/editors/CubeSliceDraft.ts +87 -0
- package/src/stores/editors/CubeSortDraft.ts +98 -0
- package/src/stores/editors/CubeSortRows.ts +84 -0
- package/src/stores/fixtures/CubeNorthwindModel.ts +103 -88
- package/src/stores/fixtures/CubeSampleSql.ts +85 -0
- package/src/stores/fixtures/CubeSportsModel.ts +182 -0
- package/src/stores/fixtures/CubeTradesModel.ts +241 -0
- package/src/stores/source-picker/CubeCsvSetupSql.ts +444 -0
- package/src/stores/source-picker/CubeDataProductTabState.ts +839 -0
- package/src/stores/source-picker/CubeDirectConnectionTabState.ts +647 -0
- package/src/stores/source-picker/CubeIngestTabState.ts +551 -0
- package/src/stores/source-picker/CubeInlineModelTabState.ts +448 -0
- package/src/stores/source-picker/CubeProjectTabState.ts +218 -0
- package/src/stores/source-picker/CubeSourcePickerTab.ts +50 -0
- package/tsconfig.json +104 -0
package/README.md
CHANGED
|
@@ -3,4 +3,96 @@
|
|
|
3
3
|
The UI and the Legend engine adapter of Legend Cube, a canvas-based visual query builder. The domain model lives in the
|
|
4
4
|
host-free [`@finos/legend-cube`](../legend-cube).
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
It holds the page (the canvas, the palette, the side-panel editors, the source picker and the results grid), its MobX
|
|
7
|
+
stores, the engine port with its `v1/` adapter, and the bundled model catalog. Legend Query hosts the page at
|
|
8
|
+
`/query/cube`.
|
|
9
|
+
|
|
10
|
+
**Status:** work in progress, version 0.0.x. This version has relational tables (from a model or a direct connection to H2
|
|
11
|
+
or DuckDB), the access points of deployed data products and the data sets of deployed ingest definitions (both beta),
|
|
12
|
+
Join, Sort, Group, Filter, Restrict, Rename, Distinct, Drop, Limit, Slice, Concat, Compare Column Values (Difference),
|
|
13
|
+
window functions (Apply Window Functions) and computed columns (Extend Columns, whose expressions the engine checks), with one model, one runtime and one database, data product project or producer deployment per query. A cube is kept only through Export and Import of its spec, marked "(dev)", until
|
|
14
|
+
the Cube store exists. A pasted model is kept in the cube. Nothing links to the page yet, there is no redo, and Cube sends no telemetry.
|
|
15
|
+
|
|
16
|
+
## Layout
|
|
17
|
+
|
|
18
|
+
| Folder | Holds |
|
|
19
|
+
| ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
20
|
+
| `src/components/` | the page, `CubeEditor`, and its parts: `canvas/`, `palette/`, `editors/`, `source-picker/`, `grid/`, `show-pure/`, `spec-transfer/` |
|
|
21
|
+
| `src/stores/` | the MobX state of the page, its parts and the node editor; `editors/` (node drafts); `LocalModelCatalog` and `fixtures/` (the bundled model); `CubeHost` |
|
|
22
|
+
| `src/graph-manager/` | the engine port (`CubeEngine.ts`), the connection explorer, data product catalog and ingest catalog ports, and their builders |
|
|
23
|
+
| `src/graph-manager/protocol/pure/v1/` | the engine adapter, `V1_LegendCubeEngine`: the lambda serializer, the result and relation-type readers, the error mapping |
|
|
24
|
+
| `src/__lib__/` | labels, help text, the command config and test ids |
|
|
25
|
+
| `src/__test-utils__/` | the fake engine and the helpers of the tests |
|
|
26
|
+
| `style/` | the stylesheet, built to `lib/index.css` |
|
|
27
|
+
|
|
28
|
+
It depends on `@finos/legend-cube`, legend-graph, legend-application, legend-art, legend-lego, legend-shared, and the
|
|
29
|
+
depot, lakehouse and storage clients, never
|
|
30
|
+
on an application package (`legend-application-*`) or on legend-query-builder.
|
|
31
|
+
|
|
32
|
+
**The V1 rule:** `V1_*` protocol code lives under `src/graph-manager/protocol/pure/v1/`. The one product file outside
|
|
33
|
+
it that names `V1_*` is the seam `src/graph-manager/protocol/pure/CubeEngineBuilder.ts`: `buildCubeEngine` is the only
|
|
34
|
+
product code that makes a `V1_LegendCubeEngine`, so hosts never name a `V1_*` symbol. The repo's
|
|
35
|
+
`enforce-module-import-hierarchy` lint rule forbids imports between `stores/` or `components/` and `v1/`, both ways.
|
|
36
|
+
The engine-backed tests in `src/__tests__/` are an exception: they need both the adapter and `stores/`.
|
|
37
|
+
|
|
38
|
+
## Public API
|
|
39
|
+
|
|
40
|
+
`src/index.ts` exports:
|
|
41
|
+
|
|
42
|
+
- `CubeEditor`, the page, and `CubeHost`, what a host gives it; `CubeEntrySource`, a source a link asks the page to
|
|
43
|
+
start with (`initialSource`), and `formatCubeAccessPointEntryId` with its `CubeAccessPointEntry`, which write a
|
|
44
|
+
data product access point's link id ([hosting.md](./docs/hosting.md));
|
|
45
|
+
- the engine port, everything in `CubeEngine.ts` (`CubeEngine`, `CubeEngineError`, `CubeEngineErrorKind`,
|
|
46
|
+
`CubeResult`, `CubeModelOutline`, …), with `buildCubeEngine` and `CubeEngineConfig`;
|
|
47
|
+
- the connection explorer port, everything in `CubeConnectionExplorer.ts`, with `buildCubeConnectionExplorer`;
|
|
48
|
+
- data products: everything in `CubeDataProduct.ts` (the model kind, its runtime path, the environment types, the
|
|
49
|
+
warehouse rule) and `CubeDataProductCatalog.ts` (the catalog port and its classes), with
|
|
50
|
+
`buildCubeDataProductCatalog`, `buildCubeLakehouseEnvironment`, `CubeLakehouseServices`, `CubeLakehouseEnvironment`
|
|
51
|
+
and `getCubeRememberedWarehouse`;
|
|
52
|
+
- ingest data sets: everything in `CubeIngest.ts` (the model kind, its runtime path, the saved settings) and
|
|
53
|
+
`CubeIngestCatalog.ts` (the catalog port and its classes), with `buildCubeIngestCatalog`;
|
|
54
|
+
- published projects: everything in `CubeProject.ts` (the pointer model and its checks) and `CubeProjectCatalog.ts`
|
|
55
|
+
(the catalog port), with `buildCubeProjectCatalog`;
|
|
56
|
+
- `LocalModelCatalog` and `BUNDLED_MODELS`;
|
|
57
|
+
- `LEGEND_CUBE_COMMAND_CONFIG` and `LEGEND_CUBE_COMMAND_KEY`, the page's shortcuts;
|
|
58
|
+
- `LEGEND_CUBE_TEST_ID`;
|
|
59
|
+
- helpers that 0.0.2 published and nothing outside the package uses yet: `getRuntimesForDatabase`, `createTextModel`,
|
|
60
|
+
`BundledModel`, and the bundled model's `CUBE_NORTHWIND_MODEL`, `CUBE_NORTHWIND_DATABASE` and
|
|
61
|
+
`CUBE_NORTHWIND_RUNTIME`.
|
|
62
|
+
|
|
63
|
+
The node-type registries (drafts, editors, help text and icons) are internal: there is no plugin API for node types
|
|
64
|
+
yet.
|
|
65
|
+
|
|
66
|
+
## Sources
|
|
67
|
+
|
|
68
|
+
A cube reads one kind of source: relational tables (from a model, or from a database through a direct connection), the
|
|
69
|
+
access points of deployed data products, or the data sets of deployed ingest definitions (both beta; PLAN §6.7, §6.8).
|
|
70
|
+
The "Add a source" dialog has a tab per way to find a source, each implementing `CubeSourcePickerTab`
|
|
71
|
+
(`src/stores/source-picker/`): Model, Database connection, Data product and Ingest. A host offers the last three by
|
|
72
|
+
giving the page a `connectionExplorer`, a `dataProductCatalog` and an `ingestCatalog` (see [hosting](./docs/hosting.md)).
|
|
73
|
+
|
|
74
|
+
A new kind of source needs, in the core, a `SourceDefinition` (node, codec, emitter and its query rules) and, in the
|
|
75
|
+
builder, a tab, a Source panel editor, help text and an icon, and its branch in the engine's implementation, which
|
|
76
|
+
builds the model each call runs on from the cube's saved model kind (`src/graph-manager/CubeDirectConnection.ts`,
|
|
77
|
+
`CubeDataProduct.ts` and `CubeIngest.ts` are the examples).
|
|
78
|
+
|
|
79
|
+
Tables of a published project's Databases come through the Project Database tab (PLAN §6.3), which extends the Sample Data tab: the
|
|
80
|
+
cube saves the engine's pointer to the project at a released version, and the host's `projectCatalog` lists projects,
|
|
81
|
+
versions and outlines from its depot.
|
|
82
|
+
|
|
83
|
+
## Samples and examples
|
|
84
|
+
|
|
85
|
+
The Sample Data tab bundles three datasets: Northwind (without Cube's test tables) and two made-up, seeded samples, Sports and Trades
|
|
86
|
+
(`src/stores/fixtures/`), each an in-memory H2 database filled by its setup SQL. The Examples dialog (the header's
|
|
87
|
+
Examples button) opens one of seven example cubes over them (`src/stores/CubeExamples.ts`) in place of the cube, then
|
|
88
|
+
runs it, or starts a new cube on a dataset (PLAN §6.9). An
|
|
89
|
+
example is built in code, so a new one needs no saved spec; add it to `CUBE_EXAMPLES`, and the engine test
|
|
90
|
+
`CubeExamples.engine-roundtrip-test.ts` opens, types and runs it.
|
|
91
|
+
|
|
92
|
+
## Documentation
|
|
93
|
+
|
|
94
|
+
- [Hosting the page](./docs/hosting.md): what a host gives the page, the shortcuts, the stylesheet, and the dev loop.
|
|
95
|
+
- [Testing](./docs/testing.md): the test groups, the fake engine, and the tests against a real engine.
|
|
96
|
+
- [Adding an operation](./docs/adding-an-operation.md): the builder half of a new transform. The core half is in
|
|
97
|
+
[`@finos/legend-cube`](../legend-cube/docs/adding-an-operation.md).
|
|
98
|
+
- [The plan](../../docs/wip/legend-cube/PLAN.md) and [the known issues](../../docs/wip/legend-cube/ISSUES.md).
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Adding an operation: the builder half
|
|
2
|
+
|
|
3
|
+
Start with the core half, in [`@finos/legend-cube`'s guide](../../legend-cube/docs/adding-an-operation.md): the
|
|
4
|
+
node, its messages, emitter and codec, and its entry in the node registry. The palette, the context menu and the
|
|
5
|
+
canvas read that registry, so the new type shows there with no change here.
|
|
6
|
+
|
|
7
|
+
The builder adds four pieces: a draft, an editor and help text, in registries keyed by node type, and an icon, keyed by
|
|
8
|
+
the icon name the node's definition gives. Join and Filter are the examples to follow; Group for an editor of rows
|
|
9
|
+
(`CubeGroupEditor`, `CubeGroupDraft`), Concat for a two-input editor with fixes and one setting
|
|
10
|
+
(`CubeConcatEditor`, `CubeConcatDraft`), Partition for an editor made of the shared rows
|
|
11
|
+
(`CubePartitionEditor`, `CubePartitionDraft`), Difference for a two-input editor sharing Join's key rows
|
|
12
|
+
(`CubeDifferenceEditor`, `CubeDifferenceDraft`), and Extend for an editor that asks the engine before Apply
|
|
13
|
+
(`CubeExtendEditor`, `CubeExtendDraft`).
|
|
14
|
+
|
|
15
|
+
## 1. A draft
|
|
16
|
+
|
|
17
|
+
The node editor floats below its node (PLAN §11.8) and never edits the document: an editor edits a draft, and the
|
|
18
|
+
editor's **Apply**, or closing it any way but **Cancel**, stores the draft's node as one undo step (**Cancel** drops
|
|
19
|
+
it).
|
|
20
|
+
|
|
21
|
+
- In `src/stores/editors/Cube<Type>Draft.ts`, extend `CubeNodeDraft<Type>`: observable fields for the settings being
|
|
22
|
+
edited, actions that change them, and `build()`. `build()` returns `original` itself while nothing was edited, and
|
|
23
|
+
otherwise a new node with the same id and `rest`. The panel also treats a node that saves the same as `original`
|
|
24
|
+
as no change.
|
|
25
|
+
- Register a factory in `CUBE_NODE_DRAFT_FACTORIES` (`src/stores/editors/CubeNodeDraftRegistry.ts`); it gets the
|
|
26
|
+
editor state too, for a draft that needs the engine.
|
|
27
|
+
- A draft that must ask the engine before its node can be stored, as Extend's Validate does, says why in
|
|
28
|
+
`applyDisabledReason`: the panel then disables Apply with that reason as its title, and shows it in place of the
|
|
29
|
+
Problems list until it is `undefined`. Its engine work is a MobX `flow` on the draft; the node it builds then holds
|
|
30
|
+
the engine's answer (Extend's lambdas and typing), so it needs no more engine work once applied. While the reason
|
|
31
|
+
is set, Apply refuses the draft, and closing the panel or opening another node keeps it open with a notice
|
|
32
|
+
(`getEditorKeptOpenNotice`) rather than storing or dropping the edits.
|
|
33
|
+
- A draft whose node the cube may replace underneath it with one that differs in nothing it edits, such as an Extend
|
|
34
|
+
typed in the background, overrides `follow(node)` to go on from the new node, keeping its rows; by default the panel
|
|
35
|
+
drops the edits with a notice (`CubeNodeEditorState.sync`).
|
|
36
|
+
- A transform with nothing to set, such as Distinct, has no draft: it registers an editor that only describes it
|
|
37
|
+
(`CubeDistinctEditor`) and is listed in `CUBE_NODE_TYPES_WITHOUT_SETTINGS`, which the registry test skips when it
|
|
38
|
+
asks for a factory. The panel then shows no Apply or Cancel, and no Problems list (PLAN §7.4 item 2): every
|
|
39
|
+
transform that can be invalid has a draft. When such a transform gains a setting, as Concat did with Convert types,
|
|
40
|
+
give it a draft and take it off the list.
|
|
41
|
+
|
|
42
|
+
## 2. An editor
|
|
43
|
+
|
|
44
|
+
- In `src/components/editors/Cube<Type>Editor.tsx`, an `observer` component taking `CubeNodeEditorProps`:
|
|
45
|
+
`editorState`, `draft`, `inputSchemas` (the inputs' schemas in port order; the panel shows the editor only once all
|
|
46
|
+
are there) and `readOnly` (a cube saved by a newer version: show, don't edit).
|
|
47
|
+
- It changes only the draft. An action on the document, such as Join's Swap Inputs, goes through
|
|
48
|
+
`editorState.nodeEditor`, which applies the draft first. A fix that adds nodes, as Join's "Rename them" and Concat's
|
|
49
|
+
"Rename them" and "Drop them" do, is a `can…` getter and an action there, made from the core's fix on the query with
|
|
50
|
+
the draft applied (`queryWithEdits`), as one undo step, the panel staying on the node. The editor shows the fix's
|
|
51
|
+
changes from the core's plan, given the draft's settings, so the editor and the store agree on what it offers.
|
|
52
|
+
- `CubeColumnPicker` picks a column from a schema, and `CubeValueEditor` takes a value as a column's type wants it.
|
|
53
|
+
- Join's key-pair rows are shared with Difference (`CubeJoinKeyRows`, over a `CubeJoinKeysDraft` from
|
|
54
|
+
`CubeJoinKeyPairs.ts`); `CubeColumnChecklist` takes a reason per column (`unpickableReason`), as Difference's
|
|
55
|
+
difference columns do.
|
|
56
|
+
- A code editor is legend-lego's `CodeEditor` (language `pure`), with the error it should underline built from the
|
|
57
|
+
engine's location (`CubeEngineError.location`, as a legend-graph `CompilationError` with its `SourceInformation`),
|
|
58
|
+
as `CubeExtendEditor` does. Parse a text under a source id that names the row, so a parse error, and a typing error
|
|
59
|
+
on the text just parsed, point back to it. A stored lambda has no locations, and a plan has none either: the
|
|
60
|
+
Extend draft finds the row of a plan error by planning the columns' prefixes.
|
|
61
|
+
- Rows that Group, Sort and Partition share: `CubeAggregationRowEditor` (column, function and output name, given its
|
|
62
|
+
function list, the `AggregationUse` and what a function that takes no column shows in the column's place, and a
|
|
63
|
+
field for a function's setting, Lag's and Lead's offset or NTile's bucket count, when the editor gives
|
|
64
|
+
`onSetting`; the row keeps a setting as typed text, parsed as Limit's size is),
|
|
65
|
+
`CubeSortRowEditor` (column, direction, move and remove; `getSortRowProblems`, `getTakenSortColumns`) and
|
|
66
|
+
`CubeColumnChecklist` (the input's columns, ticked, those that can't be compared shown but not tickable), with their
|
|
67
|
+
drafts' helpers in `CubeAggregationRows.ts` and `CubeSortRows.ts`. They are driven by callbacks, so a new editor
|
|
68
|
+
wires them to its own draft. Judge a row with the node Apply would store (`draft.build()`), as the Partition editor
|
|
69
|
+
does, so the row and the panel's Problems list agree.
|
|
70
|
+
`isColumnDisabled` gives the reason a column can't be picked, shown after its type, as Sort does for a type that can't
|
|
71
|
+
be sorted (`isSortableType`) and a column another row has; the column stays shown.
|
|
72
|
+
- A whole-number setting (a size, a row index) is a `CubeIntegerField` over text the draft keeps as typed, read with
|
|
73
|
+
`parseWholeNumberText` (`src/stores/editors/CubeIntegerText.ts`): an optional sign and digits, nothing else, and empty
|
|
74
|
+
text gives `undefined`, which the node reports. Never `Number()` the raw text (it reads `''` as 0, `0x10` as 16 and
|
|
75
|
+
`1e3` as 1000) and never fall back to a default. `CubeRowCountDraft` and `CubeRowCountEditor` (Limit's) are the
|
|
76
|
+
example.
|
|
77
|
+
- Give each control a stable `aria-label` (numbered per row in a list, e.g. `Sort column 2`): the tests and the
|
|
78
|
+
browser rehearsal find controls by it.
|
|
79
|
+
- The editor shows in the floating node editor (PLAN §11.8): 432px wide, its body between 80px and a third of the
|
|
80
|
+
window, which scrolls. Fit that width (wrap long names with `break-words` or `break-all`), and give no list a
|
|
81
|
+
height cap or a scroller of its own: the body is the one scroller. Column and direction pickers stay native
|
|
82
|
+
`<select>` elements, as `CubeColumnPicker` is, and no editor measures the editor or reads its size.
|
|
83
|
+
- Text a field stores on blur is kept when the editor closes: the editor's blur runs first. Text an editor keeps in
|
|
84
|
+
React state can register with `nodeEditor.addFlusher` to be applied on close, as the data product warehouse does.
|
|
85
|
+
- A dropdown, picker or dialog opened from an editor and shown elsewhere (a portal) must be one of MUI's layers, or
|
|
86
|
+
hold the editor open with `nodeEditor.holdOpen()` while it is open: otherwise a press in it closes the editor.
|
|
87
|
+
- A Tailwind class no other file uses yet, such as an arbitrary `grid-cols-[…]`, does nothing in the dev server until
|
|
88
|
+
the deployment's Tailwind build runs again ([hosting.md](./hosting.md)); jsdom tests don't see it either way, so
|
|
89
|
+
check a new layout in the browser.
|
|
90
|
+
- Register it in `CUBE_NODE_EDITORS` (`src/components/editors/CubeNodeEditorRegistry.ts`).
|
|
91
|
+
|
|
92
|
+
## 3. Help text
|
|
93
|
+
|
|
94
|
+
An entry in `CUBE_NODE_HELP_TEXT` (`src/__lib__/LegendCubeHelpText.ts`), shown in the panel's header. Use the spec's
|
|
95
|
+
text (§17.9) where it has one.
|
|
96
|
+
|
|
97
|
+
## 4. An icon
|
|
98
|
+
|
|
99
|
+
Map the icon name of the node's definition to a legend-art icon in `NODE_ICONS` (`src/components/CubeNodeIcon.tsx`).
|
|
100
|
+
|
|
101
|
+
## A node the engine types
|
|
102
|
+
|
|
103
|
+
Extend's types come from the engine (the core guide). `CubeEditorState` types every Extend that waits on `ERR_TYPING`
|
|
104
|
+
through a reaction (`extendsToType`, `retypeExtends`), in one `typeLambdas` call, outside the undo history: the
|
|
105
|
+
answer replaces the very nodes sent, in the cube shown and in the undo snapshots that give the engine the same input
|
|
106
|
+
(`replaceOutsideHistory` takes a predicate per snapshot), and an answer for a node changed meanwhile is dropped. Each
|
|
107
|
+
node is typed as a chain after its input's relation, one chain per first k columns (`src/stores/CubeExtendTyping.ts`),
|
|
108
|
+
so a failure names its column.
|
|
109
|
+
|
|
110
|
+
A chain's types depend on what the engine sees of the input, which Cube's schema doesn't fully show (an Extend's
|
|
111
|
+
columns are nullable to Cube, `[1]` to the engine after `toOne()`). So each typing records `upstream`, a digest of the
|
|
112
|
+
input's emitted relation and the model (`getCubeExtendUpstream`), and the editor adds its own query rule to
|
|
113
|
+
`analysis` (`createStaleCubeExtendTypingRule`): an Extend whose digest differs waits on `ERR_TYPING` and is typed
|
|
114
|
+
again. Execute reads that validity as well as the emitter's `canEmit`, since the emitter doesn't know the rule. The
|
|
115
|
+
digest covers the whole relation, filter values included, so any edit above an Extend has it typed again. A typing
|
|
116
|
+
without a digest, as one loaded, is used as it is; on import every Extend is typed once more, as sources are checked
|
|
117
|
+
again, which records one. When the engine can't be reached, a typing still current for its input is kept, with a
|
|
118
|
+
warning. Every way out of `retypeExtends` leaves the node not stale, or the reaction would loop.
|
|
119
|
+
|
|
120
|
+
The canvas shows a waiting node as resolving (`isTypingNode`), the header says so, and the panel leaves `ERR_TYPING`
|
|
121
|
+
out of its problems. A new node type the engine types needs the same: today the reaction, the rule and the typing
|
|
122
|
+
are Extend's.
|
|
123
|
+
|
|
124
|
+
## Warnings
|
|
125
|
+
|
|
126
|
+
A warning is never an error: it doesn't make the node invalid or keep Execute from running. A warning worked out from
|
|
127
|
+
the query, as the Sort warning is (`findLostSortOrders` in the core), goes in `CubeEditorState.derivedWarnings`, by
|
|
128
|
+
node id, so it follows every edit and undo and is never stored; one about the outside world, such as a table that
|
|
129
|
+
changed, is stored in `CubeEditorState.warnings`, by node key. `getNodeWarnings(node)` gives both: the canvas marks the
|
|
130
|
+
node (`legend-cube__node--warning`) and lists them in its tooltip after its errors, and the panel shows each one as a
|
|
131
|
+
`role="status"` line above the editor. A derived warning waits until the nodes it names have no errors of their own.
|
|
132
|
+
|
|
133
|
+
Some warnings belong to one control, not to the node, and the editor shows them under it in the warning colour: Join's
|
|
134
|
+
'type unknown' on a key whose column the model can't type, Concat's on any such column, and the Join and Filter
|
|
135
|
+
editors' warning on a Date that Convert types made from dates and timestamps (`isDateOrTimestampType`), whose dates
|
|
136
|
+
match timestamps only at midnight. An editor must not offer a change it warns about, as Concat's never offers Convert
|
|
137
|
+
types for a column whose real type Cube doesn't know.
|
|
138
|
+
|
|
139
|
+
## Columns that change name
|
|
140
|
+
|
|
141
|
+
The Join editor warns when a join key's column has no type in the model, tracing the column back to its table and the
|
|
142
|
+
table's own name for it with `findColumnOrigins` (`src/stores/editors/CubeJoinDraft.ts`). It requires each node's
|
|
143
|
+
output to have the column, maps a Rename's new name back to its old one, and follows a Join's same-named keys to the
|
|
144
|
+
side the join keeps. A Group's keys and its Distinct Value, Min and Max outputs map back to their columns, and its
|
|
145
|
+
counts, sums and averages to none, as a Partition's window functions do, its input columns passing through; a
|
|
146
|
+
Concat's columns come from both inputs under the same name. Every other node is
|
|
147
|
+
taken to pass its input's columns through under the same name: an Extend's input columns do, and its new columns,
|
|
148
|
+
which the input lacks, come from none. A Difference's `x_1` and `x_2` come from `x` on their side, its difference
|
|
149
|
+
from none. If a new transform's output columns aren't its inputs'
|
|
150
|
+
under the same name (a computed column, say), teach `findColumnOrigins` how they map back, or the warning goes missing
|
|
151
|
+
or shows on the wrong column.
|
|
152
|
+
|
|
153
|
+
## Tests
|
|
154
|
+
|
|
155
|
+
- `src/components/editors/__tests__/CubeNodeEditorRegistry.test.ts` fails for a type missing a piece: it checks every
|
|
156
|
+
registered type for help text, an icon and an editor, and that each transform's draft gives back its node until
|
|
157
|
+
edited. Add the new help text to its exact list.
|
|
158
|
+
- Add the new item, in the spec's menu order, to the lists in `src/components/palette/__tests__/CubePalette.test.tsx`
|
|
159
|
+
and to `TRANSFORMS` in `src/components/canvas/__tests__/CubeCanvasContextMenu.test.tsx`.
|
|
160
|
+
- A draft test (`src/stores/editors/__tests__/`) and an editor test (`src/components/editors/__tests__/`), as Join's
|
|
161
|
+
and Filter's are.
|
|
162
|
+
- An engine test of the operation in `src/__tests__/LegendCubeOperations.engine-roundtrip-test.ts` (see
|
|
163
|
+
[Testing](./testing.md)): its lambda as the engine parses the printed Pure, its typing against Cube's inferred
|
|
164
|
+
schema, and what it returns, not its text.
|
|
165
|
+
- A case of the new node type in `src/__tests__/CubeInferenceConformance.engine-roundtrip-test.ts`, whose coverage
|
|
166
|
+
test fails until there is one: the engine must type every node of the case as Cube infers it.
|
|
167
|
+
- If its SQL can differ by database, its shapes at the end of `SHAPES` in
|
|
168
|
+
`src/__tests__/LegendCubeDialects.engine-roundtrip-test.ts` (earlier tests index the first ones by position), so the
|
|
169
|
+
checks every shape gets cover it, and a test of the facts its plans must keep on every database type. A shape some
|
|
170
|
+
database types can't plan at all goes in a list of its own over the types that can: windows are in
|
|
171
|
+
`WINDOW_SHAPES`, over `WINDOW_DATABASE_TYPES` (Spanner, Presto and Composite refuse any window), with the refusal
|
|
172
|
+
pinned.
|
|
173
|
+
|
|
174
|
+
- A draft that waits for the engine is tested against the fake engine's mocks (`parseExpression`, `typeLambdas`,
|
|
175
|
+
`planLambda` in `FakeCubeEngine`), and an editor that changes a draft from the test wraps the change in `act`. An
|
|
176
|
+
editor with a code editor needs `MockedMonacoEditorInstance.getValue.mockReturnValue('')` before it renders: the
|
|
177
|
+
mocked editor holds no text of its own.
|
|
178
|
+
|
|
179
|
+
The `v1/` adapter (`V1_CubeLambdaSerializer`) needs no change while the operation's emitter uses only IR and literal
|
|
180
|
+
kinds it already writes. A new kind of IR node or literal needs its own case there, with a test in
|
|
181
|
+
`src/graph-manager/protocol/pure/v1/__tests__/`.
|
package/docs/hosting.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Hosting the Cube page
|
|
2
|
+
|
|
3
|
+
A Legend application hosts the page by giving it a `CubeHost` and contributing its shortcuts. Legend Query is the
|
|
4
|
+
host today: `LegendQueryCubeHost` (`src/stores/cube/`), and the lazy route and page (`src/components/cube/`) of
|
|
5
|
+
`@finos/legend-application-query`.
|
|
6
|
+
|
|
7
|
+
## The host
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
interface CubeHost {
|
|
11
|
+
readonly applicationStore: GenericLegendApplicationStore;
|
|
12
|
+
readonly engine: CubeEngine;
|
|
13
|
+
readonly modelCatalog: LocalModelCatalog;
|
|
14
|
+
readonly connectionExplorer?: CubeConnectionExplorer | undefined;
|
|
15
|
+
readonly dataProductCatalog?: CubeDataProductCatalog | undefined;
|
|
16
|
+
readonly ingestCatalog?: CubeIngestCatalog | undefined;
|
|
17
|
+
readonly projectCatalog?: CubeProjectCatalog | undefined;
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **The application store** gives the page its commands, user data, clipboard, theme, notifications and alerts, and
|
|
22
|
+
its telemetry service, which Cube doesn't use yet: it sends no events. Cube keeps no auth or config of its own.
|
|
23
|
+
- **The engine:** `buildCubeEngine(config, tracerService)` builds Legend's implementation of the `CubeEngine` port.
|
|
24
|
+
`config` is the engine client's configuration (`CubeEngineConfig`); Legend Query passes its own engine server URL
|
|
25
|
+
and options, so Cube talks to the engine its query editor uses.
|
|
26
|
+
- **The models:** `new LocalModelCatalog(engine)`. It offers `BUNDLED_MODELS` (the Northwind, Sports and Trades datasets of the Sample Data tab)
|
|
27
|
+
and caches each model's outline: its tables, for the source picker, and its runtimes' connections with their
|
|
28
|
+
database types, which Drop, Slice, Limit and Distinct need on some databases (PLAN §11.4). Users can also paste a Pure
|
|
29
|
+
model.
|
|
30
|
+
- **Direct database connections (optional):** `buildCubeConnectionExplorer(config, tracerService)` builds the explorer
|
|
31
|
+
that reads the database behind a connection through the engine's schema exploration
|
|
32
|
+
(`/pure/v1/utilities/database/schemaExploration`), with its own client configured as the engine's. Without one,
|
|
33
|
+
the source picker offers no database connection. H2 and DuckDB only for now, and only secret-free authentication: a
|
|
34
|
+
cube saves its connection, so it never holds a password or token.
|
|
35
|
+
- **Data products (optional, beta):** `buildCubeDataProductCatalog(services)` lists the deployed data products of a
|
|
36
|
+
class from the lakehouse's lite list and reads a product's access points from its deployed artifact and definition in
|
|
37
|
+
the depot. Pass `buildCubeLakehouseEnvironment(services)` to `buildCubeEngine` as `lakehouseEnvironment`, so data
|
|
38
|
+
product cubes run in the viewer's lakehouse environment. `services` holds the host's lakehouse contract and depot
|
|
39
|
+
clients, its token getter and the viewer's id; Legend Query builds them only when its `lakehouse` is configured. With
|
|
40
|
+
the optional `marketplaceServerClient`, the catalog's `search` runs the marketplace's Lakehouse Access full-text
|
|
41
|
+
search instead, one page of 100 matches, never reading the lite list, and its optional `isCutShort` says whether an
|
|
42
|
+
answer leaves out matches; Legend Query passes a client only when `marketplace.serverUrl` is also set. The optional
|
|
43
|
+
`getMarketplaceLink` builds a product's page in the host's marketplace, for the preview, the Source panel and the
|
|
44
|
+
"Request access" links; without it, no link shows. The catalog's `getAccess` reads the viewer's access to each access
|
|
45
|
+
point group from their contracts, and the optional `enterpriseStereotype` names the stereotype marking groups open to
|
|
46
|
+
everyone (Legend Query reads `options.dataProductConfig.publicStereotype`, as Studio and Marketplace do).
|
|
47
|
+
|
|
48
|
+
- **Ingest data sets (optional, beta):** `buildCubeIngestCatalog(config, tracerService, services)` reads the deployed
|
|
49
|
+
ingest definitions as Data Cube's producer source does: the lakehouse platform's ingest environment named by the
|
|
50
|
+
viewer's environment in the class, its producer deployments, a deployment's definitions deployed from SDLC, and a
|
|
51
|
+
definition's grammar, which the engine Cube uses parses. It needs `services.platformServerClient` and
|
|
52
|
+
`services.ingestServerClient` (an ingest client with no server of its own: each call names one), and gives none
|
|
53
|
+
without them. Pass it to `buildCubeEngine` as `ingestCatalog` too, so ingest cubes type and run. Legend Query builds
|
|
54
|
+
both clients only when `lakehouse.platformUrl` is set.
|
|
55
|
+
|
|
56
|
+
- **Published projects (optional):** `buildCubeProjectCatalog(depotServerClient)` lists the depot's projects, their
|
|
57
|
+
released versions, and a version's own Databases with the runtimes of it and its dependencies, for the source
|
|
58
|
+
dialog's Project tab (PLAN §6.3). It reads nothing until the tab opens. Project cubes save the engine's pointer, so
|
|
59
|
+
the engine must fetch from the same depot. Legend Query builds it from `depot.url`.
|
|
60
|
+
|
|
61
|
+
Legend Query mounts the Cube page at `/query/cube` only where its config turns on non-production features,
|
|
62
|
+
since Cube is still a proof of concept: `"extensions": { "core": { "NonProductionFeatureFlag": true } }`. Without
|
|
63
|
+
it, as in production, the address shows nothing. To see it locally, add it to the deployment's
|
|
64
|
+
`dev/config.json`, which is ignored by git. `yarn setup` writes that file without the flag, since turning it on also
|
|
65
|
+
changes the rest of Query (its data space selector lists data products too), which Query's end-to-end tests check.
|
|
66
|
+
|
|
67
|
+
In Legend Query's config file, data products need `lakehouse.url` and `depot.url`; ingest data sets need
|
|
68
|
+
`lakehouse.url` and `lakehouse.platformUrl`, the key Data Cube and Marketplace use for the platform. Two keys are optional:
|
|
69
|
+
`marketplace.serverUrl`, for search on the marketplace server, takes the value Legend Marketplace's own config gives
|
|
70
|
+
`marketplace.url`; `extensions.core.dataProductConfig.publicStereotype`, for the "Enterprise access" badge, is the
|
|
71
|
+
stereotype Studio and Marketplace use for groups open to everyone.
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"lakehouse": {
|
|
76
|
+
"url": "<the lakehouse contract server>",
|
|
77
|
+
"platformUrl": "<the lakehouse platform>"
|
|
78
|
+
},
|
|
79
|
+
"marketplace": {
|
|
80
|
+
"url": "<Legend Marketplace, for links>",
|
|
81
|
+
"productionParallelUrl": "<its production-parallel deployment>",
|
|
82
|
+
"serverUrl": "<the marketplace server>"
|
|
83
|
+
},
|
|
84
|
+
"extensions": {
|
|
85
|
+
"core": {
|
|
86
|
+
"dataProductConfig": {
|
|
87
|
+
"publicStereotype": {
|
|
88
|
+
"profile": "<profile path>",
|
|
89
|
+
"stereotype": "<stereotype>"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Render the page with `<CubeEditor host={host} />`, and pass `initialDocument` to open a given cube, or
|
|
98
|
+
`initialSource` to start an empty cube with one data product access point, as a link to Legend Query's Cube page does:
|
|
99
|
+
`?sourceType=dataProductAccessPoint&sourceId=<id>`. The id is `<class>/<data product id>/<deployment id>/<access point
|
|
100
|
+
group>/<access point>`, each part URI-encoded (`formatCubeAccessPointEntryId` writes it), where `<class>` is
|
|
101
|
+
`PRODUCTION` or `PRODUCTION_PARALLEL` (`CubeDataProductEnvironmentType`), and the link encodes the
|
|
102
|
+
whole id once more as the parameter's value, as any query value is (`encodeURIComponent(id)`). Legend Query reads the
|
|
103
|
+
two parameters and takes them out of the address, keeping the others; a `?queryId=` wins and stays, for when Cube
|
|
104
|
+
saves queries (M8). The page's state
|
|
105
|
+
lives as long as the page; Legend Query makes a new host on each visit.
|
|
106
|
+
|
|
107
|
+
**The bundled model, and H2 connections, run only on an engine that allows LocalH2.** It sets up Northwind in an
|
|
108
|
+
in-memory H2 database through its connection's `testDataSetupSqls`. On an engine that forbids LocalH2, its queries don't
|
|
109
|
+
run.
|
|
110
|
+
|
|
111
|
+
## Shortcuts
|
|
112
|
+
|
|
113
|
+
A Legend application binds keys only through its plugins. The host returns the page's commands from one of its
|
|
114
|
+
plugins:
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
override getExtraKeyedCommandConfigEntries(): KeyedCommandConfigEntry[] {
|
|
118
|
+
return collectKeyedCommandConfigEntriesFromConfig(LEGEND_CUBE_COMMAND_CONFIG);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The page registers the commands while it is open: F9 runs the query, and Ctrl+Z or Cmd+Z undoes.
|
|
123
|
+
|
|
124
|
+
## The stylesheet
|
|
125
|
+
|
|
126
|
+
- Import `@finos/legend-cube-builder/lib/index.css` in the host's stylesheet (Legend Query does it in
|
|
127
|
+
`legend-application-query-bootstrap/style/index.scss`). The page's root element has the class `legend-cube`.
|
|
128
|
+
- The page uses Tailwind classes. The host's Tailwind build must scan the builder's sources: Legend Query's deployment
|
|
129
|
+
scans `../legend-*/src/**/*.tsx`. So Tailwind classes go in `.tsx` files only.
|
|
130
|
+
- React Flow's stylesheet comes with the canvas. Load the page lazily, as Legend Query does, to keep it and the page's
|
|
131
|
+
libraries out of the host's main bundle.
|
|
132
|
+
|
|
133
|
+
## The dev loop
|
|
134
|
+
|
|
135
|
+
1. Start an engine on `localhost:6300` that allows LocalH2: legend-engine's `org.finos.legend.engine.server.Server`
|
|
136
|
+
from an IDE, or the repo's docker compose
|
|
137
|
+
(`fixtures/legend-docker-setup/grammar-test-setup/grammar-test-setup-docker-compose.yml`). Check it with
|
|
138
|
+
`curl -s localhost:6300/api/server/v1/info`.
|
|
139
|
+
2. Run `yarn build` once: `yarn dev:ts` doesn't build the stylesheets.
|
|
140
|
+
3. Run `yarn dev:ts` and `yarn dev:query`, and open `http://localhost:9001/query/cube`.
|
|
141
|
+
4. Run `yarn workspace @finos/legend-cube-builder dev:sass` to rebuild the stylesheet as you change it (the root
|
|
142
|
+
`yarn dev:ts` already rebuilds the TypeScript).
|
|
143
|
+
|
|
144
|
+
If Tailwind classes seem to do nothing, the deployment's Tailwind watcher may have stopped: it exits when
|
|
145
|
+
`yarn dev:query` runs without a terminal. Restart it in a terminal of its own with
|
|
146
|
+
`yarn workspace @finos/legend-application-query-deployment dev:tailwindcss`, or rebuild once with `build:tailwindcss`
|
|
147
|
+
(again after each new class).
|
|
148
|
+
|
|
149
|
+
**A second checkout.** To run a second copy next to the first (another git worktree, say), give it its own port and
|
|
150
|
+
skip the watchers you don't need: in that checkout, run `yarn install`, `yarn build` and
|
|
151
|
+
`yarn workspace @finos/legend-application-query-deployment setup` once, then
|
|
152
|
+
`yarn workspace @finos/legend-application-query-deployment build:tailwindcss` and
|
|
153
|
+
`yarn workspace @finos/legend-application-query-deployment dev:webpack --port 9002`, and open
|
|
154
|
+
`http://localhost:9002/query/cube`. The dev server serves the packages' built `lib/`, so rebuild what you change
|
|
155
|
+
(`yarn workspace @finos/legend-cube-builder build:ts`, and `@finos/legend-cube`'s) before looking, or run `yarn dev:ts`.
|
|
156
|
+
|
|
157
|
+
The manual check of the whole page is the plan's Part B (PLAN §11.2).
|
package/docs/testing.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Testing Legend Cube's builder
|
|
2
|
+
|
|
3
|
+
The builder has two test groups:
|
|
4
|
+
|
|
5
|
+
- **`core`** (the default group): unit tests and jsdom page tests against a fake engine. No engine needed:
|
|
6
|
+
`TEST_GROUP=core yarn workspace @finos/legend-cube-builder test`.
|
|
7
|
+
- **`engine-roundtrip`**: tests against a real engine on `localhost:6300`, in files named
|
|
8
|
+
`*.engine-roundtrip-test.ts`: `TEST_GROUP=engine-roundtrip yarn workspace @finos/legend-cube-builder test`.
|
|
9
|
+
|
|
10
|
+
A plain `yarn workspace @finos/legend-cube-builder test` runs both, so it fails without an engine. Add a path pattern to
|
|
11
|
+
run some files, e.g. `TEST_GROUP=core yarn workspace @finos/legend-cube-builder test source-picker`. The core
|
|
12
|
+
(`@finos/legend-cube`) has no engine tests.
|
|
13
|
+
|
|
14
|
+
## Page tests, against a fake engine
|
|
15
|
+
|
|
16
|
+
- `const { host, fake } = TEST__createCubeHost()` gives a host over `createFakeCubeEngine()`'s engine, and `fake`,
|
|
17
|
+
its Jest mocks, answering from `FAKE_NORTHWIND_OUTLINE` and `FAKE_NORTHWIND_SCHEMAS`. Override an answer per test,
|
|
18
|
+
e.g. `fake.execute.mockRejectedValueOnce(…)`, or pass answers to `TEST__createCubeHost(answers)`.
|
|
19
|
+
- `TEST__renderInCubeApplication(<CubeEditor host={host} />, host.applicationStore, LEGEND_CUBE_TEST_ID.EDITOR)`
|
|
20
|
+
renders the page in a Legend application and waits for it.
|
|
21
|
+
- A test of one part of the page makes the state itself, `new CubeEditorState(host, document)`, and renders the part
|
|
22
|
+
with it, e.g. `<CubeCanvas editorState={editorState} />`, which floats the node editor from the canvas when a node
|
|
23
|
+
is clicked (as `CubeJoinEditor.test.tsx` does). `TEST__importDocument(editorState, document)` then imports a cube and waits
|
|
24
|
+
for its tables to be typed again, so nothing changes after the test. A `<CubeEditor>` test gets the page's state by
|
|
25
|
+
spying on `CubeEditorState.prototype.registerCommands`, which the page calls once, and reading the spy's
|
|
26
|
+
`mock.contexts[0]` (as `CubeCommands.test.tsx`'s `renderPage` does); it imports a cube through the Import dialog.
|
|
27
|
+
- `TEST__findCanvasNode(id)`, `TEST__getCanvasNodes()` and `TEST__getCanvasNodeTooltip(node)` read the canvas; the
|
|
28
|
+
tooltip's text is the node's `aria-description`.
|
|
29
|
+
- `TEST__openAddItems()` and `TEST__chooseAddItem(label)` use the header's Add Items, e.g. to open the source dialog on
|
|
30
|
+
a table tab (`'Relational Database Table'`); the empty canvas's link opens it with no tab chosen.
|
|
31
|
+
- `src/__test-utils__/CubeNorthwindTestQueries.ts` has the Northwind tables' columns and ready-made queries, e.g.
|
|
32
|
+
`sliceQuery()`.
|
|
33
|
+
|
|
34
|
+
What jsdom can't do:
|
|
35
|
+
|
|
36
|
+
- **Fit the canvas.** jsdom measures nothing, so React Flow never reports the nodes measured and the refit never runs.
|
|
37
|
+
Check fitting in a browser (PLAN §11.2 Part B).
|
|
38
|
+
- **Show Chrome's own behaviour**, e.g. its date input sending React no Enter key.
|
|
39
|
+
- **Print a failing comparison of two queries.** A query holds `BigInt`s, which Jest can't print, so a failing
|
|
40
|
+
`toBe` between queries crashes the worker. Compare them as booleans: `expect(a === b).toBe(true)`.
|
|
41
|
+
|
|
42
|
+
The floating node editor (PLAN §11.8):
|
|
43
|
+
|
|
44
|
+
- **A press outside it** closes it on `pointerdown`, which jsdom 20 has no event class for: dispatch
|
|
45
|
+
`new MouseEvent('pointerdown', { bubbles: true, button: 0 })`, as `useCubeNodeEditorDismiss.test.tsx` does
|
|
46
|
+
(`fireEvent.pointerDown` sends no button).
|
|
47
|
+
- **Its placement** can be tested once the canvas's rectangle and the window's size are stubbed, as
|
|
48
|
+
`CubeNodeEditorPopper.test.tsx` does; flipping and scrolling are checked in a browser.
|
|
49
|
+
- **A tooltip test** lets MUI's 800 ms memory of an open tooltip lapse after each test, or a retry (`jest.retryTimes`,
|
|
50
|
+
set for every package) passes on the shorter `enterNextDelay`, as `CubeCanvas.test.tsx`'s tooltip tests do.
|
|
51
|
+
|
|
52
|
+
Drag and drop goes through react-dnd's HTML5 backend: fire `dragStart`, `dragEnter`, `dragOver`, `drop` and
|
|
53
|
+
`dragEnd` on the elements.
|
|
54
|
+
|
|
55
|
+
**Proving a test.** To show a new test fails without the code it covers, change the code in a copy of the package
|
|
56
|
+
outside the checkout, never in place: a running `yarn dev:ts` rebuilds `lib/` from the changed file, and the dev server
|
|
57
|
+
would serve it.
|
|
58
|
+
|
|
59
|
+
## Engine tests
|
|
60
|
+
|
|
61
|
+
- **The engine:** a local legend-engine, or the repo's docker compose
|
|
62
|
+
(`fixtures/legend-docker-setup/grammar-test-setup/grammar-test-setup-docker-compose.yml`), on `localhost:6300`. CI
|
|
63
|
+
runs the group on that docker image.
|
|
64
|
+
- **No `fetch` in Jest:** the repo's Jest setup blocks it. Engine tests reach the engine through axios: the
|
|
65
|
+
`CUBE_ENGINE_TEST__*` helpers (`src/__test-utils__/CubeEngineTestSupport.ts`) for direct calls, and
|
|
66
|
+
`V1_createEngineBackedCubeEngine()` (`src/graph-manager/protocol/pure/v1/__test-utils__/`). The latter returns
|
|
67
|
+
`{ engine, calls }`: a real `V1_LegendCubeEngine` whose client calls are spied onto those helpers (and legend-graph's
|
|
68
|
+
`ENGINE_TEST_SUPPORT__grammarToJSON_model`), and the spies. Make it in `beforeEach` or in the test: the repo's Jest
|
|
69
|
+
config restores mocks before each test, so an engine made in `beforeAll` would call the real client, and the
|
|
70
|
+
blocked `fetch`.
|
|
71
|
+
- **Assert meaning, not text.** The CI engine image changes with every engine merge, so assert row counts, the set of
|
|
72
|
+
keys returned, types and nullability, not SQL or Pure formatting, and never an engine answer that is a known
|
|
73
|
+
defect.
|
|
74
|
+
- **Rows come back in the database's order** unless a Sort reaches the node that runs, and H2's order changes between
|
|
75
|
+
queries, so compare counts and sets, never positions, without a Sort. A Concat's rows come in no order either.
|
|
76
|
+
Facts of the Cube Northwind data a test may rely on: ORDERS has 830 orders, `ORDER_ID` running from 10248 to 11077
|
|
77
|
+
with no gap, in 21 ship countries; CUSTOMERS has 91 rows and SUPPLIERS 29; `CUBETEST.ALLTYPES` has 3 rows, ID 3
|
|
78
|
+
empty but for its key. Better still, check a result against its tables run alone, as the Concat tests do. Avoid
|
|
79
|
+
comparing or sorting on its 32-bit `REAL` columns (`FREIGHT`, `UNIT_PRICE`, `DISCOUNT`), where exact equality
|
|
80
|
+
silently matches nothing.
|
|
81
|
+
- `src/__tests__/LegendCubeNorthwind.engine-roundtrip-test.ts` is the slice's automated acceptance (PLAN §11.2 Part
|
|
82
|
+
A). It logs the engine's commit.
|
|
83
|
+
- `src/__tests__/LegendCubeOperations.engine-roundtrip-test.ts` checks each operation: its lambda as the engine parses
|
|
84
|
+
the printed Pure, its typing against Cube's inferred schema, and its rows. Its helpers are in
|
|
85
|
+
`src/__test-utils__/CubeOperationsTestUtils.ts`; they take any `CubeEngine` and import no `V1_*` class.
|
|
86
|
+
- `src/__tests__/CubeInferenceConformance.engine-roundtrip-test.ts` holds Cube's inference to the engine's (PLAN
|
|
87
|
+
§11.5): it types every node of every case in one batch and compares names, positions, precise types with their
|
|
88
|
+
parameters, and nullability exactly (`TEST__typingDifferences`). Where the engine misreports nullability (an outer
|
|
89
|
+
join's padded columns, the FULL merged key, a Difference's keys named apart, an Extend's columns after `toOne()`), a
|
|
90
|
+
case lists the columns in `widerNullable`, and Cube must say nullable
|
|
91
|
+
there. Every registered node type needs a case, or the coverage test fails, but a data product's access point
|
|
92
|
+
(`NOT_TYPED_BY_THE_ENGINE`: the open-source engine reads no data product; `CubeDataProduct.engine-roundtrip-test.ts`
|
|
93
|
+
types its stand-in). A case whose Concat converts types names the types it converts (`converted`), so a case that
|
|
94
|
+
silently stops converting fails. A case's every node must be valid. The saved-spec samples are typed the same way,
|
|
95
|
+
node by node, but one-way (`CubeSpecCorpus.engine-roundtrip-test.ts`).
|
|
96
|
+
- **Sort descending in order tests.** H2 scans ORDERS in ascending `ORDER_ID` order, so a test that sorts ascending,
|
|
97
|
+
or numbers rows by `ORDER_ID`, passes without the sort; the operations tests sort descending, with a control test
|
|
98
|
+
pinning H2's own order.
|
|
99
|
+
- **Database workarounds** (PLAN §11.4) are checked two ways. The operations tests write them for `SqlServer` and run
|
|
100
|
+
them on the fixture's H2, which takes both forms, so their rows can be compared with the native forms'.
|
|
101
|
+
`src/__tests__/LegendCubeDialects.engine-roundtrip-test.ts` plans them, never running anything, on a test-only copy
|
|
102
|
+
of the fixture model with a static connection per database type (`CUBE_ENGINE_TEST__generatePlanSql`), and checks
|
|
103
|
+
facts about the SQL: row numbers in the Sort's order, no `limit m,n`, no `top N distinct`; for Group, its reduces,
|
|
104
|
+
HAVING and the GROUP BY target after two Renames (an engine issue, pinned); for Concat, one UNION ALL, each input's
|
|
105
|
+
Sort and Limit in its own subquery, and no SQL cast when it converts types. A check that should catch
|
|
106
|
+
a missing workaround must fail without it: run it once with the workaround off before relying on it.
|
|
107
|
+
- **Windows** (PLAN §11.6) are planned in `WINDOW_SHAPES` over `WINDOW_DATABASE_TYPES`, since Spanner, Presto and
|
|
108
|
+
Composite refuse any window (pinned): an OVER clause with no frame, `count(col)` and `count(1)` for the counts,
|
|
109
|
+
`rank()`, `dense_rank()` and `row_number()`, M5b's `ntile`, `percent_rank`, `cume_dist`, `lag`, `lead` and
|
|
110
|
+
`first_value`, Last's over the reversed sort (ClickHouse's own `lagInFrame` and `leadInFrame` over a whole-partition
|
|
111
|
+
frame, DuckDB's `first`), with the reversed sort putting empty values at the other end on every type, a Filter after a Partition as a `WITH n_…` and a `WHERE` outside the
|
|
112
|
+
window, never QUALIFY, and the capture's ORDER BY at the root. Run, they are checked three ways: the operations
|
|
113
|
+
tests ("Partition on the engine"), with values worked out on the fixture (rows tied on the sort share a running
|
|
114
|
+
value and a rank); `LegendCubeDirectConnectionOperations.engine-roundtrip-test.ts` on H2 and DuckDB, a second
|
|
115
|
+
database that runs them, windowed Distinct Count included; and `CubeWindowComposition.engine-roundtrip-test.ts`,
|
|
116
|
+
which runs pairs and triples of nodes with a Partition against a small JavaScript reference with SQL's null rules
|
|
117
|
+
and default frame (and M5b's functions, refusing a tie for the ones that depend on a row's place), checks every Partition is written in the array form, and shows (its negative control) that the
|
|
118
|
+
single form, unbound, gives wrong rows. The core's `PartitionEmitter.test.ts` pins the emitted text.
|
|
119
|
+
`CubeWindowIsolation.engine-roundtrip-test.ts` checks the lets themselves through the adapter, with a test-only
|
|
120
|
+
window: they run, type, show in Show Pure, and put an error inside a let on its window.
|
|
121
|
+
- **Difference and Extend** (PLAN §11.7). The operations tests run a Difference against a reference computed from its
|
|
122
|
+
inputs' own rows, every numeric family included; the plan-only test pins its join (a native `full outer join` on
|
|
123
|
+
every type but H2, where the engine emulates it) and its `coalesce(…, 0) - coalesce(…, 0)`, never a cast, and an
|
|
124
|
+
Extend's columns written as their expressions; both run on H2 and DuckDB through the direct connection.
|
|
125
|
+
`CubeExpressions.engine-roundtrip-test.ts` covers Extend's engine calls: an expression parsed with its digits and
|
|
126
|
+
locations, typed as a chain after its input over the cube's model (its own enumerations and functions too), the
|
|
127
|
+
failing column found and located, a plan that fails, and a run. A test that needs a typed Extend without the engine
|
|
128
|
+
builds one with `TEST__typedExtend` (`src/__test-utils__/CubeExpressionTestUtils.ts`), whose types the conformance
|
|
129
|
+
cases check against the engine.
|
|
130
|
+
- `src/__tests__/CubeExamples.engine-roundtrip-test.ts` compiles the Sports and Trades sample models and opens every
|
|
131
|
+
example cube (PLAN §6.9) as the Examples dialog does: it types its tables, checks every node types as Cube infers it
|
|
132
|
+
(Sum outputs nullable to Cube only, PLAN §5.7) and runs it, counting rows.
|
|
133
|
+
- `src/__tests__/CubeNorthwindRelationTypes.json` records the engine's relation type for every table of the bundled
|
|
134
|
+
model. If the test comparing with it fails, the engine's typing changed: check the change, then record the file
|
|
135
|
+
again by hand.
|
|
136
|
+
|
|
137
|
+
### Direct connections
|
|
138
|
+
|
|
139
|
+
- `TEST__createCubeHost()` also gives `connections`, a fake connection explorer
|
|
140
|
+
(`src/__test-utils__/FakeCubeConnectionExplorer.ts`) whose `listSchemas` answers `CUBE_DIRECT` and whose `listTables`
|
|
141
|
+
answers `FAKE_DIRECT_TABLES`, each a Jest mock.
|
|
142
|
+
- On the engine, `V1_createEngineBackedCubeEngine()` also spies `buildDatabase` (schema exploration), and
|
|
143
|
+
`V1_createEngineBackedCubeConnectionExplorer()` gives a real explorer. `directH2Connection(schema)` and
|
|
144
|
+
`directDuckDBConnection(schema)` (`src/__test-utils__/CubeDirectConnectionFixtures.ts`) build small databases from
|
|
145
|
+
setup SQL.
|
|
146
|
+
- **Setup SQL runs on every pooled connection**, so a setup must first drop what it creates. Each engine test file
|
|
147
|
+
still uses its own schema names, so files never depend on each other's data.
|
|
148
|
+
- **Never assert an engine answer that is a known defect.** Schema exploration types H2's and DuckDB's `DECIMAL(10,2)`
|
|
149
|
+
as `Numeric(0,0)` and DuckDB's `VARCHAR(5)` as `Varchar(0)`; only the core's DuckDB sample
|
|
150
|
+
(`packages/legend-cube/src/spec/__tests__/fixtures/direct/`) holds those types, and no engine test reads it.
|
|
151
|
+
|
|
152
|
+
### Data products and ingest data sets
|
|
153
|
+
|
|
154
|
+
- **Fakes.** `TEST__createCubeHost()` also gives `dataProducts`, a fake data product catalog
|
|
155
|
+
(`src/__test-utils__/FakeCubeDataProductCatalog.ts`). An ingest catalog is opt-in: build one per test with
|
|
156
|
+
`createFakeCubeIngestCatalog()` (`src/__test-utils__/FakeCubeIngestCatalog.ts`) and pass its `catalog` as the host's
|
|
157
|
+
`ingestCatalog`; without it, Cube offers no Ingest tab.
|
|
158
|
+
- **The open-source engine reads neither.** It has no data product or ingest definition to read, can't parse an ingest
|
|
159
|
+
definition, and can't type or run a `#I{...}#` accessor. So the engine tests stand each source in for with a Pure
|
|
160
|
+
function declaring the relation type the source would have, over an H2 table:
|
|
161
|
+
`src/__tests__/CubeDataProduct.engine-roundtrip-test.ts` for access points, and
|
|
162
|
+
`src/__tests__/CubeIngest.engine-roundtrip-test.ts` for ingest data sets. The ingest one swaps each accessor Cube
|
|
163
|
+
emits for its stand-in, then checks the nodes downstream (a Filter on `LAKE_OUT_ID`, a Join of two data sets, a
|
|
164
|
+
Group) against the engine's typing, and runs them.
|
|
165
|
+
- **Testable locally:** reading a definition's data sets and types, the URN parser, the saved model, the source
|
|
166
|
+
dialog, the panels and the re-checks, all with fakes; downstream lambdas, on the stand-ins.
|
|
167
|
+
- **Not testable locally:** the ingest servers' answers, the parse of a deployed definition's grammar, compiling and
|
|
168
|
+
running `#I{...}#`, the environment name and whether a warehouse is accepted. Those are checked in an internal
|
|
169
|
+
deployment (PLAN §11.2 Part B2).
|
|
170
|
+
|
|
171
|
+
The engine tests in `src/__tests__/` import `V1_*` classes there, as an exception to the V1 rule: they need both the
|
|
172
|
+
`v1/` adapter and `stores/`, which the import-hierarchy lint rule keeps apart.
|
|
173
|
+
|
|
174
|
+
### Depot databases
|
|
175
|
+
|
|
176
|
+
- **Fakes.** `createFakeCubeProjectCatalog()` (`src/__test-utils__/FakeCubeProjectCatalog.ts`) gives a catalog to pass
|
|
177
|
+
as the host's `projectCatalog`; without one, Cube offers no Project tab. Its `com.example:sales` holds the fake
|
|
178
|
+
engine's Northwind Database, so the fake engine types its tables.
|
|
179
|
+
- **CI:** `src/__tests__/CubeDepotSamples.engine-roundtrip-test.ts` compiles the mock depot's committed sample
|
|
180
|
+
projects and types every table of their own Databases. The engine fetches a pointer's project from a depot, which CI
|
|
181
|
+
doesn't run, so no CI test sends a pointer.
|
|
182
|
+
- **By hand (`cube-local`):** with the engine on :6300 and `yarn dev:mock-depot-server` on :6200,
|
|
183
|
+
`TEST_GROUP=cube-local yarn workspace @finos/legend-cube-builder test` runs the real catalog, the engine's pointer
|
|
184
|
+
fetch and the Project tab end to end (`src/__tests__/CubeDepot.cube-local-test.ts`). Its depot client sends its GETs
|
|
185
|
+
through axios, since the repo's Jest setup blocks `fetch`.
|
|
186
|
+
- **Changing the sample projects:** edit `fixtures/legend-mock-server/scripts/generate-cube-depot.mjs` and run it with
|
|
187
|
+
the engine up (`node scripts/generate-cube-depot.mjs`). The engine caches a pointer's project per version, so restart
|
|
188
|
+
it after changing a version it has fetched.
|