@itwin/presentation-hierarchies 2.0.0-alpha.13 → 2.0.0-alpha.15

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 (190) hide show
  1. package/CHANGELOG.md +132 -4
  2. package/README.md +19 -18
  3. package/lib/cjs/hierarchies/HierarchyMerge.d.ts +1 -1
  4. package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -1
  5. package/lib/cjs/hierarchies/HierarchyMerge.js +1 -1
  6. package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -1
  7. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
  8. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
  9. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  10. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
  11. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
  12. package/lib/cjs/hierarchies/HierarchyProvider.js +7 -3
  13. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
  14. package/lib/cjs/hierarchies/HierarchySearch.d.ts +24 -2
  15. package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -1
  16. package/lib/cjs/hierarchies/HierarchySearch.js +33 -16
  17. package/lib/cjs/hierarchies/HierarchySearch.js.map +1 -1
  18. package/lib/cjs/hierarchies/Logging.js +1 -1
  19. package/lib/cjs/hierarchies/Logging.js.map +1 -1
  20. package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  21. package/lib/cjs/hierarchies/imodel/HierarchyCache.js +1 -4
  22. package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +1 -1
  23. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts +35 -2
  24. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  25. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  26. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  27. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  28. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  29. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +144 -78
  30. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  31. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  32. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js +6 -7
  33. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  34. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  35. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +33 -62
  36. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  37. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  38. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
  39. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  40. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
  41. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
  42. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
  43. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  44. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +3 -5
  45. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  46. package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +1 -1
  47. package/lib/cjs/hierarchies/imodel/Utils.js +19 -7
  48. package/lib/cjs/hierarchies/imodel/Utils.js.map +1 -1
  49. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  50. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js +10 -4
  51. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  52. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  53. package/lib/cjs/hierarchies/imodel/operators/Grouping.js +32 -18
  54. package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +1 -1
  55. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  56. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js +31 -9
  57. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  58. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  59. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js +30 -14
  60. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  61. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  62. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +4 -6
  63. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  64. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  65. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js +4 -9
  66. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  67. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  68. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
  69. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  70. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  71. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
  72. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  73. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  74. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
  75. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  76. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  77. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js +3 -1
  78. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  79. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
  80. package/lib/cjs/hierarchies/internal/Common.js +2 -2
  81. package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
  82. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  83. package/lib/cjs/hierarchies/internal/EachValueFrom.js +0 -2
  84. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -1
  85. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  86. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
  87. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  88. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  89. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js +1 -4
  90. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  91. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  92. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -1
  93. package/lib/cjs/presentation-hierarchies.d.ts +3 -3
  94. package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
  95. package/lib/cjs/presentation-hierarchies.js.map +1 -1
  96. package/lib/esm/hierarchies/HierarchyMerge.d.ts +1 -1
  97. package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -1
  98. package/lib/esm/hierarchies/HierarchyMerge.js +1 -1
  99. package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -1
  100. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
  101. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
  102. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  103. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
  104. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
  105. package/lib/esm/hierarchies/HierarchyProvider.js +7 -3
  106. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
  107. package/lib/esm/hierarchies/HierarchySearch.d.ts +24 -2
  108. package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -1
  109. package/lib/esm/hierarchies/HierarchySearch.js +33 -16
  110. package/lib/esm/hierarchies/HierarchySearch.js.map +1 -1
  111. package/lib/esm/hierarchies/Logging.js +1 -1
  112. package/lib/esm/hierarchies/Logging.js.map +1 -1
  113. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  114. package/lib/esm/hierarchies/imodel/HierarchyCache.js +1 -4
  115. package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +1 -1
  116. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts +35 -2
  117. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  118. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  119. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  120. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  121. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  122. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +147 -81
  123. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  124. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  125. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js +7 -8
  126. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  127. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  128. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +34 -63
  129. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  130. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  131. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
  132. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  133. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
  134. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
  135. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
  136. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  137. package/lib/esm/hierarchies/imodel/TreeNodesReader.js +3 -5
  138. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  139. package/lib/esm/hierarchies/imodel/Utils.d.ts.map +1 -1
  140. package/lib/esm/hierarchies/imodel/Utils.js +19 -7
  141. package/lib/esm/hierarchies/imodel/Utils.js.map +1 -1
  142. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  143. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js +11 -5
  144. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  145. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  146. package/lib/esm/hierarchies/imodel/operators/Grouping.js +33 -19
  147. package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +1 -1
  148. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  149. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js +32 -10
  150. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  151. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  152. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js +31 -15
  153. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  154. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  155. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +5 -7
  156. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  157. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  158. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js +5 -10
  159. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  160. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  161. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
  162. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  163. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  164. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
  165. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  166. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  167. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
  168. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  169. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  170. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js +3 -1
  171. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  172. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
  173. package/lib/esm/hierarchies/internal/Common.js +2 -2
  174. package/lib/esm/hierarchies/internal/Common.js.map +1 -1
  175. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  176. package/lib/esm/hierarchies/internal/EachValueFrom.js +0 -2
  177. package/lib/esm/hierarchies/internal/EachValueFrom.js.map +1 -1
  178. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  179. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
  180. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  181. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  182. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js +1 -4
  183. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  184. package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  185. package/lib/esm/hierarchies/internal/operators/Partition.js.map +1 -1
  186. package/lib/esm/presentation-hierarchies.d.ts +3 -3
  187. package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
  188. package/lib/esm/presentation-hierarchies.js +3 -3
  189. package/lib/esm/presentation-hierarchies.js.map +1 -1
  190. package/package.json +15 -23
