@itwin/presentation-hierarchies 2.0.0-alpha.2 → 2.0.0-alpha.20

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 (427) hide show
  1. package/CHANGELOG.md +929 -12
  2. package/README.md +20 -50
  3. package/lib/hierarchies/HierarchyErrors.d.ts.map +1 -0
  4. package/lib/hierarchies/HierarchyErrors.js.map +1 -0
  5. package/lib/hierarchies/HierarchyMerge.d.ts +19 -0
  6. package/lib/hierarchies/HierarchyMerge.d.ts.map +1 -0
  7. package/lib/{esm/hierarchies/HierarchyProvider.js → hierarchies/HierarchyMerge.js} +5 -6
  8. package/lib/hierarchies/HierarchyMerge.js.map +1 -0
  9. package/lib/{esm/hierarchies → hierarchies}/HierarchyNode.d.ts +21 -28
  10. package/lib/hierarchies/HierarchyNode.d.ts.map +1 -0
  11. package/lib/{esm/hierarchies → hierarchies}/HierarchyNode.js +19 -21
  12. package/lib/hierarchies/HierarchyNode.js.map +1 -0
  13. package/lib/{cjs/hierarchies → hierarchies}/HierarchyNodeIdentifier.d.ts +3 -1
  14. package/lib/hierarchies/HierarchyNodeIdentifier.d.ts.map +1 -0
  15. package/lib/{esm/hierarchies → hierarchies}/HierarchyNodeIdentifier.js +23 -6
  16. package/lib/hierarchies/HierarchyNodeIdentifier.js.map +1 -0
  17. package/lib/{esm/hierarchies → hierarchies}/HierarchyNodeKey.d.ts +5 -4
  18. package/lib/hierarchies/HierarchyNodeKey.d.ts.map +1 -0
  19. package/lib/{esm/hierarchies → hierarchies}/HierarchyNodeKey.js +1 -1
  20. package/lib/hierarchies/HierarchyNodeKey.js.map +1 -0
  21. package/lib/{esm/hierarchies → hierarchies}/HierarchyProvider.d.ts +59 -34
  22. package/lib/hierarchies/HierarchyProvider.d.ts.map +1 -0
  23. package/lib/hierarchies/HierarchyProvider.js +61 -0
  24. package/lib/hierarchies/HierarchyProvider.js.map +1 -0
  25. package/lib/hierarchies/HierarchySearch.d.ts +297 -0
  26. package/lib/hierarchies/HierarchySearch.d.ts.map +1 -0
  27. package/lib/hierarchies/HierarchySearch.js +464 -0
  28. package/lib/hierarchies/HierarchySearch.js.map +1 -0
  29. package/lib/{cjs/hierarchies → hierarchies}/Logging.d.ts +1 -1
  30. package/lib/hierarchies/Logging.d.ts.map +1 -0
  31. package/lib/{esm/hierarchies → hierarchies}/Logging.js +1 -1
  32. package/lib/hierarchies/Logging.js.map +1 -0
  33. package/lib/{cjs/hierarchies → hierarchies}/imodel/HierarchyCache.d.ts +1 -1
  34. package/lib/hierarchies/imodel/HierarchyCache.d.ts.map +1 -0
  35. package/lib/{esm/hierarchies → hierarchies}/imodel/HierarchyCache.js +4 -7
  36. package/lib/hierarchies/imodel/HierarchyCache.js.map +1 -0
  37. package/lib/{esm/hierarchies → hierarchies}/imodel/IModelHierarchyDefinition.d.ts +34 -11
  38. package/lib/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -0
  39. package/lib/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -0
  40. package/lib/{cjs/hierarchies → hierarchies}/imodel/IModelHierarchyNode.d.ts +5 -5
  41. package/lib/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -0
  42. package/lib/hierarchies/imodel/IModelHierarchyNode.js.map +1 -0
  43. package/lib/hierarchies/imodel/IModelHierarchyProvider.d.ts +136 -0
  44. package/lib/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -0
  45. package/lib/hierarchies/imodel/IModelHierarchyProvider.js +656 -0
  46. package/lib/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -0
  47. package/lib/{esm/hierarchies → hierarchies}/imodel/LimitingECSqlQueryExecutor.d.ts +1 -1
  48. package/lib/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -0
  49. package/lib/{esm/hierarchies → hierarchies}/imodel/LimitingECSqlQueryExecutor.js +14 -11
  50. package/lib/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -0
  51. package/lib/{esm/hierarchies → hierarchies}/imodel/NodeSelectQueryFactory.d.ts +17 -12
  52. package/lib/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -0
  53. package/lib/{esm/hierarchies → hierarchies}/imodel/NodeSelectQueryFactory.js +214 -139
  54. package/lib/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -0
  55. package/lib/{cjs/hierarchies → hierarchies}/imodel/PredicateBasedHierarchyDefinition.d.ts +7 -7
  56. package/lib/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -0
  57. package/lib/{esm/hierarchies → hierarchies}/imodel/PredicateBasedHierarchyDefinition.js +3 -2
  58. package/lib/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -0
  59. package/lib/hierarchies/imodel/SearchHierarchyDefinition.d.ts +35 -0
  60. package/lib/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
  61. package/lib/hierarchies/imodel/SearchHierarchyDefinition.js +261 -0
  62. package/lib/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
  63. package/lib/{esm/hierarchies → hierarchies}/imodel/TreeNodesReader.d.ts +10 -12
  64. package/lib/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -0
  65. package/lib/{esm/hierarchies → hierarchies}/imodel/TreeNodesReader.js +12 -9
  66. package/lib/hierarchies/imodel/TreeNodesReader.js.map +1 -0
  67. package/lib/{cjs/hierarchies → hierarchies}/imodel/Utils.d.ts +2 -1
  68. package/lib/hierarchies/imodel/Utils.d.ts.map +1 -0
  69. package/lib/{esm/hierarchies → hierarchies}/imodel/Utils.js +20 -7
  70. package/lib/hierarchies/imodel/Utils.js.map +1 -0
  71. package/lib/{cjs/hierarchies → hierarchies}/imodel/operators/DetermineChildren.d.ts +2 -2
  72. package/lib/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -0
  73. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/DetermineChildren.js +11 -5
  74. package/lib/hierarchies/imodel/operators/DetermineChildren.js.map +1 -0
  75. package/lib/hierarchies/imodel/operators/Grouping.d.ts +26 -0
  76. package/lib/hierarchies/imodel/operators/Grouping.d.ts.map +1 -0
  77. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/Grouping.js +33 -19
  78. package/lib/hierarchies/imodel/operators/Grouping.js.map +1 -0
  79. package/lib/{cjs/hierarchies → hierarchies}/imodel/operators/HideIfNoChildren.d.ts +1 -1
  80. package/lib/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -0
  81. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/HideIfNoChildren.js +33 -10
  82. package/lib/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -0
  83. package/lib/{cjs/hierarchies → hierarchies}/imodel/operators/HideNodesInHierarchy.d.ts +1 -1
  84. package/lib/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -0
  85. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/HideNodesInHierarchy.js +31 -15
  86. package/lib/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -0
  87. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/AutoExpand.d.ts +1 -1
  88. package/lib/hierarchies/imodel/operators/grouping/AutoExpand.d.ts.map +1 -0
  89. package/lib/hierarchies/imodel/operators/grouping/AutoExpand.js.map +1 -0
  90. package/lib/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts +11 -0
  91. package/lib/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -0
  92. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/BaseClassGrouping.js +10 -12
  93. package/lib/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -0
  94. package/lib/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts +7 -0
  95. package/lib/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -0
  96. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/ClassGrouping.js +8 -11
  97. package/lib/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -0
  98. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/GroupHiding.d.ts +1 -1
  99. package/lib/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -0
  100. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/GroupHiding.js +1 -5
  101. package/lib/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -0
  102. package/lib/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts +5 -0
  103. package/lib/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -0
  104. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/LabelGrouping.js +2 -10
  105. package/lib/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -0
  106. package/lib/{cjs/hierarchies → hierarchies}/imodel/operators/grouping/PropertiesGrouping.d.ts +7 -7
  107. package/lib/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -0
  108. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/PropertiesGrouping.js +46 -37
  109. package/lib/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -0
  110. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/Shared.d.ts +2 -2
  111. package/lib/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -0
  112. package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/Shared.js +3 -1
  113. package/lib/hierarchies/imodel/operators/grouping/Shared.js.map +1 -0
  114. package/lib/{esm/hierarchies → hierarchies}/internal/Common.d.ts +5 -2
  115. package/lib/hierarchies/internal/Common.d.ts.map +1 -0
  116. package/lib/{esm/hierarchies → hierarchies}/internal/Common.js +13 -3
  117. package/lib/hierarchies/internal/Common.js.map +1 -0
  118. package/lib/hierarchies/internal/DisposePolyfill.d.ts.map +1 -0
  119. package/lib/hierarchies/internal/DisposePolyfill.js.map +1 -0
  120. package/lib/{esm/hierarchies → hierarchies}/internal/LoggingUtils.d.ts +1 -1
  121. package/lib/hierarchies/internal/LoggingUtils.d.ts.map +1 -0
  122. package/lib/hierarchies/internal/LoggingUtils.js.map +1 -0
  123. package/lib/{esm/hierarchies → hierarchies}/internal/RxjsHierarchyDefinition.d.ts +19 -8
  124. package/lib/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -0
  125. package/lib/{esm/hierarchies → hierarchies}/internal/RxjsHierarchyDefinition.js +9 -6
  126. package/lib/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -0
  127. package/lib/{cjs/hierarchies → hierarchies}/internal/SubscriptionScheduler.d.ts +1 -1
  128. package/lib/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -0
  129. package/lib/{esm/hierarchies → hierarchies}/internal/SubscriptionScheduler.js +1 -4
  130. package/lib/hierarchies/internal/SubscriptionScheduler.js.map +1 -0
  131. package/lib/{cjs/hierarchies → hierarchies}/internal/operators/Partition.d.ts +2 -1
  132. package/lib/hierarchies/internal/operators/Partition.d.ts.map +1 -0
  133. package/lib/hierarchies/internal/operators/Partition.js.map +1 -0
  134. package/lib/{esm/hierarchies → hierarchies}/internal/operators/ReduceToMergeMap.d.ts +3 -3
  135. package/lib/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -0
  136. package/lib/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -0
  137. package/lib/{cjs/hierarchies → hierarchies}/internal/operators/ReleaseMainThread.d.ts +1 -1
  138. package/lib/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -0
  139. package/lib/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -0
  140. package/lib/{cjs/hierarchies → hierarchies}/internal/operators/ShareReplayWithErrors.d.ts +1 -1
  141. package/lib/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +1 -0
  142. package/lib/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -0
  143. package/lib/{cjs/hierarchies → hierarchies}/internal/operators/Sorting.d.ts +1 -1
  144. package/lib/hierarchies/internal/operators/Sorting.d.ts.map +1 -0
  145. package/lib/hierarchies/internal/operators/Sorting.js.map +1 -0
  146. package/lib/{esm/hierarchies → hierarchies}/internal/operators/TapOnce.d.ts +1 -1
  147. package/lib/hierarchies/internal/operators/TapOnce.d.ts.map +1 -0
  148. package/lib/hierarchies/internal/operators/TapOnce.js.map +1 -0
  149. package/lib/presentation-hierarchies.d.ts +24 -0
  150. package/lib/presentation-hierarchies.d.ts.map +1 -0
  151. package/lib/{esm/presentation-hierarchies.js → presentation-hierarchies.js} +7 -7
  152. package/lib/presentation-hierarchies.js.map +1 -0
  153. package/package.json +29 -39
  154. package/lib/cjs/hierarchies/HierarchyErrors.d.ts.map +0 -1
  155. package/lib/cjs/hierarchies/HierarchyErrors.js +0 -20
  156. package/lib/cjs/hierarchies/HierarchyErrors.js.map +0 -1
  157. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts +0 -133
  158. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +0 -1
  159. package/lib/cjs/hierarchies/HierarchyFiltering.js +0 -232
  160. package/lib/cjs/hierarchies/HierarchyFiltering.js.map +0 -1
  161. package/lib/cjs/hierarchies/HierarchyNode.d.ts +0 -156
  162. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +0 -1
  163. package/lib/cjs/hierarchies/HierarchyNode.js +0 -84
  164. package/lib/cjs/hierarchies/HierarchyNode.js.map +0 -1
  165. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.d.ts.map +0 -1
  166. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.js +0 -35
  167. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.js.map +0 -1
  168. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts +0 -161
  169. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +0 -1
  170. package/lib/cjs/hierarchies/HierarchyNodeKey.js +0 -166
  171. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +0 -1
  172. package/lib/cjs/hierarchies/HierarchyProvider.d.ts +0 -109
  173. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +0 -1
  174. package/lib/cjs/hierarchies/HierarchyProvider.js +0 -44
  175. package/lib/cjs/hierarchies/HierarchyProvider.js.map +0 -1
  176. package/lib/cjs/hierarchies/Logging.d.ts.map +0 -1
  177. package/lib/cjs/hierarchies/Logging.js +0 -27
  178. package/lib/cjs/hierarchies/Logging.js.map +0 -1
  179. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +0 -36
  180. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
  181. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js +0 -283
  182. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
  183. package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts.map +0 -1
  184. package/lib/cjs/hierarchies/imodel/HierarchyCache.js +0 -84
  185. package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +0 -1
  186. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts +0 -121
  187. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +0 -1
  188. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js +0 -21
  189. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js.map +0 -1
  190. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts.map +0 -1
  191. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js +0 -29
  192. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js.map +0 -1
  193. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts +0 -80
  194. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +0 -1
  195. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +0 -449
  196. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +0 -1
  197. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts +0 -21
  198. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +0 -1
  199. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js +0 -123
  200. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +0 -1
  201. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts +0 -230
  202. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +0 -1
  203. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +0 -591
  204. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +0 -1
  205. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +0 -1
  206. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +0 -93
  207. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +0 -1
  208. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts +0 -37
  209. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +0 -1
  210. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +0 -44
  211. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +0 -1
  212. package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +0 -1
  213. package/lib/cjs/hierarchies/imodel/Utils.js +0 -59
  214. package/lib/cjs/hierarchies/imodel/Utils.js.map +0 -1
  215. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts.map +0 -1
  216. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js +0 -34
  217. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js.map +0 -1
  218. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts +0 -26
  219. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +0 -1
  220. package/lib/cjs/hierarchies/imodel/operators/Grouping.js +0 -162
  221. package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +0 -1
  222. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +0 -1
  223. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js +0 -52
  224. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js.map +0 -1
  225. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +0 -1
  226. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js +0 -68
  227. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +0 -1
  228. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.d.ts +0 -4
  229. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.d.ts.map +0 -1
  230. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.js +0 -26
  231. package/lib/cjs/hierarchies/imodel/operators/grouping/AutoExpand.js.map +0 -1
  232. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts +0 -11
  233. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +0 -1
  234. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +0 -114
  235. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +0 -1
  236. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts +0 -7
  237. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +0 -1
  238. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js +0 -55
  239. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +0 -1
  240. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts +0 -4
  241. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +0 -1
  242. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js +0 -53
  243. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js.map +0 -1
  244. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts +0 -5
  245. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +0 -1
  246. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js +0 -60
  247. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +0 -1
  248. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +0 -1
  249. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +0 -309
  250. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +0 -1
  251. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts +0 -5
  252. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts.map +0 -1
  253. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js +0 -29
  254. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js.map +0 -1
  255. package/lib/cjs/hierarchies/internal/Common.d.ts +0 -58
  256. package/lib/cjs/hierarchies/internal/Common.d.ts.map +0 -1
  257. package/lib/cjs/hierarchies/internal/Common.js +0 -80
  258. package/lib/cjs/hierarchies/internal/Common.js.map +0 -1
  259. package/lib/cjs/hierarchies/internal/DisposePolyfill.d.ts +0 -1
  260. package/lib/cjs/hierarchies/internal/DisposePolyfill.d.ts.map +0 -1
  261. package/lib/cjs/hierarchies/internal/DisposePolyfill.js +0 -11
  262. package/lib/cjs/hierarchies/internal/DisposePolyfill.js.map +0 -1
  263. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts +0 -12
  264. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +0 -1
  265. package/lib/cjs/hierarchies/internal/EachValueFrom.js +0 -110
  266. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +0 -1
  267. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts +0 -12
  268. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts.map +0 -1
  269. package/lib/cjs/hierarchies/internal/LoggingUtils.js +0 -37
  270. package/lib/cjs/hierarchies/internal/LoggingUtils.js.map +0 -1
  271. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts +0 -64
  272. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +0 -1
  273. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +0 -25
  274. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +0 -1
  275. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +0 -1
  276. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js +0 -57
  277. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +0 -1
  278. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +0 -1
  279. package/lib/cjs/hierarchies/internal/operators/Partition.js +0 -60
  280. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +0 -1
  281. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts +0 -22
  282. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +0 -1
  283. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js +0 -50
  284. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js.map +0 -1
  285. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +0 -1
  286. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js +0 -24
  287. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js.map +0 -1
  288. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +0 -1
  289. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js +0 -23
  290. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js.map +0 -1
  291. package/lib/cjs/hierarchies/internal/operators/Sorting.d.ts.map +0 -1
  292. package/lib/cjs/hierarchies/internal/operators/Sorting.js +0 -25
  293. package/lib/cjs/hierarchies/internal/operators/Sorting.js.map +0 -1
  294. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts +0 -4
  295. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts.map +0 -1
  296. package/lib/cjs/hierarchies/internal/operators/TapOnce.js +0 -19
  297. package/lib/cjs/hierarchies/internal/operators/TapOnce.js.map +0 -1
  298. package/lib/cjs/package.json +0 -1
  299. package/lib/cjs/presentation-hierarchies.d.ts +0 -15
  300. package/lib/cjs/presentation-hierarchies.d.ts.map +0 -1
  301. package/lib/cjs/presentation-hierarchies.js +0 -40
  302. package/lib/cjs/presentation-hierarchies.js.map +0 -1
  303. package/lib/esm/hierarchies/HierarchyErrors.d.ts +0 -9
  304. package/lib/esm/hierarchies/HierarchyErrors.d.ts.map +0 -1
  305. package/lib/esm/hierarchies/HierarchyErrors.js.map +0 -1
  306. package/lib/esm/hierarchies/HierarchyFiltering.d.ts +0 -133
  307. package/lib/esm/hierarchies/HierarchyFiltering.d.ts.map +0 -1
  308. package/lib/esm/hierarchies/HierarchyFiltering.js +0 -227
  309. package/lib/esm/hierarchies/HierarchyFiltering.js.map +0 -1
  310. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +0 -1
  311. package/lib/esm/hierarchies/HierarchyNode.js.map +0 -1
  312. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts +0 -29
  313. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts.map +0 -1
  314. package/lib/esm/hierarchies/HierarchyNodeIdentifier.js.map +0 -1
  315. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +0 -1
  316. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +0 -1
  317. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +0 -1
  318. package/lib/esm/hierarchies/HierarchyProvider.js.map +0 -1
  319. package/lib/esm/hierarchies/Logging.d.ts +0 -13
  320. package/lib/esm/hierarchies/Logging.d.ts.map +0 -1
  321. package/lib/esm/hierarchies/Logging.js.map +0 -1
  322. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +0 -36
  323. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
  324. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js +0 -277
  325. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
  326. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts +0 -18
  327. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts.map +0 -1
  328. package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +0 -1
  329. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +0 -1
  330. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.js.map +0 -1
  331. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts +0 -234
  332. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts.map +0 -1
  333. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.js.map +0 -1
  334. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts +0 -80
  335. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +0 -1
  336. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +0 -446
  337. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +0 -1
  338. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +0 -1
  339. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +0 -1
  340. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +0 -1
  341. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +0 -1
  342. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts +0 -140
  343. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +0 -1
  344. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +0 -1
  345. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +0 -1
  346. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +0 -1
  347. package/lib/esm/hierarchies/imodel/Utils.d.ts +0 -4
  348. package/lib/esm/hierarchies/imodel/Utils.d.ts.map +0 -1
  349. package/lib/esm/hierarchies/imodel/Utils.js.map +0 -1
  350. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts +0 -11
  351. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts.map +0 -1
  352. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js.map +0 -1
  353. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts +0 -26
  354. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +0 -1
  355. package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +0 -1
  356. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts +0 -11
  357. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +0 -1
  358. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js.map +0 -1
  359. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts +0 -11
  360. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +0 -1
  361. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +0 -1
  362. package/lib/esm/hierarchies/imodel/operators/grouping/AutoExpand.d.ts.map +0 -1
  363. package/lib/esm/hierarchies/imodel/operators/grouping/AutoExpand.js.map +0 -1
  364. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts +0 -11
  365. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +0 -1
  366. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +0 -1
  367. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts +0 -7
  368. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +0 -1
  369. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +0 -1
  370. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +0 -1
  371. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js.map +0 -1
  372. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts +0 -5
  373. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +0 -1
  374. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +0 -1
  375. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts +0 -32
  376. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +0 -1
  377. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +0 -1
  378. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts.map +0 -1
  379. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js.map +0 -1
  380. package/lib/esm/hierarchies/internal/Common.d.ts.map +0 -1
  381. package/lib/esm/hierarchies/internal/Common.js.map +0 -1
  382. package/lib/esm/hierarchies/internal/DisposePolyfill.d.ts.map +0 -1
  383. package/lib/esm/hierarchies/internal/DisposePolyfill.js.map +0 -1
  384. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts +0 -12
  385. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +0 -1
  386. package/lib/esm/hierarchies/internal/EachValueFrom.js +0 -107
  387. package/lib/esm/hierarchies/internal/EachValueFrom.js.map +0 -1
  388. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts.map +0 -1
  389. package/lib/esm/hierarchies/internal/LoggingUtils.js.map +0 -1
  390. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +0 -1
  391. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +0 -1
  392. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts +0 -17
  393. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +0 -1
  394. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +0 -1
  395. package/lib/esm/hierarchies/internal/operators/Partition.d.ts +0 -6
  396. package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +0 -1
  397. package/lib/esm/hierarchies/internal/operators/Partition.js.map +0 -1
  398. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +0 -1
  399. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.js.map +0 -1
  400. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts +0 -7
  401. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +0 -1
  402. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.js.map +0 -1
  403. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts +0 -9
  404. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +0 -1
  405. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.js.map +0 -1
  406. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts +0 -13
  407. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts.map +0 -1
  408. package/lib/esm/hierarchies/internal/operators/Sorting.js.map +0 -1
  409. package/lib/esm/hierarchies/internal/operators/TapOnce.d.ts.map +0 -1
  410. package/lib/esm/hierarchies/internal/operators/TapOnce.js.map +0 -1
  411. package/lib/esm/presentation-hierarchies.d.ts +0 -15
  412. package/lib/esm/presentation-hierarchies.d.ts.map +0 -1
  413. package/lib/esm/presentation-hierarchies.js.map +0 -1
  414. /package/lib/{cjs/hierarchies → hierarchies}/HierarchyErrors.d.ts +0 -0
  415. /package/lib/{esm/hierarchies → hierarchies}/HierarchyErrors.js +0 -0
  416. /package/lib/{esm/hierarchies → hierarchies}/imodel/IModelHierarchyDefinition.js +0 -0
  417. /package/lib/{esm/hierarchies → hierarchies}/imodel/IModelHierarchyNode.js +0 -0
  418. /package/lib/{esm/hierarchies → hierarchies}/imodel/operators/grouping/AutoExpand.js +0 -0
  419. /package/lib/{esm/hierarchies → hierarchies}/internal/DisposePolyfill.d.ts +0 -0
  420. /package/lib/{esm/hierarchies → hierarchies}/internal/DisposePolyfill.js +0 -0
  421. /package/lib/{esm/hierarchies → hierarchies}/internal/LoggingUtils.js +0 -0
  422. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/Partition.js +0 -0
  423. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/ReduceToMergeMap.js +0 -0
  424. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/ReleaseMainThread.js +0 -0
  425. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/ShareReplayWithErrors.js +0 -0
  426. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/Sorting.js +0 -0
  427. /package/lib/{esm/hierarchies → hierarchies}/internal/operators/TapOnce.js +0 -0
