@itwin/presentation-hierarchies 0.1.0

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 (277) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE.md +9 -0
  3. package/README.md +178 -0
  4. package/lib/cjs/hierarchies/HierarchyDefinition.d.ts +228 -0
  5. package/lib/cjs/hierarchies/HierarchyDefinition.d.ts.map +1 -0
  6. package/lib/cjs/hierarchies/HierarchyDefinition.js +94 -0
  7. package/lib/cjs/hierarchies/HierarchyDefinition.js.map +1 -0
  8. package/lib/cjs/hierarchies/HierarchyErrors.d.ts +9 -0
  9. package/lib/cjs/hierarchies/HierarchyErrors.d.ts.map +1 -0
  10. package/lib/cjs/hierarchies/HierarchyErrors.js +20 -0
  11. package/lib/cjs/hierarchies/HierarchyErrors.js.map +1 -0
  12. package/lib/cjs/hierarchies/HierarchyNode.d.ts +337 -0
  13. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -0
  14. package/lib/cjs/hierarchies/HierarchyNode.js +64 -0
  15. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -0
  16. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.d.ts +33 -0
  17. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.d.ts.map +1 -0
  18. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.js +34 -0
  19. package/lib/cjs/hierarchies/HierarchyNodeIdentifier.js.map +1 -0
  20. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts +137 -0
  21. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -0
  22. package/lib/cjs/hierarchies/HierarchyNodeKey.js +163 -0
  23. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -0
  24. package/lib/cjs/hierarchies/HierarchyProvider.d.ts +104 -0
  25. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -0
  26. package/lib/cjs/hierarchies/HierarchyProvider.js +384 -0
  27. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -0
  28. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.d.ts +21 -0
  29. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.d.ts.map +1 -0
  30. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.js +100 -0
  31. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.js.map +1 -0
  32. package/lib/cjs/hierarchies/Logging.d.ts +13 -0
  33. package/lib/cjs/hierarchies/Logging.d.ts.map +1 -0
  34. package/lib/cjs/hierarchies/Logging.js +28 -0
  35. package/lib/cjs/hierarchies/Logging.js.map +1 -0
  36. package/lib/cjs/hierarchies/NodeSelectQueryFactory.d.ts +205 -0
  37. package/lib/cjs/hierarchies/NodeSelectQueryFactory.d.ts.map +1 -0
  38. package/lib/cjs/hierarchies/NodeSelectQueryFactory.js +467 -0
  39. package/lib/cjs/hierarchies/NodeSelectQueryFactory.js.map +1 -0
  40. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.d.ts +40 -0
  41. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.d.ts.map +1 -0
  42. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.js +84 -0
  43. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.js.map +1 -0
  44. package/lib/cjs/hierarchies/internal/Common.d.ts +20 -0
  45. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -0
  46. package/lib/cjs/hierarchies/internal/Common.js +106 -0
  47. package/lib/cjs/hierarchies/internal/Common.js.map +1 -0
  48. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts +12 -0
  49. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +1 -0
  50. package/lib/cjs/hierarchies/internal/EachValueFrom.js +108 -0
  51. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -0
  52. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts +39 -0
  53. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -0
  54. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js +181 -0
  55. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -0
  56. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts +14 -0
  57. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts.map +1 -0
  58. package/lib/cjs/hierarchies/internal/LoggingUtils.js +56 -0
  59. package/lib/cjs/hierarchies/internal/LoggingUtils.js.map +1 -0
  60. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts +17 -0
  61. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -0
  62. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js +57 -0
  63. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +1 -0
  64. package/lib/cjs/hierarchies/internal/TreeNodesReader.d.ts +37 -0
  65. package/lib/cjs/hierarchies/internal/TreeNodesReader.d.ts.map +1 -0
  66. package/lib/cjs/hierarchies/internal/TreeNodesReader.js +46 -0
  67. package/lib/cjs/hierarchies/internal/TreeNodesReader.js.map +1 -0
  68. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.d.ts +11 -0
  69. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.d.ts.map +1 -0
  70. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.js +34 -0
  71. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.js.map +1 -0
  72. package/lib/cjs/hierarchies/internal/operators/Grouping.d.ts +27 -0
  73. package/lib/cjs/hierarchies/internal/operators/Grouping.d.ts.map +1 -0
  74. package/lib/cjs/hierarchies/internal/operators/Grouping.js +161 -0
  75. package/lib/cjs/hierarchies/internal/operators/Grouping.js.map +1 -0
  76. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.d.ts +11 -0
  77. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.d.ts.map +1 -0
  78. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.js +52 -0
  79. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.js.map +1 -0
  80. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.d.ts +11 -0
  81. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.d.ts.map +1 -0
  82. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.js +55 -0
  83. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.js.map +1 -0
  84. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts +6 -0
  85. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +1 -0
  86. package/lib/cjs/hierarchies/internal/operators/Partition.js +61 -0
  87. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -0
  88. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts +22 -0
  89. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -0
  90. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js +51 -0
  91. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -0
  92. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts +7 -0
  93. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -0
  94. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js +25 -0
  95. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -0
  96. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.d.ts +9 -0
  97. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +1 -0
  98. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js +24 -0
  99. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -0
  100. package/lib/cjs/hierarchies/internal/operators/Sorting.d.ts +12 -0
  101. package/lib/cjs/hierarchies/internal/operators/Sorting.d.ts.map +1 -0
  102. package/lib/cjs/hierarchies/internal/operators/Sorting.js +26 -0
  103. package/lib/cjs/hierarchies/internal/operators/Sorting.js.map +1 -0
  104. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts +4 -0
  105. package/lib/cjs/hierarchies/internal/operators/TapOnce.d.ts.map +1 -0
  106. package/lib/cjs/hierarchies/internal/operators/TapOnce.js +20 -0
  107. package/lib/cjs/hierarchies/internal/operators/TapOnce.js.map +1 -0
  108. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.d.ts +4 -0
  109. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.d.ts.map +1 -0
  110. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.js +27 -0
  111. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.js.map +1 -0
  112. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.d.ts +10 -0
  113. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.d.ts.map +1 -0
  114. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.js +115 -0
  115. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.js.map +1 -0
  116. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.d.ts +6 -0
  117. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.d.ts.map +1 -0
  118. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.js +56 -0
  119. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.js.map +1 -0
  120. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.d.ts +4 -0
  121. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.d.ts.map +1 -0
  122. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.js +54 -0
  123. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.js.map +1 -0
  124. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.d.ts +5 -0
  125. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.d.ts.map +1 -0
  126. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.js +61 -0
  127. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.js.map +1 -0
  128. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.d.ts +31 -0
  129. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.d.ts.map +1 -0
  130. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.js +310 -0
  131. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.js.map +1 -0
  132. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.d.ts +5 -0
  133. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.d.ts.map +1 -0
  134. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.js +30 -0
  135. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.js.map +1 -0
  136. package/lib/cjs/presentation-hierarchies.d.ts +11 -0
  137. package/lib/cjs/presentation-hierarchies.d.ts.map +1 -0
  138. package/lib/cjs/presentation-hierarchies.js +31 -0
  139. package/lib/cjs/presentation-hierarchies.js.map +1 -0
  140. package/lib/esm/hierarchies/HierarchyDefinition.d.ts +228 -0
  141. package/lib/esm/hierarchies/HierarchyDefinition.d.ts.map +1 -0
  142. package/lib/esm/hierarchies/HierarchyDefinition.js +90 -0
  143. package/lib/esm/hierarchies/HierarchyDefinition.js.map +1 -0
  144. package/lib/esm/hierarchies/HierarchyErrors.d.ts +9 -0
  145. package/lib/esm/hierarchies/HierarchyErrors.d.ts.map +1 -0
  146. package/lib/esm/hierarchies/HierarchyErrors.js +16 -0
  147. package/lib/esm/hierarchies/HierarchyErrors.js.map +1 -0
  148. package/lib/esm/hierarchies/HierarchyNode.d.ts +337 -0
  149. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -0
  150. package/lib/esm/hierarchies/HierarchyNode.js +61 -0
  151. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -0
  152. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts +33 -0
  153. package/lib/esm/hierarchies/HierarchyNodeIdentifier.d.ts.map +1 -0
  154. package/lib/esm/hierarchies/HierarchyNodeIdentifier.js +31 -0
  155. package/lib/esm/hierarchies/HierarchyNodeIdentifier.js.map +1 -0
  156. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts +137 -0
  157. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -0
  158. package/lib/esm/hierarchies/HierarchyNodeKey.js +160 -0
  159. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -0
  160. package/lib/esm/hierarchies/HierarchyProvider.d.ts +104 -0
  161. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -0
  162. package/lib/esm/hierarchies/HierarchyProvider.js +380 -0
  163. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -0
  164. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.d.ts +21 -0
  165. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.d.ts.map +1 -0
  166. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.js +96 -0
  167. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.js.map +1 -0
  168. package/lib/esm/hierarchies/Logging.d.ts +13 -0
  169. package/lib/esm/hierarchies/Logging.d.ts.map +1 -0
  170. package/lib/esm/hierarchies/Logging.js +23 -0
  171. package/lib/esm/hierarchies/Logging.js.map +1 -0
  172. package/lib/esm/hierarchies/NodeSelectQueryFactory.d.ts +205 -0
  173. package/lib/esm/hierarchies/NodeSelectQueryFactory.d.ts.map +1 -0
  174. package/lib/esm/hierarchies/NodeSelectQueryFactory.js +463 -0
  175. package/lib/esm/hierarchies/NodeSelectQueryFactory.js.map +1 -0
  176. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.d.ts +40 -0
  177. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.d.ts.map +1 -0
  178. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.js +80 -0
  179. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.js.map +1 -0
  180. package/lib/esm/hierarchies/internal/Common.d.ts +20 -0
  181. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -0
  182. package/lib/esm/hierarchies/internal/Common.js +95 -0
  183. package/lib/esm/hierarchies/internal/Common.js.map +1 -0
  184. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts +12 -0
  185. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +1 -0
  186. package/lib/esm/hierarchies/internal/EachValueFrom.js +104 -0
  187. package/lib/esm/hierarchies/internal/EachValueFrom.js.map +1 -0
  188. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts +39 -0
  189. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -0
  190. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js +176 -0
  191. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -0
  192. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts +14 -0
  193. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts.map +1 -0
  194. package/lib/esm/hierarchies/internal/LoggingUtils.js +50 -0
  195. package/lib/esm/hierarchies/internal/LoggingUtils.js.map +1 -0
  196. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts +17 -0
  197. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -0
  198. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js +53 -0
  199. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +1 -0
  200. package/lib/esm/hierarchies/internal/TreeNodesReader.d.ts +37 -0
  201. package/lib/esm/hierarchies/internal/TreeNodesReader.d.ts.map +1 -0
  202. package/lib/esm/hierarchies/internal/TreeNodesReader.js +41 -0
  203. package/lib/esm/hierarchies/internal/TreeNodesReader.js.map +1 -0
  204. package/lib/esm/hierarchies/internal/operators/DetermineChildren.d.ts +11 -0
  205. package/lib/esm/hierarchies/internal/operators/DetermineChildren.d.ts.map +1 -0
  206. package/lib/esm/hierarchies/internal/operators/DetermineChildren.js +30 -0
  207. package/lib/esm/hierarchies/internal/operators/DetermineChildren.js.map +1 -0
  208. package/lib/esm/hierarchies/internal/operators/Grouping.d.ts +27 -0
  209. package/lib/esm/hierarchies/internal/operators/Grouping.d.ts.map +1 -0
  210. package/lib/esm/hierarchies/internal/operators/Grouping.js +156 -0
  211. package/lib/esm/hierarchies/internal/operators/Grouping.js.map +1 -0
  212. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.d.ts +11 -0
  213. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.d.ts.map +1 -0
  214. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.js +48 -0
  215. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.js.map +1 -0
  216. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.d.ts +11 -0
  217. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.d.ts.map +1 -0
  218. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.js +51 -0
  219. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.js.map +1 -0
  220. package/lib/esm/hierarchies/internal/operators/Partition.d.ts +6 -0
  221. package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +1 -0
  222. package/lib/esm/hierarchies/internal/operators/Partition.js +57 -0
  223. package/lib/esm/hierarchies/internal/operators/Partition.js.map +1 -0
  224. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts +22 -0
  225. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -0
  226. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.js +46 -0
  227. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -0
  228. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts +7 -0
  229. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -0
  230. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.js +21 -0
  231. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -0
  232. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts +9 -0
  233. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.d.ts.map +1 -0
  234. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.js +20 -0
  235. package/lib/esm/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -0
  236. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts +12 -0
  237. package/lib/esm/hierarchies/internal/operators/Sorting.d.ts.map +1 -0
  238. package/lib/esm/hierarchies/internal/operators/Sorting.js +22 -0
  239. package/lib/esm/hierarchies/internal/operators/Sorting.js.map +1 -0
  240. package/lib/esm/hierarchies/internal/operators/TapOnce.d.ts +4 -0
  241. package/lib/esm/hierarchies/internal/operators/TapOnce.d.ts.map +1 -0
  242. package/lib/esm/hierarchies/internal/operators/TapOnce.js +16 -0
  243. package/lib/esm/hierarchies/internal/operators/TapOnce.js.map +1 -0
  244. package/lib/esm/hierarchies/internal/operators/grouping/AutoExpand.d.ts +4 -0
  245. package/lib/esm/hierarchies/internal/operators/grouping/AutoExpand.d.ts.map +1 -0
  246. package/lib/esm/hierarchies/internal/operators/grouping/AutoExpand.js +23 -0
  247. package/lib/esm/hierarchies/internal/operators/grouping/AutoExpand.js.map +1 -0
  248. package/lib/esm/hierarchies/internal/operators/grouping/BaseClassGrouping.d.ts +10 -0
  249. package/lib/esm/hierarchies/internal/operators/grouping/BaseClassGrouping.d.ts.map +1 -0
  250. package/lib/esm/hierarchies/internal/operators/grouping/BaseClassGrouping.js +109 -0
  251. package/lib/esm/hierarchies/internal/operators/grouping/BaseClassGrouping.js.map +1 -0
  252. package/lib/esm/hierarchies/internal/operators/grouping/ClassGrouping.d.ts +6 -0
  253. package/lib/esm/hierarchies/internal/operators/grouping/ClassGrouping.d.ts.map +1 -0
  254. package/lib/esm/hierarchies/internal/operators/grouping/ClassGrouping.js +52 -0
  255. package/lib/esm/hierarchies/internal/operators/grouping/ClassGrouping.js.map +1 -0
  256. package/lib/esm/hierarchies/internal/operators/grouping/GroupHiding.d.ts +4 -0
  257. package/lib/esm/hierarchies/internal/operators/grouping/GroupHiding.d.ts.map +1 -0
  258. package/lib/esm/hierarchies/internal/operators/grouping/GroupHiding.js +50 -0
  259. package/lib/esm/hierarchies/internal/operators/grouping/GroupHiding.js.map +1 -0
  260. package/lib/esm/hierarchies/internal/operators/grouping/LabelGrouping.d.ts +5 -0
  261. package/lib/esm/hierarchies/internal/operators/grouping/LabelGrouping.d.ts.map +1 -0
  262. package/lib/esm/hierarchies/internal/operators/grouping/LabelGrouping.js +57 -0
  263. package/lib/esm/hierarchies/internal/operators/grouping/LabelGrouping.js.map +1 -0
  264. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.d.ts +31 -0
  265. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.d.ts.map +1 -0
  266. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.js +302 -0
  267. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.js.map +1 -0
  268. package/lib/esm/hierarchies/internal/operators/grouping/Shared.d.ts +5 -0
  269. package/lib/esm/hierarchies/internal/operators/grouping/Shared.d.ts.map +1 -0
  270. package/lib/esm/hierarchies/internal/operators/grouping/Shared.js +26 -0
  271. package/lib/esm/hierarchies/internal/operators/grouping/Shared.js.map +1 -0
  272. package/lib/esm/presentation-hierarchies.d.ts +11 -0
  273. package/lib/esm/presentation-hierarchies.d.ts.map +1 -0
  274. package/lib/esm/presentation-hierarchies.js +15 -0
  275. package/lib/esm/presentation-hierarchies.js.map +1 -0
  276. package/media/sample-hierarchy.png +0 -0
  277. package/package.json +71 -0
