@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.
Files changed (25) hide show
  1. package/lib/components/QueryBuilderResultPanel.js +2 -2
  2. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  3. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts +3 -0
  4. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  5. package/lib/components/explorer/QueryBuilderExplorerPanel.js +19 -1
  6. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  7. package/lib/index.css +2 -2
  8. package/lib/index.css.map +1 -1
  9. package/lib/package.json +10 -10
  10. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts +4 -0
  11. package/lib/stores/explorer/QueryBuilderExplorerState.d.ts.map +1 -1
  12. package/lib/stores/explorer/QueryBuilderExplorerState.js +21 -5
  13. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  14. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.d.ts.map +1 -1
  15. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js +9 -4
  16. package/lib/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.js.map +1 -1
  17. package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.d.ts +2 -1
  18. package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.d.ts.map +1 -1
  19. package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.js +41 -3
  20. package/lib/stores/fetch-structure/projection/QueryBuilderProjectionState.js.map +1 -1
  21. package/package.json +17 -17
  22. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +55 -0
  23. package/src/stores/explorer/QueryBuilderExplorerState.ts +34 -8
  24. package/src/stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeUtil.ts +19 -9
  25. 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
- : `${parentNode.id}.`
387
- }${property.name}`,
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
- ? `${TYPE_CAST_TOKEN}${subclass.path}`
415
- : `${parentNode.id}${TYPE_CAST_TOKEN}${subclass.path}`
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
- subType: Type | undefined,
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 ? subType.path : ''
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
- generateNodeId(property, subType, parentNodeId),
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 = generateNodeId(
252
- propertyGraphFetchTree.property.value,
253
- propertyGraphFetchTree.subType?.value,
254
- currentNodeId,
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
  }