@itwin/presentation-hierarchies 2.0.0-alpha.1 → 2.0.0-alpha.11

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 (294) hide show
  1. package/CHANGELOG.md +356 -8
  2. package/README.md +4 -22
  3. package/lib/cjs/hierarchies/HierarchyMerge.d.ts +19 -0
  4. package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -0
  5. package/lib/cjs/hierarchies/HierarchyMerge.js +43 -0
  6. package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -0
  7. package/lib/cjs/hierarchies/HierarchyNode.d.ts +17 -26
  8. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
  9. package/lib/cjs/hierarchies/HierarchyNode.js +1 -21
  10. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
  11. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.d.ts +1 -1
  12. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.d.ts.map +1 -1
  13. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.js.map +1 -1
  14. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  15. package/lib/cjs/hierarchies/HierarchyNodeKey.js +8 -8
  16. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
  17. package/lib/cjs/hierarchies/HierarchyProvider.d.ts +58 -33
  18. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
  19. package/lib/cjs/hierarchies/HierarchyProvider.js +46 -30
  20. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
  21. package/lib/cjs/hierarchies/HierarchySearch.d.ts +169 -0
  22. package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -0
  23. package/lib/cjs/hierarchies/HierarchySearch.js +259 -0
  24. package/lib/cjs/hierarchies/HierarchySearch.js.map +1 -0
  25. package/lib/cjs/hierarchies/Logging.d.ts +1 -1
  26. package/lib/cjs/hierarchies/Logging.d.ts.map +1 -1
  27. package/lib/cjs/hierarchies/Logging.js.map +1 -1
  28. package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts +1 -1
  29. package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  30. package/lib/cjs/hierarchies/imodel/HierarchyCache.js +3 -3
  31. package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +1 -1
  32. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts +30 -9
  33. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  34. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  35. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts +3 -3
  36. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  37. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  38. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts +50 -15
  39. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  40. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +203 -76
  41. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  42. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts +1 -1
  43. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  44. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  45. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts +5 -5
  46. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  47. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +102 -43
  48. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  49. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts +4 -4
  50. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  51. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  52. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts +35 -0
  53. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
  54. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js +285 -0
  55. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
  56. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts +9 -11
  57. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  58. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +15 -6
  59. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  60. package/lib/cjs/hierarchies/imodel/Utils.d.ts +1 -1
  61. package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +1 -1
  62. package/lib/cjs/hierarchies/imodel/Utils.js.map +1 -1
  63. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts +2 -2
  64. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  65. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  66. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts +5 -5
  67. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  68. package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +1 -1
  69. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts +1 -1
  70. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  71. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js +1 -0
  72. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  73. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts +1 -1
  74. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  75. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  76. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.d.ts +1 -1
  77. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.d.ts.map +1 -1
  78. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.js.map +1 -1
  79. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts +4 -4
  80. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  81. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +6 -5
  82. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  83. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts +4 -4
  84. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  85. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js +4 -3
  86. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  87. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts +1 -1
  88. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  89. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  90. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts +2 -2
  91. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  92. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  93. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts +4 -4
  94. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  95. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +22 -17
  96. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  97. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts +2 -2
  98. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  99. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  100. package/lib/cjs/hierarchies/internal/Common.d.ts +5 -2
  101. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
  102. package/lib/cjs/hierarchies/internal/Common.js +12 -1
  103. package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
  104. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts +1 -1
  105. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  106. package/lib/cjs/hierarchies/internal/EachValueFrom.js +3 -0
  107. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -1
  108. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts +1 -1
  109. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts.map +1 -1
  110. package/lib/cjs/hierarchies/internal/LoggingUtils.js.map +1 -1
  111. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts +19 -8
  112. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  113. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +6 -5
  114. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  115. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts +1 -1
  116. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  117. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  118. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts +2 -1
  119. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  120. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -1
  121. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts +1 -1
  122. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  123. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -1
  124. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts +1 -1
  125. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  126. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -1
  127. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.d.ts +1 -1
  128. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +1 -1
  129. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -1
  130. package/lib/cjs/hierarchies/internal/operators/Sorting.d.ts +1 -1
  131. package/lib/cjs/hierarchies/internal/operators/Sorting.d.ts.map +1 -1
  132. package/lib/cjs/hierarchies/internal/operators/Sorting.js.map +1 -1
  133. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts +1 -1
  134. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts.map +1 -1
  135. package/lib/cjs/hierarchies/internal/operators/TapOnce.js.map +1 -1
  136. package/lib/cjs/presentation-hierarchies.d.ts +22 -11
  137. package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
  138. package/lib/cjs/presentation-hierarchies.js +8 -6
  139. package/lib/cjs/presentation-hierarchies.js.map +1 -1
  140. package/lib/esm/hierarchies/HierarchyMerge.d.ts +19 -0
  141. package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -0
  142. package/lib/esm/hierarchies/HierarchyMerge.js +40 -0
  143. package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -0
  144. package/lib/esm/hierarchies/HierarchyNode.d.ts +17 -26
  145. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
  146. package/lib/esm/hierarchies/HierarchyNode.js +1 -21
  147. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
  148. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts +1 -1
  149. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts.map +1 -1
  150. package/lib/esm/hierarchies/HierarchyNodeIdentifier.js.map +1 -1
  151. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  152. package/lib/esm/hierarchies/HierarchyNodeKey.js +9 -9
  153. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
  154. package/lib/esm/hierarchies/HierarchyProvider.d.ts +58 -33
  155. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
  156. package/lib/esm/hierarchies/HierarchyProvider.js +45 -29
  157. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
  158. package/lib/esm/hierarchies/HierarchySearch.d.ts +169 -0
  159. package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -0
  160. package/lib/esm/hierarchies/HierarchySearch.js +254 -0
  161. package/lib/esm/hierarchies/HierarchySearch.js.map +1 -0
  162. package/lib/esm/hierarchies/Logging.d.ts +1 -1
  163. package/lib/esm/hierarchies/Logging.d.ts.map +1 -1
  164. package/lib/esm/hierarchies/Logging.js.map +1 -1
  165. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts +1 -1
  166. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  167. package/lib/esm/hierarchies/imodel/HierarchyCache.js +3 -3
  168. package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +1 -1
  169. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts +30 -9
  170. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  171. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  172. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts +3 -3
  173. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  174. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  175. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts +50 -15
  176. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  177. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +204 -78
  178. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  179. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts +1 -1
  180. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  181. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js +1 -1
  182. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  183. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts +5 -5
  184. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  185. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +104 -45
  186. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  187. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts +4 -4
  188. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  189. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  190. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts +35 -0
  191. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
  192. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js +279 -0
  193. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
  194. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts +9 -11
  195. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  196. package/lib/esm/hierarchies/imodel/TreeNodesReader.js +13 -5
  197. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  198. package/lib/esm/hierarchies/imodel/Utils.d.ts +1 -1
  199. package/lib/esm/hierarchies/imodel/Utils.d.ts.map +1 -1
  200. package/lib/esm/hierarchies/imodel/Utils.js.map +1 -1
  201. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts +2 -2
  202. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  203. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  204. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts +5 -5
  205. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  206. package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +1 -1
  207. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts +1 -1
  208. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  209. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js +1 -0
  210. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  211. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts +1 -1
  212. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  213. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  214. package/lib/esm/hierarchies/imodel/operators/grouping/AutoExpand.d.ts +1 -1
  215. package/lib/esm/hierarchies/imodel/operators/grouping/AutoExpand.d.ts.map +1 -1
  216. package/lib/esm/hierarchies/imodel/operators/grouping/AutoExpand.js.map +1 -1
  217. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts +4 -4
  218. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  219. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +7 -6
  220. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  221. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts +4 -4
  222. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  223. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js +5 -4
  224. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  225. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts +1 -1
  226. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  227. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  228. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts +2 -2
  229. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  230. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  231. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts +4 -4
  232. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  233. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +23 -18
  234. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  235. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts +2 -2
  236. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  237. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  238. package/lib/esm/hierarchies/internal/Common.d.ts +5 -2
  239. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
  240. package/lib/esm/hierarchies/internal/Common.js +11 -1
  241. package/lib/esm/hierarchies/internal/Common.js.map +1 -1
  242. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts +1 -1
  243. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  244. package/lib/esm/hierarchies/internal/EachValueFrom.js +3 -0
  245. package/lib/esm/hierarchies/internal/EachValueFrom.js.map +1 -1
  246. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts +1 -1
  247. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts.map +1 -1
  248. package/lib/esm/hierarchies/internal/LoggingUtils.js.map +1 -1
  249. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts +19 -8
  250. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  251. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +7 -6
  252. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  253. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts +1 -1
  254. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  255. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  256. package/lib/esm/hierarchies/internal/operators/Partition.d.ts +2 -1
  257. package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  258. package/lib/esm/hierarchies/internal/operators/Partition.js.map +1 -1
  259. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts +1 -1
  260. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  261. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -1
  262. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts +1 -1
  263. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  264. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -1
  265. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts +1 -1
  266. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +1 -1
  267. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -1
  268. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts +1 -1
  269. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts.map +1 -1
  270. package/lib/esm/hierarchies/internal/operators/Sorting.js.map +1 -1
  271. package/lib/esm/hierarchies/internal/operators/TapOnce.d.ts +1 -1
  272. package/lib/esm/hierarchies/internal/operators/TapOnce.d.ts.map +1 -1
  273. package/lib/esm/hierarchies/internal/operators/TapOnce.js.map +1 -1
  274. package/lib/esm/presentation-hierarchies.d.ts +22 -11
  275. package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
  276. package/lib/esm/presentation-hierarchies.js +7 -6
  277. package/lib/esm/presentation-hierarchies.js.map +1 -1
  278. package/package.json +19 -19
  279. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts +0 -110
  280. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +0 -1
  281. package/lib/cjs/hierarchies/HierarchyFiltering.js +0 -215
  282. package/lib/cjs/hierarchies/HierarchyFiltering.js.map +0 -1
  283. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +0 -36
  284. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
  285. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js +0 -274
  286. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
  287. package/lib/esm/hierarchies/HierarchyFiltering.d.ts +0 -110
  288. package/lib/esm/hierarchies/HierarchyFiltering.d.ts.map +0 -1
  289. package/lib/esm/hierarchies/HierarchyFiltering.js +0 -210
  290. package/lib/esm/hierarchies/HierarchyFiltering.js.map +0 -1
  291. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +0 -36
  292. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
  293. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js +0 -268
  294. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
