@itwin/tree-widget-react 3.17.5 → 3.17.7

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 (108) hide show
  1. package/CHANGELOG.md +19 -2
  2. package/lib/cjs/tree-widget-react/TreeWidget.js +1 -0
  3. package/lib/cjs/tree-widget-react/TreeWidget.js.map +1 -1
  4. package/lib/cjs/tree-widget-react/components/SelectableTree.d.ts +1 -1
  5. package/lib/cjs/tree-widget-react/components/TreeSelector.d.ts +1 -1
  6. package/lib/cjs/tree-widget-react/components/TreeWidgetUiItemsProvider.d.ts +1 -1
  7. package/lib/cjs/tree-widget-react/components/tree-header/TreeHeader.d.ts +1 -1
  8. package/lib/cjs/tree-widget-react/components/tree-header/TreeHeader.js +4 -4
  9. package/lib/cjs/tree-widget-react/components/tree-header/TreeHeader.js.map +1 -1
  10. package/lib/cjs/tree-widget-react/components/tree-header/TreeWithHeader.d.ts +1 -1
  11. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +1 -1
  12. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +5 -4
  13. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  14. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -5
  15. package/lib/cjs/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  16. package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -1
  17. package/lib/cjs/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  18. package/lib/cjs/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +1 -1
  19. package/lib/cjs/tree-widget-react/components/trees/common/Rxjs.js +1 -0
  20. package/lib/cjs/tree-widget-react/components/trees/common/Rxjs.js.map +1 -1
  21. package/lib/cjs/tree-widget-react/components/trees/common/UseHierarchyFiltering.d.ts +1 -1
  22. package/lib/cjs/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  23. package/lib/cjs/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -1
  24. package/lib/cjs/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -1
  25. package/lib/cjs/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -1
  26. package/lib/cjs/tree-widget-react/components/trees/common/components/Tree.d.ts +2 -2
  27. package/lib/cjs/tree-widget-react/components/trees/common/components/TreeNodeCheckbox.d.ts +1 -1
  28. package/lib/cjs/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +1 -1
  29. package/lib/cjs/tree-widget-react/components/trees/common/components/VisibilityTree.d.ts +1 -1
  30. package/lib/cjs/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +1 -1
  31. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +1 -1
  32. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -5
  33. package/lib/cjs/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  34. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
  35. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -5
  36. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  37. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +1 -0
  38. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  39. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +1 -1
  40. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.d.ts +8 -7
  41. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  42. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -5
  43. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  44. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +13 -16
  45. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  46. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js +1 -1
  47. package/lib/cjs/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  48. package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.d.ts +3 -3
  49. package/lib/cjs/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
  50. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +1 -0
  51. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +7 -0
  52. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  53. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +2 -2
  54. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  55. package/lib/esm/tree-widget-react/TreeWidget.js +2 -1
  56. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  57. package/lib/esm/tree-widget-react/components/SelectableTree.d.ts +1 -1
  58. package/lib/esm/tree-widget-react/components/TreeSelector.d.ts +1 -1
  59. package/lib/esm/tree-widget-react/components/TreeWidgetUiItemsProvider.d.ts +1 -1
  60. package/lib/esm/tree-widget-react/components/tree-header/TreeHeader.d.ts +1 -1
  61. package/lib/esm/tree-widget-react/components/tree-header/TreeHeader.js +4 -4
  62. package/lib/esm/tree-widget-react/components/tree-header/TreeHeader.js.map +1 -1
  63. package/lib/esm/tree-widget-react/components/tree-header/TreeWithHeader.d.ts +1 -1
  64. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTree.d.ts +1 -1
  65. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.d.ts +5 -4
  66. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeButtons.js.map +1 -1
  67. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.d.ts +1 -5
  68. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeComponent.js.map +1 -1
  69. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js +1 -1
  70. package/lib/esm/tree-widget-react/components/trees/common/CategoriesVisibilityUtils.js.map +1 -1
  71. package/lib/esm/tree-widget-react/components/trees/common/FocusedInstancesContext.d.ts +1 -1
  72. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js +1 -0
  73. package/lib/esm/tree-widget-react/components/trees/common/Rxjs.js.map +1 -1
  74. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyFiltering.d.ts +1 -1
  75. package/lib/esm/tree-widget-react/components/trees/common/UseHierarchyVisibility.js.map +1 -1
  76. package/lib/esm/tree-widget-react/components/trees/common/UseTelemetryContext.d.ts +1 -1
  77. package/lib/esm/tree-widget-react/components/trees/common/components/Delayed.d.ts +1 -1
  78. package/lib/esm/tree-widget-react/components/trees/common/components/ProgressOverlay.d.ts +1 -1
  79. package/lib/esm/tree-widget-react/components/trees/common/components/Tree.d.ts +2 -2
  80. package/lib/esm/tree-widget-react/components/trees/common/components/TreeNodeCheckbox.d.ts +1 -1
  81. package/lib/esm/tree-widget-react/components/trees/common/components/TreeRenderer.d.ts +1 -1
  82. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTree.d.ts +1 -1
  83. package/lib/esm/tree-widget-react/components/trees/common/components/VisibilityTreeRenderer.d.ts +1 -1
  84. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTree.d.ts +1 -1
  85. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.d.ts +1 -5
  86. package/lib/esm/tree-widget-react/components/trees/external-sources-tree/ExternalSourcesTreeComponent.js.map +1 -1
  87. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +1 -1
  88. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -5
  89. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  90. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js +1 -0
  91. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/internal/IModelContentTreeIdsCache.js.map +1 -1
  92. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTree.d.ts +1 -1
  93. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.d.ts +8 -7
  94. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeButtons.js.map +1 -1
  95. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.d.ts +1 -5
  96. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeComponent.js.map +1 -1
  97. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +13 -16
  98. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  99. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js +1 -1
  100. package/lib/esm/tree-widget-react/components/trees/models-tree/UseModelsTree.js.map +1 -1
  101. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.d.ts +3 -3
  102. package/lib/esm/tree-widget-react/components/trees/models-tree/Utils.js.map +1 -1
  103. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +1 -0
  104. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +7 -0
  105. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  106. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +2 -2
  107. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
  108. package/package.json +78 -87
