@finos/legend-query-builder 4.15.2 → 4.15.4

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 (108) hide show
  1. package/lib/__lib__/QueryBuilderTesting.d.ts +1 -0
  2. package/lib/__lib__/QueryBuilderTesting.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderTesting.js +2 -0
  4. package/lib/__lib__/QueryBuilderTesting.js.map +1 -1
  5. package/lib/components/data-cube/QueryBuilderDataCube.d.ts.map +1 -1
  6. package/lib/components/data-cube/QueryBuilderDataCube.js +6 -7
  7. package/lib/components/data-cube/QueryBuilderDataCube.js.map +1 -1
  8. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  9. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.js +38 -33
  10. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.js.map +1 -1
  11. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  12. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +12 -5
  13. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  14. package/lib/components/filter/QueryBuilderFilterPanel.js +2 -2
  15. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  16. package/lib/components/result/tds/QueryBuilderTDSGridResult.d.ts.map +1 -1
  17. package/lib/components/result/tds/QueryBuilderTDSGridResult.js +4 -3
  18. package/lib/components/result/tds/QueryBuilderTDSGridResult.js.map +1 -1
  19. package/lib/components/result/tds/QueryBuilderTDSResultShared.d.ts +2 -2
  20. package/lib/components/result/tds/QueryBuilderTDSResultShared.d.ts.map +1 -1
  21. package/lib/components/result/tds/QueryBuilderTDSResultShared.js +157 -19
  22. package/lib/components/result/tds/QueryBuilderTDSResultShared.js.map +1 -1
  23. package/lib/index.css +2 -2
  24. package/lib/index.css.map +1 -1
  25. package/lib/index.d.ts +1 -1
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js.map +1 -1
  28. package/lib/package.json +1 -1
  29. package/lib/stores/QueryBuilderState.d.ts +6 -1
  30. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  31. package/lib/stores/QueryBuilderState.js +3 -0
  32. package/lib/stores/QueryBuilderState.js.map +1 -1
  33. package/lib/stores/explorer/QueryFunctionsExplorerState.d.ts +17 -6
  34. package/lib/stores/explorer/QueryFunctionsExplorerState.d.ts.map +1 -1
  35. package/lib/stores/explorer/QueryFunctionsExplorerState.js +142 -59
  36. package/lib/stores/explorer/QueryFunctionsExplorerState.js.map +1 -1
  37. package/lib/stores/filter/QueryBuilderFilterOperator.d.ts +1 -1
  38. package/lib/stores/filter/QueryBuilderFilterOperator.d.ts.map +1 -1
  39. package/lib/stores/filter/QueryBuilderFilterState.d.ts +1 -1
  40. package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
  41. package/lib/stores/filter/QueryBuilderFilterState.js +8 -3
  42. package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
  43. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js +1 -1
  44. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js.map +1 -1
  45. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts +2 -2
  46. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts.map +1 -1
  47. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js +3 -3
  48. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js.map +1 -1
  49. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts +2 -2
  50. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts.map +1 -1
  51. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js +3 -3
  52. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js.map +1 -1
  53. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts +2 -2
  54. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  55. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js +2 -2
  56. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  57. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts +1 -1
  58. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  59. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js +2 -2
  60. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  61. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts +1 -1
  62. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  63. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js +2 -2
  64. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  65. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.d.ts +2 -2
  66. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.d.ts.map +1 -1
  67. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js +2 -2
  68. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js.map +1 -1
  69. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts +2 -2
  70. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts.map +1 -1
  71. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js +2 -2
  72. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js.map +1 -1
  73. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts +1 -1
  74. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  75. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js +2 -2
  76. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  77. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts +1 -1
  78. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  79. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js +2 -2
  80. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  81. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts +2 -2
  82. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts.map +1 -1
  83. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js +3 -3
  84. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js.map +1 -1
  85. package/package.json +6 -6
  86. package/src/__lib__/QueryBuilderTesting.ts +2 -0
  87. package/src/components/data-cube/QueryBuilderDataCube.tsx +15 -25
  88. package/src/components/explorer/QueryBuilderFunctionsExplorerPanel.tsx +63 -70
  89. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +23 -11
  90. package/src/components/filter/QueryBuilderFilterPanel.tsx +2 -2
  91. package/src/components/result/tds/QueryBuilderTDSGridResult.tsx +7 -3
  92. package/src/components/result/tds/QueryBuilderTDSResultShared.tsx +334 -26
  93. package/src/index.ts +1 -0
  94. package/src/stores/QueryBuilderState.ts +12 -0
  95. package/src/stores/explorer/QueryFunctionsExplorerState.ts +227 -94
  96. package/src/stores/filter/QueryBuilderFilterOperator.ts +1 -1
  97. package/src/stores/filter/QueryBuilderFilterState.ts +10 -5
  98. package/src/stores/filter/QueryBuilderFilterStateBuilder.ts +1 -1
  99. package/src/stores/filter/operators/QueryBuilderFilterOperator_Contain.ts +3 -5
  100. package/src/stores/filter/operators/QueryBuilderFilterOperator_EndWith.ts +3 -5
  101. package/src/stores/filter/operators/QueryBuilderFilterOperator_Equal.ts +2 -2
  102. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.ts +2 -4
  103. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.ts +2 -4
  104. package/src/stores/filter/operators/QueryBuilderFilterOperator_In.ts +2 -2
  105. package/src/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.ts +2 -2
  106. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThan.ts +2 -4
  107. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.ts +2 -4
  108. package/src/stores/filter/operators/QueryBuilderFilterOperator_StartWith.ts +3 -5
