@itwin/tree-widget-react 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +23 -2
  2. package/README.md +2 -1
  3. package/lib/cjs/tree-widget-react/TreeWidget.js +2 -2
  4. package/lib/cjs/tree-widget-react/TreeWidget.js.map +1 -1
  5. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +1 -1
  6. package/lib/cjs/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  7. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -1
  8. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +12 -8
  9. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  10. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  11. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  12. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +12 -1
  13. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +14 -44
  14. package/lib/cjs/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  15. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +5 -3
  16. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +26 -60
  17. package/lib/cjs/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  18. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +22 -9
  19. package/lib/cjs/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  20. package/lib/esm/tree-widget-react/TreeWidget.js +1 -1
  21. package/lib/esm/tree-widget-react/TreeWidget.js.map +1 -1
  22. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js +1 -1
  23. package/lib/esm/tree-widget-react/components/trees/categories-tree/internal/CategoriesTreeIdsCache.js.map +1 -1
  24. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.d.ts +3 -1
  25. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js +13 -9
  26. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTree.js.map +1 -1
  27. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.d.ts +1 -1
  28. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeComponent.js.map +1 -1
  29. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.d.ts +12 -1
  30. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js +14 -44
  31. package/lib/esm/tree-widget-react/components/trees/imodel-content-tree/IModelContentTreeDefinition.js.map +1 -1
  32. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.d.ts +5 -3
  33. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js +27 -61
  34. package/lib/esm/tree-widget-react/components/trees/models-tree/ModelsTreeDefinition.js.map +1 -1
  35. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js +22 -9
  36. package/lib/esm/tree-widget-react/components/trees/models-tree/internal/ModelsTreeIdsCache.js.map +1 -1
  37. package/package.json +3 -4