@@ -0,0 +1,80 @@
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 { LRUDictionary, LRUMap } from "@itwin/core-bentley";
6
+ import { HierarchyNodeKey } from "../HierarchyNodeKey";
7
+ /** @internal */
8
+ export class ChildNodeObservablesCache {
9
+ _map;
10
+ _props;
11
+ constructor(props) {
12
+ this._props = props;
13
+ this._map = new LRUDictionary(props.size, compareHierarchyNodeKeys);
14
+ }
15
+ createCacheKeys(props) {
16
+ function createVariationKey() {
17
+ const { instanceFilter, hierarchyLevelSizeLimit } = props;
18
+ if (instanceFilter === undefined && hierarchyLevelSizeLimit === undefined) {
19
+ return undefined;
20
+ }
21
+ return JSON.stringify({ instanceFilter, hierarchyLevelSizeLimit });
22
+ }
23
+ if (!props.parentNode) {
24
+ return { primaryKey: [], variationKey: createVariationKey() };
25
+ }
26
+ const parentKeys = props.parentNode.parentKeys;
27
+ return {
28
+ primaryKey: [...parentKeys, props.parentNode.key],
29
+ variationKey: createVariationKey(),
30
+ };
31
+ }
32
+ getCacheAccessors(primaryKey, variationKey) {
33
+ const getMapEntry = (create) => {
34
+ let entry = this._map.get(primaryKey);
35
+ if (!entry && create) {
36
+ entry = { primary: undefined, variations: new LRUMap(this._props.variationsCount ?? 1) };
37
+ this._map.set(primaryKey, entry);
38
+ }
39
+ return entry;
40
+ };
41
+ if (variationKey) {
42
+ return {
43
+ get: () => getMapEntry(false)?.variations.get(variationKey),
44
+ set: (value) => {
45
+ getMapEntry(true).variations.set(variationKey, value);
46
+ },
47
+ };
48
+ }
49
+ return {
50
+ get: () => getMapEntry(false)?.primary,
51
+ set: (value) => {
52
+ getMapEntry(true).primary = value;
53
+ },
54
+ };
55
+ }
56
+ set(requestProps, value) {
57
+ const { primaryKey, variationKey } = this.createCacheKeys(requestProps);
58
+ this.getCacheAccessors(primaryKey, variationKey).set(value);
59
+ }
60
+ get(requestProps) {
61
+ const { primaryKey, variationKey } = this.createCacheKeys(requestProps);
62
+ return this.getCacheAccessors(primaryKey, variationKey).get();
63
+ }
64
+ clear() {
65
+ this._map.clear();
66
+ }
67
+ }
68
+ function compareHierarchyNodeKeys(lhs, rhs) {
69
+ if (lhs.length !== rhs.length) {
70
+ return lhs.length - rhs.length;
71
+ }
72
+ for (let i = 0; i < lhs.length; ++i) {
73
+ const keysCompareResult = HierarchyNodeKey.compare(lhs[i], rhs[i]);
74
+ if (keysCompareResult !== 0) {
75
+ return keysCompareResult;
76
+ }
77
+ }
78
+ return 0;
79
+ }
80
+ //# sourceMappingURL=ChildNodeObservablesCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChildNodeObservablesCache.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/ChildNodeObservablesCache.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Observable } from \"rxjs\";\nimport { LRUCache, LRUDictionary, LRUMap } from \"@itwin/core-bentley\";\nimport { ParsedHierarchyNode, ProcessedHierarchyNode } from \"../HierarchyNode\";\nimport { HierarchyNodeKey } from \"../HierarchyNodeKey\";\nimport { GetHierarchyNodesProps } from \"../HierarchyProvider\";\n\n/** @internal */\nexport type ParsedQueryNodesObservable = Observable<ParsedHierarchyNode>;\n\n/** @internal */\nexport type ProcessedNodesObservable = Observable<ProcessedHierarchyNode>;\n\n/** @internal */\nexport type CachedNodesObservableEntry =\n | { observable: ParsedQueryNodesObservable; processingStatus: \"none\" }\n | { observable: ProcessedNodesObservable; processingStatus: \"pre-processed\" };\n\n/** @internal */\nexport interface ChildNodesCacheEntry {\n /** Stores observables for the default case - no instance filter or custom limit for the hierarchy level. */\n primary: CachedNodesObservableEntry | undefined;\n /** Stores a limited number of variations with custom instance filter and/or custom limit for the hierarchy level. */\n variations: LRUCache<string, CachedNodesObservableEntry>;\n}\n\n/** @internal */\nexport interface ChildNodeObservablesCacheProps {\n size: number;\n variationsCount?: number;\n}\n\n/** @internal */\nexport class ChildNodeObservablesCache {\n private _map: LRUDictionary<HierarchyNodeKey[], ChildNodesCacheEntry>;\n private _props: ChildNodeObservablesCacheProps;\n\n public constructor(props: ChildNodeObservablesCacheProps) {\n this._props = props;\n this._map = new LRUDictionary<HierarchyNodeKey[], ChildNodesCacheEntry>(props.size, compareHierarchyNodeKeys);\n }\n\n private createCacheKeys(\n props: Omit<GetHierarchyNodesProps, \"parentNode\"> & { parentNode: { key: HierarchyNodeKey; parentKeys: HierarchyNodeKey[] } | undefined },\n ) {\n function createVariationKey() {\n const { instanceFilter, hierarchyLevelSizeLimit } = props;\n if (instanceFilter === undefined && hierarchyLevelSizeLimit === undefined) {\n return undefined;\n }\n return JSON.stringify({ instanceFilter, hierarchyLevelSizeLimit });\n }\n\n if (!props.parentNode) {\n return { primaryKey: [], variationKey: createVariationKey() };\n }\n\n const parentKeys = props.parentNode.parentKeys;\n\n return {\n primaryKey: [...parentKeys, props.parentNode.key],\n variationKey: createVariationKey(),\n };\n }\n\n private getCacheAccessors(primaryKey: HierarchyNodeKey[], variationKey?: string) {\n const getMapEntry = (create: boolean) => {\n let entry = this._map.get(primaryKey);\n if (!entry && create) {\n entry = { primary: undefined, variations: new LRUMap(this._props.variationsCount ?? 1) };\n this._map.set(primaryKey, entry);\n }\n return entry;\n };\n if (variationKey) {\n return {\n get: () => getMapEntry(false)?.variations.get(variationKey),\n set: (value: CachedNodesObservableEntry) => {\n getMapEntry(true)!.variations.set(variationKey, value);\n },\n };\n }\n return {\n get: () => getMapEntry(false)?.primary,\n set: (value: CachedNodesObservableEntry) => {\n getMapEntry(true)!.primary = value;\n },\n };\n }\n\n public set(requestProps: GetHierarchyNodesProps, value: CachedNodesObservableEntry) {\n const { primaryKey, variationKey } = this.createCacheKeys(requestProps);\n this.getCacheAccessors(primaryKey, variationKey).set(value);\n }\n\n public get(requestProps: GetHierarchyNodesProps): CachedNodesObservableEntry | undefined {\n const { primaryKey, variationKey } = this.createCacheKeys(requestProps);\n return this.getCacheAccessors(primaryKey, variationKey).get();\n }\n\n public clear() {\n this._map.clear();\n }\n}\n\nfunction compareHierarchyNodeKeys(lhs: HierarchyNodeKey[], rhs: HierarchyNodeKey[]) {\n if (lhs.length !== rhs.length) {\n return lhs.length - rhs.length;\n }\n for (let i = 0; i < lhs.length; ++i) {\n const keysCompareResult = HierarchyNodeKey.compare(lhs[i], rhs[i]);\n if (keysCompareResult !== 0) {\n return keysCompareResult;\n }\n }\n return 0;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { HierarchyNode, ParentHierarchyNode, ParsedHierarchyNode, ProcessedCustomHierarchyNode, ProcessedInstanceHierarchyNode } from "../HierarchyNode";
2
+ /** @internal */
3
+ export declare const LOGGING_NAMESPACE = "Presentation.Hierarchies";
4
+ /** @internal */
5
+ export declare function mergeNodes<TNode extends ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>(lhs: TNode, rhs: TNode): TNode;
6
+ /** @internal */
7
+ export declare function hasChildren<TNode extends {
8
+ children?: boolean | Array<unknown>;
9
+ }>(node: TNode): boolean;
10
+ /** @internal */
11
+ export declare function createOperatorLoggingNamespace(operatorName: string): string;
12
+ /** @internal */
13
+ export declare function compareNodesByLabel<TLhsNode extends {
14
+ label: string;
15
+ }, TRhsNode extends {
16
+ label: string;
17
+ }>(lhs: TLhsNode, rhs: TRhsNode): number;
18
+ /** @internal */
19
+ export declare function createNodeIdentifierForLogging(node: ParentHierarchyNode | HierarchyNode | ParsedHierarchyNode | undefined): string;
20
+ //# sourceMappingURL=Common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Common.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/Common.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,aAAa,EAGb,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC/B,MAAM,kBAAkB,CAAC;AAG1B,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAuD5D,gBAAgB;AAChB,wBAAgB,UAAU,CAAC,KAAK,SAAS,4BAA4B,GAAG,8BAA8B,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,CAkBrI;AAED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,KAAK,SAAS;IAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAA;CAAE,EAAE,IAAI,EAAE,KAAK,WAE7F;AAED,gBAAgB;AAChB,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,UAElE;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,QAAQ,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAEhJ;AAED,gBAAgB;AAEhB,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,mBAAmB,GAAG,aAAa,GAAG,mBAAmB,GAAG,SAAS,UAOzH"}
@@ -0,0 +1,95 @@
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 naturalCompare from "natural-compare-lite";
6
+ import { assert } from "@itwin/core-bentley";
7
+ import { HierarchyNodeKey } from "../HierarchyNodeKey";
8
+ /** @internal */
9
+ export const LOGGING_NAMESPACE = "Presentation.Hierarchies";
10
+ function mergeNodeHandlingParams(lhs, rhs) {
11
+ if (!lhs && !rhs) {
12
+ return undefined;
13
+ }
14
+ const params = {
15
+ ...(lhs?.hideIfNoChildren || rhs?.hideIfNoChildren ? { hideIfNoChildren: true } : undefined),
16
+ ...(lhs?.hideInHierarchy || rhs?.hideInHierarchy ? { hideInHierarchy: true } : undefined),
17
+ ...mergeByLabelParams(lhs?.grouping?.byLabel, rhs?.grouping?.byLabel),
18
+ };
19
+ return Object.keys(params).length > 0 ? params : undefined;
20
+ }
21
+ function mergeByLabelParams(lhs, rhs) {
22
+ if (lhs && typeof lhs === "object" && lhs.action === "merge" && rhs && typeof rhs === "object" && rhs.action === "merge" && lhs.groupId === rhs.groupId) {
23
+ return {
24
+ grouping: { byLabel: lhs },
25
+ };
26
+ }
27
+ return undefined;
28
+ }
29
+ function mergeNodeKeys(lhs, rhs) {
30
+ if (HierarchyNodeKey.isCustom(lhs)) {
31
+ assert(HierarchyNodeKey.isCustom(rhs));
32
+ return lhs === rhs ? lhs : `${lhs}+${rhs}`;
33
+ }
34
+ // istanbul ignore else
35
+ if (HierarchyNodeKey.isInstances(lhs)) {
36
+ assert(HierarchyNodeKey.isInstances(rhs));
37
+ return { type: "instances", instanceKeys: [...lhs.instanceKeys, ...rhs.instanceKeys] };
38
+ }
39
+ // https://github.com/microsoft/TypeScript/issues/21985
40
+ // istanbul ignore next
41
+ return ((x) => x)(lhs);
42
+ }
43
+ function mergeParentNodeKeys(lhsKeys, rhsKeys) {
44
+ const res = new Array();
45
+ for (let i = 0; i < lhsKeys.length && i < rhsKeys.length; ++i) {
46
+ if (!HierarchyNodeKey.equals(lhsKeys[i], rhsKeys[i])) {
47
+ break;
48
+ }
49
+ res.push(lhsKeys[i]);
50
+ }
51
+ return res;
52
+ }
53
+ /** @internal */
54
+ export function mergeNodes(lhs, rhs) {
55
+ assert(typeof lhs.key === typeof rhs.key);
56
+ const mergedProcessingParams = mergeNodeHandlingParams(lhs.processingParams, rhs.processingParams);
57
+ const mergedChildren = lhs.children === true || rhs.children === true ? true : lhs.children === false && rhs.children === false ? false : undefined;
58
+ const mergedNode = {
59
+ ...lhs,
60
+ ...rhs,
61
+ label: lhs.label,
62
+ key: mergeNodeKeys(lhs.key, rhs.key),
63
+ parentKeys: mergeParentNodeKeys(lhs.parentKeys, rhs.parentKeys),
64
+ };
65
+ // Remove specific properties or change their values based on lhs and rhs nodes
66
+ mergedChildren !== undefined ? (mergedNode.children = mergedChildren) : delete mergedNode.children;
67
+ mergedProcessingParams ? (mergedNode.processingParams = mergedProcessingParams) : delete mergedNode.processingParams;
68
+ lhs.autoExpand || rhs.autoExpand ? (mergedNode.autoExpand = true) : delete mergedNode.autoExpand;
69
+ lhs.extendedData || rhs.extendedData ? (mergedNode.extendedData = { ...lhs.extendedData, ...rhs.extendedData }) : delete mergedNode.extendedData;
70
+ lhs.supportsFiltering && rhs.supportsFiltering ? (mergedNode.supportsFiltering = true) : delete mergedNode.supportsFiltering;
71
+ return mergedNode;
72
+ }
73
+ /** @internal */
74
+ export function hasChildren(node) {
75
+ return node.children === true || (Array.isArray(node.children) && node.children.length > 0);
76
+ }
77
+ /** @internal */
78
+ export function createOperatorLoggingNamespace(operatorName) {
79
+ return `${LOGGING_NAMESPACE}.Operators.${operatorName}`;
80
+ }
81
+ /** @internal */
82
+ export function compareNodesByLabel(lhs, rhs) {
83
+ return naturalCompare(lhs.label.toLocaleLowerCase(), rhs.label.toLocaleLowerCase());
84
+ }
85
+ /** @internal */
86
+ // istanbul ignore next
87
+ export function createNodeIdentifierForLogging(node) {
88
+ if (!node) {
89
+ return "<root>";
90
+ }
91
+ const { label, key } = node;
92
+ const parentKeys = "parentKeys" in node ? node.parentKeys : "<unknown>";
93
+ return JSON.stringify({ label, key, parentKeys });
94
+ }
95
+ //# sourceMappingURL=Common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/Common.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport naturalCompare from \"natural-compare-lite\";\nimport { assert } from \"@itwin/core-bentley\";\nimport {\n HierarchyNode,\n HierarchyNodeLabelGroupingParams,\n InstanceHierarchyNodeProcessingParams,\n ParentHierarchyNode,\n ParsedHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"../HierarchyNode\";\nimport { HierarchyNodeKey, InstancesNodeKey } from \"../HierarchyNodeKey\";\n\n/** @internal */\nexport const LOGGING_NAMESPACE = \"Presentation.Hierarchies\";\n\nfunction mergeNodeHandlingParams(\n lhs: InstanceHierarchyNodeProcessingParams | undefined,\n rhs: InstanceHierarchyNodeProcessingParams | undefined,\n): InstanceHierarchyNodeProcessingParams | undefined {\n if (!lhs && !rhs) {\n return undefined;\n }\n const params = {\n ...(lhs?.hideIfNoChildren || rhs?.hideIfNoChildren ? { hideIfNoChildren: true } : undefined),\n ...(lhs?.hideInHierarchy || rhs?.hideInHierarchy ? { hideInHierarchy: true } : undefined),\n ...mergeByLabelParams(lhs?.grouping?.byLabel, rhs?.grouping?.byLabel),\n };\n return Object.keys(params).length > 0 ? params : undefined;\n}\n\nfunction mergeByLabelParams(\n lhs: HierarchyNodeLabelGroupingParams | undefined,\n rhs: HierarchyNodeLabelGroupingParams | undefined,\n): InstanceHierarchyNodeProcessingParams | undefined {\n if (lhs && typeof lhs === \"object\" && lhs.action === \"merge\" && rhs && typeof rhs === \"object\" && rhs.action === \"merge\" && lhs.groupId === rhs.groupId) {\n return {\n grouping: { byLabel: lhs },\n };\n }\n return undefined;\n}\n\nfunction mergeNodeKeys<TKey extends string | InstancesNodeKey>(lhs: TKey, rhs: TKey): TKey {\n if (HierarchyNodeKey.isCustom(lhs)) {\n assert(HierarchyNodeKey.isCustom(rhs));\n return lhs === rhs ? lhs : (`${lhs}+${rhs}` as TKey);\n }\n // istanbul ignore else\n if (HierarchyNodeKey.isInstances(lhs)) {\n assert(HierarchyNodeKey.isInstances(rhs));\n return { type: \"instances\", instanceKeys: [...lhs.instanceKeys, ...rhs.instanceKeys] } as TKey;\n }\n // https://github.com/microsoft/TypeScript/issues/21985\n // istanbul ignore next\n return ((x: never) => x)(lhs);\n}\n\nfunction mergeParentNodeKeys(lhsKeys: HierarchyNodeKey[], rhsKeys: HierarchyNodeKey[]): HierarchyNodeKey[] {\n const res = new Array<HierarchyNodeKey>();\n for (let i = 0; i < lhsKeys.length && i < rhsKeys.length; ++i) {\n if (!HierarchyNodeKey.equals(lhsKeys[i], rhsKeys[i])) {\n break;\n }\n res.push(lhsKeys[i]);\n }\n return res;\n}\n\n/** @internal */\nexport function mergeNodes<TNode extends ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>(lhs: TNode, rhs: TNode): TNode {\n assert(typeof lhs.key === typeof rhs.key);\n const mergedProcessingParams = mergeNodeHandlingParams(lhs.processingParams, rhs.processingParams);\n const mergedChildren = lhs.children === true || rhs.children === true ? true : lhs.children === false && rhs.children === false ? false : undefined;\n const mergedNode = {\n ...lhs,\n ...rhs,\n label: lhs.label,\n key: mergeNodeKeys(lhs.key, rhs.key),\n parentKeys: mergeParentNodeKeys(lhs.parentKeys, rhs.parentKeys),\n } as TNode;\n // Remove specific properties or change their values based on lhs and rhs nodes\n mergedChildren !== undefined ? (mergedNode.children = mergedChildren) : delete mergedNode.children;\n mergedProcessingParams ? (mergedNode.processingParams = mergedProcessingParams) : delete mergedNode.processingParams;\n lhs.autoExpand || rhs.autoExpand ? (mergedNode.autoExpand = true) : delete mergedNode.autoExpand;\n lhs.extendedData || rhs.extendedData ? (mergedNode.extendedData = { ...lhs.extendedData, ...rhs.extendedData }) : delete mergedNode.extendedData;\n lhs.supportsFiltering && rhs.supportsFiltering ? (mergedNode.supportsFiltering = true) : delete mergedNode.supportsFiltering;\n return mergedNode;\n}\n\n/** @internal */\nexport function hasChildren<TNode extends { children?: boolean | Array<unknown> }>(node: TNode) {\n return node.children === true || (Array.isArray(node.children) && node.children.length > 0);\n}\n\n/** @internal */\nexport function createOperatorLoggingNamespace(operatorName: string) {\n return `${LOGGING_NAMESPACE}.Operators.${operatorName}`;\n}\n\n/** @internal */\nexport function compareNodesByLabel<TLhsNode extends { label: string }, TRhsNode extends { label: string }>(lhs: TLhsNode, rhs: TRhsNode): number {\n return naturalCompare(lhs.label.toLocaleLowerCase(), rhs.label.toLocaleLowerCase());\n}\n\n/** @internal */\n// istanbul ignore next\nexport function createNodeIdentifierForLogging(node: ParentHierarchyNode | HierarchyNode | ParsedHierarchyNode | undefined) {\n if (!node) {\n return \"<root>\";\n }\n const { label, key } = node;\n const parentKeys = \"parentKeys\" in node ? node.parentKeys : \"<unknown>\";\n return JSON.stringify({ label, key, parentKeys });\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { Observable } from "rxjs";
2
+ /**
3
+ * This is pretty much a combination of:
4
+ * - https://github.com/benlesh/rxjs-for-await/blob/94f9cf9cb015ac3700dfd1850eb81d36962eb70f/src/index.ts#L33,
5
+ * - https://github.com/ReactiveX/rxjs/blob/2587ee852eb43eeb0883a7787bac2944d823392b/packages/observable/src/observable.ts#L922.
6
+ *
7
+ * Our implementation uses a linked list rather than an array to store values, which is more efficient.
8
+ *
9
+ * @internal
10
+ */
11
+ export declare function eachValueFrom<T>(source: Observable<T>): AsyncIterableIterator<T>;
12
+ //# sourceMappingURL=EachValueFrom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EachValueFrom.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/EachValueFrom.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAElC;;;;;;;;GAQG;AACH,wBAAuB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAqDvF"}
@@ -0,0 +1,104 @@
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
+ /**
6
+ * This is pretty much a combination of:
7
+ * - https://github.com/benlesh/rxjs-for-await/blob/94f9cf9cb015ac3700dfd1850eb81d36962eb70f/src/index.ts#L33,
8
+ * - https://github.com/ReactiveX/rxjs/blob/2587ee852eb43eeb0883a7787bac2944d823392b/packages/observable/src/observable.ts#L922.
9
+ *
10
+ * Our implementation uses a linked list rather than an array to store values, which is more efficient.
11
+ *
12
+ * @internal
13
+ */
14
+ export async function* eachValueFrom(source) {
15
+ const deferreds = new Queue();
16
+ const values = new Queue();
17
+ let error;
18
+ let completed = false;
19
+ const subs = source.subscribe({
20
+ next: (value) => {
21
+ const deferred = deferreds.pop();
22
+ if (deferred) {
23
+ deferred.resolve({ value, done: false });
24
+ }
25
+ else {
26
+ values.push(value);
27
+ }
28
+ },
29
+ error: (err) => {
30
+ error = err;
31
+ for (let deferred = deferreds.pop(); deferred !== undefined; deferred = deferreds.pop()) {
32
+ deferred.reject(err);
33
+ }
34
+ },
35
+ complete: () => {
36
+ completed = true;
37
+ for (let deferred = deferreds.pop(); deferred !== undefined; deferred = deferreds.pop()) {
38
+ deferred.resolve({ value: undefined, done: true });
39
+ }
40
+ },
41
+ });
42
+ try {
43
+ while (true) {
44
+ const value = values.pop();
45
+ if (value !== undefined) {
46
+ yield value;
47
+ continue;
48
+ }
49
+ if (completed) {
50
+ return;
51
+ }
52
+ if (error) {
53
+ throw error;
54
+ }
55
+ const result = await new Promise((resolve, reject) => {
56
+ deferreds.push({ resolve, reject });
57
+ });
58
+ if (result.done) {
59
+ return;
60
+ }
61
+ yield result.value;
62
+ }
63
+ }
64
+ catch (err) {
65
+ throw err;
66
+ }
67
+ finally {
68
+ subs.unsubscribe();
69
+ }
70
+ }
71
+ class QueueEntry {
72
+ value;
73
+ next;
74
+ constructor(value, next) {
75
+ this.value = value;
76
+ this.next = next;
77
+ }
78
+ }
79
+ class Queue {
80
+ _front;
81
+ _back;
82
+ push(item) {
83
+ const entry = new QueueEntry(item);
84
+ if (this._back) {
85
+ this._back.next = entry;
86
+ }
87
+ this._back = entry;
88
+ if (!this._front) {
89
+ this._front = entry;
90
+ }
91
+ }
92
+ pop() {
93
+ if (!this._front) {
94
+ return undefined;
95
+ }
96
+ const value = this._front.value;
97
+ this._front = this._front.next;
98
+ if (!this._front) {
99
+ this._back = undefined;
100
+ }
101
+ return value;
102
+ }
103
+ }
104
+ //# sourceMappingURL=EachValueFrom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EachValueFrom.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/EachValueFrom.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Observable } from \"rxjs\";\n\n/**\n * This is pretty much a combination of:\n * - https://github.com/benlesh/rxjs-for-await/blob/94f9cf9cb015ac3700dfd1850eb81d36962eb70f/src/index.ts#L33,\n * - https://github.com/ReactiveX/rxjs/blob/2587ee852eb43eeb0883a7787bac2944d823392b/packages/observable/src/observable.ts#L922.\n *\n * Our implementation uses a linked list rather than an array to store values, which is more efficient.\n *\n * @internal\n */\nexport async function* eachValueFrom<T>(source: Observable<T>): AsyncIterableIterator<T> {\n const deferreds = new Queue<{ resolve: (value: IteratorResult<T>) => void; reject: (reason: unknown) => void }>();\n const values = new Queue<T>();\n let error;\n let completed = false;\n const subs = source.subscribe({\n next: (value) => {\n const deferred = deferreds.pop();\n if (deferred) {\n deferred.resolve({ value, done: false });\n } else {\n values.push(value);\n }\n },\n error: (err) => {\n error = err;\n for (let deferred = deferreds.pop(); deferred !== undefined; deferred = deferreds.pop()) {\n deferred.reject(err);\n }\n },\n complete: () => {\n completed = true;\n for (let deferred = deferreds.pop(); deferred !== undefined; deferred = deferreds.pop()) {\n deferred.resolve({ value: undefined, done: true });\n }\n },\n });\n try {\n while (true) {\n const value = values.pop();\n if (value !== undefined) {\n yield value;\n continue;\n }\n if (completed) {\n return;\n }\n if (error) {\n throw error;\n }\n const result = await new Promise<IteratorResult<T>>((resolve, reject) => {\n deferreds.push({ resolve, reject });\n });\n if (result.done) {\n return;\n }\n yield result.value;\n }\n } catch (err) {\n throw err;\n } finally {\n subs.unsubscribe();\n }\n}\n\nclass QueueEntry<T> {\n constructor(\n public readonly value: T,\n public next?: QueueEntry<T>,\n ) {}\n}\n\nclass Queue<T> {\n private _front?: QueueEntry<T>;\n private _back?: QueueEntry<T>;\n\n public push(item: T) {\n const entry = new QueueEntry<T>(item);\n if (this._back) {\n this._back.next = entry;\n }\n this._back = entry;\n if (!this._front) {\n this._front = entry;\n }\n }\n\n public pop(): T | undefined {\n if (!this._front) {\n return undefined;\n }\n const value = this._front.value;\n this._front = this._front.next;\n if (!this._front) {\n this._back = undefined;\n }\n return value;\n }\n}\n"]}
@@ -0,0 +1,39 @@
1
+ import { ECClassHierarchyInspector, InstanceKey } from "@itwin/presentation-shared";
2
+ import { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyLevelDefinition, InstanceNodesQueryDefinition, NodeParser, NodePostProcessor, NodePreProcessor } from "../HierarchyDefinition";
3
+ import { ProcessedHierarchyNode } from "../HierarchyNode";
4
+ import { HierarchyNodeIdentifiersPath } from "../HierarchyNodeIdentifier";
5
+ /** @internal */
6
+ export interface FilteringQueryBuilderProps {
7
+ classHierarchy: ECClassHierarchyInspector;
8
+ source: HierarchyDefinition;
9
+ nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];
10
+ }
11
+ /** @internal */
12
+ export type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {
13
+ isFilterTarget?: boolean;
14
+ filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];
15
+ };
16
+ /** @internal */
17
+ export declare class FilteringHierarchyDefinition implements HierarchyDefinition {
18
+ private _classHierarchy;
19
+ private _source;
20
+ private _nodeIdentifierPaths;
21
+ constructor(props: FilteringQueryBuilderProps);
22
+ get preProcessNode(): NodePreProcessor;
23
+ get postProcessNode(): NodePostProcessor;
24
+ get parseNode(): NodeParser;
25
+ defineHierarchyLevel(props: DefineHierarchyLevelProps & {
26
+ parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps["parentNode"]> | undefined;
27
+ }): Promise<HierarchyLevelDefinition>;
28
+ private getFilteringProps;
29
+ }
30
+ /** @internal */
31
+ export declare const ECSQL_COLUMN_NAME_FilteredChildrenPaths = "FilteredChildrenPaths";
32
+ /** @internal */
33
+ export declare const ECSQL_COLUMN_NAME_IsFilterTarget = "IsFilterTarget";
34
+ /** @internal */
35
+ export declare function applyECInstanceIdsFilter(def: InstanceNodesQueryDefinition, matchingFilters: Array<{
36
+ id: InstanceKey;
37
+ childrenIdentifierPaths: HierarchyNodeIdentifiersPath[];
38
+ }>, isFilterTarget: boolean, isParentFilterTarget: boolean): InstanceNodesQueryDefinition;
39
+ //# sourceMappingURL=FilteringHierarchyDefinition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilteringHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAEL,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAExB,4BAA4B,EAC5B,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAmE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC3H,OAAO,EAA2B,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAGnG,gBAAgB;AAChB,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,yBAAyB,CAAC;IAC1C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mBAAmB,EAAE,4BAA4B,EAAE,CAAC;CACrD;AAED,gBAAgB;AAChB,MAAM,MAAM,qBAAqB,CAAC,KAAK,GAAG,sBAAsB,IAAI,KAAK,GAAG;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+BAA+B,CAAC,EAAE,4BAA4B,EAAE,CAAC;CAClE,CAAC;AAEF,gBAAgB;AAChB,qBAAa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,oBAAoB,CAAiC;gBAE1C,KAAK,EAAE,0BAA0B;IAMpD,IAAW,cAAc,IAAI,gBAAgB,CAS5C;IAED,IAAW,eAAe,IAAI,iBAAiB,CAY9C;IAED,IAAW,SAAS,IAAI,UAAU,CASjC;IAEY,oBAAoB,CAC/B,KAAK,EAAE,yBAAyB,GAAG;QAAE,UAAU,EAAE,qBAAqB,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,GAAG,SAAS,CAAA;KAAE,GAC5H,OAAO,CAAC,wBAAwB,CAAC;IAqDpC,OAAO,CAAC,iBAAiB;CAM1B;AA8DD,gBAAgB;AAEhB,eAAO,MAAM,uCAAuC,0BAA0B,CAAC;AAE/E,gBAAgB;AAEhB,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,gBAAgB;AAChB,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,EACjC,eAAe,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,uBAAuB,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAAC,EACpG,cAAc,EAAE,OAAO,EACvB,oBAAoB,EAAE,OAAO,GAC5B,4BAA4B,CA8B9B"}
@@ -0,0 +1,176 @@
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 { HierarchyNodesDefinition, } from "../HierarchyDefinition";
6
+ import { HierarchyNode } from "../HierarchyNode";
7
+ import { HierarchyNodeIdentifier } from "../HierarchyNodeIdentifier";
8
+ import { defaultNodesParser } from "./TreeNodesReader";
9
+ /** @internal */
10
+ export class FilteringHierarchyDefinition {
11
+ _classHierarchy;
12
+ _source;
13
+ _nodeIdentifierPaths;
14
+ constructor(props) {
15
+ this._classHierarchy = props.classHierarchy;
16
+ this._source = props.source;
17
+ this._nodeIdentifierPaths = props.nodeIdentifierPaths;
18
+ }
19
+ get preProcessNode() {
20
+ return async (node) => {
21
+ const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;
22
+ if (processedNode?.processingParams?.hideInHierarchy && node.isFilterTarget) {
23
+ // we want to hide target nodes if they have `hideInHierarchy` param
24
+ return undefined;
25
+ }
26
+ return processedNode;
27
+ };
28
+ }
29
+ get postProcessNode() {
30
+ return async (node) => {
31
+ const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;
32
+ if (
33
+ // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing
34
+ HierarchyNode.isClassGroupingNode(node) &&
35
+ node.children.some((child) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)) {
36
+ return Object.assign(processedNode, { autoExpand: true });
37
+ }
38
+ return processedNode;
39
+ };
40
+ }
41
+ get parseNode() {
42
+ return (row) => {
43
+ const isFilterTarget = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];
44
+ const parsedFilteredChildrenIdentifierPaths = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]
45
+ ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])
46
+ : undefined;
47
+ const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);
48
+ return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget);
49
+ };
50
+ }
51
+ async defineHierarchyLevel(props) {
52
+ const sourceDefinitions = await this._source.defineHierarchyLevel(props);
53
+ const { filteredNodePaths, isParentFilterTarget } = this.getFilteringProps(props.parentNode);
54
+ if (!filteredNodePaths) {
55
+ return sourceDefinitions;
56
+ }
57
+ const filteredDefinitions = [];
58
+ await Promise.all(sourceDefinitions.map(async (definition) => {
59
+ let matchedDefinition;
60
+ if (HierarchyNodesDefinition.isCustomNode(definition)) {
61
+ matchedDefinition = await matchFilters(definition, { filteredNodePaths, isParentFilterTarget }, async (id) => {
62
+ if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {
63
+ return false;
64
+ }
65
+ return id.key === definition.node.key;
66
+ }, (def, matchingFilters, isFilterTarget) => {
67
+ const filteredChildrenIdentifierPaths = matchingFilters.reduce((r, c) => [...r, ...c.childrenIdentifierPaths], new Array());
68
+ return {
69
+ ...def,
70
+ node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget),
71
+ };
72
+ });
73
+ }
74
+ else {
75
+ matchedDefinition = await matchFilters(definition, { filteredNodePaths, isParentFilterTarget }, async (id) => {
76
+ if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {
77
+ return false;
78
+ }
79
+ return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);
80
+ }, (def, matchingFilters, isFilterTarget) => applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isParentFilterTarget));
81
+ }
82
+ if (matchedDefinition) {
83
+ filteredDefinitions.push(matchedDefinition);
84
+ }
85
+ }));
86
+ return filteredDefinitions;
87
+ }
88
+ getFilteringProps(parentNode) {
89
+ if (!parentNode) {
90
+ return { filteredNodePaths: this._nodeIdentifierPaths, isParentFilterTarget: false };
91
+ }
92
+ return { filteredNodePaths: parentNode.filteredChildrenIdentifierPaths, isParentFilterTarget: parentNode.isFilterTarget };
93
+ }
94
+ }
95
+ async function matchFilters(definition, filteringProps, predicate, matchedDefinitionProcessor) {
96
+ const { filteredNodePaths, isParentFilterTarget } = filteringProps;
97
+ let isFilterTarget = false;
98
+ const matchingFilters = [];
99
+ for (const path of filteredNodePaths) {
100
+ if (path.length === 0) {
101
+ continue;
102
+ }
103
+ const nodeId = path[0];
104
+ if (await predicate(nodeId)) {
105
+ let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;
106
+ if (!childrenIdentifierPaths) {
107
+ childrenIdentifierPaths = [];
108
+ matchingFilters.push({
109
+ // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment
110
+ // async type guards aren't supported
111
+ id: nodeId,
112
+ childrenIdentifierPaths,
113
+ });
114
+ }
115
+ const remainingPath = path.slice(1);
116
+ if (remainingPath.length > 0) {
117
+ childrenIdentifierPaths.push(remainingPath);
118
+ }
119
+ else {
120
+ isFilterTarget = true;
121
+ }
122
+ }
123
+ }
124
+ if (isParentFilterTarget || matchingFilters.length > 0) {
125
+ return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);
126
+ }
127
+ return undefined;
128
+ }
129
+ function applyFilterAttributes(node, filteredChildrenIdentifierPaths, isFilterTarget) {
130
+ const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);
131
+ return {
132
+ ...node,
133
+ ...(isFilterTarget ? { isFilterTarget } : undefined),
134
+ ...(shouldAutoExpand ? { autoExpand: true } : undefined),
135
+ ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),
136
+ };
137
+ }
138
+ /** @internal */
139
+ // eslint-disable-next-line @typescript-eslint/naming-convention
140
+ export const ECSQL_COLUMN_NAME_FilteredChildrenPaths = "FilteredChildrenPaths";
141
+ /** @internal */
142
+ // eslint-disable-next-line @typescript-eslint/naming-convention
143
+ export const ECSQL_COLUMN_NAME_IsFilterTarget = "IsFilterTarget";
144
+ /** @internal */
145
+ export function applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, isParentFilterTarget) {
146
+ if (matchingFilters.length === 0) {
147
+ return def;
148
+ }
149
+ return {
150
+ ...def,
151
+ query: {
152
+ ...def.query,
153
+ ctes: [
154
+ ...(def.query.ctes ?? []),
155
+ // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),
156
+ // so using UNION as a workaround
157
+ `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (
158
+ ${matchingFilters
159
+ .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)
160
+ .join(" UNION ALL ")}
161
+ )`,
162
+ ],
163
+ ecsql: `
164
+ SELECT
165
+ [q].*,
166
+ ${isFilterTarget ? "1" : "0"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],
167
+ [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]
168
+ FROM (
169
+ ${def.query.ecsql}
170
+ ) [q]
171
+ ${isParentFilterTarget ? "LEFT " : ""} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]
172
+ `,
173
+ },
174
+ };
175
+ }
176
+ //# sourceMappingURL=FilteringHierarchyDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilteringHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport {\n CustomHierarchyNodeDefinition,\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n NodeParser,\n NodePostProcessor,\n NodePreProcessor,\n} from \"../HierarchyDefinition\";\nimport { HierarchyNode, ParsedHierarchyNode, ParsedInstanceHierarchyNode, ProcessedHierarchyNode } from \"../HierarchyNode\";\nimport { HierarchyNodeIdentifier, HierarchyNodeIdentifiersPath } from \"../HierarchyNodeIdentifier\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n}\n\n/** @internal */\nexport type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {\n isFilterTarget?: boolean;\n filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];\n};\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n\n public constructor(props: FilteringQueryBuilderProps) {\n this._classHierarchy = props.classHierarchy;\n this._source = props.source;\n this._nodeIdentifierPaths = props.nodeIdentifierPaths;\n }\n\n public get preProcessNode(): NodePreProcessor {\n return async (node) => {\n const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;\n if (processedNode?.processingParams?.hideInHierarchy && (node as FilteredHierarchyNode).isFilterTarget) {\n // we want to hide target nodes if they have `hideInHierarchy` param\n return undefined;\n }\n return processedNode;\n };\n }\n\n public get postProcessNode(): NodePostProcessor {\n return async (node: ProcessedHierarchyNode) => {\n const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;\n if (\n // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing\n HierarchyNode.isClassGroupingNode(node) &&\n node.children.some((child: FilteredHierarchyNode) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)\n ) {\n return Object.assign(processedNode, { autoExpand: true });\n }\n return processedNode;\n };\n }\n\n public get parseNode(): NodeParser {\n return (row: { [columnName: string]: any }): FilteredHierarchyNode<ParsedInstanceHierarchyNode> => {\n const isFilterTarget: boolean = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];\n const parsedFilteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]\n ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])\n : undefined;\n const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);\n return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget);\n };\n }\n\n public async defineHierarchyLevel(\n props: DefineHierarchyLevelProps & { parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps[\"parentNode\"]> | undefined },\n ): Promise<HierarchyLevelDefinition> {\n const sourceDefinitions = await this._source.defineHierarchyLevel(props);\n const { filteredNodePaths, isParentFilterTarget } = this.getFilteringProps(props.parentNode);\n if (!filteredNodePaths) {\n return sourceDefinitions;\n }\n\n const filteredDefinitions: HierarchyLevelDefinition = [];\n await Promise.all(\n sourceDefinitions.map(async (definition) => {\n let matchedDefinition: HierarchyNodesDefinition | undefined;\n if (HierarchyNodesDefinition.isCustomNode(definition)) {\n matchedDefinition = await matchFilters<{ key: string }>(\n definition,\n { filteredNodePaths, isParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {\n return false;\n }\n return id.key === definition.node.key;\n },\n (def, matchingFilters, isFilterTarget) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyNodeIdentifiersPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget),\n };\n },\n );\n } else {\n matchedDefinition = await matchFilters<InstanceKey>(\n definition,\n { filteredNodePaths, isParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n return false;\n }\n return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);\n },\n (def, matchingFilters, isFilterTarget) => applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isParentFilterTarget),\n );\n }\n if (matchedDefinition) {\n filteredDefinitions.push(matchedDefinition);\n }\n }),\n );\n return filteredDefinitions;\n }\n\n private getFilteringProps(parentNode: FilteredHierarchyNode<unknown> | undefined) {\n if (!parentNode) {\n return { filteredNodePaths: this._nodeIdentifierPaths, isParentFilterTarget: false };\n }\n return { filteredNodePaths: parentNode.filteredChildrenIdentifierPaths, isParentFilterTarget: parentNode.isFilterTarget };\n }\n}\n\nasync function matchFilters<\n TIdentifier extends HierarchyNodeIdentifier,\n TDefinition = TIdentifier extends InstanceKey ? InstanceNodesQueryDefinition : CustomHierarchyNodeDefinition,\n>(\n definition: TDefinition,\n filteringProps: { filteredNodePaths: HierarchyNodeIdentifiersPath[]; isParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isParentFilterTarget } = filteringProps;\n let isFilterTarget = false;\n const matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }> = [];\n for (const path of filteredNodePaths) {\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;\n if (!childrenIdentifierPaths) {\n childrenIdentifierPaths = [];\n matchingFilters.push({\n // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment\n // async type guards aren't supported\n id: nodeId as TIdentifier,\n childrenIdentifierPaths,\n });\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n childrenIdentifierPaths.push(remainingPath);\n } else {\n isFilterTarget = true;\n }\n }\n }\n if (isParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);\n }\n return undefined;\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined,\n isFilterTarget: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);\n return {\n ...node,\n ...(isFilterTarget ? { isFilterTarget } : undefined),\n ...(shouldAutoExpand ? { autoExpand: true } : undefined),\n ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),\n };\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_FilteredChildrenPaths = \"FilteredChildrenPaths\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_IsFilterTarget = \"IsFilterTarget\";\n\n/** @internal */\nexport function applyECInstanceIdsFilter(\n def: InstanceNodesQueryDefinition,\n matchingFilters: Array<{ id: InstanceKey; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n isParentFilterTarget: boolean,\n): InstanceNodesQueryDefinition {\n if (matchingFilters.length === 0) {\n return def;\n }\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),\n // so using UNION as a workaround\n `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n ${isFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],\n [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n ${isParentFilterTarget ? \"LEFT \" : \"\"} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n"]}