@finos/legend-application-query 5.2.3 → 5.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/QueryBuilderResultPanel.js +2 -2
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts +3 -0
- package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js +19 -1
- package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/package.json +10 -10
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +4 -0
- package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js +21 -5
- package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.d.ts.map +1 -1
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js +9 -4
- package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js.map +1 -1
- package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.d.ts +2 -1
- package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.js +41 -3
- package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.js.map +1 -1
- package/package.json +17 -17
- package/src/components/explorer/QueryBuilderExplorerPanel.tsx +55 -0
- package/src/stores/explorer/QueryBuilderExplorerState.ts +34 -8
- package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.ts +19 -9
- package/src/stores/fetch-structure/projection/QueryBuilderProjectionState.ts +75 -1
@@ -85,6 +85,19 @@ export enum QUERY_BUILDER_EXPLORER_TREE_DND_TYPE {
|
|
85
85
|
PRIMITIVE_PROPERTY = 'PRIMITIVE_PROPERTY',
|
86
86
|
}
|
87
87
|
|
88
|
+
export const getPropertyNodeId = (
|
89
|
+
parentId: string,
|
90
|
+
propertyName: string,
|
91
|
+
): string => (parentId ? `${parentId}.${propertyName}` : propertyName);
|
92
|
+
|
93
|
+
export const getPropertyNodeIdForSubType = (
|
94
|
+
parentId: string,
|
95
|
+
subClassPath: string,
|
96
|
+
): string =>
|
97
|
+
parentId
|
98
|
+
? `${parentId}${TYPE_CAST_TOKEN}${subClassPath}`
|
99
|
+
: `${TYPE_CAST_TOKEN}${subClassPath}`;
|
100
|
+
|
88
101
|
export interface QueryBuilderExplorerTreeDragSource {
|
89
102
|
node: QueryBuilderExplorerTreePropertyNodeData;
|
90
103
|
}
|
@@ -319,6 +332,11 @@ const generateSubtypeNodeMappingData = (
|
|
319
332
|
(mappedProperty[0] as EntityMappedProperty).entityPath,
|
320
333
|
),
|
321
334
|
};
|
335
|
+
} else if (parentMappingData.mappedEntity.path === subclass.path) {
|
336
|
+
return {
|
337
|
+
mapped: true,
|
338
|
+
mappedEntity: parentMappingData.mappedEntity,
|
339
|
+
};
|
322
340
|
}
|
323
341
|
}
|
324
342
|
return { mapped: false };
|
@@ -380,11 +398,12 @@ export const getQueryBuilderPropertyNodeData = (
|
|
380
398
|
return undefined;
|
381
399
|
}
|
382
400
|
const propertyNode = new QueryBuilderExplorerTreePropertyNodeData(
|
383
|
-
|
401
|
+
getPropertyNodeId(
|
384
402
|
parentNode instanceof QueryBuilderExplorerTreeRootNodeData
|
385
403
|
? ''
|
386
|
-
:
|
387
|
-
|
404
|
+
: parentNode.id,
|
405
|
+
property.name,
|
406
|
+
),
|
388
407
|
property.name,
|
389
408
|
`${
|
390
409
|
parentNode instanceof QueryBuilderExplorerTreeRootNodeData
|
@@ -409,11 +428,12 @@ export const getQueryBuilderSubTypeNodeData = (
|
|
409
428
|
modelCoverageAnalysisResult: MappingModelCoverageAnalysisResult,
|
410
429
|
): QueryBuilderExplorerTreeSubTypeNodeData => {
|
411
430
|
const subTypeNode = new QueryBuilderExplorerTreeSubTypeNodeData(
|
412
|
-
|
431
|
+
getPropertyNodeIdForSubType(
|
413
432
|
parentNode instanceof QueryBuilderExplorerTreeRootNodeData
|
414
|
-
?
|
415
|
-
:
|
416
|
-
|
433
|
+
? ''
|
434
|
+
: parentNode.id,
|
435
|
+
subclass.path,
|
436
|
+
),
|
417
437
|
subclass.name,
|
418
438
|
`${
|
419
439
|
parentNode instanceof QueryBuilderExplorerTreeRootNodeData
|
@@ -459,7 +479,6 @@ const getQueryBuilderTreeData = (
|
|
459
479
|
'@dummy_rootNode',
|
460
480
|
rootClass.name,
|
461
481
|
rootClass.path,
|
462
|
-
|
463
482
|
false,
|
464
483
|
rootClass,
|
465
484
|
mappingData,
|
@@ -531,6 +550,7 @@ export class QueryBuilderExplorerState {
|
|
531
550
|
treeData?: TreeData<QueryBuilderExplorerTreeNodeData> | undefined;
|
532
551
|
humanizePropertyName = true;
|
533
552
|
showUnmappedProperties = false;
|
553
|
+
highlightUsedProperties = true;
|
534
554
|
propertySearchPanelState: QueryBuilderPropertySearchPanelState;
|
535
555
|
mappingModelCoverageAnalysisResult?: MappingModelCoverageAnalysisResult;
|
536
556
|
mappingModelCoverageAnalysisState = ActionState.create();
|
@@ -540,12 +560,14 @@ export class QueryBuilderExplorerState {
|
|
540
560
|
queryBuilderState: false,
|
541
561
|
previewDataState: false,
|
542
562
|
treeData: observable.ref,
|
563
|
+
highlightUsedProperties: observable,
|
543
564
|
setTreeData: action,
|
544
565
|
refreshTree: action,
|
545
566
|
refreshTreeData: action,
|
546
567
|
setHumanizePropertyName: action,
|
547
568
|
setShowUnmappedProperties: action,
|
548
569
|
previewData: flow,
|
570
|
+
setHighlightUsedProperties: action,
|
549
571
|
analyzeMappingModelCoverage: flow,
|
550
572
|
});
|
551
573
|
|
@@ -582,6 +604,10 @@ export class QueryBuilderExplorerState {
|
|
582
604
|
this.showUnmappedProperties = val;
|
583
605
|
}
|
584
606
|
|
607
|
+
setHighlightUsedProperties(val: boolean): void {
|
608
|
+
this.highlightUsedProperties = val;
|
609
|
+
}
|
610
|
+
|
585
611
|
refreshTreeData(): void {
|
586
612
|
const _class = this.queryBuilderState.querySetupState._class;
|
587
613
|
const _mapping = this.queryBuilderState.querySetupState.mapping;
|
@@ -25,6 +25,7 @@ import {
|
|
25
25
|
Class,
|
26
26
|
PropertyGraphFetchTree,
|
27
27
|
PackageableElementExplicitReference,
|
28
|
+
TYPE_CAST_TOKEN,
|
28
29
|
} from '@finos/legend-graph';
|
29
30
|
import {
|
30
31
|
type QueryBuilderExplorerTreeNodeData,
|
@@ -72,11 +73,16 @@ export interface QueryBuilderGraphFetchTreeData
|
|
72
73
|
|
73
74
|
const generateNodeId = (
|
74
75
|
property: AbstractProperty,
|
75
|
-
|
76
|
+
parentNodeId: string | undefined,
|
77
|
+
): string => `${parentNodeId ? `${parentNodeId}.` : ''}${property.name}`;
|
78
|
+
|
79
|
+
const generateNodeIdForSubType = (
|
80
|
+
property: AbstractProperty,
|
81
|
+
subType: Type,
|
76
82
|
parentNodeId: string | undefined,
|
77
83
|
): string =>
|
78
|
-
`${parentNodeId ? `${parentNodeId}.` : ''}${property.name}${
|
79
|
-
subType
|
84
|
+
`${parentNodeId ? `${parentNodeId}.` : ''}${property.name}${TYPE_CAST_TOKEN}${
|
85
|
+
subType.path
|
80
86
|
}`;
|
81
87
|
|
82
88
|
const buildGraphFetchSubTree = (
|
@@ -93,7 +99,9 @@ const buildGraphFetchSubTree = (
|
|
93
99
|
const subType = tree.subType?.value;
|
94
100
|
const parentNodeId = parentNode?.id;
|
95
101
|
const node = new QueryBuilderGraphFetchTreeNodeData(
|
96
|
-
|
102
|
+
subType
|
103
|
+
? generateNodeIdForSubType(property, subType, parentNodeId)
|
104
|
+
: generateNodeId(property, parentNodeId),
|
97
105
|
property.name,
|
98
106
|
parentNodeId,
|
99
107
|
tree,
|
@@ -248,11 +256,13 @@ export const addQueryBuilderPropertyNode = (
|
|
248
256
|
let parentNode: QueryBuilderGraphFetchTreeNodeData | undefined = undefined;
|
249
257
|
let newSubTree: PropertyGraphFetchTree | undefined;
|
250
258
|
for (const propertyGraphFetchTree of propertyGraphFetchTrees) {
|
251
|
-
currentNodeId =
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
259
|
+
currentNodeId = propertyGraphFetchTree.subType?.value
|
260
|
+
? generateNodeIdForSubType(
|
261
|
+
propertyGraphFetchTree.property.value,
|
262
|
+
propertyGraphFetchTree.subType.value,
|
263
|
+
currentNodeId,
|
264
|
+
)
|
265
|
+
: generateNodeId(propertyGraphFetchTree.property.value, currentNodeId);
|
256
266
|
const existingGraphFetchNode = treeData.nodes.get(currentNodeId);
|
257
267
|
if (existingGraphFetchNode) {
|
258
268
|
parentNode = existingGraphFetchNode;
|
@@ -42,10 +42,15 @@ import {
|
|
42
42
|
LAMBDA_PIPE,
|
43
43
|
RawLambda,
|
44
44
|
isStubbed_RawLambda,
|
45
|
+
AbstractPropertyExpression,
|
46
|
+
matchFunctionName,
|
47
|
+
SimpleFunctionExpression,
|
48
|
+
type ValueSpecification,
|
45
49
|
} from '@finos/legend-graph';
|
46
50
|
import {
|
47
51
|
DEFAULT_LAMBDA_VARIABLE_NAME,
|
48
52
|
QUERY_BUILDER_SOURCE_ID_LABEL,
|
53
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS,
|
49
54
|
} from '../../../QueryBuilder_Const.js';
|
50
55
|
import { QueryBuilderAggregationState } from './aggregation/QueryBuilderAggregationState.js';
|
51
56
|
import { buildGenericLambdaFunctionInstanceValue } from '../../QueryBuilderValueSpecificationHelper.js';
|
@@ -58,10 +63,14 @@ import type { QueryBuilderAggregateOperator } from './aggregation/QueryBuilderAg
|
|
58
63
|
import { getQueryBuilderCoreAggregrationOperators } from './aggregation/QueryBuilderAggregateOperatorLoader.js';
|
59
64
|
import {
|
60
65
|
QueryBuilderDerivationProjectionColumnState,
|
66
|
+
QueryBuilderSimpleProjectionColumnState,
|
61
67
|
type QueryBuilderProjectionColumnState,
|
62
|
-
type QueryBuilderSimpleProjectionColumnState,
|
63
68
|
} from './QueryBuilderProjectionColumnState.js';
|
64
69
|
import type { QueryBuilderFetchStructureState } from '../QueryBuilderFetchStructureState.js';
|
70
|
+
import {
|
71
|
+
getPropertyNodeId,
|
72
|
+
getPropertyNodeIdForSubType,
|
73
|
+
} from '../../explorer/QueryBuilderExplorerState.js';
|
65
74
|
|
66
75
|
export class QueryBuilderProjectionState extends QueryBuilderFetchStructureImplementationState {
|
67
76
|
columns: QueryBuilderProjectionColumnState[] = [];
|
@@ -387,4 +396,69 @@ export class QueryBuilderProjectionState extends QueryBuilderFetchStructureImple
|
|
387
396
|
),
|
388
397
|
);
|
389
398
|
}
|
399
|
+
|
400
|
+
get usedPropertyNodeIds(): string[] {
|
401
|
+
let usedNodeIds: string[] = [];
|
402
|
+
this.columns.forEach((column) => {
|
403
|
+
if (column instanceof QueryBuilderSimpleProjectionColumnState) {
|
404
|
+
let nodeIds: string[] = [];
|
405
|
+
const subClassNames = [];
|
406
|
+
let currentPropertyExpression: ValueSpecification =
|
407
|
+
column.propertyExpressionState.propertyExpression;
|
408
|
+
while (
|
409
|
+
currentPropertyExpression instanceof AbstractPropertyExpression
|
410
|
+
) {
|
411
|
+
nodeIds.push(currentPropertyExpression.func.name);
|
412
|
+
currentPropertyExpression = guaranteeNonNullable(
|
413
|
+
currentPropertyExpression.parametersValues[0],
|
414
|
+
);
|
415
|
+
if (
|
416
|
+
currentPropertyExpression instanceof SimpleFunctionExpression &&
|
417
|
+
matchFunctionName(
|
418
|
+
currentPropertyExpression.functionName,
|
419
|
+
QUERY_BUILDER_SUPPORTED_FUNCTIONS.SUBTYPE,
|
420
|
+
) &&
|
421
|
+
currentPropertyExpression.parametersValues.length >= 1 &&
|
422
|
+
currentPropertyExpression.parametersValues[1]?.genericType?.value
|
423
|
+
.rawType.path
|
424
|
+
) {
|
425
|
+
nodeIds.push(
|
426
|
+
currentPropertyExpression.parametersValues[1]?.genericType?.value
|
427
|
+
.rawType.path,
|
428
|
+
);
|
429
|
+
subClassNames.push(
|
430
|
+
currentPropertyExpression.parametersValues[1]?.genericType?.value
|
431
|
+
.rawType.path,
|
432
|
+
);
|
433
|
+
currentPropertyExpression = guaranteeNonNullable(
|
434
|
+
currentPropertyExpression.parametersValues[0],
|
435
|
+
);
|
436
|
+
}
|
437
|
+
}
|
438
|
+
nodeIds = nodeIds.reverse();
|
439
|
+
if (
|
440
|
+
nodeIds.length &&
|
441
|
+
subClassNames.includes(guaranteeNonNullable(nodeIds[0]))
|
442
|
+
) {
|
443
|
+
nodeIds[0] = getPropertyNodeIdForSubType(
|
444
|
+
'',
|
445
|
+
guaranteeNonNullable(nodeIds[0]),
|
446
|
+
);
|
447
|
+
}
|
448
|
+
for (let i = 1; i < nodeIds.length; i++) {
|
449
|
+
nodeIds[i] = subClassNames.includes(guaranteeNonNullable(nodeIds[i]))
|
450
|
+
? getPropertyNodeIdForSubType(
|
451
|
+
guaranteeNonNullable(nodeIds[i - 1]),
|
452
|
+
guaranteeNonNullable(nodeIds[i]),
|
453
|
+
)
|
454
|
+
: getPropertyNodeId(
|
455
|
+
guaranteeNonNullable(nodeIds[i - 1]),
|
456
|
+
guaranteeNonNullable(nodeIds[i]),
|
457
|
+
);
|
458
|
+
}
|
459
|
+
usedNodeIds = usedNodeIds.concat(nodeIds);
|
460
|
+
}
|
461
|
+
});
|
462
|
+
return usedNodeIds;
|
463
|
+
}
|
390
464
|
}
|