@finos/legend-query-builder 1.0.6 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/application/QueryBuilderEvent.d.ts +7 -7
- package/lib/application/QueryBuilderEvent.d.ts.map +1 -1
- package/lib/application/QueryBuilderEvent.js +7 -7
- package/lib/application/QueryBuilderEvent.js.map +1 -1
- package/lib/components/QueryBuilder.js +1 -1
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.js +13 -2
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js +2 -2
- package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts +3 -2
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +53 -13
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +3 -2
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts +1 -0
- package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts.map +1 -1
- package/lib/graphManager/QueryBuilderSupportedFunctions.js +1 -0
- package/lib/graphManager/QueryBuilderSupportedFunctions.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +7 -7
- package/lib/stores/QueryBuilderStateBuilder.d.ts +2 -1
- package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateBuilder.js +8 -1
- package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.d.ts +1 -0
- 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/QueryBuilderFetchStructureState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js +3 -2
- package/lib/stores/fetch-structure/QueryBuilderFetchStructureState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts +49 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js +126 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts +1 -0
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js +85 -4
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.d.ts +3 -2
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js +96 -14
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js +6 -0
- package/lib/stores/fetch-structure/tds/QueryBuilderTDSState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts +1 -0
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js +10 -1
- package/lib/stores/fetch-structure/tds/window/QueryBuilderWindowState.js.map +1 -1
- package/package.json +14 -14
- package/src/application/QueryBuilderEvent.ts +7 -7
- package/src/components/QueryBuilder.tsx +1 -1
- package/src/components/QueryBuilderResultPanel.tsx +16 -1
- package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +2 -2
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +240 -5
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +8 -5
- package/src/graphManager/QueryBuilderSupportedFunctions.ts +1 -0
- package/src/stores/QueryBuilderStateBuilder.ts +20 -0
- package/src/stores/fetch-structure/QueryBuilderFetchStructureImplementationState.ts +2 -0
- package/src/stores/fetch-structure/QueryBuilderFetchStructureState.ts +3 -2
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.ts +158 -0
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.ts +258 -4
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeValueSpecificationBuilder.ts +166 -24
- package/src/stores/fetch-structure/tds/QueryBuilderTDSState.ts +7 -0
- package/src/stores/fetch-structure/tds/window/QueryBuilderWindowState.ts +14 -1
@@ -15,12 +15,12 @@
|
|
15
15
|
*/
|
16
16
|
|
17
17
|
export enum QUERY_BUILDER_EVENT {
|
18
|
-
RUN_QUERY__LAUNCH = '
|
19
|
-
GENERATE_EXECUTION_PLAN__LAUNCH = '
|
20
|
-
DEBUG_EXECUTION_PLAN__LAUNCH = '
|
18
|
+
RUN_QUERY__LAUNCH = 'query-builder.run-query.launch',
|
19
|
+
GENERATE_EXECUTION_PLAN__LAUNCH = 'query-builder.generate-plan.launch',
|
20
|
+
DEBUG_EXECUTION_PLAN__LAUNCH = 'query-builder.debug-plan.launch',
|
21
21
|
|
22
|
-
RUN_QUERY__SUCCESS = '
|
23
|
-
GENERATE_EXECUTION_PLAN__SUCCESS = '
|
24
|
-
DEBUG_EXECUTION_PLAN__SUCCESS = '
|
25
|
-
BUILD_EXECUTION_PLAN__SUCCESS = '
|
22
|
+
RUN_QUERY__SUCCESS = 'query-builder.run-query.success',
|
23
|
+
GENERATE_EXECUTION_PLAN__SUCCESS = 'query-builder.generate-plan.success',
|
24
|
+
DEBUG_EXECUTION_PLAN__SUCCESS = 'query-builder.debug-plan.success',
|
25
|
+
BUILD_EXECUTION_PLAN__SUCCESS = 'query-builder.build-plan.success',
|
26
26
|
}
|
@@ -478,7 +478,7 @@ export const QueryBuilder = observer(
|
|
478
478
|
) : null}
|
479
479
|
</MenuContentItemIcon>
|
480
480
|
<MenuContentItemLabel className="query-builder__sub-header__menu-content">
|
481
|
-
Show Window
|
481
|
+
Show Window Func(s)
|
482
482
|
</MenuContentItemLabel>
|
483
483
|
</MenuContentItem>
|
484
484
|
<MenuContentItem
|
@@ -481,8 +481,19 @@ export const QueryBuilderResultPanel = observer(
|
|
481
481
|
});
|
482
482
|
};
|
483
483
|
const queryValidationIssues = queryBuilderState.validationIssues;
|
484
|
+
const queryWindowValidationIssues =
|
485
|
+
queryBuilderState.fetchStructureState.implementation instanceof
|
486
|
+
QueryBuilderTDSState
|
487
|
+
? queryBuilderState.fetchStructureState.implementation.windowState
|
488
|
+
.validationIssues
|
489
|
+
: undefined;
|
490
|
+
const queryWindowStateIsValid = !queryWindowValidationIssues;
|
491
|
+
|
492
|
+
const isSupportedQueryValid =
|
493
|
+
queryBuilderState.validationIssues && queryWindowStateIsValid;
|
484
494
|
const isQueryValid =
|
485
|
-
!queryBuilderState.isQuerySupported || !
|
495
|
+
!queryBuilderState.isQuerySupported || !isSupportedQueryValid;
|
496
|
+
|
486
497
|
const runQuery = (): void => {
|
487
498
|
resultState.pressedRunQuery.inProgress();
|
488
499
|
if (queryParametersState.parameterStates.length) {
|
@@ -614,6 +625,10 @@ export const QueryBuilderResultPanel = observer(
|
|
614
625
|
? `Query is not valid:\n${queryValidationIssues
|
615
626
|
.map((issue) => `\u2022 ${issue}`)
|
616
627
|
.join('\n')}`
|
628
|
+
: queryWindowValidationIssues
|
629
|
+
? `Query is not valid:\n${queryWindowValidationIssues
|
630
|
+
.map((issue) => `\u2022 ${issue}`)
|
631
|
+
.join('\n')}`
|
617
632
|
: undefined
|
618
633
|
}
|
619
634
|
disabled={isRunQueryDisabled}
|
@@ -24,7 +24,7 @@ import {
|
|
24
24
|
import type { QueryBuilderState } from '../../stores/QueryBuilderState.js';
|
25
25
|
import { prettyCONSTName } from '@finos/legend-shared';
|
26
26
|
import { QueryBuilderTDSPanel } from './QueryBuilderTDSPanel.js';
|
27
|
-
import {
|
27
|
+
import { QueryBuilderGraphFetchPanel } from './QueryBuilderGraphFetchTreePanel.js';
|
28
28
|
import { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
29
29
|
import { QueryBuilderGraphFetchTreeState } from '../../stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js';
|
30
30
|
import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
|
@@ -42,7 +42,7 @@ const QueryBuilderFetchStructureEditor = observer(
|
|
42
42
|
fetchStructureImplementation instanceof QueryBuilderGraphFetchTreeState
|
43
43
|
) {
|
44
44
|
return (
|
45
|
-
<
|
45
|
+
<QueryBuilderGraphFetchPanel
|
46
46
|
graphFetchTreeState={fetchStructureImplementation}
|
47
47
|
/>
|
48
48
|
);
|
@@ -29,6 +29,18 @@ import {
|
|
29
29
|
SquareIcon,
|
30
30
|
InfoCircleIcon,
|
31
31
|
PanelDropZone,
|
32
|
+
BlankPanelContent,
|
33
|
+
Dialog,
|
34
|
+
ModalHeader,
|
35
|
+
Modal,
|
36
|
+
ModalBody,
|
37
|
+
Panel,
|
38
|
+
PanelForm,
|
39
|
+
PanelFormTextField,
|
40
|
+
PanelFormBooleanField,
|
41
|
+
ModalFooterButton,
|
42
|
+
ModalFooter,
|
43
|
+
SerializeIcon,
|
32
44
|
} from '@finos/legend-art';
|
33
45
|
import { QUERY_BUILDER_TEST_ID } from '../../application/QueryBuilderTesting.js';
|
34
46
|
import { isNonNullable } from '@finos/legend-shared';
|
@@ -42,8 +54,13 @@ import {
|
|
42
54
|
type QueryBuilderExplorerTreeDragSource,
|
43
55
|
QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
|
44
56
|
} from '../../stores/explorer/QueryBuilderExplorerState.js';
|
45
|
-
import
|
57
|
+
import {
|
58
|
+
GraphFetchPureSerializationState,
|
59
|
+
PureSerializationConfig,
|
60
|
+
type QueryBuilderGraphFetchTreeState,
|
61
|
+
} from '../../stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js';
|
46
62
|
import { getClassPropertyIcon } from '../shared/ElementIconUtils.js';
|
63
|
+
import { QueryBuilderTextEditorMode } from '../../stores/QueryBuilderTextEditorState.js';
|
47
64
|
|
48
65
|
const QueryBuilderGraphFetchTreeNodeContainer: React.FC<
|
49
66
|
TreeNodeContainerProps<
|
@@ -134,14 +151,157 @@ const QueryBuilderGraphFetchTreeNodeContainer: React.FC<
|
|
134
151
|
);
|
135
152
|
};
|
136
153
|
|
154
|
+
const PureSerializationConfigModal = observer(
|
155
|
+
(props: {
|
156
|
+
pureSerializationState: GraphFetchPureSerializationState;
|
157
|
+
graphFetchState: QueryBuilderGraphFetchTreeState;
|
158
|
+
config: PureSerializationConfig;
|
159
|
+
}) => {
|
160
|
+
const { pureSerializationState, graphFetchState, config } = props;
|
161
|
+
const applicationStore = graphFetchState.queryBuilderState.applicationStore;
|
162
|
+
const toAdd = !pureSerializationState.config;
|
163
|
+
const handleAction = (): void => {
|
164
|
+
if (toAdd) {
|
165
|
+
pureSerializationState.setConfig(config);
|
166
|
+
}
|
167
|
+
pureSerializationState.setConfigModal(false);
|
168
|
+
};
|
169
|
+
const removeConfig = (): void => {
|
170
|
+
pureSerializationState.setConfig(undefined);
|
171
|
+
pureSerializationState.setConfigModal(false);
|
172
|
+
graphFetchState.queryBuilderState.applicationStore.notificationService.notifySuccess(
|
173
|
+
'Serialization config removed',
|
174
|
+
);
|
175
|
+
};
|
176
|
+
const close = (): void => pureSerializationState.setConfigModal(false);
|
177
|
+
return (
|
178
|
+
<Dialog
|
179
|
+
open={pureSerializationState.configModal}
|
180
|
+
onClose={close}
|
181
|
+
classes={{
|
182
|
+
root: 'editor-modal__root-container',
|
183
|
+
container: 'editor-modal__container',
|
184
|
+
paper: 'editor-modal__content',
|
185
|
+
}}
|
186
|
+
>
|
187
|
+
<Modal
|
188
|
+
darkMode={
|
189
|
+
!applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
|
190
|
+
}
|
191
|
+
className="query-builder-graph-fetch-config"
|
192
|
+
>
|
193
|
+
<ModalHeader
|
194
|
+
title={`${
|
195
|
+
toAdd ? 'Add Serialization Config' : 'Edit Serialization Config'
|
196
|
+
}`}
|
197
|
+
/>
|
198
|
+
<ModalBody className="query-builder-graph-fetch-config__content">
|
199
|
+
<Panel>
|
200
|
+
<PanelForm>
|
201
|
+
<PanelFormTextField
|
202
|
+
name="Type Key Name"
|
203
|
+
value={config.typeKeyName}
|
204
|
+
isReadOnly={false}
|
205
|
+
update={(value: string | undefined): void =>
|
206
|
+
config.setTypeName(value ?? '')
|
207
|
+
}
|
208
|
+
errorMessage={
|
209
|
+
config.typeKeyName === ''
|
210
|
+
? `Type key name can't be empty`
|
211
|
+
: undefined
|
212
|
+
}
|
213
|
+
/>
|
214
|
+
<PanelFormBooleanField
|
215
|
+
name="Include Type"
|
216
|
+
value={config.includeType}
|
217
|
+
isReadOnly={false}
|
218
|
+
update={(value: boolean | undefined): void =>
|
219
|
+
config.setIncludeType(Boolean(value))
|
220
|
+
}
|
221
|
+
/>
|
222
|
+
|
223
|
+
<PanelFormBooleanField
|
224
|
+
name="Include Enum Type"
|
225
|
+
value={config.includeEnumType}
|
226
|
+
isReadOnly={false}
|
227
|
+
update={(value: boolean | undefined): void =>
|
228
|
+
config.setInclueEnumType(Boolean(value))
|
229
|
+
}
|
230
|
+
/>
|
231
|
+
|
232
|
+
<PanelFormBooleanField
|
233
|
+
name="Remove Properties With Null Values"
|
234
|
+
value={config.removePropertiesWithNullValues}
|
235
|
+
isReadOnly={false}
|
236
|
+
update={(value: boolean | undefined): void =>
|
237
|
+
config.setRemovePropertiesWithNullValues(Boolean(value))
|
238
|
+
}
|
239
|
+
/>
|
240
|
+
|
241
|
+
<PanelFormBooleanField
|
242
|
+
name="Remove properties with empty sets"
|
243
|
+
value={config.removePropertiesWithEmptySets}
|
244
|
+
isReadOnly={false}
|
245
|
+
update={(value: boolean | undefined): void =>
|
246
|
+
config.setRemovePropertiesWithEmptySets(Boolean(value))
|
247
|
+
}
|
248
|
+
/>
|
249
|
+
|
250
|
+
<PanelFormBooleanField
|
251
|
+
name="Use Fully Qualified Type Path"
|
252
|
+
value={config.fullyQualifiedTypePath}
|
253
|
+
isReadOnly={false}
|
254
|
+
update={(value: boolean | undefined): void =>
|
255
|
+
config.setFullyQualifiedTypePath(Boolean(value))
|
256
|
+
}
|
257
|
+
/>
|
258
|
+
<PanelFormBooleanField
|
259
|
+
name="Include Object Reference"
|
260
|
+
value={config.includeObjectReference}
|
261
|
+
isReadOnly={false}
|
262
|
+
update={(value: boolean | undefined): void =>
|
263
|
+
config.setIncludeObjectReference(Boolean(value))
|
264
|
+
}
|
265
|
+
/>
|
266
|
+
</PanelForm>
|
267
|
+
</Panel>
|
268
|
+
</ModalBody>
|
269
|
+
<ModalFooter>
|
270
|
+
{!toAdd && (
|
271
|
+
<ModalFooterButton
|
272
|
+
className="btn--caution"
|
273
|
+
text="Remove Config"
|
274
|
+
onClick={removeConfig}
|
275
|
+
/>
|
276
|
+
)}
|
277
|
+
<button
|
278
|
+
className="btn modal__footer__close-btn btn--dark"
|
279
|
+
onClick={handleAction}
|
280
|
+
>
|
281
|
+
{toAdd ? 'Add Config' : 'Close'}
|
282
|
+
</button>
|
283
|
+
</ModalFooter>
|
284
|
+
</Modal>
|
285
|
+
</Dialog>
|
286
|
+
);
|
287
|
+
},
|
288
|
+
);
|
289
|
+
|
137
290
|
export const QueryBuilderGraphFetchTreeExplorer = observer(
|
138
291
|
(props: {
|
139
292
|
graphFetchState: QueryBuilderGraphFetchTreeState;
|
293
|
+
pureSerializationState: GraphFetchPureSerializationState;
|
140
294
|
treeData: QueryBuilderGraphFetchTreeData;
|
141
295
|
updateTreeData: (data: QueryBuilderGraphFetchTreeData) => void;
|
142
296
|
isReadOnly: boolean;
|
143
297
|
}) => {
|
144
|
-
const {
|
298
|
+
const {
|
299
|
+
graphFetchState,
|
300
|
+
pureSerializationState,
|
301
|
+
treeData,
|
302
|
+
updateTreeData,
|
303
|
+
isReadOnly,
|
304
|
+
} = props;
|
145
305
|
|
146
306
|
const onNodeSelect = (node: QueryBuilderGraphFetchTreeNodeData): void => {
|
147
307
|
if (node.childrenIds.length) {
|
@@ -165,9 +325,30 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
|
|
165
325
|
const toggleChecked = (): void =>
|
166
326
|
graphFetchState.setChecked(!graphFetchState.isChecked);
|
167
327
|
|
328
|
+
const openConfigModal = (): void => {
|
329
|
+
pureSerializationState.setConfigModal(true);
|
330
|
+
};
|
331
|
+
|
168
332
|
return (
|
169
333
|
<div className="query-builder-graph-fetch-tree">
|
170
334
|
<div className="query-builder-graph-fetch-tree__toolbar">
|
335
|
+
<div className="query-builder-graph-fetch-tree__actions">
|
336
|
+
<button
|
337
|
+
className="query-builder-graph-fetch-tree__actions__action-btn__label"
|
338
|
+
onClick={openConfigModal}
|
339
|
+
title={`${
|
340
|
+
pureSerializationState.config
|
341
|
+
? 'Edit pure serialization config'
|
342
|
+
: 'Add pure serialization config'
|
343
|
+
}`}
|
344
|
+
tabIndex={-1}
|
345
|
+
>
|
346
|
+
<SerializeIcon className="query-builder-graph-fetch-tree__actions__action-btn__label__icon" />
|
347
|
+
<div className="query-builder-graph-fetch-tree__actions__action-btn__label__title">
|
348
|
+
{pureSerializationState.config ? 'Edit Config' : 'Add Config'}
|
349
|
+
</div>
|
350
|
+
</button>
|
351
|
+
</div>
|
171
352
|
<div
|
172
353
|
className={clsx('panel__content__form__section__toggler')}
|
173
354
|
onClick={toggleChecked}
|
@@ -189,6 +370,15 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
|
|
189
370
|
</div>
|
190
371
|
</div>
|
191
372
|
<div className="query-builder-graph-fetch-tree__container">
|
373
|
+
{pureSerializationState.configModal && (
|
374
|
+
<PureSerializationConfigModal
|
375
|
+
pureSerializationState={pureSerializationState}
|
376
|
+
graphFetchState={graphFetchState}
|
377
|
+
config={
|
378
|
+
pureSerializationState.config ?? new PureSerializationConfig()
|
379
|
+
}
|
380
|
+
/>
|
381
|
+
)}
|
192
382
|
<TreeView
|
193
383
|
components={{
|
194
384
|
TreeNodeContainer: QueryBuilderGraphFetchTreeNodeContainer,
|
@@ -207,9 +397,13 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
|
|
207
397
|
},
|
208
398
|
);
|
209
399
|
|
210
|
-
|
211
|
-
(props: {
|
212
|
-
|
400
|
+
const QueryBuilderGraphFetchTreePanel = observer(
|
401
|
+
(props: {
|
402
|
+
graphFetchTreeState: QueryBuilderGraphFetchTreeState;
|
403
|
+
|
404
|
+
pureSerializationState: GraphFetchPureSerializationState;
|
405
|
+
}) => {
|
406
|
+
const { graphFetchTreeState, pureSerializationState } = props;
|
213
407
|
const treeData = graphFetchTreeState.treeData;
|
214
408
|
|
215
409
|
// Deep/Graph Fetch Tree
|
@@ -264,6 +458,7 @@ export const QueryBuilderGraphFetchTreePanel = observer(
|
|
264
458
|
{treeData && !isGraphFetchTreeDataEmpty(treeData) && (
|
265
459
|
<QueryBuilderGraphFetchTreeExplorer
|
266
460
|
graphFetchState={graphFetchTreeState}
|
461
|
+
pureSerializationState={pureSerializationState}
|
267
462
|
treeData={treeData}
|
268
463
|
isReadOnly={false}
|
269
464
|
updateTreeData={updateTreeData}
|
@@ -274,3 +469,43 @@ export const QueryBuilderGraphFetchTreePanel = observer(
|
|
274
469
|
);
|
275
470
|
},
|
276
471
|
);
|
472
|
+
|
473
|
+
export const QueryBuilderGraphFetchPanel = observer(
|
474
|
+
(props: { graphFetchTreeState: QueryBuilderGraphFetchTreeState }) => {
|
475
|
+
const { graphFetchTreeState } = props;
|
476
|
+
const serializationState = graphFetchTreeState.serializationState;
|
477
|
+
const handleTextModeClick = (): void =>
|
478
|
+
graphFetchTreeState.queryBuilderState.textEditorState.openModal(
|
479
|
+
QueryBuilderTextEditorMode.TEXT,
|
480
|
+
);
|
481
|
+
if (serializationState instanceof GraphFetchPureSerializationState) {
|
482
|
+
return (
|
483
|
+
<QueryBuilderGraphFetchTreePanel
|
484
|
+
graphFetchTreeState={graphFetchTreeState}
|
485
|
+
pureSerializationState={serializationState}
|
486
|
+
/>
|
487
|
+
);
|
488
|
+
}
|
489
|
+
return (
|
490
|
+
<div
|
491
|
+
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_GRAPH_FETCH}
|
492
|
+
className="panel__content"
|
493
|
+
>
|
494
|
+
<BlankPanelContent>
|
495
|
+
<div className="unsupported-element-editor__main">
|
496
|
+
<div className="unsupported-element-editor__summary">
|
497
|
+
Unsupported Graph Fetch Serialization Type
|
498
|
+
</div>
|
499
|
+
|
500
|
+
<button
|
501
|
+
className="btn--dark unsupported-element-editor__to-text-mode__btn"
|
502
|
+
onClick={handleTextModeClick}
|
503
|
+
>
|
504
|
+
Edit in text mode
|
505
|
+
</button>
|
506
|
+
</div>
|
507
|
+
</BlankPanelContent>
|
508
|
+
</div>
|
509
|
+
);
|
510
|
+
},
|
511
|
+
);
|
@@ -63,6 +63,7 @@ import type { QueryBuilderTDSColumnState } from '../../stores/fetch-structure/td
|
|
63
63
|
import type { QueryBuilderTDSState } from '../../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
64
64
|
import { COLUMN_SORT_TYPE } from '../../stores/fetch-structure/tds/QueryResultSetModifierState.js';
|
65
65
|
import { QUERY_BUILDER_TEST_ID } from '../../application/QueryBuilderTesting.js';
|
66
|
+
import { QueryBuilderPanelIssueCountBadge } from '../shared/QueryBuilderPanelIssueCountBadge.js';
|
66
67
|
|
67
68
|
// helpers
|
68
69
|
const createWindowColumnState = (
|
@@ -190,7 +191,9 @@ const QueryBuilderWindowColumnModalEditor = observer(
|
|
190
191
|
const close = (): void => {
|
191
192
|
windowState.setEditColumn(undefined);
|
192
193
|
};
|
193
|
-
const isDuplicatedColumnName =
|
194
|
+
const isDuplicatedColumnName = !windowState.windowColumns.includes(
|
195
|
+
windowColumnState,
|
196
|
+
)
|
194
197
|
? windowState.tdsState.tdsColumns
|
195
198
|
.map((c) => c.columnName)
|
196
199
|
.includes(windowColumnState.columnName)
|
@@ -1167,10 +1170,7 @@ export const QueryBuilderTDSWindowPanel = observer(
|
|
1167
1170
|
[applicationStore, handleDrop],
|
1168
1171
|
);
|
1169
1172
|
return (
|
1170
|
-
<div
|
1171
|
-
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_WINDOW_GROUPBY}
|
1172
|
-
className="panel"
|
1173
|
-
>
|
1173
|
+
<div className="panel">
|
1174
1174
|
<div
|
1175
1175
|
data-testid={QUERY_BUILDER_TEST_ID.QUERY_BUILDER_WINDOW_GROUPBY}
|
1176
1176
|
className="panel"
|
@@ -1178,6 +1178,9 @@ export const QueryBuilderTDSWindowPanel = observer(
|
|
1178
1178
|
<div className="panel__header">
|
1179
1179
|
<div className="panel__header__title">
|
1180
1180
|
<div className="panel__header__title__label">Window Function</div>
|
1181
|
+
<QueryBuilderPanelIssueCountBadge
|
1182
|
+
issues={tdsWindowState.validationIssues}
|
1183
|
+
/>
|
1181
1184
|
</div>
|
1182
1185
|
<div className="panel__header__actions">
|
1183
1186
|
<button
|
@@ -30,6 +30,7 @@ export enum QUERY_BUILDER_SUPPORTED_FUNCTIONS {
|
|
30
30
|
GRAPH_FETCH = 'meta::pure::graphFetch::execution::graphFetch',
|
31
31
|
GRAPH_FETCH_CHECKED = 'meta::pure::graphFetch::execution::graphFetchChecked',
|
32
32
|
SERIALIZE = 'meta::pure::graphFetch::execution::serialize',
|
33
|
+
EXTERNALIZE = 'meta::external::shared::format::functions::externalize',
|
33
34
|
|
34
35
|
// TDS
|
35
36
|
TDS_FILTER = 'meta::pure::tds::filter',
|
@@ -32,6 +32,7 @@ import {
|
|
32
32
|
type InstanceValue,
|
33
33
|
type INTERNAL__UnknownValueSpecification,
|
34
34
|
type LambdaFunction,
|
35
|
+
type KeyExpressionInstanceValue,
|
35
36
|
matchFunctionName,
|
36
37
|
Class,
|
37
38
|
type CollectionInstanceValue,
|
@@ -53,6 +54,7 @@ import {
|
|
53
54
|
} from './fetch-structure/tds/aggregation/QueryBuilderAggregationStateBuilder.js';
|
54
55
|
import {
|
55
56
|
processGraphFetchExpression,
|
57
|
+
processGraphFetchExternalizeExpression,
|
56
58
|
processGraphFetchSerializeExpression,
|
57
59
|
} from './fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeStateBuilder.js';
|
58
60
|
import {
|
@@ -503,6 +505,18 @@ export class QueryBuilderValueSpecificationProcessor
|
|
503
505
|
this.parentLambda,
|
504
506
|
);
|
505
507
|
return;
|
508
|
+
} else if (
|
509
|
+
matchFunctionName(
|
510
|
+
functionName,
|
511
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.EXTERNALIZE,
|
512
|
+
)
|
513
|
+
) {
|
514
|
+
processGraphFetchExternalizeExpression(
|
515
|
+
valueSpecification,
|
516
|
+
this.queryBuilderState,
|
517
|
+
this.parentLambda,
|
518
|
+
);
|
519
|
+
return;
|
506
520
|
} else if (
|
507
521
|
matchFunctionName(functionName, [
|
508
522
|
QUERY_BUILDER_SUPPORTED_FUNCTIONS.GRAPH_FETCH_CHECKED,
|
@@ -563,6 +577,12 @@ export class QueryBuilderValueSpecificationProcessor
|
|
563
577
|
throw new UnsupportedOperationError();
|
564
578
|
}
|
565
579
|
|
580
|
+
visit_KeyExpressionInstanceValue(
|
581
|
+
valueSpecification: KeyExpressionInstanceValue,
|
582
|
+
): void {
|
583
|
+
throw new UnsupportedOperationError();
|
584
|
+
}
|
585
|
+
|
566
586
|
visit_CollectionInstanceValue(
|
567
587
|
valueSpecification: CollectionInstanceValue,
|
568
588
|
): void {
|
@@ -55,6 +55,7 @@ export abstract class QueryBuilderFetchStructureImplementationState
|
|
55
55
|
abstract get type(): string;
|
56
56
|
abstract get usedExplorerTreePropertyNodeIDs(): string[];
|
57
57
|
abstract get validationIssues(): string[] | undefined;
|
58
|
+
|
58
59
|
abstract onClassChange(_class: Class | undefined): void;
|
59
60
|
abstract revealCompilationError(compilationError: CompilationError): boolean;
|
60
61
|
abstract clearCompilationError(): void;
|
@@ -68,6 +69,7 @@ export abstract class QueryBuilderFetchStructureImplementationState
|
|
68
69
|
lambdaFunction: LambdaFunction,
|
69
70
|
options?: LambdaFunctionBuilderOption,
|
70
71
|
): void;
|
72
|
+
abstract initialize(): void;
|
71
73
|
abstract get hashCode(): string;
|
72
74
|
|
73
75
|
get TEMPORARY__showPostFetchStructurePanel(): boolean {
|
@@ -59,20 +59,21 @@ export class QueryBuilderFetchStructureState {
|
|
59
59
|
this.queryBuilderState,
|
60
60
|
this,
|
61
61
|
);
|
62
|
-
|
62
|
+
break;
|
63
63
|
}
|
64
64
|
case FETCH_STRUCTURE_IMPLEMENTATION.GRAPH_FETCH: {
|
65
65
|
this.implementation = new QueryBuilderGraphFetchTreeState(
|
66
66
|
this.queryBuilderState,
|
67
67
|
this,
|
68
68
|
);
|
69
|
-
|
69
|
+
break;
|
70
70
|
}
|
71
71
|
default:
|
72
72
|
throw new UnsupportedOperationError(
|
73
73
|
`Can't change fetch-structure implementation to unsupported type: '${type}'`,
|
74
74
|
);
|
75
75
|
}
|
76
|
+
this.implementation.initialize();
|
76
77
|
}
|
77
78
|
|
78
79
|
fetchProperty(node: QueryBuilderExplorerTreeNodeData): void {
|