@@ -14,11 +14,14 @@ export type ClassGroupingHierarchyNode = GroupingHierarchyNode & {
14
14
  export interface ModelsTreeHierarchyConfiguration {
15
15
  /** Should element nodes be grouped by class. Defaults to `enable`. */
16
16
  elementClassGrouping: "enable" | "enableWithCounts" | "disable";
17
- /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d` */
17
+ /** Full class name of a `GeometricElement3d` sub-class that should be used to load element nodes. Defaults to `BisCore.GeometricElement3d`. */
18
18
  elementClassSpecification: string;
19
- /** Should models without elements be shown. Defaults to `false` */
19
+ /** Should models without elements be shown. Defaults to `false`. */
20
20
  showEmptyModels: boolean;
21
+ /** Should the root Subject node be hidden. Defaults to `false`. */
22
+ hideRootSubject: boolean;
21
23
  }
24
+ /** @internal */
22
25
  export declare const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration;
23
26
  interface ModelsTreeDefinitionProps {
24
27
  imodelAccess: ECSchemaProvider & ECClassHierarchyInspector & LimitingECSqlQueryExecutor;
@@ -66,7 +69,6 @@ export declare class ModelsTreeDefinition implements HierarchyDefinition {
66
69
  constructor(props: ModelsTreeDefinitionProps);
67
70
  postProcessNode(node: ProcessedHierarchyNode): Promise<ProcessedHierarchyNode>;
68
71
  defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition>;
69
- private createRootHierarchyLevelDefinition;
70
72
  private createSubjectChildrenQuery;
71
73
  private createISubModeledElementChildrenQuery;
72
74
  private createGeometricModel3dChildrenQuery;
@@ -2,7 +2,8 @@
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, defer, from, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap } from "rxjs";
5
+ import { bufferCount, defer, firstValueFrom, from, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap } from "rxjs";
6
+ import { IModel } from "@itwin/core-common";
6
7
  import { createNodesQueryClauseFactory, createPredicateBasedHierarchyDefinition, NodeSelectClauseColumnNames, ProcessedHierarchyNode, } from "@itwin/presentation-hierarchies";
7
8
  import { createBisInstanceLabelSelectClauseFactory, ECSql } from "@itwin/presentation-shared";
8
9
  import { collect } from "../common/Rxjs.js";
@@ -10,10 +11,12 @@ import { FilterLimitExceededError } from "../common/TreeErrors.js";
10
11
  import { createIdsSelector, parseIdsSelectorResult } from "../common/Utils.js";
11
12
  import { releaseMainThreadOnItemsCount } from "./Utils.js";
12
13
  const MAX_FILTERING_INSTANCE_KEY_COUNT = 100;
14
+ /** @internal */
13
15
  export const defaultHierarchyConfiguration = {
14
16
  elementClassGrouping: "enable",
15
17
  elementClassSpecification: "BisCore.GeometricElement3d",
16
18
  showEmptyModels: false,
19
+ hideRootSubject: false,
17
20
  };
18
21
  // eslint-disable-next-line @typescript-eslint/no-redeclare
19
22
  export var ModelsTreeInstanceKeyPathsProps;
@@ -28,7 +31,7 @@ export class ModelsTreeDefinition {
28
31
  this._impl = createPredicateBasedHierarchyDefinition({
29
32
  classHierarchyInspector: props.imodelAccess,
30
33
  hierarchy: {
31
- rootNodes: async (requestProps) => this.createRootHierarchyLevelDefinition(requestProps),
34
+ rootNodes: async (requestProps) => this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this._hierarchyConfig.hideRootSubject ? [IModel.rootSubjectId] : [] }),
32
35
  childNodes: [
33
36
  {
34
37
  parentInstancesNodePredicate: "BisCore.Subject",
@@ -88,44 +91,7 @@ export class ModelsTreeDefinition {
88
91
  }
89
92
  return this._impl.defineHierarchyLevel(props);
90
93
  }
91
- async createRootHierarchyLevelDefinition(props) {
92
- const instanceFilterClauses = await this._selectQueryFactory.createFilterClauses({
93
- filter: props.instanceFilter,
94
- contentClass: { fullName: "BisCore.Subject", alias: "this" },
95
- });
96
- return [
97
- {
98
- fullClassName: "BisCore.Subject",
99
- query: {
100
- ecsql: `
101
- SELECT
102
- ${await this._selectQueryFactory.createSelectClause({
103
- ecClassId: { selector: ECSql.createRawPropertyValueSelector("this", "ECClassId") },
104
- ecInstanceId: { selector: "this.ECInstanceId" },
105
- nodeLabel: {
106
- selector: await this._nodeLabelSelectClauseFactory.createSelectClause({
107
- classAlias: "this",
108
- className: "BisCore.Subject",
109
- }),
110
- },
111
- extendedData: {
112
- imageId: "icon-imodel-hollow-2",
113
- isSubject: true,
114
- },
115
- autoExpand: true,
116
- supportsFiltering: true,
117
- })}
118
- FROM ${instanceFilterClauses.from} this
119
- ${instanceFilterClauses.joins}
120
- WHERE
121
- this.Parent.Id IS NULL
122
- ${instanceFilterClauses.where ? `AND ${instanceFilterClauses.where}` : ""}
123
- `,
124
- },
125
- },
126
- ];
127
- }
128
- async createSubjectChildrenQuery({ parentNodeInstanceIds: subjectIds, instanceFilter, }) {
94
+ async createSubjectChildrenQuery({ parentNodeInstanceIds: parentSubjectIds, instanceFilter, }) {
129
95
  const [subjectFilterClauses, modelFilterClauses] = await Promise.all([
130
96
  this._selectQueryFactory.createFilterClauses({
131
97
  filter: instanceFilter,
@@ -136,10 +102,9 @@ export class ModelsTreeDefinition {
136
102
  contentClass: { fullName: "BisCore.GeometricModel3d", alias: "this" },
137
103
  }),
138
104
  ]);
139
- const [childSubjectIds, childModelIds] = await Promise.all([
140
- this._idsCache.getChildSubjectIds(subjectIds),
141
- this._idsCache.getChildSubjectModelIds(subjectIds),
142
- ]);
105
+ const [childSubjectIds, childModelIds] = parentSubjectIds.length
106
+ ? await Promise.all([this._idsCache.getChildSubjectIds(parentSubjectIds), this._idsCache.getChildSubjectModelIds(parentSubjectIds)])
107
+ : [[IModel.rootSubjectId], []];
143
108
  const defs = new Array();
144
109
  childSubjectIds.length &&
145
110
  defs.push({
@@ -160,9 +125,10 @@ export class ModelsTreeDefinition {
160
125
  hasChildren: { selector: `InVirtualSet(?, this.ECInstanceId)` },
161
126
  grouping: { byLabel: { action: "merge", groupId: "subject" } },
162
127
  extendedData: {
163
- imageId: "icon-folder",
128
+ imageId: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, 'icon-imodel-hollow-2', 'icon-folder')` },
164
129
  isSubject: true,
165
130
  },
