@itwin/tree-widget-react 4.0.0-alpha.20 → 4.0.0-alpha.22

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 (27) hide show
  1. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js +4 -4
  2. package/lib/esm/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.js.map +1 -1
  3. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.d.ts +4 -1
  4. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +25 -26
  5. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  6. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js +5 -6
  7. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHandler.js.map +1 -1
  8. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js +2 -2
  9. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/visibility/CategoriesTreeVisibilityHelper.js.map +1 -1
  10. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js +1 -0
  11. package/lib/esm/tree-widget-react/components/trees/classifications-tree/UseClassificationsTreeDefinition.js.map +1 -1
  12. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.d.ts +4 -1
  13. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js +27 -25
  14. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/ClassificationsTreeIdsCache.js.map +1 -1
  15. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js +5 -6
  16. package/lib/esm/tree-widget-react/components/trees/classifications-tree/internal/visibility/ClassificationsTreeVisibilityHandler.js.map +1 -1
  17. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js +1 -1
  18. package/lib/esm/tree-widget-react/components/trees/common/TreeWidgetViewport.js.map +1 -1
  19. package/lib/esm/tree-widget-react/components/trees/index.d.ts +1 -1
  20. package/lib/esm/tree-widget-react/components/trees/index.js +2 -1
  21. package/lib/esm/tree-widget-react/components/trees/index.js.map +1 -1
  22. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +4 -1
  23. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +24 -20
  24. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  25. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js +5 -7
  26. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/visibility/ModelsTreeVisibilityHandler.js.map +1 -1
  27. package/package.json +2 -2
@@ -2,12 +2,12 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { bufferCount, defaultIfEmpty, defer, EMPTY, firstValueFrom, forkJoin, from, fromEvent, identity, lastValueFrom, map, merge, mergeMap, of, reduce, takeUntil, toArray, } from "rxjs";
5
+ import { bufferCount, defaultIfEmpty, defer, distinct, EMPTY, firstValueFrom, forkJoin, from, fromEvent, identity, lastValueFrom, map, merge, mergeMap, of, reduce, takeUntil, toArray, } from "rxjs";
6
6
  import { assert, Guid } from "@itwin/core-bentley";
7
7
  import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, ProcessedHierarchyNode } from "@itwin/presentation-hierarchies";
8
8
  import { createBisInstanceLabelSelectClauseFactory, ECSql } from "@itwin/presentation-shared";
9
9
  import { CLASS_NAME_DefinitionContainer, CLASS_NAME_InformationPartitionElement, CLASS_NAME_ISubModeledElement, CLASS_NAME_Model, CLASS_NAME_SubCategory, } from "../common/internal/ClassNameDefinitions.js";
10
- import { createIdsSelector, getClassesByView, getDistinctMapValues, getOptimalBatchSize, groupingNodeHasFilterTargets, parseIdsSelectorResult, releaseMainThreadOnItemsCount, } from "../common/internal/Utils.js";
10
+ import { createIdsSelector, getClassesByView, getOptimalBatchSize, groupingNodeHasFilterTargets, parseIdsSelectorResult, releaseMainThreadOnItemsCount, } from "../common/internal/Utils.js";
11
11
  import { FilterLimitExceededError } from "../common/TreeErrors.js";
12
12
  const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
13
13
  /** @internal */
@@ -372,7 +372,7 @@ export class CategoriesTreeDefinition {
372
372
  });
373
373
  const modelIds = parentNode.extendedData?.isCategoryOfSubModel
374
374
  ? parseIdsSelectorResult(parentNode.extendedData?.modelIds)
375
- : [...getDistinctMapValues(await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds)))];
375
+ : await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds).pipe(mergeMap(({ models }) => models ?? []), distinct(), toArray()));
376
376
  if (modelIds.length === 0) {
377
377
  return [];
378
378
  }