@@ -3,9 +3,9 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import "../internal/DisposePolyfill.js";
6
- import { catchError, concat, defaultIfEmpty, defer, EMPTY, filter, finalize, from, fromEventPattern, identity, map, merge, mergeAll, mergeMap, of, reduce, Subject, take, takeUntil, tap, } from "rxjs";
6
+ import { catchError, concat, defaultIfEmpty, EMPTY, filter, finalize, from, fromEventPattern, identity, map, merge, mergeAll, mergeMap, of, reduce, Subject, take, takeUntil, tap, } from "rxjs";
7
7
  import { assert, BeEvent, Guid, StopWatch } from "@itwin/core-bentley";
8
- import { createDefaultValueFormatter, formatConcatenatedValue, InstanceKey, normalizeFullClassName } from "@itwin/presentation-shared";
8
+ import { createDefaultValueFormatter, createIModelInstanceLabelSelectClauseFactory, formatConcatenatedValue, InstanceKey, normalizeFullClassName, } from "@itwin/presentation-shared";
9
9
  import { RowsLimitExceededError } from "../HierarchyErrors.js";
10
10
  import { HierarchyNode } from "../HierarchyNode.js";
11
11
  import { HierarchyNodeKey } from "../HierarchyNodeKey.js";
@@ -21,7 +21,7 @@ import { getRxjsHierarchyDefinition } from "../internal/RxjsHierarchyDefinition.
21
21
  import { SubscriptionScheduler } from "../internal/SubscriptionScheduler.js";
22
22
  import { HierarchyCache } from "./HierarchyCache.js";
23
23
  import { HierarchyNodesDefinition } from "./IModelHierarchyDefinition.js";
24
- import { NodeSelectClauseColumnNames } from "./NodeSelectQueryFactory.js";
24
+ import { createNodesQueryClauseFactory, NodeSelectClauseColumnNames } from "./NodeSelectQueryFactory.js";
25
25
  import { createDetermineChildrenOperator } from "./operators/DetermineChildren.js";
26
26
  import { createGroupingOperator } from "./operators/Grouping.js";
27
27
  import { createHideIfNoChildrenOperator } from "./operators/HideIfNoChildren.js";
@@ -75,9 +75,12 @@ class IModelHierarchyProviderImpl {
75
75
  }
76
76
  this.#componentId = Guid.createValue();
77
77
  this.#componentName = "IModelHierarchyProviderImpl";
78
- /* c8 ignore next */
79
78
  this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
80
- this._imodels = props.imodels;
79
+ this._imodels = props.imodels.map(({ imodelAccess, imodelChanged }) => {
80
+ const instanceLabelSelectClauseFactory = createIModelInstanceLabelSelectClauseFactory({ imodelAccess });
81
+ const nodeSelectClauseFactory = createNodesQueryClauseFactory({ imodelAccess, instanceLabelSelectClauseFactory });
82
+ return { imodelAccess, imodelChanged, instanceLabelSelectClauseFactory, nodeSelectClauseFactory };
83
+ });
81
84
  this._hierarchyChanged = new BeEvent();
82
85
  this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);
83
86
  this._valuesFormatter = props.formatter ?? createDefaultValueFormatter();
@@ -110,7 +113,7 @@ class IModelHierarchyProviderImpl {
110
113
  this._dispose.next();
111
114
  this._unsubscribe?.();
112
115
  }