131
+ autoExpand: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, true, false)` },
166
132
  supportsFiltering: true,
167
133
  })}
168
134
  FROM ${subjectFilterClauses.from} this
@@ -319,6 +285,9 @@ export class ModelsTreeDefinition {
319
285
  filter: instanceFilter,
320
286
  contentClass: { fullName: this._hierarchyConfig.elementClassSpecification, alias: "this" },
321
287
  });
288
+ const modeledElements = await firstValueFrom(from(modelIds).pipe(mergeMap(async (modelId) => this._idsCache.getCategoriesModeledElements(modelId, categoryIds)), reduce((acc, foundModeledElements) => {
289
+ return acc.concat(foundModeledElements);
290
+ }, new Array())));
322
291
  return [
323
292
  {
324
293
  fullClassName: this._hierarchyConfig.elementClassSpecification,
@@ -339,16 +308,16 @@ export class ModelsTreeDefinition {
339
308
  },
340
309
  hasChildren: {
341
310
  selector: `
342
- IFNULL((
343
- SELECT 1
344
- FROM (
345
- SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}
346
- UNION ALL
347
- SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
348
- )
349
- WHERE ParentId = this.ECInstanceId
350
- LIMIT 1
351
- ), 0)
311
+ IIF(
312
+ ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(",")})` : `FALSE`},
313
+ 1,
314
+ IFNULL((
315
+ SELECT 1
316
+ FROM ${this._hierarchyConfig.elementClassSpecification} ce
317
+ WHERE ce.Parent.Id = this.ECInstanceId
318
+ LIMIT 1
319
+ ), 0)
320
+ )
352
321
  `,
353
322
  },
