@itwin/presentation-hierarchies 2.0.0-alpha.5 → 2.0.0-alpha.7
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 +62 -0
- package/README.md +3 -3
- package/lib/cjs/hierarchies/HierarchyMerge.d.ts +19 -0
- package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -0
- package/lib/cjs/hierarchies/HierarchyMerge.js +43 -0
- package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -0
- package/lib/cjs/hierarchies/HierarchyNode.d.ts +14 -24
- package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNode.js +1 -21
- 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 +8 -8
- package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.d.ts +11 -29
- package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.js +0 -37
- package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchySearch.d.ts +167 -0
- package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -0
- package/lib/cjs/hierarchies/HierarchySearch.js +261 -0
- package/lib/cjs/hierarchies/HierarchySearch.js.map +1 -0
- package/lib/cjs/hierarchies/imodel/HierarchyCache.js +3 -3
- package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts +46 -11
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +155 -64
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/{FilteringHierarchyDefinition.d.ts → SearchHierarchyDefinition.d.ts} +12 -10
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
- package/lib/cjs/hierarchies/imodel/{FilteringHierarchyDefinition.js → SearchHierarchyDefinition.js} +88 -73
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +8 -1
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
- package/lib/cjs/hierarchies/internal/Common.d.ts +3 -0
- package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/Common.js +12 -1
- package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +2 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/cjs/presentation-hierarchies.d.ts +4 -3
- package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
- package/lib/cjs/presentation-hierarchies.js +7 -7
- package/lib/cjs/presentation-hierarchies.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyMerge.d.ts +19 -0
- package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -0
- package/lib/esm/hierarchies/HierarchyMerge.js +40 -0
- package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -0
- package/lib/esm/hierarchies/HierarchyNode.d.ts +14 -24
- package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyNode.js +0 -20
- 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 +9 -9
- package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.d.ts +11 -29
- package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.js +1 -36
- package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/HierarchySearch.d.ts +167 -0
- package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -0
- package/lib/esm/hierarchies/HierarchySearch.js +256 -0
- package/lib/esm/hierarchies/HierarchySearch.js.map +1 -0
- package/lib/esm/hierarchies/imodel/HierarchyCache.js +3 -3
- package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts +46 -11
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +157 -67
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/imodel/{FilteringHierarchyDefinition.d.ts → SearchHierarchyDefinition.d.ts} +12 -10
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
- package/lib/esm/hierarchies/imodel/{FilteringHierarchyDefinition.js → SearchHierarchyDefinition.js} +86 -71
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
- package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/TreeNodesReader.js +8 -1
- package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
- package/lib/esm/hierarchies/internal/Common.d.ts +3 -0
- package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/Common.js +11 -1
- package/lib/esm/hierarchies/internal/Common.js.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +3 -2
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/esm/presentation-hierarchies.d.ts +4 -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 +7 -7
- package/lib/cjs/hierarchies/HierarchyFiltering.d.ts +0 -136
- package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +0 -1
- package/lib/cjs/hierarchies/HierarchyFiltering.js +0 -249
- package/lib/cjs/hierarchies/HierarchyFiltering.js.map +0 -1
- package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
- package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
- package/lib/esm/hierarchies/HierarchyFiltering.d.ts +0 -136
- package/lib/esm/hierarchies/HierarchyFiltering.d.ts.map +0 -1
- package/lib/esm/hierarchies/HierarchyFiltering.js +0 -244
- package/lib/esm/hierarchies/HierarchyFiltering.js.map +0 -1
- package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +0 -1
- package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "../internal/DisposePolyfill.js";
|
|
2
2
|
import { ECClassHierarchyInspector, ECSchemaProvider, Event, IPrimitiveValueFormatter } from "@itwin/presentation-shared";
|
|
3
|
-
import { HierarchyFilteringPath } from "../HierarchyFiltering.js";
|
|
4
3
|
import { HierarchyProvider } from "../HierarchyProvider.js";
|
|
4
|
+
import { HierarchySearchPath } from "../HierarchySearch.js";
|
|
5
5
|
import { HierarchyDefinition } from "./IModelHierarchyDefinition.js";
|
|
6
6
|
import { LimitingECSqlQueryExecutor } from "./LimitingECSqlQueryExecutor.js";
|
|
7
7
|
/**
|
|
@@ -37,7 +37,10 @@ interface IModelHierarchyProviderProps {
|
|
|
37
37
|
* @see `ECClassHierarchyInspector`
|
|
38
38
|
*/
|
|
39
39
|
imodelAccess: IModelAccess;
|
|
40
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* An event that is raised when iModel data, that may affect the hierarchy, changes. The created provider
|
|
42
|
+
* subscribes to the event to know that it needs to reload the data, and unsubscribes on disposal.
|
|
43
|
+
*/
|
|
41
44
|
imodelChanged?: Event<() => void>;
|
|
42
45
|
/**
|
|
43
46
|
* A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The
|
|
@@ -59,22 +62,54 @@ interface IModelHierarchyProviderProps {
|
|
|
59
62
|
* by calling `setFormatter` on the provider instance.
|
|
60
63
|
*/
|
|
61
64
|
formatter?: IPrimitiveValueFormatter;
|
|
62
|
-
/** Props for
|
|
63
|
-
|
|
65
|
+
/** Props for search the hierarchy. */
|
|
66
|
+
search?: {
|
|
64
67
|
/** A list of node identifiers from root to target node. */
|
|
65
|
-
paths:
|
|
68
|
+
paths: HierarchySearchPath[];
|
|
66
69
|
};
|
|
67
70
|
}
|
|
68
71
|
/**
|
|
69
|
-
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and
|
|
72
|
+
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and
|
|
70
73
|
* a hierarchy definition, which defines each hierarchy level through ECSQL queries.
|
|
71
74
|
*
|
|
72
75
|
* @public
|
|
73
76
|
*/
|
|
74
|
-
export declare function createIModelHierarchyProvider(props: IModelHierarchyProviderProps): HierarchyProvider &
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
export declare function createIModelHierarchyProvider(props: IModelHierarchyProviderProps): HierarchyProvider & Disposable;
|
|
78
|
+
/**
|
|
79
|
+
* Props for `createMergedIModelHierarchyProvider`.
|
|
80
|
+
* @alpha
|
|
81
|
+
*/
|
|
82
|
+
interface MergedIModelHierarchyProviderProps extends Omit<IModelHierarchyProviderProps, "imodelAccess" | "imodelChanged"> {
|
|
83
|
+
/**
|
|
84
|
+
* A list of iModels to create merged hierarchy for.
|
|
85
|
+
*
|
|
86
|
+
* **Warning:** These **must** all be different versions of the same iModel, ordered from the earliest to the
|
|
87
|
+
* latest version. Not obeying this rule may result in undefined behavior.
|
|
88
|
+
*/
|
|
89
|
+
imodels: Array<{
|
|
90
|
+
/**
|
|
91
|
+
* An object that provides access to iModel's data and metadata.
|
|
92
|
+
*
|
|
93
|
+
* @see `ECSchemaProvider`
|
|
94
|
+
* @see `LimitingECSqlQueryExecutor`
|
|
95
|
+
* @see `ECClassHierarchyInspector`
|
|
96
|
+
*/
|
|
97
|
+
imodelAccess: IModelAccess;
|
|
98
|
+
/**
|
|
99
|
+
* An event that is raised when iModel data, that may affect the hierarchy, changes. The created provider
|
|
100
|
+
* subscribes to the event to know that it needs to reload the data, and unsubscribes on disposal.
|
|
101
|
+
*/
|
|
102
|
+
imodelChanged?: Event<() => void>;
|
|
103
|
+
}>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
|
|
107
|
+
* and a hierarchy definition, which defines each hierarchy level through ECSQL queries.
|
|
108
|
+
*
|
|
109
|
+
* **Warning:** This is an experimental API that **should not be used in production**.
|
|
110
|
+
*
|
|
111
|
+
* @alpha
|
|
112
|
+
*/
|
|
113
|
+
export declare function createMergedIModelHierarchyProvider(props: MergedIModelHierarchyProviderProps): HierarchyProvider & Disposable;
|
|
79
114
|
export {};
|
|
80
115
|
//# sourceMappingURL=IModelHierarchyProvider.d.ts.map
|
|
@@ -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;AA4BxC,OAAO,EAGL,yBAAyB,EACzB,gBAAgB,EAGhB,KAAK,EAIL,wBAAwB,EAEzB,MAAM,4BAA4B,CAAC;AAIpC,OAAO,EAA0B,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAiB5D,OAAO,EAGL,mBAAmB,EAGpB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAgB7E;;;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,sCAAsC;IACtC,MAAM,CAAC,EAAE;QACP,2DAA2D;QAC3D,KAAK,EAAE,mBAAmB,EAAE,CAAC;KAC9B,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,4BAA4B,GAAG,iBAAiB,GAAG,UAAU,CAGjH;AAED;;;GAGG;AACH,UAAU,kCAAmC,SAAQ,IAAI,CAAC,4BAA4B,EAAE,cAAc,GAAG,eAAe,CAAC;IACvH;;;;;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;KACnC,CAAC,CAAC;CACJ;AAED;;;;;;;GAOG;AACH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,kCAAkC,GAAG,iBAAiB,GAAG,UAAU,CAE7H"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.createIModelHierarchyProvider = createIModelHierarchyProvider;
|
|
8
|
+
exports.createMergedIModelHierarchyProvider = createMergedIModelHierarchyProvider;
|
|
8
9
|
require("../internal/DisposePolyfill.js");
|
|
9
10
|
const rxjs_1 = require("rxjs");
|
|
10
11
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
@@ -21,7 +22,6 @@ const ShareReplayWithErrors_js_1 = require("../internal/operators/ShareReplayWit
|
|
|
21
22
|
const Sorting_js_1 = require("../internal/operators/Sorting.js");
|
|
22
23
|
const RxjsHierarchyDefinition_js_1 = require("../internal/RxjsHierarchyDefinition.js");
|
|
23
24
|
const SubscriptionScheduler_js_1 = require("../internal/SubscriptionScheduler.js");
|
|
24
|
-
const FilteringHierarchyDefinition_js_1 = require("./FilteringHierarchyDefinition.js");
|
|
25
25
|
const HierarchyCache_js_1 = require("./HierarchyCache.js");
|
|
26
26
|
const IModelHierarchyDefinition_js_1 = require("./IModelHierarchyDefinition.js");
|
|
27
27
|
const NodeSelectQueryFactory_js_1 = require("./NodeSelectQueryFactory.js");
|
|
@@ -29,6 +29,7 @@ const DetermineChildren_js_1 = require("./operators/DetermineChildren.js");
|
|
|
29
29
|
const Grouping_js_1 = require("./operators/Grouping.js");
|
|
30
30
|
const HideIfNoChildren_js_1 = require("./operators/HideIfNoChildren.js");
|
|
31
31
|
const HideNodesInHierarchy_js_1 = require("./operators/HideNodesInHierarchy.js");
|
|
32
|
+
const SearchHierarchyDefinition_js_1 = require("./SearchHierarchyDefinition.js");
|
|
32
33
|
const TreeNodesReader_js_1 = require("./TreeNodesReader.js");
|
|
33
34
|
const LOGGING_NAMESPACE = `${Common_js_1.LOGGING_NAMESPACE}.IModelHierarchyProvider`;
|
|
34
35
|
const LOGGING_NAMESPACE_INTERNAL = `${Common_js_1.LOGGING_NAMESPACE_INTERNAL}.IModelHierarchyProvider`;
|
|
@@ -36,37 +37,57 @@ const LOGGING_NAMESPACE_PERFORMANCE = `${Common_js_1.LOGGING_NAMESPACE_PERFORMAN
|
|
|
36
37
|
const DEFAULT_QUERY_CONCURRENCY = 10;
|
|
37
38
|
const DEFAULT_QUERY_CACHE_SIZE = 1;
|
|
38
39
|
/**
|
|
39
|
-
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and
|
|
40
|
+
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on given the iModel and
|
|
40
41
|
* a hierarchy definition, which defines each hierarchy level through ECSQL queries.
|
|
41
42
|
*
|
|
42
43
|
* @public
|
|
43
44
|
*/
|
|
44
45
|
function createIModelHierarchyProvider(props) {
|
|
46
|
+
const { imodelAccess, imodelChanged, ...restProps } = props;
|
|
47
|
+
return createMergedIModelHierarchyProvider({ ...restProps, imodels: [{ imodelAccess, imodelChanged }] });
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Creates an instance of `HierarchyProvider` that creates a hierarchy based on multiple version of **the same** iModel
|
|
51
|
+
* and a hierarchy definition, which defines each hierarchy level through ECSQL queries.
|
|
52
|
+
*
|
|
53
|
+
* **Warning:** This is an experimental API that **should not be used in production**.
|
|
54
|
+
*
|
|
55
|
+
* @alpha
|
|
56
|
+
*/
|
|
57
|
+
function createMergedIModelHierarchyProvider(props) {
|
|
45
58
|
return new IModelHierarchyProviderImpl(props);
|
|
46
59
|
}
|
|
47
60
|
class IModelHierarchyProviderImpl {
|
|
48
|
-
|
|
61
|
+
_imodels;
|
|
49
62
|
_hierarchyChanged;
|
|
50
63
|
_valuesFormatter;
|
|
51
64
|
_sourceHierarchyDefinition;
|
|
52
65
|
_activeHierarchyDefinition;
|
|
53
66
|
_localizedStrings;
|
|
54
|
-
|
|
67
|
+
_queryConcurrency;
|
|
68
|
+
_querySchedulers;
|
|
55
69
|
_nodesCache;
|
|
56
70
|
_unsubscribe;
|
|
57
71
|
_dispose = new rxjs_1.Subject();
|
|
58
72
|
#componentId;
|
|
59
73
|
#componentName;
|
|
74
|
+
#sourceName;
|
|
60
75
|
constructor(props) {
|
|
76
|
+
if (props.imodels.length === 0) {
|
|
77
|
+
throw new Error(`Creating an iModel hierarchy provider requires at least one iModel.`);
|
|
78
|
+
}
|
|
61
79
|
this.#componentId = core_bentley_1.Guid.createValue();
|
|
62
80
|
this.#componentName = "IModelHierarchyProviderImpl";
|
|
63
|
-
|
|
81
|
+
/* c8 ignore next */
|
|
82
|
+
this.#sourceName = props.sourceName ?? `${this.#componentName}:${this.#componentId}`;
|
|
83
|
+
this._imodels = props.imodels;
|
|
64
84
|
this._hierarchyChanged = new core_bentley_1.BeEvent();
|
|
65
85
|
this._activeHierarchyDefinition = this._sourceHierarchyDefinition = (0, RxjsHierarchyDefinition_js_1.getRxjsHierarchyDefinition)(props.hierarchyDefinition);
|
|
66
86
|
this._valuesFormatter = props?.formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
|
|
67
87
|
this._localizedStrings = { other: "Other", unspecified: "Not specified", ...props?.localizedStrings };
|
|
68
|
-
this.
|
|
69
|
-
this.
|
|
88
|
+
this._queryConcurrency = props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY;
|
|
89
|
+
this._querySchedulers = new Map();
|
|
90
|
+
this.setHierarchySearch(props.search);
|
|
70
91
|
const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;
|
|
71
92
|
if (queryCacheSize !== 0) {
|
|
72
93
|
this._nodesCache = new HierarchyCache_js_1.HierarchyCache({
|
|
@@ -75,11 +96,18 @@ class IModelHierarchyProviderImpl {
|
|
|
75
96
|
variationsCount: 1,
|
|
76
97
|
});
|
|
77
98
|
}
|
|
78
|
-
|
|
79
|
-
|
|
99
|
+
const imodelChangeSubscription = (0, rxjs_1.from)(this._imodels)
|
|
100
|
+
.pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelChanged }) => imodelChanged
|
|
101
|
+
? (0, rxjs_1.fromEventPattern)((handler) => imodelChanged.addListener(handler), (handler) => imodelChanged.removeListener(handler), () => imodelAccess)
|
|
102
|
+
: rxjs_1.EMPTY))
|
|
103
|
+
.subscribe(({ imodelKey }) => {
|
|
104
|
+
this.invalidateHierarchyCache(`Data source changed: "${imodelKey}"`);
|
|
80
105
|
this._dispose.next();
|
|
81
106
|
this._hierarchyChanged.raiseEvent();
|
|
82
107
|
});
|
|
108
|
+
this._unsubscribe = () => {
|
|
109
|
+
imodelChangeSubscription.unsubscribe();
|
|
110
|
+
};
|
|
83
111
|
}
|
|
84
112
|
[Symbol.dispose]() {
|
|
85
113
|
this._dispose.next();
|
|
@@ -92,6 +120,17 @@ class IModelHierarchyProviderImpl {
|
|
|
92
120
|
get hierarchyChanged() {
|
|
93
121
|
return this._hierarchyChanged;
|
|
94
122
|
}
|
|
123
|
+
getQueryScheduler(imodelKey) {
|
|
124
|
+
let scheduler = this._querySchedulers.get(imodelKey);
|
|
125
|
+
if (!scheduler) {
|
|
126
|
+
scheduler = new SubscriptionScheduler_js_1.SubscriptionScheduler(this._queryConcurrency);
|
|
127
|
+
this._querySchedulers.set(imodelKey, scheduler);
|
|
128
|
+
}
|
|
129
|
+
return scheduler;
|
|
130
|
+
}
|
|
131
|
+
getPrimaryIModelAccess() {
|
|
132
|
+
return this._imodels[this._imodels.length - 1].imodelAccess;
|
|
133
|
+
}
|
|
95
134
|
invalidateHierarchyCache(reason) {
|
|
96
135
|
(0, LoggingUtils_js_1.doLog)({
|
|
97
136
|
category: `${LOGGING_NAMESPACE}.Events`,
|
|
@@ -107,23 +146,24 @@ class IModelHierarchyProviderImpl {
|
|
|
107
146
|
this._valuesFormatter = formatter ?? (0, presentation_shared_1.createDefaultValueFormatter)();
|
|
108
147
|
this._hierarchyChanged.raiseEvent({ formatterChange: { newFormatter: this._valuesFormatter } });
|
|
109
148
|
}
|
|
110
|
-
|
|
149
|
+
setHierarchySearch(props) {
|
|
111
150
|
if (!props) {
|
|
112
151
|
if (this._sourceHierarchyDefinition !== this._activeHierarchyDefinition) {
|
|
113
152
|
this._activeHierarchyDefinition = this._sourceHierarchyDefinition;
|
|
114
|
-
this.invalidateHierarchyCache("Hierarchy
|
|
153
|
+
this.invalidateHierarchyCache("Hierarchy search reset");
|
|
115
154
|
}
|
|
116
|
-
this._hierarchyChanged.raiseEvent({
|
|
155
|
+
this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: undefined } });
|
|
117
156
|
return;
|
|
118
157
|
}
|
|
119
|
-
this._activeHierarchyDefinition = new
|
|
120
|
-
imodelAccess: this.
|
|
158
|
+
this._activeHierarchyDefinition = new SearchHierarchyDefinition_js_1.SearchHierarchyDefinition({
|
|
159
|
+
imodelAccess: this.getPrimaryIModelAccess(),
|
|
121
160
|
source: this._sourceHierarchyDefinition,
|
|
122
|
-
|
|
161
|
+
sourceName: this.#sourceName,
|
|
162
|
+
targetPaths: props.paths,
|
|
123
163
|
});
|
|
124
|
-
this.invalidateHierarchyCache("Hierarchy
|
|
164
|
+
this.invalidateHierarchyCache("Hierarchy search set");
|
|
125
165
|
this._dispose.next();
|
|
126
|
-
this._hierarchyChanged.raiseEvent({
|
|
166
|
+
this._hierarchyChanged.raiseEvent({ searchChange: { newSearch: props } });
|
|
127
167
|
}
|
|
128
168
|
onGroupingNodeCreated(groupingNode, props) {
|
|
129
169
|
this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: (0, rxjs_1.from)(groupingNode.children), processingStatus: "pre-processed" });
|
|
@@ -134,44 +174,51 @@ class IModelHierarchyProviderImpl {
|
|
|
134
174
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
135
175
|
message: /* c8 ignore next */ () => `[${requestContext.requestId}] Requesting hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
|
|
136
176
|
});
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
|
|
142
|
-
parentNode = {
|
|
143
|
-
...parentNode,
|
|
144
|
-
key: {
|
|
145
|
-
...parentNode.key,
|
|
146
|
-
instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === this._imodelAccess.imodelKey),
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
(0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
|
|
150
|
-
if (parentNode.key.instanceKeys.length === 0) {
|
|
177
|
+
return (0, rxjs_1.from)(this._imodels).pipe((0, rxjs_1.mergeMap)(({ imodelAccess }, imodelAccessIndex) => {
|
|
178
|
+
let parentNode = props.parentNode;
|
|
179
|
+
if (parentNode && HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) && parentNode.key.source && parentNode.key.source !== this.#sourceName) {
|
|
151
180
|
return rxjs_1.EMPTY;
|
|
152
181
|
}
|
|
153
|
-
|
|
154
|
-
|
|
182
|
+
if (parentNode && HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode)) {
|
|
183
|
+
parentNode = {
|
|
184
|
+
...parentNode,
|
|
185
|
+
key: {
|
|
186
|
+
...parentNode.key,
|
|
187
|
+
instanceKeys: parentNode.key.instanceKeys.filter((ik) => !ik.imodelKey || ik.imodelKey === imodelAccess.imodelKey),
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
(0, core_bentley_1.assert)(HierarchyNodeKey_js_1.HierarchyNodeKey.isInstances(parentNode.key));
|
|
191
|
+
if (parentNode.key.instanceKeys.length === 0) {
|
|
192
|
+
return rxjs_1.EMPTY;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return this._activeHierarchyDefinition.defineHierarchyLevel({ ...defineHierarchyLevelProps, parentNode }).pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)(
|
|
196
|
+
/* Using `as` to work around TS not understanding that `{ x: A, y: B | C }` is the same as `{ x: A } & ({ y: B } | { y: C })` */
|
|
197
|
+
(hierarchyNodesDefinition) => ({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition })));
|
|
198
|
+
}), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
|
|
155
199
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
156
200
|
message: /* c8 ignore next */ () => `[${requestContext.requestId}] Received all hierarchy level definitions for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
|
|
157
201
|
})));
|
|
158
202
|
}
|
|
159
203
|
createSourceNodesObservable(props) {
|
|
160
204
|
// pipe definitions to nodes and put "share replay" on it
|
|
161
|
-
return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)((def) => {
|
|
205
|
+
return this.createHierarchyLevelDefinitionsObservable(props).pipe((0, rxjs_1.mergeMap)(({ imodelAccess, imodelAccessIndex, hierarchyNodesDefinition: def }) => (0, rxjs_1.defer)(() => {
|
|
162
206
|
if (IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode(def)) {
|
|
163
|
-
return (0, rxjs_1.of)({
|
|
207
|
+
return (0, rxjs_1.of)({
|
|
208
|
+
...def.node,
|
|
209
|
+
key: { type: "generic", id: def.node.key, source: this.#sourceName },
|
|
210
|
+
});
|
|
164
211
|
}
|
|
165
|
-
return this.
|
|
166
|
-
queryExecutor:
|
|
212
|
+
return this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.map)((query) => createInstanceKeysFilteredQuery(query, props.targetInstanceKeys)), (0, rxjs_1.mergeMap)((query) => (0, TreeNodesReader_js_1.readNodes)({
|
|
213
|
+
queryExecutor: imodelAccess,
|
|
167
214
|
query,
|
|
168
215
|
limit: props.hierarchyLevelSizeLimit,
|
|
169
216
|
parser: this._activeHierarchyDefinition.parseNode ? (row) => this._activeHierarchyDefinition.parseNode(row, props.parentNode) : undefined,
|
|
170
217
|
})), (0, rxjs_1.map)((node) => ({
|
|
171
218
|
...node,
|
|
172
|
-
key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey:
|
|
219
|
+
key: { ...node.key, instanceKeys: node.key.instanceKeys.map((key) => ({ ...key, imodelKey: imodelAccess.imodelKey })) },
|
|
173
220
|
}))));
|
|
174
|
-
}), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
|
|
221
|
+
}).pipe((0, rxjs_1.map)((node) => ({ imodelAccess, imodelAccessIndex, node })))), mergeNodes, (0, rxjs_1.map)(({ node }) => node), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
|
|
175
222
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
176
223
|
message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Read all child nodes ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
|
|
177
224
|
})), (0, ShareReplayWithErrors_js_1.shareReplayWithErrors)());
|
|
@@ -185,6 +232,7 @@ class IModelHierarchyProviderImpl {
|
|
|
185
232
|
// format `ConcatenatedValue` labels into string labels
|
|
186
233
|
(0, rxjs_1.mergeMap)((node) => applyLabelsFormatting(node, this._valuesFormatter)),
|
|
187
234
|
// we have `ProcessedHierarchyNode` from here
|
|
235
|
+
// let consumers step-in
|
|
188
236
|
preProcessNodes(this._activeHierarchyDefinition),
|
|
189
237
|
// process hiding
|
|
190
238
|
(0, HideIfNoChildren_js_1.createHideIfNoChildrenOperator)((n) => this.getChildNodesObservables({ parentNode: n, requestContext: props.requestContext }).hasNodes), (0, HideNodesInHierarchy_js_1.createHideNodesInHierarchyOperator)(
|
|
@@ -195,7 +243,7 @@ class IModelHierarchyProviderImpl {
|
|
|
195
243
|
})));
|
|
196
244
|
}
|
|
197
245
|
createProcessedNodesObservable(preprocessedNodesObservable, props) {
|
|
198
|
-
return preprocessedNodesObservable.pipe((0, Grouping_js_1.createGroupingOperator)(this.
|
|
246
|
+
return preprocessedNodesObservable.pipe((0, Grouping_js_1.createGroupingOperator)(this.getPrimaryIModelAccess(), props.parentNode, this._valuesFormatter, this._localizedStrings, undefined, (gn) => this.onGroupingNodeCreated(gn, props)), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
|
|
199
247
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
200
248
|
message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished grouping child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
|
|
201
249
|
})));
|
|
@@ -205,9 +253,7 @@ class IModelHierarchyProviderImpl {
|
|
|
205
253
|
if ("processingParams" in n) {
|
|
206
254
|
delete n.processingParams;
|
|
207
255
|
}
|
|
208
|
-
return
|
|
209
|
-
children: (0, Common_js_1.hasChildren)(n),
|
|
210
|
-
});
|
|
256
|
+
return { ...n, children: (0, Common_js_1.hasChildren)(n) };
|
|
211
257
|
}), (0, rxjs_1.takeUntil)(this._dispose), (0, rxjs_1.finalize)(() => (0, LoggingUtils_js_1.doLog)({
|
|
212
258
|
category: LOGGING_NAMESPACE_PERFORMANCE,
|
|
213
259
|
message: /* c8 ignore next */ () => `[${props.requestContext.requestId}] Finished finalizing child nodes for ${(0, Common_js_1.createNodeIdentifierForLogging)(props.parentNode)}`,
|
|
@@ -241,13 +287,13 @@ class IModelHierarchyProviderImpl {
|
|
|
241
287
|
return cached;
|
|
242
288
|
}
|
|
243
289
|
// if we don't find an entry for a grouping node, we load its instances by getting a query and applying
|
|
244
|
-
// a
|
|
245
|
-
let
|
|
290
|
+
// a search based on grouped instance keys
|
|
291
|
+
let targetInstanceKeys;
|
|
246
292
|
let parentNonGroupingNode;
|
|
247
293
|
if (parentNode) {
|
|
248
294
|
if (HierarchyNode_js_1.HierarchyNode.isGroupingNode(parentNode)) {
|
|
249
295
|
parentNonGroupingNode = parentNode.nonGroupingAncestor;
|
|
250
|
-
|
|
296
|
+
targetInstanceKeys = parentNode.groupedInstanceKeys;
|
|
251
297
|
}
|
|
252
298
|
else {
|
|
253
299
|
// not sure why type checker doesn't pick this up
|
|
@@ -258,7 +304,7 @@ class IModelHierarchyProviderImpl {
|
|
|
258
304
|
const nonGroupingNodeChildrenRequestProps = {
|
|
259
305
|
...restProps,
|
|
260
306
|
parentNode: parentNonGroupingNode,
|
|
261
|
-
...(
|
|
307
|
+
...(targetInstanceKeys ? { targetInstanceKeys } : undefined),
|
|
262
308
|
};
|
|
263
309
|
const value = { observable: this.createSourceNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: "none" };
|
|
264
310
|
this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);
|
|
@@ -322,11 +368,11 @@ class IModelHierarchyProviderImpl {
|
|
|
322
368
|
return (0, rxjs_1.from)(parentNode.groupedInstanceKeys);
|
|
323
369
|
}
|
|
324
370
|
(0, core_bentley_1.assert)(!parentNode || HierarchyNode_js_1.HierarchyNode.isGeneric(parentNode) || HierarchyNode_js_1.HierarchyNode.isInstancesNode(parentNode));
|
|
325
|
-
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
|
|
326
371
|
// split the definitions based on whether they're for generic nodes or for instance nodes
|
|
327
|
-
const
|
|
372
|
+
const hierarchyLevelDefinitions = this.createHierarchyLevelDefinitionsObservable({ parentNode, instanceFilter, requestContext });
|
|
373
|
+
const [instanceDefs, genericDefs] = (0, Partition_js_1.partition)(hierarchyLevelDefinitions, (x) => IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isInstanceNodesQuery(x.hierarchyNodesDefinition));
|
|
328
374
|
// query instance keys and a flag whether they should be hidden
|
|
329
|
-
const instanceKeys = instanceDefs.pipe((0, rxjs_1.mergeMap)((def) => this.
|
|
375
|
+
const instanceKeys = instanceDefs.pipe((0, rxjs_1.mergeMap)(({ imodelAccess, hierarchyNodesDefinition: def }) => this.getQueryScheduler(imodelAccess.imodelKey).scheduleSubscription((0, rxjs_1.of)(def.query).pipe((0, rxjs_1.mergeMap)(async (query) => {
|
|
330
376
|
const ecsql = `
|
|
331
377
|
SELECT
|
|
332
378
|
${NodeSelectQueryFactory_js_1.NodeSelectClauseColumnNames.FullClassName},
|
|
@@ -336,7 +382,7 @@ class IModelHierarchyProviderImpl {
|
|
|
336
382
|
${query.ecsql}
|
|
337
383
|
)
|
|
338
384
|
`;
|
|
339
|
-
const reader =
|
|
385
|
+
const reader = imodelAccess.createQueryReader({ ...query, ecsql }, {
|
|
340
386
|
rowFormat: "Indexes",
|
|
341
387
|
limit: hierarchyLevelSizeLimit,
|
|
342
388
|
restartToken: `${this.#componentName}/${this.#componentId}/node-instance-keys/${core_bentley_1.Guid.createValue()}`,
|
|
@@ -345,7 +391,7 @@ class IModelHierarchyProviderImpl {
|
|
|
345
391
|
key: {
|
|
346
392
|
className: (0, presentation_shared_1.normalizeFullClassName)(row[0]),
|
|
347
393
|
id: row[1],
|
|
348
|
-
imodelKey:
|
|
394
|
+
imodelKey: imodelAccess.imodelKey,
|
|
349
395
|
},
|
|
350
396
|
hide: !!row[2],
|
|
351
397
|
})));
|
|
@@ -355,17 +401,17 @@ class IModelHierarchyProviderImpl {
|
|
|
355
401
|
// hidden items' handling:
|
|
356
402
|
// - if a generic node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,
|
|
357
403
|
// - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`
|
|
358
|
-
const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)((
|
|
404
|
+
const hiddenParentNodes = (0, rxjs_1.merge)(genericDefs.pipe((0, rxjs_1.filter)(({ hierarchyNodesDefinition }) => !!hierarchyNodesDefinition.node.processingParams?.hideInHierarchy), (0, rxjs_1.map)(({ hierarchyNodesDefinition }) => ({
|
|
359
405
|
type: "generic",
|
|
360
|
-
id:
|
|
361
|
-
source: this
|
|
406
|
+
id: hierarchyNodesDefinition.node.key,
|
|
407
|
+
source: this.#sourceName,
|
|
362
408
|
}))), hiddenNodeInstanceKeys.pipe(
|
|
363
409
|
// first merge all keys by class
|
|
364
|
-
(0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key
|
|
410
|
+
(0, ReduceToMergeMap_js_1.reduceToMergeMapList)(({ key }) => key.className, ({ key }) => key),
|
|
365
411
|
// then, for each class, create an instance key
|
|
366
|
-
(0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className,
|
|
412
|
+
(0, rxjs_1.mergeMap)((mergedMap) => [...mergedMap.entries()].map(([className, keys]) => ({
|
|
367
413
|
type: "instances",
|
|
368
|
-
instanceKeys:
|
|
414
|
+
instanceKeys: keys.map(({ id, imodelKey }) => ({ className, id, imodelKey })),
|
|
369
415
|
}))))).pipe((0, rxjs_1.map)((key) => ({
|
|
370
416
|
key,
|
|
371
417
|
parentKeys: [],
|
|
@@ -426,20 +472,20 @@ function createParentNodeKeysList(parentNode) {
|
|
|
426
472
|
}
|
|
427
473
|
return [...parentNode.parentKeys, parentNode.key];
|
|
428
474
|
}
|
|
429
|
-
function
|
|
430
|
-
if (!
|
|
475
|
+
function createInstanceKeysFilteredQuery(query, targetInstanceKeys) {
|
|
476
|
+
if (!targetInstanceKeys || !targetInstanceKeys.length) {
|
|
431
477
|
return query;
|
|
432
478
|
}
|
|
433
479
|
const MAX_ALLOWED_BINDINGS = 1000;
|
|
434
|
-
if (
|
|
480
|
+
if (targetInstanceKeys.length < MAX_ALLOWED_BINDINGS) {
|
|
435
481
|
return {
|
|
436
482
|
...query,
|
|
437
483
|
ecsql: `
|
|
438
484
|
SELECT *
|
|
439
485
|
FROM (${query.ecsql}) q
|
|
440
|
-
WHERE q.ECInstanceId IN (${
|
|
486
|
+
WHERE q.ECInstanceId IN (${targetInstanceKeys.map(() => "?").join(",")})
|
|
441
487
|
`,
|
|
442
|
-
bindings: [...(query.bindings ?? []), ...
|
|
488
|
+
bindings: [...(query.bindings ?? []), ...targetInstanceKeys.map((k) => ({ type: "id", value: k.id }))],
|
|
443
489
|
};
|
|
444
490
|
}
|
|
445
491
|
/* c8 ignore start */
|
|
@@ -450,8 +496,53 @@ function filterQueryByInstanceKeys(query, filteredInstanceKeys) {
|
|
|
450
496
|
FROM (${query.ecsql}) q
|
|
451
497
|
WHERE InVirtualSet(?, q.ECInstanceId)
|
|
452
498
|
`,
|
|
453
|
-
bindings: [...(query.bindings ?? []), { type: "idset", value:
|
|
499
|
+
bindings: [...(query.bindings ?? []), { type: "idset", value: targetInstanceKeys.map((k) => k.id) }],
|
|
454
500
|
};
|
|
455
501
|
/* c8 ignore end */
|
|
456
502
|
}
|
|
503
|
+
function mergeNodes(source) {
|
|
504
|
+
return (0, rxjs_1.from)(source).pipe((0, rxjs_1.reduce)((acc, input) => {
|
|
505
|
+
for (let i = 0; i < acc.length; ++i) {
|
|
506
|
+
if (input.imodelAccess === acc[i].imodelAccess) {
|
|
507
|
+
// don't attempt to merge nodes if they come from the same provider
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
// the first argument for `tryMergeNodes` acts as the primary data source, so we have to make sure we pass
|
|
511
|
+
// the node with higher `imodelAccessIndex` first
|
|
512
|
+
const candidates = input.imodelAccessIndex > acc[i].imodelAccessIndex
|
|
513
|
+
? { imodelAccess: input.imodelAccess, imodelAccessIndex: input.imodelAccessIndex, primary: input.node, secondary: acc[i].node }
|
|
514
|
+
: { imodelAccess: acc[i].imodelAccess, imodelAccessIndex: acc[i].imodelAccessIndex, primary: acc[i].node, secondary: input.node };
|
|
515
|
+
const merged = tryMergeNodes(candidates.primary, candidates.secondary);
|
|
516
|
+
if (merged) {
|
|
517
|
+
acc[i] = { ...acc[i], node: merged, imodelAccess: candidates.imodelAccess, imodelAccessIndex: candidates.imodelAccessIndex };
|
|
518
|
+
return acc;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
acc.push(input);
|
|
522
|
+
return acc;
|
|
523
|
+
}, new Array()), (0, rxjs_1.mergeAll)());
|
|
524
|
+
}
|
|
525
|
+
function tryMergeInstanceNodes(primary, secondary) {
|
|
526
|
+
if (HierarchyNode_js_1.HierarchyNode.isInstancesNode(primary) &&
|
|
527
|
+
HierarchyNode_js_1.HierarchyNode.isInstancesNode(secondary) &&
|
|
528
|
+
primary.key.instanceKeys.some((lhsKey) => secondary.key.instanceKeys.some((rhsKey) => presentation_shared_1.InstanceKey.equals(lhsKey, rhsKey)))) {
|
|
529
|
+
return {
|
|
530
|
+
...primary,
|
|
531
|
+
key: {
|
|
532
|
+
type: "instances",
|
|
533
|
+
instanceKeys: primary.key.instanceKeys.concat(secondary.key.instanceKeys),
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
return undefined;
|
|
538
|
+
}
|
|
539
|
+
function tryMergeGenericNodes(primary, secondary) {
|
|
540
|
+
if (HierarchyNode_js_1.HierarchyNode.isGeneric(primary) && HierarchyNode_js_1.HierarchyNode.isGeneric(secondary) && primary.key.type === secondary.key.type) {
|
|
541
|
+
return primary;
|
|
542
|
+
}
|
|
543
|
+
return undefined;
|
|
544
|
+
}
|
|
545
|
+
function tryMergeNodes(primary, secondary) {
|
|
546
|
+
return tryMergeInstanceNodes(primary, secondary) ?? tryMergeGenericNodes(primary, secondary) ?? undefined;
|
|
547
|
+
}
|
|
457
548
|
//# sourceMappingURL=IModelHierarchyProvider.js.map
|