@itwin/presentation-hierarchies
Version:
A package for creating hierarchies based on data in iTwin.js iModels.
52 lines • 4.47 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.LOGGING_NAMESPACE = void 0;
exports.createHideIfNoChildrenOperator = createHideIfNoChildrenOperator;
const rxjs_1 = require("rxjs");
const Common_js_1 = require("../../internal/Common.js");
const LoggingUtils_js_1 = require("../../internal/LoggingUtils.js");
const Partition_js_1 = require("../../internal/operators/Partition.js");
const IModelHierarchyNode_js_1 = require("../IModelHierarchyNode.js");
const OPERATOR_NAME = "HideIfNoChildren";
/** @internal */
exports.LOGGING_NAMESPACE = (0, Common_js_1.createOperatorLoggingNamespace)(OPERATOR_NAME, Common_js_1.LOGGING_NAMESPACE_INTERNAL);
/**
* Creates an operator that hides nodes with no children if they have a `hideIfNoChildren` handling param.
*
* @internal
*/
function createHideIfNoChildrenOperator(hasNodes) {
return function (nodes) {
const inputNodes = nodes.pipe((0, LoggingUtils_js_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `in: ${(0, Common_js_1.createNodeIdentifierForLogging)(n)}` }));
// split input into 3 pieces:
// - `doesntNeedHide` - nodes without the flag (return no matter if they have children or not)
// - `determinedChildren` - nodes with the flag and known children
// - `undeterminedChildren` - nodes with the flag and unknown children
const [needsHide, doesntNeedHide] = (0, Partition_js_1.partition)(inputNodes, (n) => (IModelHierarchyNode_js_1.ProcessedHierarchyNode.isGeneric(n) || IModelHierarchyNode_js_1.ProcessedHierarchyNode.isInstancesNode(n)) && !!n.processingParams?.hideIfNoChildren);
const [determinedChildren, undeterminedChildren] = (0, Partition_js_1.partition)(needsHide, (n) => n.children !== undefined);
return (0, rxjs_1.merge)(doesntNeedHide.pipe((0, LoggingUtils_js_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: doesn't need hide` })), (0, rxjs_1.merge)(determinedChildren.pipe((0, LoggingUtils_js_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: needs hide, has children` })), undeterminedChildren.pipe((0, LoggingUtils_js_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: needs hide, needs children` }), (0, rxjs_1.mergeMap)((n) => (0, rxjs_1.defer)(() => {
(0, LoggingUtils_js_1.doLog)({
category: exports.LOGGING_NAMESPACE,
message: /* c8 ignore next */ () => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: requesting children flag`,
});
return hasNodes(n).pipe((0, LoggingUtils_js_1.log)({
category: exports.LOGGING_NAMESPACE,
message: /* c8 ignore next */ (childrenFlag) => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: determined children: ${childrenFlag}`,
}), (0, rxjs_1.map)((children) => Object.assign(n, { children })));
}),
// Sending child check requests for all nodes without any limit greatly slows down
// the following case:
// - NodeX (determining children) -> ... lots of children with "hide if no children" -> ...
// We check the nodes with "hide if no children" at most 2 at a time to prefer going deep into
// the hierarchy, where we're more likely to find an answer, rather than going wide.
2), (0, LoggingUtils_js_1.log)({
category: exports.LOGGING_NAMESPACE,
message: /* c8 ignore next */ (n) => `${(0, Common_js_1.createNodeIdentifierForLogging)(n)}: needs hide, determined children: ${(0, Common_js_1.hasChildren)(n)}`,
}))).pipe((0, rxjs_1.filter)(Common_js_1.hasChildren))).pipe((0, LoggingUtils_js_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `out: ${(0, Common_js_1.createNodeIdentifierForLogging)(n)}` }));
};
}
//# sourceMappingURL=HideIfNoChildren.js.map