@finos/legend-query-builder 4.4.0 → 4.5.1
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.js +8 -2
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/execution-plan/AllocationExecutionNodeViewer.js +1 -1
- package/lib/components/execution-plan/AllocationExecutionNodeViewer.js.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.d.ts +7 -0
- package/lib/components/execution-plan/ExecutionPlanViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/ExecutionPlanViewer.js +109 -27
- package/lib/components/execution-plan/ExecutionPlanViewer.js.map +1 -1
- package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/FunctionParametersValidationNodeViewer.js.map +1 -1
- package/lib/components/execution-plan/ImplementationViewer.d.ts +23 -0
- package/lib/components/execution-plan/ImplementationViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/ImplementationViewer.js +35 -0
- package/lib/components/execution-plan/ImplementationViewer.js.map +1 -0
- package/lib/components/execution-plan/PartialClassResultViewer.d.ts +21 -0
- package/lib/components/execution-plan/PartialClassResultViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/PartialClassResultViewer.js +24 -0
- package/lib/components/execution-plan/PartialClassResultViewer.js.map +1 -0
- package/lib/components/execution-plan/RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.d.ts +23 -0
- package/lib/components/execution-plan/RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.js +43 -0
- package/lib/components/execution-plan/RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.js.map +1 -0
- package/lib/components/execution-plan/RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.d.ts +23 -0
- package/lib/components/execution-plan/RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.js +47 -0
- package/lib/components/execution-plan/RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.js.map +1 -0
- package/lib/components/execution-plan/RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.d.ts +23 -0
- package/lib/components/execution-plan/RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.js +43 -0
- package/lib/components/execution-plan/RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.js.map +1 -0
- package/lib/components/execution-plan/ResultTypeViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/ResultTypeViewer.js +5 -1
- package/lib/components/execution-plan/ResultTypeViewer.js.map +1 -1
- package/lib/components/execution-plan/SQLExecutionNodeViewer.d.ts +1 -1
- package/lib/components/execution-plan/SQLExecutionNodeViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/SQLExecutionNodeViewer.js +16 -3
- package/lib/components/execution-plan/SQLExecutionNodeViewer.js.map +1 -1
- package/lib/components/execution-plan/SequenceExecutionNodeViewer.d.ts +6 -0
- package/lib/components/execution-plan/SequenceExecutionNodeViewer.d.ts.map +1 -1
- package/lib/components/execution-plan/SequenceExecutionNodeViewer.js +34 -12
- package/lib/components/execution-plan/SequenceExecutionNodeViewer.js.map +1 -1
- package/lib/components/execution-plan/StoreMappingGlobalGraphFetchExecutionNodeViewer.d.ts +23 -0
- package/lib/components/execution-plan/StoreMappingGlobalGraphFetchExecutionNodeViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/StoreMappingGlobalGraphFetchExecutionNodeViewer.js +57 -0
- package/lib/components/execution-plan/StoreMappingGlobalGraphFetchExecutionNodeViewer.js.map +1 -0
- package/lib/components/execution-plan/TempTableStrategyViewer.d.ts +28 -0
- package/lib/components/execution-plan/TempTableStrategyViewer.d.ts.map +1 -0
- package/lib/components/execution-plan/TempTableStrategyViewer.js +42 -0
- package/lib/components/execution-plan/TempTableStrategyViewer.js.map +1 -0
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts +7 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +16 -10
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js +21 -8
- package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/shared/CustomDatePicker.d.ts +2 -1
- package/lib/components/shared/CustomDatePicker.d.ts.map +1 -1
- package/lib/components/shared/CustomDatePicker.js +31 -19
- package/lib/components/shared/CustomDatePicker.js.map +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.d.ts.map +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.js +1 -1
- package/lib/components/shared/QueryBuilderVariableSelector.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/execution-plan/ExecutionPlanState.d.ts +15 -1
- package/lib/stores/execution-plan/ExecutionPlanState.d.ts.map +1 -1
- package/lib/stores/execution-plan/ExecutionPlanState.js +50 -3
- package/lib/stores/execution-plan/ExecutionPlanState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +16 -4
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.d.ts +6 -4
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js +43 -9
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.d.ts +3 -2
- package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterState.js +7 -5
- package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterStateBuilder.d.ts.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterStateBuilder.js +1 -1
- package/lib/stores/filter/QueryBuilderFilterStateBuilder.js.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/filter/QueryBuilderFilterValueSpecificationBuilder.js +5 -1
- package/lib/stores/filter/QueryBuilderFilterValueSpecificationBuilder.js.map +1 -1
- package/package.json +5 -5
- package/src/components/QueryBuilderResultPanel.tsx +7 -2
- package/src/components/execution-plan/AllocationExecutionNodeViewer.tsx +1 -1
- package/src/components/execution-plan/ExecutionPlanViewer.tsx +233 -57
- package/src/components/execution-plan/FunctionParametersValidationNodeViewer.tsx +1 -0
- package/src/components/execution-plan/ImplementationViewer.tsx +76 -0
- package/src/components/execution-plan/PartialClassResultViewer.tsx +55 -0
- package/src/components/execution-plan/RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.tsx +190 -0
- package/src/components/execution-plan/RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.tsx +219 -0
- package/src/components/execution-plan/RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.tsx +204 -0
- package/src/components/execution-plan/ResultTypeViewer.tsx +4 -0
- package/src/components/execution-plan/SQLExecutionNodeViewer.tsx +66 -44
- package/src/components/execution-plan/SequenceExecutionNodeViewer.tsx +79 -15
- package/src/components/execution-plan/StoreMappingGlobalGraphFetchExecutionNodeViewer.tsx +264 -0
- package/src/components/execution-plan/TempTableStrategyViewer.tsx +97 -0
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +23 -9
- package/src/components/filter/QueryBuilderFilterPanel.tsx +43 -7
- package/src/components/shared/CustomDatePicker.tsx +65 -27
- package/src/components/shared/QueryBuilderVariableSelector.tsx +4 -1
- package/src/stores/execution-plan/ExecutionPlanState.ts +64 -1
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +17 -7
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.ts +73 -9
- package/src/stores/filter/QueryBuilderFilterState.ts +13 -5
- package/src/stores/filter/QueryBuilderFilterStateBuilder.ts +1 -0
- package/src/stores/filter/QueryBuilderFilterValueSpecificationBuilder.ts +14 -1
- package/tsconfig.json +7 -0
@@ -52,7 +52,7 @@ export const SQLExecutionNodeViewerHelper: React.FC<{
|
|
52
52
|
resultType: ResultType;
|
53
53
|
executionPlanState: ExecutionPlanState;
|
54
54
|
}> = observer((props) => {
|
55
|
-
const { query, resultColumns,
|
55
|
+
const { query, resultColumns, executionPlanState } = props;
|
56
56
|
const applicationStore = executionPlanState.applicationStore;
|
57
57
|
const copyExpression = (value: string): void => {
|
58
58
|
applicationStore.clipboardService
|
@@ -66,7 +66,6 @@ export const SQLExecutionNodeViewerHelper: React.FC<{
|
|
66
66
|
)
|
67
67
|
.catch(applicationStore.alertUnhandledError);
|
68
68
|
};
|
69
|
-
|
70
69
|
return (
|
71
70
|
<>
|
72
71
|
<div className="query-builder__sql__container">
|
@@ -89,46 +88,60 @@ export const SQLExecutionNodeViewerHelper: React.FC<{
|
|
89
88
|
</PanelListItem>
|
90
89
|
</div>
|
91
90
|
<div className="query-builder__sql__container__code-editor">
|
91
|
+
{/* Replace special characters to fix SQL-formatter bug*/}
|
92
92
|
<CodeEditor
|
93
|
-
inputValue={tryToFormatSql(
|
93
|
+
inputValue={tryToFormatSql(
|
94
|
+
query
|
95
|
+
.replaceAll('$', 'changeDollar')
|
96
|
+
.replaceAll('?', 'changeQuestion')
|
97
|
+
.replaceAll('{', 'changeOpenCurlyBracket')
|
98
|
+
.replaceAll('}', 'changeCloseCurlyBracket')
|
99
|
+
.replaceAll("'", 'changeSingleQuote'),
|
100
|
+
)
|
101
|
+
.replaceAll('changeDollar', '$')
|
102
|
+
.replaceAll('changeQuestion', '?')
|
103
|
+
.replaceAll('changeOpenCurlyBracket', '{')
|
104
|
+
.replaceAll('changeCloseCurlyBracket', '}')
|
105
|
+
.replaceAll('changeSingleQuote', "'")}
|
94
106
|
language={CODE_EDITOR_LANGUAGE.SQL}
|
95
107
|
/>
|
96
108
|
</div>
|
97
109
|
<PanelDivider />
|
98
110
|
</div>
|
99
111
|
</div>
|
100
|
-
|
101
|
-
<div>
|
102
|
-
<
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
<
|
108
|
-
<
|
109
|
-
<
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
<
|
117
|
-
{column.label.replaceAll(`"`, '')}
|
118
|
-
</td>
|
119
|
-
|
120
|
-
{column.dataType && (
|
112
|
+
{resultColumns.length > 0 && (
|
113
|
+
<div className="query-builder__sql__container">
|
114
|
+
<div>
|
115
|
+
<PanelListItem className="query-builder__sql__container__item__label">
|
116
|
+
Result Columns
|
117
|
+
</PanelListItem>
|
118
|
+
<PanelDivider />
|
119
|
+
<table className="table query-builder__sql__container__table">
|
120
|
+
<thead>
|
121
|
+
<tr>
|
122
|
+
<th className="table__cell--left">Label</th>
|
123
|
+
<th className="table__cell--left">Data Type</th>
|
124
|
+
</tr>
|
125
|
+
</thead>
|
126
|
+
<tbody>
|
127
|
+
{resultColumns.map((column) => (
|
128
|
+
<tr key={column.label}>
|
121
129
|
<td className="table__cell--left">
|
122
|
-
{
|
130
|
+
{column.label.replaceAll(`"`, '')}
|
123
131
|
</td>
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
132
|
+
|
133
|
+
{column.dataType && (
|
134
|
+
<td className="table__cell--left">
|
135
|
+
{stringifyDataType(column.dataType)}
|
136
|
+
</td>
|
137
|
+
)}
|
138
|
+
</tr>
|
139
|
+
))}
|
140
|
+
</tbody>
|
141
|
+
</table>
|
142
|
+
</div>
|
129
143
|
</div>
|
130
|
-
|
131
|
-
<ResultTypeViewer resultType={resultType} />
|
144
|
+
)}
|
132
145
|
</>
|
133
146
|
);
|
134
147
|
});
|
@@ -138,12 +151,22 @@ export const SQLExecutionNodeViewer: React.FC<{
|
|
138
151
|
resultColumns: SQLResultColumn[];
|
139
152
|
resultType: ResultType;
|
140
153
|
executionPlanState: ExecutionPlanState;
|
141
|
-
viewJson
|
154
|
+
viewJson?: boolean | undefined;
|
142
155
|
}> = observer((props) => {
|
143
156
|
const { query, resultColumns, resultType, executionPlanState, viewJson } =
|
144
157
|
props;
|
145
158
|
const applicationStore = executionPlanState.applicationStore;
|
146
159
|
|
160
|
+
if (viewJson === false) {
|
161
|
+
return (
|
162
|
+
<SQLExecutionNodeViewerHelper
|
163
|
+
query={query}
|
164
|
+
resultColumns={resultColumns}
|
165
|
+
resultType={resultType}
|
166
|
+
executionPlanState={executionPlanState}
|
167
|
+
/>
|
168
|
+
);
|
169
|
+
}
|
147
170
|
return (
|
148
171
|
<PanelContent
|
149
172
|
darkMode={
|
@@ -156,17 +179,16 @@ export const SQLExecutionNodeViewer: React.FC<{
|
|
156
179
|
resultType={resultType}
|
157
180
|
executionPlanState={executionPlanState}
|
158
181
|
/>
|
159
|
-
{
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
)}
|
182
|
+
<ResultTypeViewer resultType={resultType} />
|
183
|
+
<div className="query-builder__sql__container">
|
184
|
+
<Button
|
185
|
+
className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
|
186
|
+
onClick={(): void =>
|
187
|
+
executionPlanState.setViewMode(EXECUTION_PLAN_VIEW_MODE.JSON)
|
188
|
+
}
|
189
|
+
text="View JSON"
|
190
|
+
/>
|
191
|
+
</div>
|
170
192
|
<PanelDivider />
|
171
193
|
</PanelContent>
|
172
194
|
);
|
@@ -15,7 +15,10 @@
|
|
15
15
|
*/
|
16
16
|
|
17
17
|
import { observer } from 'mobx-react-lite';
|
18
|
-
import {
|
18
|
+
import {
|
19
|
+
ExecutionNodeViewer,
|
20
|
+
generateExecutionNodeLabel,
|
21
|
+
} from './ExecutionPlanViewer.js';
|
19
22
|
import {
|
20
23
|
type ExecutionPlanState,
|
21
24
|
EXECUTION_PLAN_VIEW_MODE,
|
@@ -28,33 +31,55 @@ import {
|
|
28
31
|
PanelDivider,
|
29
32
|
Button,
|
30
33
|
PanelContent,
|
34
|
+
ChevronDownIcon,
|
35
|
+
ChevronRightIcon,
|
31
36
|
} from '@finos/legend-art';
|
32
37
|
import type { ExecutionNode, SequenceExecutionNode } from '@finos/legend-graph';
|
33
38
|
import { ResultTypeViewer } from './ResultTypeViewer.js';
|
39
|
+
import { useState } from 'react';
|
34
40
|
|
35
|
-
export const
|
41
|
+
export const SequenceExecutionNodeViewerHelper: React.FC<{
|
36
42
|
node: SequenceExecutionNode;
|
37
43
|
executionPlanState: ExecutionPlanState;
|
44
|
+
viewJson?: boolean | undefined;
|
38
45
|
}> = observer((props) => {
|
39
|
-
const { node, executionPlanState } = props;
|
46
|
+
const { node, executionPlanState, viewJson } = props;
|
40
47
|
const resultType = node.resultType;
|
41
|
-
const
|
48
|
+
const [executionNode, setExecutionNode] = useState<ExecutionNode | undefined>(
|
49
|
+
undefined,
|
50
|
+
);
|
51
|
+
const nodeExpandIcon = viewJson ? (
|
52
|
+
<div />
|
53
|
+
) : executionNode ? (
|
54
|
+
<ChevronDownIcon />
|
55
|
+
) : (
|
56
|
+
<ChevronRightIcon />
|
57
|
+
);
|
42
58
|
const openExecutionNode = (child: ExecutionNode): void => {
|
43
59
|
const newNode = executionPlanState.treeData?.nodes.get(child._UUID);
|
44
|
-
if (
|
45
|
-
|
46
|
-
|
47
|
-
|
60
|
+
if (viewJson === false) {
|
61
|
+
if (executionNode) {
|
62
|
+
setExecutionNode(undefined);
|
63
|
+
} else {
|
64
|
+
setExecutionNode(child);
|
65
|
+
}
|
66
|
+
} else {
|
67
|
+
if (newNode instanceof ExecutionPlanViewTreeNodeData) {
|
68
|
+
executionPlanState.transformMetadataToProtocolJson(
|
69
|
+
newNode.executionPlan,
|
70
|
+
);
|
71
|
+
} else if (newNode instanceof ExecutionNodeTreeNodeData) {
|
72
|
+
executionPlanState.transformMetadataToProtocolJson(
|
73
|
+
newNode.executionNode,
|
74
|
+
);
|
75
|
+
}
|
76
|
+
if (newNode) {
|
77
|
+
executionPlanState.setSelectedNode(newNode);
|
78
|
+
}
|
48
79
|
}
|
49
|
-
executionPlanState.setSelectedNode(newNode);
|
50
80
|
};
|
51
|
-
|
52
81
|
return (
|
53
|
-
|
54
|
-
darkMode={
|
55
|
-
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
56
|
-
}
|
57
|
-
>
|
82
|
+
<>
|
58
83
|
<div className="query-builder__sequence__container">
|
59
84
|
<div>
|
60
85
|
<PanelListItem className="query-builder__sequence__container__item__label">
|
@@ -72,6 +97,7 @@ export const SequenceExecutionNodeViewer: React.FC<{
|
|
72
97
|
tabIndex={-1}
|
73
98
|
title={`Go to ${generateExecutionNodeLabel(child)}`}
|
74
99
|
>
|
100
|
+
{!viewJson && nodeExpandIcon}
|
75
101
|
{`${index + 1}: ${generateExecutionNodeLabel(child)}`}
|
76
102
|
</button>
|
77
103
|
</div>
|
@@ -80,6 +106,44 @@ export const SequenceExecutionNodeViewer: React.FC<{
|
|
80
106
|
</div>
|
81
107
|
<PanelDivider />
|
82
108
|
<ResultTypeViewer resultType={resultType} />
|
109
|
+
{viewJson === false && executionNode && (
|
110
|
+
<ExecutionNodeViewer
|
111
|
+
executionNode={executionNode}
|
112
|
+
executionPlanState={executionPlanState}
|
113
|
+
viewJson={false}
|
114
|
+
/>
|
115
|
+
)}
|
116
|
+
</>
|
117
|
+
);
|
118
|
+
});
|
119
|
+
|
120
|
+
export const SequenceExecutionNodeViewer: React.FC<{
|
121
|
+
node: SequenceExecutionNode;
|
122
|
+
executionPlanState: ExecutionPlanState;
|
123
|
+
viewJson?: boolean | undefined;
|
124
|
+
}> = observer((props) => {
|
125
|
+
const { node, executionPlanState, viewJson } = props;
|
126
|
+
const applicationStore = executionPlanState.applicationStore;
|
127
|
+
if (viewJson === false) {
|
128
|
+
return (
|
129
|
+
<SequenceExecutionNodeViewerHelper
|
130
|
+
node={node}
|
131
|
+
executionPlanState={executionPlanState}
|
132
|
+
viewJson={viewJson}
|
133
|
+
/>
|
134
|
+
);
|
135
|
+
}
|
136
|
+
return (
|
137
|
+
<PanelContent
|
138
|
+
darkMode={
|
139
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
140
|
+
}
|
141
|
+
>
|
142
|
+
<SequenceExecutionNodeViewerHelper
|
143
|
+
node={node}
|
144
|
+
executionPlanState={executionPlanState}
|
145
|
+
viewJson={viewJson}
|
146
|
+
/>
|
83
147
|
<div className="query-builder__execution__container">
|
84
148
|
<Button
|
85
149
|
className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
|
@@ -0,0 +1,264 @@
|
|
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 { observer } from 'mobx-react-lite';
|
18
|
+
import {
|
19
|
+
type ExecutionPlanState,
|
20
|
+
EXECUTION_PLAN_VIEW_MODE,
|
21
|
+
} from '../../stores/execution-plan/ExecutionPlanState.js';
|
22
|
+
import {
|
23
|
+
PartialClassResultType,
|
24
|
+
PropertyGraphFetchTree,
|
25
|
+
RootGraphFetchTree,
|
26
|
+
type StoreMappingGlobalGraphFetchExecutionNode,
|
27
|
+
} from '@finos/legend-graph';
|
28
|
+
import {
|
29
|
+
PanelListItem,
|
30
|
+
PanelDivider,
|
31
|
+
Button,
|
32
|
+
PanelContent,
|
33
|
+
TreeView,
|
34
|
+
} from '@finos/legend-art';
|
35
|
+
import { guaranteeType, isNonNullable } from '@finos/legend-shared';
|
36
|
+
import {
|
37
|
+
buildGraphFetchTreeData,
|
38
|
+
buildPropertyGraphFetchTreeData,
|
39
|
+
type QueryBuilderGraphFetchTreeData,
|
40
|
+
type QueryBuilderGraphFetchTreeNodeData,
|
41
|
+
} from '../../stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js';
|
42
|
+
import { QueryBuilderGraphFetchTreeNodeContainer } from '../fetch-structure/QueryBuilderGraphFetchTreePanel.js';
|
43
|
+
import { PartialClassResultTypeViewer } from './PartialClassResultViewer.js';
|
44
|
+
|
45
|
+
export const StoreMappingGlobalGraphFetchExecutionNodeViewer: React.FC<{
|
46
|
+
storeMappingNode: StoreMappingGlobalGraphFetchExecutionNode;
|
47
|
+
executionPlanState: ExecutionPlanState;
|
48
|
+
}> = observer((props) => {
|
49
|
+
const { storeMappingNode, executionPlanState } = props;
|
50
|
+
|
51
|
+
let treeData: QueryBuilderGraphFetchTreeData | undefined = undefined;
|
52
|
+
try {
|
53
|
+
if (storeMappingNode.graphFetchTree instanceof RootGraphFetchTree) {
|
54
|
+
treeData = buildGraphFetchTreeData(
|
55
|
+
guaranteeType(storeMappingNode.graphFetchTree, RootGraphFetchTree),
|
56
|
+
true,
|
57
|
+
);
|
58
|
+
} else if (
|
59
|
+
storeMappingNode.graphFetchTree instanceof PropertyGraphFetchTree
|
60
|
+
) {
|
61
|
+
treeData = buildPropertyGraphFetchTreeData(
|
62
|
+
storeMappingNode.graphFetchTree,
|
63
|
+
);
|
64
|
+
}
|
65
|
+
} catch {
|
66
|
+
//do nothing
|
67
|
+
}
|
68
|
+
|
69
|
+
const getChildNodes = (
|
70
|
+
node: QueryBuilderGraphFetchTreeNodeData,
|
71
|
+
): QueryBuilderGraphFetchTreeNodeData[] =>
|
72
|
+
node.childrenIds
|
73
|
+
.map((id) => {
|
74
|
+
if (treeData) {
|
75
|
+
return treeData.nodes.get(id);
|
76
|
+
}
|
77
|
+
return null;
|
78
|
+
})
|
79
|
+
.filter(isNonNullable);
|
80
|
+
|
81
|
+
const isReadOnly = true;
|
82
|
+
const applicationStore = executionPlanState.applicationStore;
|
83
|
+
|
84
|
+
return (
|
85
|
+
<PanelContent
|
86
|
+
darkMode={
|
87
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
88
|
+
}
|
89
|
+
>
|
90
|
+
<div className="query-builder__store-mapping-global-graph-fetch__container">
|
91
|
+
<PanelListItem className="query-builder__store-mapping-global-graph-fetch__container__label">
|
92
|
+
Store Mapping Global Graph Fetch Execution Node Details
|
93
|
+
</PanelListItem>
|
94
|
+
<PanelDivider />
|
95
|
+
<table className="table query-builder__store-mapping-global-graph-fetch__container__table">
|
96
|
+
<thead>
|
97
|
+
<tr>
|
98
|
+
<th className="table__cell--left">Property</th>
|
99
|
+
<th className="table__cell--left">Details</th>
|
100
|
+
</tr>
|
101
|
+
</thead>
|
102
|
+
<tbody>
|
103
|
+
{storeMappingNode.parentIndex !== undefined && (
|
104
|
+
<tr>
|
105
|
+
<td className="table__cell--left"> ParentIndex</td>
|
106
|
+
<td className="table__cell--left">
|
107
|
+
{storeMappingNode.parentIndex}
|
108
|
+
</td>
|
109
|
+
</tr>
|
110
|
+
)}
|
111
|
+
{storeMappingNode.enableConstraints !== undefined && (
|
112
|
+
<tr>
|
113
|
+
<td className="table__cell--left">EnableConstraints</td>
|
114
|
+
<td className="table__cell--left">
|
115
|
+
{storeMappingNode.enableConstraints.toString()}
|
116
|
+
</td>
|
117
|
+
</tr>
|
118
|
+
)}
|
119
|
+
{storeMappingNode.checked !== undefined && (
|
120
|
+
<tr>
|
121
|
+
<td className="table__cell--left">Checked</td>
|
122
|
+
<td className="table__cell--left">
|
123
|
+
{storeMappingNode.checked.toString()}
|
124
|
+
</td>
|
125
|
+
</tr>
|
126
|
+
)}
|
127
|
+
{storeMappingNode.authDependent !== undefined && (
|
128
|
+
<tr>
|
129
|
+
<td className="table__cell--left">AuthDependent</td>
|
130
|
+
<td className="table__cell--left">
|
131
|
+
{storeMappingNode.authDependent.toString()}
|
132
|
+
</td>
|
133
|
+
</tr>
|
134
|
+
)}
|
135
|
+
{storeMappingNode.store && (
|
136
|
+
<tr>
|
137
|
+
<td className="table__cell--left">Store</td>
|
138
|
+
<td className="table__cell--left">{storeMappingNode.store}</td>
|
139
|
+
</tr>
|
140
|
+
)}
|
141
|
+
<tr>
|
142
|
+
<td className="table__cell--left">LocalTreeIndices</td>
|
143
|
+
<td className="table__cell--left">{`[${storeMappingNode.localTreeIndices.toString()}]`}</td>
|
144
|
+
</tr>
|
145
|
+
<tr>
|
146
|
+
<td className="table__cell--left">DependencyIndices</td>
|
147
|
+
<td className="table__cell--left">{`[${storeMappingNode.dependencyIndices.toString()}]`}</td>
|
148
|
+
</tr>
|
149
|
+
</tbody>
|
150
|
+
</table>
|
151
|
+
<PanelDivider />
|
152
|
+
{treeData && (
|
153
|
+
<>
|
154
|
+
<PanelListItem className="query-builder__store-mapping-global-graph-fetch__container__label2">
|
155
|
+
Graph Fetch Tree
|
156
|
+
</PanelListItem>
|
157
|
+
<div className="query-builder__store-mapping-global-graph-fetch__container__config-group__content">
|
158
|
+
<div className="query-builder__store-mapping-global-graph-fetch__container__config-group__item">
|
159
|
+
<TreeView
|
160
|
+
components={{
|
161
|
+
TreeNodeContainer: QueryBuilderGraphFetchTreeNodeContainer,
|
162
|
+
}}
|
163
|
+
className="query-builder-graph-fetch-tree__container__tree"
|
164
|
+
treeData={treeData}
|
165
|
+
getChildNodes={getChildNodes}
|
166
|
+
innerProps={{
|
167
|
+
isReadOnly,
|
168
|
+
}}
|
169
|
+
/>
|
170
|
+
</div>
|
171
|
+
</div>
|
172
|
+
<PanelDivider />
|
173
|
+
</>
|
174
|
+
)}
|
175
|
+
{storeMappingNode.xStorePropertyFetchDetails && (
|
176
|
+
<>
|
177
|
+
<PanelListItem className="query-builder__store-mapping-global-graph-fetch__container__xstore">
|
178
|
+
xStorePropertyFetchDetails
|
179
|
+
</PanelListItem>
|
180
|
+
<PanelDivider />
|
181
|
+
<table className="table query-builder__store-mapping-global-graph-fetch__container__table">
|
182
|
+
<thead>
|
183
|
+
<tr>
|
184
|
+
<th className="table__cell--left">Property</th>
|
185
|
+
<th className="table__cell--left">Details</th>
|
186
|
+
</tr>
|
187
|
+
</thead>
|
188
|
+
<tbody>
|
189
|
+
<tr>
|
190
|
+
<td className="table__cell--left"> propertyPath </td>
|
191
|
+
<td className="table__cell--left">
|
192
|
+
{storeMappingNode.xStorePropertyFetchDetails.propertyPath}
|
193
|
+
</td>
|
194
|
+
</tr>
|
195
|
+
<tr>
|
196
|
+
<td className="table__cell--left"> sourceMappingId </td>
|
197
|
+
<td className="table__cell--left">
|
198
|
+
{
|
199
|
+
storeMappingNode.xStorePropertyFetchDetails
|
200
|
+
.sourceMappingId
|
201
|
+
}
|
202
|
+
</td>
|
203
|
+
</tr>
|
204
|
+
<tr>
|
205
|
+
<td className="table__cell--left"> sourceSetId </td>
|
206
|
+
<td className="table__cell--left">
|
207
|
+
{storeMappingNode.xStorePropertyFetchDetails.sourceSetId}
|
208
|
+
</td>
|
209
|
+
</tr>
|
210
|
+
<tr>
|
211
|
+
<td className="table__cell--left"> subTree </td>
|
212
|
+
<td className="table__cell--left">
|
213
|
+
{storeMappingNode.xStorePropertyFetchDetails.subTree}
|
214
|
+
</td>
|
215
|
+
</tr>
|
216
|
+
<tr>
|
217
|
+
<td className="table__cell--left"> supportsCaching </td>
|
218
|
+
<td className="table__cell--left">
|
219
|
+
{storeMappingNode.xStorePropertyFetchDetails.supportsCaching.toString()}
|
220
|
+
</td>
|
221
|
+
</tr>
|
222
|
+
<tr>
|
223
|
+
<td className="table__cell--left"> targetMappingId </td>
|
224
|
+
<td className="table__cell--left">
|
225
|
+
{
|
226
|
+
storeMappingNode.xStorePropertyFetchDetails
|
227
|
+
.targetMappingId
|
228
|
+
}
|
229
|
+
</td>
|
230
|
+
</tr>
|
231
|
+
<tr>
|
232
|
+
<td className="table__cell--left"> targetSetId</td>
|
233
|
+
<td className="table__cell--left">
|
234
|
+
{storeMappingNode.xStorePropertyFetchDetails.targetSetId}
|
235
|
+
</td>
|
236
|
+
</tr>
|
237
|
+
<tr>
|
238
|
+
<td className="table__cell--left">targetPropertiesOrdered</td>
|
239
|
+
<td className="table__cell--left">{`[${storeMappingNode.xStorePropertyFetchDetails.targetPropertiesOrdered.toString()}]`}</td>
|
240
|
+
</tr>
|
241
|
+
</tbody>
|
242
|
+
</table>
|
243
|
+
</>
|
244
|
+
)}
|
245
|
+
{storeMappingNode.resultType instanceof PartialClassResultType && (
|
246
|
+
<PartialClassResultTypeViewer
|
247
|
+
resultType={storeMappingNode.resultType}
|
248
|
+
/>
|
249
|
+
)}
|
250
|
+
<PanelDivider />
|
251
|
+
<div className="query-builder__store-mapping-global-graph-fetch__container__btn">
|
252
|
+
<Button
|
253
|
+
className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
|
254
|
+
onClick={(): void =>
|
255
|
+
executionPlanState.setViewMode(EXECUTION_PLAN_VIEW_MODE.JSON)
|
256
|
+
}
|
257
|
+
text="View JSON"
|
258
|
+
/>
|
259
|
+
</div>
|
260
|
+
<PanelDivider />
|
261
|
+
</div>
|
262
|
+
</PanelContent>
|
263
|
+
);
|
264
|
+
});
|
@@ -0,0 +1,97 @@
|
|
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 { PanelDivider, PanelListItem } from '@finos/legend-art';
|
18
|
+
import {
|
19
|
+
LoadFromResultSetAsValueTuplesTempTableStrategy,
|
20
|
+
LoadFromSubQueryTempTableStrategy,
|
21
|
+
LoadFromTempFileTempTableStrategy,
|
22
|
+
type TempTableStrategy,
|
23
|
+
} from '@finos/legend-graph';
|
24
|
+
import { observer } from 'mobx-react-lite';
|
25
|
+
import {
|
26
|
+
ExecutionNodeViewer,
|
27
|
+
generateExecutionNodeLabel,
|
28
|
+
} from './ExecutionPlanViewer.js';
|
29
|
+
import { type ExecutionPlanState } from '../../stores/execution-plan/ExecutionPlanState.js';
|
30
|
+
|
31
|
+
export enum TEMP_TABLE_STRATEGY_TYPES {
|
32
|
+
RESULT_SET = 'resultSet',
|
33
|
+
TEMP_FILE = 'tempFile',
|
34
|
+
SUB_QUERY = 'subQuery',
|
35
|
+
}
|
36
|
+
|
37
|
+
export const TempTableStrategyViewer: React.FC<{
|
38
|
+
tempTableStrategy: TempTableStrategy;
|
39
|
+
executionPlanState: ExecutionPlanState;
|
40
|
+
}> = observer((props) => {
|
41
|
+
const { tempTableStrategy, executionPlanState } = props;
|
42
|
+
let _type = '';
|
43
|
+
if (
|
44
|
+
tempTableStrategy instanceof LoadFromResultSetAsValueTuplesTempTableStrategy
|
45
|
+
) {
|
46
|
+
_type = TEMP_TABLE_STRATEGY_TYPES.RESULT_SET;
|
47
|
+
} else if (tempTableStrategy instanceof LoadFromTempFileTempTableStrategy) {
|
48
|
+
_type = TEMP_TABLE_STRATEGY_TYPES.TEMP_FILE;
|
49
|
+
}
|
50
|
+
if (tempTableStrategy instanceof LoadFromSubQueryTempTableStrategy) {
|
51
|
+
_type = TEMP_TABLE_STRATEGY_TYPES.SUB_QUERY;
|
52
|
+
}
|
53
|
+
return (
|
54
|
+
<div className="query-builder__temp-table-strategy__container">
|
55
|
+
{_type && (
|
56
|
+
<PanelListItem className="query-builder__temp-table-strategy__container__item">
|
57
|
+
Type: {_type}
|
58
|
+
</PanelListItem>
|
59
|
+
)}
|
60
|
+
<PanelListItem className="query-builder__temp-table-strategy__container__header">
|
61
|
+
{`Create Temp Table (${generateExecutionNodeLabel(
|
62
|
+
tempTableStrategy.createTempTableNode,
|
63
|
+
)})`}
|
64
|
+
</PanelListItem>
|
65
|
+
<ExecutionNodeViewer
|
66
|
+
executionNode={tempTableStrategy.createTempTableNode}
|
67
|
+
executionPlanState={executionPlanState}
|
68
|
+
viewJson={false}
|
69
|
+
/>
|
70
|
+
<PanelDivider />
|
71
|
+
|
72
|
+
<PanelListItem className="query-builder__temp-table-strategy__container__header">
|
73
|
+
{`Load Temp Table (${generateExecutionNodeLabel(
|
74
|
+
tempTableStrategy.loadTempTableNode,
|
75
|
+
)})`}
|
76
|
+
</PanelListItem>
|
77
|
+
<ExecutionNodeViewer
|
78
|
+
executionNode={tempTableStrategy.loadTempTableNode}
|
79
|
+
executionPlanState={executionPlanState}
|
80
|
+
viewJson={false}
|
81
|
+
/>
|
82
|
+
<PanelDivider />
|
83
|
+
|
84
|
+
<PanelListItem className="query-builder__temp-table-strategy__container__header">
|
85
|
+
{`Drop Temp Table (${generateExecutionNodeLabel(
|
86
|
+
tempTableStrategy.dropTempTableNode,
|
87
|
+
)})`}
|
88
|
+
</PanelListItem>
|
89
|
+
<ExecutionNodeViewer
|
90
|
+
executionNode={tempTableStrategy.dropTempTableNode}
|
91
|
+
executionPlanState={executionPlanState}
|
92
|
+
viewJson={false}
|
93
|
+
/>
|
94
|
+
<PanelDivider />
|
95
|
+
</div>
|
96
|
+
);
|
97
|
+
});
|