@itwin/presentation-hierarchies 1.4.1 → 1.5.0

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.
Files changed (48) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts +1 -1
  3. package/lib/cjs/hierarchies/HierarchyFiltering.d.ts.map +1 -1
  4. package/lib/cjs/hierarchies/HierarchyFiltering.js +10 -5
  5. package/lib/cjs/hierarchies/HierarchyFiltering.js.map +1 -1
  6. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +11 -7
  7. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +1 -1
  8. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js +64 -58
  9. package/lib/cjs/hierarchies/imodel/FilteringHierarchyDefinition.js.map +1 -1
  10. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  11. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +32 -39
  12. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  13. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts +2 -2
  14. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  15. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +2 -5
  16. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  17. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts +1 -3
  18. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  19. package/lib/cjs/hierarchies/imodel/operators/Grouping.js +5 -5
  20. package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +1 -1
  21. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts +64 -0
  22. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -0
  23. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +25 -0
  24. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -0
  25. package/lib/esm/hierarchies/HierarchyFiltering.d.ts +1 -1
  26. package/lib/esm/hierarchies/HierarchyFiltering.d.ts.map +1 -1
  27. package/lib/esm/hierarchies/HierarchyFiltering.js +10 -5
  28. package/lib/esm/hierarchies/HierarchyFiltering.js.map +1 -1
  29. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts +11 -7
  30. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.d.ts.map +1 -1
  31. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js +65 -59
  32. package/lib/esm/hierarchies/imodel/FilteringHierarchyDefinition.js.map +1 -1
  33. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  34. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +33 -40
  35. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  36. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts +2 -2
  37. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  38. package/lib/esm/hierarchies/imodel/TreeNodesReader.js +2 -5
  39. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  40. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts +1 -3
  41. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  42. package/lib/esm/hierarchies/imodel/operators/Grouping.js +6 -5
  43. package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +1 -1
  44. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts +64 -0
  45. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -0
  46. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +22 -0
  47. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -0
  48. package/package.json +22 -26