@@ -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");
@@ -12,6 +13,7 @@ const presentation_shared_1 = require("@itwin/presentation-shared");
12
13
  const HierarchyErrors_js_1 = require("../HierarchyErrors.js");
13
14
  const HierarchyNode_js_1 = require("../HierarchyNode.js");
14
15
  const HierarchyNodeKey_js_1 = require("../HierarchyNodeKey.js");
16
+ const HierarchySearch_js_1 = require("../HierarchySearch.js");
15
17
  const Common_js_1 = require("../internal/Common.js");
16
18
  const EachValueFrom_js_1 = require("../internal/EachValueFrom.js");
17
19
  const LoggingUtils_js_1 = require("../internal/LoggingUtils.js");
@@ -21,7 +23,6 @@ const ShareReplayWithErrors_js_1 = require("../internal/operators/ShareReplayWit
21
23
  const Sorting_js_1 = require("../internal/operators/Sorting.js");
22
24
  const RxjsHierarchyDefinition_js_1 = require("../internal/RxjsHierarchyDefinition.js");
23
25
  const SubscriptionScheduler_js_1 = require("../internal/SubscriptionScheduler.js");
24
- const FilteringHierarchyDefinition_js_1 = require("./FilteringHierarchyDefinition.js");
25
26
  const HierarchyCache_js_1 = require("./HierarchyCache.js");
26
27
  const IModelHierarchyDefinition_js_1 = require("./IModelHierarchyDefinition.js");
27
28
  const NodeSelectQueryFactory_js_1 = require("./NodeSelectQueryFactory.js");
@@ -29,6 +30,7 @@ const DetermineChildren_js_1 = require("./operators/DetermineChildren.js");
29
30
  const Grouping_js_1 = require("./operators/Grouping.js");
30
31
  const HideIfNoChildren_js_1 = require("./operators/HideIfNoChildren.js");
31
32
  const HideNodesInHierarchy_js_1 = require("./operators/HideNodesInHierarchy.js");
33
+ const SearchHierarchyDefinition_js_1 = require("./SearchHierarchyDefinition.js");
32
34
  const TreeNodesReader_js_1 = require("./TreeNodesReader.js");
33
35
  const LOGGING_NAMESPACE = `${Common_js_1.LOGGING_NAMESPACE}.IModelHierarchyProvider`;
34
36
  const LOGGING_NAMESPACE_INTERNAL = `${Common_js_1.LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;
@@ -36,33 +38,57 @@ const LOGGING_NAMESPACE_PERFORMANCE = `${Common_js_1.LOGGING_NAMESPACE_PERFORMAN
36
38
  const DEFAULT_QUERY_CONCURRENCY = 10;
37
39
  const DEFAULT_QUERY_CACHE_SIZE = 1;
38
40
  /**
39
- * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and
41
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and
40
42
  * a hierarchy definition, which defines each hierarchy level through ECSQL queries.
41
43
  *
42
44
  * @public
43
45
  */
44
46
  function createIModelHierarchyProvider(props) {
47
+ const { imodelAccess, imodelChanged, ...restProps } = props;
48
+ return createMergedIModelHierarchyProvider({ ...restProps, imodels: [{ imodelAccess, imodelChanged }] });
49
+ }
50
+ /**
51
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
52
+ * and a hierarchy definition, which defines each hierarchy level through ECSQL queries.
53
+ *
54
+ * **Warning:** This is an experimental API that **should not be used in production**.
55
+ *
56
+ * @alpha
57
+ */
58
+ function createMergedIModelHierarchyProvider(props) {
45
59
  return new IModelHierarchyProviderImpl(props);
46
60
  }
47
61
  class IModelHierarchyProviderImpl {
48
- _imodelAccess;
62
+ _imodels;
49
63
  _hierarchyChanged;
50
64
  _valuesFormatter;
51
65
  _sourceHierarchyDefinition;
52
66
  _activeHierarchyDefinition;
53
67
  _localizedStrings;
54
- _queryScheduler;
68
+ _queryConcurrency;
69
+ _querySchedulers;
55
70
  _nodesCache;
56
71
  _unsubscribe;
57
72
  _dispose = new rxjs_1.Subject();
73
+ #componentId;
74
+ #componentName;
75
+ #sourceName;
58
76
  constructor(props) {
59
- this._imodelAccess = props.imodelAccess;
77
+ if (props.imodels.length === 0) {
78
+ throw new Error(`Creating an iModel hierarchy provider requires at least one iModel.`);
79
+ }
80
+ this.#componentId = core_bentley_1.Guid.createValue();
81
+ this.#componentName = "IModelHierarchyProviderImpl";
82
+ /* c8 ignore next */
83
+ this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
84
+ this._imodels = props.imodels;
60
85
  this._hierarchyChanged = new core_bentley_1.BeEvent();
61
86
  this._activeHierarchyDefinition = this._sourceHierarchyDefinition = (0, RxjsHierarchyDefinition_js_1.getRxjsHierarchyDefinition)(props.hierarchyDefinition);
62
- this._valuesFormatter = props?.formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
63
- this._localizedStrings = { other: "Other", unspecified: "Not specified", ...props?.localizedStrings };
64
- this._queryScheduler = new SubscriptionScheduler_js_1.SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);
65
- this.setHierarchyFilter(props.filtering);
87
+ this._valuesFormatter = props.formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
88
+ this._localizedStrings = { other: "Other", unspecified: "Not specified", ...props.localizedStrings };
89
+ this._queryConcurrency = props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY;
90
+ this._querySchedulers = new Map();
91
+ this.setHierarchySearch(props.search);
66
92
  const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;
67
93
  if (queryCacheSize !== 0) {
68
94
  this._nodesCache = new HierarchyCache_js_1.HierarchyCache({
@@ -71,11 +97,18 @@ class IModelHierarchyProviderImpl {
71
97
  variationsCount: 1,
72
98
  });
73
99
  }
74
- this._unsubscribe = props.imodelChanged?.addListener(() => {
75
- this.invalidateHierarchyCache("Data source changed");
100
+ const imodelChangeSubscription = (0, rxjs_1.from)(this._imodels)
101
+ .pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelChanged }) => imodelChanged
102
+ ? (0, rxjs_1.fromEventPattern)((handler) => imodelChanged.addListener(handler), (handler) => imodelChanged.removeListener(handler), () => imodelAccess)
103
+ : rxjs_1.EMPTY))
104
+ .subscribe(({ imodelKey }) => {
105
+ this.invalidateHierarchyCache(`Data source changed: "${imodelKey}"`);
76
106
  this._dispose.next();
77
- this._hierarchyChanged.raiseEvent();
107
+ this._hierarchyChanged.raiseEvent({});
78
108
  });
109
+ this._unsubscribe = () => {
110
+ imodelChangeSubscription.unsubscribe();
111
+ };
79
112
  }
80
113
  [Symbol.dispose]() {
81
114
  this._dispose.next();
@@ -88,6 +121,17 @@ class IModelHierarchyProviderImpl {
88
121
  get hierarchyChanged() {
89
122
  return this._hierarchyChanged;
90
123
  }
124
+ getQueryScheduler(imodelKey) {
125
+ let scheduler = this._querySchedulers.get(imodelKey);
126
+ if (!scheduler) {
127
+ scheduler = new SubscriptionScheduler_js_1.SubscriptionScheduler(this._queryConcurrency);
128
+ this._querySchedulers.set(imodelKey, scheduler);
129
+ }
130
+ return scheduler;
131
+ }
132
+ getPrimaryIModelAccess() {
133
+ return this._imodels[this._imodels.length - 1].imodelAccess;
134
+ }
91
135
  invalidateHierarchyCache(reason) {
92
136
  (0, LoggingUtils_js_1.doLog)({
93
137
  category: `${LOGGING_NAMESPACE}.Events`,
@@ -103,23 +147,24 @@ class IModelHierarchyProviderImpl {
103
147
  this._valuesFormatter = formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
104
148
  this._hierarchyChanged.raiseEvent({ formatterChange: { newFormatter: this._valuesFormatter } });
105
149
  }
106
- setHierarchyFilter(props) {
150
+ setHierarchySearch(props) {
107
151
  if (!props) {
108
152
  if (this._sourceHierarchyDefinition !== this._activeHierarchyDefinition) {
109
153
  this._activeHierarchyDefinition = this._sourceHierarchyDefinition;
110
- this.invalidateHierarchyCache("Hierarchy filter reset");
154
+ this.invalidateHierarchyCache("Hierarchy search reset");
111
155
  }
112
- this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: undefined } });
156
+ this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: undefined } });
113
157
  return;
114
158
  }
115
- this._activeHierarchyDefinition = new FilteringHierarchyDefinition_js_1.FilteringHierarchyDefinition({
116
- imodelAccess: this._imodelAccess,
159
+ this._activeHierarchyDefinition = new SearchHierarchyDefinition_js_1.SearchHierarchyDefinition({
160
+ imodelAccess: this.getPrimaryIModelAccess(),
117
161
  source: this._sourceHierarchyDefinition,
118
- nodeIdentifierPaths: props.paths,
162
+ sourceName: this.#sourceName,
163
+ targetPaths: props.paths,
119
164
  });
120
- this.invalidateHierarchyCache("Hierarchy filter set");
165
+ this.invalidateHierarchyCache("Hierarchy search set");
121
166
  this._dispose.next();
122
- this._hierarchyChanged.raiseEvent({ filterChange: { newFilter: props } });
167
+ this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: props } });
123
168
  }