@@ -690,7 +690,7 @@ function createInstanceKeyPathsFromTargetItems({ targetItems, imodelAccess, view
690
690
  elementIds: new Array(),
691
691
  }), mergeMap((ids) => {
692
692
  const elementsLength = ids.elementIds.length;
693
- return merge(from(ids.definitionContainerIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ definitionContainerId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.categoryIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ categoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.subCategoryIds).pipe(mergeMap((id) => idsCache.getInstanceKeyPaths({ subCategoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.elementIds).pipe(bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })), releaseMainThreadOnItemsCount(1), mergeMap((block, chunkIndex) => createGeometricElementInstanceKeyPaths({
693
+ return merge(from(ids.definitionContainerIds).pipe(releaseMainThreadOnItemsCount(200), mergeMap((id) => idsCache.getInstanceKeyPaths({ definitionContainerId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.categoryIds).pipe(releaseMainThreadOnItemsCount(200), mergeMap((id) => idsCache.getInstanceKeyPaths({ categoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.subCategoryIds).pipe(releaseMainThreadOnItemsCount(200), mergeMap((id) => idsCache.getInstanceKeyPaths({ subCategoryId: id })), map((path) => ({ path, options: { reveal: true } }))), from(ids.elementIds).pipe(bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })), releaseMainThreadOnItemsCount(1), mergeMap((block, chunkIndex) => createGeometricElementInstanceKeyPaths({
694
694
  imodelAccess,
695
695
  idsCache,
696
696
  hierarchyConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.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 defaultIfEmpty,\n defer,\n EMPTY,\n firstValueFrom,\n forkJoin,\n from,\n fromEvent,\n identity,\n lastValueFrom,\n map,\n merge,\n mergeMap,\n of,\n reduce,\n takeUntil,\n toArray,\n} from \"rxjs\";\nimport { assert, Guid } from \"@itwin/core-bentley\";\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, ProcessedHierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_DefinitionContainer,\n CLASS_NAME_InformationPartitionElement,\n CLASS_NAME_ISubModeledElement,\n CLASS_NAME_Model,\n CLASS_NAME_SubCategory,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport {\n createIdsSelector,\n getClassesByView,\n getDistinctMapValues,\n getOptimalBatchSize,\n groupingNodeHasFilterTargets,\n parseIdsSelectorResult,\n releaseMainThreadOnItemsCount,\n} from \"../common/internal/Utils.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Array, MarkRequired } from \"@itwin/core-bentley\";\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type { CategoryId, DefinitionContainerId, ElementId, ModelId, SubCategoryId } from \"../common/internal/Types.js\";\nimport type { NormalizedHierarchyFilteringPath } from \"../common/Utils.js\";\nimport type { CategoriesTreeIdsCache, CategoryInfo } from \"./internal/CategoriesTreeIdsCache.js\";\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\ninterface CategoriesTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n viewType: \"2d\" | \"3d\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\ninterface CategoriesTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n label: string;\n viewType: \"2d\" | \"3d\";\n limit?: number | \"unbounded\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n abortSignal?: AbortSignal;\n componentId?: GuidString;\n}\n\n/**\n * Defines hierarchy configuration supported by `CategoriesTree`.\n * @beta\n */\nexport interface CategoriesTreeHierarchyConfiguration {\n /** Should SubCategories be hidden. Defaults to `false` */\n hideSubCategories: boolean;\n /** Should Elements be shown. Defaults to `false` */\n showElements: boolean;\n /** Should categories without elements be shown. Defaults to `false`. */\n showEmptyCategories: boolean;\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: CategoriesTreeHierarchyConfiguration = {\n hideSubCategories: false,\n showElements: false,\n showEmptyCategories: false,\n};\n\n/** @internal */\nexport class CategoriesTreeDefinition implements HierarchyDefinition {\n #impl: Promise<HierarchyDefinition> | undefined;\n #selectQueryFactory: NodesQueryClauseFactory;\n #nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n #iModelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n static #componentName = \"CategoriesTreeDefinition\";\n\n public constructor(props: CategoriesTreeDefinitionProps) {\n this.#iModelAccess = props.imodelAccess;\n this.#idsCache = props.idsCache;\n this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this.#selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,\n });\n this.#hierarchyConfig = props.hierarchyConfig;\n const { categoryClass, elementClass, modelClass } = getClassesByView(props.viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = elementClass;\n this.#categoryModelClass = modelClass;\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n const modelElementsMap = new Map<ModelId, Set<ElementId>>();\n node.children.forEach((child) => {\n let modelEntry = modelElementsMap.get(child.extendedData?.modelId);\n if (!modelEntry) {\n modelEntry = new Set();\n modelElementsMap.set(child.extendedData?.modelId, modelEntry);\n }\n assert(child.key.type === \"instances\");\n for (const { id } of child.key.instanceKeys) {\n modelEntry.add(id);\n }\n });\n\n const { hasFilterTargetAncestor, hasDirectNonFilteredTargets } = groupingNodeHasFilterTargets(node.children);\n\n return {\n ...node,\n label: node.label,\n extendedData: {\n ...node.extendedData,\n // add `categoryId` from the first grouped element\n categoryId: node.children[0].extendedData?.categoryId,\n modelElementsMap,\n ...(hasDirectNonFilteredTargets ? { hasDirectNonFilteredTargets } : {}),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : {}),\n // `imageId` is assigned to instance nodes at query time, but grouping ones need to\n // be handled during post-processing\n imageId: \"icon-ec-class\",\n },\n };\n }\n return node;\n }\n\n private async getHierarchyDefinition(): Promise<HierarchyDefinition> {\n this.#impl ??= (async () => {\n const isDefinitionContainerSupported = await firstValueFrom(this.#idsCache.getIsDefinitionContainerSupported());\n return createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this.#iModelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) => this.createDefinitionContainersAndCategoriesQuery(requestProps),\n childNodes: [\n ...(this.#hierarchyConfig.showElements\n ? [\n {\n parentInstancesNodePredicate: this.#categoryElementClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: this.#categoryModelClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n ]\n : []),\n ...(this.#hierarchyConfig.hideSubCategories && !this.#hierarchyConfig.showElements\n ? []\n : [\n {\n parentInstancesNodePredicate: this.#categoryClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createCategoryChildrenQuery(requestProps),\n },\n ]),\n ...(isDefinitionContainerSupported\n ? [\n {\n parentInstancesNodePredicate: CLASS_NAME_DefinitionContainer,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) =>\n this.createDefinitionContainersAndCategoriesQuery(requestProps),\n },\n ]\n : []),\n ],\n },\n });\n })();\n return this.#impl;\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);\n }\n\n private async createISubModeledElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n // note: we do not apply hierarchy level filtering on this hierarchy level, because it's always\n // hidden - the filter will get applied on the child hierarchy levels\n return [\n {\n fullClassName: this.#categoryModelClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: \"\", // doesn't matter - the node is always hidden\n hideNodeInHierarchy: true,\n hasChildren: true,\n extendedData: {\n isModel: true,\n },\n })}\n FROM ${this.#categoryModelClass} this\n WHERE\n this.ModeledElement.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n AND NOT this.IsPrivate\n AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.#categoryElementClass})\n `,\n bindings: [...elementIds.map((id): ECSqlBinding => ({ type: \"id\", value: id }))],\n },\n },\n ];\n }\n\n private async createGeometricModel3dChildrenQuery({\n parentNodeInstanceIds: modelIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryClass, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: this.#categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryClass,\n }),\n },\n grouping: { byLabel: { action: \"merge\", groupId: \"category\" } },\n hasChildren: true,\n extendedData: {\n imageId: \"icon-layers\",\n isCategory: true,\n modelIds: { selector: createIdsSelector(modelIds) },\n isCategoryOfSubModel: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this.#categoryElementClass} element\n WHERE\n element.Model.Id IN (${modelIds.join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createDefinitionContainersAndCategoriesQuery(props: {\n parentNodeInstanceIds?: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds, instanceFilter } = props;\n const { definitionContainers, categories } = await firstValueFrom(\n parentNodeInstanceIds === undefined\n ? this.#idsCache.getRootDefinitionContainersAndCategories({ includeEmpty: this.#hierarchyConfig.showEmptyCategories })\n : this.#idsCache.getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds: parentNodeInstanceIds,\n includeEmpty: this.#hierarchyConfig.showEmptyCategories,\n }),\n );\n const hierarchyDefinition = new Array<HierarchyNodesDefinition>();\n if (categories.length > 0) {\n hierarchyDefinition.push(...(await this.createCategoriesQuery({ categories, instanceFilter })));\n }\n if (definitionContainers.length > 0) {\n hierarchyDefinition.push(...(await this.createDefinitionContainersQuery({ definitionContainerIds: definitionContainers, instanceFilter })));\n }\n return hierarchyDefinition;\n }\n\n private async createDefinitionContainersQuery({\n definitionContainerIds,\n instanceFilter,\n }: {\n definitionContainerIds: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_DefinitionContainer, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: CLASS_NAME_DefinitionContainer,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_DefinitionContainer,\n }),\n },\n extendedData: {\n isDefinitionContainer: true,\n imageId: \"icon-definition-container\",\n },\n hasChildren: true,\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${definitionContainerIds.join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoriesQuery({\n categories,\n instanceFilter,\n }: {\n categories: Array<CategoryInfo>;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryClass, alias: \"this\" },\n });\n const categoriesWithMultipleSubCategories = categories\n .filter((categoryInfo) => categoryInfo.subCategoryChildCount > 1)\n .map((categoryInfo) => categoryInfo.id);\n\n const hasChildrenSelector = () => {\n const conditions = new Array<string>();\n if (!this.#hierarchyConfig.hideSubCategories && categoriesWithMultipleSubCategories.length > 0) {\n conditions.push(`this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")})`);\n }\n if (this.#hierarchyConfig.showElements) {\n conditions.push(`\n this.ECInstanceId IN (\n SELECT e.Category.Id\n FROM ${this.#categoryElementClass} e\n WHERE\n e.Parent.Id IS NULL\n AND e.ECInstanceId NOT IN (SELECT m.ECInstanceId FROM ${this.#categoryModelClass} m)\n )`);\n }\n return conditions.length > 0\n ? {\n selector: `IIF(${conditions.join(\" OR \")}, 1, 0)`,\n }\n : false;\n };\n\n return [\n {\n fullClassName: this.#categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryClass,\n }),\n },\n hasChildren: hasChildrenSelector(),\n extendedData: {\n description: { selector: \"this.Description\" },\n isCategory: true,\n imageId: \"icon-layers\",\n hasSubCategories:\n categoriesWithMultipleSubCategories.length > 0\n ? { selector: `IIF(this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")}), true, false) ` }\n : false,\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${categories.map((category) => category.id).join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryChildrenQuery(props: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n return (\n await Promise.all([\n ...(!this.#hierarchyConfig.hideSubCategories && props.parentNode.extendedData?.hasSubCategories ? [this.createSubCategoriesQuery(props)] : []),\n ...(this.#hierarchyConfig.showElements ? [this.createCategoryElementsQuery(props)] : []),\n ])\n ).reduce((acc, levelDefinition) => acc.concat(levelDefinition), new Array<HierarchyNodesDefinition>());\n }\n\n private async createSubCategoriesQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_SubCategory, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: CLASS_NAME_SubCategory,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_SubCategory,\n }),\n },\n extendedData: {\n categoryId: { selector: \"printf('0x%x', this.Parent.Id)\" },\n isSubCategory: true,\n imageId: \"icon-layers-isolate\",\n },\n supportsFiltering: false,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n NOT this.IsPrivate AND this.Parent.Id IN (${categoryIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryElementsQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n parentNode,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryElementClass, alias: \"this\" },\n });\n const modelIds: Id64Array = parentNode.extendedData?.isCategoryOfSubModel\n ? parseIdsSelectorResult(parentNode.extendedData?.modelIds)\n : [...getDistinctMapValues(await firstValueFrom(this.#idsCache.getCategoriesElementModels(categoryIds)))];\n\n if (modelIds.length === 0) {\n return [];\n }\n const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<ElementId>()),\n ),\n );\n\n return [\n {\n fullClassName: this.#categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IIF(\n ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(\",\")})` : `FALSE`},\n 1,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${parentNode.extendedData?.isCategoryOfSubModel ? \"\" : `JOIN ${CLASS_NAME_InformationPartitionElement} ipe ON ipe.ECInstanceId = this.Model.Id`}\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.join(\",\")})\n AND this.Model.Id IN (${modelIds.join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryElementClass, alias: \"this\" },\n });\n return [\n {\n fullClassName: this.#categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} ce\n JOIN ${CLASS_NAME_Model} m ON ce.Model.Id = m.ECInstanceId\n WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)\n LIMIT 1\n ), 0)\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${elementIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps): Promise<NormalizedHierarchyFilteringPath[]> {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({\n ...props,\n labelsFactory,\n componentId: props.componentId ?? Guid.createValue(),\n componentName: this.#componentName,\n });\n }\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: MarkRequired<CategoriesTreeInstanceKeyPathsFromInstanceLabelProps, \"componentId\"> & {\n labelsFactory: IInstanceLabelSelectClauseFactory;\n componentName: string;\n },\n): Promise<NormalizedHierarchyFilteringPath[]> {\n const { idsCache, abortSignal, label, viewType, labelsFactory, limit, hierarchyConfig, imodelAccess, componentId, componentName } = props;\n const { categoryClass, elementClass } = getClassesByView(viewType);\n\n const adjustedLabel = label.replace(/[%_\\\\]/g, \"\\\\$&\");\n\n const CATEGORIES_WITH_LABELS_CTE = \"CategoriesWithLabels\";\n const ELEMENTS_WITH_LABELS_CTE = \"ElementsWithLabels\";\n const SUBCATEGORIES_WITH_LABELS_CTE = \"SubCategoriesWithLabels\";\n const DEFINITION_CONTAINERS_WITH_LABELS_CTE = \"DefinitionContainersWithLabels\";\n\n return lastValueFrom(\n idsCache\n .getAllDefinitionContainersAndCategories({\n includeEmpty: props.hierarchyConfig.showEmptyCategories,\n })\n .pipe(\n mergeMap(async ({ definitionContainers, categories }) => {\n if (categories.length === 0) {\n return undefined;\n }\n const [categoryLabelSelectClause, subCategoryLabelSelectClause, elementLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all(\n [categoryClass, CLASS_NAME_SubCategory, elementClass, ...(definitionContainers.length > 0 ? [CLASS_NAME_DefinitionContainer] : [])].map(\n async (className) => labelsFactory.createSelectClause({ classAlias: \"this\", className }),\n ),\n );\n const ctes = [\n `${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (\n SELECT\n 'c',\n this.ECInstanceId,\n COUNT(sc.ECInstanceId),\n ${categoryLabelSelectClause}\n FROM\n ${categoryClass} this\n JOIN ${CLASS_NAME_SubCategory} sc ON sc.Parent.Id = this.ECInstanceId\n WHERE\n this.ECInstanceId IN (${categories.join(\", \")})\n GROUP BY this.ECInstanceId\n )`,\n ...(hierarchyConfig.showElements\n ? [\n `${ELEMENTS_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'e',\n this.ECInstanceId,\n this.Parent.Id,\n ${elementLabelSelectClause}\n FROM\n ${elementClass} this\n JOIN ${CLASS_NAME_Model} m ON this.Model.Id = m.ECInstanceId\n WHERE\n NOT m.IsPrivate\n AND this.Category.Id IN (${categories.join(\", \")})\n )`,\n ]\n : []),\n ...(hierarchyConfig.hideSubCategories\n ? []\n : [\n `${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'sc',\n this.ECInstanceId,\n this.Parent.Id,\n ${subCategoryLabelSelectClause}\n FROM\n ${CLASS_NAME_SubCategory} this\n WHERE\n NOT this.IsPrivate\n AND this.Parent.Id IN (${categories.join(\", \")})\n )`,\n ]),\n ...(definitionContainers.length > 0\n ? [\n `${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'dc',\n this.ECInstanceId,\n ${definitionContainerLabelSelectClause}\n FROM\n ${CLASS_NAME_DefinitionContainer} this\n WHERE\n this.ECInstanceId IN (${definitionContainers.join(\", \")})\n )`,\n ]\n : []),\n ];\n const ecsql = `\n SELECT * FROM (\n SELECT\n c.ClassName AS ClassName,\n c.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n WHERE\n c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n ${\n hierarchyConfig.showElements\n ? `\n UNION ALL\n SELECT\n e.ClassName AS ClassName,\n e.ECInstanceId AS ECInstanceId\n FROM\n ${ELEMENTS_WITH_LABELS_CTE} e\n WHERE\n e.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n ${\n hierarchyConfig.hideSubCategories\n ? \"\"\n : `\n UNION ALL\n SELECT\n sc.ClassName AS ClassName,\n sc.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId\n WHERE\n c.ChildCount > 1\n AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n }\n ${\n definitionContainers.length > 0\n ? `\n UNION ALL\n SELECT\n dc.ClassName AS ClassName,\n dc.ECInstanceId AS ECInstanceId\n FROM\n ${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc\n WHERE\n dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n )\n ${limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : limit !== \"unbounded\" ? `LIMIT ${limit}` : \"\"}\n `;\n const bindings = [\n { type: \"string\" as const, value: adjustedLabel },\n ...(hierarchyConfig.showElements ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ...(hierarchyConfig.hideSubCategories ? [] : [{ type: \"string\" as const, value: adjustedLabel }]),\n ...(definitionContainers.length > 0 ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ];\n return { ctes, ecsql, bindings };\n }),\n mergeMap((queryProps) => {\n if (!queryProps) {\n return EMPTY;\n }\n return imodelAccess.createQueryReader(queryProps, { restartToken: `${componentName}/${componentId}/filter-by-label`, limit });\n }),\n releaseMainThreadOnItemsCount(1000),\n map((row): InstanceKey => {\n let className: string;\n switch (row.ClassName) {\n case \"c\":\n className = categoryClass;\n break;\n case \"sc\":\n className = CLASS_NAME_SubCategory;\n break;\n case \"e\":\n className = elementClass;\n break;\n default:\n className = CLASS_NAME_DefinitionContainer;\n break;\n }\n return {\n className,\n id: row.ECInstanceId,\n };\n }),\n toArray(),\n mergeMap((targetItems) => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })),\n toArray(),\n abortSignal ? takeUntil(fromEvent(abortSignal, \"abort\")) : identity,\n defaultIfEmpty([]),\n ),\n );\n}\n\nfunction createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n viewType,\n hierarchyConfig,\n idsCache,\n limit,\n componentId,\n componentName,\n}: MarkRequired<CategoriesTreeInstanceKeyPathsFromInstanceLabelProps, \"componentId\"> & {\n targetItems: InstanceKey[];\n componentName: string;\n}): Observable<NormalizedHierarchyFilteringPath> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n const { categoryClass } = getClassesByView(viewType);\n\n return from(targetItems).pipe(\n releaseMainThreadOnItemsCount(500),\n reduce(\n (acc, { id, className }) => {\n if (className === categoryClass) {\n acc.categoryIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_DefinitionContainer) {\n acc.definitionContainerIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_SubCategory) {\n if (hierarchyConfig.hideSubCategories) {\n return acc;\n }\n acc.subCategoryIds.push(id);\n return acc;\n }\n\n if (!hierarchyConfig.showElements) {\n return acc;\n }\n acc.elementIds.push(id);\n return acc;\n },\n {\n definitionContainerIds: new Array<DefinitionContainerId>(),\n categoryIds: new Array<CategoryId>(),\n subCategoryIds: new Array<SubCategoryId>(),\n elementIds: new Array<ElementId>(),\n },\n ),\n mergeMap((ids) => {\n const elementsLength = ids.elementIds.length;\n return merge(\n from(ids.definitionContainerIds).pipe(\n mergeMap((id) => idsCache.getInstanceKeyPaths({ definitionContainerId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.categoryIds).pipe(\n mergeMap((id) => idsCache.getInstanceKeyPaths({ categoryId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.subCategoryIds).pipe(\n mergeMap((id) => idsCache.getInstanceKeyPaths({ subCategoryId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.elementIds).pipe(\n bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })),\n releaseMainThreadOnItemsCount(1),\n mergeMap(\n (block, chunkIndex) =>\n createGeometricElementInstanceKeyPaths({\n imodelAccess,\n idsCache,\n hierarchyConfig,\n viewType,\n targetItems: block,\n chunkIndex,\n componentId,\n componentName,\n }),\n 10,\n ),\n ),\n );\n }),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(props: {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n viewType: \"2d\" | \"3d\";\n targetItems: Id64Array;\n componentId: GuidString;\n componentName: string;\n chunkIndex: number;\n}): Observable<NormalizedHierarchyFilteringPath> {\n const separator = \";\";\n const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess, viewType } = props;\n const { categoryClass, elementClass, modelClass } = getClassesByView(viewType);\n if (targetItems.length === 0 || !hierarchyConfig.showElements) {\n return EMPTY;\n }\n\n return defer(() => {\n const ctes = [\n `CategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, Path) AS (\n SELECT\n e.ECInstanceId,\n e.Parent.Id,\n e.Model.Id,\n IIF(e.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT),\n 'e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)\n )\n FROM ${elementClass} e\n LEFT JOIN ${modelClass} m ON (e.Parent.Id IS NULL AND m.ECInstanceId = e.Model.Id)\n LEFT JOIN ${categoryClass} c ON (e.Parent.Id IS NULL AND c.ECInstanceId = e.Category.Id)\n WHERE e.ECInstanceId IN (${targetItems.join(\",\")})\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n IIF(pe.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path,\n 'e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path\n )\n FROM CategoriesElementsHierarchy ce\n JOIN ${elementClass} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN ${modelClass} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN ${categoryClass} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.Path\n FROM CategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"Indexes\", limit: \"unbounded\", restartToken: `${componentName}/${componentId}/element-paths/${chunkIndex}` },\n );\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, separator, elementClass, categoryClass, modelClass)),\n mergeMap((elementHierarchyPath) =>\n forkJoin({ elementHierarchyPath: of(elementHierarchyPath), pathToCategory: idsCache.getInstanceKeyPaths({ categoryId: elementHierarchyPath[0].id }) }),\n ),\n map(({ elementHierarchyPath, pathToCategory }) => {\n pathToCategory.pop(); // category is already included in the element hierarchy path\n const path = [...pathToCategory, ...elementHierarchyPath];\n return { path, options: { reveal: true } };\n }),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, separator: string, elementClassName: string, categoryClassName: string, modelClassName: string) {\n const rowElements: string[] = row[0].split(separator);\n const path = new Array<InstanceKey>();\n for (let i = 0; i < rowElements.length; i += 2) {\n switch (rowElements[i]) {\n case \"e\":\n path.push({ className: elementClassName, id: rowElements[i + 1] });\n break;\n case \"c\":\n path.push({ className: categoryClassName, id: rowElements[i + 1] });\n break;\n case \"m\":\n // Ignore first model since it isn't in hierarchy\n if (i === 0) {\n break;\n }\n path.push({ className: modelClassName, id: rowElements[i + 1] });\n break;\n }\n }\n\n return path;\n}\n"]}
1
+ {"version":3,"file":"CategoriesTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/components/trees/categories-tree/CategoriesTreeDefinition.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 defaultIfEmpty,\n defer,\n distinct,\n EMPTY,\n firstValueFrom,\n forkJoin,\n from,\n fromEvent,\n identity,\n lastValueFrom,\n map,\n merge,\n mergeMap,\n of,\n reduce,\n takeUntil,\n toArray,\n} from \"rxjs\";\nimport { assert, Guid } from \"@itwin/core-bentley\";\nimport { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, ProcessedHierarchyNode } from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport {\n CLASS_NAME_DefinitionContainer,\n CLASS_NAME_InformationPartitionElement,\n CLASS_NAME_ISubModeledElement,\n CLASS_NAME_Model,\n CLASS_NAME_SubCategory,\n} from \"../common/internal/ClassNameDefinitions.js\";\nimport {\n createIdsSelector,\n getClassesByView,\n getOptimalBatchSize,\n groupingNodeHasFilterTargets,\n parseIdsSelectorResult,\n releaseMainThreadOnItemsCount,\n} from \"../common/internal/Utils.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\n\nimport type { Observable } from \"rxjs\";\nimport type { GuidString, Id64Array, MarkRequired } from \"@itwin/core-bentley\";\nimport type {\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GenericInstanceFilter,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type { CategoryId, DefinitionContainerId, ElementId, ModelId, SubCategoryId } from \"../common/internal/Types.js\";\nimport type { NormalizedHierarchyFilteringPath } from \"../common/Utils.js\";\nimport type { CategoriesTreeIdsCache, CategoryInfo } from \"./internal/CategoriesTreeIdsCache.js\";\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\ninterface CategoriesTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n viewType: \"2d\" | \"3d\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n}\n\ninterface CategoriesTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n label: string;\n viewType: \"2d\" | \"3d\";\n limit?: number | \"unbounded\";\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n abortSignal?: AbortSignal;\n componentId?: GuidString;\n}\n\n/**\n * Defines hierarchy configuration supported by `CategoriesTree`.\n * @beta\n */\nexport interface CategoriesTreeHierarchyConfiguration {\n /** Should SubCategories be hidden. Defaults to `false` */\n hideSubCategories: boolean;\n /** Should Elements be shown. Defaults to `false` */\n showElements: boolean;\n /** Should categories without elements be shown. Defaults to `false`. */\n showEmptyCategories: boolean;\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: CategoriesTreeHierarchyConfiguration = {\n hideSubCategories: false,\n showElements: false,\n showEmptyCategories: false,\n};\n\n/** @internal */\nexport class CategoriesTreeDefinition implements HierarchyDefinition {\n #impl: Promise<HierarchyDefinition> | undefined;\n #selectQueryFactory: NodesQueryClauseFactory;\n #nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n #idsCache: CategoriesTreeIdsCache;\n #hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n #iModelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n #categoryClass: string;\n #categoryElementClass: string;\n #categoryModelClass: string;\n static #componentName = \"CategoriesTreeDefinition\";\n\n public constructor(props: CategoriesTreeDefinitionProps) {\n this.#iModelAccess = props.imodelAccess;\n this.#idsCache = props.idsCache;\n this.#nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this.#selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this.#nodeLabelSelectClauseFactory,\n });\n this.#hierarchyConfig = props.hierarchyConfig;\n const { categoryClass, elementClass, modelClass } = getClassesByView(props.viewType);\n this.#categoryClass = categoryClass;\n this.#categoryElementClass = elementClass;\n this.#categoryModelClass = modelClass;\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n const modelElementsMap = new Map<ModelId, Set<ElementId>>();\n node.children.forEach((child) => {\n let modelEntry = modelElementsMap.get(child.extendedData?.modelId);\n if (!modelEntry) {\n modelEntry = new Set();\n modelElementsMap.set(child.extendedData?.modelId, modelEntry);\n }\n assert(child.key.type === \"instances\");\n for (const { id } of child.key.instanceKeys) {\n modelEntry.add(id);\n }\n });\n\n const { hasFilterTargetAncestor, hasDirectNonFilteredTargets } = groupingNodeHasFilterTargets(node.children);\n\n return {\n ...node,\n label: node.label,\n extendedData: {\n ...node.extendedData,\n // add `categoryId` from the first grouped element\n categoryId: node.children[0].extendedData?.categoryId,\n modelElementsMap,\n ...(hasDirectNonFilteredTargets ? { hasDirectNonFilteredTargets } : {}),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : {}),\n // `imageId` is assigned to instance nodes at query time, but grouping ones need to\n // be handled during post-processing\n imageId: \"icon-ec-class\",\n },\n };\n }\n return node;\n }\n\n private async getHierarchyDefinition(): Promise<HierarchyDefinition> {\n this.#impl ??= (async () => {\n const isDefinitionContainerSupported = await firstValueFrom(this.#idsCache.getIsDefinitionContainerSupported());\n return createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: this.#iModelAccess,\n hierarchy: {\n rootNodes: async (requestProps: DefineRootHierarchyLevelProps) => this.createDefinitionContainersAndCategoriesQuery(requestProps),\n childNodes: [\n ...(this.#hierarchyConfig.showElements\n ? [\n {\n parentInstancesNodePredicate: this.#categoryElementClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: CLASS_NAME_ISubModeledElement,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: this.#categoryModelClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n ]\n : []),\n ...(this.#hierarchyConfig.hideSubCategories && !this.#hierarchyConfig.showElements\n ? []\n : [\n {\n parentInstancesNodePredicate: this.#categoryClass,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createCategoryChildrenQuery(requestProps),\n },\n ]),\n ...(isDefinitionContainerSupported\n ? [\n {\n parentInstancesNodePredicate: CLASS_NAME_DefinitionContainer,\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) =>\n this.createDefinitionContainersAndCategoriesQuery(requestProps),\n },\n ]\n : []),\n ],\n },\n });\n })();\n return this.#impl;\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n return (await this.getHierarchyDefinition()).defineHierarchyLevel(props);\n }\n\n private async createISubModeledElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n // note: we do not apply hierarchy level filtering on this hierarchy level, because it's always\n // hidden - the filter will get applied on the child hierarchy levels\n return [\n {\n fullClassName: this.#categoryModelClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: \"\", // doesn't matter - the node is always hidden\n hideNodeInHierarchy: true,\n hasChildren: true,\n extendedData: {\n isModel: true,\n },\n })}\n FROM ${this.#categoryModelClass} this\n WHERE\n this.ModeledElement.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n AND NOT this.IsPrivate\n AND this.ECInstanceId IN (SELECT Model.Id FROM ${this.#categoryElementClass})\n `,\n bindings: [...elementIds.map((id): ECSqlBinding => ({ type: \"id\", value: id }))],\n },\n },\n ];\n }\n\n private async createGeometricModel3dChildrenQuery({\n parentNodeInstanceIds: modelIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryClass, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: this.#categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryClass,\n }),\n },\n grouping: { byLabel: { action: \"merge\", groupId: \"category\" } },\n hasChildren: true,\n extendedData: {\n imageId: \"icon-layers\",\n isCategory: true,\n modelIds: { selector: createIdsSelector(modelIds) },\n isCategoryOfSubModel: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this.#categoryElementClass} element\n WHERE\n element.Model.Id IN (${modelIds.join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createDefinitionContainersAndCategoriesQuery(props: {\n parentNodeInstanceIds?: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const { parentNodeInstanceIds, instanceFilter } = props;\n const { definitionContainers, categories } = await firstValueFrom(\n parentNodeInstanceIds === undefined\n ? this.#idsCache.getRootDefinitionContainersAndCategories({ includeEmpty: this.#hierarchyConfig.showEmptyCategories })\n : this.#idsCache.getDirectChildDefinitionContainersAndCategories({\n parentDefinitionContainerIds: parentNodeInstanceIds,\n includeEmpty: this.#hierarchyConfig.showEmptyCategories,\n }),\n );\n const hierarchyDefinition = new Array<HierarchyNodesDefinition>();\n if (categories.length > 0) {\n hierarchyDefinition.push(...(await this.createCategoriesQuery({ categories, instanceFilter })));\n }\n if (definitionContainers.length > 0) {\n hierarchyDefinition.push(...(await this.createDefinitionContainersQuery({ definitionContainerIds: definitionContainers, instanceFilter })));\n }\n return hierarchyDefinition;\n }\n\n private async createDefinitionContainersQuery({\n definitionContainerIds,\n instanceFilter,\n }: {\n definitionContainerIds: Id64Array;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_DefinitionContainer, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: CLASS_NAME_DefinitionContainer,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_DefinitionContainer,\n }),\n },\n extendedData: {\n isDefinitionContainer: true,\n imageId: \"icon-definition-container\",\n },\n hasChildren: true,\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${definitionContainerIds.join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoriesQuery({\n categories,\n instanceFilter,\n }: {\n categories: Array<CategoryInfo>;\n instanceFilter?: GenericInstanceFilter;\n }): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryClass, alias: \"this\" },\n });\n const categoriesWithMultipleSubCategories = categories\n .filter((categoryInfo) => categoryInfo.subCategoryChildCount > 1)\n .map((categoryInfo) => categoryInfo.id);\n\n const hasChildrenSelector = () => {\n const conditions = new Array<string>();\n if (!this.#hierarchyConfig.hideSubCategories && categoriesWithMultipleSubCategories.length > 0) {\n conditions.push(`this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")})`);\n }\n if (this.#hierarchyConfig.showElements) {\n conditions.push(`\n this.ECInstanceId IN (\n SELECT e.Category.Id\n FROM ${this.#categoryElementClass} e\n WHERE\n e.Parent.Id IS NULL\n AND e.ECInstanceId NOT IN (SELECT m.ECInstanceId FROM ${this.#categoryModelClass} m)\n )`);\n }\n return conditions.length > 0\n ? {\n selector: `IIF(${conditions.join(\" OR \")}, 1, 0)`,\n }\n : false;\n };\n\n return [\n {\n fullClassName: this.#categoryClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: ECSql.createRawPropertyValueSelector(\"this\", \"ECClassId\") },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryClass,\n }),\n },\n hasChildren: hasChildrenSelector(),\n extendedData: {\n description: { selector: \"this.Description\" },\n isCategory: true,\n imageId: \"icon-layers\",\n hasSubCategories:\n categoriesWithMultipleSubCategories.length > 0\n ? { selector: `IIF(this.ECInstanceId IN (${categoriesWithMultipleSubCategories.join(\",\")}), true, false) ` }\n : false,\n },\n supportsFiltering: true,\n })}\n FROM\n ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${categories.map((category) => category.id).join(\", \")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryChildrenQuery(props: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n return (\n await Promise.all([\n ...(!this.#hierarchyConfig.hideSubCategories && props.parentNode.extendedData?.hasSubCategories ? [this.createSubCategoriesQuery(props)] : []),\n ...(this.#hierarchyConfig.showElements ? [this.createCategoryElementsQuery(props)] : []),\n ])\n ).reduce((acc, levelDefinition) => acc.concat(levelDefinition), new Array<HierarchyNodesDefinition>());\n }\n\n private async createSubCategoriesQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: CLASS_NAME_SubCategory, alias: \"this\" },\n });\n\n return [\n {\n fullClassName: CLASS_NAME_SubCategory,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: CLASS_NAME_SubCategory,\n }),\n },\n extendedData: {\n categoryId: { selector: \"printf('0x%x', this.Parent.Id)\" },\n isSubCategory: true,\n imageId: \"icon-layers-isolate\",\n },\n supportsFiltering: false,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n NOT this.IsPrivate AND this.Parent.Id IN (${categoryIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createCategoryElementsQuery({\n parentNodeInstanceIds: categoryIds,\n instanceFilter,\n parentNode,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryElementClass, alias: \"this\" },\n });\n const modelIds: Id64Array = parentNode.extendedData?.isCategoryOfSubModel\n ? parseIdsSelectorResult(parentNode.extendedData?.modelIds)\n : await firstValueFrom(\n this.#idsCache.getCategoriesElementModels(categoryIds).pipe(\n mergeMap(({ models }) => models ?? []),\n distinct(),\n toArray(),\n ),\n );\n\n if (modelIds.length === 0) {\n return [];\n }\n const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap((modelId) => this.#idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<ElementId>()),\n ),\n );\n\n return [\n {\n fullClassName: this.#categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IIF(\n ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(\",\")})` : `FALSE`},\n 1,\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${parentNode.extendedData?.isCategoryOfSubModel ? \"\" : `JOIN ${CLASS_NAME_InformationPartitionElement} ipe ON ipe.ECInstanceId = this.Model.Id`}\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.join(\",\")})\n AND this.Model.Id IN (${modelIds.join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createElementChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this.#selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this.#categoryElementClass, alias: \"this\" },\n });\n return [\n {\n fullClassName: this.#categoryElementClass,\n query: {\n ecsql: `\n SELECT\n ${await this.#selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"this.ECClassId\" },\n ecInstanceId: { selector: \"this.ECInstanceId\" },\n nodeLabel: {\n selector: await this.#nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"this\",\n className: this.#categoryElementClass,\n }),\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this.#categoryElementClass} ce\n JOIN ${CLASS_NAME_Model} m ON ce.Model.Id = m.ECInstanceId\n WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)\n LIMIT 1\n ), 0)\n `,\n },\n grouping: {\n byClass: true,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n isElement: true,\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${elementIds.join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: CategoriesTreeInstanceKeyPathsFromInstanceLabelProps): Promise<NormalizedHierarchyFilteringPath[]> {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({\n ...props,\n labelsFactory,\n componentId: props.componentId ?? Guid.createValue(),\n componentName: this.#componentName,\n });\n }\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: MarkRequired<CategoriesTreeInstanceKeyPathsFromInstanceLabelProps, \"componentId\"> & {\n labelsFactory: IInstanceLabelSelectClauseFactory;\n componentName: string;\n },\n): Promise<NormalizedHierarchyFilteringPath[]> {\n const { idsCache, abortSignal, label, viewType, labelsFactory, limit, hierarchyConfig, imodelAccess, componentId, componentName } = props;\n const { categoryClass, elementClass } = getClassesByView(viewType);\n\n const adjustedLabel = label.replace(/[%_\\\\]/g, \"\\\\$&\");\n\n const CATEGORIES_WITH_LABELS_CTE = \"CategoriesWithLabels\";\n const ELEMENTS_WITH_LABELS_CTE = \"ElementsWithLabels\";\n const SUBCATEGORIES_WITH_LABELS_CTE = \"SubCategoriesWithLabels\";\n const DEFINITION_CONTAINERS_WITH_LABELS_CTE = \"DefinitionContainersWithLabels\";\n\n return lastValueFrom(\n idsCache\n .getAllDefinitionContainersAndCategories({\n includeEmpty: props.hierarchyConfig.showEmptyCategories,\n })\n .pipe(\n mergeMap(async ({ definitionContainers, categories }) => {\n if (categories.length === 0) {\n return undefined;\n }\n const [categoryLabelSelectClause, subCategoryLabelSelectClause, elementLabelSelectClause, definitionContainerLabelSelectClause] = await Promise.all(\n [categoryClass, CLASS_NAME_SubCategory, elementClass, ...(definitionContainers.length > 0 ? [CLASS_NAME_DefinitionContainer] : [])].map(\n async (className) => labelsFactory.createSelectClause({ classAlias: \"this\", className }),\n ),\n );\n const ctes = [\n `${CATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ChildCount, DisplayLabel) AS (\n SELECT\n 'c',\n this.ECInstanceId,\n COUNT(sc.ECInstanceId),\n ${categoryLabelSelectClause}\n FROM\n ${categoryClass} this\n JOIN ${CLASS_NAME_SubCategory} sc ON sc.Parent.Id = this.ECInstanceId\n WHERE\n this.ECInstanceId IN (${categories.join(\", \")})\n GROUP BY this.ECInstanceId\n )`,\n ...(hierarchyConfig.showElements\n ? [\n `${ELEMENTS_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'e',\n this.ECInstanceId,\n this.Parent.Id,\n ${elementLabelSelectClause}\n FROM\n ${elementClass} this\n JOIN ${CLASS_NAME_Model} m ON this.Model.Id = m.ECInstanceId\n WHERE\n NOT m.IsPrivate\n AND this.Category.Id IN (${categories.join(\", \")})\n )`,\n ]\n : []),\n ...(hierarchyConfig.hideSubCategories\n ? []\n : [\n `${SUBCATEGORIES_WITH_LABELS_CTE}(ClassName, ECInstanceId, ParentId, DisplayLabel) AS (\n SELECT\n 'sc',\n this.ECInstanceId,\n this.Parent.Id,\n ${subCategoryLabelSelectClause}\n FROM\n ${CLASS_NAME_SubCategory} this\n WHERE\n NOT this.IsPrivate\n AND this.Parent.Id IN (${categories.join(\", \")})\n )`,\n ]),\n ...(definitionContainers.length > 0\n ? [\n `${DEFINITION_CONTAINERS_WITH_LABELS_CTE}(ClassName, ECInstanceId, DisplayLabel) AS (\n SELECT\n 'dc',\n this.ECInstanceId,\n ${definitionContainerLabelSelectClause}\n FROM\n ${CLASS_NAME_DefinitionContainer} this\n WHERE\n this.ECInstanceId IN (${definitionContainers.join(\", \")})\n )`,\n ]\n : []),\n ];\n const ecsql = `\n SELECT * FROM (\n SELECT\n c.ClassName AS ClassName,\n c.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n WHERE\n c.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n ${\n hierarchyConfig.showElements\n ? `\n UNION ALL\n SELECT\n e.ClassName AS ClassName,\n e.ECInstanceId AS ECInstanceId\n FROM\n ${ELEMENTS_WITH_LABELS_CTE} e\n WHERE\n e.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n ${\n hierarchyConfig.hideSubCategories\n ? \"\"\n : `\n UNION ALL\n SELECT\n sc.ClassName AS ClassName,\n sc.ECInstanceId AS ECInstanceId\n FROM\n ${CATEGORIES_WITH_LABELS_CTE} c\n JOIN ${SUBCATEGORIES_WITH_LABELS_CTE} sc ON sc.ParentId = c.ECInstanceId\n WHERE\n c.ChildCount > 1\n AND sc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n }\n ${\n definitionContainers.length > 0\n ? `\n UNION ALL\n SELECT\n dc.ClassName AS ClassName,\n dc.ECInstanceId AS ECInstanceId\n FROM\n ${DEFINITION_CONTAINERS_WITH_LABELS_CTE} dc\n WHERE\n dc.DisplayLabel LIKE '%' || ? || '%' ESCAPE '\\\\'\n `\n : \"\"\n }\n )\n ${limit === undefined ? `LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}` : limit !== \"unbounded\" ? `LIMIT ${limit}` : \"\"}\n `;\n const bindings = [\n { type: \"string\" as const, value: adjustedLabel },\n ...(hierarchyConfig.showElements ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ...(hierarchyConfig.hideSubCategories ? [] : [{ type: \"string\" as const, value: adjustedLabel }]),\n ...(definitionContainers.length > 0 ? [{ type: \"string\" as const, value: adjustedLabel }] : []),\n ];\n return { ctes, ecsql, bindings };\n }),\n mergeMap((queryProps) => {\n if (!queryProps) {\n return EMPTY;\n }\n return imodelAccess.createQueryReader(queryProps, { restartToken: `${componentName}/${componentId}/filter-by-label`, limit });\n }),\n releaseMainThreadOnItemsCount(1000),\n map((row): InstanceKey => {\n let className: string;\n switch (row.ClassName) {\n case \"c\":\n className = categoryClass;\n break;\n case \"sc\":\n className = CLASS_NAME_SubCategory;\n break;\n case \"e\":\n className = elementClass;\n break;\n default:\n className = CLASS_NAME_DefinitionContainer;\n break;\n }\n return {\n className,\n id: row.ECInstanceId,\n };\n }),\n toArray(),\n mergeMap((targetItems) => createInstanceKeyPathsFromTargetItems({ ...props, targetItems })),\n toArray(),\n abortSignal ? takeUntil(fromEvent(abortSignal, \"abort\")) : identity,\n defaultIfEmpty([]),\n ),\n );\n}\n\nfunction createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n viewType,\n hierarchyConfig,\n idsCache,\n limit,\n componentId,\n componentName,\n}: MarkRequired<CategoriesTreeInstanceKeyPathsFromInstanceLabelProps, \"componentId\"> & {\n targetItems: InstanceKey[];\n componentName: string;\n}): Observable<NormalizedHierarchyFilteringPath> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n const { categoryClass } = getClassesByView(viewType);\n return from(targetItems).pipe(\n releaseMainThreadOnItemsCount(500),\n reduce(\n (acc, { id, className }) => {\n if (className === categoryClass) {\n acc.categoryIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_DefinitionContainer) {\n acc.definitionContainerIds.push(id);\n return acc;\n }\n if (className === CLASS_NAME_SubCategory) {\n if (hierarchyConfig.hideSubCategories) {\n return acc;\n }\n acc.subCategoryIds.push(id);\n return acc;\n }\n\n if (!hierarchyConfig.showElements) {\n return acc;\n }\n acc.elementIds.push(id);\n return acc;\n },\n {\n definitionContainerIds: new Array<DefinitionContainerId>(),\n categoryIds: new Array<CategoryId>(),\n subCategoryIds: new Array<SubCategoryId>(),\n elementIds: new Array<ElementId>(),\n },\n ),\n mergeMap((ids) => {\n const elementsLength = ids.elementIds.length;\n return merge(\n from(ids.definitionContainerIds).pipe(\n releaseMainThreadOnItemsCount(200),\n mergeMap((id) => idsCache.getInstanceKeyPaths({ definitionContainerId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.categoryIds).pipe(\n releaseMainThreadOnItemsCount(200),\n mergeMap((id) => idsCache.getInstanceKeyPaths({ categoryId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.subCategoryIds).pipe(\n releaseMainThreadOnItemsCount(200),\n mergeMap((id) => idsCache.getInstanceKeyPaths({ subCategoryId: id })),\n map((path) => ({ path, options: { reveal: true } })),\n ),\n from(ids.elementIds).pipe(\n bufferCount(getOptimalBatchSize({ totalSize: elementsLength, maximumBatchSize: 5000 })),\n releaseMainThreadOnItemsCount(1),\n mergeMap(\n (block, chunkIndex) =>\n createGeometricElementInstanceKeyPaths({\n imodelAccess,\n idsCache,\n hierarchyConfig,\n viewType,\n targetItems: block,\n chunkIndex,\n componentId,\n componentName,\n }),\n 10,\n ),\n ),\n );\n }),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(props: {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: CategoriesTreeIdsCache;\n hierarchyConfig: CategoriesTreeHierarchyConfiguration;\n viewType: \"2d\" | \"3d\";\n targetItems: Id64Array;\n componentId: GuidString;\n componentName: string;\n chunkIndex: number;\n}): Observable<NormalizedHierarchyFilteringPath> {\n const separator = \";\";\n const { targetItems, chunkIndex, componentId, componentName, hierarchyConfig, idsCache, imodelAccess, viewType } = props;\n const { categoryClass, elementClass, modelClass } = getClassesByView(viewType);\n if (targetItems.length === 0 || !hierarchyConfig.showElements) {\n return EMPTY;\n }\n\n return defer(() => {\n const ctes = [\n `CategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, Path) AS (\n SELECT\n e.ECInstanceId,\n e.Parent.Id,\n e.Model.Id,\n IIF(e.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT),\n 'e${separator}' || CAST(IdToHex([e].[ECInstanceId]) AS TEXT)\n )\n FROM ${elementClass} e\n LEFT JOIN ${modelClass} m ON (e.Parent.Id IS NULL AND m.ECInstanceId = e.Model.Id)\n LEFT JOIN ${categoryClass} c ON (e.Parent.Id IS NULL AND c.ECInstanceId = e.Category.Id)\n WHERE e.ECInstanceId IN (${targetItems.join(\",\")})\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n IIF(pe.Parent.Id IS NULL,\n 'm${separator}' || CAST(IdToHex([m].[ECInstanceId]) AS TEXT) || '${separator}c${separator}' || CAST(IdToHex([c].[ECInstanceId]) AS TEXT) || '${separator}e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path,\n 'e${separator}' || CAST(IdToHex([pe].[ECInstanceId]) AS TEXT) || '${separator}' || ce.Path\n )\n FROM CategoriesElementsHierarchy ce\n JOIN ${elementClass} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN ${modelClass} m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN ${categoryClass} c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.Path\n FROM CategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader(\n { ctes, ecsql },\n { rowFormat: \"Indexes\", limit: \"unbounded\", restartToken: `${componentName}/${componentId}/element-paths/${chunkIndex}` },\n );\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, separator, elementClass, categoryClass, modelClass)),\n mergeMap((elementHierarchyPath) =>\n forkJoin({ elementHierarchyPath: of(elementHierarchyPath), pathToCategory: idsCache.getInstanceKeyPaths({ categoryId: elementHierarchyPath[0].id }) }),\n ),\n map(({ elementHierarchyPath, pathToCategory }) => {\n pathToCategory.pop(); // category is already included in the element hierarchy path\n const path = [...pathToCategory, ...elementHierarchyPath];\n return { path, options: { reveal: true } };\n }),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, separator: string, elementClassName: string, categoryClassName: string, modelClassName: string) {\n const rowElements: string[] = row[0].split(separator);\n const path = new Array<InstanceKey>();\n for (let i = 0; i < rowElements.length; i += 2) {\n switch (rowElements[i]) {\n case \"e\":\n path.push({ className: elementClassName, id: rowElements[i + 1] });\n break;\n case \"c\":\n path.push({ className: categoryClassName, id: rowElements[i + 1] });\n break;\n case \"m\":\n // Ignore first model since it isn't in hierarchy\n if (i === 0) {\n break;\n }\n path.push({ className: modelClassName, id: rowElements[i + 1] });\n break;\n }\n }\n\n return path;\n}\n"]}
@@ -36,7 +36,10 @@ export declare class CategoriesTreeIdsCache implements Disposable {
36
36
  categories: CategoryInfo[];
37
37
  definitionContainers: Array<DefinitionContainerId>;
38
38
  }>;
39
- getCategoriesElementModels(categoryIds: Id64Arg, includeSubModels?: boolean): Observable<Map<CategoryId, Set<ModelId>>>;
39
+ getCategoriesElementModels(categoryIds: Id64Arg, includeSubModels?: boolean): Observable<{
40
+ id: CategoryId;
41
+ models: Array<ModelId> | undefined;
42
+ }>;
40
43
  getModelCategoryIds(modelId: Id64String): Observable<Id64Array>;
41
44
  getAllCategories(): Observable<Id64Set>;
42
45
  hasSubModel(elementId: Id64String): Observable<boolean>;
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { defer, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from "rxjs";
5
+ import { defer, EMPTY, forkJoin, from, map, mergeMap, of, reduce, shareReplay, toArray } from "rxjs";
6
6
  import { Guid, Id64 } from "@itwin/core-bentley";
7
7
  import { CLASS_NAME_DefinitionContainer, CLASS_NAME_Model, CLASS_NAME_SubCategory } from "../../common/internal/ClassNameDefinitions.js";
8
8
  import { ModelCategoryElementsCountCache } from "../../common/internal/ModelCategoryElementsCountCache.js";
9
- import { getClassesByView, getDistinctMapValues, joinId64Arg } from "../../common/internal/Utils.js";
9
+ import { getClassesByView, joinId64Arg } from "../../common/internal/Utils.js";
10
10
  /** @internal */
11
11
  export class CategoriesTreeIdsCache {
12
12
  #definitionContainersInfo;
@@ -235,7 +235,8 @@ export class CategoriesTreeIdsCache {
235
235
  modelWithCategoryModeledElements: this.getModelWithCategoryModeledElements(),
236
236
  }).pipe(map(({ modelCategories, modelWithCategoryModeledElements }) => {
237
237
  const result = new Map();
238
- const subModels = getDistinctMapValues(modelWithCategoryModeledElements);
238
+ const subModels = new Set();
239
+ modelWithCategoryModeledElements.forEach((categoryMap) => categoryMap.forEach((categorySubModels) => categorySubModels.forEach((subModelId) => subModels.add(subModelId))));
239
240
  for (const [modelId, modelEntry] of modelCategories) {
240
241
  const isSubModel = subModels.has(modelId);
241
242
  result.set(modelId, { categoryIds: modelEntry.categoryIds, isSubModel });
@@ -264,28 +265,30 @@ export class CategoriesTreeIdsCache {
264
265
  }
265
266
  getModelWithCategoryModeledElements() {
266
267
  this.#modelWithCategoryModeledElements ??= this.queryModeledElements().pipe(reduce((acc, { modelId, categoryId, modeledElementId }) => {
267
- const key = `${modelId}-${categoryId}`;
268
- const entry = acc.get(key);
269
- if (entry === undefined) {
270
- acc.set(key, new Set([modeledElementId]));
268
+ let modelEntry = acc.get(modelId);
269
+ if (!modelEntry) {
270
+ modelEntry = new Map();
271
+ acc.set(modelId, modelEntry);
272
+ }
273
+ const categoryEntry = modelEntry.get(categoryId);
274
+ if (!categoryEntry) {
275
+ modelEntry.set(categoryId, new Set([modeledElementId]));
271
276
  }
272
277
  else {
273
- entry.add(modeledElementId);
278
+ categoryEntry.add(modeledElementId);
274
279
  }
275
280
  return acc;
276
281
  }, new Map()), shareReplay());
277
282
  return this.#modelWithCategoryModeledElements;
278
283
  }
279
284
  getCategoriesModeledElements(modelId, categoryIds) {
280
- return this.getModelWithCategoryModeledElements().pipe(map((modelWithCategoryModeledElements) => {
285
+ return this.getModelWithCategoryModeledElements().pipe(mergeMap((modelWithCategoryModeledElements) => {
281
286
  const result = new Array();
282
- for (const categoryId of Id64.iterable(categoryIds)) {
283
- const entry = modelWithCategoryModeledElements.get(`${modelId}-${categoryId}`);
284
- if (entry !== undefined) {
285
- result.push(...entry);
286
- }
287
+ const categoryMap = modelWithCategoryModeledElements.get(modelId);
288
+ if (!categoryMap) {
289
+ return of(result);
287
290
  }
288
- return result;
291
+ return from(Id64.iterable(categoryIds)).pipe(map((categoryId) => categoryMap.get(categoryId)), mergeMap((elementsSet) => (elementsSet ? from(elementsSet) : EMPTY)), toArray());
289
292
  }));
290
293
  }
291
294
  getSubCategoriesInfo() {
@@ -352,19 +355,15 @@ export class CategoriesTreeIdsCache {
352
355
  }, { definitionContainers: new Array(), categories: new Array() }))));
353
356
  }
354
357
  getCategoriesElementModels(categoryIds, includeSubModels) {
355
- return this.getElementModelsCategories().pipe(mergeMap((elementModelsCategories) => from(Id64.iterable(categoryIds)).pipe(reduce((acc, categoryId) => {
356
- for (const [modelId, { categoryIds: categories, isSubModel }] of elementModelsCategories) {
358
+ return this.getElementModelsCategories().pipe(mergeMap((elementModelsCategories) => from(Id64.iterable(categoryIds)).pipe(map((categoryId) => {
359
+ const categoryModels = new Array();
360
+ elementModelsCategories.forEach(({ categoryIds: categories, isSubModel }, modelId) => {
357
361
  if ((includeSubModels || !isSubModel) && categories.has(categoryId)) {
358
- let categoryModels = acc.get(categoryId);
359
- if (!categoryModels) {
360
- categoryModels = new Set();
361
- acc.set(categoryId, categoryModels);
362
- }
363
- categoryModels.add(modelId);
362
+ categoryModels.push(modelId);
364
363
  }
365
- }
366
- return acc;
367
- }, new Map()))));
364
+ });
365
+ return { id: categoryId, models: categoryModels.length > 0 ? categoryModels : undefined };
366
+ }))));
368
367
  }
369
368
  getModelCategoryIds(modelId) {
370
369
  return this.getElementModelsCategories().pipe(map((elementModelsCategories) => {