@@ -0,0 +1,656 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import "../internal/DisposePolyfill.js";
6
+ import { catchError, concat, defaultIfEmpty, EMPTY, filter, finalize, from, fromEventPattern, identity, map, merge, mergeAll, mergeMap, of, reduce, Subject, take, takeUntil, tap, } from "rxjs";
7
+ import { assert, BeEvent, Guid, StopWatch } from "@itwin/core-bentley";
8
+ import { createDefaultValueFormatter, createIModelInstanceLabelSelectClauseFactory, eachValueFrom, formatConcatenatedValue, InstanceKey, normalizeFullClassName, } from "@itwin/presentation-shared";
9
+ import { RowsLimitExceededError } from "../HierarchyErrors.js";
10
+ import { HierarchyNode } from "../HierarchyNode.js";
11
+ import { HierarchyNodeKey } from "../HierarchyNodeKey.js";
12
+ import { HierarchySearchTree } from "../HierarchySearch.js";
13
+ import { LOGGING_NAMESPACE as BASE_LOGGING_NAMESPACE, LOGGING_NAMESPACE_INTERNAL as BASE_LOGGING_NAMESPACE_INTERNAL, LOGGING_NAMESPACE_PERFORMANCE as BASE_LOGGING_NAMESPACE_PERFORMANCE, createNodeIdentifierForLogging, hasChildren, } from "../internal/Common.js";
14
+ import { doLog, log } from "../internal/LoggingUtils.js";
15
+ import { partition } from "../internal/operators/Partition.js";
16
+ import { reduceToMergeMapList } from "../internal/operators/ReduceToMergeMap.js";
17
+ import { shareReplayWithErrors } from "../internal/operators/ShareReplayWithErrors.js";
18
+ import { sortNodesByLabelOperator } from "../internal/operators/Sorting.js";
19
+ import { getRxjsHierarchyDefinition } from "../internal/RxjsHierarchyDefinition.js";
20
+ import { SubscriptionScheduler } from "../internal/SubscriptionScheduler.js";
21
+ import { HierarchyCache } from "./HierarchyCache.js";
22
+ import { HierarchyNodesDefinition } from "./IModelHierarchyDefinition.js";
23
+ import { createNodesQueryClauseFactory, NodeSelectClauseColumnNames } from "./NodeSelectQueryFactory.js";
24
+ import { createDetermineChildrenOperator } from "./operators/DetermineChildren.js";
25
+ import { createGroupingOperator } from "./operators/Grouping.js";
26
+ import { createHideIfNoChildrenOperator } from "./operators/HideIfNoChildren.js";
27
+ import { createHideNodesInHierarchyOperator } from "./operators/HideNodesInHierarchy.js";
28
+ import { SearchHierarchyDefinition } from "./SearchHierarchyDefinition.js";
29
+ import { readNodes } from "./TreeNodesReader.js";
30
+ import { ECSQL_PREFIX } from "./Utils.js";
31
+ const LOGGING_NAMESPACE = `${BASE_LOGGING_NAMESPACE}.IModelHierarchyProvider`;
32
+ const LOGGING_NAMESPACE_INTERNAL = `${BASE_LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;
33
+ const LOGGING_NAMESPACE_PERFORMANCE = `${BASE_LOGGING_NAMESPACE_PERFORMANCE}.IModelHierarchyProvider`;
34
+ const DEFAULT_QUERY_CONCURRENCY = 10;
35
+ const DEFAULT_QUERY_CACHE_SIZE = 1;
36
+ /**
37
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and
38
+ * a hierarchy definition, which defines each hierarchy level through ECSQL queries.
39
+ *
40
+ * @public
41
+ */
42
+ export function createIModelHierarchyProvider(props) {
43
+ const { imodelAccess, imodelChanged, instanceLabelSelectClauseFactory, ...restProps } = props;
44
+ return createMergedIModelHierarchyProvider({
45
+ ...restProps,
46
+ imodels: [{ imodelAccess, imodelChanged, instanceLabelSelectClauseFactory }],
47
+ });
48
+ }
49
+ /**
50
+ * Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
51
+ * and a hierarchy definition, which defines each hierarchy level through ECSQL queries.
52
+ *
53
+ * **Warning:** This is an experimental API that **should not be used in production**.
54
+ *
55
+ * @alpha
56
+ */
57
+ export function createMergedIModelHierarchyProvider(props) {
58
+ return new IModelHierarchyProviderImpl(props);
59
+ }
60
+ class IModelHierarchyProviderImpl {
61
+ _imodelProps;
62
+ _imodels;
63
+ _hierarchyChanged;
64
+ _valuesFormatter;
65
+ _sourceHierarchyDefinition;
66
+ _activeHierarchyDefinition;
67
+ _localizedStrings;
68
+ _queryConcurrency;
69
+ _querySchedulers;
70
+ _nodesCache;
71
+ _unsubscribe;
72
+ _dispose = new Subject();
73
+ #componentId;
74
+ #componentName;
75
+ #sourceName;
76
+ constructor(props) {
77
+ if (props.imodels.length === 0) {
78
+ throw new Error(`Creating an iModel hierarchy provider requires at least one iModel.`);
79
+ }
80
+ this.#componentId = Guid.createValue();
81
+ this.#componentName = "IModelHierarchyProviderImpl";
82
+ this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
83
+ this._imodelProps = props.imodels;
84
+ this._imodels = props.imodels.map((imodelProps) => this.#createIModelState(imodelProps));
85
+ this._hierarchyChanged = new BeEvent();
86
+ this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);
87
+ this._valuesFormatter = props.formatter ?? 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);
92
+ const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;
93
+ if (queryCacheSize !== 0) {
94
+ this._nodesCache = new HierarchyCache({
95
+ // we divide the size by 2, because each variation also counts as a query that we cache
96
+ size: Math.ceil(queryCacheSize / 2),
97
+ variationsCount: 1,
98
+ });
99
+ }
100
+ const imodelChangeSubscription = from(this._imodels)
101
+ .pipe(mergeMap(({ imodelAccess, imodelChanged }, index) => imodelChanged
102
+ ? fromEventPattern((handler) => imodelChanged.addListener(handler), (handler) => imodelChanged.removeListener(handler), () => ({ imodelKey: imodelAccess.imodelKey, index }))
103
+ : EMPTY))
104
+ .subscribe(({ imodelKey, index }) => {
105
+ this.invalidateHierarchyCache(`Data source changed: "${imodelKey}"`);
106
+ this._dispose.next();
107
+ // The iModel's schemas may have changed, so re-create the query factories to drop their schema-derived caches.
108
+ this._imodels[index] = this.#createIModelState(this._imodelProps[index]);
109
+ this._hierarchyChanged.raiseEvent({});
110
+ });
111
+ this._unsubscribe = () => {
112
+ imodelChangeSubscription.unsubscribe();
113
+ };
114
+ }
115
+ #createIModelState(imodelProps) {
116
+ const { imodelAccess, imodelChanged } = imodelProps;
117
+ const instanceLabelSelectClauseFactory = imodelProps.instanceLabelSelectClauseFactory ?? createIModelInstanceLabelSelectClauseFactory({ imodelAccess });
118
+ const nodeSelectClauseFactory = createNodesQueryClauseFactory({ imodelAccess, instanceLabelSelectClauseFactory });
119
+ return { imodelAccess, imodelChanged, nodeSelectClauseFactory };
120
+ }
121
+ [Symbol.dispose]() {
122
+ this._dispose.next();
123
+ this._unsubscribe?.();
124
+ }
125
+ /* v8 ignore next -- @preserve */
126
+ dispose() {
127
+ this[Symbol.dispose]();
128
+ }
129
+ get hierarchyChanged() {
130
+ return this._hierarchyChanged;
131
+ }
132
+ getQueryScheduler(imodelKey) {
133
+ let scheduler = this._querySchedulers.get(imodelKey);
134
+ if (!scheduler) {
135
+ scheduler = new SubscriptionScheduler(this._queryConcurrency);
136
+ this._querySchedulers.set(imodelKey, scheduler);
137
+ }
138
+ return scheduler;
139
+ }
140
+ getPrimaryIModelAccess() {
141
+ return this._imodels[this._imodels.length - 1].imodelAccess;
142
+ }
143
+ invalidateHierarchyCache(reason) {
144
+ /* v8 ignore next -- @preserve */
145
+ doLog({
146
+ category: `${LOGGING_NAMESPACE}.Events`,
147
+ message: () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),
148
+ });
149
+ this._nodesCache?.clear();
150
+ }
151
+ /**
152
+ * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the
153
+ * result of `createDefaultValueFormatter` called with default parameters.
154
+ */
155
+ setFormatter(formatter) {
156
+ this._valuesFormatter = formatter ?? createDefaultValueFormatter();
157
+ this._hierarchyChanged.raiseEvent({ formatterChange: { newFormatter: this._valuesFormatter } });
158
+ }
159
+ setHierarchySearch(props) {
160
+ if (!props) {
161
+ if (this._sourceHierarchyDefinition !== this._activeHierarchyDefinition) {
162
+ this._activeHierarchyDefinition = this._sourceHierarchyDefinition;
163
+ this.invalidateHierarchyCache("Hierarchy search reset");
164
+ }
165
+ this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: undefined } });
166
+ return;
167
+ }
168
+ this._activeHierarchyDefinition = new SearchHierarchyDefinition({
169
+ imodelAccess: this.getPrimaryIModelAccess(),
170
+ source: this._sourceHierarchyDefinition,
171
+ sourceName: this.#sourceName,
172
+ targetPaths: props.paths,
173
+ });
174
+ this.invalidateHierarchyCache("Hierarchy search set");
175
+ this._dispose.next();
176
+ this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: props } });
177
+ }
178
+ onGroupingNodeCreated(groupingNode, props) {
179
+ this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: "pre-processed" });
180
+ }
181
+ createHierarchyLevelDefinitionsObservable(props) {
182
+ const { requestContext, ...defineHierarchyLevelProps } = props;
183
+ /* v8 ignore next -- @preserve */
184
+ doLog({
185
+ category: LOGGING_NAMESPACE_PERFORMANCE,
186
+ message: () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
187
+ });
188
+ return from(this._imodels).pipe(mergeMap(({ imodelAccess, nodeSelectClauseFactory }, imodelAccessIndex) => {
189
+ let parentNode = props.parentNode;
190
+ if (parentNode &&
191
+ HierarchyNode.isGeneric(parentNode) &&
192
+ parentNode.key.source &&
193
+ parentNode.key.source !== this.#sourceName) {
194
+ return EMPTY;
195
+ }
196
+ if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {
197
+ parentNode = {
198
+ ...parentNode,
199
+ key: {
200
+ ...parentNode.key,
201
+ instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === imodelAccess.imodelKey),
202
+ },
203
+ };
204
+ assert(HierarchyNodeKey.isInstances(parentNode.key));
205
+ if (parentNode.key.instanceKeys.length === 0) {
206
+ return EMPTY;
207
+ }
208
+ }
209
+ return this._activeHierarchyDefinition
210
+ .defineHierarchyLevel({
211
+ ...defineHierarchyLevelProps,
212
+ createSelectClause: async (selectClauseProps) => nodeSelectClauseFactory.createSelectClause(selectClauseProps),
213
+ /* v8 ignore start */
214
+ createFilterClauses: async (filterClausesProps) => nodeSelectClauseFactory.createFilterClauses(filterClausesProps),
215
+ /* v8 ignore stop */
216
+ parentNode,
217
+ imodelAccess,
218
+ })
219
+ .pipe(mergeAll(), map(
220
+ /* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
221
+ (hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
222
+ }), finalize(() => {
223
+ /* v8 ignore next -- @preserve */
224
+ doLog({
225
+ category: LOGGING_NAMESPACE_PERFORMANCE,
226
+ message: () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
227
+ });
228
+ }));
229
+ }
230
+ createSourceNodesObservable(props) {
231
+ const createSourceNodesFromDefinition = (imodelAccess, def) => {
232
+ if (HierarchyNodesDefinition.isGenericNode(def)) {
233
+ return of({ ...def.node, key: { type: "generic", id: def.node.key, source: this.#sourceName } });
234
+ }
235
+ const query = createInstanceKeysFilteredQuery(def.query, props.targetInstanceKeys);
236
+ return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(readNodes({
237
+ queryExecutor: imodelAccess,
238
+ query,
239
+ limit: props.hierarchyLevelSizeLimit,
240
+ parser: this._activeHierarchyDefinition.parseNode
241
+ ? ({ row }) => this._activeHierarchyDefinition.parseNode({
242
+ row,
243
+ parentNode: props.parentNode,
244
+ imodelKey: imodelAccess.imodelKey,
245
+ })
246
+ : undefined,
247
+ }).pipe(map((node) => ({
248
+ ...node,
249
+ key: {
250
+ ...node.key,
251
+ instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })),
252
+ },
253
+ }))));
254
+ };
255
+ const definitions = this.createHierarchyLevelDefinitionsObservable(props);
256
+ let sourceNodes;
257
+ if (this._imodels.length === 1) {
258
+ sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def)));
259
+ }
260
+ else {
261
+ sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, map(({ node }) => node));
262
+ }
263
+ return sourceNodes.pipe(finalize(() => {
264
+ /* v8 ignore next -- @preserve */
265
+ doLog({
266
+ category: LOGGING_NAMESPACE_PERFORMANCE,
267
+ message: () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,
268
+ });
269
+ }), shareReplayWithErrors());
270
+ }
271
+ createPreProcessedNodesObservable(queryNodesObservable, props) {
272
+ return queryNodesObservable.pipe(
273
+ // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once
274
+ map((node) => ({ ...node })),
275
+ // set parent node keys on the source node
276
+ map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(props.parentNode) })),
277
+ // format `ConcatenatedValue` labels into string labels
278
+ mergeMap((node) => applyLabelsFormatting(node, this._valuesFormatter)),
279
+ // we have `ProcessedHierarchyNode` from here
280
+ // let consumers step-in
281
+ preProcessNodes(this._activeHierarchyDefinition, props.parentNode),
282
+ // process hiding
283
+ createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), createHideNodesInHierarchyOperator(
284
+ // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)
285
+ (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() => {
286
+ /* v8 ignore next -- @preserve */
287
+ doLog({
288
+ category: LOGGING_NAMESPACE_PERFORMANCE,
289
+ message: () => `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
290
+ });
291
+ }));
292
+ }
293
+ createProcessedNodesObservable(preprocessedNodesObservable, props) {
294
+ return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() => {
295
+ /* v8 ignore next -- @preserve */
296
+ doLog({
297
+ category: LOGGING_NAMESPACE_PERFORMANCE,
298
+ message: () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
299
+ });
300
+ }));
301
+ }
302
+ createFinalizedNodesObservable(processedNodesObservable, props) {
303
+ return processedNodesObservable.pipe(createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition, props.parentNode), sortNodesByLabelOperator, map((n) => {
304
+ if ("processingParams" in n) {
305
+ delete n.processingParams;
306
+ }
307
+ return { ...n, children: hasChildren(n) };
308
+ }), takeUntil(this._dispose), finalize(() => {
309
+ /* v8 ignore next -- @preserve */
310
+ doLog({
311
+ category: LOGGING_NAMESPACE_PERFORMANCE,
312
+ message: () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
313
+ });
314
+ }));
315
+ }
316
+ createHasNodesObservable(preprocessedNodesObservable, possiblyKnownChildrenObservable, props) {
317
+ const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;
318
+ return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
319
+ /* v8 ignore next -- @preserve */
320
+ log({
321
+ category: loggingCategory,
322
+ message: (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,
323
+ }), take(1), map(() => true), defaultIfEmpty(false), catchError((e) => {
324
+ /* v8 ignore next -- @preserve */
325
+ doLog({
326
+ category: loggingCategory,
327
+ message: () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,
328
+ });
329
+ if (e instanceof RowsLimitExceededError) {
330
+ return of(true);
331
+ }
332
+ throw e;
333
+ }),
334
+ /* v8 ignore next -- @preserve */
335
+ log({ category: loggingCategory, message: (r) => `[${props.requestContext.requestId}] Result: ${r}` }));
336
+ }
337
+ getCachedObservableEntry(props) {
338
+ const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;
339
+ const { parentNode, ...restProps } = props;
340
+ const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);
341
+ if (cached) {
342
+ /* v8 ignore next -- @preserve */
343
+ doLog({
344
+ category: loggingCategory,
345
+ message: () => `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
346
+ });
347
+ return cached;
348
+ }
349
+ // if we don't find an entry for a grouping node, we load its instances by getting a query and applying
350
+ // a search based on grouped instance keys
351
+ let targetInstanceKeys;
352
+ let parentNonGroupingNode;
353
+ if (parentNode) {
354
+ if (HierarchyNode.isGroupingNode(parentNode)) {
355
+ parentNonGroupingNode = parentNode.nonGroupingAncestor;
356
+ targetInstanceKeys = parentNode.groupedInstanceKeys;
357
+ }
358
+ else {
359
+ // not sure why type checker doesn't pick this up
360
+ assert(HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));
361
+ parentNonGroupingNode = parentNode;
362
+ }
363
+ }
364
+ const nonGroupingNodeChildrenRequestProps = {
365
+ ...restProps,
366
+ parentNode: parentNonGroupingNode,
367
+ ...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
368
+ };
369
+ const value = {
370
+ observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps),
371
+ processingStatus: "none",
372
+ };
373
+ this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
374
+ /* v8 ignore next -- @preserve */
375
+ doLog({
376
+ category: loggingCategory,
377
+ message: () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
378
+ });
379
+ return value;
380
+ }
381
+ getChildNodesObservables(props) {
382
+ const entry = this.getCachedObservableEntry(props);
383
+ switch (entry.processingStatus) {
384
+ case "none": {
385
+ const pre = this.createPreProcessedNodesObservable(entry.observable, props);
386
+ const post = this.createProcessedNodesObservable(pre, props);
387
+ return {
388
+ processedNodes: post,
389
+ hasNodes: this.createHasNodesObservable(pre, entry.observable, props),
390
+ finalizedNodes: this.createFinalizedNodesObservable(post, props),
391
+ };
392
+ }
393
+ case "pre-processed": {
394
+ const post = this.createProcessedNodesObservable(entry.observable, props);
395
+ return {
396
+ processedNodes: post,
397
+ hasNodes: this.createHasNodesObservable(entry.observable, undefined, props),
398
+ finalizedNodes: this.createFinalizedNodesObservable(post, props),
399
+ };
400
+ }
401
+ }
402
+ }
403
+ /**
404
+ * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.
405
+ */
406
+ getNodes(props) {
407
+ const requestContext = { requestId: Guid.createValue() };
408
+ const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;
409
+ const timer = new StopWatch(undefined, true);
410
+ let error;
411
+ let nodesCount = 0;
412
+ /* v8 ignore next -- @preserve */
413
+ doLog({
414
+ category: loggingCategory,
415
+ message: () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
416
+ });
417
+ return eachValueFrom(this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(tap(() => ++nodesCount), catchError((e) => {
418
+ error = e;
419
+ throw e;
420
+ }), finalize(() => {
421
+ /* v8 ignore next -- @preserve */
422
+ doLog({
423
+ category: loggingCategory,
424
+ message: () => error
425
+ ? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
426
+ : `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
427
+ });
428
+ })));
429
+ }
430
+ getNodeInstanceKeysObs(props) {
431
+ const { parentNode, instanceFilter, hierarchyLevelSizeLimit = "unbounded", requestContext } = props;
432
+ if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {
433
+ return from(parentNode.groupedInstanceKeys);
434
+ }
435
+ assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));
436
+ // split the definitions based on whether they're for generic nodes or for instance nodes
437
+ const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
438
+ parentNode,
439
+ instanceFilter,
440
+ requestContext,
441
+ });
442
+ const [instanceDefs, genericDefs] = partition(hierarchyLevelDefinitions, (x) => HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
443
+ // query instance keys and a flag whether they should be hidden
444
+ const instanceKeys = instanceDefs.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(of(def.query).pipe(mergeMap(async (query) => {
445
+ const ecsql = `
446
+ SELECT
447
+ ${NodeSelectClauseColumnNames.FullClassName},
448
+ ${NodeSelectClauseColumnNames.ECInstanceId},
449
+ ${NodeSelectClauseColumnNames.HideNodeInHierarchy}
450
+ FROM (
451
+ ${query.ecsql}
452
+ )
453
+ `;
454
+ const reader = imodelAccess.createQueryReader({ ...query, ecsql }, {
455
+ rowFormat: "Indexes",
456
+ limit: hierarchyLevelSizeLimit,
457
+ restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${Guid.createValue()}`,
458
+ });
459
+ return from(reader).pipe(map((row) => ({
460
+ key: {
461
+ className: normalizeFullClassName(row[0]),
462
+ id: row[1],
463
+ imodelKey: imodelAccess.imodelKey,
464
+ },
465
+ hide: !!row[2],
466
+ })));
467
+ }), mergeAll()))));
468
+ // split the instance keys observable based on whether they should be hidden or not
469
+ const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);
470
+ // hidden items' handling:
471
+ // - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,
472
+ // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`
473
+ const hiddenParentNodes = merge(genericDefs.pipe(filter(({ hierarchyNodesDefinition }) => !!hierarchyNodesDefinition.node.processingParams?.hideInHierarchy), map(({ hierarchyNodesDefinition }) => ({
474
+ type: "generic",
475
+ id: hierarchyNodesDefinition.node.key,
476
+ source: this.#sourceName,
477
+ }))), hiddenNodeInstanceKeys.pipe(
478
+ // first merge all keys by class
479
+ reduceToMergeMapList(({ key }) => key.className, ({ key }) => key),
480
+ // then, for each class, create an instance key
481
+ mergeMap((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
482
+ type: "instances",
483
+ instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
484
+ }))))).pipe(map((key) => ({ key, parentKeys: [], label: "" })));
485
+ // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels
486
+ return merge(visibleNodeInstanceKeys.pipe(map(({ key }) => key)), hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext })))).pipe(takeUntil(this._dispose));
487
+ }
488
+ /**
489
+ * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels
490
+ * that there may be under the given parent node.
491
+ */
492
+ getNodeInstanceKeys(props) {
493
+ const requestContext = { requestId: Guid.createValue() };
494
+ const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;
495
+ const timer = new StopWatch(undefined, true);
496
+ /* v8 ignore next -- @preserve */
497
+ doLog({
498
+ category: loggingCategory,
499
+ message: () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,
500
+ });
501
+ let error;
502
+ let keysCount = 0;
503
+ return eachValueFrom(this.getNodeInstanceKeysObs({ ...props, requestContext }).pipe(tap(() => ++keysCount), catchError((e) => {
504
+ error = e;
505
+ throw e;
506
+ }), finalize(() => {
507
+ /* v8 ignore next -- @preserve */
508
+ doLog({
509
+ category: loggingCategory,
510
+ message: () => error
511
+ ? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
512
+ : `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
513
+ });
514
+ })));
515
+ }
516
+ }
517
+ function preProcessNodes(hierarchyFactory, parentNode) {
518
+ return hierarchyFactory.preProcessNode ? processNodes(hierarchyFactory.preProcessNode, parentNode) : identity;
519
+ }
520
+ function postProcessNodes(hierarchyFactory, parentNode) {
521
+ return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode, parentNode) : identity;
522
+ }
523
+ function processNodes(processor, parentNode) {
524
+ return (nodes) => nodes.pipe(mergeMap((node) => processor({ node, parentNode })));
525
+ }
526
+ function applyLabelsFormatting(node, valueFormatter) {
527
+ return from(formatConcatenatedValue({ value: node.label, valueFormatter })).pipe(map((label) => ({ ...node, label })));
528
+ }
529
+ function createParentNodeKeysList(parentNode) {
530
+ if (!parentNode) {
531
+ return [];
532
+ }
533
+ return [...parentNode.parentKeys, parentNode.key];
534
+ }
535
+ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
536
+ if (!targetInstanceKeys || !targetInstanceKeys.length) {
537
+ return query;
538
+ }
539
+ if (Array.isArray(query.bindings)) {
540
+ return {
541
+ ...query,
542
+ ecsql: `
543
+ SELECT *
544
+ FROM (${query.ecsql}) q
545
+ JOIN IdSet(?) targetInstanceKeys ON targetInstanceKeys.id = q.ECInstanceId
546
+ ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES
547
+ `,
548
+ bindings: [...query.bindings, { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
549
+ };
550
+ }
551
+ const ecsqlVarTargetInstanceKeys = `${ECSQL_PREFIX}targetInstanceKeys`;
552
+ return {
553
+ ...query,
554
+ ecsql: `
555
+ SELECT *
556
+ FROM (${query.ecsql}) q
557
+ JOIN IdSet(:${ecsqlVarTargetInstanceKeys}) targetInstanceKeys ON targetInstanceKeys.id = q.ECInstanceId
558
+ ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES
559
+ `,
560
+ bindings: {
561
+ ...query.bindings,
562
+ [ecsqlVarTargetInstanceKeys]: { type: "idset", value: targetInstanceKeys.map((k) => k.id) },
563
+ },
564
+ };
565
+ }
566
+ // TODO: MISSING_COVERAGE
567
+ /* v8 ignore start */
568
+ function mergeNodes(source) {
569
+ return from(source).pipe(reduce((acc, input) => {
570
+ for (let i = 0; i < acc.length; ++i) {
571
+ if (input.imodelAccess === acc[i].imodelAccess) {
572
+ // don't attempt to merge nodes if they come from the same provider
573
+ continue;
574
+ }
575
+ // the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
576
+ // the node with higher `imodelAccessIndex` first
577
+ const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
578
+ ? {
579
+ imodelAccess: input.imodelAccess,
580
+ imodelAccessIndex: input.imodelAccessIndex,
581
+ primary: input.node,
582
+ secondary: acc[i].node,
583
+ }
584
+ : {
585
+ imodelAccess: acc[i].imodelAccess,
586
+ imodelAccessIndex: acc[i].imodelAccessIndex,
587
+ primary: acc[i].node,
588
+ secondary: input.node,
589
+ };
590
+ const merged = tryMergeNodes(candidates.primary, candidates.secondary);
591
+ if (merged) {
592
+ acc[i] = {
593
+ node: merged,
594
+ imodelAccess: candidates.imodelAccess,
595
+ imodelAccessIndex: candidates.imodelAccessIndex,
596
+ };
597
+ return acc;
598
+ }
599
+ }
600
+ acc.push(input);
601
+ return acc;
602
+ }, new Array()), mergeAll());
603
+ }
604
+ function mergeSearchAttribute(primary, secondary) {
605
+ if (!primary) {
606
+ return secondary;
607
+ }
608
+ if (!secondary) {
609
+ return primary;
610
+ }
611
+ const hasSearchTargetAncestor = primary.hasSearchTargetAncestor || secondary.hasSearchTargetAncestor;
612
+ const isSearchTarget = primary.isSearchTarget || secondary.isSearchTarget;
613
+ const searchOptions = HierarchySearchTree.mergeOptions(primary.options, secondary.options);
614
+ const childrenTargetPathsBuilder = HierarchySearchTree.createBuilder();
615
+ primary.childrenTargetPaths?.forEach((tree) => childrenTargetPathsBuilder.accept({ tree }));
616
+ secondary.childrenTargetPaths?.forEach((tree) => childrenTargetPathsBuilder.accept({ tree }));
617
+ const childrenTargetPaths = childrenTargetPathsBuilder.getTree();
618
+ return {
619
+ ...(hasSearchTargetAncestor ? { hasSearchTargetAncestor } : undefined),
620
+ ...(childrenTargetPaths.length ? { childrenTargetPaths } : undefined),
621
+ ...(isSearchTarget ? { isSearchTarget } : undefined),
622
+ ...(searchOptions ? { options: searchOptions } : undefined),
623
+ };
624
+ }
625
+ function mergeBaseNodeAttributes(primary, secondary) {
626
+ const search = mergeSearchAttribute(primary.search, secondary.search);
627
+ return {
628
+ ...(primary.autoExpand || secondary.autoExpand ? { autoExpand: true } : undefined),
629
+ ...(primary.children && secondary.children ? { children: true } : undefined),
630
+ ...(primary.supportsFiltering || secondary.supportsFiltering ? { supportsFiltering: true } : undefined),
631
+ ...(search ? { search } : undefined),
632
+ };
633
+ }
634
+ function tryMergeInstanceNodes(primary, secondary) {
635
+ if (HierarchyNode.isInstancesNode(primary) &&
636
+ HierarchyNode.isInstancesNode(secondary) &&
637
+ primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => InstanceKey.equals(lhsKey, rhsKey)))) {
638
+ return {
639
+ ...primary,
640
+ key: { type: "instances", instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys) },
641
+ ...mergeBaseNodeAttributes(primary, secondary),
642
+ };
643
+ }
644
+ return undefined;
645
+ }
646
+ function tryMergeGenericNodes(primary, secondary) {
647
+ if (HierarchyNode.isGeneric(primary) && HierarchyNode.isGeneric(secondary) && primary.key.id === secondary.key.id) {
648
+ return { ...primary, ...mergeBaseNodeAttributes(primary, secondary) };
649
+ }
650
+ return undefined;
651
+ }
652
+ function tryMergeNodes(primary, secondary) {
653
+ return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
654
+ }
655
+ /* v8 ignore stop */
656
+ //# sourceMappingURL=IModelHierarchyProvider.js.map