354
323
  extendedData: {
@@ -398,12 +367,9 @@ export class ModelsTreeDefinition {
398
367
  selector: `
399
368
  IFNULL((
400
369
  SELECT 1
401
- FROM (
402
- SELECT Parent.Id ParentId FROM ${this._hierarchyConfig.elementClassSpecification}
403
- UNION ALL
404
- SELECT ModeledElement.Id ParentId FROM bis.GeometricModel3d
405
- )
406
- WHERE ParentId = this.ECInstanceId
370
+ FROM ${this._hierarchyConfig.elementClassSpecification} ce
371
+ JOIN BisCore.Model m ON ce.Model.Id = m.ECInstanceId
372
+ WHERE ce.Parent.Id = this.ECInstanceId OR (ce.Model.Id = this.ECInstanceId AND m.IsPrivate = false)
407
373
  LIMIT 1
408
374
  ), 0)
409
375
  `,
@@ -1 +1 @@
1
- {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/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, createPredicateBasedHierarchyDefinition, NodeSelectClauseColumnNames, ProcessedHierarchyNode,\n} from \"@itwin/presentation-hierarchies\";\nimport { createBisInstanceLabelSelectClauseFactory, ECSql } from \"@itwin/presentation-shared\";\nimport { collect } from \"../common/Rxjs.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils.js\";\nimport { releaseMainThreadOnItemsCount } from \"./Utils.js\";\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.js\";\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"]}
1
+ {"version":3,"file":"ModelsTreeDefinition.js","sourceRoot":"","sources":["../../../../../../src/tree-widget-react/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, firstValueFrom, from, lastValueFrom, map, merge, mergeAll, mergeMap, reduce, switchMap } from \"rxjs\";\nimport { IModel } from \"@itwin/core-common\";\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.js\";\nimport { FilterLimitExceededError } from \"../common/TreeErrors.js\";\nimport { createIdsSelector, parseIdsSelectorResult } from \"../common/Utils.js\";\nimport { releaseMainThreadOnItemsCount } from \"./Utils.js\";\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 GroupingHierarchyNode,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n LimitingECSqlQueryExecutor,\n NodesQueryClauseFactory,\n} from \"@itwin/presentation-hierarchies\";\nimport type { ModelsTreeIdsCache } from \"./internal/ModelsTreeIdsCache.js\";\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 /** Should the root Subject node be hidden. Defaults to `false`. */\n hideRootSubject: boolean;\n}\n\n/** @internal */\nexport const defaultHierarchyConfiguration: ModelsTreeHierarchyConfiguration = {\n elementClassGrouping: \"enable\",\n elementClassSpecification: \"BisCore.GeometricElement3d\",\n showEmptyModels: false,\n hideRootSubject: 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) =>\n this.createSubjectChildrenQuery({ ...requestProps, parentNodeInstanceIds: this._hierarchyConfig.hideRootSubject ? [IModel.rootSubjectId] : [] }),\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 createSubjectChildrenQuery({\n parentNodeInstanceIds: parentSubjectIds,\n instanceFilter,\n }: Pick<DefineInstanceNodeChildHierarchyLevelProps, \"parentNodeInstanceIds\" | \"instanceFilter\">): 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] = parentSubjectIds.length\n ? await Promise.all([this._idsCache.getChildSubjectIds(parentSubjectIds), this._idsCache.getChildSubjectModelIds(parentSubjectIds)])\n : [[IModel.rootSubjectId], []];\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: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, 'icon-imodel-hollow-2', 'icon-folder')` },\n isSubject: true,\n },\n autoExpand: { selector: `IIF(this.ECInstanceId = ${IModel.rootSubjectId}, true, false)` },\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 const modeledElements = await firstValueFrom(\n from(modelIds).pipe(\n mergeMap(async (modelId) => this._idsCache.getCategoriesModeledElements(modelId, categoryIds)),\n reduce((acc, foundModeledElements) => {\n return acc.concat(foundModeledElements);\n }, new Array<Id64String>()),\n ),\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 IIF(\n ${modeledElements.length ? `this.ECInstanceId IN (${modeledElements.join(\",\")})` : `FALSE`},\n 1,\n IFNULL((\n SELECT 1\n FROM ${this._hierarchyConfig.elementClassSpecification} ce\n WHERE ce.Parent.Id = this.ECInstanceId\n LIMIT 1\n ), 0)\n )\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 ${this._hierarchyConfig.elementClassSpecification} ce\n JOIN BisCore.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 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"]}
@@ -4,6 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { bufferTime, filter, firstValueFrom, mergeAll, mergeMap, ReplaySubject, Subject } from "rxjs";
6
6
  import { assert } from "@itwin/core-bentley";
7
+ import { IModel } from "@itwin/core-common";
7
8
  import { pushToMap } from "../../common/Utils.js";
8
9
  /** @internal */