@@ -418,6 +418,12 @@ export class ModelsTreeIdsCache {
418
418
  getModelCategories(modelId) {
419
419
  return this.getModelInfos().pipe(mergeMap((modelInfos) => modelInfos.get(modelId)?.categories.keys() ?? []), toArray());
420
420
  }
421
+ getCategoriesOfModelsTopMostElements(modelIds) {
422
+ return this.getModelInfos().pipe(mergeMap((modelInfos) => from(modelIds).pipe(mergeMap((modelId) => modelInfos.get(modelId)?.categories.entries() ?? []), filter(([_, { isRootElementCategory }]) => isRootElementCategory))), reduce((acc, [categoryId]) => {
423
+ acc.add(categoryId);
424
+ return acc;
425
+ }, new Set()));
426
+ }
421
427
  hasSubModel(elementId) {
422
428
  return this.getModelInfos().pipe(map((modelInfos) => {
423
429
  const modeledElementInfo = modelInfos.get(elementId);
@@ -524,6 +530,7 @@ function forEachChildSubject(subjectInfos, parentSubject, cb) {
524
530
  const parentSubjectInfo = typeof parentSubject === "string" ? subjectInfos.get(parentSubject) : parentSubject;
525
531
  parentSubjectInfo &&
526
532
  parentSubjectInfo.childSubjects.forEach((childSubjectId) => {
533
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
527
534
  const childSubjectInfo = subjectInfos.get(childSubjectId);
528
535
  if (cb(childSubjectId, childSubjectInfo) === "break") {
529
536
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.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 {\n bufferCount,\n bufferTime,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n firstValueFrom,\n forkJoin,\n from,\n map,\n mergeAll,\n mergeMap,\n reduce,\n ReplaySubject,\n shareReplay,\n Subject,\n take,\n tap,\n toArray,\n} from \"rxjs\";\nimport { assert, Guid, Id64 } from \"@itwin/core-bentley\";\nimport { IModel } from \"@itwin/core-common\";\nimport { releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { pushToMap } from \"../../common/Utils.js\";\nimport { getOptimalBatchSize } from \"../Utils.js\";\n\nimport type { Observable, Subscription } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { ModelsTreeDefinition } from \"../ModelsTreeDefinition.js\";\nimport type { ChildrenTree } from \"../Utils.js\";\n\ninterface SubjectInfo {\n parentSubject: Id64String | undefined;\n hideInHierarchy: boolean;\n childSubjects: Id64Set;\n childModels: Id64Set;\n}\n\ninterface ModelInfo {\n isModelPrivate: boolean;\n categories: Map<Id64String, { isRootElementCategory: boolean }>;\n}\n\ntype ModelsTreeHierarchyConfiguration = ConstructorParameters<typeof ModelsTreeDefinition>[0][\"hierarchyConfig\"];\ntype ChildrenMap = Map<Id64String, { children: Id64Array | undefined }>;\ntype ChildrenLoadingMap = Map<Id64String, Promise<void>>;\n\n/** @internal */\nexport class ModelsTreeIdsCache implements Disposable {\n readonly #categoryElementCounts: ModelCategoryElementsCountCache;\n #subjectInfos: Observable<Map<Id64String, SubjectInfo>> | undefined;\n #parentSubjectIds: Observable<Id64Array> | undefined; // the list should contain a subject id if its node should be shown as having children\n #modelInfos: Observable<Map<Id64String, ModelInfo>> | undefined;\n #modelWithCategoryModeledElements: Observable<Map<string, Id64Set>> | undefined;\n #modelKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath[]>>;\n #subjectKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath>>;\n #categoryKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath[]>>;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #hierarchyConfig: ModelsTreeHierarchyConfiguration;\n #childrenMap: ChildrenMap;\n /** Stores element ids which have children query scheduled to execute. */\n #childrenLoadingMap: ChildrenLoadingMap;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, hierarchyConfig: ModelsTreeHierarchyConfiguration, componentId?: GuidString) {\n this.#hierarchyConfig = hierarchyConfig;\n this.#queryExecutor = queryExecutor;\n this.#categoryElementCounts = new ModelCategoryElementsCountCache((input) => this.queryCategoryElementCounts(input));\n this.#modelKeyPaths = new Map();\n this.#subjectKeyPaths = new Map();\n this.#categoryKeyPaths = new Map();\n this.#childrenMap = new Map();\n this.#childrenLoadingMap = new Map();\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"ModelsTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {\n this.#categoryElementCounts[Symbol.dispose]();\n }\n\n private querySubjects(): Observable<{ id: Id64String; parentId?: Id64String; targetPartitionId?: Id64String; hideInHierarchy: boolean }> {\n return defer(() => {\n const subjectsQuery = `\n SELECT\n s.ECInstanceId id,\n s.Parent.Id parentId,\n (\n SELECT m.ECInstanceId\n FROM bis.GeometricModel3d m\n WHERE m.ECInstanceId = HexToId(json_extract(s.JsonProperties, '$.Subject.Model.TargetPartition'))\n AND NOT m.IsPrivate\n AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)\n ) targetPartitionId,\n CASE\n WHEN (\n json_extract(s.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL\n OR json_extract(s.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'\n ) THEN 1\n ELSE 0\n END hideInHierarchy\n FROM bis.Subject s\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: subjectsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/subjects` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId, targetPartitionId: row.targetPartitionId, hideInHierarchy: !!row.hideInHierarchy };\n }),\n );\n }\n\n private queryModels(): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\n const modelsQuery = `\n SELECT p.ECInstanceId id, p.Parent.Id parentId\n FROM bis.InformationPartitionElement p\n INNER JOIN bis.GeometricModel3d m ON m.ModeledElement.Id = p.ECInstanceId\n WHERE\n NOT m.IsPrivate\n ${this.#hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: modelsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/models` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId };\n }),\n );\n }\n\n private queryChildren({ elementIds }: { elementIds: Id64Array }): Observable<{ id: Id64String; parentId: Id64String }> {\n if (elementIds.length === 0) {\n return EMPTY;\n }\n\n return defer(() => {\n const ctes = [\n `\n ElementChildren(id, parentId) AS (\n SELECT ECInstanceId id, Parent.Id parentId\n FROM ${this.#hierarchyConfig.elementClassSpecification}\n WHERE Parent.Id IN (${elementIds.join(\", \")})\n\n UNION ALL\n\n SELECT c.ECInstanceId id, c.Parent.Id\n FROM ${this.#hierarchyConfig.elementClassSpecification} c\n JOIN ElementChildren p ON c.Parent.Id = p.id\n )\n `,\n ];\n const ecsql = `\n SELECT id, parentId\n FROM ElementChildren\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql, ctes },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/children/${Guid.createValue()}` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId };\n }),\n );\n }\n\n private getChildrenTreeFromMap({ elementIds }: { elementIds: Id64Arg }): ChildrenTree {\n const result: ChildrenTree = new Map();\n if (Id64.sizeOf(elementIds) === 0 || this.#childrenMap.size === 0) {\n return result;\n }\n for (const elementId of Id64.iterable(elementIds)) {\n const entry = this.#childrenMap.get(elementId);\n if (!entry?.children) {\n continue;\n }\n const elementChildrenTree: ChildrenTree = new Map();\n result.set(elementId, { children: elementChildrenTree });\n entry.children.forEach((childId) => {\n const childrenTreeOfChild = this.getChildrenTreeFromMap({ elementIds: childId });\n // Need to add children tree created from childId. This tree includes childId as root element\n // If child does not have children, children tree won't be created. Need to add childId with undefined children\n elementChildrenTree.set(childId, { children: childrenTreeOfChild.size > 0 ? childrenTreeOfChild : undefined });\n });\n }\n return result;\n }\n\n private getChildrenCountMap({ elementIds }: { elementIds: Id64Arg }): Map<Id64String, number> {\n const result = new Map<Id64String, number>();\n for (const elementId of Id64.iterable(elementIds)) {\n const entry = this.#childrenMap.get(elementId);\n if (entry?.children) {\n let totalChildrenCount = entry.children.length;\n this.getChildrenCountMap({ elementIds: entry.children }).forEach((childrenOfChildCount) => (totalChildrenCount += childrenOfChildCount));\n result.set(elementId, totalChildrenCount);\n }\n }\n return result;\n }\n\n /**\n * Populates #childrenLoadingMap with promises. When these promises resolve, they will populate #childrenMap with values and delete entries from #childrenLoadingMap.\n */\n private createChildrenLoadingMapEntries({ elementsToQuery }: { elementsToQuery: Id64Array }): { loadingMapEntries: Promise<void> } {\n const getElementsToQueryPromise = async (batchedElementsToQuery: Id64Array) =>\n firstValueFrom(\n this.queryChildren({ elementIds: batchedElementsToQuery }).pipe(\n // Want to have void at the end instead of void[], so using reduce\n reduce(\n (acc, { parentId, id }) => {\n let entry = this.#childrenMap.get(parentId);\n if (!entry) {\n entry = { children: [] };\n this.#childrenMap.set(parentId, entry);\n }\n if (!entry.children) {\n entry.children = [];\n }\n // Add child to parent's entry and add child to children map\n entry.children.push(id);\n if (!this.#childrenMap.has(id)) {\n this.#childrenMap.set(id, { children: undefined });\n }\n return acc;\n },\n (() => {})(),\n ),\n tap({ complete: () => batchedElementsToQuery.forEach((elementId) => this.#childrenLoadingMap.delete(elementId)) }),\n defaultIfEmpty((() => {})()),\n ),\n );\n const maximumBatchSize = 1000;\n const totalSize = elementsToQuery.length;\n const optimalBatchSize = getOptimalBatchSize({ totalSize, maximumBatchSize });\n const loadingMapEntries = new Array<Promise<void>>();\n // Don't want to slice if its not necessary\n if (totalSize <= maximumBatchSize) {\n loadingMapEntries.push(getElementsToQueryPromise(elementsToQuery));\n } else {\n for (let i = 0; i < elementsToQuery.length; i += optimalBatchSize) {\n loadingMapEntries.push(getElementsToQueryPromise(elementsToQuery.slice(i, i + optimalBatchSize)));\n }\n }\n\n elementsToQuery.forEach((elementId, index) => this.#childrenLoadingMap.set(elementId, loadingMapEntries[Math.floor(index / optimalBatchSize)]));\n return { loadingMapEntries: Promise.all(loadingMapEntries).then(() => {}) };\n }\n\n private createChildrenMapEntries({ elementIds }: { elementIds: Id64Arg }): Observable<void[]> {\n return from(Id64.iterable(elementIds)).pipe(\n reduce(\n (acc, elementId) => {\n if (this.#childrenMap.has(elementId)) {\n return acc;\n }\n const loadingPromise = this.#childrenLoadingMap.get(elementId);\n if (loadingPromise) {\n acc.existingPromises.push(loadingPromise);\n } else {\n acc.elementsToQuery.push(elementId);\n }\n return acc;\n },\n { existingPromises: new Array<Promise<void>>(), elementsToQuery: new Array<Id64String>() },\n ),\n mergeMap(async ({ elementsToQuery, existingPromises }) => {\n existingPromises.push(this.createChildrenLoadingMapEntries({ elementsToQuery }).loadingMapEntries);\n return Promise.all(existingPromises);\n }),\n );\n }\n\n public getChildrenTree({ elementIds }: { elementIds: Id64Arg }): Observable<ChildrenTree> {\n return this.createChildrenMapEntries({ elementIds }).pipe(map(() => this.getChildrenTreeFromMap({ elementIds })));\n }\n\n public getAllChildrenCount({ elementIds }: { elementIds: Id64Arg }): Observable<Map<Id64String, number>> {\n return this.createChildrenMapEntries({ elementIds }).pipe(map(() => this.getChildrenCountMap({ elementIds })));\n }\n\n private getSubjectInfos() {\n this.#subjectInfos ??= forkJoin({\n subjectInfos: this.querySubjects().pipe(\n reduce((acc, subject) => {\n const subjectInfo: SubjectInfo = {\n parentSubject: subject.parentId,\n hideInHierarchy: subject.hideInHierarchy,\n childSubjects: new Set(),\n childModels: new Set(),\n };\n if (subject.targetPartitionId) {\n subjectInfo.childModels.add(subject.targetPartitionId);\n }\n acc.set(subject.id, subjectInfo);\n return acc;\n }, new Map<Id64String, SubjectInfo>()),\n map((subjectInfos) => {\n for (const [subjectId, { parentSubject: parentSubjectId }] of subjectInfos.entries()) {\n if (parentSubjectId) {\n const parentSubjectInfo = subjectInfos.get(parentSubjectId);\n assert(!!parentSubjectInfo);\n parentSubjectInfo.childSubjects.add(subjectId);\n }\n }\n return subjectInfos;\n }),\n ),\n targetPartitionSubjects: this.queryModels().pipe(\n reduce((acc, model) => {\n pushToMap(acc, model.id, model.parentId);\n return acc;\n }, new Map<Id64String, Set<Id64String>>()),\n ),\n }).pipe(\n map(({ subjectInfos, targetPartitionSubjects }) => {\n for (const [partitionId, subjectIds] of targetPartitionSubjects) {\n subjectIds.forEach((subjectId) => {\n const subjectInfo = subjectInfos.get(subjectId);\n assert(!!subjectInfo);\n subjectInfo.childModels.add(partitionId);\n });\n }\n return subjectInfos;\n }),\n shareReplay(),\n );\n return this.#subjectInfos;\n }\n\n /** Returns ECInstanceIDs of Subjects that either have direct Model or at least one child Subject with a Model. */\n public getParentSubjectIds(): Observable<Id64Array> {\n this.#parentSubjectIds ??= this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const parentSubjectIds = new Set<Id64String>();\n subjectInfos.forEach((subjectInfo, subjectId) => {\n if (subjectInfo.childModels.size > 0) {\n parentSubjectIds.add(subjectId);\n let currParentId = subjectInfo.parentSubject;\n while (currParentId) {\n parentSubjectIds.add(currParentId);\n currParentId = subjectInfos.get(currParentId)?.parentSubject;\n }\n }\n });\n return [...parentSubjectIds];\n }),\n shareReplay(),\n );\n return this.#parentSubjectIds;\n }\n\n /**\n * Returns child subjects of the specified parent subjects as they're displayed in the hierarchy - taking into\n * account `hideInHierarchy` flag.\n */\n public getChildSubjectIds(parentSubjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const childSubjectIds = new Array<Id64String>();\n parentSubjectIds.forEach((subjectId) => {\n forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {\n if (!childSubjectInfo.hideInHierarchy) {\n childSubjectIds.push(childSubjectId);\n return \"break\";\n }\n return \"continue\";\n });\n });\n return childSubjectIds;\n }),\n );\n }\n\n /** Returns ECInstanceIDs of all Models under specific parent Subjects, including their child Subjects, etc. */\n public getSubjectModelIds(subjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const subjectStack = [...subjectIds];\n const result = new Array<Id64String>();\n while (true) {\n const subjectId = subjectStack.pop();\n if (subjectId === undefined) {\n break;\n }\n const subjectInfo = subjectInfos.get(subjectId);\n if (!subjectInfo) {\n continue;\n }\n result.push(...subjectInfo.childModels);\n subjectStack.push(...subjectInfo.childSubjects);\n }\n return result;\n }),\n );\n }\n\n /** Returns ECInstanceIDs of Models under specific parent Subjects as they are displayed in the hierarchy. */\n public getChildSubjectModelIds(parentSubjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const hiddenSubjectIds = new Array<Id64String>();\n parentSubjectIds.forEach((subjectId) => {\n forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {\n if (childSubjectInfo.hideInHierarchy) {\n hiddenSubjectIds.push(childSubjectId);\n return \"continue\";\n }\n return \"break\";\n });\n });\n const modelIds = new Array<Id64String>();\n [...parentSubjectIds, ...hiddenSubjectIds].forEach((subjectId) => {\n const subjectInfo = subjectInfos.get(subjectId);\n subjectInfo && modelIds.push(...subjectInfo.childModels);\n });\n return modelIds;\n }),\n );\n }\n\n public createSubjectInstanceKeysPath(targetSubjectId: Id64String): Observable<HierarchyNodeIdentifiersPath> {\n let entry = this.#subjectKeyPaths.get(targetSubjectId);\n if (!entry) {\n entry = this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const result = new Array<InstanceKey>();\n let currParentId: Id64String | undefined = targetSubjectId;\n while (currParentId) {\n if (this.#hierarchyConfig.hideRootSubject && currParentId === IModel.rootSubjectId) {\n break;\n }\n const parentInfo = subjectInfos.get(currParentId);\n if (!parentInfo?.hideInHierarchy) {\n result.push({ className: \"BisCore.Subject\", id: currParentId });\n }\n currParentId = parentInfo?.parentSubject;\n }\n return result.reverse();\n }),\n shareReplay(),\n );\n this.#subjectKeyPaths.set(targetSubjectId, entry);\n }\n return entry;\n }\n\n private queryModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n isModelPrivate: boolean;\n isRootElementCategory: boolean;\n }> {\n return defer(() => {\n const query = `\n SELECT\n this.Model.Id modelId,\n this.Category.Id categoryId,\n m.IsPrivate isModelPrivate,\n MAX(IIF(this.Parent.Id IS NULL, 1, 0)) isRootElementCategory\n FROM BisCore.Model m\n JOIN ${this.#hierarchyConfig.elementClassSpecification} this ON m.ECInstanceId = this.Model.Id\n GROUP BY modelId, categoryId, isModelPrivate\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/model-categories` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, isModelPrivate: !!row.isModelPrivate, isRootElementCategory: !!row.isRootElementCategory };\n }),\n );\n }\n\n private queryModeledElements(): Observable<{ modelId: Id64String; categoryId: Id64String; modeledElementId: Id64String }> {\n return defer(() => {\n const query = `\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.Model m\n JOIN ${this.#hierarchyConfig.elementClassSpecification} pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM ${this.#hierarchyConfig.elementClassSpecification})\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/modeled-elements` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId };\n }),\n );\n }\n\n private getModelWithCategoryModeledElements() {\n this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(\n reduce((acc, { modelId, categoryId, modeledElementId }) => {\n const key = `${modelId}-${categoryId}`;\n const entry = acc.get(key);\n if (entry === undefined) {\n acc.set(key, new Set([modeledElementId]));\n } else {\n entry.add(modeledElementId);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n shareReplay(),\n );\n return this.#modelWithCategoryModeledElements;\n }\n\n private getModelInfos() {\n this.#modelInfos ??= this.queryModelCategories().pipe(\n reduce((acc, { modelId, categoryId, isModelPrivate, isRootElementCategory }) => {\n const entry = acc.get(modelId);\n if (entry) {\n entry.categories.set(categoryId, { isRootElementCategory });\n entry.isModelPrivate = isModelPrivate;\n } else {\n acc.set(modelId, { categories: new Map([[categoryId, { isRootElementCategory }]]), isModelPrivate });\n }\n return acc;\n }, new Map<Id64String, { categories: Map<Id64String, { isRootElementCategory: boolean }>; isModelPrivate: boolean }>()),\n shareReplay(),\n );\n return this.#modelInfos;\n }\n\n public getAllCategories(): Observable<Id64Set> {\n return this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.values()),\n mergeMap(({ categories }) => categories.keys()),\n reduce((acc, categoryId) => {\n acc.add(categoryId);\n return acc;\n }, new Set<Id64String>()),\n );\n }\n\n public getModelCategories(modelId: Id64String): Observable<Id64Array> {\n return this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.get(modelId)?.categories.keys() ?? []),\n toArray(),\n );\n }\n\n public hasSubModel(elementId: Id64String): Observable<boolean> {\n return this.getModelInfos().pipe(\n map((modelInfos) => {\n const modeledElementInfo = modelInfos.get(elementId);\n if (!modeledElementInfo) {\n return false;\n }\n return !modeledElementInfo.isModelPrivate;\n }),\n );\n }\n\n public getCategoriesModeledElements(modelId: Id64String, categoryIds: Id64Arg): Observable<Id64Array> {\n return this.getModelWithCategoryModeledElements().pipe(\n mergeMap((modelWithCategoryModeledElements) =>\n from(Id64.iterable(categoryIds)).pipe(\n reduce((acc, categoryId) => {\n const entry = modelWithCategoryModeledElements.get(`${modelId}-${categoryId}`);\n if (entry !== undefined) {\n acc.push(...entry);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n ),\n );\n }\n\n public createModelInstanceKeyPaths(modelId: Id64String): Observable<HierarchyNodeIdentifiersPath[]> {\n let entry = this.#modelKeyPaths.get(modelId);\n if (!entry) {\n entry = this.getSubjectInfos().pipe(\n mergeMap((subjectInfos) => subjectInfos.entries()),\n filter(([_, subjectInfo]) => subjectInfo.childModels.has(modelId)),\n mergeMap(([modelSubjectId]) =>\n this.createSubjectInstanceKeysPath(modelSubjectId).pipe(map((path) => [...path, { className: \"BisCore.GeometricModel3d\", id: modelId }])),\n ),\n toArray(),\n shareReplay(),\n );\n\n this.#modelKeyPaths.set(modelId, entry);\n }\n return entry;\n }\n\n private queryCategoryElementCounts(\n input: Array<{ modelId: Id64String; categoryId: Id64String }>,\n ): Observable<Array<{ modelId: Id64String; categoryId: Id64String; elementsCount: number }>> {\n return from(input).pipe(\n reduce((acc, { modelId, categoryId }) => {\n const entry = acc.get(modelId);\n if (!entry) {\n acc.set(modelId, new Set([categoryId]));\n } else {\n entry.add(categoryId);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n mergeMap((modelCategoryMap) => modelCategoryMap.entries()),\n map(([modelId, categoryIds]) => `Model.Id = ${modelId} AND Category.Id IN (${[...categoryIds].join(\", \")})`),\n // we may have thousands of where clauses here, and sending a single query with all of them could take a\n // long time - instead, split it into smaller chunks\n bufferCount(100),\n mergeMap((whereClauses) =>\n defer(() =>\n this.#queryExecutor.createQueryReader(\n {\n ctes: [\n `\n CategoryElements(id, modelId, categoryId) AS (\n SELECT ECInstanceId, Model.Id, Category.Id\n FROM ${this.#hierarchyConfig.elementClassSpecification}\n WHERE\n Parent.Id IS NULL\n AND (\n ${whereClauses.join(\" OR \")}\n )\n\n UNION ALL\n\n SELECT c.ECInstanceId, p.modelId, p.categoryId\n FROM ${this.#hierarchyConfig.elementClassSpecification} c\n JOIN CategoryElements p ON c.Parent.Id = p.id\n )\n `,\n ],\n ecsql: `\n SELECT modelId, categoryId, COUNT(id) elementsCount\n FROM CategoryElements\n GROUP BY modelId, categoryId\n `,\n },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/category-element-counts/${Guid.createValue()}`,\n },\n ),\n ),\n ),\n releaseMainThreadOnItemsCount(500),\n reduce(\n ({ acc, createKey }, row) => {\n acc.set(createKey({ modelId: row.modelId, categoryId: row.categoryId }), {\n modelId: row.modelId,\n categoryId: row.categoryId,\n elementsCount: row.elementsCount,\n });\n return { acc, createKey };\n },\n {\n acc: new Map<string, { modelId: Id64String; categoryId: Id64String; elementsCount: number }>(),\n createKey: (keyProps: { modelId: Id64String; categoryId: Id64String }) => `${keyProps.modelId}-${keyProps.categoryId}`,\n },\n ),\n mergeMap(({ acc: result, createKey }) => {\n input.forEach(({ modelId, categoryId }) => {\n if (!result.has(createKey({ modelId, categoryId }))) {\n result.set(createKey({ modelId, categoryId }), { categoryId, modelId, elementsCount: 0 });\n }\n });\n\n return from(result.values());\n }),\n toArray(),\n );\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n return this.#categoryElementCounts.getCategoryElementsCount(modelId, categoryId);\n }\n\n public createCategoryInstanceKeyPaths(categoryId: Id64String): Observable<HierarchyNodeIdentifiersPath[]> {\n let entry = this.#categoryKeyPaths.get(categoryId);\n if (!entry) {\n entry = this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.entries()),\n filter(([_, modelInfo]) => !!modelInfo.categories.get(categoryId)?.isRootElementCategory),\n mergeMap(([categoryModelId]) => this.createModelInstanceKeyPaths(categoryModelId)),\n mergeMap((modelPaths) => modelPaths),\n reduce((acc, modelPath) => {\n acc.push([...modelPath, { className: \"BisCore.SpatialCategory\", id: categoryId }]);\n return acc;\n }, new Array<HierarchyNodeIdentifiersPath>()),\n shareReplay(),\n );\n this.#categoryKeyPaths.set(categoryId, entry);\n }\n return entry;\n }\n}\n\nfunction forEachChildSubject(\n subjectInfos: Map<Id64String, SubjectInfo>,\n parentSubject: Id64String | SubjectInfo,\n cb: (childSubjectId: Id64String, childSubjectInfo: SubjectInfo) => \"break\" | \"continue\",\n) {\n const parentSubjectInfo = typeof parentSubject === \"string\" ? subjectInfos.get(parentSubject) : parentSubject;\n parentSubjectInfo &&\n parentSubjectInfo.childSubjects.forEach((childSubjectId) => {\n const childSubjectInfo = subjectInfos.get(childSubjectId)!;\n if (cb(childSubjectId, childSubjectInfo) === \"break\") {\n return;\n }\n forEachChildSubject(subjectInfos, childSubjectInfo, cb);\n });\n}\n\nclass ModelCategoryElementsCountCache {\n #cache = new Map<string, Subject<number>>();\n #requestsStream = new Subject<{ modelId: Id64String; categoryId: Id64String }>();\n #subscription: Subscription;\n public constructor(\n loader: (\n input: Array<{ modelId: Id64String; categoryId: Id64String }>,\n ) => Observable<Array<{ modelId: Id64String; categoryId: Id64String; elementsCount: number }>>,\n ) {\n this.#subscription = this.#requestsStream\n .pipe(\n bufferTime(20),\n filter((requests) => requests.length > 0),\n mergeMap((requests) => loader(requests)),\n mergeAll(),\n )\n .subscribe({\n next: ({ modelId, categoryId, elementsCount }) => {\n const subject = this.#cache.get(`${modelId}${categoryId}`);\n assert(!!subject);\n subject.next(elementsCount);\n },\n });\n }\n\n public [Symbol.dispose]() {\n this.#subscription.unsubscribe();\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n const cacheKey = `${modelId}${categoryId}`;\n let result = this.#cache.get(cacheKey);\n if (result !== undefined) {\n return from(result).pipe(take(1));\n }\n\n result = new ReplaySubject(1);\n this.#cache.set(cacheKey, result);\n this.#requestsStream.next({ modelId, categoryId });\n return from(result).pipe(take(1));\n }\n}\n"]}
1
+ {"version":3,"file":"ModelsTreeIdsCache.js","sourceRoot":"","sources":["../../../../../../../src/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.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 {\n bufferCount,\n bufferTime,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n firstValueFrom,\n forkJoin,\n from,\n map,\n mergeAll,\n mergeMap,\n reduce,\n ReplaySubject,\n shareReplay,\n Subject,\n take,\n tap,\n toArray,\n} from \"rxjs\";\nimport { assert, Guid, Id64 } from \"@itwin/core-bentley\";\nimport { IModel } from \"@itwin/core-common\";\nimport { releaseMainThreadOnItemsCount } from \"../../common/internal/Utils.js\";\nimport { pushToMap } from \"../../common/Utils.js\";\nimport { getOptimalBatchSize } from \"../Utils.js\";\n\nimport type { Observable, Subscription } from \"rxjs\";\nimport type { GuidString, Id64Arg, Id64Array, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from \"@itwin/presentation-hierarchies\";\nimport type { InstanceKey } from \"@itwin/presentation-shared\";\nimport type { ModelsTreeDefinition } from \"../ModelsTreeDefinition.js\";\nimport type { ChildrenTree } from \"../Utils.js\";\n\ninterface SubjectInfo {\n parentSubject: Id64String | undefined;\n hideInHierarchy: boolean;\n childSubjects: Id64Set;\n childModels: Id64Set;\n}\n\ninterface ModelInfo {\n isModelPrivate: boolean;\n categories: Map<Id64String, { isRootElementCategory: boolean }>;\n}\n\ntype ModelsTreeHierarchyConfiguration = ConstructorParameters<typeof ModelsTreeDefinition>[0][\"hierarchyConfig\"];\ntype ChildrenMap = Map<Id64String, { children: Id64Array | undefined }>;\ntype ChildrenLoadingMap = Map<Id64String, Promise<void>>;\n\n/** @internal */\nexport class ModelsTreeIdsCache implements Disposable {\n readonly #categoryElementCounts: ModelCategoryElementsCountCache;\n #subjectInfos: Observable<Map<Id64String, SubjectInfo>> | undefined;\n #parentSubjectIds: Observable<Id64Array> | undefined; // the list should contain a subject id if its node should be shown as having children\n #modelInfos: Observable<Map<Id64String, ModelInfo>> | undefined;\n #modelWithCategoryModeledElements: Observable<Map<string, Id64Set>> | undefined;\n #modelKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath[]>>;\n #subjectKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath>>;\n #categoryKeyPaths: Map<Id64String, Observable<HierarchyNodeIdentifiersPath[]>>;\n #queryExecutor: LimitingECSqlQueryExecutor;\n #hierarchyConfig: ModelsTreeHierarchyConfiguration;\n #childrenMap: ChildrenMap;\n /** Stores element ids which have children query scheduled to execute. */\n #childrenLoadingMap: ChildrenLoadingMap;\n #componentId: GuidString;\n #componentName: string;\n\n constructor(queryExecutor: LimitingECSqlQueryExecutor, hierarchyConfig: ModelsTreeHierarchyConfiguration, componentId?: GuidString) {\n this.#hierarchyConfig = hierarchyConfig;\n this.#queryExecutor = queryExecutor;\n this.#categoryElementCounts = new ModelCategoryElementsCountCache((input) => this.queryCategoryElementCounts(input));\n this.#modelKeyPaths = new Map();\n this.#subjectKeyPaths = new Map();\n this.#categoryKeyPaths = new Map();\n this.#childrenMap = new Map();\n this.#childrenLoadingMap = new Map();\n this.#componentId = componentId ?? Guid.createValue();\n this.#componentName = \"ModelsTreeIdsCache\";\n }\n\n public [Symbol.dispose]() {\n this.#categoryElementCounts[Symbol.dispose]();\n }\n\n private querySubjects(): Observable<{ id: Id64String; parentId?: Id64String; targetPartitionId?: Id64String; hideInHierarchy: boolean }> {\n return defer(() => {\n const subjectsQuery = `\n SELECT\n s.ECInstanceId id,\n s.Parent.Id parentId,\n (\n SELECT m.ECInstanceId\n FROM bis.GeometricModel3d m\n WHERE m.ECInstanceId = HexToId(json_extract(s.JsonProperties, '$.Subject.Model.TargetPartition'))\n AND NOT m.IsPrivate\n AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)\n ) targetPartitionId,\n CASE\n WHEN (\n json_extract(s.JsonProperties, '$.Subject.Job.Bridge') IS NOT NULL\n OR json_extract(s.JsonProperties, '$.Subject.Model.Type') = 'Hierarchy'\n ) THEN 1\n ELSE 0\n END hideInHierarchy\n FROM bis.Subject s\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: subjectsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/subjects` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId, targetPartitionId: row.targetPartitionId, hideInHierarchy: !!row.hideInHierarchy };\n }),\n );\n }\n\n private queryModels(): Observable<{ id: Id64String; parentId: Id64String }> {\n return defer(() => {\n const modelsQuery = `\n SELECT p.ECInstanceId id, p.Parent.Id parentId\n FROM bis.InformationPartitionElement p\n INNER JOIN bis.GeometricModel3d m ON m.ModeledElement.Id = p.ECInstanceId\n WHERE\n NOT m.IsPrivate\n ${this.#hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${this.#hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: modelsQuery },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/models` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId };\n }),\n );\n }\n\n private queryChildren({ elementIds }: { elementIds: Id64Array }): Observable<{ id: Id64String; parentId: Id64String }> {\n if (elementIds.length === 0) {\n return EMPTY;\n }\n\n return defer(() => {\n const ctes = [\n `\n ElementChildren(id, parentId) AS (\n SELECT ECInstanceId id, Parent.Id parentId\n FROM ${this.#hierarchyConfig.elementClassSpecification}\n WHERE Parent.Id IN (${elementIds.join(\", \")})\n\n UNION ALL\n\n SELECT c.ECInstanceId id, c.Parent.Id\n FROM ${this.#hierarchyConfig.elementClassSpecification} c\n JOIN ElementChildren p ON c.Parent.Id = p.id\n )\n `,\n ];\n const ecsql = `\n SELECT id, parentId\n FROM ElementChildren\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql, ctes },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/children/${Guid.createValue()}` },\n );\n }).pipe(\n map((row) => {\n return { id: row.id, parentId: row.parentId };\n }),\n );\n }\n\n private getChildrenTreeFromMap({ elementIds }: { elementIds: Id64Arg }): ChildrenTree {\n const result: ChildrenTree = new Map();\n if (Id64.sizeOf(elementIds) === 0 || this.#childrenMap.size === 0) {\n return result;\n }\n for (const elementId of Id64.iterable(elementIds)) {\n const entry = this.#childrenMap.get(elementId);\n if (!entry?.children) {\n continue;\n }\n const elementChildrenTree: ChildrenTree = new Map();\n result.set(elementId, { children: elementChildrenTree });\n entry.children.forEach((childId) => {\n const childrenTreeOfChild = this.getChildrenTreeFromMap({ elementIds: childId });\n // Need to add children tree created from childId. This tree includes childId as root element\n // If child does not have children, children tree won't be created. Need to add childId with undefined children\n elementChildrenTree.set(childId, { children: childrenTreeOfChild.size > 0 ? childrenTreeOfChild : undefined });\n });\n }\n return result;\n }\n\n private getChildrenCountMap({ elementIds }: { elementIds: Id64Arg }): Map<Id64String, number> {\n const result = new Map<Id64String, number>();\n for (const elementId of Id64.iterable(elementIds)) {\n const entry = this.#childrenMap.get(elementId);\n if (entry?.children) {\n let totalChildrenCount = entry.children.length;\n this.getChildrenCountMap({ elementIds: entry.children }).forEach((childrenOfChildCount) => (totalChildrenCount += childrenOfChildCount));\n result.set(elementId, totalChildrenCount);\n }\n }\n return result;\n }\n\n /**\n * Populates #childrenLoadingMap with promises. When these promises resolve, they will populate #childrenMap with values and delete entries from #childrenLoadingMap.\n */\n private createChildrenLoadingMapEntries({ elementsToQuery }: { elementsToQuery: Id64Array }): { loadingMapEntries: Promise<void> } {\n const getElementsToQueryPromise = async (batchedElementsToQuery: Id64Array) =>\n firstValueFrom(\n this.queryChildren({ elementIds: batchedElementsToQuery }).pipe(\n // Want to have void at the end instead of void[], so using reduce\n reduce(\n (acc, { parentId, id }) => {\n let entry = this.#childrenMap.get(parentId);\n if (!entry) {\n entry = { children: [] };\n this.#childrenMap.set(parentId, entry);\n }\n if (!entry.children) {\n entry.children = [];\n }\n // Add child to parent's entry and add child to children map\n entry.children.push(id);\n if (!this.#childrenMap.has(id)) {\n this.#childrenMap.set(id, { children: undefined });\n }\n return acc;\n },\n (() => {})(),\n ),\n tap({ complete: () => batchedElementsToQuery.forEach((elementId) => this.#childrenLoadingMap.delete(elementId)) }),\n defaultIfEmpty((() => {})()),\n ),\n );\n const maximumBatchSize = 1000;\n const totalSize = elementsToQuery.length;\n const optimalBatchSize = getOptimalBatchSize({ totalSize, maximumBatchSize });\n const loadingMapEntries = new Array<Promise<void>>();\n // Don't want to slice if its not necessary\n if (totalSize <= maximumBatchSize) {\n loadingMapEntries.push(getElementsToQueryPromise(elementsToQuery));\n } else {\n for (let i = 0; i < elementsToQuery.length; i += optimalBatchSize) {\n loadingMapEntries.push(getElementsToQueryPromise(elementsToQuery.slice(i, i + optimalBatchSize)));\n }\n }\n\n elementsToQuery.forEach((elementId, index) => this.#childrenLoadingMap.set(elementId, loadingMapEntries[Math.floor(index / optimalBatchSize)]));\n return { loadingMapEntries: Promise.all(loadingMapEntries).then(() => {}) };\n }\n\n private createChildrenMapEntries({ elementIds }: { elementIds: Id64Arg }): Observable<void[]> {\n return from(Id64.iterable(elementIds)).pipe(\n reduce(\n (acc, elementId) => {\n if (this.#childrenMap.has(elementId)) {\n return acc;\n }\n const loadingPromise = this.#childrenLoadingMap.get(elementId);\n if (loadingPromise) {\n acc.existingPromises.push(loadingPromise);\n } else {\n acc.elementsToQuery.push(elementId);\n }\n return acc;\n },\n { existingPromises: new Array<Promise<void>>(), elementsToQuery: new Array<Id64String>() },\n ),\n mergeMap(async ({ elementsToQuery, existingPromises }) => {\n existingPromises.push(this.createChildrenLoadingMapEntries({ elementsToQuery }).loadingMapEntries);\n return Promise.all(existingPromises);\n }),\n );\n }\n\n public getChildrenTree({ elementIds }: { elementIds: Id64Arg }): Observable<ChildrenTree> {\n return this.createChildrenMapEntries({ elementIds }).pipe(map(() => this.getChildrenTreeFromMap({ elementIds })));\n }\n\n public getAllChildrenCount({ elementIds }: { elementIds: Id64Arg }): Observable<Map<Id64String, number>> {\n return this.createChildrenMapEntries({ elementIds }).pipe(map(() => this.getChildrenCountMap({ elementIds })));\n }\n\n private getSubjectInfos() {\n this.#subjectInfos ??= forkJoin({\n subjectInfos: this.querySubjects().pipe(\n reduce((acc, subject) => {\n const subjectInfo: SubjectInfo = {\n parentSubject: subject.parentId,\n hideInHierarchy: subject.hideInHierarchy,\n childSubjects: new Set(),\n childModels: new Set(),\n };\n if (subject.targetPartitionId) {\n subjectInfo.childModels.add(subject.targetPartitionId);\n }\n acc.set(subject.id, subjectInfo);\n return acc;\n }, new Map<Id64String, SubjectInfo>()),\n map((subjectInfos) => {\n for (const [subjectId, { parentSubject: parentSubjectId }] of subjectInfos.entries()) {\n if (parentSubjectId) {\n const parentSubjectInfo = subjectInfos.get(parentSubjectId);\n assert(!!parentSubjectInfo);\n parentSubjectInfo.childSubjects.add(subjectId);\n }\n }\n return subjectInfos;\n }),\n ),\n targetPartitionSubjects: this.queryModels().pipe(\n reduce((acc, model) => {\n pushToMap(acc, model.id, model.parentId);\n return acc;\n }, new Map<Id64String, Set<Id64String>>()),\n ),\n }).pipe(\n map(({ subjectInfos, targetPartitionSubjects }) => {\n for (const [partitionId, subjectIds] of targetPartitionSubjects) {\n subjectIds.forEach((subjectId) => {\n const subjectInfo = subjectInfos.get(subjectId);\n assert(!!subjectInfo);\n subjectInfo.childModels.add(partitionId);\n });\n }\n return subjectInfos;\n }),\n shareReplay(),\n );\n return this.#subjectInfos;\n }\n\n /** Returns ECInstanceIDs of Subjects that either have direct Model or at least one child Subject with a Model. */\n public getParentSubjectIds(): Observable<Id64Array> {\n this.#parentSubjectIds ??= this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const parentSubjectIds = new Set<Id64String>();\n subjectInfos.forEach((subjectInfo, subjectId) => {\n if (subjectInfo.childModels.size > 0) {\n parentSubjectIds.add(subjectId);\n let currParentId = subjectInfo.parentSubject;\n while (currParentId) {\n parentSubjectIds.add(currParentId);\n currParentId = subjectInfos.get(currParentId)?.parentSubject;\n }\n }\n });\n return [...parentSubjectIds];\n }),\n shareReplay(),\n );\n return this.#parentSubjectIds;\n }\n\n /**\n * Returns child subjects of the specified parent subjects as they're displayed in the hierarchy - taking into\n * account `hideInHierarchy` flag.\n */\n public getChildSubjectIds(parentSubjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const childSubjectIds = new Array<Id64String>();\n parentSubjectIds.forEach((subjectId) => {\n forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {\n if (!childSubjectInfo.hideInHierarchy) {\n childSubjectIds.push(childSubjectId);\n return \"break\";\n }\n return \"continue\";\n });\n });\n return childSubjectIds;\n }),\n );\n }\n\n /** Returns ECInstanceIDs of all Models under specific parent Subjects, including their child Subjects, etc. */\n public getSubjectModelIds(subjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const subjectStack = [...subjectIds];\n const result = new Array<Id64String>();\n while (true) {\n const subjectId = subjectStack.pop();\n if (subjectId === undefined) {\n break;\n }\n const subjectInfo = subjectInfos.get(subjectId);\n if (!subjectInfo) {\n continue;\n }\n result.push(...subjectInfo.childModels);\n subjectStack.push(...subjectInfo.childSubjects);\n }\n return result;\n }),\n );\n }\n\n /** Returns ECInstanceIDs of Models under specific parent Subjects as they are displayed in the hierarchy. */\n public getChildSubjectModelIds(parentSubjectIds: Id64Array): Observable<Id64Array> {\n return this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const hiddenSubjectIds = new Array<Id64String>();\n parentSubjectIds.forEach((subjectId) => {\n forEachChildSubject(subjectInfos, subjectId, (childSubjectId, childSubjectInfo) => {\n if (childSubjectInfo.hideInHierarchy) {\n hiddenSubjectIds.push(childSubjectId);\n return \"continue\";\n }\n return \"break\";\n });\n });\n const modelIds = new Array<Id64String>();\n [...parentSubjectIds, ...hiddenSubjectIds].forEach((subjectId) => {\n const subjectInfo = subjectInfos.get(subjectId);\n subjectInfo && modelIds.push(...subjectInfo.childModels);\n });\n return modelIds;\n }),\n );\n }\n\n public createSubjectInstanceKeysPath(targetSubjectId: Id64String): Observable<HierarchyNodeIdentifiersPath> {\n let entry = this.#subjectKeyPaths.get(targetSubjectId);\n if (!entry) {\n entry = this.getSubjectInfos().pipe(\n map((subjectInfos) => {\n const result = new Array<InstanceKey>();\n let currParentId: Id64String | undefined = targetSubjectId;\n while (currParentId) {\n if (this.#hierarchyConfig.hideRootSubject && currParentId === IModel.rootSubjectId) {\n break;\n }\n const parentInfo = subjectInfos.get(currParentId);\n if (!parentInfo?.hideInHierarchy) {\n result.push({ className: \"BisCore.Subject\", id: currParentId });\n }\n currParentId = parentInfo?.parentSubject;\n }\n return result.reverse();\n }),\n shareReplay(),\n );\n this.#subjectKeyPaths.set(targetSubjectId, entry);\n }\n return entry;\n }\n\n private queryModelCategories(): Observable<{\n modelId: Id64String;\n categoryId: Id64String;\n isModelPrivate: boolean;\n isRootElementCategory: boolean;\n }> {\n return defer(() => {\n const query = `\n SELECT\n this.Model.Id modelId,\n this.Category.Id categoryId,\n m.IsPrivate isModelPrivate,\n MAX(IIF(this.Parent.Id IS NULL, 1, 0)) isRootElementCategory\n FROM BisCore.Model m\n JOIN ${this.#hierarchyConfig.elementClassSpecification} this ON m.ECInstanceId = this.Model.Id\n GROUP BY modelId, categoryId, isModelPrivate\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/model-categories` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, isModelPrivate: !!row.isModelPrivate, isRootElementCategory: !!row.isRootElementCategory };\n }),\n );\n }\n\n private queryModeledElements(): Observable<{ modelId: Id64String; categoryId: Id64String; modeledElementId: Id64String }> {\n return defer(() => {\n const query = `\n SELECT\n pe.ECInstanceId modeledElementId,\n pe.Category.Id categoryId,\n pe.Model.Id modelId\n FROM BisCore.Model m\n JOIN ${this.#hierarchyConfig.elementClassSpecification} pe ON pe.ECInstanceId = m.ModeledElement.Id\n WHERE\n m.IsPrivate = false\n AND m.ECInstanceId IN (SELECT Model.Id FROM ${this.#hierarchyConfig.elementClassSpecification})\n `;\n return this.#queryExecutor.createQueryReader(\n { ecsql: query },\n { rowFormat: \"ECSqlPropertyNames\", limit: \"unbounded\", restartToken: `${this.#componentName}/${this.#componentId}/modeled-elements` },\n );\n }).pipe(\n map((row) => {\n return { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId };\n }),\n );\n }\n\n private getModelWithCategoryModeledElements() {\n this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(\n reduce((acc, { modelId, categoryId, modeledElementId }) => {\n const key = `${modelId}-${categoryId}`;\n const entry = acc.get(key);\n if (entry === undefined) {\n acc.set(key, new Set([modeledElementId]));\n } else {\n entry.add(modeledElementId);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n shareReplay(),\n );\n return this.#modelWithCategoryModeledElements;\n }\n\n private getModelInfos() {\n this.#modelInfos ??= this.queryModelCategories().pipe(\n reduce((acc, { modelId, categoryId, isModelPrivate, isRootElementCategory }) => {\n const entry = acc.get(modelId);\n if (entry) {\n entry.categories.set(categoryId, { isRootElementCategory });\n entry.isModelPrivate = isModelPrivate;\n } else {\n acc.set(modelId, { categories: new Map([[categoryId, { isRootElementCategory }]]), isModelPrivate });\n }\n return acc;\n }, new Map<Id64String, { categories: Map<Id64String, { isRootElementCategory: boolean }>; isModelPrivate: boolean }>()),\n shareReplay(),\n );\n return this.#modelInfos;\n }\n\n public getAllCategories(): Observable<Id64Set> {\n return this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.values()),\n mergeMap(({ categories }) => categories.keys()),\n reduce((acc, categoryId) => {\n acc.add(categoryId);\n return acc;\n }, new Set<Id64String>()),\n );\n }\n\n public getModelCategories(modelId: Id64String): Observable<Id64Array> {\n return this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.get(modelId)?.categories.keys() ?? []),\n toArray(),\n );\n }\n\n public getCategoriesOfModelsTopMostElements(modelIds: Id64Array): Observable<Id64Set> {\n return this.getModelInfos().pipe(\n mergeMap((modelInfos) =>\n from(modelIds).pipe(\n mergeMap((modelId) => modelInfos.get(modelId)?.categories.entries() ?? []),\n filter(([_, { isRootElementCategory }]) => isRootElementCategory),\n ),\n ),\n reduce((acc, [categoryId]) => {\n acc.add(categoryId);\n return acc;\n }, new Set<Id64String>()),\n );\n }\n\n public hasSubModel(elementId: Id64String): Observable<boolean> {\n return this.getModelInfos().pipe(\n map((modelInfos) => {\n const modeledElementInfo = modelInfos.get(elementId);\n if (!modeledElementInfo) {\n return false;\n }\n return !modeledElementInfo.isModelPrivate;\n }),\n );\n }\n\n public getCategoriesModeledElements(modelId: Id64String, categoryIds: Id64Arg): Observable<Id64Array> {\n return this.getModelWithCategoryModeledElements().pipe(\n mergeMap((modelWithCategoryModeledElements) =>\n from(Id64.iterable(categoryIds)).pipe(\n reduce((acc, categoryId) => {\n const entry = modelWithCategoryModeledElements.get(`${modelId}-${categoryId}`);\n if (entry !== undefined) {\n acc.push(...entry);\n }\n return acc;\n }, new Array<Id64String>()),\n ),\n ),\n );\n }\n\n public createModelInstanceKeyPaths(modelId: Id64String): Observable<HierarchyNodeIdentifiersPath[]> {\n let entry = this.#modelKeyPaths.get(modelId);\n if (!entry) {\n entry = this.getSubjectInfos().pipe(\n mergeMap((subjectInfos) => subjectInfos.entries()),\n filter(([_, subjectInfo]) => subjectInfo.childModels.has(modelId)),\n mergeMap(([modelSubjectId]) =>\n this.createSubjectInstanceKeysPath(modelSubjectId).pipe(map((path) => [...path, { className: \"BisCore.GeometricModel3d\", id: modelId }])),\n ),\n toArray(),\n shareReplay(),\n );\n\n this.#modelKeyPaths.set(modelId, entry);\n }\n return entry;\n }\n\n private queryCategoryElementCounts(\n input: Array<{ modelId: Id64String; categoryId: Id64String }>,\n ): Observable<Array<{ modelId: Id64String; categoryId: Id64String; elementsCount: number }>> {\n return from(input).pipe(\n reduce((acc, { modelId, categoryId }) => {\n const entry = acc.get(modelId);\n if (!entry) {\n acc.set(modelId, new Set([categoryId]));\n } else {\n entry.add(categoryId);\n }\n return acc;\n }, new Map<Id64String, Id64Set>()),\n mergeMap((modelCategoryMap) => modelCategoryMap.entries()),\n map(([modelId, categoryIds]) => `Model.Id = ${modelId} AND Category.Id IN (${[...categoryIds].join(\", \")})`),\n // we may have thousands of where clauses here, and sending a single query with all of them could take a\n // long time - instead, split it into smaller chunks\n bufferCount(100),\n mergeMap((whereClauses) =>\n defer(() =>\n this.#queryExecutor.createQueryReader(\n {\n ctes: [\n `\n CategoryElements(id, modelId, categoryId) AS (\n SELECT ECInstanceId, Model.Id, Category.Id\n FROM ${this.#hierarchyConfig.elementClassSpecification}\n WHERE\n Parent.Id IS NULL\n AND (\n ${whereClauses.join(\" OR \")}\n )\n\n UNION ALL\n\n SELECT c.ECInstanceId, p.modelId, p.categoryId\n FROM ${this.#hierarchyConfig.elementClassSpecification} c\n JOIN CategoryElements p ON c.Parent.Id = p.id\n )\n `,\n ],\n ecsql: `\n SELECT modelId, categoryId, COUNT(id) elementsCount\n FROM CategoryElements\n GROUP BY modelId, categoryId\n `,\n },\n {\n rowFormat: \"ECSqlPropertyNames\",\n limit: \"unbounded\",\n restartToken: `${this.#componentName}/${this.#componentId}/category-element-counts/${Guid.createValue()}`,\n },\n ),\n ),\n ),\n releaseMainThreadOnItemsCount(500),\n reduce(\n ({ acc, createKey }, row) => {\n acc.set(createKey({ modelId: row.modelId, categoryId: row.categoryId }), {\n modelId: row.modelId,\n categoryId: row.categoryId,\n elementsCount: row.elementsCount,\n });\n return { acc, createKey };\n },\n {\n acc: new Map<string, { modelId: Id64String; categoryId: Id64String; elementsCount: number }>(),\n createKey: (keyProps: { modelId: Id64String; categoryId: Id64String }) => `${keyProps.modelId}-${keyProps.categoryId}`,\n },\n ),\n mergeMap(({ acc: result, createKey }) => {\n input.forEach(({ modelId, categoryId }) => {\n if (!result.has(createKey({ modelId, categoryId }))) {\n result.set(createKey({ modelId, categoryId }), { categoryId, modelId, elementsCount: 0 });\n }\n });\n\n return from(result.values());\n }),\n toArray(),\n );\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n return this.#categoryElementCounts.getCategoryElementsCount(modelId, categoryId);\n }\n\n public createCategoryInstanceKeyPaths(categoryId: Id64String): Observable<HierarchyNodeIdentifiersPath[]> {\n let entry = this.#categoryKeyPaths.get(categoryId);\n if (!entry) {\n entry = this.getModelInfos().pipe(\n mergeMap((modelInfos) => modelInfos.entries()),\n filter(([_, modelInfo]) => !!modelInfo.categories.get(categoryId)?.isRootElementCategory),\n mergeMap(([categoryModelId]) => this.createModelInstanceKeyPaths(categoryModelId)),\n mergeMap((modelPaths) => modelPaths),\n reduce((acc, modelPath) => {\n acc.push([...modelPath, { className: \"BisCore.SpatialCategory\", id: categoryId }]);\n return acc;\n }, new Array<HierarchyNodeIdentifiersPath>()),\n shareReplay(),\n );\n this.#categoryKeyPaths.set(categoryId, entry);\n }\n return entry;\n }\n}\n\nfunction forEachChildSubject(\n subjectInfos: Map<Id64String, SubjectInfo>,\n parentSubject: Id64String | SubjectInfo,\n cb: (childSubjectId: Id64String, childSubjectInfo: SubjectInfo) => \"break\" | \"continue\",\n) {\n const parentSubjectInfo = typeof parentSubject === \"string\" ? subjectInfos.get(parentSubject) : parentSubject;\n parentSubjectInfo &&\n parentSubjectInfo.childSubjects.forEach((childSubjectId) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const childSubjectInfo = subjectInfos.get(childSubjectId)!;\n if (cb(childSubjectId, childSubjectInfo) === \"break\") {\n return;\n }\n forEachChildSubject(subjectInfos, childSubjectInfo, cb);\n });\n}\n\nclass ModelCategoryElementsCountCache {\n #cache = new Map<string, Subject<number>>();\n #requestsStream = new Subject<{ modelId: Id64String; categoryId: Id64String }>();\n #subscription: Subscription;\n public constructor(\n loader: (\n input: Array<{ modelId: Id64String; categoryId: Id64String }>,\n ) => Observable<Array<{ modelId: Id64String; categoryId: Id64String; elementsCount: number }>>,\n ) {\n this.#subscription = this.#requestsStream\n .pipe(\n bufferTime(20),\n filter((requests) => requests.length > 0),\n mergeMap((requests) => loader(requests)),\n mergeAll(),\n )\n .subscribe({\n next: ({ modelId, categoryId, elementsCount }) => {\n const subject = this.#cache.get(`${modelId}${categoryId}`);\n assert(!!subject);\n subject.next(elementsCount);\n },\n });\n }\n\n public [Symbol.dispose]() {\n this.#subscription.unsubscribe();\n }\n\n public getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Observable<number> {\n const cacheKey = `${modelId}${categoryId}`;\n let result = this.#cache.get(cacheKey);\n if (result !== undefined) {\n return from(result).pipe(take(1));\n }\n\n result = new ReplaySubject(1);\n this.#cache.set(cacheKey, result);\n this.#requestsStream.next({ modelId, categoryId });\n return from(result).pipe(take(1));\n }\n}\n"]}
@@ -470,7 +470,7 @@ class ModelsTreeVisibilityHandlerImpl {
470
470
  }
471
471
  removeAlwaysDrawnExclusive() {
472
472
  return this.#idsCache.getAllCategories().pipe(map((categoryIds) => {
473
- this.#props.viewport.changeCategoryDisplay(categoryIds, false, false);
473
+ this.#props.viewport.changeCategoryDisplay(categoryIds, false, false, true);
474
474
  this.#props.viewport.clearNeverDrawn();
475
475
  this.#props.viewport.perModelCategoryVisibility.clearOverrides();
476
476
  this.#props.viewport.setAlwaysDrawn(this.#props.viewport.alwaysDrawn ?? new Set());
@@ -534,7 +534,7 @@ class ModelsTreeVisibilityHandlerImpl {
534
534
  if (override === PerModelCategoryVisibility.Override.None && on) {
535
535
  // we took off the override which means the category is displayed in selector, but
536
536
  // doesn't mean all its subcategories are displayed - this call ensures that
537
- viewport.changeCategoryDisplay(categoryId, true, true);
537
+ viewport.changeCategoryDisplay(categoryId, true, true, true);
538
538
  }
539
539
  }
540
540
  changeCategoryState(props) {