124
169
  onGroupingNodeCreated(groupingNode, props) {
125
170
  this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: (0, rxjs_1.from)(groupingNode.children), processingStatus: "pre-processed" });
@@ -130,44 +175,53 @@ class IModelHierarchyProviderImpl {
130
175
  category: LOGGING_NAMESPACE_PERFORMANCE,
131
176
  message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
132
177
  });
133
- let parentNode = props.parentNode;
134
- if (parentNode && HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this._imodelAccess.imodelKey) {
135
- return rxjs_1.EMPTY;
136
- }
137
- if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
138
- parentNode = {
139
- ...parentNode,
140
- key: {
141
- ...parentNode.key,
142
- instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === this._imodelAccess.imodelKey),
143
- },
144
- };
145
- (0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
146
- if (parentNode.key.instanceKeys.length === 0) {
178
+ return (0, rxjs_1.from)(this._imodels).pipe((0, rxjs_1.mergeMap)(({ imodelAccess }, imodelAccessIndex) => {
179
+ let parentNode = props.parentNode;
180
+ if (parentNode && HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this.#sourceName) {
147
181
  return rxjs_1.EMPTY;
148
182
  }
149
- }
150
- return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
183
+ if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
184
+ parentNode = {
185
+ ...parentNode,
186
+ key: {
187
+ ...parentNode.key,
188
+ instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === imodelAccess.imodelKey),
189
+ },
190
+ };
191
+ (0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
192
+ if (parentNode.key.instanceKeys.length === 0) {
193
+ return rxjs_1.EMPTY;
194
+ }
195
+ }
196
+ return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode, imodelAccess }).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(
197
+ /* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
198
+ (hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
199
+ }), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
151
200
  category: LOGGING_NAMESPACE_PERFORMANCE,
152
201
  message: /* c8 ignore next */ () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
153
202
  })));
