@itwin/presentation-hierarchies 2.0.0-alpha.13 → 2.0.0-alpha.15
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 +132 -4
- package/README.md +19 -18
- package/lib/cjs/hierarchies/HierarchyMerge.d.ts +1 -1
- package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyMerge.js +1 -1
- package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.js +7 -3
- package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchySearch.d.ts +24 -2
- package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchySearch.js +33 -16
- package/lib/cjs/hierarchies/HierarchySearch.js.map +1 -1
- package/lib/cjs/hierarchies/Logging.js +1 -1
- package/lib/cjs/hierarchies/Logging.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/HierarchyCache.js +1 -4
- package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts +35 -2
- package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +144 -78
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js +6 -7
- package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +33 -62
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
- package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +3 -5
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/Utils.js +19 -7
- package/lib/cjs/hierarchies/imodel/Utils.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js +10 -4
- package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/Grouping.js +32 -18
- package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js +31 -9
- package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js +30 -14
- package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +4 -6
- package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js +4 -9
- package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
- package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
- package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
- package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js +3 -1
- package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
- package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/Common.js +2 -2
- package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
- package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/EachValueFrom.js +0 -2
- package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js +1 -4
- package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
- package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -1
- package/lib/cjs/presentation-hierarchies.d.ts +3 -3
- package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
- package/lib/cjs/presentation-hierarchies.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyMerge.d.ts +1 -1
- package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyMerge.js +1 -1
- package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.js +7 -3
- package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/HierarchySearch.d.ts +24 -2
- package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchySearch.js +33 -16
- package/lib/esm/hierarchies/HierarchySearch.js.map +1 -1
- package/lib/esm/hierarchies/Logging.js +1 -1
- package/lib/esm/hierarchies/Logging.js.map +1 -1
- package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/HierarchyCache.js +1 -4
- package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts +35 -2
- package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +147 -81
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js +7 -8
- package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +34 -63
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
- package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
- package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
- package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/TreeNodesReader.js +3 -5
- package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
- package/lib/esm/hierarchies/imodel/Utils.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/Utils.js +19 -7
- package/lib/esm/hierarchies/imodel/Utils.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js +11 -5
- package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/Grouping.js +33 -19
- package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js +32 -10
- package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js +31 -15
- package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +5 -7
- package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js +5 -10
- package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
- package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
- package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
- package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js +3 -1
- package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
- package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/Common.js +2 -2
- package/lib/esm/hierarchies/internal/Common.js.map +1 -1
- package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/EachValueFrom.js +0 -2
- package/lib/esm/hierarchies/internal/EachValueFrom.js.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/SubscriptionScheduler.js +1 -4
- package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
- package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/operators/Partition.js.map +1 -1
- package/lib/esm/presentation-hierarchies.d.ts +3 -3
- package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies.js +3 -3
- package/lib/esm/presentation-hierarchies.js.map +1 -1
- package/package.json +15 -23
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import "../internal/DisposePolyfill.js";
|
|
6
|
-
import { catchError, concat, defaultIfEmpty,
|
|
6
|
+
import { catchError, concat, defaultIfEmpty, EMPTY, filter, finalize, from, fromEventPattern, identity, map, merge, mergeAll, mergeMap, of, reduce, Subject, take, takeUntil, tap, } from "rxjs";
|
|
7
7
|
import { assert, BeEvent, Guid, StopWatch } from "@itwin/core-bentley";
|
|
8
|
-
import { createDefaultValueFormatter, formatConcatenatedValue, InstanceKey, normalizeFullClassName } from "@itwin/presentation-shared";
|
|
8
|
+
import { createDefaultValueFormatter, createIModelInstanceLabelSelectClauseFactory, formatConcatenatedValue, InstanceKey, normalizeFullClassName, } from "@itwin/presentation-shared";
|
|
9
9
|
import { RowsLimitExceededError } from "../HierarchyErrors.js";
|
|
10
10
|
import { HierarchyNode } from "../HierarchyNode.js";
|
|
11
11
|
import { HierarchyNodeKey } from "../HierarchyNodeKey.js";
|
|
@@ -21,7 +21,7 @@ import { getRxjsHierarchyDefinition } from "../internal/RxjsHierarchyDefinition.
|
|
|
21
21
|
import { SubscriptionScheduler } from "../internal/SubscriptionScheduler.js";
|
|
22
22
|
import { HierarchyCache } from "./HierarchyCache.js";
|
|
23
23
|
import { HierarchyNodesDefinition } from "./IModelHierarchyDefinition.js";
|
|
24
|
-
import { NodeSelectClauseColumnNames } from "./NodeSelectQueryFactory.js";
|
|
24
|
+
import { createNodesQueryClauseFactory, NodeSelectClauseColumnNames } from "./NodeSelectQueryFactory.js";
|
|
25
25
|
import { createDetermineChildrenOperator } from "./operators/DetermineChildren.js";
|
|
26
26
|
import { createGroupingOperator } from "./operators/Grouping.js";
|
|
27
27
|
import { createHideIfNoChildrenOperator } from "./operators/HideIfNoChildren.js";
|
|
@@ -75,9 +75,12 @@ class IModelHierarchyProviderImpl {
|
|
|
75
75
|
}
|
|
76
76
|
this.#componentId = Guid.createValue();
|
|
77
77
|
this.#componentName = "IModelHierarchyProviderImpl";
|
|
78
|
-
/* c8 ignore next */
|
|
79
78
|
this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
|
|
80
|
-
this._imodels = props.imodels
|
|
79
|
+
this._imodels = props.imodels.map(({ imodelAccess, imodelChanged }) => {
|
|
80
|
+
const instanceLabelSelectClauseFactory = createIModelInstanceLabelSelectClauseFactory({ imodelAccess });
|
|
81
|
+
const nodeSelectClauseFactory = createNodesQueryClauseFactory({ imodelAccess, instanceLabelSelectClauseFactory });
|
|
82
|
+
return { imodelAccess, imodelChanged, instanceLabelSelectClauseFactory, nodeSelectClauseFactory };
|
|
83
|
+
});
|
|
81
84
|
this._hierarchyChanged = new BeEvent();
|
|
82
85
|
this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);
|
|
83
86
|
this._valuesFormatter = props.formatter ?? createDefaultValueFormatter();
|
|
@@ -110,7 +113,7 @@ class IModelHierarchyProviderImpl {
|
|
|
110
113
|
this._dispose.next();
|
|
111
114
|
this._unsubscribe?.();
|
|
112
115
|
}
|
|
113
|
-
/*
|
|
116
|
+
/* v8 ignore next -- @preserve */
|
|
114
117
|
dispose() {
|
|
115
118
|
this[Symbol.dispose]();
|
|
116
119
|
}
|
|
@@ -129,9 +132,10 @@ class IModelHierarchyProviderImpl {
|
|
|
129
132
|
return this._imodels[this._imodels.length - 1].imodelAccess;
|
|
130
133
|
}
|
|
131
134
|
invalidateHierarchyCache(reason) {
|
|
135
|
+
/* v8 ignore next -- @preserve */
|
|
132
136
|
doLog({
|
|
133
137
|
category: `${LOGGING_NAMESPACE}.Events`,
|
|
134
|
-
message:
|
|
138
|
+
message: () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),
|
|
135
139
|
});
|
|
136
140
|
this._nodesCache?.clear();
|
|
137
141
|
}
|
|
@@ -167,13 +171,17 @@ class IModelHierarchyProviderImpl {
|
|
|
167
171
|
}
|
|
168
172
|
createHierarchyLevelDefinitionsObservable(props) {
|
|
169
173
|
const { requestContext, ...defineHierarchyLevelProps } = props;
|
|
174
|
+
/* v8 ignore next -- @preserve */
|
|
170
175
|
doLog({
|
|
171
176
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
172
|
-
message:
|
|
177
|
+
message: () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
173
178
|
});
|
|
174
|
-
return from(this._imodels).pipe(mergeMap(({ imodelAccess }, imodelAccessIndex) => {
|
|
179
|
+
return from(this._imodels).pipe(mergeMap(({ imodelAccess, instanceLabelSelectClauseFactory, nodeSelectClauseFactory }, imodelAccessIndex) => {
|
|
175
180
|
let parentNode = props.parentNode;
|
|
176
|
-
if (parentNode &&
|
|
181
|
+
if (parentNode &&
|
|
182
|
+
HierarchyNode.isGeneric(parentNode) &&
|
|
183
|
+
parentNode.key.source &&
|
|
184
|
+
parentNode.key.source !== this.#sourceName) {
|
|
177
185
|
return EMPTY;
|
|
178
186
|
}
|
|
179
187
|
if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {
|
|
@@ -189,38 +197,65 @@ class IModelHierarchyProviderImpl {
|
|
|
189
197
|
return EMPTY;
|
|
190
198
|
}
|
|
191
199
|
}
|
|
192
|
-
return this._activeHierarchyDefinition
|
|
200
|
+
return this._activeHierarchyDefinition
|
|
201
|
+
.defineHierarchyLevel({
|
|
202
|
+
...defineHierarchyLevelProps,
|
|
203
|
+
parentNode,
|
|
204
|
+
imodelAccess,
|
|
205
|
+
instanceLabelSelectClauseFactory,
|
|
206
|
+
nodeSelectClauseFactory,
|
|
207
|
+
})
|
|
208
|
+
.pipe(mergeAll(), map(
|
|
193
209
|
/* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
|
|
194
210
|
(hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
|
|
195
|
-
}), finalize(() =>
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
211
|
+
}), finalize(() => {
|
|
212
|
+
/* v8 ignore next -- @preserve */
|
|
213
|
+
doLog({
|
|
214
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
215
|
+
message: () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
216
|
+
});
|
|
217
|
+
}));
|
|
199
218
|
}
|
|
200
219
|
createSourceNodesObservable(props) {
|
|
201
|
-
|
|
202
|
-
return this.createHierarchyLevelDefinitionsObservable(props).pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => defer(() => {
|
|
220
|
+
const createSourceNodesFromDefinition = (imodelAccess, def) => {
|
|
203
221
|
if (HierarchyNodesDefinition.isGenericNode(def)) {
|
|
204
|
-
return of({
|
|
205
|
-
...def.node,
|
|
206
|
-
key: { type: "generic", id: def.node.key, source: this.#sourceName },
|
|
207
|
-
});
|
|
222
|
+
return of({ ...def.node, key: { type: "generic", id: def.node.key, source: this.#sourceName } });
|
|
208
223
|
}
|
|
209
|
-
|
|
224
|
+
const query = createInstanceKeysFilteredQuery(def.query, props.targetInstanceKeys);
|
|
225
|
+
return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(readNodes({
|
|
210
226
|
queryExecutor: imodelAccess,
|
|
211
227
|
query,
|
|
212
228
|
limit: props.hierarchyLevelSizeLimit,
|
|
213
229
|
parser: this._activeHierarchyDefinition.parseNode
|
|
214
|
-
? ({ row }) => this._activeHierarchyDefinition.parseNode({
|
|
230
|
+
? ({ row }) => this._activeHierarchyDefinition.parseNode({
|
|
231
|
+
row,
|
|
232
|
+
parentNode: props.parentNode,
|
|
233
|
+
imodelKey: imodelAccess.imodelKey,
|
|
234
|
+
})
|
|
215
235
|
: undefined,
|
|
216
|
-
})
|
|
236
|
+
}).pipe(map((node) => ({
|
|
217
237
|
...node,
|
|
218
|
-
key: {
|
|
238
|
+
key: {
|
|
239
|
+
...node.key,
|
|
240
|
+
instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })),
|
|
241
|
+
},
|
|
219
242
|
}))));
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
243
|
+
};
|
|
244
|
+
const definitions = this.createHierarchyLevelDefinitionsObservable(props);
|
|
245
|
+
let sourceNodes;
|
|
246
|
+
if (this._imodels.length === 1) {
|
|
247
|
+
sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def)));
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, map(({ node }) => node));
|
|
251
|
+
}
|
|
252
|
+
return sourceNodes.pipe(finalize(() => {
|
|
253
|
+
/* v8 ignore next -- @preserve */
|
|
254
|
+
doLog({
|
|
255
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
256
|
+
message: () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
257
|
+
});
|
|
258
|
+
}), shareReplayWithErrors());
|
|
224
259
|
}
|
|
225
260
|
createPreProcessedNodesObservable(queryNodesObservable, props) {
|
|
226
261
|
return queryNodesObservable.pipe(
|
|
@@ -236,16 +271,22 @@ class IModelHierarchyProviderImpl {
|
|
|
236
271
|
// process hiding
|
|
237
272
|
createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), createHideNodesInHierarchyOperator(
|
|
238
273
|
// note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)
|
|
239
|
-
(n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() =>
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
274
|
+
(n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() => {
|
|
275
|
+
/* v8 ignore next -- @preserve */
|
|
276
|
+
doLog({
|
|
277
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
278
|
+
message: () => `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
279
|
+
});
|
|
280
|
+
}));
|
|
243
281
|
}
|
|
244
282
|
createProcessedNodesObservable(preprocessedNodesObservable, props) {
|
|
245
|
-
return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() =>
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
283
|
+
return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() => {
|
|
284
|
+
/* v8 ignore next -- @preserve */
|
|
285
|
+
doLog({
|
|
286
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
287
|
+
message: () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
288
|
+
});
|
|
289
|
+
}));
|
|
249
290
|
}
|
|
250
291
|
createFinalizedNodesObservable(processedNodesObservable, props) {
|
|
251
292
|
return processedNodesObservable.pipe(createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition, props.parentNode), sortNodesByLabelOperator, map((n) => {
|
|
@@ -253,35 +294,44 @@ class IModelHierarchyProviderImpl {
|
|
|
253
294
|
delete n.processingParams;
|
|
254
295
|
}
|
|
255
296
|
return { ...n, children: hasChildren(n) };
|
|
256
|
-
}), takeUntil(this._dispose), finalize(() =>
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
297
|
+
}), takeUntil(this._dispose), finalize(() => {
|
|
298
|
+
/* v8 ignore next -- @preserve */
|
|
299
|
+
doLog({
|
|
300
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
301
|
+
message: () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
302
|
+
});
|
|
303
|
+
}));
|
|
260
304
|
}
|
|
261
305
|
createHasNodesObservable(preprocessedNodesObservable, possiblyKnownChildrenObservable, props) {
|
|
262
306
|
const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;
|
|
263
|
-
return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
|
|
307
|
+
return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
|
|
308
|
+
/* v8 ignore next -- @preserve */
|
|
309
|
+
log({
|
|
264
310
|
category: loggingCategory,
|
|
265
|
-
message:
|
|
311
|
+
message: (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,
|
|
266
312
|
}), take(1), map(() => true), defaultIfEmpty(false), catchError((e) => {
|
|
313
|
+
/* v8 ignore next -- @preserve */
|
|
267
314
|
doLog({
|
|
268
315
|
category: loggingCategory,
|
|
269
|
-
message:
|
|
316
|
+
message: () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,
|
|
270
317
|
});
|
|
271
318
|
if (e instanceof RowsLimitExceededError) {
|
|
272
319
|
return of(true);
|
|
273
320
|
}
|
|
274
321
|
throw e;
|
|
275
|
-
}),
|
|
322
|
+
}),
|
|
323
|
+
/* v8 ignore next -- @preserve */
|
|
324
|
+
log({ category: loggingCategory, message: (r) => `[${props.requestContext.requestId}] Result: ${r}` }));
|
|
276
325
|
}
|
|
277
326
|
getCachedObservableEntry(props) {
|
|
278
327
|
const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;
|
|
279
328
|
const { parentNode, ...restProps } = props;
|
|
280
329
|
const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);
|
|
281
330
|
if (cached) {
|
|
331
|
+
/* v8 ignore next -- @preserve */
|
|
282
332
|
doLog({
|
|
283
333
|
category: loggingCategory,
|
|
284
|
-
message:
|
|
334
|
+
message: () => `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
|
|
285
335
|
});
|
|
286
336
|
return cached;
|
|
287
337
|
}
|
|
@@ -305,11 +355,15 @@ class IModelHierarchyProviderImpl {
|
|
|
305
355
|
parentNode: parentNonGroupingNode,
|
|
306
356
|
...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
|
|
307
357
|
};
|
|
308
|
-
const value = {
|
|
358
|
+
const value = {
|
|
359
|
+
observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps),
|
|
360
|
+
processingStatus: "none",
|
|
361
|
+
};
|
|
309
362
|
this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
|
|
363
|
+
/* v8 ignore next -- @preserve */
|
|
310
364
|
doLog({
|
|
311
365
|
category: loggingCategory,
|
|
312
|
-
message:
|
|
366
|
+
message: () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
|
|
313
367
|
});
|
|
314
368
|
return value;
|
|
315
369
|
}
|
|
@@ -344,18 +398,19 @@ class IModelHierarchyProviderImpl {
|
|
|
344
398
|
const timer = new StopWatch(undefined, true);
|
|
345
399
|
let error;
|
|
346
400
|
let nodesCount = 0;
|
|
401
|
+
/* v8 ignore next -- @preserve */
|
|
347
402
|
doLog({
|
|
348
403
|
category: loggingCategory,
|
|
349
|
-
message:
|
|
404
|
+
message: () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
350
405
|
});
|
|
351
406
|
return eachValueFrom(this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(tap(() => ++nodesCount), catchError((e) => {
|
|
352
407
|
error = e;
|
|
353
408
|
throw e;
|
|
354
409
|
}), finalize(() => {
|
|
410
|
+
/* v8 ignore next -- @preserve */
|
|
355
411
|
doLog({
|
|
356
412
|
category: loggingCategory,
|
|
357
|
-
message:
|
|
358
|
-
/* c8 ignore next 3 */ error
|
|
413
|
+
message: () => error
|
|
359
414
|
? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
|
|
360
415
|
: `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
|
|
361
416
|
});
|
|
@@ -368,7 +423,11 @@ class IModelHierarchyProviderImpl {
|
|
|
368
423
|
}
|
|
369
424
|
assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));
|
|
370
425
|
// split the definitions based on whether they're for generic nodes or for instance nodes
|
|
371
|
-
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
|
|
426
|
+
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
|
|
427
|
+
parentNode,
|
|
428
|
+
instanceFilter,
|
|
429
|
+
requestContext,
|
|
430
|
+
});
|
|
372
431
|
const [instanceDefs, genericDefs] = partition(hierarchyLevelDefinitions, (x) => HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
|
|
373
432
|
// query instance keys and a flag whether they should be hidden
|
|
374
433
|
const instanceKeys = instanceDefs.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(of(def.query).pipe(mergeMap(async (query) => {
|
|
@@ -411,11 +470,7 @@ class IModelHierarchyProviderImpl {
|
|
|
411
470
|
mergeMap((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
|
|
412
471
|
type: "instances",
|
|
413
472
|
instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
|
|
414
|
-
}))))).pipe(map((key) => ({
|
|
415
|
-
key,
|
|
416
|
-
parentKeys: [],
|
|
417
|
-
label: "",
|
|
418
|
-
})));
|
|
473
|
+
}))))).pipe(map((key) => ({ key, parentKeys: [], label: "" })));
|
|
419
474
|
// merge visible instance keys from this level & the ones we get recursively requesting from deeper levels
|
|
420
475
|
return merge(visibleNodeInstanceKeys.pipe(map(({ key }) => key)), hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext })))).pipe(takeUntil(this._dispose));
|
|
421
476
|
}
|
|
@@ -427,9 +482,10 @@ class IModelHierarchyProviderImpl {
|
|
|
427
482
|
const requestContext = { requestId: Guid.createValue() };
|
|
428
483
|
const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;
|
|
429
484
|
const timer = new StopWatch(undefined, true);
|
|
485
|
+
/* v8 ignore next -- @preserve */
|
|
430
486
|
doLog({
|
|
431
487
|
category: loggingCategory,
|
|
432
|
-
message:
|
|
488
|
+
message: () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
433
489
|
});
|
|
434
490
|
let error;
|
|
435
491
|
let keysCount = 0;
|
|
@@ -437,10 +493,10 @@ class IModelHierarchyProviderImpl {
|
|
|
437
493
|
error = e;
|
|
438
494
|
throw e;
|
|
439
495
|
}), finalize(() => {
|
|
496
|
+
/* v8 ignore next -- @preserve */
|
|
440
497
|
doLog({
|
|
441
498
|
category: loggingCategory,
|
|
442
|
-
message:
|
|
443
|
-
/* c8 ignore next 3 */ error
|
|
499
|
+
message: () => error
|
|
444
500
|
? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
|
|
445
501
|
: `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
|
|
446
502
|
});
|
|
@@ -457,13 +513,7 @@ function processNodes(processor, parentNode) {
|
|
|
457
513
|
return (nodes) => nodes.pipe(mergeMap((node) => processor({ node, parentNode })));
|
|
458
514
|
}
|
|
459
515
|
function applyLabelsFormatting(node, valueFormatter) {
|
|
460
|
-
return from(formatConcatenatedValue({
|
|
461
|
-
value: node.label,
|
|
462
|
-
valueFormatter,
|
|
463
|
-
})).pipe(map((label) => ({
|
|
464
|
-
...node,
|
|
465
|
-
label,
|
|
466
|
-
})));
|
|
516
|
+
return from(formatConcatenatedValue({ value: node.label, valueFormatter })).pipe(map((label) => ({ ...node, label })));
|
|
467
517
|
}
|
|
468
518
|
function createParentNodeKeysList(parentNode) {
|
|
469
519
|
if (!parentNode) {
|
|
@@ -476,6 +526,8 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
|
|
|
476
526
|
return query;
|
|
477
527
|
}
|
|
478
528
|
const MAX_ALLOWED_BINDINGS = 1000;
|
|
529
|
+
// TODO: MISSING_COVERAGE
|
|
530
|
+
/* v8 ignore else -- @preserve */
|
|
479
531
|
if (targetInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
|
|
480
532
|
return {
|
|
481
533
|
...query,
|
|
@@ -484,10 +536,13 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
|
|
|
484
536
|
FROM (${query.ecsql}) q
|
|
485
537
|
WHERE q.ECInstanceId IN (${targetInstanceKeys.map(() => "?").join(",")})
|
|
486
538
|
`,
|
|
487
|
-
bindings: [
|
|
539
|
+
bindings: [
|
|
540
|
+
...(query.bindings ?? []),
|
|
541
|
+
...targetInstanceKeys.map((k) => ({ type: "id", value: k.id })),
|
|
542
|
+
],
|
|
488
543
|
};
|
|
489
544
|
}
|
|
490
|
-
/*
|
|
545
|
+
/* v8 ignore start */
|
|
491
546
|
return {
|
|
492
547
|
...query,
|
|
493
548
|
ecsql: `
|
|
@@ -497,8 +552,10 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
|
|
|
497
552
|
`,
|
|
498
553
|
bindings: [...(query.bindings ?? []), { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
|
|
499
554
|
};
|
|
500
|
-
/*
|
|
555
|
+
/* v8 ignore stop */
|
|
501
556
|
}
|
|
557
|
+
// TODO: MISSING_COVERAGE
|
|
558
|
+
/* v8 ignore start */
|
|
502
559
|
function mergeNodes(source) {
|
|
503
560
|
return from(source).pipe(reduce((acc, input) => {
|
|
504
561
|
for (let i = 0; i < acc.length; ++i) {
|
|
@@ -509,11 +566,25 @@ function mergeNodes(source) {
|
|
|
509
566
|
// the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
|
|
510
567
|
// the node with higher `imodelAccessIndex` first
|
|
511
568
|
const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
|
|
512
|
-
? {
|
|
513
|
-
|
|
569
|
+
? {
|
|
570
|
+
imodelAccess: input.imodelAccess,
|
|
571
|
+
imodelAccessIndex: input.imodelAccessIndex,
|
|
572
|
+
primary: input.node,
|
|
573
|
+
secondary: acc[i].node,
|
|
574
|
+
}
|
|
575
|
+
: {
|
|
576
|
+
imodelAccess: acc[i].imodelAccess,
|
|
577
|
+
imodelAccessIndex: acc[i].imodelAccessIndex,
|
|
578
|
+
primary: acc[i].node,
|
|
579
|
+
secondary: input.node,
|
|
580
|
+
};
|
|
514
581
|
const merged = tryMergeNodes(candidates.primary, candidates.secondary);
|
|
515
582
|
if (merged) {
|
|
516
|
-
acc[i] = {
|
|
583
|
+
acc[i] = {
|
|
584
|
+
node: merged,
|
|
585
|
+
imodelAccess: candidates.imodelAccess,
|
|
586
|
+
imodelAccessIndex: candidates.imodelAccessIndex,
|
|
587
|
+
};
|
|
517
588
|
return acc;
|
|
518
589
|
}
|
|
519
590
|
}
|
|
@@ -557,10 +628,7 @@ function tryMergeInstanceNodes(primary, secondary) {
|
|
|
557
628
|
primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => InstanceKey.equals(lhsKey, rhsKey)))) {
|
|
558
629
|
return {
|
|
559
630
|
...primary,
|
|
560
|
-
key: {
|
|
561
|
-
type: "instances",
|
|
562
|
-
instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
|
|
563
|
-
},
|
|
631
|
+
key: { type: "instances", instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys) },
|
|
564
632
|
...mergeBaseNodeAttributes(primary, secondary),
|
|
565
633
|
};
|
|
566
634
|
}
|
|
@@ -568,14 +636,12 @@ function tryMergeInstanceNodes(primary, secondary) {
|
|
|
568
636
|
}
|
|
569
637
|
function tryMergeGenericNodes(primary, secondary) {
|
|
570
638
|
if (HierarchyNode.isGeneric(primary) && HierarchyNode.isGeneric(secondary) && primary.key.id === secondary.key.id) {
|
|
571
|
-
return {
|
|
572
|
-
...primary,
|
|
573
|
-
...mergeBaseNodeAttributes(primary, secondary),
|
|
574
|
-
};
|
|
639
|
+
return { ...primary, ...mergeBaseNodeAttributes(primary, secondary) };
|
|
575
640
|
}
|
|
576
641
|
return undefined;
|
|
577
642
|
}
|
|
578
643
|
function tryMergeNodes(primary, secondary) {
|
|
579
644
|
return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
|
|
580
645
|
}
|
|
646
|
+
/* v8 ignore stop */
|
|
581
647
|
//# sourceMappingURL=IModelHierarchyProvider.js.map
|