@@ -16,12 +16,16 @@
16
16
 
17
17
  import {
18
18
  type PackageableElement,
19
- ConcreteFunctionDefinition,
19
+ type FunctionAnalysisInfo,
20
+ type PureModel,
20
21
  Package,
21
22
  Unit,
22
23
  ROOT_PACKAGE_NAME,
24
+ buildFunctionAnalysisInfoFromConcreteFunctionDefinition,
25
+ getOrCreateGraphPackage,
23
26
  } from '@finos/legend-graph';
24
27
  import {
28
+ ActionState,
25
29
  addUniqueEntry,
26
30
  guaranteeNonNullable,
27
31
  isNonNullable,
@@ -47,16 +51,12 @@ export class QueryBuilderFunctionsExplorerTreeNodeData implements TreeNodeData {
47
51
  label: string;
48
52
  childrenIds: string[] = [];
49
53
  isOpen?: boolean | undefined;
50
- packageableElement: PackageableElement;
54
+ package?: PackageableElement;
55
+ functionAnalysisInfo?: FunctionAnalysisInfo | undefined;
51
56
 
52
- constructor(
53
- id: string,
54
- label: string,
55
- packageableElement: PackageableElement,
56
- ) {
57
+ constructor(id: string, label: string) {
57
58
  this.id = id;
58
59
  this.label = label;
59
- this.packageableElement = packageableElement;
60
60
  }
61
61
  }
62
62
 
@@ -73,29 +73,38 @@ const getValidDisplayablePackageSet = (
73
73
  }
74
74
  };
75
75
 
76
- export const generateFunctionsExplorerTreeNodeData = (
76
+ const generateFunctionsExplorerTreeNodeDataFromPackage = (
77
77
  queryBuilderState: QueryBuilderState,
78
- element: PackageableElement,
78
+ element: Package,
79
79
  rootPackageName: ROOT_PACKAGE_NAME,
80
80
  ): QueryBuilderFunctionsExplorerTreeNodeData => ({
81
81
  id: element.path,
82
82
  label: element.name,
83
- childrenIds:
84
- element instanceof Package
85
- ? element.children
86
- .filter((child) => !(child instanceof Unit))
87
- .filter(
88
- (child) =>
89
- (child instanceof Package &&
90
- getValidDisplayablePackageSet(
91
- queryBuilderState,
92
- rootPackageName,
93
- ).has(child)) ||
94
- child instanceof ConcreteFunctionDefinition,
95
- )
96
- .map((child) => child.path)
97
- : [],
98
- packageableElement: element,
83
+ childrenIds: element.children
84
+ .filter((child) => !(child instanceof Unit))
85
+ .filter(
86
+ (child) =>
87
+ child instanceof Package &&
88
+ getValidDisplayablePackageSet(queryBuilderState, rootPackageName).has(
89
+ child,
90
+ ),
91
+ )
92
+ .map((child) => child.path)
93
+ .concat(
94
+ queryBuilderState.functionsExplorerState.packagePathToFunctionInfoMap
95
+ ?.get(element.path)
96
+ ?.map((info) => info.functionPath) ?? [],
97
+ ),
98
+ package: element,
99
+ });
100
+
101
+ export const generateFunctionsExplorerTreeNodeDataFromFunctionAnalysisInfo = (
102
+ functionAnalysisInfo: FunctionAnalysisInfo,
103
+ ): QueryBuilderFunctionsExplorerTreeNodeData => ({
104
+ id: functionAnalysisInfo.functionPath,
105
+ label: functionAnalysisInfo.name,
106
+ childrenIds: [],
107
+ functionAnalysisInfo: functionAnalysisInfo,
99
108
  });
100
109
 
101
110
  const generateFunctionsExplorerTreeNodeChilrdren = (
@@ -104,34 +113,48 @@ const generateFunctionsExplorerTreeNodeChilrdren = (
104
113
  data: TreeData<QueryBuilderFunctionsExplorerTreeNodeData>,
105
114
  rootPackageName = ROOT_PACKAGE_NAME.MAIN,
106
115
  ): void => {
116
+ const functionInfoMap =
117
+ rootPackageName === ROOT_PACKAGE_NAME.MAIN
118
+ ? queryBuilderState.functionsExplorerState.functionInfoMap
119
+ : queryBuilderState.functionsExplorerState.dependencyFunctionInfoMap;
107
120
  const validDisplayablePackageSet = getValidDisplayablePackageSet(
108
121
  queryBuilderState,
109
122
  rootPackageName,
110
123
  );
111
- node.childrenIds = (node.packageableElement as Package).children
112
- .filter((child) => !(child instanceof Unit))
113
- .filter(
114
- (child) =>
115
- // avoid displaying empty packages
116
- (child instanceof Package && validDisplayablePackageSet.has(child)) ||
117
- child instanceof ConcreteFunctionDefinition,
118
- )
119
- .map((child) => child.path);
120
- (node.packageableElement as Package).children
121
- .filter((child) => !(child instanceof Unit))
124
+ const qualifiedExtraFunctionPaths =
125
+ queryBuilderState.functionsExplorerState.packagePathToFunctionInfoMap
126
+ ?.get(node.id)
127
+ ?.map((info) => info.functionPath);
128
+
129
+ const childrenPackages = (node.package as Package).children
122
130
  .filter(
123
131
  (child) =>
124
132
  // avoid displaying empty packages
125
- (child instanceof Package && validDisplayablePackageSet.has(child)) ||
126
- child instanceof ConcreteFunctionDefinition,
127
- )
128
- .map((child) =>
129
- generateFunctionsExplorerTreeNodeData(
130
- queryBuilderState,
131
- child,
132
- rootPackageName,
133
- ),
133
+ child instanceof Package && validDisplayablePackageSet.has(child),
134
134
  )
135
+ .map((child) => child as Package);
136
+
137
+ node.childrenIds = childrenPackages
138
+ .map((child) => child.path)
139
+ .concat(qualifiedExtraFunctionPaths ?? []);
140
+
141
+ const childNodesFromPackage = childrenPackages.map((child) =>
142
+ generateFunctionsExplorerTreeNodeDataFromPackage(
143
+ queryBuilderState,
144
+ child,
145
+ rootPackageName,
146
+ ),
147
+ );
148
+
149
+ const childNodesFromFunction = qualifiedExtraFunctionPaths
150
+ ?.map((path) => functionInfoMap?.get(path))
151
+ .filter(isNonNullable)
152
+ .map((info) =>
153
+ generateFunctionsExplorerTreeNodeDataFromFunctionAnalysisInfo(info),
154
+ );
155
+
156
+ childNodesFromPackage
157
+ .concat(childNodesFromFunction ?? [])
135
158
  .forEach((childNode) => {
136
159
  const currentNode = data.nodes.get(childNode.id);
137
160
  if (currentNode) {
@@ -157,14 +180,20 @@ export const getFunctionsExplorerTreeData = (
157
180
  switch (rootPackageName) {
158
181
  case ROOT_PACKAGE_NAME.PROJECT_DEPENDENCY_ROOT:
159
182
  if (
160
- queryBuilderState.graphManagerState.graph.dependencyManager.functions
161
- .length === 0
183
+ !queryBuilderState.functionsExplorerState.dependencyFunctionInfoMap ||
184
+ Array.from(
185
+ queryBuilderState.functionsExplorerState.dependencyFunctionInfoMap,
186
+ ).length === 0
162
187
  ) {
163
188
  return { rootIds, nodes };
164
189
  }
165
190
  break;
166
191
  default:
167
- if (queryBuilderState.graphManagerState.graph.ownFunctions.length === 0) {
192
+ if (
193
+ !queryBuilderState.functionsExplorerState.functionInfoMap ||
194
+ Array.from(queryBuilderState.functionsExplorerState.functionInfoMap)
195
+ .length === 0
196
+ ) {
168
197
  return { rootIds, nodes };
169
198
  }
170
199
  }
@@ -172,22 +201,19 @@ export const getFunctionsExplorerTreeData = (
172
201
  roots.forEach((root) => {
173
202
  root.children
174
203
  .slice()
175
- .filter((child) => !(child instanceof Unit))
176
204
  .filter(
177
205
  (child) =>
178
206
  child instanceof Package && validDisplayablePackageSet.has(child),
179
207
  )
208
+ .map((child) => child as Package)
180
209
  .sort((a, b) => a.name.localeCompare(b.name))
181
- .sort(
182
- (a, b) =>
183
- (b instanceof Package ? 1 : 0) - (a instanceof Package ? 1 : 0),
184
- )
185
210
  .forEach((childPackage) => {
186
- const childTreeNodeData = generateFunctionsExplorerTreeNodeData(
187
- queryBuilderState,
188
- childPackage,
189
- rootPackageName,
190
- );
211
+ const childTreeNodeData =
212
+ generateFunctionsExplorerTreeNodeDataFromPackage(
213
+ queryBuilderState,
214
+ childPackage,
215
+ rootPackageName,
216
+ );
191
217
  addUniqueEntry(rootIds, childTreeNodeData.id);
192
218
  nodes.set(childTreeNodeData.id, childTreeNodeData);
193
219
  });
@@ -211,16 +237,14 @@ export const getFunctionsExplorerTreeNodeChildren = (
211
237
  .map((id) => data.nodes.get(id))
212
238
  .filter(isNonNullable)
213
239
  .sort(compareLabelFn)
214
- .sort(
215
- (a, b) =>
216
- (b.packageableElement instanceof Package ? 1 : 0) -
217
- (a.packageableElement instanceof Package ? 1 : 0),
218
- );
240
+ .sort((a, b) => (b.package ? 1 : 0) - (a.package ? 1 : 0));
219
241
  };
220
242
 
221
243
  const getAllPackagesFromElement = (element: PackageableElement): Package[] => {
222
244
  if (element.package) {
223
- return [element.package].concat(getAllPackagesFromElement(element.package));
245
+ return (element instanceof Package ? [element] : []).concat(
246
+ [element.package].concat(getAllPackagesFromElement(element.package)),
247
+ );
224
248
  }
225
249
  return [];
226
250
  };
@@ -228,30 +252,36 @@ const getAllPackagesFromElement = (element: PackageableElement): Package[] => {
228
252
  export class QueryFunctionExplorerState {
229
253
  readonly uuid = uuid();
230
254
  queryFunctionsState: QueryFunctionsExplorerState;
231
- concreteFunctionDefinition: ConcreteFunctionDefinition;
255
+ functionAnalysisInfo: FunctionAnalysisInfo;
232
256
 
233
257
  constructor(
234
258
  queryFunctionsState: QueryFunctionsExplorerState,
235
- concreteFunctionDefinition: ConcreteFunctionDefinition,
259
+ functionAnalysisInfo: FunctionAnalysisInfo,
236
260
  ) {
237
261
  makeObservable(this, {
238
- concreteFunctionDefinition: observable,
262
+ functionAnalysisInfo: observable,
239
263
  });
240
264
  this.queryFunctionsState = queryFunctionsState;
241
- this.concreteFunctionDefinition = concreteFunctionDefinition;
265
+ this.functionAnalysisInfo = functionAnalysisInfo;
242
266
  }
243
267
  }
244
268
 
245
269
  export class QueryFunctionsExplorerState {
270
+ readonly initState = ActionState.create();
271
+
246
272
  queryBuilderState: QueryBuilderState;
247
273
  treeData?: TreeData<QueryBuilderFunctionsExplorerTreeNodeData> | undefined;
248
274
  dependencyTreeData?:
249
275
  | TreeData<QueryBuilderFunctionsExplorerTreeNodeData>
250
276
  | undefined;
277
+ _functionGraph: PureModel;
251
278
  functionExplorerStates: QueryFunctionExplorerState[] = [];
252
279
  dependencyFunctionExplorerStates: QueryFunctionExplorerState[] = [];
253
280
  displayablePackagesSet: Set<Package> = new Set<Package>();
254
281
  dependencyDisplayablePackagesSet: Set<Package> = new Set<Package>();
282
+ functionInfoMap?: Map<string, FunctionAnalysisInfo>;
283
+ dependencyFunctionInfoMap?: Map<string, FunctionAnalysisInfo>;
284
+ packagePathToFunctionInfoMap?: Map<string, FunctionAnalysisInfo[]>;
255
285
 
256
286
  constructor(queryBuilderState: QueryBuilderState) {
257
287
  makeObservable(this, {
@@ -259,13 +289,22 @@ export class QueryFunctionsExplorerState {
259
289
  dependencyFunctionExplorerStates: observable.ref,
260
290
  treeData: observable.ref,
261
291
  dependencyTreeData: observable.ref,
292
+ _functionGraph: observable,
293
+ functionInfoMap: observable,
294
+ dependencyFunctionInfoMap: observable,
295
+ packagePathToFunctionInfoMap: observable,
296
+ setFunctionInfoMap: action,
297
+ setDependencyFunctionInfoMap: action,
262
298
  setTreeData: action,
299
+ setPackagePathToFunctionInfoMap: action,
263
300
  setDependencyTreeData: action,
264
301
  refreshTree: action,
265
302
  onTreeNodeSelect: action,
303
+ initializeTreeData: action,
266
304
  });
267
305
  this.queryBuilderState = queryBuilderState;
268
- this.initializeTreeData();
306
+ this._functionGraph =
307
+ this.queryBuilderState.graphManagerState.createNewGraph();
269
308
  }
270
309
 
271
310
  getTreeData(
@@ -279,18 +318,48 @@ export class QueryFunctionsExplorerState {
279
318
  }
280
319
  }
281
320
 
321
+ setFunctionInfoMap(info: Map<string, FunctionAnalysisInfo>) {
322
+ this.functionInfoMap = info;
323
+ }
324
+
325
+ setDependencyFunctionInfoMap(info: Map<string, FunctionAnalysisInfo>) {
326
+ this.dependencyFunctionInfoMap = info;
327
+ }
328
+
329
+ setPackagePathToFunctionInfoMap(map: Map<string, FunctionAnalysisInfo[]>) {
330
+ this.packagePathToFunctionInfoMap = map;
331
+ }
332
+
282
333
  async initializeDisplayablePackagesSet(): Promise<void> {
283
- this.queryBuilderState.graphManagerState.graph.ownFunctions
284
- .map((f) => getAllPackagesFromElement(f))
285
- .flat()
286
- .forEach((pkg) => this.displayablePackagesSet.add(pkg));
334
+ if (this.functionInfoMap) {
335
+ Array.from(this.functionInfoMap.values())
336
+ .map((info) =>
337
+ getOrCreateGraphPackage(
338
+ this._functionGraph,
339
+ info.packagePath,
340
+ undefined,
341
+ ),
342
+ )
343
+ .map((f) => getAllPackagesFromElement(f))
344
+ .flat()
345
+ .forEach((pkg) => this.displayablePackagesSet.add(pkg));
346
+ }
287
347
  }
288
348
 
289
349
  async initializeDependencyDisplayablePackagesSet(): Promise<void> {
290
- this.queryBuilderState.graphManagerState.graph.dependencyManager.functions
291
- .map((f) => getAllPackagesFromElement(f))
292
- .flat()
293
- .forEach((pkg) => this.dependencyDisplayablePackagesSet.add(pkg));
350
+ if (this.dependencyFunctionInfoMap) {
351
+ Array.from(this.dependencyFunctionInfoMap.values())
352
+ .map((info) =>
353
+ getOrCreateGraphPackage(
354
+ this._functionGraph,
355
+ info.packagePath,
356
+ undefined,
357
+ ),
358
+ )
359
+ .map((f) => getAllPackagesFromElement(f))
360
+ .flat()
361
+ .forEach((pkg) => this.dependencyDisplayablePackagesSet.add(pkg));
362
+ }
294
363
  }
295
364
 
296
365
  setTreeData(
@@ -327,7 +396,7 @@ export class QueryFunctionsExplorerState {
327
396
  data: TreeData<QueryBuilderFunctionsExplorerTreeNodeData>,
328
397
  rootPackageName = ROOT_PACKAGE_NAME.MAIN,
329
398
  ): void => {
330
- if (node.packageableElement instanceof Package) {
399
+ if (node.package) {
331
400
  if (node.childrenIds.length) {
332
401
  node.isOpen = !node.isOpen;
333
402
  generateFunctionsExplorerTreeNodeChilrdren(
@@ -347,41 +416,105 @@ export class QueryFunctionsExplorerState {
347
416
  }
348
417
  };
349
418
 
419
+ initializeFunctionInfoMap(): void {
420
+ const functionInfoMap = new Map<string, FunctionAnalysisInfo>();
421
+ const dependencyFunctionInfoMap = new Map<string, FunctionAnalysisInfo>();
422
+ const functionInfos =
423
+ buildFunctionAnalysisInfoFromConcreteFunctionDefinition(
424
+ this.queryBuilderState.graphManagerState.graph.ownFunctions,
425
+ this._functionGraph,
426
+ );
427
+ functionInfos.forEach((info) =>
428
+ functionInfoMap.set(info.functionPath, info),
429
+ );
430
+ if (
431
+ this.queryBuilderState.graphManagerState.graph.dependencyManager
432
+ .hasDependencies
433
+ ) {
434
+ const dependencyFunctions =
435
+ this.queryBuilderState.graphManagerState.graph.dependencyManager
436
+ .functions;
437
+ const dependencyFunctionInfos =
438
+ buildFunctionAnalysisInfoFromConcreteFunctionDefinition(
439
+ dependencyFunctions,
440
+ this._functionGraph,
441
+ );
442
+ dependencyFunctionInfos.forEach((info) =>
443
+ dependencyFunctionInfoMap.set(info.functionPath, info),
444
+ );
445
+ }
446
+ const queryBuilderFunctionAnalysisInfo =
447
+ this.queryBuilderState.buildFunctionAnalysisInfo();
448
+ if (queryBuilderFunctionAnalysisInfo) {
449
+ Array.from(
450
+ queryBuilderFunctionAnalysisInfo.functionInfoMap.entries(),
451
+ ).forEach(([path, info]) => functionInfoMap.set(path, info));
452
+ Array.from(
453
+ queryBuilderFunctionAnalysisInfo.dependencyFunctionInfoMap.entries(),
454
+ ).forEach(([path, info]) => {
455
+ dependencyFunctionInfoMap.set(path, info);
456
+ });
457
+ }
458
+ const packagePathToFunctionInfoMap = new Map<
459
+ string,
460
+ FunctionAnalysisInfo[]
461
+ >();
462
+ Array.from(functionInfoMap.values())
463
+ .concat(Array.from(dependencyFunctionInfoMap.values()))
464
+ .forEach((info) => {
465
+ const curr = packagePathToFunctionInfoMap.get(info.packagePath);
466
+ if (curr) {
467
+ packagePathToFunctionInfoMap.set(info.packagePath, [...curr, info]);
468
+ } else {
469
+ packagePathToFunctionInfoMap.set(info.packagePath, [info]);
470
+ }
471
+ });
472
+ this.setPackagePathToFunctionInfoMap(packagePathToFunctionInfoMap);
473
+ this.setFunctionInfoMap(functionInfoMap);
474
+ this.setDependencyFunctionInfoMap(dependencyFunctionInfoMap);
475
+ }
476
+
350
477
  initializeTreeData(): void {
478
+ if (!this.initState.isInInitialState) {
479
+ return;
480
+ }
481
+
482
+ this.initState.inProgress();
483
+ this.initializeFunctionInfoMap();
351
484
  this.initializeDisplayablePackagesSet()
352
485
  .catch(noop())
353
486
  .finally(() => {
354
487
  this.setTreeData(
355
488
  getFunctionsExplorerTreeData(
356
- [this.queryBuilderState.graphManagerState.graph.root],
489
+ [this._functionGraph.root],
357
490
  this.queryBuilderState,
491
+ ROOT_PACKAGE_NAME.MAIN,
358
492
  ),
359
493
  );
360
- this.functionExplorerStates =
361
- this.queryBuilderState.graphManagerState.graph.ownFunctions.map(
362
- (f) => new QueryFunctionExplorerState(this, f),
363
- );
494
+ this.functionExplorerStates = this.functionInfoMap
495
+ ? Array.from(this.functionInfoMap.values()).map(
496
+ (info) => new QueryFunctionExplorerState(this, info),
497
+ )
498
+ : [];
364
499
  });
365
- if (
366
- this.queryBuilderState.graphManagerState.graph.dependencyManager
367
- .hasDependencies
368
- ) {
500
+ if (this.dependencyFunctionInfoMap) {
369
501
  this.initializeDependencyDisplayablePackagesSet()
370
502
  .catch(noop())
371
503
  .finally(() => {
372
504
  this.setDependencyTreeData(
373
505
  getFunctionsExplorerTreeData(
374
- this.queryBuilderState.graphManagerState.graph.dependencyManager
375
- .roots,
506
+ [this._functionGraph.root],
376
507
  this.queryBuilderState,
377
508
  ROOT_PACKAGE_NAME.PROJECT_DEPENDENCY_ROOT,
378
509
  ),
379
510
  );
380
- this.dependencyFunctionExplorerStates =
381
- this.queryBuilderState.graphManagerState.graph.dependencyManager.functions.map(
382
- (f) => new QueryFunctionExplorerState(this, f),
383
- );
511
+ this.dependencyFunctionExplorerStates = this.dependencyFunctionInfoMap
512
+ ? Array.from(this.dependencyFunctionInfoMap.values()).map(
513
+ (info) => new QueryFunctionExplorerState(this, info),
514
+ )
515
+ : [];
384
516
  });
385
517
  }
518
+ this.initState.pass();
386
519
  }
387
520
  }
@@ -27,7 +27,7 @@ import type {
27
27
  export abstract class QueryBuilderFilterOperator implements Hashable {
28
28
  readonly uuid = uuid();
29
29
 
30
- abstract getLabel(filterConditionState: FilterConditionState): string;
30
+ abstract getLabel(): string;
31
31
 
32
32
  abstract isCompatibleWithFilterConditionProperty(
33
33
  filterConditionState: FilterConditionState,
@@ -246,6 +246,7 @@ export class FilterConditionState implements Hashable {
246
246
  constructor(
247
247
  filterState: QueryBuilderFilterState,
248
248
  propertyExpression: AbstractPropertyExpression,
249
+ operator?: QueryBuilderFilterOperator,
249
250
  ) {
250
251
  makeObservable(this, {
251
252
  propertyExpressionState: observable,
@@ -271,11 +272,15 @@ export class FilterConditionState implements Hashable {
271
272
  );
272
273
 
273
274
  // operator
274
- assertTrue(
275
- this.operators.length !== 0,
276
- `Can't find an operator for property '${this.propertyExpressionState.path}': no operators registered`,
277
- );
278
- this.operator = this.operators[0] as QueryBuilderFilterOperator;
275
+ if (operator) {
276
+ this.operator = operator;
277
+ } else {
278
+ assertTrue(
279
+ this.operators.length !== 0,
280
+ `Can't find an operator for property '${this.propertyExpressionState.path}': no operators registered`,
281
+ );
282
+ this.operator = this.operators[0] as QueryBuilderFilterOperator;
283
+ }
279
284
  this.buildRightConditionValueFromValueSpec(
280
285
  this.operator.getDefaultFilterConditionValue(this),
281
286
  );
@@ -332,7 +332,7 @@ const processFilterTree = (
332
332
  assertTrue(
333
333
  parentLambdaVariableName === variableName,
334
334
  `Can't process ${extractElementNameFromPath(
335
- filterConditionState.operator.getLabel(filterConditionState),
335
+ filterConditionState.operator.getLabel(),
336
336
  )}() expression: expects variable used in lambda body '${variableName}' to match lambda parameter '${parentLambdaVariableName}'`,
337
337
  );
338
338
  filterState.addNodeFromNode(
@@ -46,7 +46,7 @@ export class QueryBuilderFilterOperator_Contain
46
46
  extends QueryBuilderFilterOperator
47
47
  implements Hashable
48
48
  {
49
- getLabel(filterConditionState: FilterConditionState): string {
49
+ getLabel(): string {
50
50
  return 'contains';
51
51
  }
52
52
 
@@ -90,9 +90,7 @@ export class QueryBuilderFilterOperator_Contain
90
90
  }
91
91
  default:
92
92
  throw new UnsupportedOperationError(
93
- `Can't get default value for filter operator '${this.getLabel(
94
- filterConditionState,
95
- )}' when the LHS property is of type '${propertyType.path}'`,
93
+ `Can't get default value for filter operator '${this.getLabel()}' when the LHS property is of type '${propertyType.path}'`,
96
94
  );
97
95
  }
98
96
  }
@@ -128,7 +126,7 @@ export class QueryBuilderFilterOperator_Contain
128
126
  }
129
127
 
130
128
  export class QueryBuilderFilterOperator_NotContain extends QueryBuilderFilterOperator_Contain {
131
- override getLabel(filterConditionState: FilterConditionState): string {
129
+ override getLabel(): string {
132
130
  return `doesn't contain`;
133
131
  }
134
132
 
@@ -46,7 +46,7 @@ export class QueryBuilderFilterOperator_EndWith
46
46
  extends QueryBuilderFilterOperator
47
47
  implements Hashable
48
48
  {
49
- getLabel(filterConditionState: FilterConditionState): string {
49
+ getLabel(): string {
50
50
  return 'ends with';
51
51
  }
52
52
 
@@ -90,9 +90,7 @@ export class QueryBuilderFilterOperator_EndWith
90
90
  }
91
91
  default:
92
92
  throw new UnsupportedOperationError(
93
- `Can't get default value for filter operator '${this.getLabel(
94
- filterConditionState,
95
- )}' when the LHS property is of type '${propertyType.path}'`,
93
+ `Can't get default value for filter operator '${this.getLabel()}' when the LHS property is of type '${propertyType.path}'`,
96
94
  );
97
95
  }
98
96
  }
@@ -128,7 +126,7 @@ export class QueryBuilderFilterOperator_EndWith
128
126
  }
129
127
 
130
128
  export class QueryBuilderFilterOperator_NotEndWith extends QueryBuilderFilterOperator_EndWith {
131
- override getLabel(filterConditionState: FilterConditionState): string {
129
+ override getLabel(): string {
132
130
  return `doesn't end with`;
133
131
  }
134
132
 
@@ -44,7 +44,7 @@ export class QueryBuilderFilterOperator_Equal
44
44
  extends QueryBuilderFilterOperator
45
45
  implements Hashable
46
46
  {
47
- getLabel(filterConditionState: FilterConditionState): string {
47
+ getLabel(): string {
48
48
  return 'is';
49
49
  }
50
50
 
@@ -143,7 +143,7 @@ export class QueryBuilderFilterOperator_Equal
143
143
  }
144
144
 
145
145
  export class QueryBuilderFilterOperator_NotEqual extends QueryBuilderFilterOperator_Equal {
146
- override getLabel(filterConditionState: FilterConditionState): string {
146
+ override getLabel(): string {
147
147
  return `is not`;
148
148
  }
149
149
 
@@ -43,7 +43,7 @@ export class QueryBuilderFilterOperator_GreaterThan
43
43
  extends QueryBuilderFilterOperator
44
44
  implements Hashable
45
45
  {
46
- getLabel(filterConditionState: FilterConditionState): string {
46
+ getLabel(): string {
47
47
  return '>';
48
48
  }
49
49
 
@@ -104,9 +104,7 @@ export class QueryBuilderFilterOperator_GreaterThan
104
104
  }
105
105
  default:
106
106
  throw new UnsupportedOperationError(
107
- `Can't get default value for filter operator '${this.getLabel(
108
- filterConditionState,
109
- )}' when the LHS property is of type '${propertyType.path}'`,
107
+ `Can't get default value for filter operator '${this.getLabel()}' when the LHS property is of type '${propertyType.path}'`,
110
108
  );
111
109
  }
112
110
  }
@@ -43,7 +43,7 @@ export class QueryBuilderFilterOperator_GreaterThanEqual
43
43
  extends QueryBuilderFilterOperator
44
44
  implements Hashable
45
45
  {
46
- getLabel(filterConditionState: FilterConditionState): string {
46
+ getLabel(): string {
47
47
  return '>=';
48
48
  }
49
49
 
@@ -104,9 +104,7 @@ export class QueryBuilderFilterOperator_GreaterThanEqual
104
104
  }
105
105
  default:
106
106
  throw new UnsupportedOperationError(
107
- `Can't get default value for filter operator '${this.getLabel(
108
- filterConditionState,
109
- )}' when the LHS property is of type '${propertyType.path}'`,
107
+ `Can't get default value for filter operator '${this.getLabel()}' when the LHS property is of type '${propertyType.path}'`,
110
108
  );
111
109
  }
112
110
  }
@@ -48,7 +48,7 @@ export class QueryBuilderFilterOperator_In
48
48
  extends QueryBuilderFilterOperator
49
49
  implements Hashable
50
50
  {
51
- getLabel(filterConditionState: FilterConditionState): string {
51
+ getLabel(): string {
52
52
  return 'is in list of';
53
53
  }
54
54
 
@@ -176,7 +176,7 @@ export class QueryBuilderFilterOperator_In
176
176
  }
177
177
 
178
178
  export class QueryBuilderFilterOperator_NotIn extends QueryBuilderFilterOperator_In {
179
- override getLabel(filterConditionState: FilterConditionState): string {
179
+ override getLabel(): string {
180
180
  return `is not in list of`;
181
181
  }
182
182