@finos/legend-query-builder 4.17.99 → 4.18.0
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/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +2 -1
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +9 -8
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js +48 -5
- package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts +24 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.d.ts.map +1 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js +202 -0
- package/lib/components/explorer/QueryBuilderRelationExplorerPanel.js.map +1 -0
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +3 -3
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +25 -6
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts +42 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js +212 -0
- package/lib/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts +66 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js +265 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStats.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts +28 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js +148 -0
- package/lib/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts +19 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js +196 -0
- package/lib/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts +5 -0
- package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js +64 -87
- package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts +26 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.d.ts.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.js +51 -0
- package/lib/components/result/tds/QueryBuilderTDSGridShared.js.map +1 -0
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts +5 -0
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.d.ts.map +1 -1
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js +169 -60
- package/lib/components/result/tds/QueryBuilderTDSSimpleGridResult.js.map +1 -1
- package/lib/components/workflows/AccessorQueryBuilder.d.ts +18 -0
- package/lib/components/workflows/AccessorQueryBuilder.d.ts.map +1 -0
- package/lib/components/workflows/AccessorQueryBuilder.js +87 -0
- package/lib/components/workflows/AccessorQueryBuilder.js.map +1 -0
- package/lib/components/workflows/ClassQueryBuilder.js +5 -5
- package/lib/components/workflows/ClassQueryBuilder.js.map +1 -1
- package/lib/data-access-overview.css +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.d.ts +4 -0
- package/lib/graph/QueryBuilderMetaModelConst.d.ts.map +1 -1
- package/lib/graph/QueryBuilderMetaModelConst.js +4 -0
- package/lib/graph/QueryBuilderMetaModelConst.js.map +1 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +7 -1
- package/lib/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +2 -0
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +93 -3
- package/lib/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConfig.d.ts +3 -0
- package/lib/stores/QueryBuilderConfig.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConfig.js +3 -0
- package/lib/stores/QueryBuilderConfig.js.map +1 -1
- package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderResultState.js +13 -3
- package/lib/stores/QueryBuilderResultState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +14 -4
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +41 -13
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.js +51 -20
- package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.d.ts +1 -0
- package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.js +1 -0
- package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
- package/lib/stores/QueryBuilderTypeaheadHelper.js +2 -2
- package/lib/stores/QueryBuilderTypeaheadHelper.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js +54 -45
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +12 -2
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js +12 -2
- package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +2 -2
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +2 -2
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +4 -3
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts +2 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js +19 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSHelper.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +7 -4
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +59 -12
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts +16 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js +102 -24
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts +2 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +16 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js +3 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js +11 -2
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js +16 -12
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +4 -3
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +19 -9
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js +57 -5
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts +4 -3
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js +85 -6
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js +4 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js +3 -0
- package/lib/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.js.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js +4 -4
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.js +2 -2
- package/lib/stores/workflows/MappingQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -2
- package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts +18 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.d.ts.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js +32 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderHelper.js.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts +57 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts.map +1 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js +125 -0
- package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js.map +1 -0
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +4 -4
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
- package/package.json +7 -7
- package/src/components/QueryBuilder.tsx +2 -1
- package/src/components/QueryBuilderSideBar.tsx +12 -8
- package/src/components/explorer/QueryBuilderExplorerPanel.tsx +77 -14
- package/src/components/explorer/QueryBuilderRelationExplorerPanel.tsx +536 -0
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +1 -0
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +3 -3
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +62 -4
- package/src/components/result/QueryBuilderResultPanel.tsx +6 -2
- package/src/components/result/tds/QueryBuilderTDSAsyncCellSelectionStats.ts +254 -0
- package/src/components/result/tds/QueryBuilderTDSCellSelectionStats.ts +397 -0
- package/src/components/result/tds/QueryBuilderTDSCellSelectionStatsBar.tsx +439 -0
- package/src/components/result/tds/QueryBuilderTDSGridKeyboardShortcuts.ts +270 -0
- package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +107 -112
- package/src/components/result/tds/QueryBuilderTDSGridShared.ts +76 -0
- package/src/components/result/tds/QueryBuilderTDSSimpleGridResult.tsx +272 -99
- package/src/components/workflows/AccessorQueryBuilder.tsx +211 -0
- package/src/components/workflows/ClassQueryBuilder.tsx +5 -5
- package/src/graph/QueryBuilderMetaModelConst.ts +5 -0
- package/src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +28 -0
- package/src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +223 -4
- package/src/index.ts +2 -0
- package/src/stores/QueryBuilderConfig.ts +3 -0
- package/src/stores/QueryBuilderResultState.ts +22 -9
- package/src/stores/QueryBuilderState.ts +47 -12
- package/src/stores/QueryBuilderStateBuilder.ts +107 -43
- package/src/stores/QueryBuilderStateHashUtils.ts +1 -0
- package/src/stores/QueryBuilderTypeaheadHelper.ts +2 -2
- package/src/stores/QueryBuilderValueSpecificationBuilder.ts +72 -59
- package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -1
- package/src/stores/explorer/QueryBuilderExplorerState.ts +26 -2
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +1 -2
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +4 -3
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +1 -1
- package/src/stores/fetch-structure/tds/QueryBuilderTDSHelper.ts +42 -0
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +135 -19
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts +197 -38
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +30 -0
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionValueSpecificationBuilder.ts +3 -3
- package/src/stores/fetch-structure/tds/projection/QueryBuilderRelationProjectValueSpecBuilder.ts +21 -0
- package/src/stores/fetch-structure/tds/projection/QueryBuilderTypedProjectionStateBuilder.ts +25 -16
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +23 -9
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowStateBuilder.ts +146 -4
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowValueSpecificationBuilder.ts +145 -10
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator.ts +2 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Average.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Count.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Max.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Min.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowOperator_Sum.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_AverageRank.ts +5 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_DenseRank.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_Rank.ts +4 -0
- package/src/stores/fetch-structure/tds/window/operators/QueryBuilderTDS_WindowRankOperator_RowNumber.ts +4 -0
- package/src/stores/milestoning/QueryBuilderMilestoningState.ts +4 -4
- package/src/stores/workflows/MappingQueryBuilderState.ts +2 -2
- package/src/stores/workflows/ServiceQueryBuilderState.ts +2 -2
- package/src/stores/workflows/accessor/AccessorQueryBuilderHelper.ts +51 -0
- package/src/stores/workflows/accessor/AccessorQueryBuilderState.ts +195 -0
- package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +4 -4
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020-present, Goldman Sachs
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { forwardRef, useMemo, useRef, useState } from 'react';
|
|
18
|
+
import { observer } from 'mobx-react-lite';
|
|
19
|
+
import {
|
|
20
|
+
type TreeNodeContainerProps,
|
|
21
|
+
type TreeNodeViewProps,
|
|
22
|
+
type TreeData,
|
|
23
|
+
clsx,
|
|
24
|
+
TreeView,
|
|
25
|
+
BlankPanelContent,
|
|
26
|
+
ContextMenu,
|
|
27
|
+
MenuContent,
|
|
28
|
+
MenuContentItem,
|
|
29
|
+
DragPreviewLayer,
|
|
30
|
+
useDragPreviewLayer,
|
|
31
|
+
PanelHeader,
|
|
32
|
+
ChevronDownIcon,
|
|
33
|
+
ChevronRightIcon,
|
|
34
|
+
InfoCircleIcon,
|
|
35
|
+
Tooltip,
|
|
36
|
+
PURE_DataProductIcon,
|
|
37
|
+
PURE_IngestIcon,
|
|
38
|
+
PURE_DatabaseIcon,
|
|
39
|
+
PURE_UnknownElementTypeIcon,
|
|
40
|
+
} from '@finos/legend-art';
|
|
41
|
+
import { useDrag } from 'react-dnd';
|
|
42
|
+
import {
|
|
43
|
+
type Accessor,
|
|
44
|
+
type RelationColumn,
|
|
45
|
+
DataProductAccessor,
|
|
46
|
+
IngestionAccessor,
|
|
47
|
+
InstanceValue,
|
|
48
|
+
RelationalStoreAccessor,
|
|
49
|
+
} from '@finos/legend-graph';
|
|
50
|
+
import {
|
|
51
|
+
type QueryBuilderExplorerTreeRelationColumnDragSource,
|
|
52
|
+
type QueryBuilderExplorerTreeNodeData,
|
|
53
|
+
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
|
|
54
|
+
QueryBuilderExplorerTreeRelationColumnNodeData,
|
|
55
|
+
QueryBuilderExplorerTreeRelationRootNodeData,
|
|
56
|
+
} from '../../stores/explorer/QueryBuilderExplorerState.js';
|
|
57
|
+
import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
|
|
58
|
+
import {
|
|
59
|
+
isExplorerTreeNodeAlreadyUsed,
|
|
60
|
+
renderPropertyTypeIcon,
|
|
61
|
+
} from './QueryBuilderExplorerPanel.js';
|
|
62
|
+
import { QUERY_BUILDER_TEST_ID } from '../../__lib__/QueryBuilderTesting.js';
|
|
63
|
+
import { isNonNullable, prettyCONSTName } from '@finos/legend-shared';
|
|
64
|
+
import { QueryBuilderBaseInfoTooltip } from '../shared/QueryBuilderPropertyInfoTooltip.js';
|
|
65
|
+
import { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
|
66
|
+
import { QueryBuilderRelationColumnProjectionColumnState } from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
|
|
67
|
+
|
|
68
|
+
const RELATION_ROOT_NODE_ID = '__relation_root__';
|
|
69
|
+
|
|
70
|
+
const getAccessorIcon = (accessor: Accessor): React.ReactNode => {
|
|
71
|
+
if (accessor instanceof DataProductAccessor) {
|
|
72
|
+
return <PURE_DataProductIcon />;
|
|
73
|
+
} else if (accessor instanceof IngestionAccessor) {
|
|
74
|
+
return <PURE_IngestIcon />;
|
|
75
|
+
} else if (accessor instanceof RelationalStoreAccessor) {
|
|
76
|
+
return <PURE_DatabaseIcon />;
|
|
77
|
+
}
|
|
78
|
+
return <PURE_UnknownElementTypeIcon />;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const getAccessorPath = (accessor: Accessor): string =>
|
|
82
|
+
[accessor.accessorOwner, accessor.schema, accessor.accessor]
|
|
83
|
+
.filter(isNonNullable)
|
|
84
|
+
.join('.');
|
|
85
|
+
|
|
86
|
+
const getColumnTypeLabel = (column: RelationColumn): string => {
|
|
87
|
+
const typeName = column.genericType.value.rawType.name;
|
|
88
|
+
const typeVariableValues = column.genericType.value.typeVariableValues;
|
|
89
|
+
if (typeVariableValues && typeVariableValues.length > 0) {
|
|
90
|
+
const args = typeVariableValues
|
|
91
|
+
.map((v) => (v instanceof InstanceValue ? v.values[0] : undefined))
|
|
92
|
+
.filter(isNonNullable);
|
|
93
|
+
if (args.length > 0) {
|
|
94
|
+
return `${typeName}(${args.join(', ')})`;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return typeName;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const buildRelationTreeData = (
|
|
101
|
+
accessor: Accessor,
|
|
102
|
+
): TreeData<QueryBuilderExplorerTreeNodeData> => {
|
|
103
|
+
const rootIds: string[] = [];
|
|
104
|
+
const nodes = new Map<string, QueryBuilderExplorerTreeNodeData>();
|
|
105
|
+
|
|
106
|
+
const columnIds: string[] = [];
|
|
107
|
+
accessor.relationType.columns.forEach((column) => {
|
|
108
|
+
const type = column.genericType.value.rawType;
|
|
109
|
+
const node = new QueryBuilderExplorerTreeRelationColumnNodeData(
|
|
110
|
+
column.name,
|
|
111
|
+
column.name,
|
|
112
|
+
column.name,
|
|
113
|
+
column,
|
|
114
|
+
type,
|
|
115
|
+
{ mapped: true },
|
|
116
|
+
);
|
|
117
|
+
columnIds.push(node.id);
|
|
118
|
+
nodes.set(node.id, node);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const rootNode = new QueryBuilderExplorerTreeRelationRootNodeData(
|
|
122
|
+
RELATION_ROOT_NODE_ID,
|
|
123
|
+
accessor.accessor,
|
|
124
|
+
accessor.accessor,
|
|
125
|
+
false,
|
|
126
|
+
accessor.relationType,
|
|
127
|
+
{ mapped: true },
|
|
128
|
+
columnIds,
|
|
129
|
+
);
|
|
130
|
+
rootNode.setIsOpen(true);
|
|
131
|
+
rootIds.push(rootNode.id);
|
|
132
|
+
nodes.set(rootNode.id, rootNode);
|
|
133
|
+
|
|
134
|
+
return { rootIds, nodes };
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const QueryBuilderRelationExplorerContextMenu = observer(
|
|
138
|
+
forwardRef<
|
|
139
|
+
HTMLDivElement,
|
|
140
|
+
{
|
|
141
|
+
queryBuilderState: QueryBuilderState;
|
|
142
|
+
node: QueryBuilderExplorerTreeNodeData;
|
|
143
|
+
accessor: Accessor;
|
|
144
|
+
}
|
|
145
|
+
>(function QueryBuilderRelationExplorerContextMenu(props, ref) {
|
|
146
|
+
const { queryBuilderState, node, accessor } = props;
|
|
147
|
+
const tdsState =
|
|
148
|
+
queryBuilderState.fetchStructureState.implementation instanceof
|
|
149
|
+
QueryBuilderTDSState
|
|
150
|
+
? queryBuilderState.fetchStructureState.implementation
|
|
151
|
+
: undefined;
|
|
152
|
+
|
|
153
|
+
const addColumnToFetchStructure = (): void => {
|
|
154
|
+
if (
|
|
155
|
+
tdsState &&
|
|
156
|
+
node instanceof QueryBuilderExplorerTreeRelationColumnNodeData
|
|
157
|
+
) {
|
|
158
|
+
tdsState.addColumn(
|
|
159
|
+
new QueryBuilderRelationColumnProjectionColumnState(
|
|
160
|
+
tdsState,
|
|
161
|
+
node.column,
|
|
162
|
+
true,
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const addAllColumnsToFetchStructure = (): void => {
|
|
169
|
+
if (tdsState) {
|
|
170
|
+
accessor.relationType.columns.forEach((column) => {
|
|
171
|
+
tdsState.addColumn(
|
|
172
|
+
new QueryBuilderRelationColumnProjectionColumnState(
|
|
173
|
+
tdsState,
|
|
174
|
+
column,
|
|
175
|
+
true,
|
|
176
|
+
),
|
|
177
|
+
);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<MenuContent ref={ref}>
|
|
184
|
+
{node instanceof QueryBuilderExplorerTreeRelationColumnNodeData && (
|
|
185
|
+
<MenuContentItem onClick={addColumnToFetchStructure}>
|
|
186
|
+
Add Column to Fetch Structure
|
|
187
|
+
</MenuContentItem>
|
|
188
|
+
)}
|
|
189
|
+
{node instanceof QueryBuilderExplorerTreeRelationRootNodeData && (
|
|
190
|
+
<MenuContentItem onClick={addAllColumnsToFetchStructure}>
|
|
191
|
+
Add Columns to Fetch Structure
|
|
192
|
+
</MenuContentItem>
|
|
193
|
+
)}
|
|
194
|
+
</MenuContent>
|
|
195
|
+
);
|
|
196
|
+
}),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const QueryBuilderRelationNodeContainer = observer(
|
|
200
|
+
(
|
|
201
|
+
props: TreeNodeContainerProps<
|
|
202
|
+
QueryBuilderExplorerTreeNodeData,
|
|
203
|
+
{
|
|
204
|
+
queryBuilderState: QueryBuilderState;
|
|
205
|
+
accessor: Accessor;
|
|
206
|
+
}
|
|
207
|
+
>,
|
|
208
|
+
) => {
|
|
209
|
+
const { node, level, stepPaddingInRem, onNodeSelect, innerProps } = props;
|
|
210
|
+
const { queryBuilderState, accessor } = innerProps;
|
|
211
|
+
const isRoot = node instanceof QueryBuilderExplorerTreeRelationRootNodeData;
|
|
212
|
+
const isColumn =
|
|
213
|
+
node instanceof QueryBuilderExplorerTreeRelationColumnNodeData;
|
|
214
|
+
const [isSelectedFromContextMenu, setIsSelectedFromContextMenu] =
|
|
215
|
+
useState(false);
|
|
216
|
+
|
|
217
|
+
const [, dragConnector, dragPreviewConnector] =
|
|
218
|
+
useDrag<QueryBuilderExplorerTreeRelationColumnDragSource>(
|
|
219
|
+
() => ({
|
|
220
|
+
type: QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
|
|
221
|
+
item: () => ({
|
|
222
|
+
node: node as QueryBuilderExplorerTreeRelationColumnNodeData,
|
|
223
|
+
}),
|
|
224
|
+
}),
|
|
225
|
+
[node],
|
|
226
|
+
);
|
|
227
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
228
|
+
if (isColumn) {
|
|
229
|
+
dragConnector(ref);
|
|
230
|
+
}
|
|
231
|
+
useDragPreviewLayer(dragPreviewConnector);
|
|
232
|
+
|
|
233
|
+
const explorerState = queryBuilderState.explorerState;
|
|
234
|
+
const columnLabel =
|
|
235
|
+
isColumn && explorerState.humanizePropertyName
|
|
236
|
+
? prettyCONSTName(node.label)
|
|
237
|
+
: node.label;
|
|
238
|
+
|
|
239
|
+
const selectNode = (): void => onNodeSelect?.(node);
|
|
240
|
+
const onContextMenuOpen = (): void => setIsSelectedFromContextMenu(true);
|
|
241
|
+
const onContextMenuClose = (): void => setIsSelectedFromContextMenu(false);
|
|
242
|
+
|
|
243
|
+
if (isRoot) {
|
|
244
|
+
const isExpanded = node.isOpen === true;
|
|
245
|
+
const nodeExpandIcon = isExpanded ? (
|
|
246
|
+
<ChevronDownIcon />
|
|
247
|
+
) : (
|
|
248
|
+
<ChevronRightIcon />
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
return (
|
|
252
|
+
<ContextMenu
|
|
253
|
+
content={
|
|
254
|
+
<QueryBuilderRelationExplorerContextMenu
|
|
255
|
+
queryBuilderState={queryBuilderState}
|
|
256
|
+
node={node}
|
|
257
|
+
accessor={accessor}
|
|
258
|
+
/>
|
|
259
|
+
}
|
|
260
|
+
menuProps={{ elevation: 7 }}
|
|
261
|
+
onOpen={onContextMenuOpen}
|
|
262
|
+
onClose={onContextMenuClose}
|
|
263
|
+
>
|
|
264
|
+
<div
|
|
265
|
+
className={clsx(
|
|
266
|
+
'tree-view__node__container query-builder-explorer-tree__node__container',
|
|
267
|
+
{
|
|
268
|
+
'query-builder-explorer-tree__node__container--selected-from-context-menu':
|
|
269
|
+
isSelectedFromContextMenu,
|
|
270
|
+
'query-builder-explorer-tree__node__container--highlighted':
|
|
271
|
+
explorerState.highlightUsedProperties &&
|
|
272
|
+
isExplorerTreeNodeAlreadyUsed(node, queryBuilderState),
|
|
273
|
+
},
|
|
274
|
+
)}
|
|
275
|
+
onClick={selectNode}
|
|
276
|
+
style={{
|
|
277
|
+
paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
|
|
278
|
+
display: 'flex',
|
|
279
|
+
}}
|
|
280
|
+
>
|
|
281
|
+
<div className="tree-view__node__icon query-builder-explorer-tree__node__icon">
|
|
282
|
+
<div className="query-builder-explorer-tree__expand-icon">
|
|
283
|
+
{nodeExpandIcon}
|
|
284
|
+
</div>
|
|
285
|
+
<div className="query-builder-explorer-tree__type-icon">
|
|
286
|
+
{getAccessorIcon(accessor)}
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
<div className="tree-view__node__label query-builder-explorer-tree__node__label query-builder-explorer-tree__node__label--with-action">
|
|
290
|
+
{node.label}
|
|
291
|
+
</div>
|
|
292
|
+
<div className="query-builder-explorer-tree__node__actions">
|
|
293
|
+
<Tooltip
|
|
294
|
+
arrow={true}
|
|
295
|
+
classes={{
|
|
296
|
+
tooltip: 'query-builder__tooltip',
|
|
297
|
+
arrow: 'query-builder__tooltip__arrow',
|
|
298
|
+
tooltipPlacementRight: 'query-builder__tooltip--right',
|
|
299
|
+
}}
|
|
300
|
+
slotProps={{
|
|
301
|
+
transition: { timeout: 0 },
|
|
302
|
+
}}
|
|
303
|
+
title={
|
|
304
|
+
<div className="query-builder__tooltip__content">
|
|
305
|
+
<div className="query-builder__tooltip__item">
|
|
306
|
+
<div className="query-builder__tooltip__item__label">
|
|
307
|
+
Type
|
|
308
|
+
</div>
|
|
309
|
+
<div className="query-builder__tooltip__item__value">
|
|
310
|
+
{accessor.accessorOwnerLabel}
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
<div className="query-builder__tooltip__item">
|
|
314
|
+
<div className="query-builder__tooltip__item__label">
|
|
315
|
+
Path
|
|
316
|
+
</div>
|
|
317
|
+
<div className="query-builder__tooltip__item__value">
|
|
318
|
+
{getAccessorPath(accessor)}
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
}
|
|
323
|
+
>
|
|
324
|
+
<div
|
|
325
|
+
className="query-builder-explorer-tree__node__action query-builder-explorer-tree__node__info"
|
|
326
|
+
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TOOLTIP_ICON}
|
|
327
|
+
>
|
|
328
|
+
<InfoCircleIcon />
|
|
329
|
+
</div>
|
|
330
|
+
</Tooltip>
|
|
331
|
+
</div>
|
|
332
|
+
</div>
|
|
333
|
+
</ContextMenu>
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Column node
|
|
338
|
+
const columnNode = isColumn ? node : undefined;
|
|
339
|
+
const nodeTypeIcon = isColumn
|
|
340
|
+
? renderPropertyTypeIcon(node.type)
|
|
341
|
+
: undefined;
|
|
342
|
+
const columnTypeLabel = columnNode
|
|
343
|
+
? getColumnTypeLabel(columnNode.column)
|
|
344
|
+
: node.type.path;
|
|
345
|
+
|
|
346
|
+
return (
|
|
347
|
+
<ContextMenu
|
|
348
|
+
content={
|
|
349
|
+
<QueryBuilderRelationExplorerContextMenu
|
|
350
|
+
queryBuilderState={queryBuilderState}
|
|
351
|
+
node={node}
|
|
352
|
+
accessor={accessor}
|
|
353
|
+
/>
|
|
354
|
+
}
|
|
355
|
+
menuProps={{ elevation: 7 }}
|
|
356
|
+
onOpen={onContextMenuOpen}
|
|
357
|
+
onClose={onContextMenuClose}
|
|
358
|
+
>
|
|
359
|
+
<div
|
|
360
|
+
className={clsx(
|
|
361
|
+
'tree-view__node__container query-builder-explorer-tree__node__container',
|
|
362
|
+
{
|
|
363
|
+
'query-builder-explorer-tree__node__container--selected-from-context-menu':
|
|
364
|
+
isSelectedFromContextMenu,
|
|
365
|
+
'query-builder-explorer-tree__node__container--highlighted':
|
|
366
|
+
explorerState.highlightUsedProperties &&
|
|
367
|
+
isExplorerTreeNodeAlreadyUsed(node, queryBuilderState),
|
|
368
|
+
},
|
|
369
|
+
)}
|
|
370
|
+
onClick={selectNode}
|
|
371
|
+
ref={ref}
|
|
372
|
+
style={{
|
|
373
|
+
paddingLeft: `${(level - 1) * (stepPaddingInRem ?? 1) + 0.5}rem`,
|
|
374
|
+
display: 'flex',
|
|
375
|
+
}}
|
|
376
|
+
>
|
|
377
|
+
<div className="tree-view__node__icon query-builder-explorer-tree__node__icon">
|
|
378
|
+
<div className="query-builder-explorer-tree__expand-icon">
|
|
379
|
+
<div />
|
|
380
|
+
</div>
|
|
381
|
+
<div className="query-builder-explorer-tree__type-icon">
|
|
382
|
+
{nodeTypeIcon}
|
|
383
|
+
</div>
|
|
384
|
+
</div>
|
|
385
|
+
<div className="tree-view__node__label query-builder-explorer-tree__node__label query-builder-explorer-tree__node__label--with-action">
|
|
386
|
+
{columnLabel}
|
|
387
|
+
</div>
|
|
388
|
+
<div className="query-builder-explorer-tree__node__actions">
|
|
389
|
+
<QueryBuilderBaseInfoTooltip
|
|
390
|
+
title={columnLabel}
|
|
391
|
+
data={[
|
|
392
|
+
{
|
|
393
|
+
label: 'Type',
|
|
394
|
+
value: columnTypeLabel,
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
label: 'Column',
|
|
398
|
+
value: node.label,
|
|
399
|
+
},
|
|
400
|
+
]}
|
|
401
|
+
>
|
|
402
|
+
<div
|
|
403
|
+
className="query-builder-explorer-tree__node__action query-builder-explorer-tree__node__info"
|
|
404
|
+
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_TOOLTIP_ICON}
|
|
405
|
+
>
|
|
406
|
+
<InfoCircleIcon />
|
|
407
|
+
</div>
|
|
408
|
+
</QueryBuilderBaseInfoTooltip>
|
|
409
|
+
</div>
|
|
410
|
+
</div>
|
|
411
|
+
</ContextMenu>
|
|
412
|
+
);
|
|
413
|
+
},
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
const QueryBuilderRelationTreeNodeView = observer(
|
|
417
|
+
(
|
|
418
|
+
props: TreeNodeViewProps<
|
|
419
|
+
QueryBuilderExplorerTreeNodeData,
|
|
420
|
+
{
|
|
421
|
+
queryBuilderState: QueryBuilderState;
|
|
422
|
+
accessor: Accessor;
|
|
423
|
+
}
|
|
424
|
+
>,
|
|
425
|
+
) => {
|
|
426
|
+
const {
|
|
427
|
+
node,
|
|
428
|
+
level,
|
|
429
|
+
onNodeSelect,
|
|
430
|
+
getChildNodes,
|
|
431
|
+
stepPaddingInRem,
|
|
432
|
+
innerProps,
|
|
433
|
+
components,
|
|
434
|
+
} = props;
|
|
435
|
+
|
|
436
|
+
return (
|
|
437
|
+
<div className="tree-view__node__block">
|
|
438
|
+
<QueryBuilderRelationNodeContainer
|
|
439
|
+
node={node}
|
|
440
|
+
level={level + 1}
|
|
441
|
+
stepPaddingInRem={stepPaddingInRem}
|
|
442
|
+
onNodeSelect={onNodeSelect}
|
|
443
|
+
innerProps={innerProps}
|
|
444
|
+
/>
|
|
445
|
+
{node.isOpen &&
|
|
446
|
+
getChildNodes(node).map((childNode) => (
|
|
447
|
+
<QueryBuilderRelationTreeNodeView
|
|
448
|
+
key={childNode.id}
|
|
449
|
+
node={childNode}
|
|
450
|
+
level={level + 1}
|
|
451
|
+
components={components}
|
|
452
|
+
onNodeSelect={onNodeSelect}
|
|
453
|
+
getChildNodes={getChildNodes}
|
|
454
|
+
innerProps={innerProps}
|
|
455
|
+
/>
|
|
456
|
+
))}
|
|
457
|
+
</div>
|
|
458
|
+
);
|
|
459
|
+
},
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
const QueryBuilderRelationExplorerTree = observer(
|
|
463
|
+
(props: { queryBuilderState: QueryBuilderState; accessor: Accessor }) => {
|
|
464
|
+
const { queryBuilderState, accessor } = props;
|
|
465
|
+
// NOTE: we must memoize tree data so node state (e.g. isOpen) persists across re-renders
|
|
466
|
+
const treeData = useMemo(() => buildRelationTreeData(accessor), [accessor]);
|
|
467
|
+
const onNodeSelect = (node: QueryBuilderExplorerTreeNodeData): void => {
|
|
468
|
+
if (node instanceof QueryBuilderExplorerTreeRelationRootNodeData) {
|
|
469
|
+
node.setIsOpen(!node.isOpen);
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
const getChildNodes = (
|
|
473
|
+
node: QueryBuilderExplorerTreeNodeData,
|
|
474
|
+
): QueryBuilderExplorerTreeNodeData[] => {
|
|
475
|
+
if (node instanceof QueryBuilderExplorerTreeRelationRootNodeData) {
|
|
476
|
+
return node.childrenIds
|
|
477
|
+
.map((id) => treeData.nodes.get(id))
|
|
478
|
+
.filter(isNonNullable);
|
|
479
|
+
}
|
|
480
|
+
return [];
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
return (
|
|
484
|
+
<TreeView
|
|
485
|
+
components={{
|
|
486
|
+
TreeNodeContainer: QueryBuilderRelationNodeContainer,
|
|
487
|
+
TreeNodeView: QueryBuilderRelationTreeNodeView,
|
|
488
|
+
}}
|
|
489
|
+
className="query-builder-explorer-tree__root"
|
|
490
|
+
treeData={treeData}
|
|
491
|
+
onNodeSelect={onNodeSelect}
|
|
492
|
+
getChildNodes={getChildNodes}
|
|
493
|
+
innerProps={{
|
|
494
|
+
queryBuilderState,
|
|
495
|
+
accessor,
|
|
496
|
+
}}
|
|
497
|
+
/>
|
|
498
|
+
);
|
|
499
|
+
},
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
export const QueryBuilderRelationExplorerPanel = observer(
|
|
503
|
+
(props: { queryBuilderState: QueryBuilderState; accessor: Accessor }) => {
|
|
504
|
+
const { queryBuilderState, accessor } = props;
|
|
505
|
+
|
|
506
|
+
return (
|
|
507
|
+
<div
|
|
508
|
+
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_EXPLORER}
|
|
509
|
+
className="panel query-builder__explorer"
|
|
510
|
+
>
|
|
511
|
+
<PanelHeader title="columns" />
|
|
512
|
+
<div className="panel__content query-builder-explorer-tree__content">
|
|
513
|
+
<DragPreviewLayer
|
|
514
|
+
labelGetter={(
|
|
515
|
+
item: QueryBuilderExplorerTreeRelationColumnDragSource,
|
|
516
|
+
): string => {
|
|
517
|
+
const dragNode = item.node;
|
|
518
|
+
return queryBuilderState.explorerState.humanizePropertyName
|
|
519
|
+
? prettyCONSTName(dragNode.label)
|
|
520
|
+
: dragNode.label;
|
|
521
|
+
}}
|
|
522
|
+
types={[QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN]}
|
|
523
|
+
/>
|
|
524
|
+
{accessor.relationType.columns.length === 0 ? (
|
|
525
|
+
<BlankPanelContent>No columns</BlankPanelContent>
|
|
526
|
+
) : (
|
|
527
|
+
<QueryBuilderRelationExplorerTree
|
|
528
|
+
queryBuilderState={queryBuilderState}
|
|
529
|
+
accessor={accessor}
|
|
530
|
+
/>
|
|
531
|
+
)}
|
|
532
|
+
</div>
|
|
533
|
+
</div>
|
|
534
|
+
);
|
|
535
|
+
},
|
|
536
|
+
);
|
|
@@ -106,6 +106,7 @@ import {
|
|
|
106
106
|
QUERY_BUILDER_WINDOW_COLUMN_DND_TYPE,
|
|
107
107
|
} from '../../stores/fetch-structure/tds/window/QueryBuilderWindowState.js';
|
|
108
108
|
import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/tds/QueryBuilderTDSColumnState.js';
|
|
109
|
+
|
|
109
110
|
import { QueryBuilderTelemetryHelper } from '../../__lib__/QueryBuilderTelemetryHelper.js';
|
|
110
111
|
import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
|
|
111
112
|
import {
|
|
@@ -481,10 +481,10 @@ export const QueryResultModifierModal = observer(
|
|
|
481
481
|
let newParamStates: LambdaParameterState[] = [];
|
|
482
482
|
if (
|
|
483
483
|
(!businessDate || !processingDate) &&
|
|
484
|
-
milestoningState.queryBuilderState.
|
|
484
|
+
milestoningState.queryBuilderState.sourceClass
|
|
485
485
|
) {
|
|
486
486
|
const stereotype = getMilestoneTemporalStereotype(
|
|
487
|
-
milestoningState.queryBuilderState.
|
|
487
|
+
milestoningState.queryBuilderState.sourceClass,
|
|
488
488
|
milestoningState.queryBuilderState.graphManagerState.graph,
|
|
489
489
|
);
|
|
490
490
|
if (stereotype) {
|
|
@@ -736,7 +736,7 @@ export const QueryResultModifierModal = observer(
|
|
|
736
736
|
milestoningState.processingDate,
|
|
737
737
|
milestoningState.startDate,
|
|
738
738
|
milestoningState.endDate,
|
|
739
|
-
milestoningState.queryBuilderState.
|
|
739
|
+
milestoningState.queryBuilderState.sourceElement,
|
|
740
740
|
]);
|
|
741
741
|
|
|
742
742
|
return (
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
type QueryBuilderExplorerTreeDragSource,
|
|
49
49
|
buildPropertyExpressionFromExplorerTreeNodeData,
|
|
50
50
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
|
|
51
|
+
type QueryBuilderExplorerTreeRelationColumnNodeData,
|
|
51
52
|
} from '../../stores/explorer/QueryBuilderExplorerState.js';
|
|
52
53
|
import {
|
|
53
54
|
type DropTargetMonitor,
|
|
@@ -60,6 +61,7 @@ import {
|
|
|
60
61
|
type QueryBuilderProjectionColumnState,
|
|
61
62
|
QueryBuilderDerivationProjectionColumnState,
|
|
62
63
|
QueryBuilderSimpleProjectionColumnState,
|
|
64
|
+
QueryBuilderRelationColumnProjectionColumnState,
|
|
63
65
|
QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
|
|
64
66
|
} from '../../stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js';
|
|
65
67
|
import {
|
|
@@ -133,6 +135,7 @@ import { WavgParamDNDZone } from './QueryBuilderAggParam.js';
|
|
|
133
135
|
const CAN_DROP_MAIN_GROUP_DND_TYPES = [
|
|
134
136
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
|
|
135
137
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
|
|
138
|
+
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
|
|
136
139
|
QUERY_BUILDER_FILTER_DND_TYPE.CONDITION,
|
|
137
140
|
QUERY_BUILDER_FUNCTION_DND_TYPE,
|
|
138
141
|
];
|
|
@@ -172,13 +175,22 @@ const QueryBuilderProjectionColumnContextMenu = observer(
|
|
|
172
175
|
projectionColumnState.tdsState.transformSimpleProjectionToDerivation(
|
|
173
176
|
projectionColumnState,
|
|
174
177
|
);
|
|
178
|
+
} else if (
|
|
179
|
+
projectionColumnState instanceof
|
|
180
|
+
QueryBuilderRelationColumnProjectionColumnState
|
|
181
|
+
) {
|
|
182
|
+
projectionColumnState.tdsState.transformRelationColumnProjectionToDerivation(
|
|
183
|
+
projectionColumnState,
|
|
184
|
+
);
|
|
175
185
|
}
|
|
176
186
|
};
|
|
177
187
|
|
|
178
188
|
return (
|
|
179
189
|
<MenuContent ref={ref}>
|
|
180
|
-
{projectionColumnState instanceof
|
|
181
|
-
QueryBuilderSimpleProjectionColumnState
|
|
190
|
+
{(projectionColumnState instanceof
|
|
191
|
+
QueryBuilderSimpleProjectionColumnState ||
|
|
192
|
+
projectionColumnState instanceof
|
|
193
|
+
QueryBuilderRelationColumnProjectionColumnState) && (
|
|
182
194
|
<MenuContentItem onClick={convertToDerivation}>
|
|
183
195
|
Convert To Derivation
|
|
184
196
|
</MenuContentItem>
|
|
@@ -430,7 +442,7 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
|
430
442
|
|
|
431
443
|
// calendar
|
|
432
444
|
const aggregateCalendarFunctionDateColumns =
|
|
433
|
-
tdsState.queryBuilderState.
|
|
445
|
+
tdsState.queryBuilderState.sourceClass?.properties.filter((p) => {
|
|
434
446
|
const _type = p.genericType.value.rawType.name;
|
|
435
447
|
if (
|
|
436
448
|
_type === PRIMITIVE_TYPE.DATE ||
|
|
@@ -804,7 +816,9 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
|
804
816
|
disabled={
|
|
805
817
|
!(
|
|
806
818
|
projectionColumnState instanceof
|
|
807
|
-
|
|
819
|
+
QueryBuilderSimpleProjectionColumnState ||
|
|
820
|
+
projectionColumnState instanceof
|
|
821
|
+
QueryBuilderRelationColumnProjectionColumnState
|
|
808
822
|
)
|
|
809
823
|
}
|
|
810
824
|
className={clsx('query-builder__projection__column__context-menu', {
|
|
@@ -896,6 +910,35 @@ const QueryBuilderProjectionColumnEditor = observer(
|
|
|
896
910
|
</div>
|
|
897
911
|
</>
|
|
898
912
|
)}
|
|
913
|
+
{projectionColumnState instanceof
|
|
914
|
+
QueryBuilderRelationColumnProjectionColumnState && (
|
|
915
|
+
<>
|
|
916
|
+
<QueryBuilderDerivationInfoTooltip
|
|
917
|
+
title={projectionColumnState.columnName}
|
|
918
|
+
type={projectionColumnState.getColumnType()}
|
|
919
|
+
placement="bottom-start"
|
|
920
|
+
>
|
|
921
|
+
<div className="query-builder-property-expression-badge__property__info">
|
|
922
|
+
<InfoCircleIcon />
|
|
923
|
+
</div>
|
|
924
|
+
</QueryBuilderDerivationInfoTooltip>
|
|
925
|
+
<div className="query-builder__projection__column__value">
|
|
926
|
+
<QueryBuilderEditablePropertyName
|
|
927
|
+
columnName={projectionColumnState.columnName}
|
|
928
|
+
setColumnName={setColumnName}
|
|
929
|
+
error={
|
|
930
|
+
isDuplicatedColumnName
|
|
931
|
+
? 'Duplicated column'
|
|
932
|
+
: projectionColumnState.columnName.length === 0
|
|
933
|
+
? 'Empty column name'
|
|
934
|
+
: undefined
|
|
935
|
+
}
|
|
936
|
+
title={projectionColumnState.columnName}
|
|
937
|
+
defaultColumnName="(column)"
|
|
938
|
+
/>
|
|
939
|
+
</div>
|
|
940
|
+
</>
|
|
941
|
+
)}
|
|
899
942
|
<div className="query-builder__projection__column__aggregate">
|
|
900
943
|
<div className="query-builder__projection__column__aggregate__operator">
|
|
901
944
|
{aggregateColumnState && (
|
|
@@ -1309,6 +1352,21 @@ export const QueryBuilderTDSPanel = observer(
|
|
|
1309
1352
|
),
|
|
1310
1353
|
);
|
|
1311
1354
|
break;
|
|
1355
|
+
case QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN: {
|
|
1356
|
+
const dragNode = (
|
|
1357
|
+
item as unknown as {
|
|
1358
|
+
node: QueryBuilderExplorerTreeRelationColumnNodeData;
|
|
1359
|
+
}
|
|
1360
|
+
).node;
|
|
1361
|
+
tdsState.addColumn(
|
|
1362
|
+
new QueryBuilderRelationColumnProjectionColumnState(
|
|
1363
|
+
tdsState,
|
|
1364
|
+
dragNode.column,
|
|
1365
|
+
true,
|
|
1366
|
+
),
|
|
1367
|
+
);
|
|
1368
|
+
break;
|
|
1369
|
+
}
|
|
1312
1370
|
case QUERY_BUILDER_FILTER_DND_TYPE.CONDITION:
|
|
1313
1371
|
if (item.node instanceof QueryBuilderFilterTreeConditionNodeData) {
|
|
1314
1372
|
const propertyExpression = isExistsNodeChild(item.node)
|