154
203
  }
155
204
  createSourceNodesObservable(props) {
156
205
  // pipe definitions to nodes and put "share replay" on it
157
- return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)((def) => {
206
+ return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => (0, rxjs_1.defer)(() => {
158
207
  if (IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode(def)) {
159
- return (0, rxjs_1.of)({ ...def.node, key: { type: "generic", id: def.node.key, source: this._imodelAccess.imodelKey } });
208
+ return (0, rxjs_1.of)({
209
+ ...def.node,
210
+ key: { type: "generic", id: def.node.key, source: this.#sourceName },
211
+ });
160
212
  }
161
- 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)({
162
- queryExecutor: this._imodelAccess,
213
+ return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.map)((query) => createInstanceKeysFilteredQuery(query, props.targetInstanceKeys)), (0, rxjs_1.mergeMap)((query) => (0, TreeNodesReader_js_1.readNodes)({
214
+ queryExecutor: imodelAccess,
163
215
  query,
164
216
  limit: props.hierarchyLevelSizeLimit,
165
- parser: this._activeHierarchyDefinition.parseNode ? (row) => this._activeHierarchyDefinition.parseNode(row, props.parentNode) : undefined,
217
+ parser: this._activeHierarchyDefinition.parseNode
218
+ ? ({ row }) => this._activeHierarchyDefinition.parseNode({ row, parentNode: props.parentNode, imodelKey: imodelAccess.imodelKey })
219
+ : undefined,
166
220
  })), (0, rxjs_1.map)((node) => ({
167
221
  ...node,
168
- key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: this._imodelAccess.imodelKey })) },
222
+ key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })) },
169
223
  }))));