113
- /* c8 ignore next 3 */
116
+ /* v8 ignore next -- @preserve */
114
117
  dispose() {
115
118
  this[Symbol.dispose]();
116
119
  }
@@ -129,9 +132,10 @@ class IModelHierarchyProviderImpl {
129
132
  return this._imodels[this._imodels.length - 1].imodelAccess;
130
133
  }
131
134
  invalidateHierarchyCache(reason) {
135
+ /* v8 ignore next -- @preserve */
132
136
  doLog({
133
137
  category: `${LOGGING_NAMESPACE}.Events`,
134
- message: /* c8 ignore next */ () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),
138
+ message: () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),
135
139
  });
136
140
  this._nodesCache?.clear();
137
141
  }
@@ -167,13 +171,17 @@ class IModelHierarchyProviderImpl {
167
171
  }
168
172
  createHierarchyLevelDefinitionsObservable(props) {
169
173
  const { requestContext, ...defineHierarchyLevelProps } = props;
174
+ /* v8 ignore next -- @preserve */
170
175
  doLog({
171
176
  category: LOGGING_NAMESPACE_PERFORMANCE,
172
- message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
177
+ message: () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
173
178
  });
174
- return from(this._imodels).pipe(mergeMap(({ imodelAccess }, imodelAccessIndex) => {
179
+ return from(this._imodels).pipe(mergeMap(({ imodelAccess, instanceLabelSelectClauseFactory, nodeSelectClauseFactory }, imodelAccessIndex) => {
175
180
  let parentNode = props.parentNode;
176
- if (parentNode && HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this.#sourceName) {
181
+ if (parentNode &&
182
+ HierarchyNode.isGeneric(parentNode) &&
183
+ parentNode.key.source &&
184
+ parentNode.key.source !== this.#sourceName) {
177
185
  return EMPTY;
178
186
  }
179
187
  if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {
@@ -189,38 +197,65 @@ class IModelHierarchyProviderImpl {
189
197
  return EMPTY;
190
198
  }
191
199
  }
192
- return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode, imodelAccess }).pipe(mergeAll(), map(
200
+ return this._activeHierarchyDefinition
201
+ .defineHierarchyLevel({
202
+ ...defineHierarchyLevelProps,
203
+ parentNode,
204
+ imodelAccess,
205
+ instanceLabelSelectClauseFactory,
206
+ nodeSelectClauseFactory,
207
+ })
208
+ .pipe(mergeAll(), map(
193
209
  /* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
194
210
  (hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
195
- }), finalize(() => doLog({
196
- category: LOGGING_NAMESPACE_PERFORMANCE,
197
- message: /* c8 ignore next */ () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
198
- })));
211
+ }), finalize(() => {
212
+ /* v8 ignore next -- @preserve */
213
+ doLog({
214
+ category: LOGGING_NAMESPACE_PERFORMANCE,
215
+ message: () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
216
+ });
217
+ }));
199
218
  }
200
219
  createSourceNodesObservable(props) {
201
- // pipe definitions to nodes and put "share replay" on it
202
- return this.createHierarchyLevelDefinitionsObservable(props).pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => defer(() => {
220
+ const createSourceNodesFromDefinition = (imodelAccess, def) => {
203
221
  if (HierarchyNodesDefinition.isGenericNode(def)) {
204
- return of({
205
- ...def.node,
206
- key: { type: "generic", id: def.node.key, source: this.#sourceName },
207
- });
222
+ return of({ ...def.node, key: { type: "generic", id: def.node.key, source: this.#sourceName } });
208
223
  }
209
- return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(of(def.query).pipe(map((query) => createInstanceKeysFilteredQuery(query, props.targetInstanceKeys)), mergeMap((query) => readNodes({
224
+ const query = createInstanceKeysFilteredQuery(def.query, props.targetInstanceKeys);
225
+ return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(readNodes({
210
226
  queryExecutor: imodelAccess,
211
227
  query,
212
228
  limit: props.hierarchyLevelSizeLimit,
213
229
  parser: this._activeHierarchyDefinition.parseNode
214
- ? ({ row }) => this._activeHierarchyDefinition.parseNode({ row, parentNode: props.parentNode, imodelKey: imodelAccess.imodelKey })
230
+ ? ({ row }) => this._activeHierarchyDefinition.parseNode({
231
+ row,
232
+ parentNode: props.parentNode,
233
+ imodelKey: imodelAccess.imodelKey,
234
+ })
215
235
  : undefined,
216
- })), map((node) => ({
236
+ }).pipe(map((node) => ({
217
237
  ...node,
218
- key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })) },
238
+ key: {
239
+ ...node.key,
240
+ instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })),
241
+ },
219
242
  }))));
220
- }).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, map(({ node }) => node), finalize(() => doLog({
221
- category: LOGGING_NAMESPACE_PERFORMANCE,
222
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,
223
- })), shareReplayWithErrors());
243
+ };
244
+ const definitions = this.createHierarchyLevelDefinitionsObservable(props);
245
+ let sourceNodes;
246
+ if (this._imodels.length === 1) {
247
+ sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def)));
248
+ }
249
+ else {
250
+ sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, map(({ node }) => node));
251
+ }
252
+ return sourceNodes.pipe(finalize(() => {
253
+ /* v8 ignore next -- @preserve */
254
+ doLog({
255
+ category: LOGGING_NAMESPACE_PERFORMANCE,
256
+ message: () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,
257
+ });
258
+ }), shareReplayWithErrors());
224
259
  }
