@finos/legend-query-builder 4.3.9 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +2 -2
- package/lib/components/QueryBuilder.js.map +1 -1
- 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/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.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/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/graph-manager/QueryBuilderConfig.d.ts +24 -0
- package/lib/graph-manager/QueryBuilderConfig.d.ts.map +1 -0
- package/lib/graph-manager/QueryBuilderConfig.js +27 -0
- package/lib/graph-manager/QueryBuilderConfig.js.map +1 -0
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +9 -9
- package/lib/stores/QueryBuilderState.d.ts +3 -1
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +4 -2
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/__test-utils__/QueryBuilderStateTestUtils.d.ts.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/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/workflows/FunctionQueryBuilderState.d.ts +2 -1
- package/lib/stores/workflows/FunctionQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/FunctionQueryBuilderState.js +2 -2
- package/lib/stores/workflows/FunctionQueryBuilderState.js.map +1 -1
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts +2 -1
- package/lib/stores/workflows/MappingQueryBuilderState.d.ts.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.d.ts +2 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/ServiceQueryBuilderState.js +2 -2
- package/lib/stores/workflows/ServiceQueryBuilderState.js.map +1 -1
- package/package.json +17 -17
- package/src/components/QueryBuilder.tsx +16 -14
- package/src/components/QueryBuilderResultPanel.tsx +7 -2
- package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +1 -0
- 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/shared/CustomDatePicker.tsx +65 -27
- package/src/components/shared/QueryBuilderVariableSelector.tsx +4 -1
- package/src/graph-manager/QueryBuilderConfig.ts +31 -0
- package/src/index.ts +1 -1
- package/src/stores/QueryBuilderState.ts +5 -0
- package/src/stores/__test-utils__/QueryBuilderStateTestUtils.ts +1 -0
- 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/workflows/FunctionQueryBuilderState.ts +3 -1
- package/src/stores/workflows/MappingQueryBuilderState.ts +3 -1
- package/src/stores/workflows/ServiceQueryBuilderState.ts +3 -1
- package/tsconfig.json +8 -0
@@ -14,7 +14,7 @@
|
|
14
14
|
* limitations under the License.
|
15
15
|
*/
|
16
16
|
|
17
|
-
import { useEffect
|
17
|
+
import { useEffect } from 'react';
|
18
18
|
import {
|
19
19
|
type TreeNodeContainerProps,
|
20
20
|
Dialog,
|
@@ -49,6 +49,7 @@ import {
|
|
49
49
|
EXECUTION_PLAN_VIEW_MODE,
|
50
50
|
type ExecutionPlanState,
|
51
51
|
generateExecutionNodeTreeNodeData,
|
52
|
+
PLAN_TABS,
|
52
53
|
} from '../../stores/execution-plan/ExecutionPlanState.js';
|
53
54
|
import { observer } from 'mobx-react-lite';
|
54
55
|
import {
|
@@ -61,9 +62,19 @@ import {
|
|
61
62
|
ConstantExecutionNode,
|
62
63
|
SequenceExecutionNode,
|
63
64
|
type RawExecutionPlan,
|
65
|
+
StoreMappingGlobalGraphFetchExecutionNode,
|
66
|
+
PureExpressionPlatformExecutionNode,
|
67
|
+
RelationalClassQueryTempTableGraphFetchExecutionNode,
|
68
|
+
RelationalRootQueryTempTableGraphFetchExecutionNode,
|
69
|
+
RelationalCrossRootQueryTempTableGraphFetchExecutionNode,
|
70
|
+
RelationalGraphFetchExecutionNode,
|
64
71
|
JavaPlatformImplementation,
|
72
|
+
RootGraphFetchTree,
|
73
|
+
PropertyGraphFetchTree,
|
74
|
+
LocalGraphFetchExecutionNode,
|
65
75
|
} from '@finos/legend-graph';
|
66
76
|
import { SQLExecutionNodeViewer } from './SQLExecutionNodeViewer.js';
|
77
|
+
import { StoreMappingGlobalGraphFetchExecutionNodeViewer } from './StoreMappingGlobalGraphFetchExecutionNodeViewer.js';
|
67
78
|
import { FunctionParametersValidationNodeViewer } from './FunctionParametersValidationNodeViewer.js';
|
68
79
|
import { AllocationExecutionNodeViewer } from './AllocationExecutionNodeViewer.js';
|
69
80
|
import { ConstantExecutionNodeViewer } from './ConstantExecutionNodeViewer.js';
|
@@ -74,8 +85,27 @@ import {
|
|
74
85
|
CodeEditor,
|
75
86
|
} from '@finos/legend-lego/code-editor';
|
76
87
|
import { DEFAULT_TAB_SIZE } from '@finos/legend-application';
|
88
|
+
import { RelationalRootQueryTempTableGraphFetchExecutionNodeViewer } from './RelationalRootQueryTempTableGraphFetchExecutionNodeViewer.js';
|
89
|
+
import { RelationalClassQueryTempTableGraphFetchExecutionNodeViewer } from './RelationalClassQueryTempTableGraphFetchExecutionNodeViewer.js';
|
90
|
+
import { RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer } from './RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer.js';
|
77
91
|
|
78
92
|
const EXECUTION_PLAN = 'Execution Plan';
|
93
|
+
|
94
|
+
const generateExecutionNodePrefixLabel = (node: ExecutionNode): string => {
|
95
|
+
if (
|
96
|
+
node instanceof StoreMappingGlobalGraphFetchExecutionNode ||
|
97
|
+
node instanceof LocalGraphFetchExecutionNode
|
98
|
+
) {
|
99
|
+
if (node.graphFetchTree instanceof RootGraphFetchTree) {
|
100
|
+
return node.graphFetchTree.class.value.name;
|
101
|
+
}
|
102
|
+
if (node.graphFetchTree instanceof PropertyGraphFetchTree) {
|
103
|
+
return node.graphFetchTree.property.value.name;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
return '';
|
107
|
+
};
|
108
|
+
|
79
109
|
/**
|
80
110
|
* @modularize
|
81
111
|
* See https://github.com/finos/legend-studio/issues/65
|
@@ -93,16 +123,27 @@ export const generateExecutionNodeLabel = (type: ExecutionNode): string => {
|
|
93
123
|
return `Constant Execution Node`;
|
94
124
|
} else if (type instanceof SequenceExecutionNode) {
|
95
125
|
return `Sequence Execution Node`;
|
126
|
+
} else if (type instanceof StoreMappingGlobalGraphFetchExecutionNode) {
|
127
|
+
return `Store Mapping Global Graph Fetch Execution Node`;
|
128
|
+
} else if (
|
129
|
+
type instanceof RelationalRootQueryTempTableGraphFetchExecutionNode
|
130
|
+
) {
|
131
|
+
return `Relational Root Query TempTable Graph Fetch Execution Node`;
|
132
|
+
} else if (
|
133
|
+
type instanceof RelationalCrossRootQueryTempTableGraphFetchExecutionNode
|
134
|
+
) {
|
135
|
+
return `Relational Cross Root Query TempTable Graph Fetch Execution Node`;
|
136
|
+
} else if (
|
137
|
+
type instanceof RelationalClassQueryTempTableGraphFetchExecutionNode
|
138
|
+
) {
|
139
|
+
return `Relational Class Query TempTable Graph Fetch Execution Node`;
|
140
|
+
} else if (type instanceof PureExpressionPlatformExecutionNode) {
|
141
|
+
return `Pure Expression Platform Execution Node`;
|
96
142
|
} else {
|
97
143
|
return 'Other';
|
98
144
|
}
|
99
145
|
};
|
100
146
|
|
101
|
-
enum PLAN_TABS {
|
102
|
-
GENERAL = 'GENERAL',
|
103
|
-
GLOBAL_IMPLEMENTATION_SUPPORT = 'GLOBAL_IMPLEMENTATION_SUPPORT',
|
104
|
-
}
|
105
|
-
|
106
147
|
export const ExecutionPlanViewerPanelContent: React.FC<{
|
107
148
|
executionPlanState: ExecutionPlanState;
|
108
149
|
}> = observer((props) => {
|
@@ -112,10 +153,6 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
112
153
|
executionPlanState.plan?.globalImplementationSupport;
|
113
154
|
const templateFunctions =
|
114
155
|
executionPlanState.plan?.processingTemplateFunctions ?? [];
|
115
|
-
const [selectedTab, setSelectedTab] = useState<PLAN_TABS>(PLAN_TABS.GENERAL);
|
116
|
-
const [selectedJavaClass, setSelectedJavaClass] = useState<
|
117
|
-
string | undefined
|
118
|
-
>(undefined);
|
119
156
|
|
120
157
|
if (
|
121
158
|
globalImplementationSupport &&
|
@@ -129,11 +166,11 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
129
166
|
if (
|
130
167
|
globalImplementationSupport.classes.length > 0 &&
|
131
168
|
globalImplementationSupport.classes[0] &&
|
132
|
-
selectedJavaClass ===
|
169
|
+
executionPlanState.globalImplementationSupportState.selectedJavaClass ===
|
170
|
+
undefined
|
133
171
|
) {
|
134
|
-
setSelectedJavaClass(
|
135
|
-
globalImplementationSupport.classes[0]?.package
|
136
|
-
globalImplementationSupport.classes[0]?.name,
|
172
|
+
executionPlanState.globalImplementationSupportState.setSelectedJavaClass(
|
173
|
+
`${globalImplementationSupport.classes[0]?.package}.${globalImplementationSupport.classes[0]?.name}`,
|
137
174
|
);
|
138
175
|
}
|
139
176
|
}
|
@@ -146,12 +183,18 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
146
183
|
{Object.values(PLAN_TABS).map((tab) => (
|
147
184
|
<div
|
148
185
|
key={tab}
|
149
|
-
onClick={() =>
|
186
|
+
onClick={() =>
|
187
|
+
executionPlanState.globalImplementationSupportState.setSelectedTab(
|
188
|
+
tab,
|
189
|
+
)
|
190
|
+
}
|
150
191
|
className={clsx(
|
151
192
|
'query-builder__execution-plan-form--editor__tab',
|
152
193
|
{
|
153
194
|
'query-builder__execution-plan-form--editor__tab--active':
|
154
|
-
tab ===
|
195
|
+
tab ===
|
196
|
+
executionPlanState.globalImplementationSupportState
|
197
|
+
.selectedTab,
|
155
198
|
},
|
156
199
|
)}
|
157
200
|
>
|
@@ -160,11 +203,12 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
160
203
|
))}
|
161
204
|
</div>
|
162
205
|
</div>
|
163
|
-
{selectedTab ===
|
206
|
+
{executionPlanState.globalImplementationSupportState.selectedTab ===
|
207
|
+
PLAN_TABS.GLOBAL_IMPLEMENTATION_SUPPORT &&
|
164
208
|
globalImplementationSupport &&
|
165
209
|
globalImplementationSupport instanceof JavaPlatformImplementation && (
|
166
210
|
<ResizablePanelGroup orientation="vertical">
|
167
|
-
<ResizablePanel minSize={30} size={
|
211
|
+
<ResizablePanel minSize={30} size={400}>
|
168
212
|
<PanelContent
|
169
213
|
darkMode={
|
170
214
|
!applicationStore.layoutService
|
@@ -180,7 +224,10 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
180
224
|
'query-builder__java__container__item',
|
181
225
|
{
|
182
226
|
'query-builder__java__container__item--active':
|
183
|
-
`${cl.package}
|
227
|
+
`${cl.package}.${cl.name}` ===
|
228
|
+
executionPlanState
|
229
|
+
.globalImplementationSupportState
|
230
|
+
.selectedJavaClass,
|
184
231
|
},
|
185
232
|
)}
|
186
233
|
key={cl.package + cl.name}
|
@@ -188,7 +235,9 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
188
235
|
<button
|
189
236
|
className="query-builder__java__container__item__btn"
|
190
237
|
onClick={() =>
|
191
|
-
setSelectedJavaClass(
|
238
|
+
executionPlanState.globalImplementationSupportState.setSelectedJavaClass(
|
239
|
+
`${cl.package}.${cl.name}`,
|
240
|
+
)
|
192
241
|
}
|
193
242
|
tabIndex={-1}
|
194
243
|
title={`Go to ${cl.package}.${cl.name}`}
|
@@ -206,11 +255,15 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
206
255
|
<ResizablePanelSplitterLine color="var(--color-dark-grey-200)" />
|
207
256
|
</ResizablePanelSplitter>
|
208
257
|
<ResizablePanel>
|
209
|
-
{
|
258
|
+
{executionPlanState.globalImplementationSupportState
|
259
|
+
.selectedJavaClass && (
|
210
260
|
<CodeEditor
|
211
261
|
inputValue={globalImplementationSupport.classes.reduce(
|
212
262
|
(value, cl) => {
|
213
|
-
if (
|
263
|
+
if (
|
264
|
+
executionPlanState.globalImplementationSupportState
|
265
|
+
.selectedJavaClass === `${cl.package}.${cl.name}`
|
266
|
+
) {
|
214
267
|
return cl.source;
|
215
268
|
}
|
216
269
|
return value;
|
@@ -225,37 +278,41 @@ export const ExecutionPlanViewerPanelContent: React.FC<{
|
|
225
278
|
</ResizablePanel>
|
226
279
|
</ResizablePanelGroup>
|
227
280
|
)}
|
228
|
-
{selectedTab ===
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
281
|
+
{executionPlanState.globalImplementationSupportState.selectedTab ===
|
282
|
+
PLAN_TABS.GENERAL &&
|
283
|
+
templateFunctions.length > 0 && (
|
284
|
+
<>
|
285
|
+
<div className="query-builder__template--function--editor__header">
|
286
|
+
{`AuthDependent: ${executionPlanState.plan?.authDependent.toString()}`}
|
287
|
+
</div>
|
288
|
+
<div className="query-builder__template--function--editor__title">
|
289
|
+
Template Functions
|
290
|
+
</div>
|
291
|
+
<div className="query-builder__template--function--editor__code">
|
292
|
+
<CodeEditor
|
293
|
+
inputValue={templateFunctions.reduce(
|
294
|
+
(total, func) => (total += `${func}\n`),
|
295
|
+
'',
|
296
|
+
)}
|
297
|
+
isReadOnly={true}
|
298
|
+
language={CODE_EDITOR_LANGUAGE.XML}
|
299
|
+
hideMinimap={true}
|
300
|
+
hideActionBar={true}
|
301
|
+
/>
|
302
|
+
</div>
|
303
|
+
<div className="query-builder__template--function--editor__json">
|
304
|
+
<Button
|
305
|
+
className="btn--dark execution-node-viewer__unsupported-view__to-text-mode__btn"
|
306
|
+
onClick={(): void =>
|
307
|
+
executionPlanState.setViewMode(
|
308
|
+
EXECUTION_PLAN_VIEW_MODE.JSON,
|
309
|
+
)
|
310
|
+
}
|
311
|
+
text="View JSON"
|
312
|
+
/>
|
313
|
+
</div>
|
314
|
+
</>
|
315
|
+
)}
|
259
316
|
</div>
|
260
317
|
</div>
|
261
318
|
);
|
@@ -284,6 +341,23 @@ const ExecutionNodeElementTreeNodeContainer = observer(
|
|
284
341
|
) : (
|
285
342
|
<div />
|
286
343
|
);
|
344
|
+
let details = '';
|
345
|
+
let prefixLabel = '';
|
346
|
+
const STORE_MAPPING_LABEL = `Store Mapping Global Graph Fetch Execution Node`;
|
347
|
+
if (node instanceof ExecutionNodeTreeNodeData) {
|
348
|
+
if (node.parentNodeId === STORE_MAPPING_LABEL) {
|
349
|
+
if (
|
350
|
+
node.executionNode instanceof
|
351
|
+
StoreMappingGlobalGraphFetchExecutionNode
|
352
|
+
) {
|
353
|
+
details = 'Cross';
|
354
|
+
} else if (node.executionNode instanceof LocalGraphFetchExecutionNode) {
|
355
|
+
details = 'Local';
|
356
|
+
}
|
357
|
+
}
|
358
|
+
prefixLabel = generateExecutionNodePrefixLabel(node.executionNode);
|
359
|
+
}
|
360
|
+
|
287
361
|
return (
|
288
362
|
<div
|
289
363
|
className={clsx(
|
@@ -304,6 +378,20 @@ const ExecutionNodeElementTreeNodeContainer = observer(
|
|
304
378
|
<div className="tree-view__node__icon">
|
305
379
|
<div className="tree-view__node__expand-icon">{nodeExpandIcon}</div>
|
306
380
|
</div>
|
381
|
+
{details !== '' && (
|
382
|
+
<div className="execution-plan-viewer__node__sub-type">
|
383
|
+
<div className="execution-plan-viewer__node__sub-type__label">
|
384
|
+
{details}
|
385
|
+
</div>
|
386
|
+
</div>
|
387
|
+
)}
|
388
|
+
{prefixLabel !== '' && (
|
389
|
+
<div className="execution-plan-viewer__node__type">
|
390
|
+
<div className="execution-plan-viewer__node__type__label">
|
391
|
+
{prefixLabel}
|
392
|
+
</div>
|
393
|
+
</div>
|
394
|
+
)}
|
307
395
|
<button
|
308
396
|
className="tree-view__node__label execution-plan-viewer__explorer-tree__node__label"
|
309
397
|
tabIndex={-1}
|
@@ -350,6 +438,45 @@ export const ExecutionPlanTree = observer(
|
|
350
438
|
);
|
351
439
|
});
|
352
440
|
}
|
441
|
+
if (
|
442
|
+
node.executionNode instanceof
|
443
|
+
StoreMappingGlobalGraphFetchExecutionNode
|
444
|
+
) {
|
445
|
+
const localNode = node.executionNode.localGraphFetchExecutionNode;
|
446
|
+
const localNodeTreeData = generateExecutionNodeTreeNodeData(
|
447
|
+
localNode,
|
448
|
+
generateExecutionNodeLabel(localNode),
|
449
|
+
node,
|
450
|
+
);
|
451
|
+
executionPlanState.setTreeNode(
|
452
|
+
localNodeTreeData.id,
|
453
|
+
localNodeTreeData,
|
454
|
+
);
|
455
|
+
node.executionNode.children.forEach((childExecutionNode) => {
|
456
|
+
const executionNodeTreeNode = generateExecutionNodeTreeNodeData(
|
457
|
+
childExecutionNode,
|
458
|
+
generateExecutionNodeLabel(childExecutionNode),
|
459
|
+
node,
|
460
|
+
);
|
461
|
+
executionPlanState.setTreeNode(
|
462
|
+
executionNodeTreeNode.id,
|
463
|
+
executionNodeTreeNode,
|
464
|
+
);
|
465
|
+
});
|
466
|
+
}
|
467
|
+
if (node.executionNode instanceof RelationalGraphFetchExecutionNode) {
|
468
|
+
node.executionNode.children.forEach((childExecutionNode) => {
|
469
|
+
const executionNodeTreeNode = generateExecutionNodeTreeNodeData(
|
470
|
+
childExecutionNode,
|
471
|
+
generateExecutionNodeLabel(childExecutionNode),
|
472
|
+
node,
|
473
|
+
);
|
474
|
+
executionPlanState.setTreeNode(
|
475
|
+
executionNodeTreeNode.id,
|
476
|
+
executionNodeTreeNode,
|
477
|
+
);
|
478
|
+
});
|
479
|
+
}
|
353
480
|
}
|
354
481
|
}
|
355
482
|
|
@@ -397,12 +524,13 @@ export const ExecutionPlanTree = observer(
|
|
397
524
|
},
|
398
525
|
);
|
399
526
|
|
400
|
-
const ExecutionNodeViewer = observer(
|
527
|
+
export const ExecutionNodeViewer = observer(
|
401
528
|
(props: {
|
402
529
|
executionNode: ExecutionNode;
|
403
530
|
executionPlanState: ExecutionPlanState;
|
531
|
+
viewJson?: boolean | undefined;
|
404
532
|
}) => {
|
405
|
-
const { executionNode, executionPlanState } = props;
|
533
|
+
const { executionNode, executionPlanState, viewJson } = props;
|
406
534
|
if (executionNode instanceof SQLExecutionNode) {
|
407
535
|
return (
|
408
536
|
<SQLExecutionNodeViewer
|
@@ -410,7 +538,7 @@ const ExecutionNodeViewer = observer(
|
|
410
538
|
resultColumns={executionNode.resultColumns}
|
411
539
|
resultType={executionNode.resultType}
|
412
540
|
executionPlanState={executionPlanState}
|
413
|
-
viewJson={
|
541
|
+
viewJson={viewJson}
|
414
542
|
/>
|
415
543
|
);
|
416
544
|
}
|
@@ -453,6 +581,48 @@ const ExecutionNodeViewer = observer(
|
|
453
581
|
<SequenceExecutionNodeViewer
|
454
582
|
node={executionNode}
|
455
583
|
executionPlanState={executionPlanState}
|
584
|
+
viewJson={viewJson}
|
585
|
+
/>
|
586
|
+
);
|
587
|
+
}
|
588
|
+
if (executionNode instanceof StoreMappingGlobalGraphFetchExecutionNode) {
|
589
|
+
return (
|
590
|
+
<StoreMappingGlobalGraphFetchExecutionNodeViewer
|
591
|
+
storeMappingNode={executionNode}
|
592
|
+
executionPlanState={executionPlanState}
|
593
|
+
/>
|
594
|
+
);
|
595
|
+
}
|
596
|
+
if (
|
597
|
+
executionNode instanceof
|
598
|
+
RelationalCrossRootQueryTempTableGraphFetchExecutionNode
|
599
|
+
) {
|
600
|
+
return (
|
601
|
+
<RelationalCrossRootQueryTempTableGraphFetchExecutionNodeViewer
|
602
|
+
node={executionNode}
|
603
|
+
executionPlanState={executionPlanState}
|
604
|
+
/>
|
605
|
+
);
|
606
|
+
}
|
607
|
+
if (
|
608
|
+
executionNode instanceof
|
609
|
+
RelationalRootQueryTempTableGraphFetchExecutionNode
|
610
|
+
) {
|
611
|
+
return (
|
612
|
+
<RelationalRootQueryTempTableGraphFetchExecutionNodeViewer
|
613
|
+
node={executionNode}
|
614
|
+
executionPlanState={executionPlanState}
|
615
|
+
/>
|
616
|
+
);
|
617
|
+
}
|
618
|
+
if (
|
619
|
+
executionNode instanceof
|
620
|
+
RelationalClassQueryTempTableGraphFetchExecutionNode
|
621
|
+
) {
|
622
|
+
return (
|
623
|
+
<RelationalClassQueryTempTableGraphFetchExecutionNodeViewer
|
624
|
+
node={executionNode}
|
625
|
+
executionPlanState={executionPlanState}
|
456
626
|
/>
|
457
627
|
);
|
458
628
|
}
|
@@ -505,7 +675,6 @@ const ExecutionPlanViewPanel = observer(
|
|
505
675
|
}
|
506
676
|
}, [executionPlanState]);
|
507
677
|
const nativeViewModes = Object.values(EXECUTION_PLAN_VIEW_MODE);
|
508
|
-
|
509
678
|
return (
|
510
679
|
<div className="execution-plan-viewer__panel">
|
511
680
|
{executionPlanState.selectedNode !== undefined && (
|
@@ -568,6 +737,7 @@ const ExecutionPlanViewPanel = observer(
|
|
568
737
|
<ExecutionNodeViewer
|
569
738
|
executionNode={currentElement}
|
570
739
|
executionPlanState={executionPlanState}
|
740
|
+
viewJson={true}
|
571
741
|
/>
|
572
742
|
)}
|
573
743
|
{currentElement instanceof ExecutionPlan && (
|
@@ -651,6 +821,12 @@ export const ExecutionPlanViewer = observer(
|
|
651
821
|
executionPlanState.setExecutionPlanDisplayData('');
|
652
822
|
executionPlanState.setSelectedNode(undefined);
|
653
823
|
executionPlanState.setDebugText(undefined);
|
824
|
+
executionPlanState.globalImplementationSupportState.setSelectedTab(
|
825
|
+
PLAN_TABS.GENERAL,
|
826
|
+
);
|
827
|
+
executionPlanState.globalImplementationSupportState.setSelectedJavaClass(
|
828
|
+
undefined,
|
829
|
+
);
|
654
830
|
};
|
655
831
|
const rawPlan = executionPlanState.rawPlan;
|
656
832
|
const isDarkMode =
|
@@ -0,0 +1,76 @@
|
|
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 { PanelListItem } from '@finos/legend-art';
|
18
|
+
import {
|
19
|
+
type ExecutionNode,
|
20
|
+
ExecutionPlan,
|
21
|
+
JavaPlatformImplementation,
|
22
|
+
} from '@finos/legend-graph';
|
23
|
+
import { guaranteeType } from '@finos/legend-shared';
|
24
|
+
import { observer } from 'mobx-react-lite';
|
25
|
+
import {
|
26
|
+
type ExecutionPlanState,
|
27
|
+
PLAN_TABS,
|
28
|
+
} from '../../stores/execution-plan/ExecutionPlanState.js';
|
29
|
+
|
30
|
+
export const ImplementationViewer: React.FC<{
|
31
|
+
node: ExecutionNode;
|
32
|
+
executionPlanState: ExecutionPlanState;
|
33
|
+
}> = observer((props) => {
|
34
|
+
const { node, executionPlanState } = props;
|
35
|
+
|
36
|
+
const openJavaClass = (): void => {
|
37
|
+
executionPlanState.setSelectedNode(
|
38
|
+
executionPlanState.treeData?.nodes.get(`Execution Plan`),
|
39
|
+
);
|
40
|
+
executionPlanState.transformMetadataToProtocolJson(
|
41
|
+
guaranteeType(
|
42
|
+
executionPlanState.plan,
|
43
|
+
ExecutionPlan,
|
44
|
+
'Execution plan is undefined',
|
45
|
+
),
|
46
|
+
);
|
47
|
+
executionPlanState.globalImplementationSupportState.setSelectedTab(
|
48
|
+
PLAN_TABS.GLOBAL_IMPLEMENTATION_SUPPORT,
|
49
|
+
);
|
50
|
+
if (node.implementation instanceof JavaPlatformImplementation) {
|
51
|
+
executionPlanState.globalImplementationSupportState.setSelectedJavaClass(
|
52
|
+
node.implementation.executionClassFullName,
|
53
|
+
);
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
return (
|
58
|
+
<>
|
59
|
+
<PanelListItem className="query-builder__implementation__container__header">
|
60
|
+
Implementation
|
61
|
+
</PanelListItem>
|
62
|
+
{node.implementation instanceof JavaPlatformImplementation &&
|
63
|
+
node.implementation.executionClassFullName && (
|
64
|
+
<div className="query-builder__implementation__container__item">
|
65
|
+
<button
|
66
|
+
onClick={openJavaClass}
|
67
|
+
title={`Go to Java class: ${node.implementation.executionClassFullName}`}
|
68
|
+
className="query-builder__implementation__container__item__java-btn"
|
69
|
+
>
|
70
|
+
{node.implementation.executionClassFullName}
|
71
|
+
</button>
|
72
|
+
</div>
|
73
|
+
)}
|
74
|
+
</>
|
75
|
+
);
|
76
|
+
});
|
@@ -0,0 +1,55 @@
|
|
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 { PanelListItem, PanelDivider } from '@finos/legend-art';
|
19
|
+
import { type PartialClassResultType } from '@finos/legend-graph';
|
20
|
+
|
21
|
+
export const PartialClassResultTypeViewer: React.FC<{
|
22
|
+
resultType: PartialClassResultType;
|
23
|
+
}> = observer((props) => {
|
24
|
+
const { resultType } = props;
|
25
|
+
|
26
|
+
return (
|
27
|
+
<div className="query-builder__result__container">
|
28
|
+
<PanelListItem className="query-builder__result__container__item__partial-class">
|
29
|
+
Result type: PartialClass[{resultType.type.valueForSerialization ?? ''}]
|
30
|
+
</PanelListItem>
|
31
|
+
<PanelDivider />
|
32
|
+
{
|
33
|
+
<table className="table query-builder__result__container__table--partial-class">
|
34
|
+
<thead>
|
35
|
+
<tr>
|
36
|
+
<th className="table__cell--left">Property</th>
|
37
|
+
<th className="table__cell--left">Parameters</th>
|
38
|
+
</tr>
|
39
|
+
</thead>
|
40
|
+
<tbody>
|
41
|
+
{resultType.propertiesWithParameters.map((column) => (
|
42
|
+
<tr key={column.property}>
|
43
|
+
<td className="table__cell--left">{column.property}</td>
|
44
|
+
<td className="table__cell--left">
|
45
|
+
{column.parameters.toString()}
|
46
|
+
</td>
|
47
|
+
</tr>
|
48
|
+
))}
|
49
|
+
</tbody>
|
50
|
+
</table>
|
51
|
+
}
|
52
|
+
<PanelDivider />
|
53
|
+
</div>
|
54
|
+
);
|
55
|
+
});
|