170
- }), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
224
+ }).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)({
171
225
  category: LOGGING_NAMESPACE_PERFORMANCE,
172
226
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
173
227
  })), (0, ShareReplayWithErrors_js_1.shareReplayWithErrors)());
@@ -181,7 +235,8 @@ class IModelHierarchyProviderImpl {
181
235
  // format `ConcatenatedValue` labels into string labels
182
236
  (0, rxjs_1.mergeMap)((node) => applyLabelsFormatting(node, this._valuesFormatter)),
183
237
  // we have `ProcessedHierarchyNode` from here
184
- preProcessNodes(this._activeHierarchyDefinition),
238
+ // let consumers step-in
239
+ preProcessNodes(this._activeHierarchyDefinition, props.parentNode),
185
240
  // process hiding
186
241
  (0, HideIfNoChildren_js_1.createHideIfNoChildrenOperator)((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), (0, HideNodesInHierarchy_js_1.createHideNodesInHierarchyOperator)(
187
242
  // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)
@@ -191,19 +246,17 @@ class IModelHierarchyProviderImpl {
191
246
  })));
192
247
  }
193
248
  createProcessedNodesObservable(preprocessedNodesObservable, props) {
194
- 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)({
249
+ 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)({
195
250
  category: LOGGING_NAMESPACE_PERFORMANCE,
196
251
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
197
252
  })));
