@itwin/presentation-hierarchies 2.0.0-alpha.5 → 2.0.0-alpha.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 (82) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts +77 -36
  3. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +1 -1
  4. package/lib/cjs/hierarchies/HierarchyFiltering.js +126 -98
  5. package/lib/cjs/hierarchies/HierarchyFiltering.js.map +1 -1
  6. package/lib/cjs/hierarchies/HierarchyMerge.d.ts +19 -0
  7. package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -0
  8. package/lib/cjs/hierarchies/HierarchyMerge.js +43 -0
  9. package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -0
  10. package/lib/cjs/hierarchies/HierarchyNode.d.ts +2 -2
  11. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
  12. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
  13. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  14. package/lib/cjs/hierarchies/HierarchyNodeKey.js +8 -8
  15. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
  16. package/lib/cjs/hierarchies/HierarchyProvider.d.ts +0 -18
  17. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
  18. package/lib/cjs/hierarchies/HierarchyProvider.js +0 -37
  19. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
  20. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +2 -0
  21. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +1 -1
  22. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js +45 -30
  23. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js.map +1 -1
  24. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts +42 -7
  25. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  26. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +136 -45
  27. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  28. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  29. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +8 -1
  30. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  31. package/lib/cjs/hierarchies/internal/Common.d.ts +3 -0
  32. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
  33. package/lib/cjs/hierarchies/internal/Common.js +12 -1
  34. package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
  35. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  36. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +2 -1
  37. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  38. package/lib/cjs/presentation-hierarchies.d.ts +3 -2
  39. package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
  40. package/lib/cjs/presentation-hierarchies.js +4 -3
  41. package/lib/cjs/presentation-hierarchies.js.map +1 -1
  42. package/lib/esm/hierarchies/HierarchyFiltering.d.ts +77 -36
  43. package/lib/esm/hierarchies/HierarchyFiltering.d.ts.map +1 -1
  44. package/lib/esm/hierarchies/HierarchyFiltering.js +125 -98
  45. package/lib/esm/hierarchies/HierarchyFiltering.js.map +1 -1
  46. package/lib/esm/hierarchies/HierarchyMerge.d.ts +19 -0
  47. package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -0
  48. package/lib/esm/hierarchies/HierarchyMerge.js +40 -0
  49. package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -0
  50. package/lib/esm/hierarchies/HierarchyNode.d.ts +2 -2
  51. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
  52. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
  53. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  54. package/lib/esm/hierarchies/HierarchyNodeKey.js +9 -9
  55. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
  56. package/lib/esm/hierarchies/HierarchyProvider.d.ts +0 -18
  57. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
  58. package/lib/esm/hierarchies/HierarchyProvider.js +1 -36
  59. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
  60. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +2 -0
  61. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +1 -1
  62. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js +47 -32
  63. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js.map +1 -1
  64. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts +42 -7
  65. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  66. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +138 -48
  67. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  68. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  69. package/lib/esm/hierarchies/imodel/TreeNodesReader.js +8 -1
  70. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  71. package/lib/esm/hierarchies/internal/Common.d.ts +3 -0
  72. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
  73. package/lib/esm/hierarchies/internal/Common.js +11 -1
  74. package/lib/esm/hierarchies/internal/Common.js.map +1 -1
  75. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  76. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +3 -2
  77. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  78. package/lib/esm/presentation-hierarchies.d.ts +3 -2
  79. package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
  80. package/lib/esm/presentation-hierarchies.js +2 -2
  81. package/lib/esm/presentation-hierarchies.js.map +1 -1
  82. package/package.json +7 -7
@@ -5,6 +5,7 @@
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.createIModelHierarchyProvider = createIModelHierarchyProvider;
8
+ exports.createMergedIModelHierarchyProvider = createMergedIModelHierarchyProvider;
8
9
  require("../internal/DisposePolyfill.js");
9
10
  const rxjs_1 = require("rxjs");
10
11
  const core_bentley_1 = require("@itwin/core-bentley");
