@itwin/presentation-hierarchies 0.1.2 → 0.1.4
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 +14 -0
- package/lib/cjs/hierarchies/HierarchyNode.d.ts +7 -0
- package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
- package/lib/cjs/hierarchies/HierarchyProvider.js +4 -2
- package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts +1 -10
- package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -1
- package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js +17 -13
- package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyNode.d.ts +7 -0
- package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
- package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
- package/lib/esm/hierarchies/HierarchyProvider.js +4 -2
- package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
- package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts +1 -10
- package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -1
- package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js +18 -14
- package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @itwin/presentation-hierarchies
|
|
2
2
|
|
|
3
|
+
## 0.1.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#625](https://github.com/iTwin/presentation/pull/625): Fixed `preProcessNode` and `postProcessNode` losing `this` context in `HierarchyProvider`.
|
|
8
|
+
- Updated dependencies:
|
|
9
|
+
- @itwin/presentation-shared@0.3.0
|
|
10
|
+
|
|
11
|
+
## 0.1.3
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#620](https://github.com/iTwin/presentation/pull/620): Expose filtering information to the type of a fully processed node.
|
|
16
|
+
|
|
3
17
|
## 0.1.2
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from "@itwin/presentation-shared";
|
|
2
|
+
import { HierarchyNodeIdentifiersPath } from "./HierarchyNodeIdentifier";
|
|
2
3
|
import { ClassGroupingNodeKey, GroupingNodeKey, HierarchyNodeKey, InstancesNodeKey, LabelGroupingNodeKey, PropertyGroupingNodeKey, PropertyOtherValuesGroupingNodeKey, PropertyValueGroupingNodeKey, PropertyValueRangeGroupingNodeKey, StandardHierarchyNodeKey } from "./HierarchyNodeKey";
|
|
3
4
|
/**
|
|
4
5
|
* A data structure that represents a single non-grouping hierarchy node.
|
|
@@ -16,6 +17,12 @@ interface BaseHierarchyNode {
|
|
|
16
17
|
extendedData?: {
|
|
17
18
|
[key: string]: any;
|
|
18
19
|
};
|
|
20
|
+
/** Data that may be assigned to the node if filtering is enabled */
|
|
21
|
+
filtering?: {
|
|
22
|
+
isFilterTarget?: boolean;
|
|
23
|
+
hasFilterTargetAncestor?: boolean;
|
|
24
|
+
filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];
|
|
25
|
+
};
|
|
19
26
|
}
|
|
20
27
|
/**
|
|
21
28
|
* A data structure that represents a single non-grouping hierarchy node.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyNode.d.ts","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC3G,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,UAAU,iBAAiB;IACzB,0FAA0F;IAC1F,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"HierarchyNode.d.ts","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyNode.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAGhG,yDAW4B;AAwD5B,YAAY;AACZ,2DAA2D;AAC3D,IAAiB,aAAa,CAuE7B;AAvED,WAAiB,aAAa;IAC5B,qDAAqD;IACrD,SAAgB,QAAQ,CACtB,IAAW;QAEX,OAAO,mCAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAJe,sBAAQ,WAIvB,CAAA;IACD,8EAA8E;IAC9E,SAAgB,UAAU,CAA0C,IAAW;QAC7E,OAAO,mCAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAFe,wBAAU,aAEzB,CAAA;IACD,iEAAiE;IACjE,SAAgB,eAAe,CAC7B,IAAW;QAEX,OAAO,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAJe,6BAAe,kBAI9B,CAAA;IACD,uDAAuD;IACvD,SAAgB,cAAc,CAC5B,IAAW;QAEX,OAAO,mCAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAJe,4BAAc,iBAI7B,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,mCAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,mCAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,gFAAgF;IAChF,SAAgB,iCAAiC,CAC/C,IAAW;QAIX,OAAO,mCAAgB,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IANe,+CAAiC,oCAMhD,CAAA;IACD,sEAAsE;IACtE,SAAgB,2BAA2B,CACzC,IAAW;QAIX,OAAO,mCAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IANe,yCAA2B,8BAM1C,CAAA;IACD,4EAA4E;IAC5E,SAAgB,gCAAgC,CAC9C,IAAW;QAIX,OAAO,mCAAgB,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IANe,8CAAgC,mCAM/C,CAAA;IACD,gEAAgE;IAChE,SAAgB,sBAAsB,CACpC,IAAW;QAIX,OAAO,mCAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IANe,oCAAsB,yBAMrC,CAAA;AACH,CAAC,EAvEgB,aAAa,6BAAb,aAAa,QAuE7B","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 { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from \"@itwin/presentation-shared\";\nimport {\n ClassGroupingNodeKey,\n GroupingNodeKey,\n HierarchyNodeKey,\n InstancesNodeKey,\n LabelGroupingNodeKey,\n PropertyGroupingNodeKey,\n PropertyOtherValuesGroupingNodeKey,\n PropertyValueGroupingNodeKey,\n PropertyValueRangeGroupingNodeKey,\n StandardHierarchyNodeKey,\n} from \"./HierarchyNodeKey\";\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n */\ninterface BaseHierarchyNode {\n /** Identifiers of all node ancestors. Can be used to identify a node in the hierarchy. */\n parentKeys: HierarchyNodeKey[];\n /** Node's display label. */\n label: string;\n /** A flag indicating whether the node has children or not. */\n children: boolean;\n /** A flag indicating whether this node should be auto-expanded in the UI. */\n autoExpand?: boolean;\n /** Additional data that may be assigned to this node. */\n extendedData?: { [key: string]: any };\n}\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n * @beta\n */\nexport interface NonGroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify the node in its hierarchy level. */\n key: string | InstancesNodeKey;\n /**\n * Identifies whether the hierarchy level below this node supports filtering. If not, supplying an instance\n * filter when requesting child hierarchy level will have no effect.\n */\n supportsFiltering?: boolean;\n}\n\n/**\n * A data structure that represents a grouping node that groups other nodes.\n * @beta\n */\nexport interface GroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify this grouping node in its hierarchy level. */\n key: GroupingNodeKey;\n\n /**\n * Keys of all instances grouped by this node, including deeply nested under\n * other grouping nodes.\n */\n groupedInstanceKeys: InstanceKey[];\n\n /** The closest ancestor node that is not a grouping node. May be `undefined` if the grouping node grouped root level nodes. */\n nonGroupingAncestor?: ParentHierarchyNode<NonGroupingHierarchyNode>;\n}\n\n/**\n * A data structure that represents a single hierarchy node.\n * @beta\n */\nexport type HierarchyNode = NonGroupingHierarchyNode | GroupingHierarchyNode;\n\n/** @beta */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace HierarchyNode {\n /** Checks whether the given node is a custom node */\n export function isCustom<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedCustomHierarchyNode : NonGroupingHierarchyNode) & { key: string } {\n return HierarchyNodeKey.isCustom(node.key);\n }\n /** Checks whether the given node is a standard (iModel content based) node */\n export function isStandard<TNode extends { key: HierarchyNodeKey }>(node: TNode): node is TNode & { key: StandardHierarchyNodeKey } {\n return HierarchyNodeKey.isStandard(node.key);\n }\n /** Checks whether the given node is an ECInstances-based node */\n export function isInstancesNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedInstanceHierarchyNode : NonGroupingHierarchyNode) & { key: InstancesNodeKey } {\n return HierarchyNodeKey.isInstances(node.key);\n }\n /** Checks whether the given node is a grouping node */\n export function isGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedGroupingHierarchyNode : GroupingHierarchyNode) {\n return HierarchyNodeKey.isGrouping(node.key);\n }\n /** Checks whether the given node is a class grouping node */\n export function isClassGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: ClassGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isClassGrouping(node.key);\n }\n /** Checks whether the given node is a label grouping node */\n export function isLabelGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: LabelGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isLabelGrouping(node.key);\n }\n /** Checks whether the given node is property grouping node for other values */\n export function isPropertyOtherValuesGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyOtherValuesGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyOtherValuesGrouping(node.key);\n }\n /** Checks whether the given node is a property value grouping node */\n export function isPropertyValueGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueGrouping(node.key);\n }\n /** Checks whether the given node is a property value range grouping node */\n export function isPropertyValueRangeGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueRangeGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueRangeGrouping(node.key);\n }\n /** Checks whether the given node is a property grouping node */\n export function isPropertyGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyGrouping(node.key);\n }\n}\n\n/**\n * A type of `HierarchyNode` that doesn't know about its children and is an input when requesting\n * them using `HierarchyProvider.getNodes`.\n */\nexport type ParentHierarchyNode<TBase = HierarchyNode> = OmitOverUnion<TBase, \"children\">;\n\n/**\n * Base processing parameters that apply to every node.\n */\ninterface HierarchyNodeProcessingParamsBase {\n /** Indicates if this node should be hidden if it has no child nodes. */\n hideIfNoChildren?: boolean;\n /** Indicates that this node should always be hidden and its children should be loaded in its place. */\n hideInHierarchy?: boolean;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n */\ninterface HierarchyNodeGroupingParams {\n byLabel?: HierarchyNodeLabelGroupingParams;\n byClass?: boolean | HierarchyNodeGroupingParamsBase;\n byBaseClasses?: HierarchyNodeBaseClassGroupingParams;\n byProperties?: HierarchyNodePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining params specifically used for label grouping.\n */\ninterface HierarchyNodeLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Value that needs to match in order for nodes to be grouped or merged.*/\n groupId?: string;\n}\n\n/**\n * A data structure for defining label merging.\n */\ninterface HierarchyNodeLabelGroupingMergeParams extends HierarchyNodeLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping with additional parameters.\n */\ninterface HierarchyNodeLabelGroupingGroupParams extends HierarchyNodeLabelGroupingBaseParams, HierarchyNodeGroupingParamsBase {\n action?: \"group\";\n}\n\n/** A data structure for defining possible label grouping types. */\nexport type HierarchyNodeLabelGroupingParams = boolean | HierarchyNodeLabelGroupingMergeParams | HierarchyNodeLabelGroupingGroupParams;\n\n/** Grouping parameters that are shared across all types of groupings. */\nexport interface HierarchyNodeGroupingParamsBase {\n /** Hiding option that determines whether to hide group nodes which have no siblings at the same hierarchy level. */\n hideIfNoSiblings?: boolean;\n /** Hiding option that determines whether to hide group nodes which have only one node as its children. */\n hideIfOneGroupedNode?: boolean;\n /** Option which auto expands grouping nodes' children when it has single child or always. */\n autoExpand?: HierarchyNodeAutoExpandProp;\n}\n\n/**\n * Defines possible values for `BaseGroupingParams.autoExpand` attribute:\n * - `single-child` - set the grouping node to auto-expand if it groups a single node.\n * - `always` - always set the grouping node to auto-expand.\n */\nexport type HierarchyNodeAutoExpandProp = \"single-child\" | \"always\";\n\n/**\n * A data structure that represents base class grouping.\n */\ninterface HierarchyNodeBaseClassGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full names of classes, which should be used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n fullClassNames: string[];\n}\n\n/** A data structure that represents properties grouping. */\nexport interface HierarchyNodePropertiesGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: string;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean;\n /**\n * Properties of the specified class, by which the nodes should be grouped. Each provided group definition results in a\n * grouping hierarchy level.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyValue: \"Wall\"\n * },\n * {\n * propertyName: \"length\",\n * propertyValue: 15,\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: HierarchyNodePropertyGroup[];\n}\n\n/** A data structure that represents specific properties' grouping params. */\nexport interface HierarchyNodePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Value of the property, which will be used to group the node. */\n propertyValue?: PrimitiveValue;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: HierarchyNodePropertyValueRange[];\n}\n\n/** A data structure that represents boundaries for a value. */\nexport interface HierarchyNodePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number;\n /** Defines the upper bound of the range. */\n toValue: number;\n /** Defines the range label. Will be used as `PropertyValueRangeGroupingNode` node's display label. */\n rangeLabel?: string;\n}\n\n/** Processing parameters that apply to instance nodes. */\nexport interface InstanceHierarchyNodeProcessingParams extends HierarchyNodeProcessingParamsBase {\n grouping?: HierarchyNodeGroupingParams;\n}\n\n/** A custom (not based on data in an iModel) node that has processing parameters. */\nexport type ProcessedCustomHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: string;\n children?: boolean;\n processingParams?: HierarchyNodeProcessingParamsBase;\n};\n/** An instances' (based on data in an iModel) node that has processing parameters. */\nexport type ProcessedInstanceHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: InstancesNodeKey;\n children?: boolean;\n processingParams?: InstanceHierarchyNodeProcessingParams;\n};\n/** A grouping node that groups either instance nodes or other grouping nodes. */\nexport type ProcessedGroupingHierarchyNode = Omit<GroupingHierarchyNode, \"children\"> & {\n children: Array<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>;\n};\n/**\n * A `HierarchyNode` that may have processing parameters defining whether it should be hidden under some conditions,\n * how it should be grouped, sorted, etc.\n *\n * Type guards under `HierarchyNode` namespace can be used to differentiate between different sub-types of\n * `ProcessedHierarchyNode`.\n *\n * @beta\n */\nexport type ProcessedHierarchyNode = ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode | ProcessedGroupingHierarchyNode;\n\n/**\n * A `ProcessedHierarchyNode` that has an unformatted label in a form of `ConcatenatedValue`. Generally this is\n * returned when the node is just parsed from query results.\n * @beta\n */\nexport type ParsedHierarchyNode<TBase = ParsedCustomHierarchyNode | ParsedInstanceHierarchyNode> = OmitOverUnion<TBase, \"label\" | \"parentKeys\"> & {\n label: string | ConcatenatedValue;\n};\n/** A kind of `ProcessedCustomHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedCustomHierarchyNode = ParsedHierarchyNode<ProcessedCustomHierarchyNode>;\n/** A kind of `ProcessedInstanceHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedInstanceHierarchyNode = ParsedHierarchyNode<ProcessedInstanceHierarchyNode>;\n"]}
|
|
1
|
+
{"version":3,"file":"HierarchyNode.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAIhG,yDAW4B;AA8D5B,YAAY;AACZ,2DAA2D;AAC3D,IAAiB,aAAa,CAuE7B;AAvED,WAAiB,aAAa;IAC5B,qDAAqD;IACrD,SAAgB,QAAQ,CACtB,IAAW;QAEX,OAAO,mCAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAJe,sBAAQ,WAIvB,CAAA;IACD,8EAA8E;IAC9E,SAAgB,UAAU,CAA0C,IAAW;QAC7E,OAAO,mCAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAFe,wBAAU,aAEzB,CAAA;IACD,iEAAiE;IACjE,SAAgB,eAAe,CAC7B,IAAW;QAEX,OAAO,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAJe,6BAAe,kBAI9B,CAAA;IACD,uDAAuD;IACvD,SAAgB,cAAc,CAC5B,IAAW;QAEX,OAAO,mCAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAJe,4BAAc,iBAI7B,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,mCAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,mCAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,gFAAgF;IAChF,SAAgB,iCAAiC,CAC/C,IAAW;QAIX,OAAO,mCAAgB,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IANe,+CAAiC,oCAMhD,CAAA;IACD,sEAAsE;IACtE,SAAgB,2BAA2B,CACzC,IAAW;QAIX,OAAO,mCAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IANe,yCAA2B,8BAM1C,CAAA;IACD,4EAA4E;IAC5E,SAAgB,gCAAgC,CAC9C,IAAW;QAIX,OAAO,mCAAgB,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IANe,8CAAgC,mCAM/C,CAAA;IACD,gEAAgE;IAChE,SAAgB,sBAAsB,CACpC,IAAW;QAIX,OAAO,mCAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IANe,oCAAsB,yBAMrC,CAAA;AACH,CAAC,EAvEgB,aAAa,6BAAb,aAAa,QAuE7B","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 { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from \"@itwin/presentation-shared\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport {\n ClassGroupingNodeKey,\n GroupingNodeKey,\n HierarchyNodeKey,\n InstancesNodeKey,\n LabelGroupingNodeKey,\n PropertyGroupingNodeKey,\n PropertyOtherValuesGroupingNodeKey,\n PropertyValueGroupingNodeKey,\n PropertyValueRangeGroupingNodeKey,\n StandardHierarchyNodeKey,\n} from \"./HierarchyNodeKey\";\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n */\ninterface BaseHierarchyNode {\n /** Identifiers of all node ancestors. Can be used to identify a node in the hierarchy. */\n parentKeys: HierarchyNodeKey[];\n /** Node's display label. */\n label: string;\n /** A flag indicating whether the node has children or not. */\n children: boolean;\n /** A flag indicating whether this node should be auto-expanded in the UI. */\n autoExpand?: boolean;\n /** Additional data that may be assigned to this node. */\n extendedData?: { [key: string]: any };\n /** Data that may be assigned to the node if filtering is enabled */\n filtering?: {\n isFilterTarget?: boolean;\n hasFilterTargetAncestor?: boolean;\n filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n * @beta\n */\nexport interface NonGroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify the node in its hierarchy level. */\n key: string | InstancesNodeKey;\n /**\n * Identifies whether the hierarchy level below this node supports filtering. If not, supplying an instance\n * filter when requesting child hierarchy level will have no effect.\n */\n supportsFiltering?: boolean;\n}\n\n/**\n * A data structure that represents a grouping node that groups other nodes.\n * @beta\n */\nexport interface GroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify this grouping node in its hierarchy level. */\n key: GroupingNodeKey;\n\n /**\n * Keys of all instances grouped by this node, including deeply nested under\n * other grouping nodes.\n */\n groupedInstanceKeys: InstanceKey[];\n\n /** The closest ancestor node that is not a grouping node. May be `undefined` if the grouping node grouped root level nodes. */\n nonGroupingAncestor?: ParentHierarchyNode<NonGroupingHierarchyNode>;\n}\n\n/**\n * A data structure that represents a single hierarchy node.\n * @beta\n */\nexport type HierarchyNode = NonGroupingHierarchyNode | GroupingHierarchyNode;\n\n/** @beta */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace HierarchyNode {\n /** Checks whether the given node is a custom node */\n export function isCustom<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedCustomHierarchyNode : NonGroupingHierarchyNode) & { key: string } {\n return HierarchyNodeKey.isCustom(node.key);\n }\n /** Checks whether the given node is a standard (iModel content based) node */\n export function isStandard<TNode extends { key: HierarchyNodeKey }>(node: TNode): node is TNode & { key: StandardHierarchyNodeKey } {\n return HierarchyNodeKey.isStandard(node.key);\n }\n /** Checks whether the given node is an ECInstances-based node */\n export function isInstancesNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedInstanceHierarchyNode : NonGroupingHierarchyNode) & { key: InstancesNodeKey } {\n return HierarchyNodeKey.isInstances(node.key);\n }\n /** Checks whether the given node is a grouping node */\n export function isGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedGroupingHierarchyNode : GroupingHierarchyNode) {\n return HierarchyNodeKey.isGrouping(node.key);\n }\n /** Checks whether the given node is a class grouping node */\n export function isClassGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: ClassGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isClassGrouping(node.key);\n }\n /** Checks whether the given node is a label grouping node */\n export function isLabelGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: LabelGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isLabelGrouping(node.key);\n }\n /** Checks whether the given node is property grouping node for other values */\n export function isPropertyOtherValuesGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyOtherValuesGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyOtherValuesGrouping(node.key);\n }\n /** Checks whether the given node is a property value grouping node */\n export function isPropertyValueGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueGrouping(node.key);\n }\n /** Checks whether the given node is a property value range grouping node */\n export function isPropertyValueRangeGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueRangeGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueRangeGrouping(node.key);\n }\n /** Checks whether the given node is a property grouping node */\n export function isPropertyGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyGrouping(node.key);\n }\n}\n\n/**\n * A type of `HierarchyNode` that doesn't know about its children and is an input when requesting\n * them using `HierarchyProvider.getNodes`.\n */\nexport type ParentHierarchyNode<TBase = HierarchyNode> = OmitOverUnion<TBase, \"children\">;\n\n/**\n * Base processing parameters that apply to every node.\n */\ninterface HierarchyNodeProcessingParamsBase {\n /** Indicates if this node should be hidden if it has no child nodes. */\n hideIfNoChildren?: boolean;\n /** Indicates that this node should always be hidden and its children should be loaded in its place. */\n hideInHierarchy?: boolean;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n */\ninterface HierarchyNodeGroupingParams {\n byLabel?: HierarchyNodeLabelGroupingParams;\n byClass?: boolean | HierarchyNodeGroupingParamsBase;\n byBaseClasses?: HierarchyNodeBaseClassGroupingParams;\n byProperties?: HierarchyNodePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining params specifically used for label grouping.\n */\ninterface HierarchyNodeLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Value that needs to match in order for nodes to be grouped or merged.*/\n groupId?: string;\n}\n\n/**\n * A data structure for defining label merging.\n */\ninterface HierarchyNodeLabelGroupingMergeParams extends HierarchyNodeLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping with additional parameters.\n */\ninterface HierarchyNodeLabelGroupingGroupParams extends HierarchyNodeLabelGroupingBaseParams, HierarchyNodeGroupingParamsBase {\n action?: \"group\";\n}\n\n/** A data structure for defining possible label grouping types. */\nexport type HierarchyNodeLabelGroupingParams = boolean | HierarchyNodeLabelGroupingMergeParams | HierarchyNodeLabelGroupingGroupParams;\n\n/** Grouping parameters that are shared across all types of groupings. */\nexport interface HierarchyNodeGroupingParamsBase {\n /** Hiding option that determines whether to hide group nodes which have no siblings at the same hierarchy level. */\n hideIfNoSiblings?: boolean;\n /** Hiding option that determines whether to hide group nodes which have only one node as its children. */\n hideIfOneGroupedNode?: boolean;\n /** Option which auto expands grouping nodes' children when it has single child or always. */\n autoExpand?: HierarchyNodeAutoExpandProp;\n}\n\n/**\n * Defines possible values for `BaseGroupingParams.autoExpand` attribute:\n * - `single-child` - set the grouping node to auto-expand if it groups a single node.\n * - `always` - always set the grouping node to auto-expand.\n */\nexport type HierarchyNodeAutoExpandProp = \"single-child\" | \"always\";\n\n/**\n * A data structure that represents base class grouping.\n */\ninterface HierarchyNodeBaseClassGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full names of classes, which should be used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n fullClassNames: string[];\n}\n\n/** A data structure that represents properties grouping. */\nexport interface HierarchyNodePropertiesGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: string;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean;\n /**\n * Properties of the specified class, by which the nodes should be grouped. Each provided group definition results in a\n * grouping hierarchy level.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyValue: \"Wall\"\n * },\n * {\n * propertyName: \"length\",\n * propertyValue: 15,\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: HierarchyNodePropertyGroup[];\n}\n\n/** A data structure that represents specific properties' grouping params. */\nexport interface HierarchyNodePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Value of the property, which will be used to group the node. */\n propertyValue?: PrimitiveValue;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: HierarchyNodePropertyValueRange[];\n}\n\n/** A data structure that represents boundaries for a value. */\nexport interface HierarchyNodePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number;\n /** Defines the upper bound of the range. */\n toValue: number;\n /** Defines the range label. Will be used as `PropertyValueRangeGroupingNode` node's display label. */\n rangeLabel?: string;\n}\n\n/** Processing parameters that apply to instance nodes. */\nexport interface InstanceHierarchyNodeProcessingParams extends HierarchyNodeProcessingParamsBase {\n grouping?: HierarchyNodeGroupingParams;\n}\n\n/** A custom (not based on data in an iModel) node that has processing parameters. */\nexport type ProcessedCustomHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: string;\n children?: boolean;\n processingParams?: HierarchyNodeProcessingParamsBase;\n};\n/** An instances' (based on data in an iModel) node that has processing parameters. */\nexport type ProcessedInstanceHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: InstancesNodeKey;\n children?: boolean;\n processingParams?: InstanceHierarchyNodeProcessingParams;\n};\n/** A grouping node that groups either instance nodes or other grouping nodes. */\nexport type ProcessedGroupingHierarchyNode = Omit<GroupingHierarchyNode, \"children\"> & {\n children: Array<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>;\n};\n\n/**\n * A `HierarchyNode` that may have processing parameters defining whether it should be hidden under some conditions,\n * how it should be grouped, sorted, etc.\n *\n * Type guards under `HierarchyNode` namespace can be used to differentiate between different sub-types of\n * `ProcessedHierarchyNode`.\n *\n * @beta\n */\nexport type ProcessedHierarchyNode = ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode | ProcessedGroupingHierarchyNode;\n\n/**\n * A `ProcessedHierarchyNode` that has an unformatted label in a form of `ConcatenatedValue`. Generally this is\n * returned when the node is just parsed from query results.\n * @beta\n */\nexport type ParsedHierarchyNode<TBase = ParsedCustomHierarchyNode | ParsedInstanceHierarchyNode> = OmitOverUnion<TBase, \"label\" | \"parentKeys\"> & {\n label: string | ConcatenatedValue;\n};\n/** A kind of `ProcessedCustomHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedCustomHierarchyNode = ParsedHierarchyNode<ProcessedCustomHierarchyNode>;\n/** A kind of `ProcessedInstanceHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedInstanceHierarchyNode = ParsedHierarchyNode<ProcessedInstanceHierarchyNode>;\n"]}
|
|
@@ -328,11 +328,13 @@ class HierarchyProviderImpl {
|
|
|
328
328
|
}
|
|
329
329
|
function preProcessNodes(hierarchyFactory) {
|
|
330
330
|
return hierarchyFactory.preProcessNode
|
|
331
|
-
? processNodes(hierarchyFactory.preProcessNode)
|
|
331
|
+
? processNodes(hierarchyFactory.preProcessNode.bind(hierarchyFactory))
|
|
332
332
|
: (o) => o;
|
|
333
333
|
}
|
|
334
334
|
function postProcessNodes(hierarchyFactory) {
|
|
335
|
-
return hierarchyFactory.postProcessNode
|
|
335
|
+
return hierarchyFactory.postProcessNode
|
|
336
|
+
? processNodes(hierarchyFactory.postProcessNode.bind(hierarchyFactory))
|
|
337
|
+
: (o) => o;
|
|
336
338
|
}
|
|
337
339
|
function processNodes(processor) {
|
|
338
340
|
return (nodes) => nodes.pipe((0, rxjs_1.mergeMap)(processor), (0, rxjs_1.filter)((n) => !!n));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyProvider.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyProvider.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 {\n catchError,\n concat,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n finalize,\n from,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n of,\n take,\n tap,\n} from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter } from \"@itwin/core-common\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyNodesDefinition } from \"./HierarchyDefinition\";\nimport { RowsLimitExceededError } from \"./HierarchyErrors\";\nimport {\n HierarchyNode,\n NonGroupingHierarchyNode,\n ParentHierarchyNode,\n ParsedHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedGroupingHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"./HierarchyNode\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport { InstancesNodeKey } from \"./HierarchyNodeKey\";\nimport { CachedNodesObservableEntry, ChildNodeObservablesCache, ParsedQueryNodesObservable } from \"./internal/ChildNodeObservablesCache\";\nimport { LOGGING_NAMESPACE as CommonLoggingNamespace, createNodeIdentifierForLogging, hasChildren } from \"./internal/Common\";\nimport { eachValueFrom } from \"./internal/EachValueFrom\";\nimport { FilteringHierarchyDefinition } from \"./internal/FilteringHierarchyDefinition\";\nimport { createQueryLogMessage, doLog, log } from \"./internal/LoggingUtils\";\nimport { createDetermineChildrenOperator } from \"./internal/operators/DetermineChildren\";\nimport { createGroupingOperator } from \"./internal/operators/Grouping\";\nimport { createHideIfNoChildrenOperator } from \"./internal/operators/HideIfNoChildren\";\nimport { createHideNodesInHierarchyOperator } from \"./internal/operators/HideNodesInHierarchy\";\nimport { partition } from \"./internal/operators/Partition\";\nimport { reduceToMergeMapList } from \"./internal/operators/ReduceToMergeMap\";\nimport { shareReplayWithErrors } from \"./internal/operators/ShareReplayWithErrors\";\nimport { sortNodesByLabelOperator } from \"./internal/operators/Sorting\";\nimport { SubscriptionScheduler } from \"./internal/SubscriptionScheduler\";\nimport { readNodes } from \"./internal/TreeNodesReader\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory\";\n\nconst LOGGING_NAMESPACE = `${CommonLoggingNamespace}.HierarchyProvider`;\nconst PERF_LOGGING_NAMESPACE = `${LOGGING_NAMESPACE}.Performance`;\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Props for the `HierarchyProvider.getNodes` call.\n * @beta\n */\nexport interface GetHierarchyNodesProps {\n /** Parent node to get children for. Pass `undefined` to get root nodes. */\n parentNode: ParentHierarchyNode | undefined;\n\n /** Optional hierarchy level filter. Has no effect if `parentNode` is a `GroupingNode`. */\n instanceFilter?: GenericInstanceFilter;\n\n /**\n * Optional hierarchy level size limit override. This value is passed to `LimitingECSqlQueryExecutor` used\n * by this provider to override query rows limit per hierarchy level. If not provided, defaults to whatever\n * is used by the limiting query executor.\n *\n * Has no effect if `parentNode` is a `GroupingNode`.\n */\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n\n /** When set to true ignores the cache and fetches the nodes again. */\n ignoreCache?: boolean;\n}\n\n/**\n * An interface for a hierarchy provider knows how to create child nodes for a given parent node.\n * @beta\n */\nexport interface HierarchyProvider {\n /** Gets nodes for the specified parent node. */\n getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode>;\n\n /** Gets instance keys for the specified parent node. */\n getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey>;\n\n /** Notifies the provider that the underlying data source has changed and caches should be invalidated. */\n notifyDataSourceChanged(): void;\n\n /**\n * Overrides the property value formatter used by the hierarchy provider. Setting to `undefined`\n * resets the formatter to the result of `createDefaultValueFormatter` called with default parameters.\n */\n setFormatter(formatter: IPrimitiveValueFormatter | undefined): void;\n}\n\n/**\n * Defines the strings used by hierarchy provider.\n */\ninterface HierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/**\n * Props for `createHierarchyProvider`.\n */\ninterface HierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n formatter?: IPrimitiveValueFormatter;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<HierarchyProviderLocalizedStrings>;\n\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @beta\n */\nexport function createHierarchyProvider(props: HierarchyProviderProps): HierarchyProvider {\n return new HierarchyProviderImpl(props);\n}\n\nclass HierarchyProviderImpl implements HierarchyProvider {\n private _imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _localizedStrings: HierarchyProviderLocalizedStrings;\n private _queryScheduler: SubscriptionScheduler;\n private _nodesCache?: ChildNodeObservablesCache;\n\n /**\n * Hierarchy level definitions factory used by this provider.\n *\n * @note This does not necessarily match the `hierarchyDefinition` passed through props when constructing\n * the provider. For example, it may be a factory that decorates given `hierarchyDefinition` with filtering\n * features.\n */\n public readonly hierarchyDefinition: HierarchyDefinition;\n\n /**\n * A limiting ECSQL query executor used by this provider.\n * @see HierarchyProviderProps.queryExecutor\n */\n public get queryExecutor(): LimitingECSqlQueryExecutor {\n return this._imodelAccess;\n }\n\n public constructor(props: HierarchyProviderProps) {\n this._imodelAccess = props.imodelAccess;\n this.hierarchyDefinition = props.hierarchyDefinition;\n if (props.filtering) {\n const filteringDefinition = new FilteringHierarchyDefinition({\n classHierarchy: this._imodelAccess,\n source: this.hierarchyDefinition,\n nodeIdentifierPaths: props.filtering.paths,\n });\n this.hierarchyDefinition = filteringDefinition;\n }\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryScheduler = new SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new ChildNodeObservablesCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createParsedQueryNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] },\n ): ParsedQueryNodesObservable {\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n // stream hierarchy level definitions\n const definitions = from(defer(async () => this.hierarchyDefinition.defineHierarchyLevel(props))).pipe(\n mergeAll(),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n // pipe definitions to nodes and put \"share replay\" on it\n return definitions.pipe(\n mergeMap((def): ObservableInput<ParsedHierarchyNode> => {\n if (HierarchyNodesDefinition.isCustomNode(def)) {\n return of(def.node);\n }\n return this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n log({\n category: `${LOGGING_NAMESPACE}.Queries`,\n message: /* istanbul ignore next */ (query) =>\n `Query direct nodes for parent ${createNodeIdentifierForLogging(props.parentNode)}: ${createQueryLogMessage(query)}`,\n }),\n mergeMap((query) =>\n readNodes({ queryExecutor: this.queryExecutor, query, limit: props.hierarchyLevelSizeLimit, parser: this.hierarchyDefinition.parseNode }),\n ),\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createInitializedNodesObservable(nodes: Observable<ParsedHierarchyNode>, parentNode: ParentHierarchyNode | undefined) {\n return nodes.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the parsed node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap(async (node) => applyLabelsFormatting(node, this._imodelAccess, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n preProcessNodes(this.hierarchyDefinition),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished initializing child nodes for ${createNodeIdentifierForLogging(parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: ParsedQueryNodesObservable,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return this.createInitializedNodesObservable(queryNodesObservable, props.parentNode).pipe(\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n postProcessNodes(this.hierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (HierarchyNode.isCustom(n) || HierarchyNode.isInstancesNode(n)) {\n delete n.processingParams;\n }\n return Object.assign(n, {\n children: hasChildren(n),\n });\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable?: ParsedQueryNodesObservable,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({ category: loggingCategory, message: /* istanbul ignore next */ (n) => `Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}` }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({ category: loggingCategory, message: /* istanbul ignore next */ () => `Error while determining children: ${e.message}` });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* istanbul ignore next */ (r) => `Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps): CachedNodesObservableEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetCachedObservableEntry`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n // istanbul ignore next\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createParsedQueryNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" }) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables(props).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () =>\n error\n ? `Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\" } = props;\n\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n\n assert(!parentNode || HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n // split the definitions based on whether they're for custom nodes or for instance nodes\n const [customDefs, instanceDefs] = partition(\n from(this.hierarchyDefinition.defineHierarchyLevel({ parentNode, instanceFilter })).pipe(mergeAll()),\n HierarchyNodesDefinition.isCustomNode,\n );\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap((def) =>\n this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = this.queryExecutor.createQueryReader({ ...query, ecsql }, { rowFormat: \"Indexes\", limit: hierarchyLevelSizeLimit });\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n },\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a custom node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n customDefs.pipe(\n mergeMap((def) => (def.node.processingParams?.hideInHierarchy ? this.createInitializedNodesObservable(of(def.node), parentNode) : EMPTY)),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key.id,\n ),\n // then, for each class, create a temp node\n mergeMap(\n (mergedMap): Array<ParentHierarchyNode & { key: InstancesNodeKey }> =>\n [...mergedMap.entries()].map(([className, ids]) => ({\n key: {\n type: \"instances\",\n instanceKeys: ids.map((id) => ({ className, id })),\n },\n parentKeys: [],\n label: \"\",\n })),\n ),\n ),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode }))),\n );\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(this.getNodeInstanceKeysObs(props));\n }\n\n /**\n * A function that should be called when the underlying data source, used by `HierarchyProviderProps.schemaProvider`,\n * `HierarchyProviderProps.queryExecutor` or `HierarchyProviderProps.hierarchyDefinition`, changes.\n *\n * Calling the function invalidates internal caches to make sure fresh data is retrieved on new requests.\n */\n public notifyDataSourceChanged() {\n this._nodesCache?.clear();\n }\n}\n\nfunction preProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.preProcessNode\n ? processNodes(hierarchyFactory.preProcessNode)\n : (o: Observable<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>) => o;\n}\n\nfunction postProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode) : (o: Observable<ProcessedHierarchyNode>) => o;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Promise<TNode | undefined>) {\n return (nodes: Observable<TNode>) =>\n nodes.pipe(\n mergeMap(processor),\n filter((n): n is TNode => !!n),\n );\n}\n\nasync function applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n schemaProvider: ECSchemaProvider,\n valueFormatter: IPrimitiveValueFormatter,\n): Promise<TNode & { label: string }> {\n return {\n ...node,\n label: await formatConcatenatedValue({\n value: node.label,\n schemaProvider,\n valueFormatter,\n }),\n };\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n // istanbul ignore else\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n // istanbul ignore next\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HierarchyProvider.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyProvider.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 {\n catchError,\n concat,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n finalize,\n from,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n of,\n take,\n tap,\n} from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter } from \"@itwin/core-common\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyNodesDefinition } from \"./HierarchyDefinition\";\nimport { RowsLimitExceededError } from \"./HierarchyErrors\";\nimport {\n HierarchyNode,\n NonGroupingHierarchyNode,\n ParentHierarchyNode,\n ParsedHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedGroupingHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"./HierarchyNode\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport { InstancesNodeKey } from \"./HierarchyNodeKey\";\nimport { CachedNodesObservableEntry, ChildNodeObservablesCache, ParsedQueryNodesObservable } from \"./internal/ChildNodeObservablesCache\";\nimport { LOGGING_NAMESPACE as CommonLoggingNamespace, createNodeIdentifierForLogging, hasChildren } from \"./internal/Common\";\nimport { eachValueFrom } from \"./internal/EachValueFrom\";\nimport { FilteringHierarchyDefinition } from \"./internal/FilteringHierarchyDefinition\";\nimport { createQueryLogMessage, doLog, log } from \"./internal/LoggingUtils\";\nimport { createDetermineChildrenOperator } from \"./internal/operators/DetermineChildren\";\nimport { createGroupingOperator } from \"./internal/operators/Grouping\";\nimport { createHideIfNoChildrenOperator } from \"./internal/operators/HideIfNoChildren\";\nimport { createHideNodesInHierarchyOperator } from \"./internal/operators/HideNodesInHierarchy\";\nimport { partition } from \"./internal/operators/Partition\";\nimport { reduceToMergeMapList } from \"./internal/operators/ReduceToMergeMap\";\nimport { shareReplayWithErrors } from \"./internal/operators/ShareReplayWithErrors\";\nimport { sortNodesByLabelOperator } from \"./internal/operators/Sorting\";\nimport { SubscriptionScheduler } from \"./internal/SubscriptionScheduler\";\nimport { readNodes } from \"./internal/TreeNodesReader\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory\";\n\nconst LOGGING_NAMESPACE = `${CommonLoggingNamespace}.HierarchyProvider`;\nconst PERF_LOGGING_NAMESPACE = `${LOGGING_NAMESPACE}.Performance`;\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Props for the `HierarchyProvider.getNodes` call.\n * @beta\n */\nexport interface GetHierarchyNodesProps {\n /** Parent node to get children for. Pass `undefined` to get root nodes. */\n parentNode: ParentHierarchyNode | undefined;\n\n /** Optional hierarchy level filter. Has no effect if `parentNode` is a `GroupingNode`. */\n instanceFilter?: GenericInstanceFilter;\n\n /**\n * Optional hierarchy level size limit override. This value is passed to `LimitingECSqlQueryExecutor` used\n * by this provider to override query rows limit per hierarchy level. If not provided, defaults to whatever\n * is used by the limiting query executor.\n *\n * Has no effect if `parentNode` is a `GroupingNode`.\n */\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n\n /** When set to true ignores the cache and fetches the nodes again. */\n ignoreCache?: boolean;\n}\n\n/**\n * An interface for a hierarchy provider knows how to create child nodes for a given parent node.\n * @beta\n */\nexport interface HierarchyProvider {\n /** Gets nodes for the specified parent node. */\n getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode>;\n\n /** Gets instance keys for the specified parent node. */\n getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey>;\n\n /** Notifies the provider that the underlying data source has changed and caches should be invalidated. */\n notifyDataSourceChanged(): void;\n\n /**\n * Overrides the property value formatter used by the hierarchy provider. Setting to `undefined`\n * resets the formatter to the result of `createDefaultValueFormatter` called with default parameters.\n */\n setFormatter(formatter: IPrimitiveValueFormatter | undefined): void;\n}\n\n/**\n * Defines the strings used by hierarchy provider.\n */\ninterface HierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/**\n * Props for `createHierarchyProvider`.\n */\ninterface HierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n formatter?: IPrimitiveValueFormatter;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<HierarchyProviderLocalizedStrings>;\n\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @beta\n */\nexport function createHierarchyProvider(props: HierarchyProviderProps): HierarchyProvider {\n return new HierarchyProviderImpl(props);\n}\n\nclass HierarchyProviderImpl implements HierarchyProvider {\n private _imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _localizedStrings: HierarchyProviderLocalizedStrings;\n private _queryScheduler: SubscriptionScheduler;\n private _nodesCache?: ChildNodeObservablesCache;\n\n /**\n * Hierarchy level definitions factory used by this provider.\n *\n * @note This does not necessarily match the `hierarchyDefinition` passed through props when constructing\n * the provider. For example, it may be a factory that decorates given `hierarchyDefinition` with filtering\n * features.\n */\n public readonly hierarchyDefinition: HierarchyDefinition;\n\n /**\n * A limiting ECSQL query executor used by this provider.\n * @see HierarchyProviderProps.queryExecutor\n */\n public get queryExecutor(): LimitingECSqlQueryExecutor {\n return this._imodelAccess;\n }\n\n public constructor(props: HierarchyProviderProps) {\n this._imodelAccess = props.imodelAccess;\n this.hierarchyDefinition = props.hierarchyDefinition;\n if (props.filtering) {\n const filteringDefinition = new FilteringHierarchyDefinition({\n classHierarchy: this._imodelAccess,\n source: this.hierarchyDefinition,\n nodeIdentifierPaths: props.filtering.paths,\n });\n this.hierarchyDefinition = filteringDefinition;\n }\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryScheduler = new SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new ChildNodeObservablesCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createParsedQueryNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] },\n ): ParsedQueryNodesObservable {\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n // stream hierarchy level definitions\n const definitions = from(defer(async () => this.hierarchyDefinition.defineHierarchyLevel(props))).pipe(\n mergeAll(),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n // pipe definitions to nodes and put \"share replay\" on it\n return definitions.pipe(\n mergeMap((def): ObservableInput<ParsedHierarchyNode> => {\n if (HierarchyNodesDefinition.isCustomNode(def)) {\n return of(def.node);\n }\n return this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n log({\n category: `${LOGGING_NAMESPACE}.Queries`,\n message: /* istanbul ignore next */ (query) =>\n `Query direct nodes for parent ${createNodeIdentifierForLogging(props.parentNode)}: ${createQueryLogMessage(query)}`,\n }),\n mergeMap((query) =>\n readNodes({ queryExecutor: this.queryExecutor, query, limit: props.hierarchyLevelSizeLimit, parser: this.hierarchyDefinition.parseNode }),\n ),\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createInitializedNodesObservable(nodes: Observable<ParsedHierarchyNode>, parentNode: ParentHierarchyNode | undefined) {\n return nodes.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the parsed node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap(async (node) => applyLabelsFormatting(node, this._imodelAccess, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n preProcessNodes(this.hierarchyDefinition),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished initializing child nodes for ${createNodeIdentifierForLogging(parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: ParsedQueryNodesObservable,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return this.createInitializedNodesObservable(queryNodesObservable, props.parentNode).pipe(\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n postProcessNodes(this.hierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (HierarchyNode.isCustom(n) || HierarchyNode.isInstancesNode(n)) {\n delete n.processingParams;\n }\n return Object.assign(n, {\n children: hasChildren(n),\n });\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable?: ParsedQueryNodesObservable,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({ category: loggingCategory, message: /* istanbul ignore next */ (n) => `Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}` }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({ category: loggingCategory, message: /* istanbul ignore next */ () => `Error while determining children: ${e.message}` });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* istanbul ignore next */ (r) => `Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps): CachedNodesObservableEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetCachedObservableEntry`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n // istanbul ignore next\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createParsedQueryNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" }) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables(props).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () =>\n error\n ? `Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\" } = props;\n\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n\n assert(!parentNode || HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n // split the definitions based on whether they're for custom nodes or for instance nodes\n const [customDefs, instanceDefs] = partition(\n from(this.hierarchyDefinition.defineHierarchyLevel({ parentNode, instanceFilter })).pipe(mergeAll()),\n HierarchyNodesDefinition.isCustomNode,\n );\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap((def) =>\n this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = this.queryExecutor.createQueryReader({ ...query, ecsql }, { rowFormat: \"Indexes\", limit: hierarchyLevelSizeLimit });\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n },\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a custom node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n customDefs.pipe(\n mergeMap((def) => (def.node.processingParams?.hideInHierarchy ? this.createInitializedNodesObservable(of(def.node), parentNode) : EMPTY)),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key.id,\n ),\n // then, for each class, create a temp node\n mergeMap(\n (mergedMap): Array<ParentHierarchyNode & { key: InstancesNodeKey }> =>\n [...mergedMap.entries()].map(([className, ids]) => ({\n key: {\n type: \"instances\",\n instanceKeys: ids.map((id) => ({ className, id })),\n },\n parentKeys: [],\n label: \"\",\n })),\n ),\n ),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode }))),\n );\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(this.getNodeInstanceKeysObs(props));\n }\n\n /**\n * A function that should be called when the underlying data source, used by `HierarchyProviderProps.schemaProvider`,\n * `HierarchyProviderProps.queryExecutor` or `HierarchyProviderProps.hierarchyDefinition`, changes.\n *\n * Calling the function invalidates internal caches to make sure fresh data is retrieved on new requests.\n */\n public notifyDataSourceChanged() {\n this._nodesCache?.clear();\n }\n}\n\nfunction preProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.preProcessNode\n ? processNodes(hierarchyFactory.preProcessNode.bind(hierarchyFactory))\n : (o: Observable<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>) => o;\n}\n\nfunction postProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.postProcessNode\n ? processNodes(hierarchyFactory.postProcessNode.bind(hierarchyFactory))\n : (o: Observable<ProcessedHierarchyNode>) => o;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Promise<TNode | undefined>) {\n return (nodes: Observable<TNode>) =>\n nodes.pipe(\n mergeMap(processor),\n filter((n): n is TNode => !!n),\n );\n}\n\nasync function applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n schemaProvider: ECSchemaProvider,\n valueFormatter: IPrimitiveValueFormatter,\n): Promise<TNode & { label: string }> {\n return {\n ...node,\n label: await formatConcatenatedValue({\n value: node.label,\n schemaProvider,\n valueFormatter,\n }),\n };\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n // istanbul ignore else\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n // istanbul ignore next\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n}\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ECClassHierarchyInspector, InstanceKey } from "@itwin/presentation-shared";
|
|
2
2
|
import { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyLevelDefinition, InstanceNodesQueryDefinition, NodeParser, NodePostProcessor, NodePreProcessor } from "../HierarchyDefinition";
|
|
3
|
-
import { ProcessedHierarchyNode } from "../HierarchyNode";
|
|
4
3
|
import { HierarchyNodeIdentifiersPath } from "../HierarchyNodeIdentifier";
|
|
5
4
|
/** @internal */
|
|
6
5
|
export interface FilteringQueryBuilderProps {
|
|
@@ -9,12 +8,6 @@ export interface FilteringQueryBuilderProps {
|
|
|
9
8
|
nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];
|
|
10
9
|
}
|
|
11
10
|
/** @internal */
|
|
12
|
-
export type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {
|
|
13
|
-
isFilterTarget?: boolean;
|
|
14
|
-
hasFilterTargetAncestor?: boolean;
|
|
15
|
-
filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];
|
|
16
|
-
};
|
|
17
|
-
/** @internal */
|
|
18
11
|
export declare class FilteringHierarchyDefinition implements HierarchyDefinition {
|
|
19
12
|
private _classHierarchy;
|
|
20
13
|
private _source;
|
|
@@ -23,9 +16,7 @@ export declare class FilteringHierarchyDefinition implements HierarchyDefinition
|
|
|
23
16
|
get preProcessNode(): NodePreProcessor;
|
|
24
17
|
get postProcessNode(): NodePostProcessor;
|
|
25
18
|
get parseNode(): NodeParser;
|
|
26
|
-
defineHierarchyLevel(props: DefineHierarchyLevelProps
|
|
27
|
-
parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps["parentNode"]> | undefined;
|
|
28
|
-
}): Promise<HierarchyLevelDefinition>;
|
|
19
|
+
defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition>;
|
|
29
20
|
private getFilteringProps;
|
|
30
21
|
}
|
|
31
22
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilteringHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAEL,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAExB,4BAA4B,EAC5B,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FilteringHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAEL,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAExB,4BAA4B,EAC5B,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAA2B,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAGnG,gBAAgB;AAChB,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,yBAAyB,CAAC;IAC1C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mBAAmB,EAAE,4BAA4B,EAAE,CAAC;CACrD;AAED,gBAAgB;AAChB,qBAAa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,oBAAoB,CAAiC;gBAE1C,KAAK,EAAE,0BAA0B;IAMpD,IAAW,cAAc,IAAI,gBAAgB,CAS5C;IAED,IAAW,eAAe,IAAI,iBAAiB,CAc9C;IAED,IAAW,SAAS,IAAI,UAAU,CAUjC;IAEY,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAsDtG,OAAO,CAAC,iBAAiB;CAU1B;AAqED,gBAAgB;AAEhB,eAAO,MAAM,uCAAuC,0BAA0B,CAAC;AAE/E,gBAAgB;AAEhB,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,gBAAgB;AAEhB,eAAO,MAAM,yCAAyC,4BAA4B,CAAC;AAEnF,gBAAgB;AAChB,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,EACjC,eAAe,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,uBAAuB,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAAC,EACpG,cAAc,EAAE,OAAO,EACvB,oBAAoB,EAAE,OAAO,EAC7B,uBAAuB,EAAE,OAAO,GAC/B,4BAA4B,CA+B9B"}
|
|
@@ -22,8 +22,7 @@ class FilteringHierarchyDefinition {
|
|
|
22
22
|
get preProcessNode() {
|
|
23
23
|
return async (node) => {
|
|
24
24
|
const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;
|
|
25
|
-
|
|
26
|
-
if (filteredNode?.processingParams?.hideInHierarchy && filteredNode.isFilterTarget && !filteredNode.hasFilterTargetAncestor) {
|
|
25
|
+
if (processedNode?.processingParams?.hideInHierarchy && processedNode.filtering?.isFilterTarget && !processedNode.filtering.hasFilterTargetAncestor) {
|
|
27
26
|
// we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target
|
|
28
27
|
return undefined;
|
|
29
28
|
}
|
|
@@ -36,7 +35,7 @@ class FilteringHierarchyDefinition {
|
|
|
36
35
|
if (
|
|
37
36
|
// instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing
|
|
38
37
|
HierarchyNode_1.HierarchyNode.isClassGroupingNode(node) &&
|
|
39
|
-
node.children.some((child) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)) {
|
|
38
|
+
node.children.some((child) => child.filtering && (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths))) {
|
|
40
39
|
return Object.assign(processedNode, { autoExpand: true });
|
|
41
40
|
}
|
|
42
41
|
return processedNode;
|
|
@@ -95,9 +94,9 @@ class FilteringHierarchyDefinition {
|
|
|
95
94
|
return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };
|
|
96
95
|
}
|
|
97
96
|
return {
|
|
98
|
-
filteredNodePaths: parentNode.filteredChildrenIdentifierPaths,
|
|
99
|
-
isDirectParentFilterTarget: parentNode.isFilterTarget,
|
|
100
|
-
hasFilterTargetAncestor: !!parentNode.hasFilterTargetAncestor,
|
|
97
|
+
filteredNodePaths: parentNode.filtering?.filteredChildrenIdentifierPaths,
|
|
98
|
+
isDirectParentFilterTarget: parentNode.filtering?.isFilterTarget,
|
|
99
|
+
hasFilterTargetAncestor: !!parentNode.filtering?.hasFilterTargetAncestor,
|
|
101
100
|
};
|
|
102
101
|
}
|
|
103
102
|
}
|
|
@@ -138,13 +137,18 @@ async function matchFilters(definition, filteringProps, predicate, matchedDefini
|
|
|
138
137
|
}
|
|
139
138
|
function applyFilterAttributes(node, filteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor) {
|
|
140
139
|
const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
const result = { ...node };
|
|
141
|
+
if (shouldAutoExpand) {
|
|
142
|
+
result.autoExpand = true;
|
|
143
|
+
}
|
|
144
|
+
if (isFilterTarget || hasFilterTargetAncestor || filteredChildrenIdentifierPaths?.length) {
|
|
145
|
+
result.filtering = {
|
|
146
|
+
...(isFilterTarget ? { isFilterTarget } : undefined),
|
|
147
|
+
...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),
|
|
148
|
+
...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
148
152
|
}
|
|
149
153
|
/** @internal */
|
|
150
154
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilteringHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.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 { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport {\n CustomHierarchyNodeDefinition,\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n NodeParser,\n NodePostProcessor,\n NodePreProcessor,\n} from \"../HierarchyDefinition\";\nimport {\n HierarchyNode,\n ParsedHierarchyNode,\n ParsedInstanceHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"../HierarchyNode\";\nimport { HierarchyNodeIdentifier, HierarchyNodeIdentifiersPath } from \"../HierarchyNodeIdentifier\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n}\n\n/** @internal */\nexport type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {\n isFilterTarget?: boolean;\n hasFilterTargetAncestor?: boolean;\n filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];\n};\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n\n public constructor(props: FilteringQueryBuilderProps) {\n this._classHierarchy = props.classHierarchy;\n this._source = props.source;\n this._nodeIdentifierPaths = props.nodeIdentifierPaths;\n }\n\n public get preProcessNode(): NodePreProcessor {\n return async (node) => {\n const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;\n const filteredNode = processedNode as FilteredHierarchyNode<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode> | undefined;\n if (filteredNode?.processingParams?.hideInHierarchy && filteredNode.isFilterTarget && !filteredNode.hasFilterTargetAncestor) {\n // we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target\n return undefined;\n }\n return processedNode;\n };\n }\n\n public get postProcessNode(): NodePostProcessor {\n return async (node: ProcessedHierarchyNode) => {\n const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;\n if (\n // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing\n HierarchyNode.isClassGroupingNode(node) &&\n node.children.some((child: FilteredHierarchyNode) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)\n ) {\n return Object.assign(processedNode, { autoExpand: true });\n }\n return processedNode;\n };\n }\n\n public get parseNode(): NodeParser {\n return (row: { [columnName: string]: any }): FilteredHierarchyNode<ParsedInstanceHierarchyNode> => {\n const isFilterTarget: boolean = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];\n const hasFilterTargetAncestor: boolean = !!row[ECSQL_COLUMN_NAME_HasFilterTargetAncestor];\n const parsedFilteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]\n ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])\n : undefined;\n const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);\n return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor);\n };\n }\n\n public async defineHierarchyLevel(\n props: DefineHierarchyLevelProps & { parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps[\"parentNode\"]> | undefined },\n ): Promise<HierarchyLevelDefinition> {\n const sourceDefinitions = await this._source.defineHierarchyLevel(props);\n const { filteredNodePaths, isDirectParentFilterTarget, hasFilterTargetAncestor } = this.getFilteringProps(props.parentNode);\n if (!filteredNodePaths) {\n return sourceDefinitions;\n }\n\n const filteredDefinitions: HierarchyLevelDefinition = [];\n await Promise.all(\n sourceDefinitions.map(async (definition) => {\n let matchedDefinition: HierarchyNodesDefinition | undefined;\n if (HierarchyNodesDefinition.isCustomNode(definition)) {\n matchedDefinition = await matchFilters<{ key: string }>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {\n return false;\n }\n return id.key === definition.node.key;\n },\n (def, matchingFilters, isFilterTarget) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyNodeIdentifiersPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget, !!hasFilterTargetAncestor),\n };\n },\n );\n } else {\n matchedDefinition = await matchFilters<InstanceKey>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n return false;\n }\n return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);\n },\n (def, matchingFilters, isFilterTarget) =>\n applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor),\n );\n }\n if (matchedDefinition) {\n filteredDefinitions.push(matchedDefinition);\n }\n }),\n );\n return filteredDefinitions;\n }\n\n private getFilteringProps(parentNode: FilteredHierarchyNode<unknown> | undefined) {\n if (!parentNode) {\n return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };\n }\n return {\n filteredNodePaths: parentNode.filteredChildrenIdentifierPaths,\n isDirectParentFilterTarget: parentNode.isFilterTarget,\n hasFilterTargetAncestor: !!parentNode.hasFilterTargetAncestor,\n };\n }\n}\n\nasync function matchFilters<\n TIdentifier extends HierarchyNodeIdentifier,\n TDefinition = TIdentifier extends InstanceKey ? InstanceNodesQueryDefinition : CustomHierarchyNodeDefinition,\n>(\n definition: TDefinition,\n filteringProps: { filteredNodePaths: HierarchyNodeIdentifiersPath[]; isDirectParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;\n let isFilterTarget = false;\n const matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }> = [];\n for (const path of filteredNodePaths) {\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;\n if (!childrenIdentifierPaths) {\n childrenIdentifierPaths = [];\n matchingFilters.push({\n // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment\n // async type guards aren't supported\n id: nodeId as TIdentifier,\n childrenIdentifierPaths,\n });\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n childrenIdentifierPaths.push(remainingPath);\n } else {\n isFilterTarget = true;\n }\n }\n }\n if (isDirectParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);\n }\n return undefined;\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined,\n isFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);\n return {\n ...node,\n ...(isFilterTarget ? { isFilterTarget } : undefined),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),\n ...(shouldAutoExpand ? { autoExpand: true } : undefined),\n ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),\n };\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_FilteredChildrenPaths = \"FilteredChildrenPaths\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_IsFilterTarget = \"IsFilterTarget\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_HasFilterTargetAncestor = \"HasFilterTargetAncestor\";\n\n/** @internal */\nexport function applyECInstanceIdsFilter(\n def: InstanceNodesQueryDefinition,\n matchingFilters: Array<{ id: InstanceKey; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n isParentFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): InstanceNodesQueryDefinition {\n if (matchingFilters.length === 0) {\n return def;\n }\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),\n // so using UNION as a workaround\n `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n ${isFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],\n ${hasFilterTargetAncestor || isParentFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_HasFilterTargetAncestor}],\n [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n ${isParentFilterTarget ? \"LEFT \" : \"\"} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FilteringHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.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 { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport {\n CustomHierarchyNodeDefinition,\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n NodeParser,\n NodePostProcessor,\n NodePreProcessor,\n} from \"../HierarchyDefinition\";\nimport { HierarchyNode, ParsedHierarchyNode, ParsedInstanceHierarchyNode, ProcessedHierarchyNode } from \"../HierarchyNode\";\nimport { HierarchyNodeIdentifier, HierarchyNodeIdentifiersPath } from \"../HierarchyNodeIdentifier\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n}\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n\n public constructor(props: FilteringQueryBuilderProps) {\n this._classHierarchy = props.classHierarchy;\n this._source = props.source;\n this._nodeIdentifierPaths = props.nodeIdentifierPaths;\n }\n\n public get preProcessNode(): NodePreProcessor {\n return async (node) => {\n const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;\n if (processedNode?.processingParams?.hideInHierarchy && processedNode.filtering?.isFilterTarget && !processedNode.filtering.hasFilterTargetAncestor) {\n // we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target\n return undefined;\n }\n return processedNode;\n };\n }\n\n public get postProcessNode(): NodePostProcessor {\n return async (node: ProcessedHierarchyNode) => {\n const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;\n if (\n // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing\n HierarchyNode.isClassGroupingNode(node) &&\n node.children.some(\n (child: ProcessedHierarchyNode) => child.filtering && (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths),\n )\n ) {\n return Object.assign(processedNode, { autoExpand: true });\n }\n return processedNode;\n };\n }\n\n public get parseNode(): NodeParser {\n return (row: { [columnName: string]: any }): ParsedInstanceHierarchyNode => {\n const isFilterTarget: boolean = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];\n const hasFilterTargetAncestor: boolean = !!row[ECSQL_COLUMN_NAME_HasFilterTargetAncestor];\n const parsedFilteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]\n ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])\n : undefined;\n const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);\n return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor);\n };\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const sourceDefinitions = await this._source.defineHierarchyLevel(props);\n const { filteredNodePaths, isDirectParentFilterTarget, hasFilterTargetAncestor } = this.getFilteringProps(props.parentNode);\n if (!filteredNodePaths) {\n return sourceDefinitions;\n }\n\n const filteredDefinitions: HierarchyLevelDefinition = [];\n await Promise.all(\n sourceDefinitions.map(async (definition) => {\n let matchedDefinition: HierarchyNodesDefinition | undefined;\n if (HierarchyNodesDefinition.isCustomNode(definition)) {\n matchedDefinition = await matchFilters<{ key: string }>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {\n return false;\n }\n return id.key === definition.node.key;\n },\n (def, matchingFilters, isFilterTarget) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyNodeIdentifiersPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget, !!hasFilterTargetAncestor),\n };\n },\n );\n } else {\n matchedDefinition = await matchFilters<InstanceKey>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n return false;\n }\n return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);\n },\n (def, matchingFilters, isFilterTarget) =>\n applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor),\n );\n }\n if (matchedDefinition) {\n filteredDefinitions.push(matchedDefinition);\n }\n }),\n );\n return filteredDefinitions;\n }\n\n private getFilteringProps(parentNode: Pick<HierarchyNode, \"filtering\"> | undefined) {\n if (!parentNode) {\n return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };\n }\n return {\n filteredNodePaths: parentNode.filtering?.filteredChildrenIdentifierPaths,\n isDirectParentFilterTarget: parentNode.filtering?.isFilterTarget,\n hasFilterTargetAncestor: !!parentNode.filtering?.hasFilterTargetAncestor,\n };\n }\n}\n\nasync function matchFilters<\n TIdentifier extends HierarchyNodeIdentifier,\n TDefinition = TIdentifier extends InstanceKey ? InstanceNodesQueryDefinition : CustomHierarchyNodeDefinition,\n>(\n definition: TDefinition,\n filteringProps: { filteredNodePaths: HierarchyNodeIdentifiersPath[]; isDirectParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;\n let isFilterTarget = false;\n const matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }> = [];\n for (const path of filteredNodePaths) {\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;\n if (!childrenIdentifierPaths) {\n childrenIdentifierPaths = [];\n matchingFilters.push({\n // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment\n // async type guards aren't supported\n id: nodeId as TIdentifier,\n childrenIdentifierPaths,\n });\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n childrenIdentifierPaths.push(remainingPath);\n } else {\n isFilterTarget = true;\n }\n }\n }\n if (isDirectParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);\n }\n return undefined;\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined,\n isFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);\n const result = { ...node };\n if (shouldAutoExpand) {\n result.autoExpand = true;\n }\n if (isFilterTarget || hasFilterTargetAncestor || filteredChildrenIdentifierPaths?.length) {\n result.filtering = {\n ...(isFilterTarget ? { isFilterTarget } : undefined),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),\n ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),\n };\n }\n return result;\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_FilteredChildrenPaths = \"FilteredChildrenPaths\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_IsFilterTarget = \"IsFilterTarget\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_HasFilterTargetAncestor = \"HasFilterTargetAncestor\";\n\n/** @internal */\nexport function applyECInstanceIdsFilter(\n def: InstanceNodesQueryDefinition,\n matchingFilters: Array<{ id: InstanceKey; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n isParentFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): InstanceNodesQueryDefinition {\n if (matchingFilters.length === 0) {\n return def;\n }\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),\n // so using UNION as a workaround\n `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n ${isFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],\n ${hasFilterTargetAncestor || isParentFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_HasFilterTargetAncestor}],\n [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n ${isParentFilterTarget ? \"LEFT \" : \"\"} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from "@itwin/presentation-shared";
|
|
2
|
+
import { HierarchyNodeIdentifiersPath } from "./HierarchyNodeIdentifier";
|
|
2
3
|
import { ClassGroupingNodeKey, GroupingNodeKey, HierarchyNodeKey, InstancesNodeKey, LabelGroupingNodeKey, PropertyGroupingNodeKey, PropertyOtherValuesGroupingNodeKey, PropertyValueGroupingNodeKey, PropertyValueRangeGroupingNodeKey, StandardHierarchyNodeKey } from "./HierarchyNodeKey";
|
|
3
4
|
/**
|
|
4
5
|
* A data structure that represents a single non-grouping hierarchy node.
|
|
@@ -16,6 +17,12 @@ interface BaseHierarchyNode {
|
|
|
16
17
|
extendedData?: {
|
|
17
18
|
[key: string]: any;
|
|
18
19
|
};
|
|
20
|
+
/** Data that may be assigned to the node if filtering is enabled */
|
|
21
|
+
filtering?: {
|
|
22
|
+
isFilterTarget?: boolean;
|
|
23
|
+
hasFilterTargetAncestor?: boolean;
|
|
24
|
+
filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];
|
|
25
|
+
};
|
|
19
26
|
}
|
|
20
27
|
/**
|
|
21
28
|
* A data structure that represents a single non-grouping hierarchy node.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyNode.d.ts","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC3G,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,UAAU,iBAAiB;IACzB,0FAA0F;IAC1F,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"HierarchyNode.d.ts","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC3G,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,kCAAkC,EAClC,4BAA4B,EAC5B,iCAAiC,EACjC,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,UAAU,iBAAiB;IACzB,0FAA0F;IAC1F,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,QAAQ,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACtC,oEAAoE;IACpE,SAAS,CAAC,EAAE;QACV,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAClC,+BAA+B,CAAC,EAAE,4BAA4B,EAAE,CAAC;KAClE,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,iEAAiE;IACjE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC/B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,2EAA2E;IAC3E,GAAG,EAAE,eAAe,CAAC;IAErB;;;OAGG;IACH,mBAAmB,EAAE,WAAW,EAAE,CAAC;IAEnC,+HAA+H;IAC/H,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;CACrE;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,wBAAwB,GAAG,qBAAqB,CAAC;AAE7E,YAAY;AAEZ,yBAAiB,aAAa,CAAC;IAC7B,qDAAqD;IACrD,SAAgB,QAAQ,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EAC9D,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,SAAS,sBAAsB,GAAG,4BAA4B,GAAG,wBAAwB,CAAC,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAEpI;IACD,8EAA8E;IAC9E,SAAgB,UAAU,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,wBAAwB,CAAA;KAAE,CAElI;IACD,iEAAiE;IACjE,SAAgB,eAAe,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACrE,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,SAAS,sBAAsB,GAAG,8BAA8B,GAAG,wBAAwB,CAAC,GAAG;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,CAEhJ;IACD,uDAAuD;IACvD,SAAgB,cAAc,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACpE,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,SAAS,sBAAsB,GAAG,8BAA8B,GAAG,qBAAqB,CAAC,CAEjH;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACzE,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,oBAAoB,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GACjH,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACzE,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,oBAAoB,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GACjH,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;IACD,gFAAgF;IAChF,SAAgB,iCAAiC,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACvF,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,kCAAkC,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GAC/H,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;IACD,sEAAsE;IACtE,SAAgB,2BAA2B,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACjF,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,4BAA4B,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GACzH,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;IACD,4EAA4E;IAC5E,SAAgB,gCAAgC,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EACtF,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,iCAAiC,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GAC9H,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;IACD,gEAAgE;IAChE,SAAgB,sBAAsB,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,EAC5E,IAAI,EAAE,KAAK,GACV,IAAI,IAAI,KAAK,GAAG;QAAE,GAAG,EAAE,uBAAuB,CAAC;QAAC,iBAAiB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,CAAC,KAAK,SAAS,sBAAsB,GACpH,8BAA8B,GAC9B,qBAAqB,CAAC,CAE3B;CACF;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,aAAa,IAAI,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAE1F;;GAEG;AACH,UAAU,iCAAiC;IACzC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uGAAuG;IACvG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,UAAU,2BAA2B;IACnC,OAAO,CAAC,EAAE,gCAAgC,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,GAAG,+BAA+B,CAAC;IACpD,aAAa,CAAC,EAAE,oCAAoC,CAAC;IACrD,YAAY,CAAC,EAAE,qCAAqC,CAAC;CACtD;AAED;;GAEG;AACH,UAAU,oCAAoC;IAC5C,yGAAyG;IACzG,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,qCAAsC,SAAQ,oCAAoC;IAC1F,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,UAAU,qCAAsC,SAAQ,oCAAoC,EAAE,+BAA+B;IAC3H,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,qCAAqC,GAAG,qCAAqC,CAAC;AAEvI,yEAAyE;AACzE,MAAM,WAAW,+BAA+B;IAC9C,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0GAA0G;IAC1G,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,2BAA2B,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEpE;;GAEG;AACH,UAAU,oCAAqC,SAAQ,+BAA+B;IACpF;;;;;OAKG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,4DAA4D;AAC5D,MAAM,WAAW,qCAAsC,SAAQ,+BAA+B;IAC5F;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C;;;;;OAKG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,cAAc,EAAE,0BAA0B,EAAE,CAAC;CAC9C;AAED,6EAA6E;AAC7E,MAAM,WAAW,0BAA0B;IACzC,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,+BAA+B,EAAE,CAAC;CAC5C;AAED,+DAA+D;AAC/D,MAAM,WAAW,+BAA+B;IAC9C,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,qCAAsC,SAAQ,iCAAiC;IAC9F,QAAQ,CAAC,EAAE,2BAA2B,CAAC;CACxC;AAED,qFAAqF;AACrF,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,wBAAwB,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,iCAAiC,CAAC;CACtD,CAAC;AACF,sFAAsF;AACtF,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAAC,wBAAwB,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG;IAChG,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,qCAAqC,CAAC;CAC1D,CAAC;AACF,iFAAiF;AACjF,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,GAAG;IACrF,QAAQ,EAAE,KAAK,CAAC,8BAA8B,GAAG,8BAA8B,CAAC,CAAC;CAClF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,GAAG,8BAA8B,GAAG,8BAA8B,CAAC;AAEpI;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,yBAAyB,GAAG,2BAA2B,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAC,GAAG;IAChJ,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAC;CACnC,CAAC;AACF,gHAAgH;AAChH,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;AAC1F,kHAAkH;AAClH,MAAM,MAAM,2BAA2B,GAAG,mBAAmB,CAAC,8BAA8B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyNode.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAGhG,OAAO,EAGL,gBAAgB,GAQjB,MAAM,oBAAoB,CAAC;AAwD5B,YAAY;AACZ,2DAA2D;AAC3D,MAAM,KAAW,aAAa,CAuE7B;AAvED,WAAiB,aAAa;IAC5B,qDAAqD;IACrD,SAAgB,QAAQ,CACtB,IAAW;QAEX,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAJe,sBAAQ,WAIvB,CAAA;IACD,8EAA8E;IAC9E,SAAgB,UAAU,CAA0C,IAAW;QAC7E,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAFe,wBAAU,aAEzB,CAAA;IACD,iEAAiE;IACjE,SAAgB,eAAe,CAC7B,IAAW;QAEX,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAJe,6BAAe,kBAI9B,CAAA;IACD,uDAAuD;IACvD,SAAgB,cAAc,CAC5B,IAAW;QAEX,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAJe,4BAAc,iBAI7B,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,gFAAgF;IAChF,SAAgB,iCAAiC,CAC/C,IAAW;QAIX,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IANe,+CAAiC,oCAMhD,CAAA;IACD,sEAAsE;IACtE,SAAgB,2BAA2B,CACzC,IAAW;QAIX,OAAO,gBAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IANe,yCAA2B,8BAM1C,CAAA;IACD,4EAA4E;IAC5E,SAAgB,gCAAgC,CAC9C,IAAW;QAIX,OAAO,gBAAgB,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IANe,8CAAgC,mCAM/C,CAAA;IACD,gEAAgE;IAChE,SAAgB,sBAAsB,CACpC,IAAW;QAIX,OAAO,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IANe,oCAAsB,yBAMrC,CAAA;AACH,CAAC,EAvEgB,aAAa,KAAb,aAAa,QAuE7B","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 { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from \"@itwin/presentation-shared\";\nimport {\n ClassGroupingNodeKey,\n GroupingNodeKey,\n HierarchyNodeKey,\n InstancesNodeKey,\n LabelGroupingNodeKey,\n PropertyGroupingNodeKey,\n PropertyOtherValuesGroupingNodeKey,\n PropertyValueGroupingNodeKey,\n PropertyValueRangeGroupingNodeKey,\n StandardHierarchyNodeKey,\n} from \"./HierarchyNodeKey\";\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n */\ninterface BaseHierarchyNode {\n /** Identifiers of all node ancestors. Can be used to identify a node in the hierarchy. */\n parentKeys: HierarchyNodeKey[];\n /** Node's display label. */\n label: string;\n /** A flag indicating whether the node has children or not. */\n children: boolean;\n /** A flag indicating whether this node should be auto-expanded in the UI. */\n autoExpand?: boolean;\n /** Additional data that may be assigned to this node. */\n extendedData?: { [key: string]: any };\n}\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n * @beta\n */\nexport interface NonGroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify the node in its hierarchy level. */\n key: string | InstancesNodeKey;\n /**\n * Identifies whether the hierarchy level below this node supports filtering. If not, supplying an instance\n * filter when requesting child hierarchy level will have no effect.\n */\n supportsFiltering?: boolean;\n}\n\n/**\n * A data structure that represents a grouping node that groups other nodes.\n * @beta\n */\nexport interface GroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify this grouping node in its hierarchy level. */\n key: GroupingNodeKey;\n\n /**\n * Keys of all instances grouped by this node, including deeply nested under\n * other grouping nodes.\n */\n groupedInstanceKeys: InstanceKey[];\n\n /** The closest ancestor node that is not a grouping node. May be `undefined` if the grouping node grouped root level nodes. */\n nonGroupingAncestor?: ParentHierarchyNode<NonGroupingHierarchyNode>;\n}\n\n/**\n * A data structure that represents a single hierarchy node.\n * @beta\n */\nexport type HierarchyNode = NonGroupingHierarchyNode | GroupingHierarchyNode;\n\n/** @beta */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace HierarchyNode {\n /** Checks whether the given node is a custom node */\n export function isCustom<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedCustomHierarchyNode : NonGroupingHierarchyNode) & { key: string } {\n return HierarchyNodeKey.isCustom(node.key);\n }\n /** Checks whether the given node is a standard (iModel content based) node */\n export function isStandard<TNode extends { key: HierarchyNodeKey }>(node: TNode): node is TNode & { key: StandardHierarchyNodeKey } {\n return HierarchyNodeKey.isStandard(node.key);\n }\n /** Checks whether the given node is an ECInstances-based node */\n export function isInstancesNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedInstanceHierarchyNode : NonGroupingHierarchyNode) & { key: InstancesNodeKey } {\n return HierarchyNodeKey.isInstances(node.key);\n }\n /** Checks whether the given node is a grouping node */\n export function isGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedGroupingHierarchyNode : GroupingHierarchyNode) {\n return HierarchyNodeKey.isGrouping(node.key);\n }\n /** Checks whether the given node is a class grouping node */\n export function isClassGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: ClassGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isClassGrouping(node.key);\n }\n /** Checks whether the given node is a label grouping node */\n export function isLabelGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: LabelGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isLabelGrouping(node.key);\n }\n /** Checks whether the given node is property grouping node for other values */\n export function isPropertyOtherValuesGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyOtherValuesGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyOtherValuesGrouping(node.key);\n }\n /** Checks whether the given node is a property value grouping node */\n export function isPropertyValueGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueGrouping(node.key);\n }\n /** Checks whether the given node is a property value range grouping node */\n export function isPropertyValueRangeGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueRangeGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueRangeGrouping(node.key);\n }\n /** Checks whether the given node is a property grouping node */\n export function isPropertyGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyGrouping(node.key);\n }\n}\n\n/**\n * A type of `HierarchyNode` that doesn't know about its children and is an input when requesting\n * them using `HierarchyProvider.getNodes`.\n */\nexport type ParentHierarchyNode<TBase = HierarchyNode> = OmitOverUnion<TBase, \"children\">;\n\n/**\n * Base processing parameters that apply to every node.\n */\ninterface HierarchyNodeProcessingParamsBase {\n /** Indicates if this node should be hidden if it has no child nodes. */\n hideIfNoChildren?: boolean;\n /** Indicates that this node should always be hidden and its children should be loaded in its place. */\n hideInHierarchy?: boolean;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n */\ninterface HierarchyNodeGroupingParams {\n byLabel?: HierarchyNodeLabelGroupingParams;\n byClass?: boolean | HierarchyNodeGroupingParamsBase;\n byBaseClasses?: HierarchyNodeBaseClassGroupingParams;\n byProperties?: HierarchyNodePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining params specifically used for label grouping.\n */\ninterface HierarchyNodeLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Value that needs to match in order for nodes to be grouped or merged.*/\n groupId?: string;\n}\n\n/**\n * A data structure for defining label merging.\n */\ninterface HierarchyNodeLabelGroupingMergeParams extends HierarchyNodeLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping with additional parameters.\n */\ninterface HierarchyNodeLabelGroupingGroupParams extends HierarchyNodeLabelGroupingBaseParams, HierarchyNodeGroupingParamsBase {\n action?: \"group\";\n}\n\n/** A data structure for defining possible label grouping types. */\nexport type HierarchyNodeLabelGroupingParams = boolean | HierarchyNodeLabelGroupingMergeParams | HierarchyNodeLabelGroupingGroupParams;\n\n/** Grouping parameters that are shared across all types of groupings. */\nexport interface HierarchyNodeGroupingParamsBase {\n /** Hiding option that determines whether to hide group nodes which have no siblings at the same hierarchy level. */\n hideIfNoSiblings?: boolean;\n /** Hiding option that determines whether to hide group nodes which have only one node as its children. */\n hideIfOneGroupedNode?: boolean;\n /** Option which auto expands grouping nodes' children when it has single child or always. */\n autoExpand?: HierarchyNodeAutoExpandProp;\n}\n\n/**\n * Defines possible values for `BaseGroupingParams.autoExpand` attribute:\n * - `single-child` - set the grouping node to auto-expand if it groups a single node.\n * - `always` - always set the grouping node to auto-expand.\n */\nexport type HierarchyNodeAutoExpandProp = \"single-child\" | \"always\";\n\n/**\n * A data structure that represents base class grouping.\n */\ninterface HierarchyNodeBaseClassGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full names of classes, which should be used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n fullClassNames: string[];\n}\n\n/** A data structure that represents properties grouping. */\nexport interface HierarchyNodePropertiesGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: string;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean;\n /**\n * Properties of the specified class, by which the nodes should be grouped. Each provided group definition results in a\n * grouping hierarchy level.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyValue: \"Wall\"\n * },\n * {\n * propertyName: \"length\",\n * propertyValue: 15,\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: HierarchyNodePropertyGroup[];\n}\n\n/** A data structure that represents specific properties' grouping params. */\nexport interface HierarchyNodePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Value of the property, which will be used to group the node. */\n propertyValue?: PrimitiveValue;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: HierarchyNodePropertyValueRange[];\n}\n\n/** A data structure that represents boundaries for a value. */\nexport interface HierarchyNodePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number;\n /** Defines the upper bound of the range. */\n toValue: number;\n /** Defines the range label. Will be used as `PropertyValueRangeGroupingNode` node's display label. */\n rangeLabel?: string;\n}\n\n/** Processing parameters that apply to instance nodes. */\nexport interface InstanceHierarchyNodeProcessingParams extends HierarchyNodeProcessingParamsBase {\n grouping?: HierarchyNodeGroupingParams;\n}\n\n/** A custom (not based on data in an iModel) node that has processing parameters. */\nexport type ProcessedCustomHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: string;\n children?: boolean;\n processingParams?: HierarchyNodeProcessingParamsBase;\n};\n/** An instances' (based on data in an iModel) node that has processing parameters. */\nexport type ProcessedInstanceHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: InstancesNodeKey;\n children?: boolean;\n processingParams?: InstanceHierarchyNodeProcessingParams;\n};\n/** A grouping node that groups either instance nodes or other grouping nodes. */\nexport type ProcessedGroupingHierarchyNode = Omit<GroupingHierarchyNode, \"children\"> & {\n children: Array<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>;\n};\n/**\n * A `HierarchyNode` that may have processing parameters defining whether it should be hidden under some conditions,\n * how it should be grouped, sorted, etc.\n *\n * Type guards under `HierarchyNode` namespace can be used to differentiate between different sub-types of\n * `ProcessedHierarchyNode`.\n *\n * @beta\n */\nexport type ProcessedHierarchyNode = ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode | ProcessedGroupingHierarchyNode;\n\n/**\n * A `ProcessedHierarchyNode` that has an unformatted label in a form of `ConcatenatedValue`. Generally this is\n * returned when the node is just parsed from query results.\n * @beta\n */\nexport type ParsedHierarchyNode<TBase = ParsedCustomHierarchyNode | ParsedInstanceHierarchyNode> = OmitOverUnion<TBase, \"label\" | \"parentKeys\"> & {\n label: string | ConcatenatedValue;\n};\n/** A kind of `ProcessedCustomHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedCustomHierarchyNode = ParsedHierarchyNode<ProcessedCustomHierarchyNode>;\n/** A kind of `ProcessedInstanceHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedInstanceHierarchyNode = ParsedHierarchyNode<ProcessedInstanceHierarchyNode>;\n"]}
|
|
1
|
+
{"version":3,"file":"HierarchyNode.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyNode.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAIhG,OAAO,EAGL,gBAAgB,GAQjB,MAAM,oBAAoB,CAAC;AA8D5B,YAAY;AACZ,2DAA2D;AAC3D,MAAM,KAAW,aAAa,CAuE7B;AAvED,WAAiB,aAAa;IAC5B,qDAAqD;IACrD,SAAgB,QAAQ,CACtB,IAAW;QAEX,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAJe,sBAAQ,WAIvB,CAAA;IACD,8EAA8E;IAC9E,SAAgB,UAAU,CAA0C,IAAW;QAC7E,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAFe,wBAAU,aAEzB,CAAA;IACD,iEAAiE;IACjE,SAAgB,eAAe,CAC7B,IAAW;QAEX,OAAO,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAJe,6BAAe,kBAI9B,CAAA;IACD,uDAAuD;IACvD,SAAgB,cAAc,CAC5B,IAAW;QAEX,OAAO,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAJe,4BAAc,iBAI7B,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,6DAA6D;IAC7D,SAAgB,mBAAmB,CACjC,IAAW;QAIX,OAAO,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IANe,iCAAmB,sBAMlC,CAAA;IACD,gFAAgF;IAChF,SAAgB,iCAAiC,CAC/C,IAAW;QAIX,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IANe,+CAAiC,oCAMhD,CAAA;IACD,sEAAsE;IACtE,SAAgB,2BAA2B,CACzC,IAAW;QAIX,OAAO,gBAAgB,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IANe,yCAA2B,8BAM1C,CAAA;IACD,4EAA4E;IAC5E,SAAgB,gCAAgC,CAC9C,IAAW;QAIX,OAAO,gBAAgB,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IANe,8CAAgC,mCAM/C,CAAA;IACD,gEAAgE;IAChE,SAAgB,sBAAsB,CACpC,IAAW;QAIX,OAAO,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IANe,oCAAsB,yBAMrC,CAAA;AACH,CAAC,EAvEgB,aAAa,KAAb,aAAa,QAuE7B","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 { ConcatenatedValue, InstanceKey, OmitOverUnion, PrimitiveValue } from \"@itwin/presentation-shared\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport {\n ClassGroupingNodeKey,\n GroupingNodeKey,\n HierarchyNodeKey,\n InstancesNodeKey,\n LabelGroupingNodeKey,\n PropertyGroupingNodeKey,\n PropertyOtherValuesGroupingNodeKey,\n PropertyValueGroupingNodeKey,\n PropertyValueRangeGroupingNodeKey,\n StandardHierarchyNodeKey,\n} from \"./HierarchyNodeKey\";\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n */\ninterface BaseHierarchyNode {\n /** Identifiers of all node ancestors. Can be used to identify a node in the hierarchy. */\n parentKeys: HierarchyNodeKey[];\n /** Node's display label. */\n label: string;\n /** A flag indicating whether the node has children or not. */\n children: boolean;\n /** A flag indicating whether this node should be auto-expanded in the UI. */\n autoExpand?: boolean;\n /** Additional data that may be assigned to this node. */\n extendedData?: { [key: string]: any };\n /** Data that may be assigned to the node if filtering is enabled */\n filtering?: {\n isFilterTarget?: boolean;\n hasFilterTargetAncestor?: boolean;\n filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * A data structure that represents a single non-grouping hierarchy node.\n * @beta\n */\nexport interface NonGroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify the node in its hierarchy level. */\n key: string | InstancesNodeKey;\n /**\n * Identifies whether the hierarchy level below this node supports filtering. If not, supplying an instance\n * filter when requesting child hierarchy level will have no effect.\n */\n supportsFiltering?: boolean;\n}\n\n/**\n * A data structure that represents a grouping node that groups other nodes.\n * @beta\n */\nexport interface GroupingHierarchyNode extends BaseHierarchyNode {\n /** An identifier to identify this grouping node in its hierarchy level. */\n key: GroupingNodeKey;\n\n /**\n * Keys of all instances grouped by this node, including deeply nested under\n * other grouping nodes.\n */\n groupedInstanceKeys: InstanceKey[];\n\n /** The closest ancestor node that is not a grouping node. May be `undefined` if the grouping node grouped root level nodes. */\n nonGroupingAncestor?: ParentHierarchyNode<NonGroupingHierarchyNode>;\n}\n\n/**\n * A data structure that represents a single hierarchy node.\n * @beta\n */\nexport type HierarchyNode = NonGroupingHierarchyNode | GroupingHierarchyNode;\n\n/** @beta */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport namespace HierarchyNode {\n /** Checks whether the given node is a custom node */\n export function isCustom<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedCustomHierarchyNode : NonGroupingHierarchyNode) & { key: string } {\n return HierarchyNodeKey.isCustom(node.key);\n }\n /** Checks whether the given node is a standard (iModel content based) node */\n export function isStandard<TNode extends { key: HierarchyNodeKey }>(node: TNode): node is TNode & { key: StandardHierarchyNodeKey } {\n return HierarchyNodeKey.isStandard(node.key);\n }\n /** Checks whether the given node is an ECInstances-based node */\n export function isInstancesNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedInstanceHierarchyNode : NonGroupingHierarchyNode) & { key: InstancesNodeKey } {\n return HierarchyNodeKey.isInstances(node.key);\n }\n /** Checks whether the given node is a grouping node */\n export function isGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & (TNode extends ProcessedHierarchyNode ? ProcessedGroupingHierarchyNode : GroupingHierarchyNode) {\n return HierarchyNodeKey.isGrouping(node.key);\n }\n /** Checks whether the given node is a class grouping node */\n export function isClassGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: ClassGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isClassGrouping(node.key);\n }\n /** Checks whether the given node is a label grouping node */\n export function isLabelGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: LabelGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isLabelGrouping(node.key);\n }\n /** Checks whether the given node is property grouping node for other values */\n export function isPropertyOtherValuesGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyOtherValuesGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyOtherValuesGrouping(node.key);\n }\n /** Checks whether the given node is a property value grouping node */\n export function isPropertyValueGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueGrouping(node.key);\n }\n /** Checks whether the given node is a property value range grouping node */\n export function isPropertyValueRangeGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyValueRangeGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyValueRangeGrouping(node.key);\n }\n /** Checks whether the given node is a property grouping node */\n export function isPropertyGroupingNode<TNode extends { key: HierarchyNodeKey }>(\n node: TNode,\n ): node is TNode & { key: PropertyGroupingNodeKey; supportsFiltering?: undefined } & (TNode extends ProcessedHierarchyNode\n ? ProcessedGroupingHierarchyNode\n : GroupingHierarchyNode) {\n return HierarchyNodeKey.isPropertyGrouping(node.key);\n }\n}\n\n/**\n * A type of `HierarchyNode` that doesn't know about its children and is an input when requesting\n * them using `HierarchyProvider.getNodes`.\n */\nexport type ParentHierarchyNode<TBase = HierarchyNode> = OmitOverUnion<TBase, \"children\">;\n\n/**\n * Base processing parameters that apply to every node.\n */\ninterface HierarchyNodeProcessingParamsBase {\n /** Indicates if this node should be hidden if it has no child nodes. */\n hideIfNoChildren?: boolean;\n /** Indicates that this node should always be hidden and its children should be loaded in its place. */\n hideInHierarchy?: boolean;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n */\ninterface HierarchyNodeGroupingParams {\n byLabel?: HierarchyNodeLabelGroupingParams;\n byClass?: boolean | HierarchyNodeGroupingParamsBase;\n byBaseClasses?: HierarchyNodeBaseClassGroupingParams;\n byProperties?: HierarchyNodePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining params specifically used for label grouping.\n */\ninterface HierarchyNodeLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Value that needs to match in order for nodes to be grouped or merged.*/\n groupId?: string;\n}\n\n/**\n * A data structure for defining label merging.\n */\ninterface HierarchyNodeLabelGroupingMergeParams extends HierarchyNodeLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping with additional parameters.\n */\ninterface HierarchyNodeLabelGroupingGroupParams extends HierarchyNodeLabelGroupingBaseParams, HierarchyNodeGroupingParamsBase {\n action?: \"group\";\n}\n\n/** A data structure for defining possible label grouping types. */\nexport type HierarchyNodeLabelGroupingParams = boolean | HierarchyNodeLabelGroupingMergeParams | HierarchyNodeLabelGroupingGroupParams;\n\n/** Grouping parameters that are shared across all types of groupings. */\nexport interface HierarchyNodeGroupingParamsBase {\n /** Hiding option that determines whether to hide group nodes which have no siblings at the same hierarchy level. */\n hideIfNoSiblings?: boolean;\n /** Hiding option that determines whether to hide group nodes which have only one node as its children. */\n hideIfOneGroupedNode?: boolean;\n /** Option which auto expands grouping nodes' children when it has single child or always. */\n autoExpand?: HierarchyNodeAutoExpandProp;\n}\n\n/**\n * Defines possible values for `BaseGroupingParams.autoExpand` attribute:\n * - `single-child` - set the grouping node to auto-expand if it groups a single node.\n * - `always` - always set the grouping node to auto-expand.\n */\nexport type HierarchyNodeAutoExpandProp = \"single-child\" | \"always\";\n\n/**\n * A data structure that represents base class grouping.\n */\ninterface HierarchyNodeBaseClassGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full names of classes, which should be used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n fullClassNames: string[];\n}\n\n/** A data structure that represents properties grouping. */\nexport interface HierarchyNodePropertiesGroupingParams extends HierarchyNodeGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: string;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean;\n /**\n * Properties of the specified class, by which the nodes should be grouped. Each provided group definition results in a\n * grouping hierarchy level.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyValue: \"Wall\"\n * },\n * {\n * propertyName: \"length\",\n * propertyValue: 15,\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: HierarchyNodePropertyGroup[];\n}\n\n/** A data structure that represents specific properties' grouping params. */\nexport interface HierarchyNodePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Value of the property, which will be used to group the node. */\n propertyValue?: PrimitiveValue;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: HierarchyNodePropertyValueRange[];\n}\n\n/** A data structure that represents boundaries for a value. */\nexport interface HierarchyNodePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number;\n /** Defines the upper bound of the range. */\n toValue: number;\n /** Defines the range label. Will be used as `PropertyValueRangeGroupingNode` node's display label. */\n rangeLabel?: string;\n}\n\n/** Processing parameters that apply to instance nodes. */\nexport interface InstanceHierarchyNodeProcessingParams extends HierarchyNodeProcessingParamsBase {\n grouping?: HierarchyNodeGroupingParams;\n}\n\n/** A custom (not based on data in an iModel) node that has processing parameters. */\nexport type ProcessedCustomHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: string;\n children?: boolean;\n processingParams?: HierarchyNodeProcessingParamsBase;\n};\n/** An instances' (based on data in an iModel) node that has processing parameters. */\nexport type ProcessedInstanceHierarchyNode = Omit<NonGroupingHierarchyNode, \"key\" | \"children\"> & {\n key: InstancesNodeKey;\n children?: boolean;\n processingParams?: InstanceHierarchyNodeProcessingParams;\n};\n/** A grouping node that groups either instance nodes or other grouping nodes. */\nexport type ProcessedGroupingHierarchyNode = Omit<GroupingHierarchyNode, \"children\"> & {\n children: Array<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>;\n};\n\n/**\n * A `HierarchyNode` that may have processing parameters defining whether it should be hidden under some conditions,\n * how it should be grouped, sorted, etc.\n *\n * Type guards under `HierarchyNode` namespace can be used to differentiate between different sub-types of\n * `ProcessedHierarchyNode`.\n *\n * @beta\n */\nexport type ProcessedHierarchyNode = ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode | ProcessedGroupingHierarchyNode;\n\n/**\n * A `ProcessedHierarchyNode` that has an unformatted label in a form of `ConcatenatedValue`. Generally this is\n * returned when the node is just parsed from query results.\n * @beta\n */\nexport type ParsedHierarchyNode<TBase = ParsedCustomHierarchyNode | ParsedInstanceHierarchyNode> = OmitOverUnion<TBase, \"label\" | \"parentKeys\"> & {\n label: string | ConcatenatedValue;\n};\n/** A kind of `ProcessedCustomHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedCustomHierarchyNode = ParsedHierarchyNode<ProcessedCustomHierarchyNode>;\n/** A kind of `ProcessedInstanceHierarchyNode` that has unformatted label and doesn't know about its ancestors. */\nexport type ParsedInstanceHierarchyNode = ParsedHierarchyNode<ProcessedInstanceHierarchyNode>;\n"]}
|
|
@@ -324,11 +324,13 @@ class HierarchyProviderImpl {
|
|
|
324
324
|
}
|
|
325
325
|
function preProcessNodes(hierarchyFactory) {
|
|
326
326
|
return hierarchyFactory.preProcessNode
|
|
327
|
-
? processNodes(hierarchyFactory.preProcessNode)
|
|
327
|
+
? processNodes(hierarchyFactory.preProcessNode.bind(hierarchyFactory))
|
|
328
328
|
: (o) => o;
|
|
329
329
|
}
|
|
330
330
|
function postProcessNodes(hierarchyFactory) {
|
|
331
|
-
return hierarchyFactory.postProcessNode
|
|
331
|
+
return hierarchyFactory.postProcessNode
|
|
332
|
+
? processNodes(hierarchyFactory.postProcessNode.bind(hierarchyFactory))
|
|
333
|
+
: (o) => o;
|
|
332
334
|
}
|
|
333
335
|
function processNodes(processor) {
|
|
334
336
|
return (nodes) => nodes.pipe(mergeMap(processor), filter((n) => !!n));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HierarchyProvider.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyProvider.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 {\n catchError,\n concat,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n finalize,\n from,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n of,\n take,\n tap,\n} from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter } from \"@itwin/core-common\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyNodesDefinition } from \"./HierarchyDefinition\";\nimport { RowsLimitExceededError } from \"./HierarchyErrors\";\nimport {\n HierarchyNode,\n NonGroupingHierarchyNode,\n ParentHierarchyNode,\n ParsedHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedGroupingHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"./HierarchyNode\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport { InstancesNodeKey } from \"./HierarchyNodeKey\";\nimport { CachedNodesObservableEntry, ChildNodeObservablesCache, ParsedQueryNodesObservable } from \"./internal/ChildNodeObservablesCache\";\nimport { LOGGING_NAMESPACE as CommonLoggingNamespace, createNodeIdentifierForLogging, hasChildren } from \"./internal/Common\";\nimport { eachValueFrom } from \"./internal/EachValueFrom\";\nimport { FilteringHierarchyDefinition } from \"./internal/FilteringHierarchyDefinition\";\nimport { createQueryLogMessage, doLog, log } from \"./internal/LoggingUtils\";\nimport { createDetermineChildrenOperator } from \"./internal/operators/DetermineChildren\";\nimport { createGroupingOperator } from \"./internal/operators/Grouping\";\nimport { createHideIfNoChildrenOperator } from \"./internal/operators/HideIfNoChildren\";\nimport { createHideNodesInHierarchyOperator } from \"./internal/operators/HideNodesInHierarchy\";\nimport { partition } from \"./internal/operators/Partition\";\nimport { reduceToMergeMapList } from \"./internal/operators/ReduceToMergeMap\";\nimport { shareReplayWithErrors } from \"./internal/operators/ShareReplayWithErrors\";\nimport { sortNodesByLabelOperator } from \"./internal/operators/Sorting\";\nimport { SubscriptionScheduler } from \"./internal/SubscriptionScheduler\";\nimport { readNodes } from \"./internal/TreeNodesReader\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory\";\n\nconst LOGGING_NAMESPACE = `${CommonLoggingNamespace}.HierarchyProvider`;\nconst PERF_LOGGING_NAMESPACE = `${LOGGING_NAMESPACE}.Performance`;\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Props for the `HierarchyProvider.getNodes` call.\n * @beta\n */\nexport interface GetHierarchyNodesProps {\n /** Parent node to get children for. Pass `undefined` to get root nodes. */\n parentNode: ParentHierarchyNode | undefined;\n\n /** Optional hierarchy level filter. Has no effect if `parentNode` is a `GroupingNode`. */\n instanceFilter?: GenericInstanceFilter;\n\n /**\n * Optional hierarchy level size limit override. This value is passed to `LimitingECSqlQueryExecutor` used\n * by this provider to override query rows limit per hierarchy level. If not provided, defaults to whatever\n * is used by the limiting query executor.\n *\n * Has no effect if `parentNode` is a `GroupingNode`.\n */\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n\n /** When set to true ignores the cache and fetches the nodes again. */\n ignoreCache?: boolean;\n}\n\n/**\n * An interface for a hierarchy provider knows how to create child nodes for a given parent node.\n * @beta\n */\nexport interface HierarchyProvider {\n /** Gets nodes for the specified parent node. */\n getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode>;\n\n /** Gets instance keys for the specified parent node. */\n getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey>;\n\n /** Notifies the provider that the underlying data source has changed and caches should be invalidated. */\n notifyDataSourceChanged(): void;\n\n /**\n * Overrides the property value formatter used by the hierarchy provider. Setting to `undefined`\n * resets the formatter to the result of `createDefaultValueFormatter` called with default parameters.\n */\n setFormatter(formatter: IPrimitiveValueFormatter | undefined): void;\n}\n\n/**\n * Defines the strings used by hierarchy provider.\n */\ninterface HierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/**\n * Props for `createHierarchyProvider`.\n */\ninterface HierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n formatter?: IPrimitiveValueFormatter;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<HierarchyProviderLocalizedStrings>;\n\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @beta\n */\nexport function createHierarchyProvider(props: HierarchyProviderProps): HierarchyProvider {\n return new HierarchyProviderImpl(props);\n}\n\nclass HierarchyProviderImpl implements HierarchyProvider {\n private _imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _localizedStrings: HierarchyProviderLocalizedStrings;\n private _queryScheduler: SubscriptionScheduler;\n private _nodesCache?: ChildNodeObservablesCache;\n\n /**\n * Hierarchy level definitions factory used by this provider.\n *\n * @note This does not necessarily match the `hierarchyDefinition` passed through props when constructing\n * the provider. For example, it may be a factory that decorates given `hierarchyDefinition` with filtering\n * features.\n */\n public readonly hierarchyDefinition: HierarchyDefinition;\n\n /**\n * A limiting ECSQL query executor used by this provider.\n * @see HierarchyProviderProps.queryExecutor\n */\n public get queryExecutor(): LimitingECSqlQueryExecutor {\n return this._imodelAccess;\n }\n\n public constructor(props: HierarchyProviderProps) {\n this._imodelAccess = props.imodelAccess;\n this.hierarchyDefinition = props.hierarchyDefinition;\n if (props.filtering) {\n const filteringDefinition = new FilteringHierarchyDefinition({\n classHierarchy: this._imodelAccess,\n source: this.hierarchyDefinition,\n nodeIdentifierPaths: props.filtering.paths,\n });\n this.hierarchyDefinition = filteringDefinition;\n }\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryScheduler = new SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new ChildNodeObservablesCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createParsedQueryNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] },\n ): ParsedQueryNodesObservable {\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n // stream hierarchy level definitions\n const definitions = from(defer(async () => this.hierarchyDefinition.defineHierarchyLevel(props))).pipe(\n mergeAll(),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n // pipe definitions to nodes and put \"share replay\" on it\n return definitions.pipe(\n mergeMap((def): ObservableInput<ParsedHierarchyNode> => {\n if (HierarchyNodesDefinition.isCustomNode(def)) {\n return of(def.node);\n }\n return this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n log({\n category: `${LOGGING_NAMESPACE}.Queries`,\n message: /* istanbul ignore next */ (query) =>\n `Query direct nodes for parent ${createNodeIdentifierForLogging(props.parentNode)}: ${createQueryLogMessage(query)}`,\n }),\n mergeMap((query) =>\n readNodes({ queryExecutor: this.queryExecutor, query, limit: props.hierarchyLevelSizeLimit, parser: this.hierarchyDefinition.parseNode }),\n ),\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createInitializedNodesObservable(nodes: Observable<ParsedHierarchyNode>, parentNode: ParentHierarchyNode | undefined) {\n return nodes.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the parsed node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap(async (node) => applyLabelsFormatting(node, this._imodelAccess, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n preProcessNodes(this.hierarchyDefinition),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished initializing child nodes for ${createNodeIdentifierForLogging(parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: ParsedQueryNodesObservable,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return this.createInitializedNodesObservable(queryNodesObservable, props.parentNode).pipe(\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n postProcessNodes(this.hierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (HierarchyNode.isCustom(n) || HierarchyNode.isInstancesNode(n)) {\n delete n.processingParams;\n }\n return Object.assign(n, {\n children: hasChildren(n),\n });\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable?: ParsedQueryNodesObservable,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({ category: loggingCategory, message: /* istanbul ignore next */ (n) => `Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}` }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({ category: loggingCategory, message: /* istanbul ignore next */ () => `Error while determining children: ${e.message}` });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* istanbul ignore next */ (r) => `Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps): CachedNodesObservableEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetCachedObservableEntry`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n // istanbul ignore next\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createParsedQueryNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" }) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables(props).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () =>\n error\n ? `Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\" } = props;\n\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n\n assert(!parentNode || HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n // split the definitions based on whether they're for custom nodes or for instance nodes\n const [customDefs, instanceDefs] = partition(\n from(this.hierarchyDefinition.defineHierarchyLevel({ parentNode, instanceFilter })).pipe(mergeAll()),\n HierarchyNodesDefinition.isCustomNode,\n );\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap((def) =>\n this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = this.queryExecutor.createQueryReader({ ...query, ecsql }, { rowFormat: \"Indexes\", limit: hierarchyLevelSizeLimit });\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n },\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a custom node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n customDefs.pipe(\n mergeMap((def) => (def.node.processingParams?.hideInHierarchy ? this.createInitializedNodesObservable(of(def.node), parentNode) : EMPTY)),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key.id,\n ),\n // then, for each class, create a temp node\n mergeMap(\n (mergedMap): Array<ParentHierarchyNode & { key: InstancesNodeKey }> =>\n [...mergedMap.entries()].map(([className, ids]) => ({\n key: {\n type: \"instances\",\n instanceKeys: ids.map((id) => ({ className, id })),\n },\n parentKeys: [],\n label: \"\",\n })),\n ),\n ),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode }))),\n );\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(this.getNodeInstanceKeysObs(props));\n }\n\n /**\n * A function that should be called when the underlying data source, used by `HierarchyProviderProps.schemaProvider`,\n * `HierarchyProviderProps.queryExecutor` or `HierarchyProviderProps.hierarchyDefinition`, changes.\n *\n * Calling the function invalidates internal caches to make sure fresh data is retrieved on new requests.\n */\n public notifyDataSourceChanged() {\n this._nodesCache?.clear();\n }\n}\n\nfunction preProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.preProcessNode\n ? processNodes(hierarchyFactory.preProcessNode)\n : (o: Observable<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>) => o;\n}\n\nfunction postProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.postProcessNode ? processNodes(hierarchyFactory.postProcessNode) : (o: Observable<ProcessedHierarchyNode>) => o;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Promise<TNode | undefined>) {\n return (nodes: Observable<TNode>) =>\n nodes.pipe(\n mergeMap(processor),\n filter((n): n is TNode => !!n),\n );\n}\n\nasync function applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n schemaProvider: ECSchemaProvider,\n valueFormatter: IPrimitiveValueFormatter,\n): Promise<TNode & { label: string }> {\n return {\n ...node,\n label: await formatConcatenatedValue({\n value: node.label,\n schemaProvider,\n valueFormatter,\n }),\n };\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n // istanbul ignore else\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n // istanbul ignore next\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HierarchyProvider.js","sourceRoot":"","sources":["../../../src/hierarchies/HierarchyProvider.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 {\n catchError,\n concat,\n defaultIfEmpty,\n defer,\n EMPTY,\n filter,\n finalize,\n from,\n map,\n merge,\n mergeAll,\n mergeMap,\n Observable,\n ObservableInput,\n of,\n take,\n tap,\n} from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter } from \"@itwin/core-common\";\nimport {\n ConcatenatedValue,\n createDefaultValueFormatter,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n ECSqlBinding,\n ECSqlQueryDef,\n formatConcatenatedValue,\n InstanceKey,\n IPrimitiveValueFormatter,\n normalizeFullClassName,\n} from \"@itwin/presentation-shared\";\nimport { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyNodesDefinition } from \"./HierarchyDefinition\";\nimport { RowsLimitExceededError } from \"./HierarchyErrors\";\nimport {\n HierarchyNode,\n NonGroupingHierarchyNode,\n ParentHierarchyNode,\n ParsedHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedGroupingHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"./HierarchyNode\";\nimport { HierarchyNodeIdentifiersPath } from \"./HierarchyNodeIdentifier\";\nimport { InstancesNodeKey } from \"./HierarchyNodeKey\";\nimport { CachedNodesObservableEntry, ChildNodeObservablesCache, ParsedQueryNodesObservable } from \"./internal/ChildNodeObservablesCache\";\nimport { LOGGING_NAMESPACE as CommonLoggingNamespace, createNodeIdentifierForLogging, hasChildren } from \"./internal/Common\";\nimport { eachValueFrom } from \"./internal/EachValueFrom\";\nimport { FilteringHierarchyDefinition } from \"./internal/FilteringHierarchyDefinition\";\nimport { createQueryLogMessage, doLog, log } from \"./internal/LoggingUtils\";\nimport { createDetermineChildrenOperator } from \"./internal/operators/DetermineChildren\";\nimport { createGroupingOperator } from \"./internal/operators/Grouping\";\nimport { createHideIfNoChildrenOperator } from \"./internal/operators/HideIfNoChildren\";\nimport { createHideNodesInHierarchyOperator } from \"./internal/operators/HideNodesInHierarchy\";\nimport { partition } from \"./internal/operators/Partition\";\nimport { reduceToMergeMapList } from \"./internal/operators/ReduceToMergeMap\";\nimport { shareReplayWithErrors } from \"./internal/operators/ShareReplayWithErrors\";\nimport { sortNodesByLabelOperator } from \"./internal/operators/Sorting\";\nimport { SubscriptionScheduler } from \"./internal/SubscriptionScheduler\";\nimport { readNodes } from \"./internal/TreeNodesReader\";\nimport { LimitingECSqlQueryExecutor } from \"./LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"./NodeSelectQueryFactory\";\n\nconst LOGGING_NAMESPACE = `${CommonLoggingNamespace}.HierarchyProvider`;\nconst PERF_LOGGING_NAMESPACE = `${LOGGING_NAMESPACE}.Performance`;\nconst DEFAULT_QUERY_CONCURRENCY = 10;\nconst DEFAULT_QUERY_CACHE_SIZE = 1;\n\n/**\n * Props for the `HierarchyProvider.getNodes` call.\n * @beta\n */\nexport interface GetHierarchyNodesProps {\n /** Parent node to get children for. Pass `undefined` to get root nodes. */\n parentNode: ParentHierarchyNode | undefined;\n\n /** Optional hierarchy level filter. Has no effect if `parentNode` is a `GroupingNode`. */\n instanceFilter?: GenericInstanceFilter;\n\n /**\n * Optional hierarchy level size limit override. This value is passed to `LimitingECSqlQueryExecutor` used\n * by this provider to override query rows limit per hierarchy level. If not provided, defaults to whatever\n * is used by the limiting query executor.\n *\n * Has no effect if `parentNode` is a `GroupingNode`.\n */\n hierarchyLevelSizeLimit?: number | \"unbounded\";\n\n /** When set to true ignores the cache and fetches the nodes again. */\n ignoreCache?: boolean;\n}\n\n/**\n * An interface for a hierarchy provider knows how to create child nodes for a given parent node.\n * @beta\n */\nexport interface HierarchyProvider {\n /** Gets nodes for the specified parent node. */\n getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode>;\n\n /** Gets instance keys for the specified parent node. */\n getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey>;\n\n /** Notifies the provider that the underlying data source has changed and caches should be invalidated. */\n notifyDataSourceChanged(): void;\n\n /**\n * Overrides the property value formatter used by the hierarchy provider. Setting to `undefined`\n * resets the formatter to the result of `createDefaultValueFormatter` called with default parameters.\n */\n setFormatter(formatter: IPrimitiveValueFormatter | undefined): void;\n}\n\n/**\n * Defines the strings used by hierarchy provider.\n */\ninterface HierarchyProviderLocalizedStrings {\n /**\n * A string for \"Unspecified\". Used for labels of property grouping nodes\n * that group by an empty value.\n */\n unspecified: string;\n\n /**\n * A string for \"Other\". Used for label of a range property grouping node that\n * groups values which don't fit into any other range.\n */\n other: string;\n}\n\n/**\n * Props for `createHierarchyProvider`.\n */\ninterface HierarchyProviderProps {\n /**\n * An object that provides access to iModel's data and metadata.\n *\n * @see `ECSchemaProvider`\n * @see `LimitingECSqlQueryExecutor`\n * @see `ECClassHierarchyInspector`\n */\n imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n\n /**\n * A function that returns a hierarchy definition, describing how the hierarchy that the provider should be create. The\n * function is called once during the provider's construction.\n */\n hierarchyDefinition: HierarchyDefinition;\n\n /** Maximum number of queries that the provider attempts to execute in parallel. Defaults to `10`. */\n queryConcurrency?: number;\n /**\n * The amount of queries whose results are stored in-memory for quick retrieval. Defaults to `1`,\n * which means only results of the last run query are cached.\n */\n queryCacheSize?: number;\n\n /**\n * A values formatter for formatting node labels. Defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n formatter?: IPrimitiveValueFormatter;\n\n /** A set of localized strings to use. Defaults to English strings. */\n localizedStrings?: Partial<HierarchyProviderLocalizedStrings>;\n\n /** Props for filtering the hierarchy. */\n filtering?: {\n /** A list of node identifiers from root to target node. */\n paths: HierarchyNodeIdentifiersPath[];\n };\n}\n\n/**\n * Creates an instance of `HierarchyProvider` that creates a hierarchy based on given iModel and\n * a hierarchy definition, which defines each hierarchy level through ECSQL queries.\n *\n * @beta\n */\nexport function createHierarchyProvider(props: HierarchyProviderProps): HierarchyProvider {\n return new HierarchyProviderImpl(props);\n}\n\nclass HierarchyProviderImpl implements HierarchyProvider {\n private _imodelAccess: ECSchemaProvider & LimitingECSqlQueryExecutor & ECClassHierarchyInspector;\n private _valuesFormatter: IPrimitiveValueFormatter;\n private _localizedStrings: HierarchyProviderLocalizedStrings;\n private _queryScheduler: SubscriptionScheduler;\n private _nodesCache?: ChildNodeObservablesCache;\n\n /**\n * Hierarchy level definitions factory used by this provider.\n *\n * @note This does not necessarily match the `hierarchyDefinition` passed through props when constructing\n * the provider. For example, it may be a factory that decorates given `hierarchyDefinition` with filtering\n * features.\n */\n public readonly hierarchyDefinition: HierarchyDefinition;\n\n /**\n * A limiting ECSQL query executor used by this provider.\n * @see HierarchyProviderProps.queryExecutor\n */\n public get queryExecutor(): LimitingECSqlQueryExecutor {\n return this._imodelAccess;\n }\n\n public constructor(props: HierarchyProviderProps) {\n this._imodelAccess = props.imodelAccess;\n this.hierarchyDefinition = props.hierarchyDefinition;\n if (props.filtering) {\n const filteringDefinition = new FilteringHierarchyDefinition({\n classHierarchy: this._imodelAccess,\n source: this.hierarchyDefinition,\n nodeIdentifierPaths: props.filtering.paths,\n });\n this.hierarchyDefinition = filteringDefinition;\n }\n this._valuesFormatter = props?.formatter ?? createDefaultValueFormatter();\n this._localizedStrings = { other: \"Other\", unspecified: \"Not specified\", ...props?.localizedStrings };\n this._queryScheduler = new SubscriptionScheduler(props.queryConcurrency ?? DEFAULT_QUERY_CONCURRENCY);\n\n const queryCacheSize = props.queryCacheSize ?? DEFAULT_QUERY_CACHE_SIZE;\n if (queryCacheSize !== 0) {\n this._nodesCache = new ChildNodeObservablesCache({\n // we divide the size by 2, because each variation also counts as a query that we cache\n size: Math.ceil(queryCacheSize / 2),\n variationsCount: 1,\n });\n }\n }\n\n /**\n * Sets `HierarchyProvider` values formatter that formats nodes' labels. If provided `undefined`, then defaults to the\n * result of `createDefaultValueFormatter` called with default parameters.\n */\n public setFormatter(formatter: IPrimitiveValueFormatter | undefined) {\n this._valuesFormatter = formatter ?? createDefaultValueFormatter();\n }\n\n private onGroupingNodeCreated(groupingNode: ProcessedGroupingHierarchyNode, props: GetHierarchyNodesProps) {\n this._nodesCache?.set({ ...props, parentNode: groupingNode }, { observable: from(groupingNode.children), processingStatus: \"pre-processed\" });\n }\n\n private createParsedQueryNodesObservable(\n props: DefineHierarchyLevelProps & { hierarchyLevelSizeLimit?: number | \"unbounded\"; filteredInstanceKeys?: InstanceKey[] },\n ): ParsedQueryNodesObservable {\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Requesting hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n // stream hierarchy level definitions\n const definitions = from(defer(async () => this.hierarchyDefinition.defineHierarchyLevel(props))).pipe(\n mergeAll(),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Received all hierarchy level definitions for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n // pipe definitions to nodes and put \"share replay\" on it\n return definitions.pipe(\n mergeMap((def): ObservableInput<ParsedHierarchyNode> => {\n if (HierarchyNodesDefinition.isCustomNode(def)) {\n return of(def.node);\n }\n return this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n map((query) => filterQueryByInstanceKeys(query, props.filteredInstanceKeys)),\n log({\n category: `${LOGGING_NAMESPACE}.Queries`,\n message: /* istanbul ignore next */ (query) =>\n `Query direct nodes for parent ${createNodeIdentifierForLogging(props.parentNode)}: ${createQueryLogMessage(query)}`,\n }),\n mergeMap((query) =>\n readNodes({ queryExecutor: this.queryExecutor, query, limit: props.hierarchyLevelSizeLimit, parser: this.hierarchyDefinition.parseNode }),\n ),\n ),\n );\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Read all child nodes ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createInitializedNodesObservable(nodes: Observable<ParsedHierarchyNode>, parentNode: ParentHierarchyNode | undefined) {\n return nodes.pipe(\n // we're going to be mutating the nodes, but don't want to mutate the original one, so just clone it here once\n map((node) => ({ ...node })),\n // set parent node keys on the parsed node\n map((node) => Object.assign(node, { parentKeys: createParentNodeKeysList(parentNode) })),\n // format `ConcatenatedValue` labels into string labels\n mergeMap(async (node) => applyLabelsFormatting(node, this._imodelAccess, this._valuesFormatter)),\n // we have `ProcessedHierarchyNode` from here\n preProcessNodes(this.hierarchyDefinition),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished initializing child nodes for ${createNodeIdentifierForLogging(parentNode)}`,\n }),\n ),\n shareReplayWithErrors(),\n );\n }\n\n private createPreProcessedNodesObservable(\n queryNodesObservable: ParsedQueryNodesObservable,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return this.createInitializedNodesObservable(queryNodesObservable, props.parentNode).pipe(\n createHideIfNoChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n createHideNodesInHierarchyOperator(\n // note: for child nodes created because of hidden parent, we want to use parent's request props (instance filter, limit)\n (n) => this.getChildNodesObservables({ ...props, parentNode: n }).processedNodes,\n false,\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished pre-processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createProcessedNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<ProcessedHierarchyNode> {\n return preprocessedNodesObservable.pipe(\n createGroupingOperator(this._imodelAccess, props.parentNode, this._valuesFormatter, this._localizedStrings, (gn) =>\n this.onGroupingNodeCreated(gn, props),\n ),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished processing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createFinalizedNodesObservable(\n processedNodesObservable: Observable<ProcessedHierarchyNode>,\n props: GetHierarchyNodesProps,\n ): Observable<HierarchyNode> {\n return processedNodesObservable.pipe(\n createDetermineChildrenOperator((n) => this.getChildNodesObservables({ parentNode: n }).hasNodes),\n postProcessNodes(this.hierarchyDefinition),\n sortNodesByLabelOperator,\n map((n): HierarchyNode => {\n if (HierarchyNode.isCustom(n) || HierarchyNode.isInstancesNode(n)) {\n delete n.processingParams;\n }\n return Object.assign(n, {\n children: hasChildren(n),\n });\n }),\n finalize(() =>\n doLog({\n category: PERF_LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ () => `Finished finalizing child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n }),\n ),\n );\n }\n\n private createHasNodesObservable(\n preprocessedNodesObservable: Observable<ProcessedHierarchyNode>,\n possiblyKnownChildrenObservable?: ParsedQueryNodesObservable,\n ): Observable<boolean> {\n const loggingCategory = `${LOGGING_NAMESPACE}.HasNodes`;\n return concat((possiblyKnownChildrenObservable ?? EMPTY).pipe(filter((n) => hasChildren(n))), preprocessedNodesObservable).pipe(\n log({ category: loggingCategory, message: /* istanbul ignore next */ (n) => `Node before mapping to 'true': ${createNodeIdentifierForLogging(n)}` }),\n take(1),\n map(() => true),\n defaultIfEmpty(false),\n catchError((e: Error) => {\n doLog({ category: loggingCategory, message: /* istanbul ignore next */ () => `Error while determining children: ${e.message}` });\n if (e instanceof RowsLimitExceededError) {\n return of(true);\n }\n throw e;\n }),\n log({ category: loggingCategory, message: /* istanbul ignore next */ (r) => `Result: ${r}` }),\n );\n }\n\n private getCachedObservableEntry(props: GetHierarchyNodesProps): CachedNodesObservableEntry {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetCachedObservableEntry`;\n const { parentNode, ...restProps } = props;\n const cached = props.ignoreCache || !this._nodesCache ? undefined : this._nodesCache.get(props);\n if (cached) {\n // istanbul ignore next\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Found query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return cached;\n }\n\n // if we don't find an entry for a grouping node, we load its instances by getting a query and applying\n // a filter based on grouped instance keys\n let filteredInstanceKeys: InstanceKey[] | undefined;\n let parentNonGroupingNode: ParentHierarchyNode<NonGroupingHierarchyNode> | undefined;\n if (parentNode) {\n if (HierarchyNode.isGroupingNode(parentNode)) {\n parentNonGroupingNode = parentNode.nonGroupingAncestor;\n filteredInstanceKeys = parentNode.groupedInstanceKeys;\n } else {\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n parentNonGroupingNode = parentNode;\n }\n }\n\n const nonGroupingNodeChildrenRequestProps = {\n ...restProps,\n parentNode: parentNonGroupingNode,\n ...(filteredInstanceKeys ? { filteredInstanceKeys } : undefined),\n };\n const value = { observable: this.createParsedQueryNodesObservable(nonGroupingNodeChildrenRequestProps), processingStatus: \"none\" as const };\n this._nodesCache?.set(nonGroupingNodeChildrenRequestProps, value);\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Saved query nodes observable for ${createNodeIdentifierForLogging(parentNode)}`,\n });\n return value;\n }\n\n private getChildNodesObservables(props: GetHierarchyNodesProps & { hierarchyLevelSizeLimit?: number | \"unbounded\" }) {\n const entry = this.getCachedObservableEntry(props);\n switch (entry.processingStatus) {\n case \"none\": {\n const pre = this.createPreProcessedNodesObservable(entry.observable, props);\n const post = this.createProcessedNodesObservable(pre, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(pre, entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n case \"pre-processed\": {\n const post = this.createProcessedNodesObservable(entry.observable, props);\n return {\n processedNodes: post,\n hasNodes: this.createHasNodesObservable(entry.observable),\n finalizedNodes: this.createFinalizedNodesObservable(post, props),\n };\n }\n }\n }\n\n /**\n * Creates and runs a query based on provided props, then processes retrieved nodes and returns them.\n */\n public getNodes(props: GetHierarchyNodesProps): AsyncIterableIterator<HierarchyNode> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodes`;\n const timer = new StopWatch(undefined, true);\n let error: any;\n let nodesCount = 0;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting child nodes for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(\n this.getChildNodesObservables(props).finalizedNodes.pipe(\n tap(() => ++nodesCount),\n catchError((e) => {\n error = e;\n throw e;\n }),\n finalize(() => {\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () =>\n error\n ? `Error creating child nodes for ${createNodeIdentifierForLogging(props.parentNode)}: ${error instanceof Error ? error.message : error.toString()}`\n : `Returned ${nodesCount} child nodes for ${createNodeIdentifierForLogging(props.parentNode)} in ${timer.currentSeconds.toFixed(2)} s.`,\n });\n }),\n ),\n );\n }\n\n private getNodeInstanceKeysObs(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): Observable<InstanceKey> {\n const { parentNode, instanceFilter, hierarchyLevelSizeLimit = \"unbounded\" } = props;\n\n if (parentNode && HierarchyNode.isGroupingNode(parentNode)) {\n return from(parentNode.groupedInstanceKeys);\n }\n\n assert(!parentNode || HierarchyNode.isCustom(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n\n // split the definitions based on whether they're for custom nodes or for instance nodes\n const [customDefs, instanceDefs] = partition(\n from(this.hierarchyDefinition.defineHierarchyLevel({ parentNode, instanceFilter })).pipe(mergeAll()),\n HierarchyNodesDefinition.isCustomNode,\n );\n\n // query instance keys and a flag whether they should be hidden\n const instanceKeys = instanceDefs.pipe(\n mergeMap((def) =>\n this._queryScheduler.scheduleSubscription(\n of(def.query).pipe(\n mergeMap(async (query) => {\n const ecsql = `\n SELECT\n ${NodeSelectClauseColumnNames.FullClassName},\n ${NodeSelectClauseColumnNames.ECInstanceId},\n ${NodeSelectClauseColumnNames.HideNodeInHierarchy}\n FROM (\n ${query.ecsql}\n )\n `;\n const reader = this.queryExecutor.createQueryReader({ ...query, ecsql }, { rowFormat: \"Indexes\", limit: hierarchyLevelSizeLimit });\n return from(reader).pipe(\n map((row) => ({\n key: {\n className: normalizeFullClassName(row[0]),\n id: row[1],\n },\n hide: !!row[2],\n })),\n );\n }),\n mergeAll(),\n ),\n ),\n ),\n );\n // split the instance keys observable based on whether they should be hidden or not\n const [visibleNodeInstanceKeys, hiddenNodeInstanceKeys] = partition(instanceKeys, ({ hide }) => !hide);\n\n // hidden items' handling:\n // - if a custom node is hidden, we'll want to retrieve instance keys of its children, otherwise we don't care about it,\n // - if an instance key is hidden, we want to create a merged node similar to what we do in `createHideNodesInHierarchyOperator`\n const hiddenParentNodes = merge(\n customDefs.pipe(\n mergeMap((def) => (def.node.processingParams?.hideInHierarchy ? this.createInitializedNodesObservable(of(def.node), parentNode) : EMPTY)),\n ),\n hiddenNodeInstanceKeys.pipe(\n // first merge all keys by class\n reduceToMergeMapList(\n ({ key }) => key.className,\n ({ key }) => key.id,\n ),\n // then, for each class, create a temp node\n mergeMap(\n (mergedMap): Array<ParentHierarchyNode & { key: InstancesNodeKey }> =>\n [...mergedMap.entries()].map(([className, ids]) => ({\n key: {\n type: \"instances\",\n instanceKeys: ids.map((id) => ({ className, id })),\n },\n parentKeys: [],\n label: \"\",\n })),\n ),\n ),\n );\n\n // merge visible instance keys from this level & the ones we get recursively requesting from deeper levels\n return merge(\n visibleNodeInstanceKeys.pipe(map(({ key }) => key)),\n hiddenParentNodes.pipe(mergeMap((hiddenNode) => this.getNodeInstanceKeysObs({ parentNode: hiddenNode }))),\n );\n }\n\n /**\n * Creates an iterator for all child hierarchy level instance keys, taking into account any hidden hierarchy levels\n * that there may be under the given parent node.\n */\n public getNodeInstanceKeys(props: Omit<GetHierarchyNodesProps, \"ignoreCache\">): AsyncIterableIterator<InstanceKey> {\n const loggingCategory = `${LOGGING_NAMESPACE}.GetNodeInstanceKeys`;\n doLog({\n category: loggingCategory,\n message: /* istanbul ignore next */ () => `Requesting keys for ${createNodeIdentifierForLogging(props.parentNode)}`,\n });\n return eachValueFrom(this.getNodeInstanceKeysObs(props));\n }\n\n /**\n * A function that should be called when the underlying data source, used by `HierarchyProviderProps.schemaProvider`,\n * `HierarchyProviderProps.queryExecutor` or `HierarchyProviderProps.hierarchyDefinition`, changes.\n *\n * Calling the function invalidates internal caches to make sure fresh data is retrieved on new requests.\n */\n public notifyDataSourceChanged() {\n this._nodesCache?.clear();\n }\n}\n\nfunction preProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.preProcessNode\n ? processNodes(hierarchyFactory.preProcessNode.bind(hierarchyFactory))\n : (o: Observable<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode>) => o;\n}\n\nfunction postProcessNodes(hierarchyFactory: HierarchyDefinition) {\n return hierarchyFactory.postProcessNode\n ? processNodes(hierarchyFactory.postProcessNode.bind(hierarchyFactory))\n : (o: Observable<ProcessedHierarchyNode>) => o;\n}\n\nfunction processNodes<TNode>(processor: (node: TNode) => Promise<TNode | undefined>) {\n return (nodes: Observable<TNode>) =>\n nodes.pipe(\n mergeMap(processor),\n filter((n): n is TNode => !!n),\n );\n}\n\nasync function applyLabelsFormatting<TNode extends { label: string | ConcatenatedValue }>(\n node: TNode,\n schemaProvider: ECSchemaProvider,\n valueFormatter: IPrimitiveValueFormatter,\n): Promise<TNode & { label: string }> {\n return {\n ...node,\n label: await formatConcatenatedValue({\n value: node.label,\n schemaProvider,\n valueFormatter,\n }),\n };\n}\n\nfunction createParentNodeKeysList(parentNode: ParentHierarchyNode | undefined) {\n if (!parentNode) {\n return [];\n }\n return [...parentNode.parentKeys, parentNode.key];\n}\n\nfunction filterQueryByInstanceKeys(query: ECSqlQueryDef, filteredInstanceKeys: InstanceKey[] | undefined): ECSqlQueryDef {\n if (!filteredInstanceKeys || !filteredInstanceKeys.length) {\n return query;\n }\n const MAX_ALLOWED_BINDINGS = 1000;\n // istanbul ignore else\n if (filteredInstanceKeys.length < MAX_ALLOWED_BINDINGS) {\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE q.ECInstanceId IN (${filteredInstanceKeys.map(() => \"?\").join(\",\")})\n `,\n bindings: [...(query.bindings ?? []), ...filteredInstanceKeys.map((k): ECSqlBinding => ({ type: \"id\", value: k.id }))],\n };\n }\n // istanbul ignore next\n return {\n ...query,\n ecsql: `\n SELECT *\n FROM (${query.ecsql}) q\n WHERE InVirtualSet(?, q.ECInstanceId)\n `,\n bindings: [...(query.bindings ?? []), { type: \"idset\", value: filteredInstanceKeys.map((k) => k.id) }],\n };\n}\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ECClassHierarchyInspector, InstanceKey } from "@itwin/presentation-shared";
|
|
2
2
|
import { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyLevelDefinition, InstanceNodesQueryDefinition, NodeParser, NodePostProcessor, NodePreProcessor } from "../HierarchyDefinition";
|
|
3
|
-
import { ProcessedHierarchyNode } from "../HierarchyNode";
|
|
4
3
|
import { HierarchyNodeIdentifiersPath } from "../HierarchyNodeIdentifier";
|
|
5
4
|
/** @internal */
|
|
6
5
|
export interface FilteringQueryBuilderProps {
|
|
@@ -9,12 +8,6 @@ export interface FilteringQueryBuilderProps {
|
|
|
9
8
|
nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];
|
|
10
9
|
}
|
|
11
10
|
/** @internal */
|
|
12
|
-
export type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {
|
|
13
|
-
isFilterTarget?: boolean;
|
|
14
|
-
hasFilterTargetAncestor?: boolean;
|
|
15
|
-
filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];
|
|
16
|
-
};
|
|
17
|
-
/** @internal */
|
|
18
11
|
export declare class FilteringHierarchyDefinition implements HierarchyDefinition {
|
|
19
12
|
private _classHierarchy;
|
|
20
13
|
private _source;
|
|
@@ -23,9 +16,7 @@ export declare class FilteringHierarchyDefinition implements HierarchyDefinition
|
|
|
23
16
|
get preProcessNode(): NodePreProcessor;
|
|
24
17
|
get postProcessNode(): NodePostProcessor;
|
|
25
18
|
get parseNode(): NodeParser;
|
|
26
|
-
defineHierarchyLevel(props: DefineHierarchyLevelProps
|
|
27
|
-
parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps["parentNode"]> | undefined;
|
|
28
|
-
}): Promise<HierarchyLevelDefinition>;
|
|
19
|
+
defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition>;
|
|
29
20
|
private getFilteringProps;
|
|
30
21
|
}
|
|
31
22
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilteringHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAEL,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAExB,4BAA4B,EAC5B,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"FilteringHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAEL,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EAExB,4BAA4B,EAC5B,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAA2B,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAGnG,gBAAgB;AAChB,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,yBAAyB,CAAC;IAC1C,MAAM,EAAE,mBAAmB,CAAC;IAC5B,mBAAmB,EAAE,4BAA4B,EAAE,CAAC;CACrD;AAED,gBAAgB;AAChB,qBAAa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,oBAAoB,CAAiC;gBAE1C,KAAK,EAAE,0BAA0B;IAMpD,IAAW,cAAc,IAAI,gBAAgB,CAS5C;IAED,IAAW,eAAe,IAAI,iBAAiB,CAc9C;IAED,IAAW,SAAS,IAAI,UAAU,CAUjC;IAEY,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAsDtG,OAAO,CAAC,iBAAiB;CAU1B;AAqED,gBAAgB;AAEhB,eAAO,MAAM,uCAAuC,0BAA0B,CAAC;AAE/E,gBAAgB;AAEhB,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE,gBAAgB;AAEhB,eAAO,MAAM,yCAAyC,4BAA4B,CAAC;AAEnF,gBAAgB;AAChB,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,4BAA4B,EACjC,eAAe,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,WAAW,CAAC;IAAC,uBAAuB,EAAE,4BAA4B,EAAE,CAAA;CAAE,CAAC,EACpG,cAAc,EAAE,OAAO,EACvB,oBAAoB,EAAE,OAAO,EAC7B,uBAAuB,EAAE,OAAO,GAC/B,4BAA4B,CA+B9B"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { HierarchyNodesDefinition, } from "../HierarchyDefinition";
|
|
6
|
-
import { HierarchyNode
|
|
6
|
+
import { HierarchyNode } from "../HierarchyNode";
|
|
7
7
|
import { HierarchyNodeIdentifier } from "../HierarchyNodeIdentifier";
|
|
8
8
|
import { defaultNodesParser } from "./TreeNodesReader";
|
|
9
9
|
/** @internal */
|
|
@@ -19,8 +19,7 @@ export class FilteringHierarchyDefinition {
|
|
|
19
19
|
get preProcessNode() {
|
|
20
20
|
return async (node) => {
|
|
21
21
|
const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;
|
|
22
|
-
|
|
23
|
-
if (filteredNode?.processingParams?.hideInHierarchy && filteredNode.isFilterTarget && !filteredNode.hasFilterTargetAncestor) {
|
|
22
|
+
if (processedNode?.processingParams?.hideInHierarchy && processedNode.filtering?.isFilterTarget && !processedNode.filtering.hasFilterTargetAncestor) {
|
|
24
23
|
// we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target
|
|
25
24
|
return undefined;
|
|
26
25
|
}
|
|
@@ -33,7 +32,7 @@ export class FilteringHierarchyDefinition {
|
|
|
33
32
|
if (
|
|
34
33
|
// instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing
|
|
35
34
|
HierarchyNode.isClassGroupingNode(node) &&
|
|
36
|
-
node.children.some((child) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)) {
|
|
35
|
+
node.children.some((child) => child.filtering && (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths))) {
|
|
37
36
|
return Object.assign(processedNode, { autoExpand: true });
|
|
38
37
|
}
|
|
39
38
|
return processedNode;
|
|
@@ -92,9 +91,9 @@ export class FilteringHierarchyDefinition {
|
|
|
92
91
|
return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };
|
|
93
92
|
}
|
|
94
93
|
return {
|
|
95
|
-
filteredNodePaths: parentNode.filteredChildrenIdentifierPaths,
|
|
96
|
-
isDirectParentFilterTarget: parentNode.isFilterTarget,
|
|
97
|
-
hasFilterTargetAncestor: !!parentNode.hasFilterTargetAncestor,
|
|
94
|
+
filteredNodePaths: parentNode.filtering?.filteredChildrenIdentifierPaths,
|
|
95
|
+
isDirectParentFilterTarget: parentNode.filtering?.isFilterTarget,
|
|
96
|
+
hasFilterTargetAncestor: !!parentNode.filtering?.hasFilterTargetAncestor,
|
|
98
97
|
};
|
|
99
98
|
}
|
|
100
99
|
}
|
|
@@ -134,13 +133,18 @@ async function matchFilters(definition, filteringProps, predicate, matchedDefini
|
|
|
134
133
|
}
|
|
135
134
|
function applyFilterAttributes(node, filteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor) {
|
|
136
135
|
const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
136
|
+
const result = { ...node };
|
|
137
|
+
if (shouldAutoExpand) {
|
|
138
|
+
result.autoExpand = true;
|
|
139
|
+
}
|
|
140
|
+
if (isFilterTarget || hasFilterTargetAncestor || filteredChildrenIdentifierPaths?.length) {
|
|
141
|
+
result.filtering = {
|
|
142
|
+
...(isFilterTarget ? { isFilterTarget } : undefined),
|
|
143
|
+
...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),
|
|
144
|
+
...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
144
148
|
}
|
|
145
149
|
/** @internal */
|
|
146
150
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilteringHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.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 { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport {\n CustomHierarchyNodeDefinition,\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n NodeParser,\n NodePostProcessor,\n NodePreProcessor,\n} from \"../HierarchyDefinition\";\nimport {\n HierarchyNode,\n ParsedHierarchyNode,\n ParsedInstanceHierarchyNode,\n ProcessedCustomHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n} from \"../HierarchyNode\";\nimport { HierarchyNodeIdentifier, HierarchyNodeIdentifiersPath } from \"../HierarchyNodeIdentifier\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n}\n\n/** @internal */\nexport type FilteredHierarchyNode<TNode = ProcessedHierarchyNode> = TNode & {\n isFilterTarget?: boolean;\n hasFilterTargetAncestor?: boolean;\n filteredChildrenIdentifierPaths?: HierarchyNodeIdentifiersPath[];\n};\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n\n public constructor(props: FilteringQueryBuilderProps) {\n this._classHierarchy = props.classHierarchy;\n this._source = props.source;\n this._nodeIdentifierPaths = props.nodeIdentifierPaths;\n }\n\n public get preProcessNode(): NodePreProcessor {\n return async (node) => {\n const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;\n const filteredNode = processedNode as FilteredHierarchyNode<ProcessedCustomHierarchyNode | ProcessedInstanceHierarchyNode> | undefined;\n if (filteredNode?.processingParams?.hideInHierarchy && filteredNode.isFilterTarget && !filteredNode.hasFilterTargetAncestor) {\n // we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target\n return undefined;\n }\n return processedNode;\n };\n }\n\n public get postProcessNode(): NodePostProcessor {\n return async (node: ProcessedHierarchyNode) => {\n const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;\n if (\n // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing\n HierarchyNode.isClassGroupingNode(node) &&\n node.children.some((child: FilteredHierarchyNode) => child.isFilterTarget || child.filteredChildrenIdentifierPaths)\n ) {\n return Object.assign(processedNode, { autoExpand: true });\n }\n return processedNode;\n };\n }\n\n public get parseNode(): NodeParser {\n return (row: { [columnName: string]: any }): FilteredHierarchyNode<ParsedInstanceHierarchyNode> => {\n const isFilterTarget: boolean = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];\n const hasFilterTargetAncestor: boolean = !!row[ECSQL_COLUMN_NAME_HasFilterTargetAncestor];\n const parsedFilteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]\n ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])\n : undefined;\n const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);\n return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor);\n };\n }\n\n public async defineHierarchyLevel(\n props: DefineHierarchyLevelProps & { parentNode: FilteredHierarchyNode<DefineHierarchyLevelProps[\"parentNode\"]> | undefined },\n ): Promise<HierarchyLevelDefinition> {\n const sourceDefinitions = await this._source.defineHierarchyLevel(props);\n const { filteredNodePaths, isDirectParentFilterTarget, hasFilterTargetAncestor } = this.getFilteringProps(props.parentNode);\n if (!filteredNodePaths) {\n return sourceDefinitions;\n }\n\n const filteredDefinitions: HierarchyLevelDefinition = [];\n await Promise.all(\n sourceDefinitions.map(async (definition) => {\n let matchedDefinition: HierarchyNodesDefinition | undefined;\n if (HierarchyNodesDefinition.isCustomNode(definition)) {\n matchedDefinition = await matchFilters<{ key: string }>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {\n return false;\n }\n return id.key === definition.node.key;\n },\n (def, matchingFilters, isFilterTarget) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyNodeIdentifiersPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget, !!hasFilterTargetAncestor),\n };\n },\n );\n } else {\n matchedDefinition = await matchFilters<InstanceKey>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n return false;\n }\n return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);\n },\n (def, matchingFilters, isFilterTarget) =>\n applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor),\n );\n }\n if (matchedDefinition) {\n filteredDefinitions.push(matchedDefinition);\n }\n }),\n );\n return filteredDefinitions;\n }\n\n private getFilteringProps(parentNode: FilteredHierarchyNode<unknown> | undefined) {\n if (!parentNode) {\n return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };\n }\n return {\n filteredNodePaths: parentNode.filteredChildrenIdentifierPaths,\n isDirectParentFilterTarget: parentNode.isFilterTarget,\n hasFilterTargetAncestor: !!parentNode.hasFilterTargetAncestor,\n };\n }\n}\n\nasync function matchFilters<\n TIdentifier extends HierarchyNodeIdentifier,\n TDefinition = TIdentifier extends InstanceKey ? InstanceNodesQueryDefinition : CustomHierarchyNodeDefinition,\n>(\n definition: TDefinition,\n filteringProps: { filteredNodePaths: HierarchyNodeIdentifiersPath[]; isDirectParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;\n let isFilterTarget = false;\n const matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }> = [];\n for (const path of filteredNodePaths) {\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;\n if (!childrenIdentifierPaths) {\n childrenIdentifierPaths = [];\n matchingFilters.push({\n // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment\n // async type guards aren't supported\n id: nodeId as TIdentifier,\n childrenIdentifierPaths,\n });\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n childrenIdentifierPaths.push(remainingPath);\n } else {\n isFilterTarget = true;\n }\n }\n }\n if (isDirectParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);\n }\n return undefined;\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined,\n isFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);\n return {\n ...node,\n ...(isFilterTarget ? { isFilterTarget } : undefined),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),\n ...(shouldAutoExpand ? { autoExpand: true } : undefined),\n ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),\n };\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_FilteredChildrenPaths = \"FilteredChildrenPaths\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_IsFilterTarget = \"IsFilterTarget\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_HasFilterTargetAncestor = \"HasFilterTargetAncestor\";\n\n/** @internal */\nexport function applyECInstanceIdsFilter(\n def: InstanceNodesQueryDefinition,\n matchingFilters: Array<{ id: InstanceKey; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n isParentFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): InstanceNodesQueryDefinition {\n if (matchingFilters.length === 0) {\n return def;\n }\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),\n // so using UNION as a workaround\n `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n ${isFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],\n ${hasFilterTargetAncestor || isParentFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_HasFilterTargetAncestor}],\n [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n ${isParentFilterTarget ? \"LEFT \" : \"\"} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FilteringHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/FilteringHierarchyDefinition.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 { ECClassHierarchyInspector, InstanceKey } from \"@itwin/presentation-shared\";\nimport {\n CustomHierarchyNodeDefinition,\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyLevelDefinition,\n HierarchyNodesDefinition,\n InstanceNodesQueryDefinition,\n NodeParser,\n NodePostProcessor,\n NodePreProcessor,\n} from \"../HierarchyDefinition\";\nimport { HierarchyNode, ParsedHierarchyNode, ParsedInstanceHierarchyNode, ProcessedHierarchyNode } from \"../HierarchyNode\";\nimport { HierarchyNodeIdentifier, HierarchyNodeIdentifiersPath } from \"../HierarchyNodeIdentifier\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n}\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyNodeIdentifiersPath[];\n\n public constructor(props: FilteringQueryBuilderProps) {\n this._classHierarchy = props.classHierarchy;\n this._source = props.source;\n this._nodeIdentifierPaths = props.nodeIdentifierPaths;\n }\n\n public get preProcessNode(): NodePreProcessor {\n return async (node) => {\n const processedNode = this._source.preProcessNode ? await this._source.preProcessNode(node) : node;\n if (processedNode?.processingParams?.hideInHierarchy && processedNode.filtering?.isFilterTarget && !processedNode.filtering.hasFilterTargetAncestor) {\n // we want to hide target nodes if they have `hideInHierarchy` param, but only if they're not under another filter target\n return undefined;\n }\n return processedNode;\n };\n }\n\n public get postProcessNode(): NodePostProcessor {\n return async (node: ProcessedHierarchyNode) => {\n const processedNode = this._source.postProcessNode ? await this._source.postProcessNode(node) : node;\n if (\n // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing\n HierarchyNode.isClassGroupingNode(node) &&\n node.children.some(\n (child: ProcessedHierarchyNode) => child.filtering && (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths),\n )\n ) {\n return Object.assign(processedNode, { autoExpand: true });\n }\n return processedNode;\n };\n }\n\n public get parseNode(): NodeParser {\n return (row: { [columnName: string]: any }): ParsedInstanceHierarchyNode => {\n const isFilterTarget: boolean = !!row[ECSQL_COLUMN_NAME_IsFilterTarget];\n const hasFilterTargetAncestor: boolean = !!row[ECSQL_COLUMN_NAME_HasFilterTargetAncestor];\n const parsedFilteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined = row[ECSQL_COLUMN_NAME_FilteredChildrenPaths]\n ? JSON.parse(row[ECSQL_COLUMN_NAME_FilteredChildrenPaths])\n : undefined;\n const defaultNode = (this._source.parseNode ?? defaultNodesParser)(row);\n return applyFilterAttributes(defaultNode, parsedFilteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor);\n };\n }\n\n public async defineHierarchyLevel(props: DefineHierarchyLevelProps): Promise<HierarchyLevelDefinition> {\n const sourceDefinitions = await this._source.defineHierarchyLevel(props);\n const { filteredNodePaths, isDirectParentFilterTarget, hasFilterTargetAncestor } = this.getFilteringProps(props.parentNode);\n if (!filteredNodePaths) {\n return sourceDefinitions;\n }\n\n const filteredDefinitions: HierarchyLevelDefinition = [];\n await Promise.all(\n sourceDefinitions.map(async (definition) => {\n let matchedDefinition: HierarchyNodesDefinition | undefined;\n if (HierarchyNodesDefinition.isCustomNode(definition)) {\n matchedDefinition = await matchFilters<{ key: string }>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isCustomNodeIdentifier(id)) {\n return false;\n }\n return id.key === definition.node.key;\n },\n (def, matchingFilters, isFilterTarget) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyNodeIdentifiersPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget, !!hasFilterTargetAncestor),\n };\n },\n );\n } else {\n matchedDefinition = await matchFilters<InstanceKey>(\n definition,\n { filteredNodePaths, isDirectParentFilterTarget },\n async (id) => {\n if (!HierarchyNodeIdentifier.isInstanceNodeIdentifier(id)) {\n return false;\n }\n return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);\n },\n (def, matchingFilters, isFilterTarget) =>\n applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor),\n );\n }\n if (matchedDefinition) {\n filteredDefinitions.push(matchedDefinition);\n }\n }),\n );\n return filteredDefinitions;\n }\n\n private getFilteringProps(parentNode: Pick<HierarchyNode, \"filtering\"> | undefined) {\n if (!parentNode) {\n return { filteredNodePaths: this._nodeIdentifierPaths, isDirectParentFilterTarget: false, hasFilterTargetAncestor: false };\n }\n return {\n filteredNodePaths: parentNode.filtering?.filteredChildrenIdentifierPaths,\n isDirectParentFilterTarget: parentNode.filtering?.isFilterTarget,\n hasFilterTargetAncestor: !!parentNode.filtering?.hasFilterTargetAncestor,\n };\n }\n}\n\nasync function matchFilters<\n TIdentifier extends HierarchyNodeIdentifier,\n TDefinition = TIdentifier extends InstanceKey ? InstanceNodesQueryDefinition : CustomHierarchyNodeDefinition,\n>(\n definition: TDefinition,\n filteringProps: { filteredNodePaths: HierarchyNodeIdentifiersPath[]; isDirectParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;\n let isFilterTarget = false;\n const matchingFilters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }> = [];\n for (const path of filteredNodePaths) {\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let childrenIdentifierPaths = matchingFilters.find(({ id }) => HierarchyNodeIdentifier.equal(id, nodeId))?.childrenIdentifierPaths;\n if (!childrenIdentifierPaths) {\n childrenIdentifierPaths = [];\n matchingFilters.push({\n // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment\n // async type guards aren't supported\n id: nodeId as TIdentifier,\n childrenIdentifierPaths,\n });\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n childrenIdentifierPaths.push(remainingPath);\n } else {\n isFilterTarget = true;\n }\n }\n }\n if (isDirectParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);\n }\n return undefined;\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyNodeIdentifiersPath[] | undefined,\n isFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);\n const result = { ...node };\n if (shouldAutoExpand) {\n result.autoExpand = true;\n }\n if (isFilterTarget || hasFilterTargetAncestor || filteredChildrenIdentifierPaths?.length) {\n result.filtering = {\n ...(isFilterTarget ? { isFilterTarget } : undefined),\n ...(hasFilterTargetAncestor ? { hasFilterTargetAncestor } : undefined),\n ...(!!filteredChildrenIdentifierPaths?.length ? { filteredChildrenIdentifierPaths } : undefined),\n };\n }\n return result;\n}\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_FilteredChildrenPaths = \"FilteredChildrenPaths\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_IsFilterTarget = \"IsFilterTarget\";\n\n/** @internal */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const ECSQL_COLUMN_NAME_HasFilterTargetAncestor = \"HasFilterTargetAncestor\";\n\n/** @internal */\nexport function applyECInstanceIdsFilter(\n def: InstanceNodesQueryDefinition,\n matchingFilters: Array<{ id: InstanceKey; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n isFilterTarget: boolean,\n isParentFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): InstanceNodesQueryDefinition {\n if (matchingFilters.length === 0) {\n return def;\n }\n return {\n ...def,\n query: {\n ...def.query,\n ctes: [\n ...(def.query.ctes ?? []),\n // note: generally we'd use `VALUES (1,1),(2,2)`, but that doesn't work in ECSQL (https://github.com/iTwin/itwinjs-backlog/issues/865),\n // so using UNION as a workaround\n `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n ${isFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_IsFilterTarget}],\n ${hasFilterTargetAncestor || isParentFilterTarget ? \"1\" : \"0\"} AS [${ECSQL_COLUMN_NAME_HasFilterTargetAncestor}],\n [f].[FilteredChildrenPaths] AS [${ECSQL_COLUMN_NAME_FilteredChildrenPaths}]\n FROM (\n ${def.query.ecsql}\n ) [q]\n ${isParentFilterTarget ? \"LEFT \" : \"\"} JOIN FilteringInfo [f] ON [f].[ECInstanceId] = [q].[ECInstanceId]\n `,\n },\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/presentation-hierarchies",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "A package for creating hierarchies based on data in iTwin.js iModels.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@itwin/core-geometry": "^4.6.0",
|
|
31
31
|
"natural-compare-lite": "^1.4.0",
|
|
32
32
|
"rxjs": "^7.8.1",
|
|
33
|
-
"@itwin/presentation-shared": "^0.
|
|
33
|
+
"@itwin/presentation-shared": "^0.3.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@itwin/build-tools": "^4.6.0",
|