@finos/legend-query-builder 1.0.5 → 2.0.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/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/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/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 +17 -1
- package/lib/index.css.map +1 -1
- package/lib/package.json +6 -6
- 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/package.json +13 -13
- package/src/application/QueryBuilderEvent.ts +7 -7
- package/src/components/fetch-structure/QueryBuilderFetchStructurePanel.tsx +2 -2
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +240 -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
@@ -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
|
+
);
|
@@ -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 {
|
@@ -24,6 +24,7 @@ import {
|
|
24
24
|
PackageableElementExplicitReference,
|
25
25
|
RootGraphFetchTree,
|
26
26
|
getAllSuperclasses,
|
27
|
+
type Binding,
|
27
28
|
} from '@finos/legend-graph';
|
28
29
|
import {
|
29
30
|
type QueryBuilderGraphFetchTreeData,
|
@@ -54,6 +55,145 @@ import {
|
|
54
55
|
import { QUERY_BUILDER_HASH_STRUCTURE } from '../../../graphManager/QueryBuilderHashUtils.js';
|
55
56
|
import { isValueExpressionReferencedInValue } from '../../QueryBuilderValueSpecificationHelper.js';
|
56
57
|
|
58
|
+
export enum SERIALIZATION_TYPE {
|
59
|
+
PURE = 'PURE',
|
60
|
+
EXTERNAL_FORMAT = 'EXTERNAL_FORMAT',
|
61
|
+
}
|
62
|
+
|
63
|
+
const DEFAULT_PURE_CONFIG_TYPE_NAME = '@type';
|
64
|
+
|
65
|
+
export class PureSerializationConfig {
|
66
|
+
typeKeyName: string;
|
67
|
+
includeType: boolean;
|
68
|
+
includeEnumType: boolean;
|
69
|
+
removePropertiesWithNullValues: boolean;
|
70
|
+
removePropertiesWithEmptySets: boolean;
|
71
|
+
fullyQualifiedTypePath: boolean;
|
72
|
+
includeObjectReference: boolean;
|
73
|
+
|
74
|
+
constructor() {
|
75
|
+
// default values
|
76
|
+
this.typeKeyName = DEFAULT_PURE_CONFIG_TYPE_NAME;
|
77
|
+
this.includeType = true;
|
78
|
+
this.includeEnumType = true;
|
79
|
+
this.removePropertiesWithNullValues = true;
|
80
|
+
this.removePropertiesWithEmptySets = false;
|
81
|
+
this.fullyQualifiedTypePath = true;
|
82
|
+
this.includeObjectReference = false;
|
83
|
+
makeObservable(this, {
|
84
|
+
typeKeyName: observable,
|
85
|
+
includeType: observable,
|
86
|
+
includeEnumType: observable,
|
87
|
+
removePropertiesWithNullValues: observable,
|
88
|
+
removePropertiesWithEmptySets: observable,
|
89
|
+
fullyQualifiedTypePath: observable,
|
90
|
+
includeObjectReference: observable,
|
91
|
+
setTypeName: action,
|
92
|
+
setIncludeObjectReference: action,
|
93
|
+
setIncludeType: action,
|
94
|
+
setFullyQualifiedTypePath: action,
|
95
|
+
setRemovePropertiesWithEmptySets: action,
|
96
|
+
setInclueEnumType: action,
|
97
|
+
setRemovePropertiesWithNullValues: action,
|
98
|
+
});
|
99
|
+
}
|
100
|
+
|
101
|
+
setTypeName(val: string): void {
|
102
|
+
this.typeKeyName = val;
|
103
|
+
}
|
104
|
+
|
105
|
+
setIncludeType(val: boolean): void {
|
106
|
+
this.includeType = val;
|
107
|
+
}
|
108
|
+
|
109
|
+
setInclueEnumType(val: boolean): void {
|
110
|
+
this.includeEnumType = val;
|
111
|
+
}
|
112
|
+
|
113
|
+
setRemovePropertiesWithNullValues(val: boolean): void {
|
114
|
+
this.removePropertiesWithNullValues = val;
|
115
|
+
}
|
116
|
+
|
117
|
+
setRemovePropertiesWithEmptySets(val: boolean): void {
|
118
|
+
this.removePropertiesWithEmptySets = val;
|
119
|
+
}
|
120
|
+
|
121
|
+
setFullyQualifiedTypePath(val: boolean): void {
|
122
|
+
this.fullyQualifiedTypePath = val;
|
123
|
+
}
|
124
|
+
|
125
|
+
setIncludeObjectReference(val: boolean): void {
|
126
|
+
this.includeObjectReference = val;
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
export abstract class GraphFetchSerializationState {
|
131
|
+
readonly queryBuilderGraphFetchTreeState: QueryBuilderGraphFetchTreeState;
|
132
|
+
|
133
|
+
constructor(graphFetchTreeState: QueryBuilderGraphFetchTreeState) {
|
134
|
+
this.queryBuilderGraphFetchTreeState = graphFetchTreeState;
|
135
|
+
}
|
136
|
+
|
137
|
+
abstract getLabel(): string;
|
138
|
+
}
|
139
|
+
|
140
|
+
export class GraphFetchPureSerializationState extends GraphFetchSerializationState {
|
141
|
+
config: PureSerializationConfig | undefined;
|
142
|
+
configModal = false;
|
143
|
+
|
144
|
+
constructor(graphFetchTreeState: QueryBuilderGraphFetchTreeState) {
|
145
|
+
super(graphFetchTreeState);
|
146
|
+
makeObservable(this, {
|
147
|
+
config: observable,
|
148
|
+
configModal: observable,
|
149
|
+
setConfigModal: action,
|
150
|
+
});
|
151
|
+
}
|
152
|
+
|
153
|
+
setConfig(value: PureSerializationConfig | undefined): void {
|
154
|
+
this.config = value;
|
155
|
+
}
|
156
|
+
|
157
|
+
setConfigModal(val: boolean): void {
|
158
|
+
this.configModal = val;
|
159
|
+
}
|
160
|
+
|
161
|
+
override getLabel(): string {
|
162
|
+
return SERIALIZATION_TYPE.PURE;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
export class GraphFetchExternalFormatSerializationState extends GraphFetchSerializationState {
|
167
|
+
targetBinding: Binding;
|
168
|
+
treeData: QueryBuilderGraphFetchTreeData | undefined;
|
169
|
+
|
170
|
+
constructor(
|
171
|
+
graphFetchTreeState: QueryBuilderGraphFetchTreeState,
|
172
|
+
targetBinding: Binding,
|
173
|
+
treeData: QueryBuilderGraphFetchTreeData | undefined,
|
174
|
+
) {
|
175
|
+
super(graphFetchTreeState);
|
176
|
+
makeObservable(this, {
|
177
|
+
targetBinding: observable,
|
178
|
+
treeData: observable.ref,
|
179
|
+
});
|
180
|
+
this.targetBinding = targetBinding;
|
181
|
+
this.treeData = treeData;
|
182
|
+
}
|
183
|
+
|
184
|
+
setBinding(value: Binding): void {
|
185
|
+
this.targetBinding = value;
|
186
|
+
}
|
187
|
+
|
188
|
+
setGraphFetchTree(val: QueryBuilderGraphFetchTreeData | undefined): void {
|
189
|
+
this.treeData = val;
|
190
|
+
}
|
191
|
+
|
192
|
+
override getLabel(): string {
|
193
|
+
return SERIALIZATION_TYPE.EXTERNAL_FORMAT;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
57
197
|
export class QueryBuilderGraphFetchTreeState
|
58
198
|
extends QueryBuilderFetchStructureImplementationState
|
59
199
|
implements Hashable
|
@@ -66,6 +206,11 @@ export class QueryBuilderGraphFetchTreeState
|
|
66
206
|
*/
|
67
207
|
isChecked = false;
|
68
208
|
|
209
|
+
/**
|
210
|
+
* Used to describe how the graph fetch tree is serialized to the final result set
|
211
|
+
*/
|
212
|
+
serializationState: GraphFetchSerializationState;
|
213
|
+
|
69
214
|
constructor(
|
70
215
|
queryBuilderState: QueryBuilderState,
|
71
216
|
fetchStructureState: QueryBuilderFetchStructureState,
|
@@ -75,13 +220,18 @@ export class QueryBuilderGraphFetchTreeState
|
|
75
220
|
makeObservable(this, {
|
76
221
|
treeData: observable.ref,
|
77
222
|
isChecked: observable,
|
223
|
+
serializationState: observable,
|
78
224
|
TEMPORARY__showPostFetchStructurePanel: computed,
|
79
225
|
setGraphFetchTree: action,
|
226
|
+
setSerializationState: action,
|
80
227
|
setChecked: action,
|
228
|
+
initialize: action,
|
81
229
|
});
|
82
230
|
|
83
231
|
// try to initialize the graph-fetch tree data using the setup class
|
84
232
|
this.updateTreeData(this.queryBuilderState.class);
|
233
|
+
// we will default to standard pure serialization with no config
|
234
|
+
this.serializationState = new GraphFetchPureSerializationState(this);
|
85
235
|
}
|
86
236
|
|
87
237
|
get type(): string {
|
@@ -143,6 +293,14 @@ export class QueryBuilderGraphFetchTreeState
|
|
143
293
|
return undefined;
|
144
294
|
}
|
145
295
|
|
296
|
+
override initialize(): void {
|
297
|
+
this.queryBuilderState.filterState.setShowPanel(true);
|
298
|
+
}
|
299
|
+
|
300
|
+
setSerializationState(val: GraphFetchSerializationState): void {
|
301
|
+
this.serializationState = val;
|
302
|
+
}
|
303
|
+
|
146
304
|
setGraphFetchTree(val: QueryBuilderGraphFetchTreeData | undefined): void {
|
147
305
|
this.treeData = val;
|
148
306
|
}
|