@@ -36,36 +37,56 @@ const LOGGING_NAMESPACE_PERFORMANCE = `${Common_js_1.LOGGING_NAMESPACE_PERFORMAN
36
37
  const DEFAULT_QUERY_CONCURRENCY = 10;
37
38
  const DEFAULT_QUERY_CACHE_SIZE = 1;
38
39
  /**
39
- * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and
40
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and
40
41
  * a hierarchy definition, which defines each hierarchy level through ECSQL queries.
41
42
  *
42
43
  * @public
43
44
  */
44
45
  function createIModelHierarchyProvider(props) {
46
+ const { imodelAccess, imodelChanged, ...restProps } = props;
47
+ return createMergedIModelHierarchyProvider({ ...restProps, imodels: [{ imodelAccess, imodelChanged }] });
48
+ }
49
+ /**
50
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
51
+ * and a hierarchy definition, which defines each hierarchy level through ECSQL queries.
52
+ *
53
+ * **Warning:** This is an experimental API that **should not be used in production**.
54
+ *
55
+ * @alpha
56
+ */
57
+ function createMergedIModelHierarchyProvider(props) {
45
58
  return new IModelHierarchyProviderImpl(props);
46
59
  }
47
60
  class IModelHierarchyProviderImpl {
48
- _imodelAccess;
61
+ _imodels;
49
62
  _hierarchyChanged;
50
63
  _valuesFormatter;
51
64
  _sourceHierarchyDefinition;
52
65
  _activeHierarchyDefinition;
53
66
  _localizedStrings;
54
- _queryScheduler;
67
+ _queryConcurrency;
68
+ _querySchedulers;
55
69
  _nodesCache;
56
70
  _unsubscribe;
57
71
  _dispose = new rxjs_1.Subject();
58
72
  #componentId;
59
73
  #componentName;
74
+ #sourceName;
60
75
  constructor(props) {
76
+ if (props.imodels.length === 0) {
77
+ throw new Error(`Creating an iModel hierarchy provider requires at least one iModel.`);
78
+ }
61
79
  this.#componentId = core_bentley_1.Guid.createValue();
62
80
  this.#componentName = "IModelHierarchyProviderImpl";
63
- this._imodelAccess = props.imodelAccess;
81
+ /* c8 ignore next */
82
+ this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
83
+ this._imodels = props.imodels;
64
84
  this._hierarchyChanged = new core_bentley_1.BeEvent();
65
85
  this._activeHierarchyDefinition = this._sourceHierarchyDefinition = (0, RxjsHierarchyDefinition_js_1.getRxjsHierarchyDefinition)(props.hierarchyDefinition);
66
86
  this._valuesFormatter = props?.formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
67
87
  this._localizedStrings = { other: "Other", unspecified: "Not specified", ...props?.localizedStrings };
68
- this._queryScheduler = new SubscriptionScheduler_js_1.SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);
88
+ this._queryConcurrency = props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY;
89
+ this._querySchedulers = new Map();
69
90
  this.setHierarchyFilter(props.filtering);
70
91
  const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;
71
92
  if (queryCacheSize !== 0) {
@@ -75,11 +96,18 @@ class IModelHierarchyProviderImpl {
75
96
  variationsCount: 1,
76
97
  });
77
98
  }
78
- this._unsubscribe = props.imodelChanged?.addListener(() => {
79
- this.invalidateHierarchyCache("Data source changed");
99
+ const imodelChangeSubscription = (0, rxjs_1.from)(this._imodels)
100
+ .pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelChanged }) => imodelChanged
101
+ ? (0, rxjs_1.fromEventPattern)((handler) => imodelChanged.addListener(handler), (handler) => imodelChanged.removeListener(handler), () => imodelAccess)
102
+ : rxjs_1.EMPTY))
103
+ .subscribe(({ imodelKey }) => {
104
+ this.invalidateHierarchyCache(`Data source changed: "${imodelKey}"`);
80
105
  this._dispose.next();
81
106
  this._hierarchyChanged.raiseEvent();
82
107
  });
108
+ this._unsubscribe = () => {
109
+ imodelChangeSubscription.unsubscribe();
110
+ };
83
111
  }
84
112
  [Symbol.dispose]() {
85
113
  this._dispose.next();
@@ -92,6 +120,17 @@ class IModelHierarchyProviderImpl {
92
120
  get hierarchyChanged() {
93
121
  return this._hierarchyChanged;
94
122
  }
123
+ getQueryScheduler(imodelKey) {
124
+ let scheduler = this._querySchedulers.get(imodelKey);
125
+ if (!scheduler) {
126
+ scheduler = new SubscriptionScheduler_js_1.SubscriptionScheduler(this._queryConcurrency);
127
+ this._querySchedulers.set(imodelKey, scheduler);
128
+ }
129
+ return scheduler;
130
+ }
131
+ getPrimaryIModelAccess() {
132
+ return this._imodels[this._imodels.length - 1].imodelAccess;
133
+ }
95
134
  invalidateHierarchyCache(reason) {
96
135
  (0, LoggingUtils_js_1.doLog)({
97
136
  category: `${LOGGING_NAMESPACE}.Events`,
@@ -117,8 +156,9 @@ class IModelHierarchyProviderImpl {
117
156
  return;
118
157
  }
119
158
  this._activeHierarchyDefinition = new FilteringHierarchyDefinition_js_1.FilteringHierarchyDefinition({
120
- imodelAccess: this._imodelAccess,
159
+ imodelAccess: this.getPrimaryIModelAccess(),
121
160
  source: this._sourceHierarchyDefinition,
161
+ sourceName: this.#sourceName,
122
162
  nodeIdentifierPaths: props.paths,
123
163
  });
124
164
  this.invalidateHierarchyCache("Hierarchy filter set");
@@ -134,44 +174,51 @@ class IModelHierarchyProviderImpl {
134
174
  category: LOGGING_NAMESPACE_PERFORMANCE,
135
175
  message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
136
176
  });
137
- let parentNode = props.parentNode;
138
- if (parentNode && HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this._imodelAccess.imodelKey) {
139
- return rxjs_1.EMPTY;
140
- }
141
- if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
142
- parentNode = {
143
- ...parentNode,
144
- key: {
145
- ...parentNode.key,
146
- instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === this._imodelAccess.imodelKey),
147
- },
148
- };
149
- (0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
150
- if (parentNode.key.instanceKeys.length === 0) {
177
+ return (0, rxjs_1.from)(this._imodels).pipe((0, rxjs_1.mergeMap)(({ imodelAccess }, imodelAccessIndex) => {
178
+ let parentNode = props.parentNode;
179
+ if (parentNode && HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this.#sourceName) {
151
180
  return rxjs_1.EMPTY;
152
181
  }
153
- }
154
- return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
182
+ if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
183
+ parentNode = {
184
+ ...parentNode,
185
+ key: {
186
+ ...parentNode.key,
187
+ instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === imodelAccess.imodelKey),
188
+ },
189
+ };
190
+ (0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
191
+ if (parentNode.key.instanceKeys.length === 0) {
192
+ return rxjs_1.EMPTY;
193
+ }
194
+ }
195
+ return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(
196
+ /* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
197
+ (hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
198
+ }), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
155
199
  category: LOGGING_NAMESPACE_PERFORMANCE,
156
200
  message: /* c8 ignore next */ () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
157
201
  })));
158
202
  }
159
203
  createSourceNodesObservable(props) {
160
204
  // pipe definitions to nodes and put "share replay" on it
161
- return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)((def) => {
205
+ return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => (0, rxjs_1.defer)(() => {
162
206
  if (IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode(def)) {
163
- return (0, rxjs_1.of)({ ...def.node, key: { type: "generic", id: def.node.key, source: this._imodelAccess.imodelKey } });
207
+ return (0, rxjs_1.of)({
208
+ ...def.node,
209
+ key: { type: "generic", id: def.node.key, source: this.#sourceName },
210
+ });
164
211
  }
165
- return this._queryScheduler.scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.map)((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)), (0, rxjs_1.mergeMap)((query) => (0, TreeNodesReader_js_1.readNodes)({
166
- queryExecutor: this._imodelAccess,
212
+ return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.map)((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)), (0, rxjs_1.mergeMap)((query) => (0, TreeNodesReader_js_1.readNodes)({
213
+ queryExecutor: imodelAccess,
167
214
  query,
168
215
  limit: props.hierarchyLevelSizeLimit,
169
216
  parser: this._activeHierarchyDefinition.parseNode ? (row) => this._activeHierarchyDefinition.parseNode(row, props.parentNode) : undefined,
170
217
  })), (0, rxjs_1.map)((node) => ({
171
218
  ...node,
172
- key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: this._imodelAccess.imodelKey })) },
219
+ key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })) },
173
220
  }))));
174
- }), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
221
+ }).pipe((0, rxjs_1.map)((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, (0, rxjs_1.map)(({ node }) => node), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
175
222
  category: LOGGING_NAMESPACE_PERFORMANCE,
176
223
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
177
224
  })), (0, ShareReplayWithErrors_js_1.shareReplayWithErrors)());
@@ -185,6 +232,7 @@ class IModelHierarchyProviderImpl {
185
232
  // format `ConcatenatedValue` labels into string labels
186
233
  (0, rxjs_1.mergeMap)((node) => applyLabelsFormatting(node, this._valuesFormatter)),
187
234
  // we have `ProcessedHierarchyNode` from here
235
+ // let consumers step-in
188
236
  preProcessNodes(this._activeHierarchyDefinition),
189
237
  // process hiding
190
238
  (0, HideIfNoChildren_js_1.createHideIfNoChildrenOperator)((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), (0, HideNodesInHierarchy_js_1.createHideNodesInHierarchyOperator)(
@@ -195,7 +243,7 @@ class IModelHierarchyProviderImpl {
195
243
  })));
196
244
  }
197
245
  createProcessedNodesObservable(preprocessedNodesObservable, props) {
198
- return preprocessedNodesObservable.pipe((0, Grouping_js_1.createGroupingOperator)(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
246
+ return preprocessedNodesObservable.pipe((0, Grouping_js_1.createGroupingOperator)(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
199
247
  category: LOGGING_NAMESPACE_PERFORMANCE,
200
248
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
201
249
  })));
@@ -205,9 +253,7 @@ class IModelHierarchyProviderImpl {
205
253
  if ("processingParams" in n) {
206
254
  delete n.processingParams;
207
255
  }
208
- return Object.assign(n, {
209
- children: (0, Common_js_1.hasChildren)(n),
210
- });
256
+ return { ...n, children: (0, Common_js_1.hasChildren)(n) };
211
257
  }), (0, rxjs_1.takeUntil)(this._dispose), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
212
258
  category: LOGGING_NAMESPACE_PERFORMANCE,
213
259
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
@@ -322,11 +368,11 @@ class IModelHierarchyProviderImpl {
322
368
  return (0, rxjs_1.from)(parentNode.groupedInstanceKeys);
323
369
  }
324
370
  (0, core_bentley_1.assert)(!parentNode || HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) || HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode));
325
- const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
326
371
  // split the definitions based on whether they're for generic nodes or for instance nodes
327
- const [genericDefs, instanceDefs] = (0, Partition_js_1.partition)(hierarchyLevelDefinitions, IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode);
372
+ const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
373
+ const [instanceDefs, genericDefs] = (0, Partition_js_1.partition)(hierarchyLevelDefinitions, (x) => IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
328
374
  // query instance keys and a flag whether they should be hidden
329
- const instanceKeys = instanceDefs.pipe((0, rxjs_1.mergeMap)((def) => this._queryScheduler.scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.mergeMap)(async (query) => {
375
+ const instanceKeys = instanceDefs.pipe((0, rxjs_1.mergeMap)(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.mergeMap)(async (query) => {
330
376
  const ecsql = `