198
253
  }
199
254
  createFinalizedNodesObservable(processedNodesObservable, props) {
200
- return processedNodesObservable.pipe((0, DetermineChildren_js_1.createDetermineChildrenOperator)((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition), Sorting_js_1.sortNodesByLabelOperator, (0, rxjs_1.map)((n) => {
255
+ return processedNodesObservable.pipe((0, DetermineChildren_js_1.createDetermineChildrenOperator)((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition, props.parentNode), Sorting_js_1.sortNodesByLabelOperator, (0, rxjs_1.map)((n) => {
201
256
  if ("processingParams" in n) {
202
257
  delete n.processingParams;
203
258
  }
204
- return Object.assign(n, {
205
- children: (0, Common_js_1.hasChildren)(n),
206
- });
259
+ return { ...n, children: (0, Common_js_1.hasChildren)(n) };
207
260
  }), (0, rxjs_1.takeUntil)(this._dispose), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
208
261
  category: LOGGING_NAMESPACE_PERFORMANCE,
209
262
  message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
@@ -237,13 +290,13 @@ class IModelHierarchyProviderImpl {
237
290
  return cached;
238
291
  }
239
292
  // if we don't find an entry for a grouping node, we load its instances by getting a query and applying
240
- // a filter based on grouped instance keys
241
- let filteredInstanceKeys;
293
+ // a search based on grouped instance keys
294
+ let targetInstanceKeys;
242
295
  let parentNonGroupingNode;
243
296
  if (parentNode) {
244
297
  if (HierarchyNode_js_1.HierarchyNode.isGroupingNode(parentNode)) {
245
298
  parentNonGroupingNode = parentNode.nonGroupingAncestor;
246
- filteredInstanceKeys = parentNode.groupedInstanceKeys;
299
+ targetInstanceKeys = parentNode.groupedInstanceKeys;
247
300
  }
248
301
  else {
249
302
  // not sure why type checker doesn't pick this up
@@ -254,7 +307,7 @@ class IModelHierarchyProviderImpl {
254
307
  const nonGroupingNodeChildrenRequestProps = {
255
308
  ...restProps,
256
309
  parentNode: parentNonGroupingNode,
257
- ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),
310
+ ...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
258
311
  };
259
312
  const value = { observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: "none" };
260
313
  this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
@@ -318,11 +371,11 @@ class IModelHierarchyProviderImpl {
318
371
  return (0, rxjs_1.from)(parentNode.groupedInstanceKeys);
319
372
  }
320
373
  (0, core_bentley_1.assert)(!parentNode || HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) || HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode));
321
- const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
322
374
  // split the definitions based on whether they're for generic nodes or for instance nodes
323
- const [genericDefs, instanceDefs] = (0, Partition_js_1.partition)(hierarchyLevelDefinitions, IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode);
375
+ const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
376
+ const [instanceDefs, genericDefs] = (0, Partition_js_1.partition)(hierarchyLevelDefinitions, (x) => IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
324
377
  // query instance keys and a flag whether they should be hidden
325
- 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) => {
378
+ 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) => {
326
379
  const ecsql = `
327
380
  SELECT
328
381
  ${NodeSelectQueryFactory_js_1.NodeSelectClauseColumnNames.FullClassName},
@@ -332,12 +385,16 @@ class IModelHierarchyProviderImpl {
332
385
  ${query.ecsql}
333
386
  )
334
387
  `;
335
- const reader = this._imodelAccess.createQueryReader({ ...query, ecsql }, { rowFormat: "Indexes", limit: hierarchyLevelSizeLimit });
388
+ const reader = imodelAccess.createQueryReader({ ...query, ecsql }, {
389
+ rowFormat: "Indexes",
390
+ limit: hierarchyLevelSizeLimit,
391
+ restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${core_bentley_1.Guid.createValue()}`,
392
+ });
336
393
  return (0, rxjs_1.from)(reader).pipe((0, rxjs_1.map)((row) => ({
337
394
  key: {
338
395
  className: (0, presentation_shared_1.normalizeFullClassName)(row[0]),
339
396
  id: row[1],
340
- imodelKey: this._imodelAccess.imodelKey,
397
+ imodelKey: imodelAccess.imodelKey,
341
398
  },
342
399
  hide: !!row[2],
343
400
  })));
@@ -347,17 +404,17 @@ class IModelHierarchyProviderImpl {
347
404
  // hidden items' handling:
348
405
  // - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,
349
406
  // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`
350
- const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)((def) => !!def.node.processingParams?.hideInHierarchy), (0, rxjs_1.map)((def) => ({
407
+ const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)(({ hierarchyNodesDefinition }) => !!hierarchyNodesDefinition.node.processingParams?.hideInHierarchy), (0, rxjs_1.map)(({ hierarchyNodesDefinition }) => ({
351
408
  type: "generic",
352
- id: def.node.key,
353
- source: this._imodelAccess.imodelKey,
409
+ id: hierarchyNodesDefinition.node.key,
410
+ source: this.#sourceName,
354
411
  }))), hiddenNodeInstanceKeys.pipe(
355
412
  // first merge all keys by class
356
- (0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key.id),
413
+ (0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key),
357
414
  // then, for each class, create an instance key
358
- (0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className, ids]) => ({
415
+ (0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
359
416
  type: "instances",
360
- instanceKeys: ids.map((id) => ({ className, id, imodelKey: this._imodelAccess.imodelKey })),
417
+ instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
361
418
  }))))).pipe((0, rxjs_1.map)((key) => ({
362
419
  key,
363
420
  parentKeys: [],
@@ -394,14 +451,14 @@ class IModelHierarchyProviderImpl {
394
451
  })));
395
452
  }
396
453
  }
397
- function preProcessNodes(hierarchyFactory) {
398
- return hierarchyFactory.preProcessNode ? processNodes(hierarchyFactory.preProcessNode) : rxjs_1.identity;
454
+ function preProcessNodes(hierarchyFactory, parentNode) {
455
+ return hierarchyFactory.preProcessNode ? processNodes(hierarchyFactory.preProcessNode, parentNode) : rxjs_1.identity;
399
456
  }
400
- function postProcessNodes(hierarchyFactory) {
401
- return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode) : rxjs_1.identity;
457
+ function postProcessNodes(hierarchyFactory, parentNode) {
458
+ return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode, parentNode) : rxjs_1.identity;
402
459
  }
403
- function processNodes(processor) {
404
- return (nodes) => nodes.pipe((0, rxjs_1.mergeMap)(processor));
460
+ function processNodes(processor, parentNode) {
461
+ return (nodes) => nodes.pipe((0, rxjs_1.mergeMap)((node) => processor({ node, parentNode })));
405
462
  }
406
463
  function applyLabelsFormatting(node, valueFormatter) {
407
464
  return (0, rxjs_1.from)((0, presentation_shared_1.formatConcatenatedValue)({
@@ -418,20 +475,20 @@ function createParentNodeKeysList(parentNode) {
418
475
  }
419
476
  return [...parentNode.parentKeys, parentNode.key];
420
477
  }
421
- function filterQueryByInstanceKeys(query, filteredInstanceKeys) {
422
- if (!filteredInstanceKeys || !filteredInstanceKeys.length) {
478
+ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
479
+ if (!targetInstanceKeys || !targetInstanceKeys.length) {
423
480
  return query;
424
481
  }
425
482
  const MAX_ALLOWED_BINDINGS = 1000;
426
- if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
483
+ if (targetInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
427
484
  return {
428
485
  ...query,
429
486
  ecsql: `
430
487
  SELECT *
431
488
  FROM (${query.ecsql}) q
432
- WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => "?").join(",")})
489
+ WHERE q.ECInstanceId IN (${targetInstanceKeys.map(() => "?").join(",")})
433
490
  `,
434
- bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k) => ({ type: "id", value: k.id }))],
491
+ bindings: [...(query.bindings ?? []), ...targetInstanceKeys.map((k) => ({ type: "id", value: k.id }))],
435
492
  };
436
493
  }
437
494
  /* c8 ignore start */
@@ -442,8 +499,78 @@ function filterQueryByInstanceKeys(query, filteredInstanceKeys) {
442
499
  FROM (${query.ecsql}) q
443
500
  WHERE InVirtualSet(?, q.ECInstanceId)
444
501
  `,
445
- bindings: [...(query.bindings ?? []), { type: "idset", value: filteredInstanceKeys.map((k) => k.id) }],
502
+ bindings: [...(query.bindings ?? []), { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
446
503
  };
447
504
  /* c8 ignore end */
448
505
  }
506
+ function mergeNodes(source) {
507
+ return (0, rxjs_1.from)(source).pipe((0, rxjs_1.reduce)((acc, input) => {
508
+ for (let i = 0; i < acc.length; ++i) {
509
+ if (input.imodelAccess === acc[i].imodelAccess) {
510
+ // don't attempt to merge nodes if they come from the same provider
511
+ continue;
512
+ }
513
+ // the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
514
+ // the node with higher `imodelAccessIndex` first
515
+ const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
516
+ ? { imodelAccess: input.imodelAccess, imodelAccessIndex: input.imodelAccessIndex, primary: input.node, secondary: acc[i].node }
517
+ : { imodelAccess: acc[i].imodelAccess, imodelAccessIndex: acc[i].imodelAccessIndex, primary: acc[i].node, secondary: input.node };
518
+ const merged = tryMergeNodes(candidates.primary, candidates.secondary);
519
+ if (merged) {
520
+ acc[i] = { node: merged, imodelAccess: candidates.imodelAccess, imodelAccessIndex: candidates.imodelAccessIndex };
521
+ return acc;
522
+ }
523
+ }
524
+ acc.push(input);
525
+ return acc;
526
+ }, new Array()), (0, rxjs_1.mergeAll)());
527
+ }
528
+ function mergeSearchProps(primary, secondary) {
529
+ if (!primary || !secondary) {
530
+ return primary ?? secondary;
531
+ }
532
+ const hasSearchTargetAncestor = primary.hasSearchTargetAncestor || secondary.hasSearchTargetAncestor;
533
+ const childrenTargetPaths = [...(primary.childrenTargetPaths ?? []), ...(secondary.childrenTargetPaths ?? [])];
534
+ return {
535
+ ...(hasSearchTargetAncestor ? { hasSearchTargetAncestor } : undefined),
536
+ ...(childrenTargetPaths.length ? { childrenTargetPaths } : undefined),
537
+ ...(primary.isSearchTarget || secondary.isSearchTarget
538
+ ? {
539
+ isSearchTarget: true,
540
+ searchTargetOptions: HierarchySearch_js_1.HierarchySearchPath.mergeOptions(primary.isSearchTarget ? primary.searchTargetOptions : undefined, secondary.isSearchTarget ? secondary.searchTargetOptions : undefined),
541
+ }
542
+ : {
543
+ isSearchTarget: false,
544
+ }),
545
+ };
546
+ }
547
+ function tryMergeInstanceNodes(primary, secondary) {
548
+ if (HierarchyNode_js_1.HierarchyNode.isInstancesNode(primary) &&
549
+ HierarchyNode_js_1.HierarchyNode.isInstancesNode(secondary) &&
550
+ primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => presentation_shared_1.InstanceKey.equals(lhsKey, rhsKey)))) {
551
+ const searchProps = mergeSearchProps(primary.search, secondary.search);
552
+ return {
553
+ ...primary,
554
+ key: {
555
+ type: "instances",
556
+ instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
557
+ },
558
+ ...(searchProps ? { search: searchProps } : undefined),
559
+ };
560
+ }
561
+ return undefined;
562
+ }
563
+ function tryMergeGenericNodes(primary, secondary) {
564
+ if (HierarchyNode_js_1.HierarchyNode.isGeneric(primary) && HierarchyNode_js_1.HierarchyNode.isGeneric(secondary) && primary.key.id === secondary.key.id) {
565
+ const searchProps = mergeSearchProps(primary.search, secondary.search);
566
+ return {
567
+ ...primary,
568
+ ...(searchProps ? { search: searchProps } : undefined),
569
+ };
570
+ }
571
+ return undefined;
572
+ }
573
+ function tryMergeNodes(primary, secondary) {
574
+ return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
575
+ }
449
576
  //# sourceMappingURL=IModelHierarchyProvider.js.map