@itwin/tree-widget-react 3.2.0 → 3.2.1
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.
- package/CHANGELOG.md +11 -2
- package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js +38 -36
- package/lib/cjs/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/Utils.d.ts +7 -0
- package/lib/cjs/components/trees/models-tree/Utils.js +25 -0
- package/lib/cjs/components/trees/models-tree/Utils.js.map +1 -0
- package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +7 -8
- package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.js +61 -33
- package/lib/cjs/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +4 -14
- package/lib/cjs/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js +39 -37
- package/lib/esm/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
- package/lib/esm/components/trees/models-tree/Utils.d.ts +7 -0
- package/lib/esm/components/trees/models-tree/Utils.js +21 -0
- package/lib/esm/components/trees/models-tree/Utils.js.map +1 -0
- package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.d.ts +7 -8
- package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.js +61 -33
- package/lib/esm/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
- package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js +2 -12
- package/lib/esm/components/trees/models-tree/internal/ModelsTreeVisibilityHandler.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
# Change Log - @itwin/tree-widget-react
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 07 Jan 2025 12:53:16 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
|
+
## 3.2.1
|
|
8
|
+
|
|
9
|
+
Tue, 07 Jan 2025 12:53:16 GMT
|
|
10
|
+
|
|
11
|
+
### Patches
|
|
12
|
+
|
|
13
|
+
- Increase performance consistency when creating filtering paths from target items. ([#1130](https://github.com/iTwin/viewer-components-react/pull/1130))
|
|
14
|
+
- Reduced main thread blockage ~3 times when creating filtering paths from target items. ([#1123](https://github.com/iTwin/viewer-components-react/pull/1123))
|
|
15
|
+
|
|
7
16
|
## 3.2.0
|
|
8
17
|
|
|
9
|
-
Wed, 18 Dec 2024 12:42:
|
|
18
|
+
Wed, 18 Dec 2024 12:42:56 GMT
|
|
10
19
|
|
|
11
20
|
### Minor changes
|
|
12
21
|
|
|
@@ -11,6 +11,7 @@ const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
|
11
11
|
const Rxjs_1 = require("../common/Rxjs");
|
|
12
12
|
const TreeErrors_1 = require("../common/TreeErrors");
|
|
13
13
|
const Utils_1 = require("../common/Utils");
|
|
14
|
+
const Utils_2 = require("./Utils");
|
|
14
15
|
const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
|
|
15
16
|
exports.defaultHierarchyConfiguration = {
|
|
16
17
|
elementClassGrouping: "enable",
|
|
@@ -459,15 +460,6 @@ class ModelsTreeDefinition {
|
|
|
459
460
|
}
|
|
460
461
|
}
|
|
461
462
|
exports.ModelsTreeDefinition = ModelsTreeDefinition;
|
|
462
|
-
function createSubjectInstanceKeysPath(subjectId, idsCache) {
|
|
463
|
-
return (0, rxjs_1.from)(idsCache.getSubjectAncestorsPath(subjectId)).pipe((0, rxjs_1.map)((idsPath) => idsPath.map((id) => ({ className: "BisCore.Subject", id }))));
|
|
464
|
-
}
|
|
465
|
-
function createModelInstanceKeyPaths(modelId, idsCache) {
|
|
466
|
-
return (0, rxjs_1.from)(idsCache.getModelSubjects(modelId)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.mergeMap)((modelSubjectId) => createSubjectInstanceKeysPath(modelSubjectId, idsCache).pipe((0, rxjs_1.map)((subjectPath) => [...subjectPath, { className: "BisCore.GeometricModel3d", id: modelId }]))));
|
|
467
|
-
}
|
|
468
|
-
function createCategoryInstanceKeyPaths(categoryId, idsCache) {
|
|
469
|
-
return (0, rxjs_1.from)(idsCache.getCategoryModels(categoryId)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.mergeMap)((categoryModelId) => createModelInstanceKeyPaths(categoryModelId, idsCache).pipe((0, rxjs_1.map)((modelPath) => [...modelPath, { className: "BisCore.SpatialCategory", id: categoryId }]))));
|
|
470
|
-
}
|
|
471
463
|
function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, targetItems) {
|
|
472
464
|
const elementIds = targetItems.filter((info) => typeof info === "string");
|
|
473
465
|
const groupInfos = targetItems.filter((info) => typeof info !== "string");
|
|
@@ -529,9 +521,11 @@ function createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarch
|
|
|
529
521
|
WHERE mce.ParentId IS NULL
|
|
530
522
|
`;
|
|
531
523
|
return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: "Indexes", limit: "unbounded" });
|
|
532
|
-
}).pipe((0, rxjs_1.map)((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)), (0, rxjs_1.mergeMap)(({ modelId, elementHierarchyPath, groupingNode }) =>
|
|
533
|
-
|
|
534
|
-
const
|
|
524
|
+
}).pipe((0, Utils_2.releaseMainThreadOnItemsCount)(300), (0, rxjs_1.map)((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)), (0, rxjs_1.mergeMap)(({ modelId, elementHierarchyPath, groupingNode }) => (0, rxjs_1.from)(idsCache.createModelInstanceKeyPaths(modelId)).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)((modelPath) => {
|
|
525
|
+
// We dont want to modify the original path, we create a copy that we can modify
|
|
526
|
+
const newModelPath = [...modelPath];
|
|
527
|
+
newModelPath.pop(); // model is already included in the element hierarchy path
|
|
528
|
+
const path = [...newModelPath, ...elementHierarchyPath];
|
|
535
529
|
if (!groupingNode) {
|
|
536
530
|
return path;
|
|
537
531
|
}
|
|
@@ -572,36 +566,44 @@ async function createInstanceKeyPathsFromTargetItems({ targetItems, imodelAccess
|
|
|
572
566
|
if (limit !== "unbounded" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {
|
|
573
567
|
throw new TreeErrors_1.FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);
|
|
574
568
|
}
|
|
575
|
-
|
|
576
|
-
models: new Array(),
|
|
577
|
-
categories: new Array(),
|
|
578
|
-
subjects: new Array(),
|
|
579
|
-
elements: new Array(),
|
|
580
|
-
};
|
|
581
|
-
await Promise.all(targetItems.map(async (key) => {
|
|
569
|
+
return (0, rxjs_1.lastValueFrom)((0, rxjs_1.from)(targetItems).pipe((0, Utils_2.releaseMainThreadOnItemsCount)(2000), (0, rxjs_1.mergeMap)(async (key) => {
|
|
582
570
|
if ("parent" in key) {
|
|
583
|
-
|
|
571
|
+
return { key, type: 0 };
|
|
584
572
|
}
|
|
585
|
-
|
|
586
|
-
|
|
573
|
+
if (await imodelAccess.classDerivesFrom(key.className, "BisCore.Subject")) {
|
|
574
|
+
return { key: key.id, type: 1 };
|
|
587
575
|
}
|
|
588
|
-
|
|
589
|
-
|
|
576
|
+
if (await imodelAccess.classDerivesFrom(key.className, "BisCore.Model")) {
|
|
577
|
+
return { key: key.id, type: 2 };
|
|
590
578
|
}
|
|
591
|
-
|
|
592
|
-
|
|
579
|
+
if (await imodelAccess.classDerivesFrom(key.className, "BisCore.SpatialCategory")) {
|
|
580
|
+
return { key: key.id, type: 3 };
|
|
593
581
|
}
|
|
594
|
-
|
|
595
|
-
|
|
582
|
+
return { key: key.id, type: 0 };
|
|
583
|
+
}, 2), (0, rxjs_1.reduce)((acc, value) => {
|
|
584
|
+
if (value.type === 1) {
|
|
585
|
+
acc.subjects.push(value.key);
|
|
586
|
+
return acc;
|
|
596
587
|
}
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
588
|
+
if (value.type === 2) {
|
|
589
|
+
acc.models.push(value.key);
|
|
590
|
+
return acc;
|
|
591
|
+
}
|
|
592
|
+
if (value.type === 3) {
|
|
593
|
+
acc.categories.push(value.key);
|
|
594
|
+
return acc;
|
|
595
|
+
}
|
|
596
|
+
acc.elements.push(value.key);
|
|
597
|
+
return acc;
|
|
598
|
+
}, {
|
|
599
|
+
models: new Array(),
|
|
600
|
+
categories: new Array(),
|
|
601
|
+
subjects: new Array(),
|
|
602
|
+
elements: new Array(),
|
|
603
|
+
}), (0, rxjs_1.switchMap)(async (ids) => {
|
|
604
|
+
const elementsLength = ids.elements.length;
|
|
605
|
+
return (0, Rxjs_1.collect)((0, rxjs_1.merge)((0, rxjs_1.from)(ids.subjects).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createSubjectInstanceKeysPath(id)))), (0, rxjs_1.from)(ids.models).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createModelInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)()))), (0, rxjs_1.from)(ids.categories).pipe((0, rxjs_1.mergeMap)((id) => (0, rxjs_1.from)(idsCache.createCategoryInstanceKeyPaths(id)).pipe((0, rxjs_1.mergeAll)()))), (0, rxjs_1.from)(ids.elements).pipe((0, rxjs_1.bufferCount)(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))), (0, Utils_2.releaseMainThreadOnItemsCount)(1), (0, rxjs_1.mergeMap)((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block), 10))));
|
|
606
|
+
})));
|
|
605
607
|
}
|
|
606
608
|
async function createInstanceKeyPathsFromInstanceLabel(props) {
|
|
607
609
|
const elementLabelSelectClause = await props.labelsFactory.createSelectClause({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeDefinition.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 { defer, from, map, merge, mergeAll, mergeMap } from \"rxjs\";\nimport {\n createNodesQueryClauseFactory,\n createPredicateBasedHierarchyDefinition,\n NodeSelectClauseColumnNames,\n ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { collect } from \"../common/Rxjs\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { Observable } from \"rxjs\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type {\n ClassGroupingNodeKey,\n createIModelHierarchyProvider,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodeIdentifiersPath,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\n/**\n * Defines hierarchy configuration supported by `ModelsTree`.\n * @beta\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should element nodes be grouped by class. Defaults to `enable`. */\n elementClassGrouping: \"enable\" | \"enableWithCounts\" | \"disable\";\n /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d` */\n elementClassSpecification: string;\n /** Should models without elements be shown. Defaults to `false` */\n showEmptyModels: boolean;\n}\n\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: \"BisCore.GeometricElement3d\",\n showEmptyModels: false,\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n}\n\n/** @beta */\nexport interface ElementsGroupInfo {\n parent:\n | {\n ids: Id64String[];\n type: \"element\";\n }\n | {\n ids: Id64String[];\n modelIds: Id64String[];\n type: \"category\";\n };\n groupingNode: ClassGroupingHierarchyNode;\n}\n\ninterface ModelsTreeInstanceKeyPathsFromTargetItemsProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\ninterface ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n label: string;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\ntype HierarchyProviderProps = Parameters<typeof createIModelHierarchyProvider>[0];\ntype HierarchyFilteringPaths = NonNullable<NonNullable<HierarchyProviderProps[\"filtering\"]>[\"paths\"]>;\ntype HierarchyFilteringPath = HierarchyFilteringPaths[number];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace ModelsTreeInstanceKeyPathsProps {\n export function isLabelProps(props: ModelsTreeInstanceKeyPathsProps): props is ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n return !!(props as ModelsTreeInstanceKeyPathsFromInstanceLabelProps).label;\n }\n}\n\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _idsCache: ModelsTreeIdsCache;\n private _hierarchyConfig: ModelsTreeHierarchyConfiguration;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _queryExecutor: LimitingECSqlQueryExecutor;\n private _isSupported?: Promise<boolean>;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: \"BisCore.Subject\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.ISubModeledElement\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricModel3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.SpatialCategory\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricElement3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\n this._idsCache = props.idsCache;\n this._queryExecutor = props.imodelAccess;\n this._hierarchyConfig = props.hierarchyConfig;\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n return {\n ...node,\n label: this._hierarchyConfig.elementClassGrouping === \"enableWithCounts\" ? `${node.label} (${node.children.length})` : node.label,\n extendedData: {\n ...node.extendedData,\n // add `modelId` and `categoryId` from the first grouped element\n ...node.children[0].extendedData,\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 public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n if (this._isSupported === undefined) {\n this._isSupported = this.isSupported();\n }\n\n if ((await this._isSupported) === false) {\n return [];\n }\n\n return this._impl.defineHierarchyLevel(props);\n }\n\n private async createRootHierarchyLevelDefinition(props: DefineRootHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: props.instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.Subject\",\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: \"BisCore.Subject\",\n }),\n },\n extendedData: {\n imageId: \"icon-imodel-hollow-2\",\n isSubject: true,\n },\n autoExpand: true,\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: subjectIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n }),\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.GeometricModel3d\", alias: \"this\" },\n }),\n ]);\n const [childSubjectIds, childModelIds] = await Promise.all([\n this._idsCache.getChildSubjectIds(subjectIds),\n this._idsCache.getChildSubjectModelIds(subjectIds),\n ]);\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: \"BisCore.Subject\",\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: \"BisCore.Subject\",\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: \"icon-folder\",\n isSubject: true,\n },\n supportsFiltering: true,\n })}\n FROM ${subjectFilterClauses.from} this\n ${subjectFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${childSubjectIds.map(() => \"?\").join(\",\")})\n ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : \"\"}\n `,\n bindings: [\n { type: \"idset\", value: await this._idsCache.getParentSubjectIds() },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: \"BisCore.GeometricModel3d\",\n query: {\n ecsql: `\n SELECT model.ECInstanceId AS ECInstanceId, model.*\n FROM (\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"m.ECClassId\" },\n ecInstanceId: { selector: \"m.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"partition\",\n className: \"BisCore.InformationPartitionElement\",\n }),\n },\n hideNodeInHierarchy: {\n selector: `\n CASE\n WHEN (\n json_extract([partition].JsonProperties, '$.PhysicalPartition.Model.Content') IS NOT NULL\n OR json_extract([partition].JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NOT NULL\n ) THEN 1\n ELSE 0\n END\n `,\n },\n hasChildren: this._hierarchyConfig.showEmptyModels\n ? {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this._hierarchyConfig.elementClassSpecification} e\n WHERE e.Model.Id = m.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n }\n : true,\n extendedData: {\n imageId: \"icon-model\",\n isModel: true,\n },\n supportsFiltering: true,\n })}\n FROM Bis.GeometricModel3d m\n JOIN bis.InformationPartitionElement [partition] ON [partition].ECInstanceId = m.ModeledElement.Id\n WHERE\n m.ECInstanceId IN (${childModelIds.map(() => \"?\").join(\",\")})\n ) model\n JOIN ${modelFilterClauses.from} this ON this.ECInstanceId = model.ECInstanceId\n ${modelFilterClauses.joins}\n ${modelFilterClauses.where ? `AND (model.${NodeSelectClauseColumnNames.HideNodeInHierarchy} OR ${modelFilterClauses.where})` : \"\"}\n `,\n bindings: childModelIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n },\n });\n return defs;\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: \"BisCore.GeometricModel3d\",\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 })}\n FROM BisCore.GeometricModel3d 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._hierarchyConfig.elementClassSpecification})\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: \"BisCore.SpatialCategory\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.SpatialCategory\",\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: \"BisCore.SpatialCategory\",\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 },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this._hierarchyConfig.elementClassSpecification} element\n WHERE\n element.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: modelIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n private async createSpatialCategoryChildrenQuery({\n parentNodeInstanceIds: categoryIds,\n parentNode,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const modelIds = parseIdsSelectorResult(parentNode.extendedData?.modelIds);\n if (modelIds.length === 0) {\n throw new Error(`Invalid category node \"${parentNode.label}\" - missing model information.`);\n }\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this._hierarchyConfig.elementClassSpecification,\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._hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this._hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.map(() => \"?\").join(\",\")})\n AND this.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: [...categoryIds.map((id) => ({ type: \"id\", value: id })), ...modelIds.map((id) => ({ type: \"id\", value: id }))] as ECSqlBinding[],\n },\n },\n ];\n }\n\n private async createGeometricElement3dChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this._hierarchyConfig.elementClassSpecification,\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._hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this._hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: elementIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: ModelsTreeInstanceKeyPathsProps) {\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItems(props);\n }\n\n private async isSupported() {\n const [schemaName, className] = this._hierarchyConfig.elementClassSpecification.split(/[\\.:]/);\n if (!schemaName || !className) {\n throw new Error(\n `Provided class specification ${this._hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`,\n );\n }\n\n const query: ECSqlQueryDef = {\n ecsql: `\n SELECT 1\n FROM ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE s.Name = ? AND c.Name = ? AND c.ECInstanceId IS (BisCore.GeometricElement3d)\n `,\n bindings: [\n { type: \"string\", value: schemaName },\n { type: \"string\", value: className },\n ],\n };\n\n for await (const _row of this._queryExecutor.createQueryReader(query)) {\n return true;\n }\n return false;\n }\n}\n\nfunction createSubjectInstanceKeysPath(subjectId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getSubjectAncestorsPath(subjectId)).pipe(map((idsPath) => idsPath.map((id) => ({ className: \"BisCore.Subject\", id }))));\n}\n\nfunction createModelInstanceKeyPaths(modelId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getModelSubjects(modelId)).pipe(\n mergeAll(),\n mergeMap((modelSubjectId) =>\n createSubjectInstanceKeysPath(modelSubjectId, idsCache).pipe(\n map((subjectPath) => [...subjectPath, { className: \"BisCore.GeometricModel3d\", id: modelId }]),\n ),\n ),\n );\n}\n\nfunction createCategoryInstanceKeyPaths(categoryId: Id64String, idsCache: ModelsTreeIdsCache): Observable<HierarchyNodeIdentifiersPath> {\n return from(idsCache.getCategoryModels(categoryId)).pipe(\n mergeAll(),\n mergeMap((categoryModelId) =>\n createModelInstanceKeyPaths(categoryModelId, idsCache).pipe(map((modelPath) => [...modelPath, { className: \"BisCore.SpatialCategory\", id: categoryId }])),\n ),\n );\n}\n\nfunction createGeometricElementInstanceKeyPaths(\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor,\n idsCache: ModelsTreeIdsCache,\n hierarchyConfig: ModelsTreeHierarchyConfiguration,\n targetItems: Array<Id64String | ElementsGroupInfo>,\n): Observable<HierarchyFilteringPath> {\n const elementIds = targetItems.filter((info): info is Id64String => typeof info === \"string\");\n const groupInfos = targetItems.filter((info): info is ElementsGroupInfo => typeof info !== \"string\");\n const separator = \";\";\n\n return defer(() => {\n const targetElementsInfoQuery =\n elementIds.length > 0\n ? `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, -1\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE e.ECInstanceId IN (${elementIds.join(\",\")})\n `\n : undefined;\n\n const targetGroupingNodesElementInfoQueries = groupInfos.map(\n ({ parent, groupingNode }, index) => `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, ${index}\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE\n e.ECClassId IS (${groupingNode.key.className})\n AND ${parent.type === \"element\" ? `e.Parent.Id IN (${parent.ids.join(\",\")})` : `e.Parent.Id IS NULL AND e.Category.Id IN (${parent.ids.join(\",\")}) AND e.Model.Id IN (${parent.modelIds.join(\",\")})`}\n `,\n );\n\n const ctes = [\n `InstanceElementsWithClassGroupingNodes(ECInstanceId, ECClassId, ParentId, ModelId, CategoryId, GroupingNodeIndex) AS (\n ${[...(targetElementsInfoQuery ? [targetElementsInfoQuery] : []), ...targetGroupingNodesElementInfoQueries].join(\" UNION ALL \")}\n )`,\n `ModelsCategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, GroupingNodeIndex, Path) AS (\n SELECT\n e.ECInstanceId,\n e.ParentId,\n e.ModelId,\n e.GroupingNodeIndex,\n IIF(e.ParentId 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\n FROM InstanceElementsWithClassGroupingNodes e\n LEFT JOIN bis.GeometricModel3d m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN bis.SpatialCategory c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n ce.GroupingNodeIndex,\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 ModelsCategoriesElementsHierarchy ce\n JOIN ${hierarchyConfig.elementClassSpecification} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN bis.GeometricModel3d m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN bis.SpatialCategory c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.ModelId, mce.Path, mce.GroupingNodeIndex\n FROM ModelsCategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: \"Indexes\", limit: \"unbounded\" });\n }).pipe(\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n createModelInstanceKeyPaths(modelId, idsCache).pipe(\n map((modelPath) => {\n modelPath.pop(); // model is already included in the element hierarchy path\n const path = [...modelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return path;\n }\n return {\n path,\n options: {\n autoExpand: {\n key: groupingNode.key,\n depth: groupingNode.parentKeys.length,\n },\n },\n };\n }),\n ),\n ),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, groupInfos: ElementsGroupInfo[], separator: string, elementClassName: string) {\n const rowElements: string[] = row[1].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: \"BisCore.SpatialCategory\", id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: \"BisCore.GeometricModel3d\", id: rowElements[i + 1] });\n break;\n }\n }\n return {\n modelId: row[0],\n elementHierarchyPath: path,\n groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,\n };\n}\n\nasync function createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n}: ModelsTreeInstanceKeyPathsFromTargetItemsProps): Promise<HierarchyFilteringPath[]> {\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 ids = {\n models: new Array<Id64String>(),\n categories: new Array<Id64String>(),\n subjects: new Array<Id64String>(),\n elements: new Array<Id64String | ElementsGroupInfo>(),\n };\n await Promise.all(\n targetItems.map(async (key) => {\n if (\"parent\" in key) {\n ids.elements.push(key);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Subject\")) {\n ids.subjects.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Model\")) {\n ids.models.push(key.id);\n } else if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.SpatialCategory\")) {\n ids.categories.push(key.id);\n } else {\n ids.elements.push(key.id);\n }\n }),\n );\n const elementBlocks: Array<Array<Id64String | ElementsGroupInfo>> = [];\n const elementsLength = ids.elements.length;\n const blockSize = Math.ceil(elementsLength / Math.ceil(elementsLength / 5000));\n for (let i = 0; i < ids.elements.length; i += blockSize) {\n elementBlocks.push(ids.elements.slice(i, i + blockSize));\n }\n\n return collect(\n merge(\n from(ids.subjects).pipe(mergeMap((id) => createSubjectInstanceKeysPath(id, idsCache))),\n from(ids.models).pipe(mergeMap((id) => createModelInstanceKeyPaths(id, idsCache))),\n from(ids.categories).pipe(mergeMap((id) => createCategoryInstanceKeyPaths(id, idsCache))),\n from(elementBlocks).pipe(mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block))),\n ),\n );\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: ModelsTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n) {\n const elementLabelSelectClause = await props.labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: \"BisCore.Element\",\n // eslint-disable-next-line @typescript-eslint/unbound-method\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const targetsReader = props.imodelAccess.createQueryReader(\n {\n ecsql: `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.Element e\n WHERE e.ECClassId IS (BisCore.Subject, BisCore.SpatialCategory, ${props.hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.GeometricModel3d m\n JOIN BisCore.Element e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${props.hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${props.hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n AND json_extract(e.JsonProperties, '$.PhysicalPartition.Model.Content') IS NULL\n AND json_extract(e.JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NULL\n )\n WHERE Label LIKE '%' || ? || '%' ESCAPE '\\\\'\n LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}\n `,\n bindings: [{ type: \"string\", value: props.label.replace(/[%_\\\\]/g, \"\\\\$&\") }],\n },\n { rowFormat: \"Indexes\", restartToken: \"tree-widget/models-tree/filter-by-label-query\", limit: props.limit },\n );\n\n const targetKeys = new Array<InstanceKey>();\n for await (const row of targetsReader) {\n targetKeys.push({ className: row[0], id: row[1] });\n }\n\n return createInstanceKeyPathsFromTargetItems({ ...props, targetItems: targetKeys });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/ModelsTreeDefinition.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 { bufferCount, defer, from, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap } from \"rxjs\";\nimport {\n createNodesQueryClauseFactory,\n createPredicateBasedHierarchyDefinition,\n NodeSelectClauseColumnNames,\n ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { collect } from \"../common/Rxjs\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils\";\nimport { releaseMainThreadOnItemsCount } from \"./Utils\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type { Observable } from \"rxjs\";\nimport type {\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n ECSqlQueryRow,\n IInstanceLabelSelectClauseFactory,\n InstanceKey,\n} from \"@itwin/presentation-shared\";\nimport type {\n ClassGroupingNodeKey,\n createIModelHierarchyProvider,\n DefineHierarchyLevelProps,\n DefineInstanceNodeChildHierarchyLevelProps,\n DefineRootHierarchyLevelProps,\n GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache\";\n\n/** @beta */\nexport type ClassGroupingHierarchyNode = GroupingHierarchyNode & { key: ClassGroupingNodeKey };\n\nconst MAX_FILTERING_INSTANCE_KEY_COUNT = 100;\n\n/**\n * Defines hierarchy configuration supported by `ModelsTree`.\n * @beta\n */\nexport interface ModelsTreeHierarchyConfiguration {\n /** Should element nodes be grouped by class. Defaults to `enable`. */\n elementClassGrouping: \"enable\" | \"enableWithCounts\" | \"disable\";\n /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d` */\n elementClassSpecification: string;\n /** Should models without elements be shown. Defaults to `false` */\n showEmptyModels: boolean;\n}\n\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: \"BisCore.GeometricElement3d\",\n showEmptyModels: false,\n};\n\ninterface ModelsTreeDefinitionProps {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n}\n\n/** @beta */\nexport interface ElementsGroupInfo {\n parent:\n | {\n ids: Id64String[];\n type: \"element\";\n }\n | {\n ids: Id64String[];\n modelIds: Id64String[];\n type: \"category\";\n };\n groupingNode: ClassGroupingHierarchyNode;\n}\n\ninterface ModelsTreeInstanceKeyPathsFromTargetItemsProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n targetItems: Array<InstanceKey | ElementsGroupInfo>;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\ninterface ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor;\n idsCache: ModelsTreeIdsCache;\n label: string;\n hierarchyConfig: ModelsTreeHierarchyConfiguration;\n limit?: number | \"unbounded\";\n}\n\nexport type ModelsTreeInstanceKeyPathsProps = ModelsTreeInstanceKeyPathsFromTargetItemsProps | ModelsTreeInstanceKeyPathsFromInstanceLabelProps;\ntype HierarchyProviderProps = Parameters<typeof createIModelHierarchyProvider>[0];\ntype HierarchyFilteringPaths = NonNullable<NonNullable<HierarchyProviderProps[\"filtering\"]>[\"paths\"]>;\ntype HierarchyFilteringPath = HierarchyFilteringPaths[number];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace ModelsTreeInstanceKeyPathsProps {\n export function isLabelProps(props: ModelsTreeInstanceKeyPathsProps): props is ModelsTreeInstanceKeyPathsFromInstanceLabelProps {\n return !!(props as ModelsTreeInstanceKeyPathsFromInstanceLabelProps).label;\n }\n}\n\nexport class ModelsTreeDefinition implements HierarchyDefinition {\n private _impl: HierarchyDefinition;\n private _idsCache: ModelsTreeIdsCache;\n private _hierarchyConfig: ModelsTreeHierarchyConfiguration;\n private _selectQueryFactory: NodesQueryClauseFactory;\n private _nodeLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n private _queryExecutor: LimitingECSqlQueryExecutor;\n private _isSupported?: Promise<boolean>;\n\n public constructor(props: ModelsTreeDefinitionProps) {\n this._impl = createPredicateBasedHierarchyDefinition({\n classHierarchyInspector: props.imodelAccess,\n hierarchy: {\n rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),\n childNodes: [\n {\n parentInstancesNodePredicate: \"BisCore.Subject\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSubjectChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.ISubModeledElement\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createISubModeledElementChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricModel3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricModel3dChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.SpatialCategory\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createSpatialCategoryChildrenQuery(requestProps),\n },\n {\n parentInstancesNodePredicate: \"BisCore.GeometricElement3d\",\n definitions: async (requestProps: DefineInstanceNodeChildHierarchyLevelProps) => this.createGeometricElement3dChildrenQuery(requestProps),\n },\n ],\n },\n });\n this._idsCache = props.idsCache;\n this._queryExecutor = props.imodelAccess;\n this._hierarchyConfig = props.hierarchyConfig;\n this._nodeLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n this._selectQueryFactory = createNodesQueryClauseFactory({\n imodelAccess: props.imodelAccess,\n instanceLabelSelectClauseFactory: this._nodeLabelSelectClauseFactory,\n });\n }\n\n public async postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode> {\n if (ProcessedHierarchyNode.isGroupingNode(node)) {\n return {\n ...node,\n label: this._hierarchyConfig.elementClassGrouping === \"enableWithCounts\" ? `${node.label} (${node.children.length})` : node.label,\n extendedData: {\n ...node.extendedData,\n // add `modelId` and `categoryId` from the first grouped element\n ...node.children[0].extendedData,\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 public async defineHierarchyLevel(props: DefineHierarchyLevelProps) {\n if (this._isSupported === undefined) {\n this._isSupported = this.isSupported();\n }\n\n if ((await this._isSupported) === false) {\n return [];\n }\n\n return this._impl.defineHierarchyLevel(props);\n }\n\n private async createRootHierarchyLevelDefinition(props: DefineRootHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: props.instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.Subject\",\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: \"BisCore.Subject\",\n }),\n },\n extendedData: {\n imageId: \"icon-imodel-hollow-2\",\n isSubject: true,\n },\n autoExpand: true,\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n },\n },\n ];\n }\n\n private async createSubjectChildrenQuery({\n parentNodeInstanceIds: subjectIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const [subjectFilterClauses, modelFilterClauses] = await Promise.all([\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.Subject\", alias: \"this\" },\n }),\n this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: \"BisCore.GeometricModel3d\", alias: \"this\" },\n }),\n ]);\n const [childSubjectIds, childModelIds] = await Promise.all([\n this._idsCache.getChildSubjectIds(subjectIds),\n this._idsCache.getChildSubjectModelIds(subjectIds),\n ]);\n const defs = new Array<HierarchyNodesDefinition>();\n childSubjectIds.length &&\n defs.push({\n fullClassName: \"BisCore.Subject\",\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: \"BisCore.Subject\",\n }),\n },\n hideIfNoChildren: true,\n hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },\n grouping: { byLabel: { action: \"merge\", groupId: \"subject\" } },\n extendedData: {\n imageId: \"icon-folder\",\n isSubject: true,\n },\n supportsFiltering: true,\n })}\n FROM ${subjectFilterClauses.from} this\n ${subjectFilterClauses.joins}\n WHERE\n this.ECInstanceId IN (${childSubjectIds.map(() => \"?\").join(\",\")})\n ${subjectFilterClauses.where ? `AND ${subjectFilterClauses.where}` : \"\"}\n `,\n bindings: [\n { type: \"idset\", value: await this._idsCache.getParentSubjectIds() },\n ...childSubjectIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n ],\n },\n });\n childModelIds.length &&\n defs.push({\n fullClassName: \"BisCore.GeometricModel3d\",\n query: {\n ecsql: `\n SELECT model.ECInstanceId AS ECInstanceId, model.*\n FROM (\n SELECT\n ${await this._selectQueryFactory.createSelectClause({\n ecClassId: { selector: \"m.ECClassId\" },\n ecInstanceId: { selector: \"m.ECInstanceId\" },\n nodeLabel: {\n selector: await this._nodeLabelSelectClauseFactory.createSelectClause({\n classAlias: \"partition\",\n className: \"BisCore.InformationPartitionElement\",\n }),\n },\n hideNodeInHierarchy: {\n selector: `\n CASE\n WHEN (\n json_extract([partition].JsonProperties, '$.PhysicalPartition.Model.Content') IS NOT NULL\n OR json_extract([partition].JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NOT NULL\n ) THEN 1\n ELSE 0\n END\n `,\n },\n hasChildren: this._hierarchyConfig.showEmptyModels\n ? {\n selector: `\n IFNULL((\n SELECT 1\n FROM ${this._hierarchyConfig.elementClassSpecification} e\n WHERE e.Model.Id = m.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n }\n : true,\n extendedData: {\n imageId: \"icon-model\",\n isModel: true,\n },\n supportsFiltering: true,\n })}\n FROM Bis.GeometricModel3d m\n JOIN bis.InformationPartitionElement [partition] ON [partition].ECInstanceId = m.ModeledElement.Id\n WHERE\n m.ECInstanceId IN (${childModelIds.map(() => \"?\").join(\",\")})\n ) model\n JOIN ${modelFilterClauses.from} this ON this.ECInstanceId = model.ECInstanceId\n ${modelFilterClauses.joins}\n ${modelFilterClauses.where ? `AND (model.${NodeSelectClauseColumnNames.HideNodeInHierarchy} OR ${modelFilterClauses.where})` : \"\"}\n `,\n bindings: childModelIds.map((id): ECSqlBinding => ({ type: \"id\", value: id })),\n },\n });\n return defs;\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: \"BisCore.GeometricModel3d\",\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 })}\n FROM BisCore.GeometricModel3d 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._hierarchyConfig.elementClassSpecification})\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: \"BisCore.SpatialCategory\", alias: \"this\" },\n });\n return [\n {\n fullClassName: \"BisCore.SpatialCategory\",\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: \"BisCore.SpatialCategory\",\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 },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n EXISTS (\n SELECT 1\n FROM ${this._hierarchyConfig.elementClassSpecification} element\n WHERE\n element.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND element.Category.Id = +this.ECInstanceId\n AND element.Parent.Id IS NULL\n )\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: modelIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n private async createSpatialCategoryChildrenQuery({\n parentNodeInstanceIds: categoryIds,\n parentNode,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const modelIds = parseIdsSelectorResult(parentNode.extendedData?.modelIds);\n if (modelIds.length === 0) {\n throw new Error(`Invalid category node \"${parentNode.label}\" - missing model information.`);\n }\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this._hierarchyConfig.elementClassSpecification,\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._hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this._hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Category.Id IN (${categoryIds.map(() => \"?\").join(\",\")})\n AND this.Model.Id IN (${modelIds.map(() => \"?\").join(\",\")})\n AND this.Parent.Id IS NULL\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: [...categoryIds.map((id) => ({ type: \"id\", value: id })), ...modelIds.map((id) => ({ type: \"id\", value: id }))] as ECSqlBinding[],\n },\n },\n ];\n }\n\n private async createGeometricElement3dChildrenQuery({\n parentNodeInstanceIds: elementIds,\n instanceFilter,\n }: DefineInstanceNodeChildHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({\n filter: instanceFilter,\n contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: \"this\" },\n });\n return [\n {\n fullClassName: this._hierarchyConfig.elementClassSpecification,\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._hierarchyConfig.elementClassSpecification,\n }),\n },\n grouping: {\n byClass: this._hierarchyConfig.elementClassGrouping !== \"disable\",\n },\n hasChildren: {\n selector: `\n IFNULL((\n SELECT 1\n FROM (\n SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}\n UNION ALL\n SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d\n )\n WHERE ParentId = this.ECInstanceId\n LIMIT 1\n ), 0)\n `,\n },\n extendedData: {\n modelId: { selector: \"IdToHex(this.Model.Id)\" },\n categoryId: { selector: \"IdToHex(this.Category.Id)\" },\n imageId: \"icon-item\",\n },\n supportsFiltering: true,\n })}\n FROM ${instanceFilterClauses.from} this\n ${instanceFilterClauses.joins}\n WHERE\n this.Parent.Id IN (${elementIds.map(() => \"?\").join(\",\")})\n ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : \"\"}\n `,\n bindings: elementIds.map((id) => ({ type: \"id\", value: id })),\n },\n },\n ];\n }\n\n public static async createInstanceKeyPaths(props: ModelsTreeInstanceKeyPathsProps) {\n if (ModelsTreeInstanceKeyPathsProps.isLabelProps(props)) {\n const labelsFactory = createBisInstanceLabelSelectClauseFactory({ classHierarchyInspector: props.imodelAccess });\n return createInstanceKeyPathsFromInstanceLabel({ ...props, labelsFactory });\n }\n return createInstanceKeyPathsFromTargetItems(props);\n }\n\n private async isSupported() {\n const [schemaName, className] = this._hierarchyConfig.elementClassSpecification.split(/[\\.:]/);\n if (!schemaName || !className) {\n throw new Error(\n `Provided class specification ${this._hierarchyConfig.elementClassSpecification} should be in format {SchemaName}:{ClassName} or {SchemaName}.{ClassName}`,\n );\n }\n\n const query: ECSqlQueryDef = {\n ecsql: `\n SELECT 1\n FROM ECDbMeta.ECSchemaDef s\n JOIN ECDbMeta.ECClassDef c ON c.Schema.Id = s.ECInstanceId\n WHERE s.Name = ? AND c.Name = ? AND c.ECInstanceId IS (BisCore.GeometricElement3d)\n `,\n bindings: [\n { type: \"string\", value: schemaName },\n { type: \"string\", value: className },\n ],\n };\n\n for await (const _row of this._queryExecutor.createQueryReader(query)) {\n return true;\n }\n return false;\n }\n}\n\nfunction createGeometricElementInstanceKeyPaths(\n imodelAccess: ECClassHierarchyInspector & LimitingECSqlQueryExecutor,\n idsCache: ModelsTreeIdsCache,\n hierarchyConfig: ModelsTreeHierarchyConfiguration,\n targetItems: Array<Id64String | ElementsGroupInfo>,\n): Observable<HierarchyFilteringPath> {\n const elementIds = targetItems.filter((info): info is Id64String => typeof info === \"string\");\n const groupInfos = targetItems.filter((info): info is ElementsGroupInfo => typeof info !== \"string\");\n const separator = \";\";\n\n return defer(() => {\n const targetElementsInfoQuery =\n elementIds.length > 0\n ? `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, -1\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE e.ECInstanceId IN (${elementIds.join(\",\")})\n `\n : undefined;\n\n const targetGroupingNodesElementInfoQueries = groupInfos.map(\n ({ parent, groupingNode }, index) => `\n SELECT e.ECInstanceId, e.ECClassId, e.Parent.Id, e.Model.Id, e.Category.Id, ${index}\n FROM ${hierarchyConfig.elementClassSpecification} e\n WHERE\n e.ECClassId IS (${groupingNode.key.className})\n AND ${parent.type === \"element\" ? `e.Parent.Id IN (${parent.ids.join(\",\")})` : `e.Parent.Id IS NULL AND e.Category.Id IN (${parent.ids.join(\",\")}) AND e.Model.Id IN (${parent.modelIds.join(\",\")})`}\n `,\n );\n\n const ctes = [\n `InstanceElementsWithClassGroupingNodes(ECInstanceId, ECClassId, ParentId, ModelId, CategoryId, GroupingNodeIndex) AS (\n ${[...(targetElementsInfoQuery ? [targetElementsInfoQuery] : []), ...targetGroupingNodesElementInfoQueries].join(\" UNION ALL \")}\n )`,\n `ModelsCategoriesElementsHierarchy(ECInstanceId, ParentId, ModelId, GroupingNodeIndex, Path) AS (\n SELECT\n e.ECInstanceId,\n e.ParentId,\n e.ModelId,\n e.GroupingNodeIndex,\n IIF(e.ParentId 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\n FROM InstanceElementsWithClassGroupingNodes e\n LEFT JOIN bis.GeometricModel3d m ON (e.ParentId IS NULL AND m.ECInstanceId = e.ModelId)\n LEFT JOIN bis.SpatialCategory c ON (e.ParentId IS NULL AND c.ECInstanceId = e.CategoryId)\n\n UNION ALL\n\n SELECT\n pe.ECInstanceId,\n pe.Parent.Id,\n pe.Model.Id,\n ce.GroupingNodeIndex,\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 ModelsCategoriesElementsHierarchy ce\n JOIN ${hierarchyConfig.elementClassSpecification} pe ON (pe.ECInstanceId = ce.ParentId OR pe.ECInstanceId = ce.ModelId AND ce.ParentId IS NULL)\n LEFT JOIN bis.GeometricModel3d m ON (pe.Parent.Id IS NULL AND m.ECInstanceId = pe.Model.Id)\n LEFT JOIN bis.SpatialCategory c ON (pe.Parent.Id IS NULL AND c.ECInstanceId = pe.Category.Id)\n )`,\n ];\n const ecsql = `\n SELECT mce.ModelId, mce.Path, mce.GroupingNodeIndex\n FROM ModelsCategoriesElementsHierarchy mce\n WHERE mce.ParentId IS NULL\n `;\n\n return imodelAccess.createQueryReader({ ctes, ecsql }, { rowFormat: \"Indexes\", limit: \"unbounded\" });\n }).pipe(\n releaseMainThreadOnItemsCount(300),\n map((row) => parseQueryRow(row, groupInfos, separator, hierarchyConfig.elementClassSpecification)),\n mergeMap(({ modelId, elementHierarchyPath, groupingNode }) =>\n from(idsCache.createModelInstanceKeyPaths(modelId)).pipe(\n mergeAll(),\n map((modelPath) => {\n // We dont want to modify the original path, we create a copy that we can modify\n const newModelPath = [...modelPath];\n newModelPath.pop(); // model is already included in the element hierarchy path\n const path = [...newModelPath, ...elementHierarchyPath];\n if (!groupingNode) {\n return path;\n }\n return {\n path,\n options: {\n autoExpand: {\n key: groupingNode.key,\n depth: groupingNode.parentKeys.length,\n },\n },\n };\n }),\n ),\n ),\n );\n}\n\nfunction parseQueryRow(row: ECSqlQueryRow, groupInfos: ElementsGroupInfo[], separator: string, elementClassName: string) {\n const rowElements: string[] = row[1].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: \"BisCore.SpatialCategory\", id: rowElements[i + 1] });\n break;\n case \"m\":\n path.push({ className: \"BisCore.GeometricModel3d\", id: rowElements[i + 1] });\n break;\n }\n }\n return {\n modelId: row[0],\n elementHierarchyPath: path,\n groupingNode: row[2] === -1 ? undefined : groupInfos[row[2]].groupingNode,\n };\n}\n\nasync function createInstanceKeyPathsFromTargetItems({\n targetItems,\n imodelAccess,\n hierarchyConfig,\n idsCache,\n limit,\n}: ModelsTreeInstanceKeyPathsFromTargetItemsProps): Promise<HierarchyFilteringPath[]> {\n if (limit !== \"unbounded\" && targetItems.length > (limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT)) {\n throw new FilterLimitExceededError(limit ?? MAX_FILTERING_INSTANCE_KEY_COUNT);\n }\n\n return lastValueFrom(\n from(targetItems).pipe(\n releaseMainThreadOnItemsCount(2000),\n mergeMap(async (key): Promise<{ key: string; type: number } | { key: ElementsGroupInfo; type: 0 }> => {\n if (\"parent\" in key) {\n return { key, type: 0 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Subject\")) {\n return { key: key.id, type: 1 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.Model\")) {\n return { key: key.id, type: 2 };\n }\n\n if (await imodelAccess.classDerivesFrom(key.className, \"BisCore.SpatialCategory\")) {\n return { key: key.id, type: 3 };\n }\n\n return { key: key.id, type: 0 };\n }, 2),\n reduce(\n (acc, value) => {\n if (value.type === 1) {\n acc.subjects.push(value.key);\n return acc;\n }\n if (value.type === 2) {\n acc.models.push(value.key);\n return acc;\n }\n if (value.type === 3) {\n acc.categories.push(value.key);\n return acc;\n }\n acc.elements.push(value.key);\n return acc;\n },\n {\n models: new Array<Id64String>(),\n categories: new Array<Id64String>(),\n subjects: new Array<Id64String>(),\n elements: new Array<Id64String | ElementsGroupInfo>(),\n },\n ),\n switchMap(async (ids) => {\n const elementsLength = ids.elements.length;\n return collect(\n merge(\n from(ids.subjects).pipe(mergeMap((id) => from(idsCache.createSubjectInstanceKeysPath(id)))),\n from(ids.models).pipe(mergeMap((id) => from(idsCache.createModelInstanceKeyPaths(id)).pipe(mergeAll()))),\n from(ids.categories).pipe(mergeMap((id) => from(idsCache.createCategoryInstanceKeyPaths(id)).pipe(mergeAll()))),\n from(ids.elements).pipe(\n bufferCount(Math.ceil(elementsLength / Math.ceil(elementsLength / 5000))),\n releaseMainThreadOnItemsCount(1),\n mergeMap((block) => createGeometricElementInstanceKeyPaths(imodelAccess, idsCache, hierarchyConfig, block), 10),\n ),\n ),\n );\n }),\n ),\n );\n}\n\nasync function createInstanceKeyPathsFromInstanceLabel(\n props: ModelsTreeInstanceKeyPathsFromInstanceLabelProps & { labelsFactory: IInstanceLabelSelectClauseFactory },\n) {\n const elementLabelSelectClause = await props.labelsFactory.createSelectClause({\n classAlias: \"e\",\n className: \"BisCore.Element\",\n // eslint-disable-next-line @typescript-eslint/unbound-method\n selectorsConcatenator: ECSql.createConcatenatedValueStringSelector,\n });\n const targetsReader = props.imodelAccess.createQueryReader(\n {\n ecsql: `\n SELECT *\n FROM (\n SELECT\n ec_classname(e.ECClassId, 's.c'),\n e.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.Element e\n WHERE e.ECClassId IS (BisCore.Subject, BisCore.SpatialCategory, ${props.hierarchyConfig.elementClassSpecification})\n\n UNION ALL\n\n SELECT\n ec_classname(m.ECClassId, 's.c'),\n m.ECInstanceId,\n ${elementLabelSelectClause} Label\n FROM BisCore.GeometricModel3d m\n JOIN BisCore.Element e ON e.ECInstanceId = m.ModeledElement.Id\n WHERE NOT m.IsPrivate\n ${props.hierarchyConfig.showEmptyModels ? \"\" : `AND EXISTS (SELECT 1 FROM ${props.hierarchyConfig.elementClassSpecification} WHERE Model.Id = m.ECInstanceId)`}\n AND json_extract(e.JsonProperties, '$.PhysicalPartition.Model.Content') IS NULL\n AND json_extract(e.JsonProperties, '$.GraphicalPartition3d.Model.Content') IS NULL\n )\n WHERE Label LIKE '%' || ? || '%' ESCAPE '\\\\'\n LIMIT ${MAX_FILTERING_INSTANCE_KEY_COUNT + 1}\n `,\n bindings: [{ type: \"string\", value: props.label.replace(/[%_\\\\]/g, \"\\\\$&\") }],\n },\n { rowFormat: \"Indexes\", restartToken: \"tree-widget/models-tree/filter-by-label-query\", limit: props.limit },\n );\n\n const targetKeys = new Array<InstanceKey>();\n for await (const row of targetsReader) {\n targetKeys.push({ className: row[0], id: row[1] });\n }\n\n return createInstanceKeyPathsFromTargetItems({ ...props, targetItems: targetKeys });\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Observable } from "rxjs";
|
|
2
|
+
/**
|
|
3
|
+
* Checks if all given models are displayed in given viewport.
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export declare function releaseMainThreadOnItemsCount<T>(elementCount: number): (obs: Observable<T>) => Observable<T>;
|
|
7
|
+
//# sourceMappingURL=Utils.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.releaseMainThreadOnItemsCount = void 0;
|
|
8
|
+
const rxjs_1 = require("rxjs");
|
|
9
|
+
/**
|
|
10
|
+
* Checks if all given models are displayed in given viewport.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
function releaseMainThreadOnItemsCount(elementCount) {
|
|
14
|
+
return (obs) => {
|
|
15
|
+
return obs.pipe((0, rxjs_1.bufferCount)(elementCount), (0, rxjs_1.concatMap)((buff, i) => {
|
|
16
|
+
const out = (0, rxjs_1.of)(buff);
|
|
17
|
+
if (i === 0 && buff.length < elementCount) {
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
return out.pipe((0, rxjs_1.delay)(0));
|
|
21
|
+
}), (0, rxjs_1.concatAll)());
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
exports.releaseMainThreadOnItemsCount = releaseMainThreadOnItemsCount;
|
|
25
|
+
//# sourceMappingURL=Utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../../src/components/trees/models-tree/Utils.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,+BAAoE;AAIpE;;;GAGG;AACH,SAAgB,6BAA6B,CAAI,YAAoB;IACnE,OAAO,CAAC,GAAkB,EAAiB,EAAE;QAC3C,OAAO,GAAG,CAAC,IAAI,CACb,IAAA,kBAAW,EAAC,YAAY,CAAC,EACzB,IAAA,gBAAS,EAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,IAAA,SAAE,EAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE;gBACzC,OAAO,GAAG,CAAC;aACZ;YACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAA,YAAK,EAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,EACF,IAAA,gBAAS,GAAE,CACZ,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAdD,sEAcC","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 { bufferCount, concatAll, concatMap, delay, of } from \"rxjs\";\n\nimport type { Observable } from \"rxjs\";\n\n/**\n * Checks if all given models are displayed in given viewport.\n * @internal\n */\nexport function releaseMainThreadOnItemsCount<T>(elementCount: number) {\n return (obs: Observable<T>): Observable<T> => {\n return obs.pipe(\n bufferCount(elementCount),\n concatMap((buff, i) => {\n const out = of(buff);\n if (i === 0 && buff.length < elementCount) {\n return out;\n }\n return out.pipe(delay(0));\n }),\n concatAll(),\n );\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ModelsTreeDefinition } from "../ModelsTreeDefinition";
|
|
2
2
|
import type { Id64Array, Id64String } from "@itwin/core-bentley";
|
|
3
|
-
import type { LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
|
|
3
|
+
import type { HierarchyNodeIdentifiersPath, LimitingECSqlQueryExecutor } from "@itwin/presentation-hierarchies";
|
|
4
4
|
type ModelsTreeHierarchyConfiguration = ConstructorParameters<typeof ModelsTreeDefinition>[0]["hierarchyConfig"];
|
|
5
5
|
/** @internal */
|
|
6
6
|
export declare class ModelsTreeIdsCache {
|
|
@@ -10,6 +10,9 @@ export declare class ModelsTreeIdsCache {
|
|
|
10
10
|
private _subjectInfos;
|
|
11
11
|
private _parentSubjectIds;
|
|
12
12
|
private _modelInfos;
|
|
13
|
+
private _modelKeyPaths;
|
|
14
|
+
private _subjectKeyPaths;
|
|
15
|
+
private _categoryKeyPaths;
|
|
13
16
|
constructor(_queryExecutor: LimitingECSqlQueryExecutor, _hierarchyConfig: ModelsTreeHierarchyConfiguration);
|
|
14
17
|
[Symbol.dispose](): void;
|
|
15
18
|
private querySubjects;
|
|
@@ -26,20 +29,16 @@ export declare class ModelsTreeIdsCache {
|
|
|
26
29
|
getSubjectModelIds(subjectIds: Id64Array): Promise<Id64Array>;
|
|
27
30
|
/** Returns ECInstanceIDs of Models under specific parent Subjects as they are displayed in the hierarchy. */
|
|
28
31
|
getChildSubjectModelIds(parentSubjectIds: Id64String[]): Promise<Id64String[]>;
|
|
29
|
-
|
|
30
|
-
* Returns a list of Subject ancestor ECInstanceIds from root to target Subject as displayed in the
|
|
31
|
-
* hierarchy - taking into account `hideInHierarchy` flag.
|
|
32
|
-
*/
|
|
33
|
-
getSubjectAncestorsPath(targetSubjectId: Id64String): Promise<Id64Array>;
|
|
32
|
+
createSubjectInstanceKeysPath(targetSubjectId: Id64String): Promise<HierarchyNodeIdentifiersPath>;
|
|
34
33
|
private queryModelElementCounts;
|
|
35
34
|
private queryModelCategories;
|
|
36
35
|
private getModelInfos;
|
|
37
36
|
getModelCategories(modelId: Id64String): Promise<Id64Array>;
|
|
38
37
|
getModelElementCount(modelId: Id64String): Promise<number>;
|
|
39
|
-
|
|
38
|
+
createModelInstanceKeyPaths(modelId: Id64String): Promise<HierarchyNodeIdentifiersPath[]>;
|
|
40
39
|
private queryCategoryElementCounts;
|
|
41
40
|
getCategoryElementsCount(modelId: Id64String, categoryId: Id64String): Promise<number>;
|
|
42
|
-
|
|
41
|
+
createCategoryInstanceKeyPaths(categoryId: Id64String): Promise<HierarchyNodeIdentifiersPath[]>;
|
|
43
42
|
}
|
|
44
43
|
export {};
|
|
45
44
|
//# sourceMappingURL=ModelsTreeIdsCache.d.ts.map
|
|
@@ -14,6 +14,9 @@ class ModelsTreeIdsCache {
|
|
|
14
14
|
this._queryExecutor = _queryExecutor;
|
|
15
15
|
this._hierarchyConfig = _hierarchyConfig;
|
|
16
16
|
this._categoryElementCounts = new ModelCategoryElementsCountCache(async (input) => this.queryCategoryElementCounts(input));
|
|
17
|
+
this._modelKeyPaths = new Map();
|
|
18
|
+
this._subjectKeyPaths = new Map();
|
|
19
|
+
this._categoryKeyPaths = new Map();
|
|
17
20
|
}
|
|
18
21
|
[Symbol.dispose]() {
|
|
19
22
|
this._categoryElementCounts[Symbol.dispose]();
|
|
@@ -177,22 +180,25 @@ class ModelsTreeIdsCache {
|
|
|
177
180
|
});
|
|
178
181
|
return modelIds;
|
|
179
182
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
183
|
+
async createSubjectInstanceKeysPath(targetSubjectId) {
|
|
184
|
+
let entry = this._subjectKeyPaths.get(targetSubjectId);
|
|
185
|
+
if (!entry) {
|
|
186
|
+
entry = (async () => {
|
|
187
|
+
const subjectInfos = await this.getSubjectInfos();
|
|
188
|
+
const result = new Array();
|
|
189
|
+
let currParentId = targetSubjectId;
|
|
190
|
+
while (currParentId) {
|
|
191
|
+
const parentInfo = subjectInfos.get(currParentId);
|
|
192
|
+
if (!parentInfo?.hideInHierarchy) {
|
|
193
|
+
result.push({ className: "BisCore.Subject", id: currParentId });
|
|
194
|
+
}
|
|
195
|
+
currParentId = parentInfo?.parentSubject;
|
|
196
|
+
}
|
|
197
|
+
return result.reverse();
|
|
198
|
+
})();
|
|
199
|
+
this._subjectKeyPaths.set(targetSubjectId, entry);
|
|
194
200
|
}
|
|
195
|
-
return
|
|
201
|
+
return entry;
|
|
196
202
|
}
|
|
197
203
|
async *queryModelElementCounts() {
|
|
198
204
|
const query = /* sql */ `
|
|
@@ -255,15 +261,23 @@ class ModelsTreeIdsCache {
|
|
|
255
261
|
const modelInfos = await this.getModelInfos();
|
|
256
262
|
return modelInfos.get(modelId)?.elementCount ?? 0;
|
|
257
263
|
}
|
|
258
|
-
async
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
264
|
+
async createModelInstanceKeyPaths(modelId) {
|
|
265
|
+
let entry = this._modelKeyPaths.get(modelId);
|
|
266
|
+
if (!entry) {
|
|
267
|
+
entry = (async () => {
|
|
268
|
+
const result = new Array();
|
|
269
|
+
const subjectInfos = (await this.getSubjectInfos()).entries();
|
|
270
|
+
for (const [modelSubjectId, subjectInfo] of subjectInfos) {
|
|
271
|
+
if (subjectInfo.childModels.has(modelId)) {
|
|
272
|
+
const subjectPath = await this.createSubjectInstanceKeysPath(modelSubjectId);
|
|
273
|
+
result.push([...subjectPath, { className: "BisCore.GeometricModel3d", id: modelId }]);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return result;
|
|
277
|
+
})();
|
|
278
|
+
this._modelKeyPaths.set(modelId, entry);
|
|
279
|
+
}
|
|
280
|
+
return entry;
|
|
267
281
|
}
|
|
268
282
|
async queryCategoryElementCounts(input) {
|
|
269
283
|
const reader = this._queryExecutor.createQueryReader({
|
|
@@ -301,15 +315,29 @@ class ModelsTreeIdsCache {
|
|
|
301
315
|
async getCategoryElementsCount(modelId, categoryId) {
|
|
302
316
|
return this._categoryElementCounts.getCategoryElementsCount(modelId, categoryId);
|
|
303
317
|
}
|
|
304
|
-
async
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
318
|
+
async createCategoryInstanceKeyPaths(categoryId) {
|
|
319
|
+
let entry = this._categoryKeyPaths.get(categoryId);
|
|
320
|
+
if (!entry) {
|
|
321
|
+
entry = (async () => {
|
|
322
|
+
const result = new Set();
|
|
323
|
+
const modelInfos = await this.getModelInfos();
|
|
324
|
+
modelInfos?.forEach((modelInfo, modelId) => {
|
|
325
|
+
if (modelInfo.categories.has(categoryId)) {
|
|
326
|
+
result.add(modelId);
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
const categoryPaths = new Array();
|
|
330
|
+
for (const categoryModelId of [...result]) {
|
|
331
|
+
const modelPaths = await this.createModelInstanceKeyPaths(categoryModelId);
|
|
332
|
+
for (const modelPath of modelPaths) {
|
|
333
|
+
categoryPaths.push([...modelPath, { className: "BisCore.SpatialCategory", id: categoryId }]);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return categoryPaths;
|
|
337
|
+
})();
|
|
338
|
+
this._categoryKeyPaths.set(categoryId, entry);
|
|
339
|
+
}
|
|
340
|
+
return entry;
|
|
313
341
|
}
|
|
314
342
|
}
|
|
315
343
|
exports.ModelsTreeIdsCache = ModelsTreeIdsCache;
|