331
377
  SELECT
332
378
  ${NodeSelectQueryFactory_js_1.NodeSelectClauseColumnNames.FullClassName},
@@ -336,7 +382,7 @@ class IModelHierarchyProviderImpl {
336
382
  ${query.ecsql}
337
383
  )
338
384
  `;
339
- const reader = this._imodelAccess.createQueryReader({ ...query, ecsql }, {
385
+ const reader = imodelAccess.createQueryReader({ ...query, ecsql }, {
340
386
  rowFormat: "Indexes",
341
387
  limit: hierarchyLevelSizeLimit,
342
388
  restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${core_bentley_1.Guid.createValue()}`,
@@ -345,7 +391,7 @@ class IModelHierarchyProviderImpl {
345
391
  key: {
346
392
  className: (0, presentation_shared_1.normalizeFullClassName)(row[0]),
347
393
  id: row[1],
348
- imodelKey: this._imodelAccess.imodelKey,
394
+ imodelKey: imodelAccess.imodelKey,
349
395
  },
350
396
  hide: !!row[2],
351
397
  })));
@@ -355,17 +401,17 @@ class IModelHierarchyProviderImpl {
355
401
  // hidden items' handling:
356
402
  // - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,
357
403
  // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`
358
- const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)((def) => !!def.node.processingParams?.hideInHierarchy), (0, rxjs_1.map)((def) => ({
404
+ const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)(({ hierarchyNodesDefinition }) => !!hierarchyNodesDefinition.node.processingParams?.hideInHierarchy), (0, rxjs_1.map)(({ hierarchyNodesDefinition }) => ({
359
405
  type: "generic",
360
- id: def.node.key,
361
- source: this._imodelAccess.imodelKey,
406
+ id: hierarchyNodesDefinition.node.key,
407
+ source: this.#sourceName,
362
408
  }))), hiddenNodeInstanceKeys.pipe(
363
409
  // first merge all keys by class
364
- (0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key.id),
410
+ (0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key),
365
411
  // then, for each class, create an instance key
366
- (0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className, ids]) => ({
412
+ (0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
367
413
  type: "instances",
368
- instanceKeys: ids.map((id) => ({ className, id, imodelKey: this._imodelAccess.imodelKey })),
414
+ instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
369
415
  }))))).pipe((0, rxjs_1.map)((key) => ({
370
416
  key,
371
417
  parentKeys: [],
@@ -454,4 +500,49 @@ function filterQueryByInstanceKeys(query, filteredInstanceKeys) {
454
500
  };
455
501
  /* c8 ignore end */
456
502
  }
503
+ function mergeNodes(source) {
504
+ return (0, rxjs_1.from)(source).pipe((0, rxjs_1.reduce)((acc, input) => {
505
+ for (let i = 0; i < acc.length; ++i) {
506
+ if (input.imodelAccess === acc[i].imodelAccess) {
507
+ // don't attempt to merge nodes if they come from the same provider
508
+ continue;
509
+ }
510
+ // the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
511
+ // the node with higher `imodelAccessIndex` first
512
+ const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
513
+ ? { imodelAccess: input.imodelAccess, imodelAccessIndex: input.imodelAccessIndex, primary: input.node, secondary: acc[i].node }
514
+ : { imodelAccess: acc[i].imodelAccess, imodelAccessIndex: acc[i].imodelAccessIndex, primary: acc[i].node, secondary: input.node };
515
+ const merged = tryMergeNodes(candidates.primary, candidates.secondary);
516
+ if (merged) {
517
+ acc[i] = { ...acc[i], node: merged, imodelAccess: candidates.imodelAccess, imodelAccessIndex: candidates.imodelAccessIndex };
518
+ return acc;
519
+ }
520
+ }
521
+ acc.push(input);
522
+ return acc;
523
+ }, new Array()), (0, rxjs_1.mergeAll)());
524
+ }
525
+ function tryMergeInstanceNodes(primary, secondary) {
526
+ if (HierarchyNode_js_1.HierarchyNode.isInstancesNode(primary) &&
527
+ HierarchyNode_js_1.HierarchyNode.isInstancesNode(secondary) &&
528
+ primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => presentation_shared_1.InstanceKey.equals(lhsKey, rhsKey)))) {
529
+ return {
530
+ ...primary,
531
+ key: {
532
+ type: "instances",
533
+ instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
534
+ },
535
+ };
536
+ }
537
+ return undefined;
538
+ }
539
+ function tryMergeGenericNodes(primary, secondary) {
540
+ if (HierarchyNode_js_1.HierarchyNode.isGeneric(primary) && HierarchyNode_js_1.HierarchyNode.isGeneric(secondary) && primary.key.type === secondary.key.type) {
541
+ return primary;
542
+ }
543
+ return undefined;
544
+ }
545
+ function tryMergeNodes(primary, secondary) {
546
+ return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
547
+ }
457
548
  //# sourceMappingURL=IModelHierarchyProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IModelHierarchyProvider.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/IModelHierarchyProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"../internal/DisposePolyfill.js\";\n\nimport {\n catchError,\n concat,\n defaultIfEmpty,\n EMPTY,\n filter,\n finalize,\n from,\n identity,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n of,\n Subject,\n take,\n takeUntil,\n tap,\n} from \"rxjs\";\nimport { assert, BeEvent, Guid, GuidString, StopWatch } from \"@itwin/core-bentley\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n Event,\n EventArgs,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { RowsLimitExceededError } from \"../HierarchyErrors.js\";\nimport { HierarchyFilteringPath } from \"../HierarchyFiltering.js\";\nimport { HierarchyNode, NonGroupingHierarchyNode, ParentHierarchyNode } from \"../HierarchyNode.js\";\nimport { GenericNodeKey, HierarchyNodeKey, IModelInstanceKey, InstancesNodeKey } from \"../HierarchyNodeKey.js\";\nimport { GetHierarchyNodesProps, HierarchyProvider } from \"../HierarchyProvider.js\";\nimport {\n LOGGING_NAMESPACE as BASE_LOGGING_NAMESPACE,\n LOGGING_NAMESPACE_INTERNAL as BASE_LOGGING_NAMESPACE_INTERNAL,\n LOGGING_NAMESPACE_PERFORMANCE as BASE_LOGGING_NAMESPACE_PERFORMANCE,\n createNodeIdentifierForLogging,\n hasChildren,\n} from \"../internal/Common.js\";\nimport { eachValueFrom } from \"../internal/EachValueFrom.js\";\nimport { doLog, log } from \"../internal/LoggingUtils.js\";\nimport { partition } from \"../internal/operators/Partition.js\";\nimport { reduceToMergeMapList } from \"../internal/operators/ReduceToMergeMap.js\";\nimport { shareReplayWithErrors } from \"../internal/operators/ShareReplayWithErrors.js\";\nimport { sortNodesByLabelOperator } from \"../internal/operators/Sorting.js\";\nimport { getRxjsHierarchyDefinition, RxjsHierarchyDefinition } from \"../internal/RxjsHierarchyDefinition.js\";\nimport { SubscriptionScheduler } from \"../internal/SubscriptionScheduler.js\";\nimport { FilteringHierarchyDefinition } from \"./FilteringHierarchyDefinition.js\";\nimport { HierarchyCache } from \"./HierarchyCache.js\";\nimport { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyNodesDefinition } from \"./IModelHierarchyDefinition.js\";\nimport { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, SourceGenericHierarchyNode, SourceInstanceHierarchyNode } from \"./IModelHierarchyNode.js\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor.js\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory.js\";\nimport { createDetermineChildrenOperator } from \"./operators/DetermineChildren.js\";\nimport { createGroupingOperator } from \"./operators/Grouping.js\";\nimport { createHideIfNoChildrenOperator } from \"./operators/HideIfNoChildren.js\";\nimport { createHideNodesInHierarchyOperator } from \"./operators/HideNodesInHierarchy.js\";\nimport { readNodes } from \"./TreeNodesReader.js\";\n\nconst LOGGING_NAMESPACE = `${BASE_LOGGING_NAMESPACE}.IModelHierarchyProvider`;\nconst LOGGING_NAMESPACE_INTERNAL = `${BASE_LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;\nconst LOGGING_NAMESPACE_PERFORMANCE = `${BASE_LOGGING_NAMESPACE_PERFORMANCE}.IModelHierarchyProvider`;\n\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Defines the strings used by hierarchy provider.\n * @public\n */\ninterface IModelHierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/** @public */\ntype IModelAccess = ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector & { imodelKey: string };\n\n/**\n * Props for `createIModelHierarchyProvider`.\n * @public\n */\ninterface IModelHierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: IModelAccess;\n\n /** An event that is raised when iModel data, that may affect the hierarchy, changes. */\n imodelChanged?: Event<() => void>;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<IModelHierarchyProviderLocalizedStrings>;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters. May be overridden\n * by calling `setFormatter` on the provider instance.\n */\n formatter?: IPrimitiveValueFormatter;\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyFilteringPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @public\n */\nexport function createIModelHierarchyProvider(props: IModelHierarchyProviderProps): HierarchyProvider & {\n /** @deprecated in 1.4. Use `[Symbol.dispose]` instead. */\n dispose: () => void;\n [Symbol.dispose]: () => void;\n} {\n return new IModelHierarchyProviderImpl(props);\n}\n\ninterface RequestContextProp {\n requestContext: {\n requestId: string;\n };\n}\n\nclass IModelHierarchyProviderImpl implements HierarchyProvider {\n private _imodelAccess: IModelAccess;\n private _hierarchyChanged: BeEvent<(args?: EventArgs<HierarchyProvider[\"hierarchyChanged\"]>) => void>;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _sourceHierarchyDefinition: RxjsHierarchyDefinition;\n private _activeHierarchyDefinition: RxjsHierarchyDefinition;\n private _localizedStrings: IModelHierarchyProviderLocalizedStrings;\n private _queryScheduler: SubscriptionScheduler;\n private _nodesCache?: HierarchyCache<HierarchyCacheEntry>;\n private _unsubscribe?: () => void;\n private _dispose = new Subject<void>();\n #componentId: GuidString;\n #componentName: string;\n\n public constructor(props: IModelHierarchyProviderProps) {\n this.#componentId = Guid.createValue();\n this.#componentName = \"IModelHierarchyProviderImpl\";\n this._imodelAccess = props.imodelAccess;\n this._hierarchyChanged = new BeEvent();\n this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryScheduler = new SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);\n this.setHierarchyFilter(props.filtering);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new HierarchyCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n\n this._unsubscribe = props.imodelChanged?.addListener(() => {\n this.invalidateHierarchyCache(\"Data source changed\");\n this._dispose.next();\n this._hierarchyChanged.raiseEvent();\n });\n }\n\n public [Symbol.dispose]() {\n this._dispose.next();\n this._unsubscribe?.();\n }\n\n /* c8 ignore next 3 */\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public get hierarchyChanged() {\n return this._hierarchyChanged;\n }\n\n private invalidateHierarchyCache(reason?: string) {\n doLog({\n category: `${LOGGING_NAMESPACE}.Events`,\n message: /* c8 ignore next */ () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),\n });\n this._nodesCache?.clear();\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n this._hierarchyChanged.raiseEvent({ formatterChange: { newFormatter: this._valuesFormatter } });\n }\n\n public setHierarchyFilter(props: IModelHierarchyProviderProps[\"filtering\"]) {\n if (!props) {\n if (this._sourceHierarchyDefinition !== this._activeHierarchyDefinition) {\n this._activeHierarchyDefinition = this._sourceHierarchyDefinition;\n this.invalidateHierarchyCache(\"Hierarchy filter reset\");\n }\n this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: undefined } });\n return;\n }\n this._activeHierarchyDefinition = new FilteringHierarchyDefinition({\n imodelAccess: this._imodelAccess,\n source: this._sourceHierarchyDefinition,\n nodeIdentifierPaths: props.paths,\n });\n this.invalidateHierarchyCache(\"Hierarchy filter set\");\n this._dispose.next();\n this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: props } });\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createHierarchyLevelDefinitionsObservable(props: DefineHierarchyLevelProps & RequestContextProp): Observable<HierarchyNodesDefinition> {\n const { requestContext, ...defineHierarchyLevelProps } = props;\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n let parentNode = props.parentNode;\n if (parentNode && HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this._imodelAccess.imodelKey) {\n return EMPTY;\n }\n if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {\n parentNode = {\n ...parentNode,\n key: {\n ...parentNode.key,\n instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === this._imodelAccess.imodelKey),\n },\n };\n assert(HierarchyNodeKey.isInstances(parentNode.key));\n if (parentNode.key.instanceKeys.length === 0) {\n return EMPTY;\n }\n }\n return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe(\n mergeAll(),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createSourceNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] } & RequestContextProp,\n ): SourceNodesObservable {\n // pipe definitions to nodes and put \"share replay\" on it\n return this.createHierarchyLevelDefinitionsObservable(props).pipe(\n mergeMap((def): ObservableInput<SourceHierarchyNode> => {\n if (HierarchyNodesDefinition.isGenericNode(def)) {\n return of({ ...def.node, key: { type: \"generic\", id: def.node.key, source: this._imodelAccess.imodelKey } });\n }\n return this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n mergeMap((query) =>\n readNodes({\n queryExecutor: this._imodelAccess,\n query,\n limit: props.hierarchyLevelSizeLimit,\n parser: this._activeHierarchyDefinition.parseNode ? (row) => this._activeHierarchyDefinition.parseNode!(row, props.parentNode) : undefined,\n }),\n ),\n map((node) => ({\n ...node,\n key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: this._imodelAccess.imodelKey })) },\n })),\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: SourceNodesObservable,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<ProcessedHierarchyNode> {\n return queryNodesObservable.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the source node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(props.parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap((node) => applyLabelsFormatting(node, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n preProcessNodes(this._activeHierarchyDefinition),\n // process hiding\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes),\n postProcessNodes(this._activeHierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (\"processingParams\" in n) {\n delete n.processingParams;\n }\n return Object.assign(n, {\n children: hasChildren(n),\n });\n }),\n takeUntil(this._dispose),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable: SourceNodesObservable | undefined,\n props: RequestContextProp,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({\n category: loggingCategory,\n message: /* c8 ignore next */ (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,\n }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,\n });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* c8 ignore next */ (r) => `[${props.requestContext.requestId}] Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps & RequestContextProp): HierarchyCacheEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" } & RequestContextProp) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable, props),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable, undefined, props),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const requestContext = { requestId: Guid.createValue() };\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n /* c8 ignore next 3 */ error\n ? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\"> & RequestContextProp): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\", requestContext } = props;\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });\n\n // split the definitions based on whether they're for generic nodes or for instance nodes\n const [genericDefs, instanceDefs] = partition(hierarchyLevelDefinitions, HierarchyNodesDefinition.isGenericNode);\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap((def) =>\n this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = this._imodelAccess.createQueryReader(\n { ...query, ecsql },\n {\n rowFormat: \"Indexes\",\n limit: hierarchyLevelSizeLimit,\n restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${Guid.createValue()}`,\n },\n );\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n imodelKey: this._imodelAccess.imodelKey,\n } satisfies IModelInstanceKey,\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n genericDefs.pipe(\n filter((def) => !!def.node.processingParams?.hideInHierarchy),\n map(\n (def): GenericNodeKey => ({\n type: \"generic\",\n id: def.node.key,\n source: this._imodelAccess.imodelKey,\n }),\n ),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key.id,\n ),\n // then, for each class, create an instance key\n mergeMap((mergedMap): InstancesNodeKey[] =>\n [...mergedMap.entries()].map(([className, ids]) => ({\n type: \"instances\",\n instanceKeys: ids.map((id) => ({ className, id, imodelKey: this._imodelAccess.imodelKey })),\n })),\n ),\n ),\n ).pipe(\n map((key) => ({\n key,\n parentKeys: [],\n label: \"\",\n })),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext }))),\n ).pipe(takeUntil(this._dispose));\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const requestContext = { requestId: Guid.createValue() };\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n const timer = new StopWatch(undefined, true);\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n let error: any;\n let keysCount = 0;\n return eachValueFrom(\n this.getNodeInstanceKeysObs({ ...props, requestContext }).pipe(\n tap(() => ++keysCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n /* c8 ignore next 3 */ error\n ? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n}\n\ntype SourceHierarchyNode = SourceInstanceHierarchyNode | (Omit<SourceGenericHierarchyNode, \"key\"> & { key: GenericNodeKey });\ntype SourceNodesObservable = Observable<SourceHierarchyNode>;\ntype ProcessedNodesObservable = Observable<ProcessedHierarchyNode>;\ntype HierarchyCacheEntry =\n | { observable: SourceNodesObservable; processingStatus: \"none\" }\n | { observable: ProcessedNodesObservable; processingStatus: \"pre-processed\" };\n\nfunction preProcessNodes(hierarchyFactory: RxjsHierarchyDefinition) {\n return hierarchyFactory.preProcessNode ? processNodes(hierarchyFactory.preProcessNode) : identity;\n}\n\nfunction postProcessNodes(hierarchyFactory: RxjsHierarchyDefinition) {\n return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode) : identity;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Observable<TNode>) {\n return (nodes: Observable<TNode>) => nodes.pipe(mergeMap(processor));\n}\n\nfunction applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n valueFormatter: IPrimitiveValueFormatter,\n): Observable<TNode & { label: string }> {\n return from(\n formatConcatenatedValue({\n value: node.label,\n valueFormatter,\n }),\n ).pipe(\n map((label) => ({\n ...node,\n label,\n })),\n );\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n /* c8 ignore start */\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n /* c8 ignore end */\n}\n"]}
1
+ {"version":3,"file":"IModelHierarchyProvider.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/IModelHierarchyProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport \"../internal/DisposePolyfill.js\";\n\nimport {\n catchError,\n concat,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n finalize,\n from,\n fromEventPattern,\n identity,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n ObservedValueOf,\n of,\n reduce,\n Subject,\n take,\n takeUntil,\n tap,\n} from \"rxjs\";\nimport { assert, BeEvent, Guid, GuidString, StopWatch } from \"@itwin/core-bentley\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n Event,\n EventArgs,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { RowsLimitExceededError } from \"../HierarchyErrors.js\";\nimport { HierarchyFilteringPath } from \"../HierarchyFiltering.js\";\nimport { HierarchyNode, NonGroupingHierarchyNode, ParentHierarchyNode } from \"../HierarchyNode.js\";\nimport { GenericNodeKey, HierarchyNodeKey, IModelInstanceKey, InstancesNodeKey } from \"../HierarchyNodeKey.js\";\nimport { GetHierarchyNodesProps, HierarchyProvider } from \"../HierarchyProvider.js\";\nimport {\n LOGGING_NAMESPACE as BASE_LOGGING_NAMESPACE,\n LOGGING_NAMESPACE_INTERNAL as BASE_LOGGING_NAMESPACE_INTERNAL,\n LOGGING_NAMESPACE_PERFORMANCE as BASE_LOGGING_NAMESPACE_PERFORMANCE,\n createNodeIdentifierForLogging,\n hasChildren,\n} from \"../internal/Common.js\";\nimport { eachValueFrom } from \"../internal/EachValueFrom.js\";\nimport { doLog, log } from \"../internal/LoggingUtils.js\";\nimport { partition } from \"../internal/operators/Partition.js\";\nimport { reduceToMergeMapList } from \"../internal/operators/ReduceToMergeMap.js\";\nimport { shareReplayWithErrors } from \"../internal/operators/ShareReplayWithErrors.js\";\nimport { sortNodesByLabelOperator } from \"../internal/operators/Sorting.js\";\nimport { getRxjsHierarchyDefinition, RxjsHierarchyDefinition } from \"../internal/RxjsHierarchyDefinition.js\";\nimport { SubscriptionScheduler } from \"../internal/SubscriptionScheduler.js\";\nimport { FilteringHierarchyDefinition } from \"./FilteringHierarchyDefinition.js\";\nimport { HierarchyCache } from \"./HierarchyCache.js\";\nimport {\n DefineHierarchyLevelProps,\n GenericHierarchyNodeDefinition,\n HierarchyDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n} from \"./IModelHierarchyDefinition.js\";\nimport { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, SourceGenericHierarchyNode, SourceInstanceHierarchyNode } from \"./IModelHierarchyNode.js\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor.js\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory.js\";\nimport { createDetermineChildrenOperator } from \"./operators/DetermineChildren.js\";\nimport { createGroupingOperator } from \"./operators/Grouping.js\";\nimport { createHideIfNoChildrenOperator } from \"./operators/HideIfNoChildren.js\";\nimport { createHideNodesInHierarchyOperator } from \"./operators/HideNodesInHierarchy.js\";\nimport { readNodes } from \"./TreeNodesReader.js\";\n\nconst LOGGING_NAMESPACE = `${BASE_LOGGING_NAMESPACE}.IModelHierarchyProvider`;\nconst LOGGING_NAMESPACE_INTERNAL = `${BASE_LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;\nconst LOGGING_NAMESPACE_PERFORMANCE = `${BASE_LOGGING_NAMESPACE_PERFORMANCE}.IModelHierarchyProvider`;\n\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Defines the strings used by hierarchy provider.\n * @public\n */\ninterface IModelHierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/** @public */\ntype IModelAccess = ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector & { imodelKey: string };\n\n/**\n * Props for `createIModelHierarchyProvider`.\n * @public\n */\ninterface IModelHierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: IModelAccess;\n\n /**\n * An event that is raised when iModel data, that may affect the hierarchy, changes. The created provider\n * subscribes to the event to know that it needs to reload the data, and unsubscribes on disposal.\n */\n imodelChanged?: Event<() => void>;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<IModelHierarchyProviderLocalizedStrings>;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters. May be overridden\n * by calling `setFormatter` on the provider instance.\n */\n formatter?: IPrimitiveValueFormatter;\n\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyFilteringPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @public\n */\nexport function createIModelHierarchyProvider(props: IModelHierarchyProviderProps): HierarchyProvider & Disposable {\n const { imodelAccess, imodelChanged, ...restProps } = props;\n return createMergedIModelHierarchyProvider({ ...restProps, imodels: [{ imodelAccess, imodelChanged }] });\n}\n\n/**\n * Props for `createMergedIModelHierarchyProvider`.\n * @alpha\n */\ninterface MergedIModelHierarchyProviderProps extends Omit<IModelHierarchyProviderProps, \"imodelAccess\" | \"imodelChanged\"> {\n /**\n * A list of iModels to create merged hierarchy for.\n *\n * **Warning:** These **must** all be different versions of the same iModel, ordered from the earliest to the\n * latest version. Not obeying this rule may result in undefined behavior.\n */\n imodels: Array<{\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: IModelAccess;\n\n /**\n * An event that is raised when iModel data, that may affect the hierarchy, changes. The created provider\n * subscribes to the event to know that it needs to reload the data, and unsubscribes on disposal.\n */\n imodelChanged?: Event<() => void>;\n }>;\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel\n * and a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * **Warning:** This is an experimental API that **should not be used in production**.\n *\n * @alpha\n */\nexport function createMergedIModelHierarchyProvider(props: MergedIModelHierarchyProviderProps): HierarchyProvider & Disposable {\n return new IModelHierarchyProviderImpl(props);\n}\n\ninterface RequestContextProp {\n requestContext: {\n requestId: string;\n };\n}\n\ntype WithSourceNameOverride<T> = T & { sourceName?: string };\n\nclass IModelHierarchyProviderImpl implements HierarchyProvider {\n private _imodels: Array<{ imodelAccess: IModelAccess; imodelChanged?: Event<() => void> }>;\n private _hierarchyChanged: BeEvent<(args?: EventArgs<HierarchyProvider[\"hierarchyChanged\"]>) => void>;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _sourceHierarchyDefinition: RxjsHierarchyDefinition;\n private _activeHierarchyDefinition: RxjsHierarchyDefinition;\n private _localizedStrings: IModelHierarchyProviderLocalizedStrings;\n private _queryConcurrency: number;\n private _querySchedulers: Map<string, SubscriptionScheduler>;\n private _nodesCache?: HierarchyCache<HierarchyCacheEntry>;\n private _unsubscribe?: () => void;\n private _dispose = new Subject<void>();\n #componentId: GuidString;\n #componentName: string;\n #sourceName: string;\n\n public constructor(props: WithSourceNameOverride<MergedIModelHierarchyProviderProps>) {\n if (props.imodels.length === 0) {\n throw new Error(`Creating an iModel hierarchy provider requires at least one iModel.`);\n }\n\n this.#componentId = Guid.createValue();\n this.#componentName = \"IModelHierarchyProviderImpl\";\n /* c8 ignore next */\n this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;\n this._imodels = props.imodels;\n this._hierarchyChanged = new BeEvent();\n this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryConcurrency = props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY;\n this._querySchedulers = new Map();\n this.setHierarchyFilter(props.filtering);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new HierarchyCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n\n const imodelChangeSubscription = from(this._imodels)\n .pipe(\n mergeMap(({ imodelAccess, imodelChanged }) =>\n imodelChanged\n ? fromEventPattern(\n (handler) => imodelChanged.addListener(handler),\n (handler) => imodelChanged.removeListener(handler),\n () => imodelAccess,\n )\n : EMPTY,\n ),\n )\n .subscribe(({ imodelKey }) => {\n this.invalidateHierarchyCache(`Data source changed: \"${imodelKey}\"`);\n this._dispose.next();\n this._hierarchyChanged.raiseEvent();\n });\n this._unsubscribe = () => {\n imodelChangeSubscription.unsubscribe();\n };\n }\n\n public [Symbol.dispose]() {\n this._dispose.next();\n this._unsubscribe?.();\n }\n\n /* c8 ignore next 3 */\n public dispose() {\n this[Symbol.dispose]();\n }\n\n public get hierarchyChanged() {\n return this._hierarchyChanged;\n }\n\n private getQueryScheduler(imodelKey: string) {\n let scheduler = this._querySchedulers.get(imodelKey);\n if (!scheduler) {\n scheduler = new SubscriptionScheduler(this._queryConcurrency);\n this._querySchedulers.set(imodelKey, scheduler);\n }\n return scheduler;\n }\n\n private getPrimaryIModelAccess() {\n return this._imodels[this._imodels.length - 1].imodelAccess;\n }\n\n private invalidateHierarchyCache(reason?: string) {\n doLog({\n category: `${LOGGING_NAMESPACE}.Events`,\n message: /* c8 ignore next */ () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),\n });\n this._nodesCache?.clear();\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n this._hierarchyChanged.raiseEvent({ formatterChange: { newFormatter: this._valuesFormatter } });\n }\n\n public setHierarchyFilter(props: IModelHierarchyProviderProps[\"filtering\"]) {\n if (!props) {\n if (this._sourceHierarchyDefinition !== this._activeHierarchyDefinition) {\n this._activeHierarchyDefinition = this._sourceHierarchyDefinition;\n this.invalidateHierarchyCache(\"Hierarchy filter reset\");\n }\n this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: undefined } });\n return;\n }\n this._activeHierarchyDefinition = new FilteringHierarchyDefinition({\n imodelAccess: this.getPrimaryIModelAccess(),\n source: this._sourceHierarchyDefinition,\n sourceName: this.#sourceName,\n nodeIdentifierPaths: props.paths,\n });\n this.invalidateHierarchyCache(\"Hierarchy filter set\");\n this._dispose.next();\n this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: props } });\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createHierarchyLevelDefinitionsObservable(\n props: DefineHierarchyLevelProps & RequestContextProp,\n ): Observable<\n { imodelAccess: IModelAccess; imodelAccessIndex: number } & (\n | { hierarchyNodesDefinition: GenericHierarchyNodeDefinition }\n | { hierarchyNodesDefinition: InstanceNodesQueryDefinition }\n )\n > {\n const { requestContext, ...defineHierarchyLevelProps } = props;\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n\n return from(this._imodels).pipe(\n mergeMap(({ imodelAccess }, imodelAccessIndex) => {\n let parentNode = props.parentNode;\n if (parentNode && HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this.#sourceName) {\n return EMPTY;\n }\n if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {\n parentNode = {\n ...parentNode,\n key: {\n ...parentNode.key,\n instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === imodelAccess.imodelKey),\n },\n };\n assert(HierarchyNodeKey.isInstances(parentNode.key));\n if (parentNode.key.instanceKeys.length === 0) {\n return EMPTY;\n }\n }\n return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe(\n mergeAll(),\n map(\n /* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */\n (hierarchyNodesDefinition) =>\n ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition }) as ObservedValueOf<\n ReturnType<typeof this.createHierarchyLevelDefinitionsObservable>\n >,\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createSourceNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] } & RequestContextProp,\n ): SourceNodesObservable {\n // pipe definitions to nodes and put \"share replay\" on it\n return this.createHierarchyLevelDefinitionsObservable(props).pipe(\n mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) =>\n defer((): Observable<SourceHierarchyNode> => {\n if (HierarchyNodesDefinition.isGenericNode(def)) {\n return of({\n ...def.node,\n key: { type: \"generic\" as const, id: def.node.key, source: this.#sourceName },\n });\n }\n return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n mergeMap((query) =>\n readNodes({\n queryExecutor: imodelAccess,\n query,\n limit: props.hierarchyLevelSizeLimit,\n parser: this._activeHierarchyDefinition.parseNode ? (row) => this._activeHierarchyDefinition.parseNode!(row, props.parentNode) : undefined,\n }),\n ),\n map((node) => ({\n ...node,\n key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })) },\n })),\n ),\n );\n }).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node }))),\n ),\n mergeNodes,\n map(({ node }) => node),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: SourceNodesObservable,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<ProcessedHierarchyNode> {\n return queryNodesObservable.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the source node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(props.parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap((node) => applyLabelsFormatting(node, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n // let consumers step-in\n preProcessNodes(this._activeHierarchyDefinition),\n // process hiding\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps & RequestContextProp,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes),\n postProcessNodes(this._activeHierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (\"processingParams\" in n) {\n delete n.processingParams;\n }\n return { ...n, children: hasChildren(n) };\n }),\n takeUntil(this._dispose),\n finalize(() =>\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable: SourceNodesObservable | undefined,\n props: RequestContextProp,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({\n category: loggingCategory,\n message: /* c8 ignore next */ (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,\n }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,\n });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* c8 ignore next */ (r) => `[${props.requestContext.requestId}] Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps & RequestContextProp): HierarchyCacheEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" } & RequestContextProp) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable, props),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable, undefined, props),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const requestContext = { requestId: Guid.createValue() };\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n /* c8 ignore next 3 */ error\n ? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\"> & RequestContextProp): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\", requestContext } = props;\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n // split the definitions based on whether they're for generic nodes or for instance nodes\n const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });\n const [instanceDefs, genericDefs] = partition(\n hierarchyLevelDefinitions,\n (\n x,\n ): x is Omit<ObservedValueOf<typeof hierarchyLevelDefinitions>, \"hierarchyNodesDefinition\"> & {\n hierarchyNodesDefinition: InstanceNodesQueryDefinition;\n } => HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition),\n );\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) =>\n this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = imodelAccess.createQueryReader(\n { ...query, ecsql },\n {\n rowFormat: \"Indexes\",\n limit: hierarchyLevelSizeLimit,\n restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${Guid.createValue()}`,\n },\n );\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n imodelKey: imodelAccess.imodelKey,\n } satisfies IModelInstanceKey,\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n genericDefs.pipe(\n filter(({ hierarchyNodesDefinition }) => !!hierarchyNodesDefinition.node.processingParams?.hideInHierarchy),\n map(\n ({ hierarchyNodesDefinition }): GenericNodeKey => ({\n type: \"generic\",\n id: hierarchyNodesDefinition.node.key,\n source: this.#sourceName,\n }),\n ),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key,\n ),\n // then, for each class, create an instance key\n mergeMap((mergedMap): InstancesNodeKey[] =>\n [...mergedMap.entries()].map(([className, keys]) => ({\n type: \"instances\",\n instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),\n })),\n ),\n ),\n ).pipe(\n map((key) => ({\n key,\n parentKeys: [],\n label: \"\",\n })),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext }))),\n ).pipe(takeUntil(this._dispose));\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const requestContext = { requestId: Guid.createValue() };\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n const timer = new StopWatch(undefined, true);\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n let error: any;\n let keysCount = 0;\n return eachValueFrom(\n this.getNodeInstanceKeysObs({ ...props, requestContext }).pipe(\n tap(() => ++keysCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* c8 ignore next */ () =>\n /* c8 ignore next 3 */ error\n ? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n}\n\ntype SourceHierarchyNode = SourceInstanceHierarchyNode | (Omit<SourceGenericHierarchyNode, \"key\"> & { key: GenericNodeKey });\ntype SourceNodesObservable = Observable<SourceHierarchyNode>;\ntype ProcessedNodesObservable = Observable<ProcessedHierarchyNode>;\ntype HierarchyCacheEntry =\n | { observable: SourceNodesObservable; processingStatus: \"none\" }\n | { observable: ProcessedNodesObservable; processingStatus: \"pre-processed\" };\n\nfunction preProcessNodes(hierarchyFactory: RxjsHierarchyDefinition) {\n return hierarchyFactory.preProcessNode ? processNodes(hierarchyFactory.preProcessNode) : identity;\n}\n\nfunction postProcessNodes(hierarchyFactory: RxjsHierarchyDefinition) {\n return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode) : identity;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Observable<TNode>) {\n return (nodes: Observable<TNode>) => nodes.pipe(mergeMap(processor));\n}\n\nfunction applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n valueFormatter: IPrimitiveValueFormatter,\n): Observable<TNode & { label: string }> {\n return from(\n formatConcatenatedValue({\n value: node.label,\n valueFormatter,\n }),\n ).pipe(\n map((label) => ({\n ...node,\n label,\n })),\n );\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n /* c8 ignore start */\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n /* c8 ignore end */\n}\n\nfunction mergeNodes<\n TNode extends { key: GenericNodeKey | InstancesNodeKey },\n TParam extends {\n imodelAccess: IModelAccess;\n imodelAccessIndex: number;\n node: TNode;\n },\n>(source: ObservableInput<TParam>) {\n return from(source).pipe(\n reduce((acc, input) => {\n for (let i = 0; i < acc.length; ++i) {\n if (input.imodelAccess === acc[i].imodelAccess) {\n // don't attempt to merge nodes if they come from the same provider\n continue;\n }\n\n // the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass\n // the node with higher `imodelAccessIndex` first\n const candidates =\n input.imodelAccessIndex > acc[i].imodelAccessIndex\n ? { imodelAccess: input.imodelAccess, imodelAccessIndex: input.imodelAccessIndex, primary: input.node, secondary: acc[i].node }\n : { imodelAccess: acc[i].imodelAccess, imodelAccessIndex: acc[i].imodelAccessIndex, primary: acc[i].node, secondary: input.node };\n const merged = tryMergeNodes(candidates.primary, candidates.secondary);\n if (merged) {\n acc[i] = { ...acc[i], node: merged, imodelAccess: candidates.imodelAccess, imodelAccessIndex: candidates.imodelAccessIndex };\n return acc;\n }\n }\n acc.push(input);\n return acc;\n }, new Array<TParam>()),\n mergeAll(),\n );\n}\nfunction tryMergeInstanceNodes<TNode extends { key: GenericNodeKey | InstancesNodeKey }>(primary: TNode, secondary: TNode): TNode | undefined {\n if (\n HierarchyNode.isInstancesNode(primary) &&\n HierarchyNode.isInstancesNode(secondary) &&\n primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => InstanceKey.equals(lhsKey, rhsKey)))\n ) {\n return {\n ...primary,\n key: {\n type: \"instances\",\n instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),\n },\n };\n }\n return undefined;\n}\nfunction tryMergeGenericNodes<TNode extends { key: GenericNodeKey | InstancesNodeKey }>(primary: TNode, secondary: TNode): TNode | undefined {\n if (HierarchyNode.isGeneric(primary) && HierarchyNode.isGeneric(secondary) && primary.key.type === secondary.key.type) {\n return primary;\n }\n return undefined;\n}\nfunction tryMergeNodes<TNode extends { key: GenericNodeKey | InstancesNodeKey }>(primary: TNode, secondary: TNode): TNode | undefined {\n return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodesReader.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAM,MAAM,MAAM,CAAC;AACtD,OAAO,EAAQ,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAsB,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAyC,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E,UAAU,cAAc;IACtB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,gBAAgB;AAChB,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAUxF;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,CAAC,2BAA2B,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACvD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACnD,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IACpD,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC;IACzD,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC;IAC5D,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAChD,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;IACnD,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC;CAC3D;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,2BAA2B,CAoBlG"}
1
+ {"version":3,"file":"TreeNodesReader.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAM,MAAM,MAAM,CAAC;AACtD,OAAO,EAAQ,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAsB,MAAM,4BAA4B,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAyC,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E,UAAU,cAAc;IACtB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,gBAAgB;AAChB,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAiBxF;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,CAAC,2BAA2B,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACvD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACnD,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IACpD,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC;IACzD,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC;IAC5D,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAChD,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;IACnD,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC;CAC3D;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,2BAA2B,CAoBlG"}