@@ -1 +1 @@
1
- {"version":3,"file":"Grouping.d.ts","sourceRoot":"","sources":["../../../../../src/hierarchies/imodel/operators/Grouping.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuF,UAAU,EAA4B,MAAM,MAAM,CAAC;AAEjJ,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACnH,OAAO,EAAiB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAW5E,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAMnI,OAAO,EAAoC,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AAGxH,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAA4E,CAAC;AAI3G,gBAAgB;AAChB,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,gBAAgB,GAAG,yBAAyB,EAC1D,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,cAAc,EAAE,wBAAwB,EACxC,gBAAgB,EAAE,kCAAkC,EACpD,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,8BAA8B,KAAK,IAAI,EAC9E,gBAAgB,CAAC,EAAE,eAAe,EAAE,WAEZ,UAAU,CAAC,sBAAsB,CAAC,KAAG,UAAU,CAAC,sBAAsB,CAAC,CAyDhG;AAED,gBAAgB;AAChB,MAAM,MAAM,uCAAuC,GAAG,IAAI,CAAC,8BAA8B,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,8BAA8B,EAAE,CAAA;CAAE,CAAC;AAExJ,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,OAAO,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACxD,sCAAsC;IACtC,SAAS,EAAE,8BAA8B,EAAE,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,gBAAgB;AAChB,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAEzE,gBAAgB;AAChB,MAAM,MAAM,eAAe,GAAG,CAC5B,YAAY,EAAE,8BAA8B,EAAE,EAC9C,mBAAmB,EAAE,uCAAuC,EAAE,KAC3D,OAAO,CAAC,qBAAqB,CAAC,CAAC;AA6EpC,gBAAgB;AAChB,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,gBAAgB,GAAG,yBAAyB,EAC1D,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,sBAAsB,EAAE,8BAA8B,EAAE,EACxD,cAAc,EAAE,wBAAwB,EACxC,gBAAgB,EAAE,kCAAkC,GACnD,UAAU,CAAC,eAAe,CAAC,CA+B7B"}
1
+ {"version":3,"file":"Grouping.d.ts","sourceRoot":"","sources":["../../../../../src/hierarchies/imodel/operators/Grouping.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuF,UAAU,EAA4B,MAAM,MAAM,CAAC;AAEjJ,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACnH,OAAO,EAAiB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAW5E,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAMnI,OAAO,EAAoC,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AAGxH,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAA4E,CAAC;AAI3G,gBAAgB;AAChB,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,gBAAgB,GAAG,yBAAyB,EAC1D,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,cAAc,EAAE,wBAAwB,EACxC,gBAAgB,EAAE,kCAAkC,EACpD,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,GAAG,SAAS,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,EACtG,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,8BAA8B,KAAK,IAAI,EAC9E,gBAAgB,CAAC,EAAE,eAAe,EAAE,WAEZ,UAAU,CAAC,sBAAsB,CAAC,KAAG,UAAU,CAAC,sBAAsB,CAAC,CAyDhG;AAED,gBAAgB;AAChB,MAAM,MAAM,uCAAuC,GAAG,IAAI,CAAC,8BAA8B,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,8BAA8B,EAAE,CAAA;CAAE,CAAC;AAExJ,gBAAgB;AAChB,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,OAAO,EAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACxD,sCAAsC;IACtC,SAAS,EAAE,8BAA8B,EAAE,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,gBAAgB;AAChB,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAEzE,gBAAgB;AAChB,MAAM,MAAM,eAAe,GAAG,CAC5B,YAAY,EAAE,8BAA8B,EAAE,EAC9C,mBAAmB,EAAE,uCAAuC,EAAE,KAC3D,OAAO,CAAC,qBAAqB,CAAC,CAAC"}
@@ -21,7 +21,7 @@ export const LOGGING_NAMESPACE = createOperatorLoggingNamespace(OPERATOR_NAME, L
21
21
  const LOGGING_NAMESPACE_PERFORMANCE = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE);
22
22
  const LOGGING_NAMESPACE_PERFORMANCE_INTERNAL = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE_INTERNAL);
23
23
  /** @internal */
24
- export function createGroupingOperator(imodelAccess, parentNode, valueFormatter, localizedStrings, onGroupingNodeCreated, groupingHandlers) {
24
+ export function createGroupingOperator(imodelAccess, parentNode, valueFormatter, localizedStrings, onNodesGrouped, onGroupingNodeCreated, groupingHandlers) {
25
25
  return function (nodes) {
26
26
  return nodes.pipe(log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `in: ${createNodeIdentifierForLogging(n)}` }), tapOnce(() => {
27
27
  doLog({
@@ -51,7 +51,7 @@ export function createGroupingOperator(imodelAccess, parentNode, valueFormatter,
51
51
  const groupingHandlersObs = groupingHandlers
52
52
  ? from(groupingHandlers)
53
53
  : createGroupingHandlers(imodelAccess, parentNode, instanceNodes, valueFormatter, localizedStrings);
54
- return merge(groupingHandlersObs.pipe(toArray(), mergeMap((createdGroupingHandlers) => groupInstanceNodes(instanceNodes, restNodes.length, createdGroupingHandlers, parentNode, onGroupingNodeCreated)), finalize(() => {
54
+ return merge(groupingHandlersObs.pipe(toArray(), mergeMap((createdGroupingHandlers) => groupInstanceNodes(instanceNodes, restNodes.length, createdGroupingHandlers, parentNode, onNodesGrouped, onGroupingNodeCreated)), finalize(() => {
55
55
  doLog({
56
56
  category: LOGGING_NAMESPACE_PERFORMANCE,
57
57
  message: /* c8 ignore next */ () => `Grouping ${instanceNodes.length} nodes took ${timer.elapsedSeconds.toFixed(3)} s`,
@@ -60,7 +60,7 @@ export function createGroupingOperator(imodelAccess, parentNode, valueFormatter,
60
60
  }), releaseMainThreadOnItemsCount(500), log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `out: ${createNodeIdentifierForLogging(n)}` }));
61
61
  };
62
62
  }
63
- function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode, onGroupingNodeCreated) {
63
+ function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode, onNodesGrouped, onGroupingNodeCreated) {
64
64
  if (groupingHandlers.length === 0) {
65
65
  return from(nodes);
66
66
  }
@@ -73,6 +73,8 @@ function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode,
73
73
  return from(currentHandler(curr?.ungrouped ?? nodes, curr?.grouped ?? [])).pipe(log({
74
74
  category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
75
75
  message: /* c8 ignore next */ () => `Grouping handler ${handlerIndex} exclusively took ${timer.elapsedSeconds.toFixed(3)} s.`,
76
+ }), tap((result) => {
77
+ onNodesGrouped?.(result, currentHandler);
76
78
  }), mergeMap((result) => {
77
79
  if (result.grouped.length === 0) {
78
80
  return of({ handlerIndex: handlerIndex + 1, result: { ...result, grouped: curr?.grouped ?? [] } });
@@ -112,8 +114,7 @@ function mergeInPlace(target, source) {
112
114
  }
113
115
  return target;
114
116
  }
115
- /** @internal */
116
- export function createGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes, valueFormatter, localizedStrings) {
117
+ function createGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes, valueFormatter, localizedStrings) {
117
118
  const timer = new StopWatch();
118
119
  const groupingLevel = getNodeGroupingLevel(parentNode);
119
120
  return concat(groupingLevel <= GroupingLevel.Class
@@ -1 +1 @@
1
- {"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../../../../src/hierarchies/imodel/operators/Grouping.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 { concat, concatAll, delay, EMPTY, expand, finalize, from, last, map, merge, mergeMap, Observable, of, reduce, tap, toArray } from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { ECClassHierarchyInspector, ECSchemaProvider, IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport { HierarchyNode, ParentHierarchyNode } from \"../../HierarchyNode.js\";\nimport {\n LOGGING_NAMESPACE_PERFORMANCE as BASE_LOGGING_NAMESPACE_PERFORMANCE,\n LOGGING_NAMESPACE_PERFORMANCE_INTERNAL as BASE_LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n createNodeIdentifierForLogging,\n createOperatorLoggingNamespace,\n LOGGING_NAMESPACE_INTERNAL,\n} from \"../../internal/Common.js\";\nimport { doLog, log } from \"../../internal/LoggingUtils.js\";\nimport { releaseMainThreadOnItemsCount } from \"../../internal/operators/ReleaseMainThread.js\";\nimport { tapOnce } from \"../../internal/operators/TapOnce.js\";\nimport { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, ProcessedInstanceHierarchyNode } from \"../IModelHierarchyNode.js\";\nimport { assignAutoExpand } from \"./grouping/AutoExpand.js\";\nimport { createBaseClassGroupingHandlers } from \"./grouping/BaseClassGrouping.js\";\nimport { createClassGroups } from \"./grouping/ClassGrouping.js\";\nimport { applyGroupHidingParams } from \"./grouping/GroupHiding.js\";\nimport { createLabelGroups } from \"./grouping/LabelGrouping.js\";\nimport { createPropertiesGroupingHandlers, PropertiesGroupingLocalizedStrings } from \"./grouping/PropertiesGrouping.js\";\n\nconst OPERATOR_NAME = \"Grouping\";\n/** @internal */\nexport const LOGGING_NAMESPACE = createOperatorLoggingNamespace(OPERATOR_NAME, LOGGING_NAMESPACE_INTERNAL);\nconst LOGGING_NAMESPACE_PERFORMANCE = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE);\nconst LOGGING_NAMESPACE_PERFORMANCE_INTERNAL = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE_INTERNAL);\n\n/** @internal */\nexport function createGroupingOperator(\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n parentNode: ParentHierarchyNode | undefined,\n valueFormatter: IPrimitiveValueFormatter,\n localizedStrings: PropertiesGroupingLocalizedStrings,\n onGroupingNodeCreated?: (groupingNode: ProcessedGroupingHierarchyNode) => void,\n groupingHandlers?: GroupingHandler[],\n) {\n return function (nodes: Observable<ProcessedHierarchyNode>): Observable<ProcessedHierarchyNode> {\n return nodes.pipe(\n log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `in: ${createNodeIdentifierForLogging(n)}` }),\n tapOnce(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `Starting grouping (parent: ${createNodeIdentifierForLogging(parentNode)})`,\n });\n }),\n reduce<ProcessedHierarchyNode, { instanceNodes: ProcessedInstanceHierarchyNode[]; restNodes: ProcessedHierarchyNode[] }>(\n (resolvedNodes, node) => {\n if (HierarchyNode.isInstancesNode(node)) {\n resolvedNodes.instanceNodes.push(node);\n } else {\n resolvedNodes.restNodes.push(node);\n }\n return resolvedNodes;\n },\n { instanceNodes: [], restNodes: [] },\n ),\n tap(({ instanceNodes, restNodes }) => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Nodes partitioned. Got ${instanceNodes.length} instance nodes and ${restNodes.length} rest nodes.`,\n });\n }),\n mergeMap((res) => {\n const out = of(res);\n const totalNodes = res.instanceNodes.length + res.restNodes.length;\n /* c8 ignore next */\n return totalNodes <= 1000 ? out : out.pipe(delay(0));\n }),\n mergeMap(({ instanceNodes, restNodes }): Observable<ProcessedHierarchyNode> => {\n const timer = new StopWatch(undefined, true);\n const groupingHandlersObs: Observable<GroupingHandler> = groupingHandlers\n ? from(groupingHandlers)\n : createGroupingHandlers(imodelAccess, parentNode, instanceNodes, valueFormatter, localizedStrings);\n return merge(\n groupingHandlersObs.pipe(\n toArray(),\n mergeMap((createdGroupingHandlers) =>\n groupInstanceNodes(instanceNodes, restNodes.length, createdGroupingHandlers, parentNode, onGroupingNodeCreated),\n ),\n finalize(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `Grouping ${instanceNodes.length} nodes took ${timer.elapsedSeconds.toFixed(3)} s`,\n });\n }),\n ),\n from(restNodes),\n );\n }),\n releaseMainThreadOnItemsCount(500),\n log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `out: ${createNodeIdentifierForLogging(n)}` }),\n );\n };\n}\n\n/** @internal */\nexport type ProcessedInstancesGroupingHierarchyNode = Omit<ProcessedGroupingHierarchyNode, \"children\"> & { children: ProcessedInstanceHierarchyNode[] };\n\n/** @internal */\nexport interface GroupingHandlerResult {\n /** Expected to be sorted by label. */\n grouped: Array<ProcessedInstancesGroupingHierarchyNode>;\n /** Expected to be sorted by label. */\n ungrouped: ProcessedInstanceHierarchyNode[];\n groupingType: GroupingType;\n}\n\n/** @internal */\nexport type GroupingType = \"label\" | \"class\" | \"base-class\" | \"property\";\n\n/** @internal */\nexport type GroupingHandler = (\n nodesToGroup: ProcessedInstanceHierarchyNode[],\n nodesAlreadyGrouped: ProcessedInstancesGroupingHierarchyNode[],\n) => Promise<GroupingHandlerResult>;\n\nfunction groupInstanceNodes(\n nodes: ProcessedInstanceHierarchyNode[],\n extraSiblings: number,\n groupingHandlers: GroupingHandler[],\n parentNode: ParentHierarchyNode | undefined,\n onGroupingNodeCreated?: (groupingNode: ProcessedGroupingHierarchyNode) => void,\n): Observable<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode> {\n if (groupingHandlers.length === 0) {\n return from(nodes);\n }\n return of<{ handlerIndex: number; result?: GroupingHandlerResult | undefined }>({ handlerIndex: 0 }).pipe(\n expand(({ handlerIndex, result: curr }) => {\n if (handlerIndex >= groupingHandlers.length) {\n return EMPTY;\n }\n const timer = new StopWatch(undefined, true);\n const currentHandler = groupingHandlers[handlerIndex];\n return from(currentHandler(curr?.ungrouped ?? nodes, curr?.grouped ?? [])).pipe(\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Grouping handler ${handlerIndex} exclusively took ${timer.elapsedSeconds.toFixed(3)} s.`,\n }),\n mergeMap((result) => {\n if (result.grouped.length === 0) {\n return of({ handlerIndex: handlerIndex + 1, result: { ...result, grouped: curr?.grouped ?? [] } });\n }\n const groupingPostProcessingTimer = new StopWatch(undefined, true);\n return of(result).pipe(\n map((r) => applyGroupHidingParams(r, extraSiblings)),\n map((r) => assignAutoExpand(r)),\n map((r) => ({ handlerIndex: handlerIndex + 1, result: { ...r, grouped: mergeInPlace(curr?.grouped, r.grouped) } })),\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () =>\n `Post-processing grouping handler ${handlerIndex} exclusively took ${groupingPostProcessingTimer.elapsedSeconds.toFixed(3)} s.`,\n }),\n delay(0),\n );\n }),\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Total time for grouping handler ${handlerIndex}: ${timer.elapsedSeconds.toFixed(3)} s.`,\n }),\n );\n }),\n last(),\n mergeMap(({ result }) => {\n result.grouped.forEach((groupingNode) => {\n onGroupingNodeCreated?.(groupingNode);\n if (!parentNode) {\n return;\n }\n if (HierarchyNode.isGroupingNode(parentNode)) {\n groupingNode.nonGroupingAncestor = parentNode.nonGroupingAncestor;\n return;\n }\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n groupingNode.nonGroupingAncestor = parentNode;\n });\n return mergeInPlace<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>(result.grouped, result.ungrouped);\n }),\n );\n}\n\nfunction mergeInPlace<T>(target: T[] | undefined, source: T[]) {\n if (!target || target.length === 0) {\n return source;\n }\n for (const item of source) {\n target.push(item);\n }\n return target;\n}\n\n/** @internal */\nexport function createGroupingHandlers(\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n parentNode: ParentHierarchyNode | undefined,\n processedInstanceNodes: ProcessedInstanceHierarchyNode[],\n valueFormatter: IPrimitiveValueFormatter,\n localizedStrings: PropertiesGroupingLocalizedStrings,\n): Observable<GroupingHandler> {\n const timer = new StopWatch();\n const groupingLevel = getNodeGroupingLevel(parentNode);\n return concat(\n groupingLevel <= GroupingLevel.Class\n ? concat(\n from(createBaseClassGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes)).pipe(concatAll()),\n of<GroupingHandler>(async (allNodes) => createClassGroups(imodelAccess, parentNode, allNodes)),\n )\n : EMPTY,\n groupingLevel <= GroupingLevel.Property\n ? from(createPropertiesGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes, valueFormatter, localizedStrings)).pipe(concatAll())\n : EMPTY,\n groupingLevel < GroupingLevel.Label ? of<GroupingHandler>(async (allNodes) => createLabelGroups(allNodes)) : EMPTY,\n ).pipe(\n tap({\n subscribe: () => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Start creating grouping handlers`,\n });\n timer.start();\n },\n }),\n finalize(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Creating grouping handlers took ${timer.elapsedSeconds.toFixed(3)} s`,\n });\n }),\n );\n}\n\nfunction getNodeGroupingLevel(node: ParentHierarchyNode | undefined): GroupingLevel {\n if (node && HierarchyNode.isClassGroupingNode(node)) {\n return GroupingLevel.Class;\n }\n if (node && HierarchyNode.isPropertyGroupingNode(node)) {\n return GroupingLevel.Property;\n }\n if (node && HierarchyNode.isLabelGroupingNode(node)) {\n return GroupingLevel.Label;\n }\n return GroupingLevel.None;\n}\n\nenum GroupingLevel {\n None = 0,\n Class = 2,\n Property = 3,\n Label = 4,\n}\n"]}
1
+ {"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../../../../src/hierarchies/imodel/operators/Grouping.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 { concat, concatAll, delay, EMPTY, expand, finalize, from, last, map, merge, mergeMap, Observable, of, reduce, tap, toArray } from \"rxjs\";\nimport { assert, StopWatch } from \"@itwin/core-bentley\";\nimport { ECClassHierarchyInspector, ECSchemaProvider, IPrimitiveValueFormatter } from \"@itwin/presentation-shared\";\nimport { HierarchyNode, ParentHierarchyNode } from \"../../HierarchyNode.js\";\nimport {\n LOGGING_NAMESPACE_PERFORMANCE as BASE_LOGGING_NAMESPACE_PERFORMANCE,\n LOGGING_NAMESPACE_PERFORMANCE_INTERNAL as BASE_LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n createNodeIdentifierForLogging,\n createOperatorLoggingNamespace,\n LOGGING_NAMESPACE_INTERNAL,\n} from \"../../internal/Common.js\";\nimport { doLog, log } from \"../../internal/LoggingUtils.js\";\nimport { releaseMainThreadOnItemsCount } from \"../../internal/operators/ReleaseMainThread.js\";\nimport { tapOnce } from \"../../internal/operators/TapOnce.js\";\nimport { ProcessedGroupingHierarchyNode, ProcessedHierarchyNode, ProcessedInstanceHierarchyNode } from \"../IModelHierarchyNode.js\";\nimport { assignAutoExpand } from \"./grouping/AutoExpand.js\";\nimport { createBaseClassGroupingHandlers } from \"./grouping/BaseClassGrouping.js\";\nimport { createClassGroups } from \"./grouping/ClassGrouping.js\";\nimport { applyGroupHidingParams } from \"./grouping/GroupHiding.js\";\nimport { createLabelGroups } from \"./grouping/LabelGrouping.js\";\nimport { createPropertiesGroupingHandlers, PropertiesGroupingLocalizedStrings } from \"./grouping/PropertiesGrouping.js\";\n\nconst OPERATOR_NAME = \"Grouping\";\n/** @internal */\nexport const LOGGING_NAMESPACE = createOperatorLoggingNamespace(OPERATOR_NAME, LOGGING_NAMESPACE_INTERNAL);\nconst LOGGING_NAMESPACE_PERFORMANCE = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE);\nconst LOGGING_NAMESPACE_PERFORMANCE_INTERNAL = createOperatorLoggingNamespace(OPERATOR_NAME, BASE_LOGGING_NAMESPACE_PERFORMANCE_INTERNAL);\n\n/** @internal */\nexport function createGroupingOperator(\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n parentNode: ParentHierarchyNode | undefined,\n valueFormatter: IPrimitiveValueFormatter,\n localizedStrings: PropertiesGroupingLocalizedStrings,\n onNodesGrouped?: (groupingResult: GroupingHandlerResult | undefined, handler: GroupingHandler) => void,\n onGroupingNodeCreated?: (groupingNode: ProcessedGroupingHierarchyNode) => void,\n groupingHandlers?: GroupingHandler[],\n) {\n return function (nodes: Observable<ProcessedHierarchyNode>): Observable<ProcessedHierarchyNode> {\n return nodes.pipe(\n log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `in: ${createNodeIdentifierForLogging(n)}` }),\n tapOnce(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `Starting grouping (parent: ${createNodeIdentifierForLogging(parentNode)})`,\n });\n }),\n reduce<ProcessedHierarchyNode, { instanceNodes: ProcessedInstanceHierarchyNode[]; restNodes: ProcessedHierarchyNode[] }>(\n (resolvedNodes, node) => {\n if (HierarchyNode.isInstancesNode(node)) {\n resolvedNodes.instanceNodes.push(node);\n } else {\n resolvedNodes.restNodes.push(node);\n }\n return resolvedNodes;\n },\n { instanceNodes: [], restNodes: [] },\n ),\n tap(({ instanceNodes, restNodes }) => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Nodes partitioned. Got ${instanceNodes.length} instance nodes and ${restNodes.length} rest nodes.`,\n });\n }),\n mergeMap((res) => {\n const out = of(res);\n const totalNodes = res.instanceNodes.length + res.restNodes.length;\n /* c8 ignore next */\n return totalNodes <= 1000 ? out : out.pipe(delay(0));\n }),\n mergeMap(({ instanceNodes, restNodes }): Observable<ProcessedHierarchyNode> => {\n const timer = new StopWatch(undefined, true);\n const groupingHandlersObs: Observable<GroupingHandler> = groupingHandlers\n ? from(groupingHandlers)\n : createGroupingHandlers(imodelAccess, parentNode, instanceNodes, valueFormatter, localizedStrings);\n return merge(\n groupingHandlersObs.pipe(\n toArray(),\n mergeMap((createdGroupingHandlers) =>\n groupInstanceNodes(instanceNodes, restNodes.length, createdGroupingHandlers, parentNode, onNodesGrouped, onGroupingNodeCreated),\n ),\n finalize(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE,\n message: /* c8 ignore next */ () => `Grouping ${instanceNodes.length} nodes took ${timer.elapsedSeconds.toFixed(3)} s`,\n });\n }),\n ),\n from(restNodes),\n );\n }),\n releaseMainThreadOnItemsCount(500),\n log({ category: LOGGING_NAMESPACE, message: /* c8 ignore next */ (n) => `out: ${createNodeIdentifierForLogging(n)}` }),\n );\n };\n}\n\n/** @internal */\nexport type ProcessedInstancesGroupingHierarchyNode = Omit<ProcessedGroupingHierarchyNode, \"children\"> & { children: ProcessedInstanceHierarchyNode[] };\n\n/** @internal */\nexport interface GroupingHandlerResult {\n /** Expected to be sorted by label. */\n grouped: Array<ProcessedInstancesGroupingHierarchyNode>;\n /** Expected to be sorted by label. */\n ungrouped: ProcessedInstanceHierarchyNode[];\n groupingType: GroupingType;\n}\n\n/** @internal */\nexport type GroupingType = \"label\" | \"class\" | \"base-class\" | \"property\";\n\n/** @internal */\nexport type GroupingHandler = (\n nodesToGroup: ProcessedInstanceHierarchyNode[],\n nodesAlreadyGrouped: ProcessedInstancesGroupingHierarchyNode[],\n) => Promise<GroupingHandlerResult>;\n\nfunction groupInstanceNodes(\n nodes: ProcessedInstanceHierarchyNode[],\n extraSiblings: number,\n groupingHandlers: GroupingHandler[],\n parentNode: ParentHierarchyNode | undefined,\n onNodesGrouped?: (groupingResult: GroupingHandlerResult | undefined, handler: GroupingHandler) => void,\n onGroupingNodeCreated?: (groupingNode: ProcessedGroupingHierarchyNode) => void,\n): Observable<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode> {\n if (groupingHandlers.length === 0) {\n return from(nodes);\n }\n return of<{ handlerIndex: number; result?: GroupingHandlerResult | undefined }>({ handlerIndex: 0 }).pipe(\n expand(({ handlerIndex, result: curr }) => {\n if (handlerIndex >= groupingHandlers.length) {\n return EMPTY;\n }\n const timer = new StopWatch(undefined, true);\n const currentHandler = groupingHandlers[handlerIndex];\n return from(currentHandler(curr?.ungrouped ?? nodes, curr?.grouped ?? [])).pipe(\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Grouping handler ${handlerIndex} exclusively took ${timer.elapsedSeconds.toFixed(3)} s.`,\n }),\n tap((result) => {\n onNodesGrouped?.(result, currentHandler);\n }),\n mergeMap((result) => {\n if (result.grouped.length === 0) {\n return of({ handlerIndex: handlerIndex + 1, result: { ...result, grouped: curr?.grouped ?? [] } });\n }\n const groupingPostProcessingTimer = new StopWatch(undefined, true);\n return of(result).pipe(\n map((r) => applyGroupHidingParams(r, extraSiblings)),\n map((r) => assignAutoExpand(r)),\n map((r) => ({ handlerIndex: handlerIndex + 1, result: { ...r, grouped: mergeInPlace(curr?.grouped, r.grouped) } })),\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () =>\n `Post-processing grouping handler ${handlerIndex} exclusively took ${groupingPostProcessingTimer.elapsedSeconds.toFixed(3)} s.`,\n }),\n delay(0),\n );\n }),\n log({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Total time for grouping handler ${handlerIndex}: ${timer.elapsedSeconds.toFixed(3)} s.`,\n }),\n );\n }),\n last(),\n mergeMap(({ result }) => {\n result.grouped.forEach((groupingNode) => {\n onGroupingNodeCreated?.(groupingNode);\n if (!parentNode) {\n return;\n }\n if (HierarchyNode.isGroupingNode(parentNode)) {\n groupingNode.nonGroupingAncestor = parentNode.nonGroupingAncestor;\n return;\n }\n // not sure why type checker doesn't pick this up\n assert(HierarchyNode.isGeneric(parentNode) || HierarchyNode.isInstancesNode(parentNode));\n groupingNode.nonGroupingAncestor = parentNode;\n });\n return mergeInPlace<ProcessedGroupingHierarchyNode | ProcessedInstanceHierarchyNode>(result.grouped, result.ungrouped);\n }),\n );\n}\n\nfunction mergeInPlace<T>(target: T[] | undefined, source: T[]) {\n if (!target || target.length === 0) {\n return source;\n }\n for (const item of source) {\n target.push(item);\n }\n return target;\n}\n\nfunction createGroupingHandlers(\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n parentNode: ParentHierarchyNode | undefined,\n processedInstanceNodes: ProcessedInstanceHierarchyNode[],\n valueFormatter: IPrimitiveValueFormatter,\n localizedStrings: PropertiesGroupingLocalizedStrings,\n): Observable<GroupingHandler> {\n const timer = new StopWatch();\n const groupingLevel = getNodeGroupingLevel(parentNode);\n return concat(\n groupingLevel <= GroupingLevel.Class\n ? concat(\n from(createBaseClassGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes)).pipe(concatAll()),\n of<GroupingHandler>(async (allNodes) => createClassGroups(imodelAccess, parentNode, allNodes)),\n )\n : EMPTY,\n groupingLevel <= GroupingLevel.Property\n ? from(createPropertiesGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes, valueFormatter, localizedStrings)).pipe(concatAll())\n : EMPTY,\n groupingLevel < GroupingLevel.Label ? of<GroupingHandler>(async (allNodes) => createLabelGroups(allNodes)) : EMPTY,\n ).pipe(\n tap({\n subscribe: () => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Start creating grouping handlers`,\n });\n timer.start();\n },\n }),\n finalize(() => {\n doLog({\n category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,\n message: /* c8 ignore next */ () => `Creating grouping handlers took ${timer.elapsedSeconds.toFixed(3)} s`,\n });\n }),\n );\n}\n\nfunction getNodeGroupingLevel(node: ParentHierarchyNode | undefined): GroupingLevel {\n if (node && HierarchyNode.isClassGroupingNode(node)) {\n return GroupingLevel.Class;\n }\n if (node && HierarchyNode.isPropertyGroupingNode(node)) {\n return GroupingLevel.Property;\n }\n if (node && HierarchyNode.isLabelGroupingNode(node)) {\n return GroupingLevel.Label;\n }\n return GroupingLevel.None;\n}\n\nenum GroupingLevel {\n None = 0,\n Class = 2,\n Property = 3,\n Label = 4,\n}\n"]}
@@ -0,0 +1,64 @@
1
+ import { Observable } from "rxjs";
2
+ import { DefineHierarchyLevelProps, HierarchyDefinition, HierarchyDefinitionParentNode, HierarchyLevelDefinition } from "../imodel/IModelHierarchyDefinition.js";
3
+ import { ProcessedGenericHierarchyNode, ProcessedHierarchyNode, ProcessedInstanceHierarchyNode, SourceInstanceHierarchyNode } from "../imodel/IModelHierarchyNode.js";
4
+ /**
5
+ * A type for a function that parses a `SourceInstanceHierarchyNode` from provided ECSQL `row` object.
6
+ * @internal
7
+ */
8
+ export type RxjsNodeParser = (row: {
9
+ [columnName: string]: any;
10
+ }, parentNode?: HierarchyDefinitionParentNode) => Observable<SourceInstanceHierarchyNode>;
11
+ /**
12
+ * A type for a function that pre-processes given node. Unless the function decides not to make any modifications,
13
+ * it should return a new - modified - node, rather than modifying the given one. Returning `undefined` omits the node
14
+ * from the hierarchy.
15
+ *
16
+ * @internal
17
+ */
18
+ export type RxjsNodePreProcessor = <TNode extends ProcessedGenericHierarchyNode | ProcessedInstanceHierarchyNode>(node: TNode) => Observable<TNode>;
19
+ /**
20
+ * A type for a function that post-processes given node. Unless the function decides not to make any modifications,
21
+ * it should return a new - modified - node, rather than modifying the given one.
22
+ *
23
+ * @internal
24
+ */
25
+ export type RxjsNodePostProcessor = (node: ProcessedHierarchyNode) => Observable<ProcessedHierarchyNode>;
26
+ /**
27
+ * An interface for a factory that knows how define a hierarchy based on a given parent node.
28
+ * @internal
29
+ */
30
+ export interface RxjsHierarchyDefinition {
31
+ /**
32
+ * An optional function for parsing ECInstance node from ECSQL row.
33
+ *
34
+ * Should be used in situations when the `HierarchyDefinition` implementation
35
+ * introduces additional ECSQL columns into the select clause and wants to assign additional
36
+ * data to the nodes it produces.
37
+ *
38
+ * Defaults to a function that parses all `HierarchyNode` attributes from a query, whose SELECT
39
+ * clause is created using `NodeSelectQueryFactory.createSelectClause`.
40
+ */
41
+ parseNode?: RxjsNodeParser;
42
+ /**
43
+ * An optional function for pre-processing nodes.
44
+ *
45
+ * Pre-processing happens immediately after the nodes are loaded based on `HierarchyLevelDefinition`
46
+ * returned by this `HierarchyDefinition` and before their processing (hiding, grouping, sorting, etc.) starts.
47
+ * The step allows assigning nodes additional data or excluding them from the hierarchy based on some attributes.
48
+ */
49
+ preProcessNode?: RxjsNodePreProcessor;
50
+ /**
51
+ * An optional function for post-processing nodes.
52
+ *
53
+ * Post-processing happens after the loaded nodes go through all the merging, hiding and grouping
54
+ * steps, but before sorting them. This step allows `HierarchyDefinition` implementations to assign additional data
55
+ * to nodes after they're processed. This is especially true for grouping nodes as they're only created during
56
+ * processing.
57
+ */
58
+ postProcessNode?: RxjsNodePostProcessor;
59
+ /** A function to create a hierarchy level definition for given parent node. */
60
+ defineHierarchyLevel(props: DefineHierarchyLevelProps): Observable<HierarchyLevelDefinition>;
61
+ }
62
+ /** @internal */
63
+ export declare function getRxjsHierarchyDefinition(hierarchyDefinition: HierarchyDefinition): RxjsHierarchyDefinition;
64
+ //# sourceMappingURL=RxjsHierarchyDefinition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxjsHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/RxjsHierarchyDefinition.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,UAAU,EAAM,MAAM,MAAM,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,6BAA6B,EAC7B,sBAAsB,EACtB,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;IAAE,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,UAAU,CAAC,EAAE,6BAA6B,KAAK,UAAU,CAAC,2BAA2B,CAAC,CAAC;AAEzJ;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,SAAS,6BAA6B,GAAG,8BAA8B,EAAE,IAAI,EAAE,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC;AAEpJ;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,sBAAsB,KAAK,UAAU,CAAC,sBAAsB,CAAC,CAAC;AAEzG;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC,+EAA+E;IAC/E,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;CAC9F;AAED,gBAAgB;AAChB,wBAAgB,0BAA0B,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,uBAAuB,CAc5G"}
@@ -0,0 +1,22 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { filter, from, of } from "rxjs";
6
+ /** @internal */
7
+ export function getRxjsHierarchyDefinition(hierarchyDefinition) {
8
+ return {
9
+ parseNode: hierarchyDefinition.parseNode
10
+ ? (row, parentNode) => {
11
+ const parsedNode = hierarchyDefinition.parseNode(row, parentNode);
12
+ return parsedNode instanceof Promise ? from(parsedNode) : of(parsedNode);
13
+ }
14
+ : undefined,
15
+ preProcessNode: hierarchyDefinition.preProcessNode
16
+ ? (node) => from(hierarchyDefinition.preProcessNode(node)).pipe(filter((preprocessedNode) => !!preprocessedNode))
17
+ : undefined,
18
+ postProcessNode: hierarchyDefinition.postProcessNode ? (node) => from(hierarchyDefinition.postProcessNode(node)) : undefined,
19
+ defineHierarchyLevel: (props) => from(hierarchyDefinition.defineHierarchyLevel(props)),
20
+ };
21
+ }
22
+ //# sourceMappingURL=RxjsHierarchyDefinition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RxjsHierarchyDefinition.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/RxjsHierarchyDefinition.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAc,EAAE,EAAE,MAAM,MAAM,CAAC;AA6EpD,gBAAgB;AAChB,MAAM,UAAU,0BAA0B,CAAC,mBAAwC;IACjF,OAAO;QACL,SAAS,EAAE,mBAAmB,CAAC,SAAS;YACtC,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;gBAClB,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACnE,OAAO,UAAU,YAAY,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;YAC3E,CAAC;YACH,CAAC,CAAC,SAAS;QACb,cAAc,EAAE,mBAAmB,CAAC,cAAc;YAChD,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,cAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAClH,CAAC,CAAC,SAAS;QACb,eAAe,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QAC7H,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;KACvF,CAAC;AACJ,CAAC","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 { filter, from, Observable, of } from \"rxjs\";\nimport {\n DefineHierarchyLevelProps,\n HierarchyDefinition,\n HierarchyDefinitionParentNode,\n HierarchyLevelDefinition,\n} from \"../imodel/IModelHierarchyDefinition.js\";\nimport {\n ProcessedGenericHierarchyNode,\n ProcessedHierarchyNode,\n ProcessedInstanceHierarchyNode,\n SourceInstanceHierarchyNode,\n} from \"../imodel/IModelHierarchyNode.js\";\n\n/**\n * A type for a function that parses a `SourceInstanceHierarchyNode` from provided ECSQL `row` object.\n * @internal\n */\nexport type RxjsNodeParser = (row: { [columnName: string]: any }, parentNode?: HierarchyDefinitionParentNode) => Observable<SourceInstanceHierarchyNode>;\n\n/**\n * A type for a function that pre-processes given node. Unless the function decides not to make any modifications,\n * it should return a new - modified - node, rather than modifying the given one. Returning `undefined` omits the node\n * from the hierarchy.\n *\n * @internal\n */\nexport type RxjsNodePreProcessor = <TNode extends ProcessedGenericHierarchyNode | ProcessedInstanceHierarchyNode>(node: TNode) => Observable<TNode>;\n\n/**\n * A type for a function that post-processes given node. Unless the function decides not to make any modifications,\n * it should return a new - modified - node, rather than modifying the given one.\n *\n * @internal\n */\nexport type RxjsNodePostProcessor = (node: ProcessedHierarchyNode) => Observable<ProcessedHierarchyNode>;\n\n/**\n * An interface for a factory that knows how define a hierarchy based on a given parent node.\n * @internal\n */\nexport interface RxjsHierarchyDefinition {\n /**\n * An optional function for parsing ECInstance node from ECSQL row.\n *\n * Should be used in situations when the `HierarchyDefinition` implementation\n * introduces additional ECSQL columns into the select clause and wants to assign additional\n * data to the nodes it produces.\n *\n * Defaults to a function that parses all `HierarchyNode` attributes from a query, whose SELECT\n * clause is created using `NodeSelectQueryFactory.createSelectClause`.\n */\n parseNode?: RxjsNodeParser;\n\n /**\n * An optional function for pre-processing nodes.\n *\n * Pre-processing happens immediately after the nodes are loaded based on `HierarchyLevelDefinition`\n * returned by this `HierarchyDefinition` and before their processing (hiding, grouping, sorting, etc.) starts.\n * The step allows assigning nodes additional data or excluding them from the hierarchy based on some attributes.\n */\n preProcessNode?: RxjsNodePreProcessor;\n\n /**\n * An optional function for post-processing nodes.\n *\n * Post-processing happens after the loaded nodes go through all the merging, hiding and grouping\n * steps, but before sorting them. This step allows `HierarchyDefinition` implementations to assign additional data\n * to nodes after they're processed. This is especially true for grouping nodes as they're only created during\n * processing.\n */\n postProcessNode?: RxjsNodePostProcessor;\n\n /** A function to create a hierarchy level definition for given parent node. */\n defineHierarchyLevel(props: DefineHierarchyLevelProps): Observable<HierarchyLevelDefinition>;\n}\n\n/** @internal */\nexport function getRxjsHierarchyDefinition(hierarchyDefinition: HierarchyDefinition): RxjsHierarchyDefinition {\n return {\n parseNode: hierarchyDefinition.parseNode\n ? (row, parentNode) => {\n const parsedNode = hierarchyDefinition.parseNode!(row, parentNode);\n return parsedNode instanceof Promise ? from(parsedNode) : of(parsedNode);\n }\n : undefined,\n preProcessNode: hierarchyDefinition.preProcessNode\n ? (node) => from(hierarchyDefinition.preProcessNode!(node)).pipe(filter((preprocessedNode) => !!preprocessedNode))\n : undefined,\n postProcessNode: hierarchyDefinition.postProcessNode ? (node) => from(hierarchyDefinition.postProcessNode!(node)) : undefined,\n defineHierarchyLevel: (props) => from(hierarchyDefinition.defineHierarchyLevel(props)),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/presentation-hierarchies",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "A package for creating hierarchies based on data in iTwin.js iModels.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -33,37 +33,33 @@
33
33
  "./package.json": "./package.json"
34
34
  },
35
35
  "dependencies": {
36
- "@itwin/core-bentley": "^4.10.1",
37
- "@itwin/core-common": "^4.10.1",
38
- "@itwin/core-geometry": "^4.10.1",
36
+ "@itwin/core-bentley": "^4.11.1",
37
+ "@itwin/core-common": "^4.11.1",
38
+ "@itwin/core-geometry": "^4.11.1",
39
39
  "natural-compare-lite": "^1.4.0",
40
40
  "rxjs": "^7.8.1",
41
- "@itwin/presentation-shared": "^1.2.0"
41
+ "@itwin/presentation-shared": "^1.2.1"
42
42
  },
43
43
  "devDependencies": {
44
- "@itwin/build-tools": "^4.10.1",
45
- "@itwin/eslint-plugin": "5.0.0-dev.1",
46
- "@types/chai": "^4.3.16",
47
- "@types/chai-as-promised": "^7.1.8",
48
- "@types/chai-subset": "^1.3.5",
49
- "@types/mocha": "^10.0.7",
44
+ "@itwin/build-tools": "rc",
45
+ "@itwin/eslint-plugin": "5.1.0",
46
+ "@types/chai": "^5.2.0",
47
+ "@types/chai-as-promised": "^8.0.2",
48
+ "@types/mocha": "^10.0.10",
50
49
  "@types/natural-compare-lite": "^1.4.2",
51
- "@types/node": "^20.12.12",
52
- "@types/sinon": "^17.0.3",
53
- "@types/sinon-chai": "^3.2.12",
54
- "c8": "^10.1.2",
55
- "chai": "^4.4.1",
56
- "chai-as-promised": "^7.1.2",
57
- "chai-subset": "^1.6.0",
50
+ "@types/node": "^22.13.9",
51
+ "@types/sinon": "^17.0.4",
52
+ "@types/sinon-chai": "^4.0.0",
53
+ "c8": "^10.1.3",
54
+ "chai": "^5.2.0",
55
+ "chai-as-promised": "^8.0.1",
58
56
  "cpx2": "^7.0.1",
59
- "eslint": "^9.13.0",
60
- "mocha": "^10.7.3",
57
+ "eslint": "^9.25.1",
58
+ "mocha": "^11.1.0",
61
59
  "rimraf": "^6.0.1",
62
- "sinon": "^18.0.0",
63
- "sinon-chai": "^3.7.0",
64
- "testdouble": "^3.20.2",
65
- "typescript": "~5.6.3",
66
- "presentation-build-tools": "^0.0.0",
60
+ "sinon": "^19.0.4",
61
+ "sinon-chai": "^4.0.0",
62
+ "typescript": "~5.7.3",
67
63
  "presentation-test-utilities": "^0.0.0"
68
64
  },
69
65
  "scripts": {
@@ -75,7 +71,7 @@
75
71
  "lint": "eslint ./src/**/*.ts",
76
72
  "test:dev": "mocha --enable-source-maps --config ./.mocharc.json",
77
73
  "test": "npm run test:dev",
78
- "extract-api": "extract-api --entry=presentation-hierarchies --apiReportFolder=./api --apiReportTempFolder=./api/temp --apiSummaryFolder=./api",
74
+ "extract-api": "betools extract-api --entry=presentation-hierarchies --apiReportFolder=./api --apiReportTempFolder=./api/temp --apiSummaryFolder=./api --includeUnexportedApis",
79
75
  "check-internal": "node ../../scripts/checkInternal.js --apiSummary ./api/presentation-hierarchies.api.md",
80
76
  "update-extractions": "node ../../scripts/updateExtractions.js --targets=./README.md,./learning",
81
77
  "check-extractions": "node ../../scripts/updateExtractions.js --targets=./README.md,./learning --check",