@itwin/presentation-hierarchies 2.0.0-alpha.14 → 2.0.0-alpha.16
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 +142 -0
- package/README.md +12 -22
- 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.map +1 -1
- package/lib/cjs/hierarchies/HierarchySearch.js +19 -12
- 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 +4 -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 +20 -2
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +157 -85
- 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 +12 -9
- package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts +4 -3
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +44 -68
- 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 +1 -0
- package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/Utils.js +21 -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/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
- package/lib/cjs/presentation-hierarchies.d.ts +2 -4
- package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
- package/lib/cjs/presentation-hierarchies.js +1 -4
- 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.map +1 -1
- package/lib/esm/hierarchies/HierarchySearch.js +19 -12
- 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 +4 -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 +20 -2
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +160 -88
- 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 +13 -10
- package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts +4 -3
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +45 -69
- 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 +1 -0
- package/lib/esm/hierarchies/imodel/Utils.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/Utils.js +20 -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/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies.d.ts +2 -4
- package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies.js +2 -3
- package/lib/esm/presentation-hierarchies.js.map +1 -1
- package/package.json +17 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelHierarchyProvider.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/IModelHierarchyProvider.ts"],"names":[],"mappings":"AAKA,OAAO,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"IModelHierarchyProvider.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/IModelHierarchyProvider.ts"],"names":[],"mappings":"AAKA,OAAO,gCAAgC,CAAC;AAkCxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA6B5D,OAAO,KAAK,EAEV,yBAAyB,EACzB,gBAAgB,EAEhB,KAAK,EAEL,iCAAiC,EACjC,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAA0B,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,KAAK,EAGV,mBAAmB,EAEpB,MAAM,gCAAgC,CAAC;AAOxC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAUlF;;;GAGG;AACH,UAAU,uCAAuC;IAC/C;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,cAAc;AACd,KAAK,YAAY,GAAG,gBAAgB,GAAG,0BAA0B,GAAG,yBAAyB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtH;;;GAGG;AACH,UAAU,4BAA4B;IACpC;;;;;;OAMG;IACH,YAAY,EAAE,YAAY,CAAC;IAE3B;;;OAGG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IAElC;;;OAGG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IAEzC,qGAAqG;IACrG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC,uCAAuC,CAAC,CAAC;IAEpE;;;;OAIG;IACH,SAAS,CAAC,EAAE,wBAAwB,CAAC;IAErC;;;;;OAKG;IACH,MAAM,CAAC,EAAE;QACP,iFAAiF;QACjF,KAAK,EAAE,mBAAmB,EAAE,CAAC;KAC9B,CAAC;IAEF;;;;;;;OAOG;IACH,gCAAgC,CAAC,EAAE,iCAAiC,CAAC;CACtE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,4BAA4B,GAAG,iBAAiB,GAAG,UAAU,CAMjH;AAED;;;GAGG;AACH,UAAU,kCAAmC,SAAQ,IAAI,CACvD,4BAA4B,EAC5B,cAAc,GAAG,eAAe,GAAG,kCAAkC,CACtE;IACC;;;;;OAKG;IACH,OAAO,EAAE,KAAK,CAAC;QACb;;;;;;WAMG;QACH,YAAY,EAAE,YAAY,CAAC;QAE3B;;;WAGG;QACH,aAAa,CAAC,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAElC;;;;;;;WAOG;QACH,gCAAgC,CAAC,EAAE,iCAAiC,CAAC;KACtE,CAAC,CAAC;CACJ;AAED;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,kCAAkC,GACxC,iBAAiB,GAAG,UAAU,CAEhC"}
|
|
@@ -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,13 +21,14 @@ 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";
|
|
28
28
|
import { createHideNodesInHierarchyOperator } from "./operators/HideNodesInHierarchy.js";
|
|
29
29
|
import { SearchHierarchyDefinition } from "./SearchHierarchyDefinition.js";
|
|
30
30
|
import { readNodes } from "./TreeNodesReader.js";
|
|
31
|
+
import { ECSQL_PREFIX } from "./Utils.js";
|
|
31
32
|
const LOGGING_NAMESPACE = `${BASE_LOGGING_NAMESPACE}.IModelHierarchyProvider`;
|
|
32
33
|
const LOGGING_NAMESPACE_INTERNAL = `${BASE_LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;
|
|
33
34
|
const LOGGING_NAMESPACE_PERFORMANCE = `${BASE_LOGGING_NAMESPACE_PERFORMANCE}.IModelHierarchyProvider`;
|
|
@@ -40,8 +41,11 @@ const DEFAULT_QUERY_CACHE_SIZE = 1;
|
|
|
40
41
|
* @public
|
|
41
42
|
*/
|
|
42
43
|
export function createIModelHierarchyProvider(props) {
|
|
43
|
-
const { imodelAccess, imodelChanged, ...restProps } = props;
|
|
44
|
-
return createMergedIModelHierarchyProvider({
|
|
44
|
+
const { imodelAccess, imodelChanged, instanceLabelSelectClauseFactory, ...restProps } = props;
|
|
45
|
+
return createMergedIModelHierarchyProvider({
|
|
46
|
+
...restProps,
|
|
47
|
+
imodels: [{ imodelAccess, imodelChanged, instanceLabelSelectClauseFactory }],
|
|
48
|
+
});
|
|
45
49
|
}
|
|
46
50
|
/**
|
|
47
51
|
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
|
|
@@ -75,9 +79,14 @@ class IModelHierarchyProviderImpl {
|
|
|
75
79
|
}
|
|
76
80
|
this.#componentId = Guid.createValue();
|
|
77
81
|
this.#componentName = "IModelHierarchyProviderImpl";
|
|
78
|
-
/* c8 ignore next */
|
|
79
82
|
this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
|
|
80
|
-
this._imodels = props.imodels
|
|
83
|
+
this._imodels = props.imodels.map(({ imodelAccess, imodelChanged, instanceLabelSelectClauseFactory }) => {
|
|
84
|
+
if (!instanceLabelSelectClauseFactory) {
|
|
85
|
+
instanceLabelSelectClauseFactory = createIModelInstanceLabelSelectClauseFactory({ imodelAccess });
|
|
86
|
+
}
|
|
87
|
+
const nodeSelectClauseFactory = createNodesQueryClauseFactory({ imodelAccess, instanceLabelSelectClauseFactory });
|
|
88
|
+
return { imodelAccess, imodelChanged, nodeSelectClauseFactory };
|
|
89
|
+
});
|
|
81
90
|
this._hierarchyChanged = new BeEvent();
|
|
82
91
|
this._activeHierarchyDefinition = this._sourceHierarchyDefinition = getRxjsHierarchyDefinition(props.hierarchyDefinition);
|
|
83
92
|
this._valuesFormatter = props.formatter ?? createDefaultValueFormatter();
|
|
@@ -110,7 +119,7 @@ class IModelHierarchyProviderImpl {
|
|
|
110
119
|
this._dispose.next();
|
|
111
120
|
this._unsubscribe?.();
|
|
112
121
|
}
|
|
113
|
-
/*
|
|
122
|
+
/* v8 ignore next -- @preserve */
|
|
114
123
|
dispose() {
|
|
115
124
|
this[Symbol.dispose]();
|
|
116
125
|
}
|
|
@@ -129,9 +138,10 @@ class IModelHierarchyProviderImpl {
|
|
|
129
138
|
return this._imodels[this._imodels.length - 1].imodelAccess;
|
|
130
139
|
}
|
|
131
140
|
invalidateHierarchyCache(reason) {
|
|
141
|
+
/* v8 ignore next -- @preserve */
|
|
132
142
|
doLog({
|
|
133
143
|
category: `${LOGGING_NAMESPACE}.Events`,
|
|
134
|
-
message:
|
|
144
|
+
message: () => (reason ? `${reason}: clear hierarchy cache` : `Clear hierarchy cache`),
|
|
135
145
|
});
|
|
136
146
|
this._nodesCache?.clear();
|
|
137
147
|
}
|
|
@@ -167,13 +177,17 @@ class IModelHierarchyProviderImpl {
|
|
|
167
177
|
}
|
|
168
178
|
createHierarchyLevelDefinitionsObservable(props) {
|
|
169
179
|
const { requestContext, ...defineHierarchyLevelProps } = props;
|
|
180
|
+
/* v8 ignore next -- @preserve */
|
|
170
181
|
doLog({
|
|
171
182
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
172
|
-
message:
|
|
183
|
+
message: () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
173
184
|
});
|
|
174
|
-
return from(this._imodels).pipe(mergeMap(({ imodelAccess }, imodelAccessIndex) => {
|
|
185
|
+
return from(this._imodels).pipe(mergeMap(({ imodelAccess, nodeSelectClauseFactory }, imodelAccessIndex) => {
|
|
175
186
|
let parentNode = props.parentNode;
|
|
176
|
-
if (parentNode &&
|
|
187
|
+
if (parentNode &&
|
|
188
|
+
HierarchyNode.isGeneric(parentNode) &&
|
|
189
|
+
parentNode.key.source &&
|
|
190
|
+
parentNode.key.source !== this.#sourceName) {
|
|
177
191
|
return EMPTY;
|
|
178
192
|
}
|
|
179
193
|
if (parentNode && HierarchyNode.isInstancesNode(parentNode)) {
|
|
@@ -189,38 +203,67 @@ class IModelHierarchyProviderImpl {
|
|
|
189
203
|
return EMPTY;
|
|
190
204
|
}
|
|
191
205
|
}
|
|
192
|
-
return this._activeHierarchyDefinition
|
|
206
|
+
return this._activeHierarchyDefinition
|
|
207
|
+
.defineHierarchyLevel({
|
|
208
|
+
...defineHierarchyLevelProps,
|
|
209
|
+
createSelectClause: async (selectClauseProps) => nodeSelectClauseFactory.createSelectClause(selectClauseProps),
|
|
210
|
+
/* v8 ignore start */
|
|
211
|
+
createFilterClauses: async (filterClausesProps) => nodeSelectClauseFactory.createFilterClauses(filterClausesProps),
|
|
212
|
+
/* v8 ignore stop */
|
|
213
|
+
parentNode,
|
|
214
|
+
imodelAccess,
|
|
215
|
+
})
|
|
216
|
+
.pipe(mergeAll(), map(
|
|
193
217
|
/* 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
218
|
(hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
|
|
195
|
-
}), finalize(() =>
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
219
|
+
}), finalize(() => {
|
|
220
|
+
/* v8 ignore next -- @preserve */
|
|
221
|
+
doLog({
|
|
222
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
223
|
+
message: () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
224
|
+
});
|
|
225
|
+
}));
|
|
199
226
|
}
|
|
200
227
|
createSourceNodesObservable(props) {
|
|
201
|
-
|
|
202
|
-
return this.createHierarchyLevelDefinitionsObservable(props).pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => defer(() => {
|
|
228
|
+
const createSourceNodesFromDefinition = (imodelAccess, def) => {
|
|
203
229
|
if (HierarchyNodesDefinition.isGenericNode(def)) {
|
|
204
|
-
return of({
|
|
205
|
-
...def.node,
|
|
206
|
-
key: { type: "generic", id: def.node.key, source: this.#sourceName },
|
|
207
|
-
});
|
|
230
|
+
return of({ ...def.node, key: { type: "generic", id: def.node.key, source: this.#sourceName } });
|
|
208
231
|
}
|
|
209
|
-
|
|
232
|
+
const query = createInstanceKeysFilteredQuery(def.query, props.targetInstanceKeys);
|
|
233
|
+
return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(readNodes({
|
|
210
234
|
queryExecutor: imodelAccess,
|
|
211
235
|
query,
|
|
212
236
|
limit: props.hierarchyLevelSizeLimit,
|
|
213
237
|
parser: this._activeHierarchyDefinition.parseNode
|
|
214
|
-
? ({ row }) => this._activeHierarchyDefinition.parseNode({
|
|
238
|
+
? ({ row }) => this._activeHierarchyDefinition.parseNode({
|
|
239
|
+
row,
|
|
240
|
+
parentNode: props.parentNode,
|
|
241
|
+
imodelKey: imodelAccess.imodelKey,
|
|
242
|
+
})
|
|
215
243
|
: undefined,
|
|
216
|
-
})
|
|
244
|
+
}).pipe(map((node) => ({
|
|
217
245
|
...node,
|
|
218
|
-
key: {
|
|
246
|
+
key: {
|
|
247
|
+
...node.key,
|
|
248
|
+
instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })),
|
|
249
|
+
},
|
|
219
250
|
}))));
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
251
|
+
};
|
|
252
|
+
const definitions = this.createHierarchyLevelDefinitionsObservable(props);
|
|
253
|
+
let sourceNodes;
|
|
254
|
+
if (this._imodels.length === 1) {
|
|
255
|
+
sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def)));
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
sourceNodes = definitions.pipe(mergeMap(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => createSourceNodesFromDefinition(imodelAccess, def).pipe(map((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, map(({ node }) => node));
|
|
259
|
+
}
|
|
260
|
+
return sourceNodes.pipe(finalize(() => {
|
|
261
|
+
/* v8 ignore next -- @preserve */
|
|
262
|
+
doLog({
|
|
263
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
264
|
+
message: () => `[${props.requestContext.requestId}] Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
265
|
+
});
|
|
266
|
+
}), shareReplayWithErrors());
|
|
224
267
|
}
|
|
225
268
|
createPreProcessedNodesObservable(queryNodesObservable, props) {
|
|
226
269
|
return queryNodesObservable.pipe(
|
|
@@ -236,16 +279,22 @@ class IModelHierarchyProviderImpl {
|
|
|
236
279
|
// process hiding
|
|
237
280
|
createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), createHideNodesInHierarchyOperator(
|
|
238
281
|
// 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
|
-
|
|
282
|
+
(n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes, false), finalize(() => {
|
|
283
|
+
/* v8 ignore next -- @preserve */
|
|
284
|
+
doLog({
|
|
285
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
286
|
+
message: () => `[${props.requestContext.requestId}] Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
287
|
+
});
|
|
288
|
+
}));
|
|
243
289
|
}
|
|
244
290
|
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
|
-
|
|
291
|
+
return preprocessedNodesObservable.pipe(createGroupingOperator(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), finalize(() => {
|
|
292
|
+
/* v8 ignore next -- @preserve */
|
|
293
|
+
doLog({
|
|
294
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
295
|
+
message: () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
296
|
+
});
|
|
297
|
+
}));
|
|
249
298
|
}
|
|
250
299
|
createFinalizedNodesObservable(processedNodesObservable, props) {
|
|
251
300
|
return processedNodesObservable.pipe(createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), postProcessNodes(this._activeHierarchyDefinition, props.parentNode), sortNodesByLabelOperator, map((n) => {
|
|
@@ -253,35 +302,44 @@ class IModelHierarchyProviderImpl {
|
|
|
253
302
|
delete n.processingParams;
|
|
254
303
|
}
|
|
255
304
|
return { ...n, children: hasChildren(n) };
|
|
256
|
-
}), takeUntil(this._dispose), finalize(() =>
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
305
|
+
}), takeUntil(this._dispose), finalize(() => {
|
|
306
|
+
/* v8 ignore next -- @preserve */
|
|
307
|
+
doLog({
|
|
308
|
+
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
309
|
+
message: () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
310
|
+
});
|
|
311
|
+
}));
|
|
260
312
|
}
|
|
261
313
|
createHasNodesObservable(preprocessedNodesObservable, possiblyKnownChildrenObservable, props) {
|
|
262
314
|
const loggingCategory = `${LOGGING_NAMESPACE_INTERNAL}.HasNodes`;
|
|
263
|
-
return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
|
|
315
|
+
return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(
|
|
316
|
+
/* v8 ignore next -- @preserve */
|
|
317
|
+
log({
|
|
264
318
|
category: loggingCategory,
|
|
265
|
-
message:
|
|
319
|
+
message: (n) => `[${props.requestContext.requestId}] Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}`,
|
|
266
320
|
}), take(1), map(() => true), defaultIfEmpty(false), catchError((e) => {
|
|
321
|
+
/* v8 ignore next -- @preserve */
|
|
267
322
|
doLog({
|
|
268
323
|
category: loggingCategory,
|
|
269
|
-
message:
|
|
324
|
+
message: () => `[${props.requestContext.requestId}] Error while determining children: ${e.message}`,
|
|
270
325
|
});
|
|
271
326
|
if (e instanceof RowsLimitExceededError) {
|
|
272
327
|
return of(true);
|
|
273
328
|
}
|
|
274
329
|
throw e;
|
|
275
|
-
}),
|
|
330
|
+
}),
|
|
331
|
+
/* v8 ignore next -- @preserve */
|
|
332
|
+
log({ category: loggingCategory, message: (r) => `[${props.requestContext.requestId}] Result: ${r}` }));
|
|
276
333
|
}
|
|
277
334
|
getCachedObservableEntry(props) {
|
|
278
335
|
const loggingCategory = `${LOGGING_NAMESPACE}.QueryResultsCache`;
|
|
279
336
|
const { parentNode, ...restProps } = props;
|
|
280
337
|
const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);
|
|
281
338
|
if (cached) {
|
|
339
|
+
/* v8 ignore next -- @preserve */
|
|
282
340
|
doLog({
|
|
283
341
|
category: loggingCategory,
|
|
284
|
-
message:
|
|
342
|
+
message: () => `[${props.requestContext.requestId}] Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
|
|
285
343
|
});
|
|
286
344
|
return cached;
|
|
287
345
|
}
|
|
@@ -305,11 +363,15 @@ class IModelHierarchyProviderImpl {
|
|
|
305
363
|
parentNode: parentNonGroupingNode,
|
|
306
364
|
...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
|
|
307
365
|
};
|
|
308
|
-
const value = {
|
|
366
|
+
const value = {
|
|
367
|
+
observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps),
|
|
368
|
+
processingStatus: "none",
|
|
369
|
+
};
|
|
309
370
|
this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
|
|
371
|
+
/* v8 ignore next -- @preserve */
|
|
310
372
|
doLog({
|
|
311
373
|
category: loggingCategory,
|
|
312
|
-
message:
|
|
374
|
+
message: () => `[${props.requestContext.requestId}] Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,
|
|
313
375
|
});
|
|
314
376
|
return value;
|
|
315
377
|
}
|
|
@@ -344,18 +406,19 @@ class IModelHierarchyProviderImpl {
|
|
|
344
406
|
const timer = new StopWatch(undefined, true);
|
|
345
407
|
let error;
|
|
346
408
|
let nodesCount = 0;
|
|
409
|
+
/* v8 ignore next -- @preserve */
|
|
347
410
|
doLog({
|
|
348
411
|
category: loggingCategory,
|
|
349
|
-
message:
|
|
412
|
+
message: () => `[${requestContext.requestId}] Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
350
413
|
});
|
|
351
414
|
return eachValueFrom(this.getChildNodesObservables({ ...props, requestContext }).finalizedNodes.pipe(tap(() => ++nodesCount), catchError((e) => {
|
|
352
415
|
error = e;
|
|
353
416
|
throw e;
|
|
354
417
|
}), finalize(() => {
|
|
418
|
+
/* v8 ignore next -- @preserve */
|
|
355
419
|
doLog({
|
|
356
420
|
category: loggingCategory,
|
|
357
|
-
message:
|
|
358
|
-
/* c8 ignore next 3 */ error
|
|
421
|
+
message: () => error
|
|
359
422
|
? `[${requestContext.requestId}] Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
|
|
360
423
|
: `[${requestContext.requestId}] Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
|
|
361
424
|
});
|
|
@@ -368,7 +431,11 @@ class IModelHierarchyProviderImpl {
|
|
|
368
431
|
}
|
|
369
432
|
assert(!parentNode || HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));
|
|
370
433
|
// split the definitions based on whether they're for generic nodes or for instance nodes
|
|
371
|
-
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
|
|
434
|
+
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({
|
|
435
|
+
parentNode,
|
|
436
|
+
instanceFilter,
|
|
437
|
+
requestContext,
|
|
438
|
+
});
|
|
372
439
|
const [instanceDefs, genericDefs] = partition(hierarchyLevelDefinitions, (x) => HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
|
|
373
440
|
// query instance keys and a flag whether they should be hidden
|
|
374
441
|
const instanceKeys = instanceDefs.pipe(mergeMap(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription(of(def.query).pipe(mergeMap(async (query) => {
|
|
@@ -411,11 +478,7 @@ class IModelHierarchyProviderImpl {
|
|
|
411
478
|
mergeMap((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
|
|
412
479
|
type: "instances",
|
|
413
480
|
instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
|
|
414
|
-
}))))).pipe(map((key) => ({
|
|
415
|
-
key,
|
|
416
|
-
parentKeys: [],
|
|
417
|
-
label: "",
|
|
418
|
-
})));
|
|
481
|
+
}))))).pipe(map((key) => ({ key, parentKeys: [], label: "" })));
|
|
419
482
|
// merge visible instance keys from this level & the ones we get recursively requesting from deeper levels
|
|
420
483
|
return merge(visibleNodeInstanceKeys.pipe(map(({ key }) => key)), hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode, requestContext })))).pipe(takeUntil(this._dispose));
|
|
421
484
|
}
|
|
@@ -427,9 +490,10 @@ class IModelHierarchyProviderImpl {
|
|
|
427
490
|
const requestContext = { requestId: Guid.createValue() };
|
|
428
491
|
const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;
|
|
429
492
|
const timer = new StopWatch(undefined, true);
|
|
493
|
+
/* v8 ignore next -- @preserve */
|
|
430
494
|
doLog({
|
|
431
495
|
category: loggingCategory,
|
|
432
|
-
message:
|
|
496
|
+
message: () => `[${requestContext.requestId}] Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,
|
|
433
497
|
});
|
|
434
498
|
let error;
|
|
435
499
|
let keysCount = 0;
|
|
@@ -437,10 +501,10 @@ class IModelHierarchyProviderImpl {
|
|
|
437
501
|
error = e;
|
|
438
502
|
throw e;
|
|
439
503
|
}), finalize(() => {
|
|
504
|
+
/* v8 ignore next -- @preserve */
|
|
440
505
|
doLog({
|
|
441
506
|
category: loggingCategory,
|
|
442
|
-
message:
|
|
443
|
-
/* c8 ignore next 3 */ error
|
|
507
|
+
message: () => error
|
|
444
508
|
? `[${requestContext.requestId}] Error creating node instance keys for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`
|
|
445
509
|
: `[${requestContext.requestId}] Returned ${keysCount} instance keys for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,
|
|
446
510
|
});
|
|
@@ -457,13 +521,7 @@ function processNodes(processor, parentNode) {
|
|
|
457
521
|
return (nodes) => nodes.pipe(mergeMap((node) => processor({ node, parentNode })));
|
|
458
522
|
}
|
|
459
523
|
function applyLabelsFormatting(node, valueFormatter) {
|
|
460
|
-
return from(formatConcatenatedValue({
|
|
461
|
-
value: node.label,
|
|
462
|
-
valueFormatter,
|
|
463
|
-
})).pipe(map((label) => ({
|
|
464
|
-
...node,
|
|
465
|
-
label,
|
|
466
|
-
})));
|
|
524
|
+
return from(formatConcatenatedValue({ value: node.label, valueFormatter })).pipe(map((label) => ({ ...node, label })));
|
|
467
525
|
}
|
|
468
526
|
function createParentNodeKeysList(parentNode) {
|
|
469
527
|
if (!parentNode) {
|
|
@@ -475,30 +533,35 @@ function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
|
|
|
475
533
|
if (!targetInstanceKeys || !targetInstanceKeys.length) {
|
|
476
534
|
return query;
|
|
477
535
|
}
|
|
478
|
-
|
|
479
|
-
if (targetInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
|
|
536
|
+
if (Array.isArray(query.bindings)) {
|
|
480
537
|
return {
|
|
481
538
|
...query,
|
|
482
539
|
ecsql: `
|
|
483
540
|
SELECT *
|
|
484
541
|
FROM (${query.ecsql}) q
|
|
485
|
-
|
|
542
|
+
JOIN IdSet(?) targetInstanceKeys ON targetInstanceKeys.id = q.ECInstanceId
|
|
543
|
+
ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES
|
|
486
544
|
`,
|
|
487
|
-
bindings: [...
|
|
545
|
+
bindings: [...query.bindings, { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
|
|
488
546
|
};
|
|
489
547
|
}
|
|
490
|
-
|
|
548
|
+
const ecsqlVarTargetInstanceKeys = `${ECSQL_PREFIX}targetInstanceKeys`;
|
|
491
549
|
return {
|
|
492
550
|
...query,
|
|
493
551
|
ecsql: `
|
|
494
552
|
SELECT *
|
|
495
553
|
FROM (${query.ecsql}) q
|
|
496
|
-
|
|
554
|
+
JOIN IdSet(:${ecsqlVarTargetInstanceKeys}) targetInstanceKeys ON targetInstanceKeys.id = q.ECInstanceId
|
|
555
|
+
ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES
|
|
497
556
|
`,
|
|
498
|
-
bindings:
|
|
557
|
+
bindings: {
|
|
558
|
+
...query.bindings,
|
|
559
|
+
[ecsqlVarTargetInstanceKeys]: { type: "idset", value: targetInstanceKeys.map((k) => k.id) },
|
|
560
|
+
},
|
|
499
561
|
};
|
|
500
|
-
/* c8 ignore end */
|
|
501
562
|
}
|
|
563
|
+
// TODO: MISSING_COVERAGE
|
|
564
|
+
/* v8 ignore start */
|
|
502
565
|
function mergeNodes(source) {
|
|
503
566
|
return from(source).pipe(reduce((acc, input) => {
|
|
504
567
|
for (let i = 0; i < acc.length; ++i) {
|
|
@@ -509,11 +572,25 @@ function mergeNodes(source) {
|
|
|
509
572
|
// the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
|
|
510
573
|
// the node with higher `imodelAccessIndex` first
|
|
511
574
|
const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
|
|
512
|
-
? {
|
|
513
|
-
|
|
575
|
+
? {
|
|
576
|
+
imodelAccess: input.imodelAccess,
|
|
577
|
+
imodelAccessIndex: input.imodelAccessIndex,
|
|
578
|
+
primary: input.node,
|
|
579
|
+
secondary: acc[i].node,
|
|
580
|
+
}
|
|
581
|
+
: {
|
|
582
|
+
imodelAccess: acc[i].imodelAccess,
|
|
583
|
+
imodelAccessIndex: acc[i].imodelAccessIndex,
|
|
584
|
+
primary: acc[i].node,
|
|
585
|
+
secondary: input.node,
|
|
586
|
+
};
|
|
514
587
|
const merged = tryMergeNodes(candidates.primary, candidates.secondary);
|
|
515
588
|
if (merged) {
|
|
516
|
-
acc[i] = {
|
|
589
|
+
acc[i] = {
|
|
590
|
+
node: merged,
|
|
591
|
+
imodelAccess: candidates.imodelAccess,
|
|
592
|
+
imodelAccessIndex: candidates.imodelAccessIndex,
|
|
593
|
+
};
|
|
517
594
|
return acc;
|
|
518
595
|
}
|
|
519
596
|
}
|
|
@@ -557,10 +634,7 @@ function tryMergeInstanceNodes(primary, secondary) {
|
|
|
557
634
|
primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => InstanceKey.equals(lhsKey, rhsKey)))) {
|
|
558
635
|
return {
|
|
559
636
|
...primary,
|
|
560
|
-
key: {
|
|
561
|
-
type: "instances",
|
|
562
|
-
instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
|
|
563
|
-
},
|
|
637
|
+
key: { type: "instances", instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys) },
|
|
564
638
|
...mergeBaseNodeAttributes(primary, secondary),
|
|
565
639
|
};
|
|
566
640
|
}
|
|
@@ -568,14 +642,12 @@ function tryMergeInstanceNodes(primary, secondary) {
|
|
|
568
642
|
}
|
|
569
643
|
function tryMergeGenericNodes(primary, secondary) {
|
|
570
644
|
if (HierarchyNode.isGeneric(primary) && HierarchyNode.isGeneric(secondary) && primary.key.id === secondary.key.id) {
|
|
571
|
-
return {
|
|
572
|
-
...primary,
|
|
573
|
-
...mergeBaseNodeAttributes(primary, secondary),
|
|
574
|
-
};
|
|
645
|
+
return { ...primary, ...mergeBaseNodeAttributes(primary, secondary) };
|
|
575
646
|
}
|
|
576
647
|
return undefined;
|
|
577
648
|
}
|
|
578
649
|
function tryMergeNodes(primary, secondary) {
|
|
579
650
|
return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
|
|
580
651
|
}
|
|
652
|
+
/* v8 ignore stop */
|
|
581
653
|
//# sourceMappingURL=IModelHierarchyProvider.js.map
|