@itwin/presentation-hierarchies 2.0.0-alpha.6 → 2.0.0-alpha.8
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 +66 -0
- package/README.md +3 -3
- package/lib/cjs/hierarchies/HierarchyMerge.js +1 -1
- package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -1
- 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/HierarchyProvider.d.ts +11 -11
- package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/{HierarchyFiltering.d.ts → HierarchySearch.d.ts} +42 -52
- package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -0
- package/lib/cjs/hierarchies/{HierarchyFiltering.js → HierarchySearch.js} +69 -85
- 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/IModelHierarchyDefinition.d.ts +12 -3
- 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/IModelHierarchyProvider.d.ts +4 -4
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +52 -24
- package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +1 -1
- package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
- package/lib/cjs/hierarchies/imodel/{FilteringHierarchyDefinition.d.ts → SearchHierarchyDefinition.d.ts} +11 -13
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
- package/lib/cjs/hierarchies/imodel/{FilteringHierarchyDefinition.js → SearchHierarchyDefinition.js} +101 -105
- package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts +4 -6
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +6 -5
- package/lib/cjs/hierarchies/imodel/TreeNodesReader.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 +6 -5
- 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 -3
- package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.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 +21 -16
- package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts +7 -3
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +2 -2
- package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/cjs/presentation-hierarchies.d.ts +2 -2
- package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
- package/lib/cjs/presentation-hierarchies.js +4 -5
- package/lib/cjs/presentation-hierarchies.js.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 +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/HierarchyProvider.d.ts +11 -11
- package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/{HierarchyFiltering.d.ts → HierarchySearch.d.ts} +42 -52
- package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -0
- package/lib/esm/hierarchies/{HierarchyFiltering.js → HierarchySearch.js} +67 -82
- 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/IModelHierarchyDefinition.d.ts +12 -3
- 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/IModelHierarchyProvider.d.ts +4 -4
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +52 -24
- package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +2 -2
- package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
- package/lib/esm/hierarchies/imodel/{FilteringHierarchyDefinition.d.ts → SearchHierarchyDefinition.d.ts} +11 -13
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -0
- package/lib/esm/hierarchies/imodel/{FilteringHierarchyDefinition.js → SearchHierarchyDefinition.js} +96 -100
- package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -0
- package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts +4 -6
- package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
- package/lib/esm/hierarchies/imodel/TreeNodesReader.js +3 -3
- package/lib/esm/hierarchies/imodel/TreeNodesReader.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 +7 -6
- 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 -4
- package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.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 +22 -17
- package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts +7 -3
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +2 -2
- package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
- package/lib/esm/presentation-hierarchies.d.ts +2 -2
- package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
- package/lib/esm/presentation-hierarchies.js +1 -1
- package/lib/esm/presentation-hierarchies.js.map +1 -1
- package/package.json +8 -8
- package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +0 -1
- 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.map +0 -1
- 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
package/lib/cjs/hierarchies/imodel/{FilteringHierarchyDefinition.js → SearchHierarchyDefinition.js}
RENAMED
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
7
|
+
exports.ECSQL_COLUMN_NAME_SearchClassName = exports.ECSQL_COLUMN_NAME_SearchECInstanceId = exports.SearchHierarchyDefinition = void 0;
|
|
8
|
+
exports.applyECInstanceIdsSearch = applyECInstanceIdsSearch;
|
|
9
9
|
exports.applyECInstanceIdsSelector = applyECInstanceIdsSelector;
|
|
10
10
|
const rxjs_1 = require("rxjs");
|
|
11
|
-
const
|
|
11
|
+
const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
12
12
|
const HierarchyNodeIdentifier_js_1 = require("../HierarchyNodeIdentifier.js");
|
|
13
13
|
const HierarchyNodeKey_js_1 = require("../HierarchyNodeKey.js");
|
|
14
|
+
const HierarchySearch_js_1 = require("../HierarchySearch.js");
|
|
14
15
|
const IModelHierarchyDefinition_js_1 = require("../imodel/IModelHierarchyDefinition.js");
|
|
15
16
|
const IModelHierarchyNode_js_1 = require("../imodel/IModelHierarchyNode.js");
|
|
16
17
|
const NodeSelectQueryFactory_js_1 = require("../imodel/NodeSelectQueryFactory.js");
|
|
@@ -18,113 +19,108 @@ const TreeNodesReader_js_1 = require("../imodel/TreeNodesReader.js");
|
|
|
18
19
|
const Common_js_1 = require("../internal/Common.js");
|
|
19
20
|
const Partition_js_1 = require("../internal/operators/Partition.js");
|
|
20
21
|
/** @internal */
|
|
21
|
-
class
|
|
22
|
+
class SearchHierarchyDefinition {
|
|
22
23
|
_imodelAccess;
|
|
23
24
|
_source;
|
|
24
|
-
|
|
25
|
+
_targetPaths;
|
|
25
26
|
_nodesParser;
|
|
26
27
|
#sourceName;
|
|
27
28
|
constructor(props) {
|
|
28
29
|
this._imodelAccess = props.imodelAccess;
|
|
29
30
|
this._source = props.source;
|
|
30
31
|
this.#sourceName = props.sourceName;
|
|
31
|
-
this.
|
|
32
|
+
this._targetPaths = props.targetPaths;
|
|
32
33
|
this._nodesParser = props.nodesParser ?? this._source.parseNode ?? ((row) => (0, rxjs_1.of)((0, TreeNodesReader_js_1.defaultNodesParser)(row)));
|
|
33
34
|
}
|
|
34
35
|
get preProcessNode() {
|
|
35
|
-
return (node) => {
|
|
36
|
-
|
|
37
|
-
if
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}));
|
|
43
|
-
};
|
|
36
|
+
return (node) => (this._source.preProcessNode ? this._source.preProcessNode(node) : (0, rxjs_1.of)(node)).pipe((0, rxjs_1.filter)((processedNode) => {
|
|
37
|
+
if (processedNode.processingParams?.hideInHierarchy && processedNode.search?.isSearchTarget && !processedNode.search.hasSearchTargetAncestor) {
|
|
38
|
+
// we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another search target
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
}));
|
|
44
43
|
}
|
|
45
44
|
get postProcessNode() {
|
|
46
|
-
return (node) => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}));
|
|
67
|
-
};
|
|
45
|
+
return (node) => (this._source.postProcessNode ? this._source.postProcessNode(node) : (0, rxjs_1.of)(node)).pipe((0, rxjs_1.map)((processedNode) => {
|
|
46
|
+
const parentKeysWithoutGroupingNodesLength = processedNode.parentKeys.filter((key) => !HierarchyNodeKey_js_1.HierarchyNodeKey.isGrouping(key)).length;
|
|
47
|
+
const parentKeysLength = processedNode.parentKeys.length;
|
|
48
|
+
const shouldAutoExpand = IModelHierarchyNode_js_1.ProcessedHierarchyNode.isGroupingNode(processedNode)
|
|
49
|
+
? shouldAutoExpandGroupingNodeBasedOnNestedChildren({
|
|
50
|
+
directOrIndirectChildren: processedNode.children,
|
|
51
|
+
parentKeysWithoutGroupingNodesLength,
|
|
52
|
+
parentKeysLength,
|
|
53
|
+
})
|
|
54
|
+
: (processedNode.search?.isSearchTarget && !!processedNode.search.searchTargetOptions?.autoExpand) ||
|
|
55
|
+
processedNode.search?.childrenTargetPaths?.some((path) => (0, HierarchySearch_js_1.shouldAutoExpandBasedOnReveal)({
|
|
56
|
+
reveal: HierarchySearch_js_1.HierarchySearchPath.normalize(path).options?.reveal,
|
|
57
|
+
nodePositionInPath: parentKeysWithoutGroupingNodesLength,
|
|
58
|
+
nodePositionInHierarchy: parentKeysLength,
|
|
59
|
+
}));
|
|
60
|
+
if (shouldAutoExpand) {
|
|
61
|
+
Object.assign(processedNode, { autoExpand: true });
|
|
62
|
+
}
|
|
63
|
+
return processedNode;
|
|
64
|
+
}));
|
|
68
65
|
}
|
|
69
66
|
get parseNode() {
|
|
70
|
-
return (
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
if (!HierarchyNodeIdentifier_js_1.HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
if (identifier.imodelKey && identifier.imodelKey !== this._imodelAccess.imodelKey) {
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
if (identifier.className === rowInstanceKey.className) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
return (0, rxjs_1.firstValueFrom)((0, rxjs_1.merge)((0, Common_js_1.fromPossiblyPromise)(this._imodelAccess.classDerivesFrom(identifier.className, rowInstanceKey.className)), (0, Common_js_1.fromPossiblyPromise)(this._imodelAccess.classDerivesFrom(rowInstanceKey.className, identifier.className))).pipe((0, rxjs_1.filter)((classDerives) => classDerives), (0, rxjs_1.defaultIfEmpty)(false), (0, rxjs_1.take)(1)));
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
return (0, Common_js_1.fromPossiblyPromise)(nodeFilteringPropPossiblyPromise).pipe((0, rxjs_1.map)((nodeExtraProps) => {
|
|
95
|
-
if (nodeExtraProps?.filtering) {
|
|
96
|
-
parsedNode.filtering = nodeExtraProps.filtering;
|
|
67
|
+
return (props) => this._nodesParser(props).pipe((0, rxjs_1.mergeMap)((parsedNode) => {
|
|
68
|
+
const { row, parentNode, imodelKey } = props;
|
|
69
|
+
if (!row[exports.ECSQL_COLUMN_NAME_SearchECInstanceId] || !row[exports.ECSQL_COLUMN_NAME_SearchClassName]) {
|
|
70
|
+
return (0, rxjs_1.of)(parsedNode);
|
|
71
|
+
}
|
|
72
|
+
const rowInstanceKey = { className: row[exports.ECSQL_COLUMN_NAME_SearchClassName], id: row[exports.ECSQL_COLUMN_NAME_SearchECInstanceId] };
|
|
73
|
+
const searchHelper = (0, HierarchySearch_js_1.createHierarchySearchHelper)(this._targetPaths, parentNode);
|
|
74
|
+
const nodeSearchPropPossiblyPromise = searchHelper.createChildNodeProps({
|
|
75
|
+
asyncPathMatcher: (identifier) => {
|
|
76
|
+
if (identifier.id !== rowInstanceKey.id) {
|
|
77
|
+
return false;
|
|
97
78
|
}
|
|
98
|
-
|
|
99
|
-
|
|
79
|
+
if (!HierarchyNodeIdentifier_js_1.HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (identifier.imodelKey && identifier.imodelKey !== imodelKey) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if ((0, presentation_shared_1.compareFullClassNames)(identifier.className, rowInstanceKey.className) === 0) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return (0, rxjs_1.firstValueFrom)((0, rxjs_1.merge)((0, Common_js_1.fromPossiblyPromise)(this._imodelAccess.classDerivesFrom(identifier.className, rowInstanceKey.className)), (0, Common_js_1.fromPossiblyPromise)(this._imodelAccess.classDerivesFrom(rowInstanceKey.className, identifier.className))).pipe((0, rxjs_1.filter)((classDerives) => classDerives), (0, rxjs_1.defaultIfEmpty)(false), (0, rxjs_1.take)(1)));
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
return (0, Common_js_1.fromPossiblyPromise)(nodeSearchPropPossiblyPromise).pipe((0, rxjs_1.map)((nodeExtraProps) => {
|
|
92
|
+
if (nodeExtraProps?.search) {
|
|
93
|
+
parsedNode.search = nodeExtraProps.search;
|
|
94
|
+
}
|
|
95
|
+
return parsedNode;
|
|
100
96
|
}));
|
|
101
|
-
};
|
|
97
|
+
}));
|
|
102
98
|
}
|
|
103
99
|
defineHierarchyLevel(props) {
|
|
104
100
|
const sourceDefinitions = this._source.defineHierarchyLevel(props);
|
|
105
|
-
const
|
|
106
|
-
const
|
|
107
|
-
if (!
|
|
101
|
+
const searchHelper = (0, HierarchySearch_js_1.createHierarchySearchHelper)(this._targetPaths, props.parentNode);
|
|
102
|
+
const childNodeSearchIdentifiers = searchHelper.getChildNodeSearchIdentifiers();
|
|
103
|
+
if (!childNodeSearchIdentifiers) {
|
|
108
104
|
return sourceDefinitions;
|
|
109
105
|
}
|
|
110
106
|
const [genericNodeDefinitions, instanceNodeDefinitions] = (0, Partition_js_1.partition)(sourceDefinitions.pipe((0, rxjs_1.mergeAll)()), IModelHierarchyDefinition_js_1.HierarchyNodesDefinition.isGenericNode);
|
|
111
107
|
return (0, rxjs_1.merge)(genericNodeDefinitions.pipe((0, rxjs_1.map)((definition) => {
|
|
112
|
-
if (
|
|
113
|
-
|
|
108
|
+
if (searchHelper.hasSearchTargetAncestor ||
|
|
109
|
+
childNodeSearchIdentifiers.some((identifier) => HierarchyNodeIdentifier_js_1.HierarchyNodeIdentifier.isGenericNodeIdentifier(identifier) &&
|
|
114
110
|
(!identifier.source || identifier.source === this.#sourceName) &&
|
|
115
111
|
identifier.id === definition.node.key)) {
|
|
116
112
|
return {
|
|
117
113
|
...definition,
|
|
118
114
|
node: {
|
|
119
115
|
...definition.node,
|
|
120
|
-
...
|
|
116
|
+
...searchHelper.createChildNodeProps({ pathMatcher: ({ id }) => id === definition.node.key }),
|
|
121
117
|
},
|
|
122
118
|
};
|
|
123
119
|
}
|
|
124
120
|
return undefined;
|
|
125
121
|
}), (0, rxjs_1.filter)((def) => !!def)), instanceNodeDefinitions.pipe((0, rxjs_1.mergeMap)((definition) => {
|
|
126
|
-
if (
|
|
127
|
-
// if we have a
|
|
122
|
+
if (searchHelper.hasSearchTargetAncestor) {
|
|
123
|
+
// if we have a search target ancestor, we don't need to search the definitions - we use all of them
|
|
128
124
|
return (0, rxjs_1.of)(applyECInstanceIdsSelector(definition));
|
|
129
125
|
}
|
|
130
126
|
return (0, rxjs_1.defer)(async () => {
|
|
@@ -142,7 +138,7 @@ class FilteringHierarchyDefinition {
|
|
|
142
138
|
// are actually the same instance, so we only need to keep one of them, or otherwise the query will
|
|
143
139
|
// duplicate it
|
|
144
140
|
for (const entry of entries) {
|
|
145
|
-
if (entry.className
|
|
141
|
+
if ((0, presentation_shared_1.compareFullClassNames)(entry.className, x.className) === 0 ||
|
|
146
142
|
(await imodelAccess.classDerivesFrom(entry.className, x.className)) ||
|
|
147
143
|
(await imodelAccess.classDerivesFrom(x.className, entry.className))) {
|
|
148
144
|
return undefined;
|
|
@@ -150,15 +146,15 @@ class FilteringHierarchyDefinition {
|
|
|
150
146
|
}
|
|
151
147
|
return entries;
|
|
152
148
|
}
|
|
153
|
-
for (const id of
|
|
149
|
+
for (const id of childNodeSearchIdentifiers) {
|
|
154
150
|
// take only identifiers that match the definition by type, source and class
|
|
155
151
|
if (!HierarchyNodeIdentifier_js_1.HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {
|
|
156
152
|
continue;
|
|
157
153
|
}
|
|
158
|
-
if (id.imodelKey && id.imodelKey !==
|
|
154
|
+
if (id.imodelKey && id.imodelKey !== props.imodelKey) {
|
|
159
155
|
continue;
|
|
160
156
|
}
|
|
161
|
-
if (id.className
|
|
157
|
+
if ((0, presentation_shared_1.compareFullClassNames)(id.className, definition.fullClassName) !== 0 &&
|
|
162
158
|
!(await Promise.all([
|
|
163
159
|
imodelAccess.classDerivesFrom(id.className, definition.fullClassName),
|
|
164
160
|
imodelAccess.classDerivesFrom(definition.fullClassName, id.className),
|
|
@@ -174,21 +170,21 @@ class FilteringHierarchyDefinition {
|
|
|
174
170
|
}).pipe(
|
|
175
171
|
// only take definitions that have matching path identifiers
|
|
176
172
|
(0, rxjs_1.filter)((pathIdentifiers) => pathIdentifiers.length > 0),
|
|
177
|
-
// for each definition that we're going to use, apply query-level
|
|
178
|
-
(0, rxjs_1.map)((pathIdentifiers) =>
|
|
173
|
+
// for each definition that we're going to use, apply query-level search
|
|
174
|
+
(0, rxjs_1.map)((pathIdentifiers) => applyECInstanceIdsSearch(definition, pathIdentifiers)));
|
|
179
175
|
}))).pipe((0, rxjs_1.toArray)());
|
|
180
176
|
}
|
|
181
177
|
}
|
|
182
|
-
exports.
|
|
178
|
+
exports.SearchHierarchyDefinition = SearchHierarchyDefinition;
|
|
183
179
|
/** @internal */
|
|
184
180
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
185
|
-
exports.
|
|
181
|
+
exports.ECSQL_COLUMN_NAME_SearchECInstanceId = "SearchECInstanceId";
|
|
186
182
|
/** @internal */
|
|
187
183
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
188
|
-
exports.
|
|
189
|
-
function getClassECInstanceIds(
|
|
184
|
+
exports.ECSQL_COLUMN_NAME_SearchClassName = "SearchClassName";
|
|
185
|
+
function getClassECInstanceIds(targetInstanceKeys) {
|
|
190
186
|
const classNameECInstanceIds = new Map();
|
|
191
|
-
for (const key of
|
|
187
|
+
for (const key of targetInstanceKeys) {
|
|
192
188
|
const entry = classNameECInstanceIds.get(key.className);
|
|
193
189
|
if (entry === undefined) {
|
|
194
190
|
classNameECInstanceIds.set(key.className, [key.id]);
|
|
@@ -199,18 +195,18 @@ function getClassECInstanceIds(filteredInstanceKeys) {
|
|
|
199
195
|
return classNameECInstanceIds;
|
|
200
196
|
}
|
|
201
197
|
/** @internal */
|
|
202
|
-
function
|
|
203
|
-
const instanceIdsByClass = getClassECInstanceIds(
|
|
198
|
+
function applyECInstanceIdsSearch(def, targetInstanceKeys) {
|
|
199
|
+
const instanceIdsByClass = getClassECInstanceIds(targetInstanceKeys);
|
|
204
200
|
return {
|
|
205
201
|
...def,
|
|
206
202
|
query: {
|
|
207
203
|
...def.query,
|
|
208
204
|
ctes: [
|
|
209
205
|
...(def.query.ctes ?? []),
|
|
210
|
-
`
|
|
206
|
+
`SearchInfo(ECInstanceId, SearchClassName) AS (
|
|
211
207
|
${Array.from(instanceIdsByClass)
|
|
212
208
|
.map(([className, ecInstanceIds]) => `
|
|
213
|
-
SELECT ECInstanceId, '${className}' AS
|
|
209
|
+
SELECT ECInstanceId, '${className}' AS SearchClassName
|
|
214
210
|
FROM ${className}
|
|
215
211
|
WHERE ECInstanceId IN (${ecInstanceIds.join(", ")})
|
|
216
212
|
`)
|
|
@@ -220,12 +216,12 @@ function applyECInstanceIdsFilter(def, filteredInstanceKeys) {
|
|
|
220
216
|
ecsql: `
|
|
221
217
|
SELECT
|
|
222
218
|
[q].*,
|
|
223
|
-
IdToHex([f].[ECInstanceId]) AS [${exports.
|
|
224
|
-
[f].[
|
|
219
|
+
IdToHex([f].[ECInstanceId]) AS [${exports.ECSQL_COLUMN_NAME_SearchECInstanceId}],
|
|
220
|
+
[f].[SearchClassName] AS [${exports.ECSQL_COLUMN_NAME_SearchClassName}]
|
|
225
221
|
FROM (
|
|
226
222
|
${def.query.ecsql}
|
|
227
223
|
) [q]
|
|
228
|
-
JOIN
|
|
224
|
+
JOIN SearchInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]
|
|
229
225
|
`,
|
|
230
226
|
},
|
|
231
227
|
};
|
|
@@ -239,8 +235,8 @@ function applyECInstanceIdsSelector(def) {
|
|
|
239
235
|
ecsql: `
|
|
240
236
|
SELECT
|
|
241
237
|
[q].*,
|
|
242
|
-
IdToHex([q].[ECInstanceId]) AS [${exports.
|
|
243
|
-
[q].[${NodeSelectQueryFactory_js_1.NodeSelectClauseColumnNames.FullClassName}] AS [${exports.
|
|
238
|
+
IdToHex([q].[ECInstanceId]) AS [${exports.ECSQL_COLUMN_NAME_SearchECInstanceId}],
|
|
239
|
+
[q].[${NodeSelectQueryFactory_js_1.NodeSelectClauseColumnNames.FullClassName}] AS [${exports.ECSQL_COLUMN_NAME_SearchClassName}]
|
|
244
240
|
FROM (${def.query.ecsql}) [q]
|
|
245
241
|
`,
|
|
246
242
|
},
|
|
@@ -256,28 +252,28 @@ function shouldAutoExpandGroupingNodeBasedOnNestedChildren({ directOrIndirectChi
|
|
|
256
252
|
continue;
|
|
257
253
|
}
|
|
258
254
|
/* c8 ignore next 3 */
|
|
259
|
-
if (!child.
|
|
255
|
+
if (!child.search) {
|
|
260
256
|
continue;
|
|
261
257
|
}
|
|
262
|
-
if (child.
|
|
263
|
-
(0,
|
|
264
|
-
reveal: child.
|
|
258
|
+
if (child.search.isSearchTarget &&
|
|
259
|
+
(0, HierarchySearch_js_1.shouldAutoExpandBasedOnReveal)({
|
|
260
|
+
reveal: child.search.searchTargetOptions?.reveal,
|
|
265
261
|
nodePositionInHierarchy: parentKeysLength,
|
|
266
|
-
// Grouping node is not in
|
|
262
|
+
// Grouping node is not in search path, but we can assume that it is at the position of 1 less than `parentKeysWithoutGroupingNodesLength`
|
|
267
263
|
nodePositionInPath: parentKeysWithoutGroupingNodesLength - 1,
|
|
268
264
|
})) {
|
|
269
265
|
return true;
|
|
270
266
|
}
|
|
271
|
-
if (!child.
|
|
267
|
+
if (!child.search.childrenTargetPaths) {
|
|
272
268
|
/* c8 ignore next */
|
|
273
269
|
continue;
|
|
274
270
|
}
|
|
275
|
-
for (const path of child.
|
|
271
|
+
for (const path of child.search.childrenTargetPaths) {
|
|
276
272
|
if ("path" in path &&
|
|
277
|
-
(0,
|
|
273
|
+
(0, HierarchySearch_js_1.shouldAutoExpandBasedOnReveal)({
|
|
278
274
|
reveal: path.options?.reveal,
|
|
279
275
|
nodePositionInHierarchy: parentKeysLength,
|
|
280
|
-
// Grouping node is not in
|
|
276
|
+
// Grouping node is not in search path, but we can assume that it is at the position of 1 less than `parentKeysWithoutGroupingNodesLength`
|
|
281
277
|
nodePositionInPath: parentKeysWithoutGroupingNodesLength - 1,
|
|
282
278
|
})) {
|
|
283
279
|
return true;
|
|
@@ -286,4 +282,4 @@ function shouldAutoExpandGroupingNodeBasedOnNestedChildren({ directOrIndirectChi
|
|
|
286
282
|
}
|
|
287
283
|
return false;
|
|
288
284
|
}
|
|
289
|
-
//# sourceMappingURL=
|
|
285
|
+
//# sourceMappingURL=SearchHierarchyDefinition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/SearchHierarchyDefinition.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { defaultIfEmpty, defer, filter, firstValueFrom, map, merge, mergeAll, mergeMap, Observable, of, take, toArray } from \"rxjs\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { compareFullClassNames, ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport { HierarchyNodeIdentifier } from \"../HierarchyNodeIdentifier.js\";\nimport { HierarchyNodeKey, IModelInstanceKey } from \"../HierarchyNodeKey.js\";\nimport { createHierarchySearchHelper, HierarchySearchPath, shouldAutoExpandBasedOnReveal } from \"../HierarchySearch.js\";\nimport {\n DefineHierarchyLevelProps,\n GenericHierarchyNodeDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n} from \"../imodel/IModelHierarchyDefinition.js\";\nimport { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, ProcessedInstanceHierarchyNode } from \"../imodel/IModelHierarchyNode.js\";\nimport { NodeSelectClauseColumnNames } from \"../imodel/NodeSelectQueryFactory.js\";\nimport { defaultNodesParser } from \"../imodel/TreeNodesReader.js\";\nimport { fromPossiblyPromise } from \"../internal/Common.js\";\nimport { partition } from \"../internal/operators/Partition.js\";\nimport { RxjsHierarchyDefinition, RxjsNodeParser, RxjsNodePostProcessor, RxjsNodePreProcessor } from \"../internal/RxjsHierarchyDefinition.js\";\n\ninterface SearchHierarchyDefinitionProps {\n imodelAccess: ECClassHierarchyInspector;\n source: RxjsHierarchyDefinition;\n sourceName: string;\n targetPaths: HierarchySearchPath[];\n nodesParser?: RxjsNodeParser;\n}\n\n/** @internal */\nexport class SearchHierarchyDefinition implements RxjsHierarchyDefinition {\n private _imodelAccess: ECClassHierarchyInspector;\n private _source: RxjsHierarchyDefinition;\n private _targetPaths: HierarchySearchPath[];\n private _nodesParser: RxjsNodeParser;\n #sourceName: string;\n\n public constructor(props: SearchHierarchyDefinitionProps) {\n this._imodelAccess = props.imodelAccess;\n this._source = props.source;\n this.#sourceName = props.sourceName;\n this._targetPaths = props.targetPaths;\n this._nodesParser = props.nodesParser ?? this._source.parseNode ?? ((row) => of(defaultNodesParser(row)));\n }\n\n public get preProcessNode(): RxjsNodePreProcessor {\n return (node) =>\n (this._source.preProcessNode ? this._source.preProcessNode(node) : of(node)).pipe(\n filter((processedNode) => {\n if (processedNode.processingParams?.hideInHierarchy && processedNode.search?.isSearchTarget && !processedNode.search.hasSearchTargetAncestor) {\n // we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another search target\n return false;\n }\n return true;\n }),\n );\n }\n\n public get postProcessNode(): RxjsNodePostProcessor {\n return (node) =>\n (this._source.postProcessNode ? this._source.postProcessNode(node) : of(node)).pipe(\n map((processedNode) => {\n const parentKeysWithoutGroupingNodesLength = processedNode.parentKeys.filter((key) => !HierarchyNodeKey.isGrouping(key)).length;\n const parentKeysLength = processedNode.parentKeys.length;\n const shouldAutoExpand = ProcessedHierarchyNode.isGroupingNode(processedNode)\n ? shouldAutoExpandGroupingNodeBasedOnNestedChildren({\n directOrIndirectChildren: processedNode.children,\n parentKeysWithoutGroupingNodesLength,\n parentKeysLength,\n })\n : (processedNode.search?.isSearchTarget && !!processedNode.search.searchTargetOptions?.autoExpand) ||\n processedNode.search?.childrenTargetPaths?.some((path) =>\n shouldAutoExpandBasedOnReveal({\n reveal: HierarchySearchPath.normalize(path).options?.reveal,\n nodePositionInPath: parentKeysWithoutGroupingNodesLength,\n nodePositionInHierarchy: parentKeysLength,\n }),\n );\n if (shouldAutoExpand) {\n Object.assign(processedNode, { autoExpand: true });\n }\n\n return processedNode;\n }),\n );\n }\n\n public get parseNode(): RxjsNodeParser {\n return (props) =>\n this._nodesParser(props).pipe(\n mergeMap((parsedNode) => {\n const { row, parentNode, imodelKey } = props;\n if (!row[ECSQL_COLUMN_NAME_SearchECInstanceId] || !row[ECSQL_COLUMN_NAME_SearchClassName]) {\n return of(parsedNode);\n }\n const rowInstanceKey = { className: row[ECSQL_COLUMN_NAME_SearchClassName], id: row[ECSQL_COLUMN_NAME_SearchECInstanceId] };\n const searchHelper = createHierarchySearchHelper(this._targetPaths, parentNode);\n const nodeSearchPropPossiblyPromise = searchHelper.createChildNodeProps({\n asyncPathMatcher: (identifier): boolean | Promise<boolean> => {\n if (identifier.id !== rowInstanceKey.id) {\n return false;\n }\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(identifier)) {\n return false;\n }\n if (identifier.imodelKey && identifier.imodelKey !== imodelKey) {\n return false;\n }\n if (compareFullClassNames(identifier.className, rowInstanceKey.className) === 0) {\n return true;\n }\n return firstValueFrom(\n merge(\n fromPossiblyPromise(this._imodelAccess.classDerivesFrom(identifier.className, rowInstanceKey.className)),\n fromPossiblyPromise(this._imodelAccess.classDerivesFrom(rowInstanceKey.className, identifier.className)),\n ).pipe(\n filter((classDerives) => classDerives),\n defaultIfEmpty(false),\n take(1),\n ),\n );\n },\n });\n return fromPossiblyPromise(nodeSearchPropPossiblyPromise).pipe(\n map((nodeExtraProps) => {\n if (nodeExtraProps?.search) {\n parsedNode.search = nodeExtraProps.search;\n }\n return parsedNode;\n }),\n );\n }),\n );\n }\n\n public defineHierarchyLevel(props: DefineHierarchyLevelProps): Observable<HierarchyLevelDefinition> {\n const sourceDefinitions = this._source.defineHierarchyLevel(props);\n\n const searchHelper = createHierarchySearchHelper(this._targetPaths, props.parentNode);\n const childNodeSearchIdentifiers = searchHelper.getChildNodeSearchIdentifiers();\n if (!childNodeSearchIdentifiers) {\n return sourceDefinitions;\n }\n\n const [genericNodeDefinitions, instanceNodeDefinitions] = partition(sourceDefinitions.pipe(mergeAll()), HierarchyNodesDefinition.isGenericNode);\n return merge(\n genericNodeDefinitions.pipe(\n map((definition) => {\n if (\n searchHelper.hasSearchTargetAncestor ||\n childNodeSearchIdentifiers.some(\n (identifier) =>\n HierarchyNodeIdentifier.isGenericNodeIdentifier(identifier) &&\n (!identifier.source || identifier.source === this.#sourceName) &&\n identifier.id === definition.node.key,\n )\n ) {\n return {\n ...definition,\n node: {\n ...definition.node,\n ...searchHelper.createChildNodeProps({ pathMatcher: ({ id }) => id === definition.node.key }),\n },\n };\n }\n return undefined;\n }),\n filter((def): def is GenericHierarchyNodeDefinition => !!def),\n ),\n\n instanceNodeDefinitions.pipe(\n mergeMap((definition) => {\n if (searchHelper.hasSearchTargetAncestor) {\n // if we have a search target ancestor, we don't need to search the definitions - we use all of them\n return of(applyECInstanceIdsSelector(definition));\n }\n return defer(async () => {\n const imodelAccess = this._imodelAccess;\n const matches = new Map<Id64String, IModelInstanceKey[]>();\n async function getEntries(x: IModelInstanceKey) {\n let entries = matches.get(x.id);\n if (!entries) {\n entries = [];\n matches.set(x.id, entries);\n }\n // make sure that we don't have path identifiers that only differ by class name, where\n // class names are in the same class hierarchy, e.g.:\n // [{ className: \"bis.Element\", id: \"0x1\" }, { className: \"bis.Subject\", id: \"0x1\" }]\n // are actually the same instance, so we only need to keep one of them, or otherwise the query will\n // duplicate it\n for (const entry of entries) {\n if (\n compareFullClassNames(entry.className, x.className) === 0 ||\n (await imodelAccess.classDerivesFrom(entry.className, x.className)) ||\n (await imodelAccess.classDerivesFrom(x.className, entry.className))\n ) {\n return undefined;\n }\n }\n return entries;\n }\n for (const id of childNodeSearchIdentifiers) {\n // take only identifiers that match the definition by type, source and class\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n continue;\n }\n if (id.imodelKey && id.imodelKey !== props.imodelKey) {\n continue;\n }\n if (\n compareFullClassNames(id.className, definition.fullClassName) !== 0 &&\n !(await Promise.all([\n imodelAccess.classDerivesFrom(id.className, definition.fullClassName),\n imodelAccess.classDerivesFrom(definition.fullClassName, id.className),\n ]).then(([isDerivedFrom, isDerivedTo]) => isDerivedFrom || isDerivedTo))\n ) {\n continue;\n }\n const entriesTargetForPathIdentifier = await getEntries(id);\n if (entriesTargetForPathIdentifier) {\n entriesTargetForPathIdentifier.push(id);\n }\n }\n return Array.from(matches.values()).flat();\n }).pipe(\n // only take definitions that have matching path identifiers\n filter((pathIdentifiers) => pathIdentifiers.length > 0),\n\n // for each definition that we're going to use, apply query-level search\n map((pathIdentifiers) => applyECInstanceIdsSearch(definition, pathIdentifiers)),\n );\n }),\n ),\n ).pipe(toArray());\n }\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_SearchECInstanceId = \"SearchECInstanceId\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_SearchClassName = \"SearchClassName\";\n\nfunction getClassECInstanceIds(targetInstanceKeys: InstanceKey[]) {\n const classNameECInstanceIds = new Map<string, Id64String[]>();\n for (const key of targetInstanceKeys) {\n const entry = classNameECInstanceIds.get(key.className);\n if (entry === undefined) {\n classNameECInstanceIds.set(key.className, [key.id]);\n continue;\n }\n entry.push(key.id);\n }\n return classNameECInstanceIds;\n}\n\n/** @internal */\nexport function applyECInstanceIdsSearch(def: InstanceNodesQueryDefinition, targetInstanceKeys: InstanceKey[]): InstanceNodesQueryDefinition {\n const instanceIdsByClass = getClassECInstanceIds(targetInstanceKeys);\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n `SearchInfo(ECInstanceId, SearchClassName) AS (\n ${Array.from(instanceIdsByClass)\n .map(\n ([className, ecInstanceIds]) => `\n SELECT ECInstanceId, '${className}' AS SearchClassName\n FROM ${className}\n WHERE ECInstanceId IN (${ecInstanceIds.join(\", \")})\n `,\n )\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n IdToHex([f].[ECInstanceId]) AS [${ECSQL_COLUMN_NAME_SearchECInstanceId}],\n [f].[SearchClassName] AS [${ECSQL_COLUMN_NAME_SearchClassName}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n JOIN SearchInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n\n/** @internal */\nexport function applyECInstanceIdsSelector(def: InstanceNodesQueryDefinition): InstanceNodesQueryDefinition {\n return {\n ...def,\n query: {\n ...def.query,\n ecsql: `\n SELECT\n [q].*,\n IdToHex([q].[ECInstanceId]) AS [${ECSQL_COLUMN_NAME_SearchECInstanceId}],\n [q].[${NodeSelectClauseColumnNames.FullClassName}] AS [${ECSQL_COLUMN_NAME_SearchClassName}]\n FROM (${def.query.ecsql}) [q]\n `,\n },\n };\n}\n\nfunction shouldAutoExpandGroupingNodeBasedOnNestedChildren({\n directOrIndirectChildren,\n parentKeysLength,\n parentKeysWithoutGroupingNodesLength,\n}: {\n directOrIndirectChildren: Array<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>;\n parentKeysLength: number;\n parentKeysWithoutGroupingNodesLength: number;\n}) {\n for (const child of directOrIndirectChildren) {\n if (ProcessedHierarchyNode.isGroupingNode(child)) {\n // Need to check if the same grouping node needs to be expanded, but check the indirect children instead\n if (\n shouldAutoExpandGroupingNodeBasedOnNestedChildren({ directOrIndirectChildren: child.children, parentKeysLength, parentKeysWithoutGroupingNodesLength })\n ) {\n return true;\n }\n continue;\n }\n\n /* c8 ignore next 3 */\n if (!child.search) {\n continue;\n }\n\n if (\n child.search.isSearchTarget &&\n shouldAutoExpandBasedOnReveal({\n reveal: child.search.searchTargetOptions?.reveal,\n nodePositionInHierarchy: parentKeysLength,\n // Grouping node is not in search path, but we can assume that it is at the position of 1 less than `parentKeysWithoutGroupingNodesLength`\n nodePositionInPath: parentKeysWithoutGroupingNodesLength - 1,\n })\n ) {\n return true;\n }\n\n if (!child.search.childrenTargetPaths) {\n /* c8 ignore next */\n continue;\n }\n\n for (const path of child.search.childrenTargetPaths) {\n if (\n \"path\" in path &&\n shouldAutoExpandBasedOnReveal({\n reveal: path.options?.reveal,\n nodePositionInHierarchy: parentKeysLength,\n // Grouping node is not in search path, but we can assume that it is at the position of 1 less than `parentKeysWithoutGroupingNodesLength`\n nodePositionInPath: parentKeysWithoutGroupingNodesLength - 1,\n })\n ) {\n return true;\n }\n }\n }\n return false;\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Observable } from "rxjs";
|
|
1
|
+
import { Observable, ObservedValueOf } from "rxjs";
|
|
2
2
|
import { Id64String } from "@itwin/core-bentley";
|
|
3
|
-
import { ECSqlQueryDef } from "@itwin/presentation-shared";
|
|
3
|
+
import { ECSqlQueryDef, Props } from "@itwin/presentation-shared";
|
|
4
4
|
import { RxjsNodeParser } from "../internal/RxjsHierarchyDefinition.js";
|
|
5
5
|
import { SourceInstanceHierarchyNode } from "./IModelHierarchyNode.js";
|
|
6
6
|
import { LimitingECSqlQueryExecutor } from "./LimitingECSqlQueryExecutor.js";
|
|
@@ -9,7 +9,7 @@ interface ReadNodesProps {
|
|
|
9
9
|
queryExecutor: LimitingECSqlQueryExecutor;
|
|
10
10
|
query: ECSqlQueryDef;
|
|
11
11
|
limit?: number | "unbounded";
|
|
12
|
-
parser?: RxjsNodeParser
|
|
12
|
+
parser?: (props: Pick<Props<RxjsNodeParser>, "row">) => ReturnType<RxjsNodeParser>;
|
|
13
13
|
}
|
|
14
14
|
/** @internal */
|
|
15
15
|
export declare function readNodes(props: ReadNodesProps): Observable<SourceInstanceHierarchyNode>;
|
|
@@ -30,8 +30,6 @@ export interface RowDef {
|
|
|
30
30
|
[NodeSelectClauseColumnNames.SupportsFiltering]?: boolean;
|
|
31
31
|
}
|
|
32
32
|
/** @internal */
|
|
33
|
-
export declare
|
|
34
|
-
[columnName: string]: any;
|
|
35
|
-
}): SourceInstanceHierarchyNode;
|
|
33
|
+
export declare const defaultNodesParser: (props: Pick<Props<RxjsNodeParser>, "row">) => ObservedValueOf<ReturnType<RxjsNodeParser>>;
|
|
36
34
|
export {};
|
|
37
35
|
//# sourceMappingURL=TreeNodesReader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeNodesReader.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAM,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"TreeNodesReader.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAE,eAAe,EAAM,MAAM,MAAM,CAAC;AACvE,OAAO,EAAQ,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAsB,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAyC,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC9G,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAI1E,UAAU,cAAc;IACtB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC7B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,UAAU,CAAC,cAAc,CAAC,CAAC;CACpF;AAED,gBAAgB;AAChB,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAiBxF;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,CAAC,2BAA2B,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC;IACvD,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACnD,CAAC,2BAA2B,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IACpD,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC;IACzD,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC;IAC5D,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAChD,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IACpD,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;IACnD,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC;CAC3D;AAED,gBAAgB;AAChB,eAAO,MAAM,kBAAkB,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAoBzH,CAAC"}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
5
|
*--------------------------------------------------------------------------------------------*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.defaultNodesParser = void 0;
|
|
7
8
|
exports.readNodes = readNodes;
|
|
8
|
-
exports.defaultNodesParser = defaultNodesParser;
|
|
9
9
|
const rxjs_1 = require("rxjs");
|
|
10
10
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
11
|
const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
@@ -16,7 +16,7 @@ const LOGGING_NAMESPACE = `${Common_js_1.LOGGING_NAMESPACE_INTERNAL}.QueryRows`;
|
|
|
16
16
|
/** @internal */
|
|
17
17
|
function readNodes(props) {
|
|
18
18
|
const { queryExecutor, query, limit } = props;
|
|
19
|
-
const parser = props?.parser ?? ((row) => (0, rxjs_1.of)(defaultNodesParser(row)));
|
|
19
|
+
const parser = props?.parser ?? ((row) => (0, rxjs_1.of)((0, exports.defaultNodesParser)(row)));
|
|
20
20
|
const config = {
|
|
21
21
|
rowFormat: "ECSqlPropertyNames",
|
|
22
22
|
restartToken: `readNodes/${core_bentley_1.Guid.createValue()}`,
|
|
@@ -26,10 +26,10 @@ function readNodes(props) {
|
|
|
26
26
|
category: LOGGING_NAMESPACE,
|
|
27
27
|
severity: "trace",
|
|
28
28
|
message: /* c8 ignore next */ (row) => JSON.stringify(row),
|
|
29
|
-
}), (0, rxjs_1.mergeMap)((row) => parser(row)));
|
|
29
|
+
}), (0, rxjs_1.mergeMap)((row) => parser({ row })));
|
|
30
30
|
}
|
|
31
31
|
/** @internal */
|
|
32
|
-
|
|
32
|
+
const defaultNodesParser = ({ row }) => {
|
|
33
33
|
const typedRow = row;
|
|
34
34
|
const processingParams = {
|
|
35
35
|
...(typedRow.HideIfNoChildren ? { hideIfNoChildren: true } : undefined),
|
|
@@ -49,5 +49,6 @@ function defaultNodesParser(row) {
|
|
|
49
49
|
...(typedRow.ExtendedData ? { extendedData: JSON.parse(typedRow.ExtendedData) } : undefined),
|
|
50
50
|
...(Object.keys(processingParams).length > 0 ? { processingParams } : undefined),
|
|
51
51
|
};
|
|
52
|
-
}
|
|
52
|
+
};
|
|
53
|
+
exports.defaultNodesParser = defaultNodesParser;
|
|
53
54
|
//# sourceMappingURL=TreeNodesReader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeNodesReader.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":";AAAA;;;gGAGgG
|
|
1
|
+
{"version":3,"file":"TreeNodesReader.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/TreeNodesReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { from, mergeMap, Observable, ObservedValueOf, of } from \"rxjs\";\nimport { Guid, Id64String } from \"@itwin/core-bentley\";\nimport { ECSqlQueryDef, parseInstanceLabel, Props } from \"@itwin/presentation-shared\";\nimport { LOGGING_NAMESPACE_INTERNAL as BASE_LOGGING_NAMESPACE } from \"../internal/Common.js\";\nimport { log } from \"../internal/LoggingUtils.js\";\nimport { RxjsNodeParser } from \"../internal/RxjsHierarchyDefinition.js\";\nimport { InstanceHierarchyNodeProcessingParams, SourceInstanceHierarchyNode } from \"./IModelHierarchyNode.js\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor.js\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory.js\";\n\nconst LOGGING_NAMESPACE = `${BASE_LOGGING_NAMESPACE}.QueryRows`;\n\ninterface ReadNodesProps {\n queryExecutor: LimitingECSqlQueryExecutor;\n query: ECSqlQueryDef;\n limit?: number | \"unbounded\";\n parser?: (props: Pick<Props<RxjsNodeParser>, \"row\">) => ReturnType<RxjsNodeParser>;\n}\n\n/** @internal */\nexport function readNodes(props: ReadNodesProps): Observable<SourceInstanceHierarchyNode> {\n const { queryExecutor, query, limit } = props;\n const parser = props?.parser ?? ((row) => of(defaultNodesParser(row)));\n const config: Parameters<LimitingECSqlQueryExecutor[\"createQueryReader\"]>[1] = {\n rowFormat: \"ECSqlPropertyNames\",\n restartToken: `readNodes/${Guid.createValue()}`,\n ...(limit !== undefined ? { limit } : undefined),\n };\n\n return from(queryExecutor.createQueryReader(query, config)).pipe(\n log({\n category: LOGGING_NAMESPACE,\n severity: \"trace\",\n message: /* c8 ignore next */ (row) => JSON.stringify(row),\n }),\n mergeMap((row) => parser({ row })),\n );\n}\n\n/**\n * The interface should contain a member for each `NodeSelectClauseColumnNames` value.\n * @internal\n */\nexport interface RowDef {\n [NodeSelectClauseColumnNames.FullClassName]: string;\n [NodeSelectClauseColumnNames.ECInstanceId]: Id64String;\n [NodeSelectClauseColumnNames.DisplayLabel]: string;\n [NodeSelectClauseColumnNames.HasChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideIfNoChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideNodeInHierarchy]?: boolean;\n [NodeSelectClauseColumnNames.Grouping]?: string;\n [NodeSelectClauseColumnNames.ExtendedData]?: string;\n [NodeSelectClauseColumnNames.AutoExpand]?: boolean;\n [NodeSelectClauseColumnNames.SupportsFiltering]?: boolean;\n}\n\n/** @internal */\nexport const defaultNodesParser: (props: Pick<Props<RxjsNodeParser>, \"row\">) => ObservedValueOf<ReturnType<RxjsNodeParser>> = ({ row }) => {\n const typedRow = row as RowDef;\n const processingParams: InstanceHierarchyNodeProcessingParams = {\n ...(typedRow.HideIfNoChildren ? { hideIfNoChildren: true } : undefined),\n ...(typedRow.HideNodeInHierarchy ? { hideInHierarchy: true } : undefined),\n ...(typedRow.Grouping ? { grouping: JSON.parse(typedRow.Grouping) } : undefined),\n };\n return {\n // don't format the label here - we're going to do that at node pre-processing step to handle both - instance and generic nodes\n label: parseInstanceLabel(typedRow.DisplayLabel),\n key: {\n type: \"instances\",\n instanceKeys: [{ className: typedRow.FullClassName.replace(\":\", \".\"), id: typedRow.ECInstanceId }],\n },\n ...(typedRow.HasChildren !== undefined ? { children: !!typedRow.HasChildren } : undefined),\n ...(typedRow.AutoExpand ? { autoExpand: true } : undefined),\n ...(typedRow.SupportsFiltering ? { supportsFiltering: true } : undefined),\n ...(typedRow.ExtendedData ? { extendedData: JSON.parse(typedRow.ExtendedData) } : undefined),\n ...(Object.keys(processingParams).length > 0 ? { processingParams } : undefined),\n };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseClassGrouping.d.ts","sourceRoot":"","sources":["../../../../../../src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseClassGrouping.d.ts","sourceRoot":"","sources":["../../../../../../src/hierarchies/imodel/operators/grouping/BaseClassGrouping.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,EAAE,EACF,yBAAyB,EACzB,gBAAgB,EAEjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAExE,gBAAgB;AAChB,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,gBAAgB,EAChC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,KAAK,EAAE,8BAA8B,EAAE,GACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAyBrB;AAED,gBAAgB;AAChB,wBAAsB,uCAAuC,CAC3D,KAAK,EAAE,8BAA8B,EAAE,EACvC,WAAW,EAAE,EAAE,CAAC,KAAK,EACrB,uBAAuB,EAAE,yBAAyB,GACjD,OAAO,CAAC,qBAAqB,CAAC,CA0ChC;AAsCD,gBAAgB;AAChB,wBAAsB,+BAA+B,CACnD,YAAY,EAAE,gBAAgB,GAAG,yBAAyB,EAC1D,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,KAAK,EAAE,8BAA8B,EAAE,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC,CAG5B"}
|
|
@@ -7,13 +7,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.getBaseClassGroupingECClasses = getBaseClassGroupingECClasses;
|
|
8
8
|
exports.createBaseClassGroupsForSingleBaseClass = createBaseClassGroupsForSingleBaseClass;
|
|
9
9
|
exports.createBaseClassGroupingHandlers = createBaseClassGroupingHandlers;
|
|
10
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
10
11
|
const presentation_shared_1 = require("@itwin/presentation-shared");
|
|
11
12
|
const HierarchyNode_js_1 = require("../../../HierarchyNode.js");
|
|
12
13
|
/** @internal */
|
|
13
14
|
async function getBaseClassGroupingECClasses(schemaProvider, parentNode, nodes) {
|
|
14
15
|
// Get all base class names that are provided in the grouping information
|
|
15
16
|
const baseClassesFullClassNames = await getGroupingBaseClassNames(nodes);
|
|
16
|
-
if (baseClassesFullClassNames.
|
|
17
|
+
if (baseClassesFullClassNames.length === 0) {
|
|
17
18
|
return [];
|
|
18
19
|
}
|
|
19
20
|
const releaseMainThread = (0, presentation_shared_1.createMainThreadReleaseOnTimePassedHandler)();
|
|
@@ -25,7 +26,7 @@ async function getBaseClassGroupingECClasses(schemaProvider, parentNode, nodes)
|
|
|
25
26
|
const sortedClasses = await sortByBaseClass(baseClasses.filter((baseClass) => baseClass.isRelationshipClass() || baseClass.isEntityClass()));
|
|
26
27
|
if (parentNode && HierarchyNode_js_1.HierarchyNode.isClassGroupingNode(parentNode)) {
|
|
27
28
|
// if we have a class grouping node, we can cut the front of sortedClasses up to a point where our grouping class is
|
|
28
|
-
const cutPosition = sortedClasses.findIndex((c) => c.fullName
|
|
29
|
+
const cutPosition = sortedClasses.findIndex((c) => (0, presentation_shared_1.compareFullClassNames)(c.fullName, parentNode.key.className) === 0);
|
|
29
30
|
if (cutPosition >= 0) {
|
|
30
31
|
return sortedClasses.slice(cutPosition + 1);
|
|
31
32
|
}
|
|
@@ -42,7 +43,7 @@ async function createBaseClassGroupsForSingleBaseClass(nodes, baseECClass, class
|
|
|
42
43
|
for (const node of nodes) {
|
|
43
44
|
await releaseMainThread();
|
|
44
45
|
if (!node.processingParams?.grouping?.byBaseClasses ||
|
|
45
|
-
!node.processingParams.grouping.byBaseClasses.fullClassNames.some((className) => className ===
|
|
46
|
+
!node.processingParams.grouping.byBaseClasses.fullClassNames.some((className) => (0, presentation_shared_1.compareFullClassNames)(className, baseClassFullName) === 0)) {
|
|
46
47
|
ungroupedNodes.push(node);
|
|
47
48
|
continue;
|
|
48
49
|
}
|
|
@@ -75,12 +76,12 @@ async function createBaseClassGroupsForSingleBaseClass(nodes, baseECClass, class
|
|
|
75
76
|
}
|
|
76
77
|
async function getGroupingBaseClassNames(nodes) {
|
|
77
78
|
const releaseMainThread = (0, presentation_shared_1.createMainThreadReleaseOnTimePassedHandler)();
|
|
78
|
-
const baseClasses = new
|
|
79
|
+
const baseClasses = new core_bentley_1.SortedArray(presentation_shared_1.compareFullClassNames, false);
|
|
79
80
|
for (const node of nodes) {
|
|
80
81
|
await releaseMainThread();
|
|
81
82
|
if (node.processingParams?.grouping?.byBaseClasses) {
|
|
82
83
|
for (const className of node.processingParams.grouping.byBaseClasses.fullClassNames) {
|
|
83
|
-
baseClasses.
|
|
84
|
+
baseClasses.insert(className);
|
|
84
85
|
}
|
|
85
86
|
}
|
|
86
87
|
}
|