9
10
  export class ModelsTreeIdsCache {
@@ -185,6 +186,9 @@ export class ModelsTreeIdsCache {
185
186
  const result = new Array();
186
187
  let currParentId = targetSubjectId;
187
188
  while (currParentId) {
189
+ if (this._hierarchyConfig.hideRootSubject && currParentId === IModel.rootSubjectId) {
190
+ break;
191
+ }
188
192
  const parentInfo = subjectInfos.get(currParentId);
189
193
  if (!parentInfo?.hideInHierarchy) {
190
194
  result.push({ className: "BisCore.Subject", id: currParentId });
@@ -209,13 +213,14 @@ export class ModelsTreeIdsCache {
209
213
  }
210
214
  async *queryModelCategories() {
211
215
  const query = /* sql */ `
212
- SELECT Model.Id modelId, Category.Id categoryId
213
- FROM ${this._hierarchyConfig.elementClassSpecification}
214
- WHERE Parent.Id IS NULL
215
- GROUP BY modelId, categoryId
216
+ SELECT this.Model.Id modelId, this.Category.Id categoryId, m.IsPrivate isModelPrivate
217
+ FROM BisCore.Model m
218
+ JOIN ${this._hierarchyConfig.elementClassSpecification} this ON m.ECInstanceId = this.Model.Id
219
+ WHERE this.Parent.Id IS NULL
220
+ GROUP BY modelId, categoryId, isModelPrivate
216
221
  `;
217
222
  for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
218
- yield { modelId: row.modelId, categoryId: row.categoryId };
223
+ yield { modelId: row.modelId, categoryId: row.categoryId, isModelPrivate: !!row.isModelPrivate };
219
224
  }
220
225
  }
221
226
  async *queryModeledElements() {
@@ -226,6 +231,9 @@ export class ModelsTreeIdsCache {
226
231
  pe.Model.Id modelId
227
232
  FROM BisCore.Model m
228
233
  JOIN ${this._hierarchyConfig.elementClassSpecification} pe ON pe.ECInstanceId = m.ModeledElement.Id
234
+ WHERE
235
+ m.IsPrivate = false
236
+ AND m.ECInstanceId IN (SELECT Model.Id FROM ${this._hierarchyConfig.elementClassSpecification})
229
237
  `;
230
238
  for await (const row of this._queryExecutor.createQueryReader({ ecsql: query }, { rowFormat: "ECSqlPropertyNames", limit: "unbounded" })) {
231
239
  yield { modelId: row.modelId, categoryId: row.categoryId, modeledElementId: row.modeledElementId };
@@ -253,13 +261,14 @@ export class ModelsTreeIdsCache {
253
261
  const modelInfos = new Map();
254
262
  await Promise.all([
255
263
  (async () => {
256
- for await (const { modelId, categoryId } of this.queryModelCategories()) {
264
+ for await (const { modelId, categoryId, isModelPrivate } of this.queryModelCategories()) {
257
265
  const entry = modelInfos.get(modelId);
258
266
  if (entry) {
259
267
  entry.categories.add(categoryId);
268
+ entry.isModelPrivate = isModelPrivate;
260
269
  }
261
270
  else {
262
- modelInfos.set(modelId, { categories: new Set([categoryId]), elementCount: 0 });
271
+ modelInfos.set(modelId, { categories: new Set([categoryId]), elementCount: 0, isModelPrivate });
263
272
  }
264
273
  }
265
274
  })(),
@@ -270,7 +279,7 @@ export class ModelsTreeIdsCache {
270
279
  entry.elementCount = elementCount;
271
280
  }
272
281
  else {
273
- modelInfos.set(modelId, { categories: new Set(), elementCount });
282
+ modelInfos.set(modelId, { categories: new Set(), elementCount, isModelPrivate: false });
274
283
  }
275
284
  }
276
285
  })(),
@@ -290,7 +299,11 @@ export class ModelsTreeIdsCache {
290
299
  }
291
300
  async hasSubModel(elementId) {
292
301
  const modelInfos = await this.getModelInfos();
293
- return modelInfos.has(elementId);
302
+ const modeledElementInfo = modelInfos.get(elementId);
303
+ if (!modeledElementInfo) {
304
+ return false;
305
+ }
306
+ return !modeledElementInfo.isModelPrivate;
294
307
  }
295
308
  async getCategoriesModeledElements(modelId, categoryIds) {
296
309
  const modelWithCategoryModeledElements = await this.getModelWithCategoryModeledElements();