225
260
  createPreProcessedNodesObservable(queryNodesObservable, props) {
226
261
  return queryNodesObservable.pipe(
@@ -236,16 +271,22 @@ class IModelHierarchyProviderImpl {
236
271
  // process hiding
237
272
  createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), createHideNodesInHierarchyOperator(
238
273
  // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)
239
- (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() => doLog({
240
- category: LOGGING_NAMESPACE_PERFORMANCE,
241
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
242
- })));
274
+ (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() => {
275
+ /* v8 ignore next -- @preserve */
276
+ doLog({
277
+ category: LOGGING_NAMESPACE_PERFORMANCE,
278
+ message: () => `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
279
+ });
280
+ }));
243
281
  }
244
282
  createProcessedNodesObservable(preprocessedNodesObservable, props) {
245
- return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() => doLog({
246
- category: LOGGING_NAMESPACE_PERFORMANCE,
247
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
248
- })));
283
+ return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() => {
284
+ /* v8 ignore next -- @preserve */
285
+ doLog({
286
+ category: LOGGING_NAMESPACE_PERFORMANCE,
287
+ message: () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
288
+ });
289
+ }));
249
290
  }
250
291
  createFinalizedNodesObservable(processedNodesObservable, props) {
251
292
  return processedNodesObservable.pipe(createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition, props.parentNode), sortNodesByLabelOperator, map((n) => {
@@ -253,35 +294,44 @@ class IModelHierarchyProviderImpl {
253
294
  delete n.processingParams;
254
295
  }
255
296
  return { ...n, children: hasChildren(n) };
256
- }), takeUntil(this._dispose), finalize(() => doLog({
257
- category: LOGGING_NAMESPACE_PERFORMANCE,
258
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
259
- })));
297
+ }), takeUntil(this._dispose), finalize(() => {
298
+ /* v8 ignore next -- @preserve */
299
+ doLog({
300
+ category: LOGGING_NAMESPACE_PERFORMANCE,
301
+ message: () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
302
+ });
303
+ }));
260
304
  }
261
305
  createHasNodesObservable(preprocessedNodesObservable, possiblyKnownChildrenObservable, props) {
262
306
  const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;
263
- return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(log({
307
+ return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
308
+ /* v8 ignore next -- @preserve */
309
+ log({
264
310
  category: loggingCategory,
265
- message: /* c8 ignore next */ (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,
311
+ message: (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,
266
312
  }), take(1), map(() => true), defaultIfEmpty(false), catchError((e) => {
313
+ /* v8 ignore next -- @preserve */
267
314
  doLog({
268
315
  category: loggingCategory,
269
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,
316
+ message: () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,
270
317
  });
271
318
  if (e instanceof RowsLimitExceededError) {
272
319
  return of(true);
273
320
  }
274
321
  throw e;
275
- }), log({ category: loggingCategory, message: /* c8 ignore next */ (r) => `[${props.requestContext.requestId}] Result: ${r}` }));
322
+ }),
323
+ /* v8 ignore next -- @preserve */
324
+ log({ category: loggingCategory, message: (r) => `[${props.requestContext.requestId}] Result: ${r}` }));
276
325
  }
277
326
  getCachedObservableEntry(props) {
278
327
  const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;
279
328
  const { parentNode, ...restProps } = props;
280
329
  const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);
281
330
  if (cached) {
331
+ /* v8 ignore next -- @preserve */
282
332
  doLog({
283
333
  category: loggingCategory,
284
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
334
+ message: () => `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
285
335
  });
286
336
  return cached;
287
337
  }
@@ -305,11 +355,15 @@ class IModelHierarchyProviderImpl {
305
355
  parentNode: parentNonGroupingNode,
306
356
  ...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
307
357
  };
308
- const value = { observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: "none" };
358
+ const value = {
359
+ observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps),
360
+ processingStatus: "none",
361
+ };
309
362
  this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
363
+ /* v8 ignore next -- @preserve */
310
364
  doLog({
311
365
  category: loggingCategory,
312
- message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
366
+ message: () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
313
367
  });
314
368
  return value;
315
369
  }
@@ -344,18 +398,19 @@ class IModelHierarchyProviderImpl {
344
398
  const timer = new StopWatch(undefined, true);
345
399
  let error;
346
400
  let nodesCount = 0;
401
+ /* v8 ignore next -- @preserve */
347
402
  doLog({
348
403
  category: loggingCategory,
349
- message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
404
+ message: () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
350
405
  });
351
406
  return eachValueFrom(this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(tap(() => ++nodesCount), catchError((e) => {
352
407
  error = e;
353
408
  throw e;
354
409
  }), finalize(() => {
410
+ /* v8 ignore next -- @preserve */
355
411
  doLog({
356
412
  category: loggingCategory,
357
- message: /* c8 ignore next */ () =>
358
- /* c8 ignore next 3 */ error
413
+ message: () => error
359
414
  ? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
360
415
  : `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
361
416
  });
@@ -368,7 +423,11 @@ class IModelHierarchyProviderImpl {
368
423
  }
369
424
  assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));
370
425
  // split the definitions based on whether they're for generic nodes or for instance nodes
371
- const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
426
+ const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
427
+ parentNode,
428
+ instanceFilter,
429
+ requestContext,
430
+ });
372
431
  const [instanceDefs, genericDefs] = partition(hierarchyLevelDefinitions, (x) => HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
373
432
  // query instance keys and a flag whether they should be hidden
374
433
  const instanceKeys = instanceDefs.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(of(def.query).pipe(mergeMap(async (query) => {
@@ -411,11 +470,7 @@ class IModelHierarchyProviderImpl {
411
470
  mergeMap((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
412
471
  type: "instances",
413
472
  instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
414
- }))))).pipe(map((key) => ({
415
- key,
416
- parentKeys: [],
417
- label: "",
418
- })));
473
+ }))))).pipe(map((key) => ({ key, parentKeys: [], label: "" })));
419
474
  // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels
420
475
  return merge(visibleNodeInstanceKeys.pipe(map(({ key }) => key)), hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext })))).pipe(takeUntil(this._dispose));
421
476
  }
@@ -427,9 +482,10 @@ class IModelHierarchyProviderImpl {
427
482
  const requestContext = { requestId: Guid.createValue() };
428
483
  const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;
429
484
  const timer = new StopWatch(undefined, true);
485
+ /* v8 ignore next -- @preserve */
430
486
  doLog({
431
487
  category: loggingCategory,
432
- message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,
488
+ message: () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,
433
489
  });
434
490
  let error;
435
491
  let keysCount = 0;
@@ -437,10 +493,10 @@ class IModelHierarchyProviderImpl {
437
493
  error = e;
438
494
  throw e;
439
495
  }), finalize(() => {
496
+ /* v8 ignore next -- @preserve */
440
497
  doLog({
441
498
  category: loggingCategory,
442
- message: /* c8 ignore next */ () =>
443
- /* c8 ignore next 3 */ error
499
+ message: () => error
444
500
  ? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
445
501
  : `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
446
502
  });
@@ -457,13 +513,7 @@ function processNodes(processor, parentNode) {
457
513
  return (nodes) => nodes.pipe(mergeMap((node) => processor({ node, parentNode })));
458
514
  }
459
515
  function applyLabelsFormatting(node, valueFormatter) {
460
- return from(formatConcatenatedValue({
461
- value: node.label,
462
- valueFormatter,
463
- })).pipe(map((label) => ({
464
- ...node,
465
- label,
466
- })));
516
+ return from(formatConcatenatedValue({ value: node.label, valueFormatter })).pipe(map((label) => ({ ...node, label })));
467
517
  }
468
518
  function createParentNodeKeysList(parentNode) {
469
519
  if (!parentNode) {
@@ -476,6 +526,8 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
476
526
  return query;
477
527
  }
478
528
  const MAX_ALLOWED_BINDINGS = 1000;
529
+ // TODO: MISSING_COVERAGE
530
+ /* v8 ignore else -- @preserve */
479
531
  if (targetInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
480
532
  return {
481
533
  ...query,
@@ -484,10 +536,13 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
484
536
  FROM (${query.ecsql}) q
485
537
  WHERE q.ECInstanceId IN (${targetInstanceKeys.map(() => "?").join(",")})
486
538
  `,
487
- bindings: [...(query.bindings ?? []), ...targetInstanceKeys.map((k) => ({ type: "id", value: k.id }))],
539
+ bindings: [
540
+ ...(query.bindings ?? []),
541
+ ...targetInstanceKeys.map((k) => ({ type: "id", value: k.id })),
542
+ ],
488
543
  };
489
544
  }
490
- /* c8 ignore start */
545
+ /* v8 ignore start */
491
546
  return {
492
547
  ...query,
493
548
  ecsql: `
@@ -497,8 +552,10 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
497
552
  `,
498
553
  bindings: [...(query.bindings ?? []), { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
499
554
  };
500
- /* c8 ignore end */
555
+ /* v8 ignore stop */
501
556
  }
557
+ // TODO: MISSING_COVERAGE
558
+ /* v8 ignore start */
502
559
  function mergeNodes(source) {
503
560
  return from(source).pipe(reduce((acc, input) => {
504
561
  for (let i = 0; i < acc.length; ++i) {
@@ -509,11 +566,25 @@ function mergeNodes(source) {
509
566
  // the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
510
567
  // the node with higher `imodelAccessIndex` first
511
568
  const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
512
- ? { imodelAccess: input.imodelAccess, imodelAccessIndex: input.imodelAccessIndex, primary: input.node, secondary: acc[i].node }
513
- : { imodelAccess: acc[i].imodelAccess, imodelAccessIndex: acc[i].imodelAccessIndex, primary: acc[i].node, secondary: input.node };
569
+ ? {
570
+ imodelAccess: input.imodelAccess,
571
+ imodelAccessIndex: input.imodelAccessIndex,
572
+ primary: input.node,
573
+ secondary: acc[i].node,
574
+ }
575
+ : {
576
+ imodelAccess: acc[i].imodelAccess,
577
+ imodelAccessIndex: acc[i].imodelAccessIndex,
578
+ primary: acc[i].node,
579
+ secondary: input.node,
580
+ };
514
581
  const merged = tryMergeNodes(candidates.primary, candidates.secondary);
515
582
  if (merged) {
516
- acc[i] = { node: merged, imodelAccess: candidates.imodelAccess, imodelAccessIndex: candidates.imodelAccessIndex };
583
+ acc[i] = {
584
+ node: merged,
585
+ imodelAccess: candidates.imodelAccess,
586
+ imodelAccessIndex: candidates.imodelAccessIndex,
587
+ };
517
588
  return acc;
518
589
  }
519
590
  }
@@ -557,10 +628,7 @@ function tryMergeInstanceNodes(primary, secondary) {
557
628
  primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => InstanceKey.equals(lhsKey, rhsKey)))) {
558
629
  return {
559
630
  ...primary,
560
- key: {
561
- type: "instances",
562
- instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
563
- },
631
+ key: { type: "instances", instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys) },
564
632
  ...mergeBaseNodeAttributes(primary, secondary),
565
633
  };
566
634
  }
@@ -568,14 +636,12 @@ function tryMergeInstanceNodes(primary, secondary) {
568
636
  }
569
637
  function tryMergeGenericNodes(primary, secondary) {
570
638
  if (HierarchyNode.isGeneric(primary) && HierarchyNode.isGeneric(secondary) && primary.key.id === secondary.key.id) {
571
- return {
572
- ...primary,
573
- ...mergeBaseNodeAttributes(primary, secondary),
574
- };
639
+ return { ...primary, ...mergeBaseNodeAttributes(primary, secondary) };
575
640
  }
576
641
  return undefined;
577
642
  }
578
643
  function tryMergeNodes(primary, secondary) {
579
644
  return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
580
645
  }
646
+ /* v8 ignore stop */
581
647
  //# sourceMappingURL=IModelHierarchyProvider.js.map