@itwin/presentation-hierarchies 0.3.0 → 0.4.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 (125) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +4 -4
  3. package/lib/cjs/hierarchies/HierarchyDefinition.js +2 -2
  4. package/lib/cjs/hierarchies/HierarchyDefinition.js.map +1 -1
  5. package/lib/cjs/hierarchies/HierarchyNode.d.ts +3 -3
  6. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
  7. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
  8. package/lib/cjs/hierarchies/HierarchyProvider.d.ts +11 -1
  9. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
  10. package/lib/cjs/hierarchies/HierarchyProvider.js +33 -19
  11. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
  12. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  13. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.js +33 -13
  14. package/lib/cjs/hierarchies/LimitingECSqlQueryExecutor.js.map +1 -1
  15. package/lib/cjs/hierarchies/Logging.js +2 -3
  16. package/lib/cjs/hierarchies/Logging.js.map +1 -1
  17. package/lib/cjs/hierarchies/NodeSelectQueryFactory.d.ts +14 -2
  18. package/lib/cjs/hierarchies/NodeSelectQueryFactory.d.ts.map +1 -1
  19. package/lib/cjs/hierarchies/NodeSelectQueryFactory.js +7 -7
  20. package/lib/cjs/hierarchies/NodeSelectQueryFactory.js.map +1 -1
  21. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.d.ts.map +1 -1
  22. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.js +3 -3
  23. package/lib/cjs/hierarchies/internal/ChildNodeObservablesCache.js.map +1 -1
  24. package/lib/cjs/hierarchies/internal/Common.d.ts +25 -5
  25. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
  26. package/lib/cjs/hierarchies/internal/Common.js +41 -21
  27. package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
  28. package/lib/cjs/hierarchies/internal/EachValueFrom.js +1 -2
  29. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -1
  30. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts +5 -4
  31. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -1
  32. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js +29 -24
  33. package/lib/cjs/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -1
  34. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts +1 -3
  35. package/lib/cjs/hierarchies/internal/LoggingUtils.d.ts.map +1 -1
  36. package/lib/cjs/hierarchies/internal/LoggingUtils.js +2 -21
  37. package/lib/cjs/hierarchies/internal/LoggingUtils.js.map +1 -1
  38. package/lib/cjs/hierarchies/internal/TreeNodesReader.js +2 -3
  39. package/lib/cjs/hierarchies/internal/TreeNodesReader.js.map +1 -1
  40. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.d.ts.map +1 -1
  41. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.js +3 -3
  42. package/lib/cjs/hierarchies/internal/operators/DetermineChildren.js.map +1 -1
  43. package/lib/cjs/hierarchies/internal/operators/Grouping.d.ts.map +1 -1
  44. package/lib/cjs/hierarchies/internal/operators/Grouping.js +13 -12
  45. package/lib/cjs/hierarchies/internal/operators/Grouping.js.map +1 -1
  46. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.d.ts.map +1 -1
  47. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.js +3 -3
  48. package/lib/cjs/hierarchies/internal/operators/HideIfNoChildren.js.map +1 -1
  49. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.d.ts.map +1 -1
  50. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.js +3 -3
  51. package/lib/cjs/hierarchies/internal/operators/HideNodesInHierarchy.js.map +1 -1
  52. package/lib/cjs/hierarchies/internal/operators/Partition.js +1 -2
  53. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -1
  54. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  55. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js +2 -3
  56. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.js.map +1 -1
  57. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  58. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js +1 -2
  59. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.js.map +1 -1
  60. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js +1 -2
  61. package/lib/cjs/hierarchies/internal/operators/ShareReplayWithErrors.js.map +1 -1
  62. package/lib/cjs/hierarchies/internal/operators/Sorting.js +1 -2
  63. package/lib/cjs/hierarchies/internal/operators/Sorting.js.map +1 -1
  64. package/lib/cjs/hierarchies/internal/operators/TapOnce.js +1 -2
  65. package/lib/cjs/hierarchies/internal/operators/TapOnce.js.map +1 -1
  66. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.js +1 -2
  67. package/lib/cjs/hierarchies/internal/operators/grouping/AutoExpand.js.map +1 -1
  68. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.js +3 -4
  69. package/lib/cjs/hierarchies/internal/operators/grouping/BaseClassGrouping.js.map +1 -1
  70. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.js +1 -2
  71. package/lib/cjs/hierarchies/internal/operators/grouping/ClassGrouping.js.map +1 -1
  72. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.js +1 -2
  73. package/lib/cjs/hierarchies/internal/operators/grouping/GroupHiding.js.map +1 -1
  74. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.js +1 -2
  75. package/lib/cjs/hierarchies/internal/operators/grouping/LabelGrouping.js.map +1 -1
  76. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.js +7 -8
  77. package/lib/cjs/hierarchies/internal/operators/grouping/PropertiesGrouping.js.map +1 -1
  78. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.js +1 -2
  79. package/lib/cjs/hierarchies/internal/operators/grouping/Shared.js.map +1 -1
  80. package/lib/esm/hierarchies/HierarchyNode.d.ts +3 -3
  81. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
  82. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
  83. package/lib/esm/hierarchies/HierarchyProvider.d.ts +11 -1
  84. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
  85. package/lib/esm/hierarchies/HierarchyProvider.js +34 -19
  86. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
  87. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  88. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.js +35 -14
  89. package/lib/esm/hierarchies/LimitingECSqlQueryExecutor.js.map +1 -1
  90. package/lib/esm/hierarchies/NodeSelectQueryFactory.d.ts +14 -2
  91. package/lib/esm/hierarchies/NodeSelectQueryFactory.d.ts.map +1 -1
  92. package/lib/esm/hierarchies/NodeSelectQueryFactory.js +5 -5
  93. package/lib/esm/hierarchies/NodeSelectQueryFactory.js.map +1 -1
  94. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.d.ts.map +1 -1
  95. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.js +3 -3
  96. package/lib/esm/hierarchies/internal/ChildNodeObservablesCache.js.map +1 -1
  97. package/lib/esm/hierarchies/internal/Common.d.ts +25 -5
  98. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
  99. package/lib/esm/hierarchies/internal/Common.js +35 -15
  100. package/lib/esm/hierarchies/internal/Common.js.map +1 -1
  101. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts +5 -4
  102. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.d.ts.map +1 -1
  103. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js +27 -22
  104. package/lib/esm/hierarchies/internal/FilteringHierarchyDefinition.js.map +1 -1
  105. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts +1 -3
  106. package/lib/esm/hierarchies/internal/LoggingUtils.d.ts.map +1 -1
  107. package/lib/esm/hierarchies/internal/LoggingUtils.js +0 -17
  108. package/lib/esm/hierarchies/internal/LoggingUtils.js.map +1 -1
  109. package/lib/esm/hierarchies/internal/operators/DetermineChildren.d.ts.map +1 -1
  110. package/lib/esm/hierarchies/internal/operators/DetermineChildren.js +2 -2
  111. package/lib/esm/hierarchies/internal/operators/DetermineChildren.js.map +1 -1
  112. package/lib/esm/hierarchies/internal/operators/Grouping.d.ts.map +1 -1
  113. package/lib/esm/hierarchies/internal/operators/Grouping.js +11 -10
  114. package/lib/esm/hierarchies/internal/operators/Grouping.js.map +1 -1
  115. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.d.ts.map +1 -1
  116. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.js +2 -2
  117. package/lib/esm/hierarchies/internal/operators/HideIfNoChildren.js.map +1 -1
  118. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.d.ts.map +1 -1
  119. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.js +2 -2
  120. package/lib/esm/hierarchies/internal/operators/HideNodesInHierarchy.js.map +1 -1
  121. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  122. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  123. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.js +2 -2
  124. package/lib/esm/hierarchies/internal/operators/grouping/PropertiesGrouping.js.map +1 -1
  125. package/package.json +11 -11
@@ -4,7 +4,8 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.applyECInstanceIdsFilter = exports.ECSQL_COLUMN_NAME_HasFilterTargetAncestor = exports.ECSQL_COLUMN_NAME_IsFilterTarget = exports.ECSQL_COLUMN_NAME_FilteredChildrenPaths = exports.FilteringHierarchyDefinition = void 0;
7
+ exports.ECSQL_COLUMN_NAME_HasFilterTargetAncestor = exports.ECSQL_COLUMN_NAME_IsFilterTarget = exports.ECSQL_COLUMN_NAME_FilteredChildrenPaths = exports.FilteringHierarchyDefinition = void 0;
8
+ exports.applyECInstanceIdsFilter = applyECInstanceIdsFilter;
8
9
  const HierarchyDefinition_1 = require("../HierarchyDefinition");
9
10
  const HierarchyNode_1 = require("../HierarchyNode");
10
11
  const HierarchyNodeIdentifier_1 = require("../HierarchyNodeIdentifier");
@@ -35,7 +36,8 @@ class FilteringHierarchyDefinition {
35
36
  if (
36
37
  // instance nodes get the auto-expand flag in `parseNode`, but grouping ones need to be handled during post-processing
37
38
  HierarchyNode_1.HierarchyNode.isClassGroupingNode(node) &&
38
- node.children.some((child) => child.filtering && (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths))) {
39
+ node.children.some((child) => child.filtering &&
40
+ (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths?.some((path) => "path" in path && path.options?.autoExpand)))) {
39
41
  return Object.assign(processedNode, { autoExpand: true });
40
42
  }
41
43
  return processedNode;
@@ -67,11 +69,11 @@ class FilteringHierarchyDefinition {
67
69
  return false;
68
70
  }
69
71
  return id.key === definition.node.key;
70
- }, this._classHierarchy, (def, matchingFilters, isFilterTarget) => {
72
+ }, this._classHierarchy, (def, matchingFilters) => {
71
73
  const filteredChildrenIdentifierPaths = matchingFilters.reduce((r, c) => [...r, ...c.childrenIdentifierPaths], new Array());
72
74
  return {
73
75
  ...def,
74
- node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, isFilterTarget, !!hasFilterTargetAncestor),
76
+ node: applyFilterAttributes(def.node, filteredChildrenIdentifierPaths, matchingFilters.some((mc) => mc.isFilterTarget), !!hasFilterTargetAncestor),
75
77
  };
76
78
  });
77
79
  }
@@ -81,7 +83,7 @@ class FilteringHierarchyDefinition {
81
83
  return false;
82
84
  }
83
85
  return this._classHierarchy.classDerivesFrom(id.className, definition.fullClassName);
84
- }, this._classHierarchy, (def, matchingFilters, isFilterTarget) => applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor));
86
+ }, this._classHierarchy, (def, matchingFilters) => applyECInstanceIdsFilter(def, matchingFilters, !!isDirectParentFilterTarget, !!hasFilterTargetAncestor));
85
87
  }
86
88
  if (matchedDefinition) {
87
89
  filteredDefinitions.push(matchedDefinition);
@@ -103,42 +105,44 @@ class FilteringHierarchyDefinition {
103
105
  exports.FilteringHierarchyDefinition = FilteringHierarchyDefinition;
104
106
  async function matchFilters(definition, filteringProps, predicate, classHierarchy, matchedDefinitionProcessor) {
105
107
  const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;
106
- let isFilterTarget = false;
107
108
  const matchingFilters = [];
108
- for (const path of filteredNodePaths) {
109
+ for (const filteredNodePath of filteredNodePaths) {
110
+ const { path, options } = "path" in filteredNodePath ? filteredNodePath : { path: filteredNodePath, options: undefined };
109
111
  if (path.length === 0) {
110
112
  continue;
111
113
  }
112
114
  const nodeId = path[0];
113
115
  if (await predicate(nodeId)) {
114
- let childrenIdentifierPaths = await findChildrenIdentifierPaths(matchingFilters, nodeId, classHierarchy);
115
- if (!childrenIdentifierPaths) {
116
- childrenIdentifierPaths = [];
117
- matchingFilters.push({
116
+ let entry = await findMatchingFilterEntry(matchingFilters, nodeId, classHierarchy);
117
+ if (!entry) {
118
+ entry = {
118
119
  // ideally, `predicate` would act as a type guard to guarantee that `id` is `TIdentifier`, but at the moment
119
120
  // async type guards aren't supported
120
121
  id: nodeId,
121
- childrenIdentifierPaths,
122
- });
122
+ childrenIdentifierPaths: [],
123
+ isFilterTarget: false,
124
+ };
125
+ matchingFilters.push(entry);
123
126
  }
124
127
  const remainingPath = path.slice(1);
125
128
  if (remainingPath.length > 0) {
126
- childrenIdentifierPaths.push(remainingPath);
129
+ const remainingPathWithOptions = options ? { path: remainingPath, options } : remainingPath;
130
+ entry.childrenIdentifierPaths.push(remainingPathWithOptions);
127
131
  }
128
132
  else {
129
- isFilterTarget = true;
133
+ entry.isFilterTarget = true;
130
134
  }
131
135
  }
132
136
  }
133
137
  if (isDirectParentFilterTarget || matchingFilters.length > 0) {
134
- return matchedDefinitionProcessor(definition, matchingFilters, isFilterTarget);
138
+ return matchedDefinitionProcessor(definition, matchingFilters);
135
139
  }
136
140
  return undefined;
137
141
  }
138
- async function findChildrenIdentifierPaths(filters, nodeId, classHierarchy) {
142
+ async function findMatchingFilterEntry(filters, nodeId, classHierarchy) {
139
143
  for (const filter of filters) {
140
144
  if (await identifiersEqual(filter.id, nodeId, classHierarchy)) {
141
- return filter.childrenIdentifierPaths;
145
+ return filter;
142
146
  }
143
147
  }
144
148
  return undefined;
@@ -153,7 +157,9 @@ async function identifiersEqual(lhs, rhs, classHierarchy) {
153
157
  return HierarchyNodeIdentifier_1.HierarchyNodeIdentifier.equal(lhs, rhs);
154
158
  }
155
159
  function applyFilterAttributes(node, filteredChildrenIdentifierPaths, isFilterTarget, hasFilterTargetAncestor) {
156
- const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((path) => !!path.length);
160
+ const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((childPath) => {
161
+ return "path" in childPath && childPath.path.length && childPath.options?.autoExpand;
162
+ });
157
163
  const result = { ...node };
158
164
  if (shouldAutoExpand) {
159
165
  result.autoExpand = true;
@@ -177,7 +183,7 @@ exports.ECSQL_COLUMN_NAME_IsFilterTarget = "IsFilterTarget";
177
183
  // eslint-disable-next-line @typescript-eslint/naming-convention
178
184
  exports.ECSQL_COLUMN_NAME_HasFilterTargetAncestor = "HasFilterTargetAncestor";
179
185
  /** @internal */
180
- function applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, isParentFilterTarget, hasFilterTargetAncestor) {
186
+ function applyECInstanceIdsFilter(def, matchingFilters, isParentFilterTarget, hasFilterTargetAncestor) {
181
187
  if (matchingFilters.length === 0) {
182
188
  return def;
183
189
  }
@@ -189,16 +195,16 @@ function applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, isParent
189
195
  ...(def.query.ctes ?? []),
190
196
  // 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),
191
197
  // so using UNION as a workaround
192
- `FilteringInfo(ECInstanceId, FilteredChildrenPaths) AS (
198
+ `FilteringInfo(ECInstanceId, IsFilterTarget, FilteredChildrenPaths) AS (
193
199
  ${matchingFilters
194
- .map(({ id: key, childrenIdentifierPaths }) => `VALUES (${key.id}, '${JSON.stringify(childrenIdentifierPaths)}')`)
200
+ .map(({ id: key, isFilterTarget, childrenIdentifierPaths }) => `VALUES (${key.id}, CAST(${isFilterTarget ? "1" : "0"} AS BOOLEAN), '${JSON.stringify(childrenIdentifierPaths)}')`)
195
201
  .join(" UNION ALL ")}
196
202
  )`,
197
203
  ],
198
204
  ecsql: `
199
205
  SELECT
200
206
  [q].*,
201
- ${isFilterTarget ? "1" : "0"} AS [${exports.ECSQL_COLUMN_NAME_IsFilterTarget}],
207
+ [f].[IsFilterTarget] AS [${exports.ECSQL_COLUMN_NAME_IsFilterTarget}],
202
208
  ${hasFilterTargetAncestor || isParentFilterTarget ? "1" : "0"} AS [${exports.ECSQL_COLUMN_NAME_HasFilterTargetAncestor}],
203
209
  [f].[FilteredChildrenPaths] AS [${exports.ECSQL_COLUMN_NAME_FilteredChildrenPaths}]
204
210
  FROM (
@@ -209,5 +215,4 @@ function applyECInstanceIdsFilter(def, matchingFilters, isFilterTarget, isParent
209
215
  },
210
216
  };
211
217
  }
212
- exports.applyECInstanceIdsFilter = applyECInstanceIdsFilter;
213
218
  //# sourceMappingURL=FilteringHierarchyDefinition.js.map
@@ -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 { 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 this._classHierarchy,\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 this._classHierarchy,\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 classHierarchy: ECClassHierarchyInspector,\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 = await findChildrenIdentifierPaths(matchingFilters, nodeId, classHierarchy);\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\nasync function findChildrenIdentifierPaths<TIdentifier extends HierarchyNodeIdentifier>(\n filters: Array<{ id: TIdentifier; childrenIdentifierPaths: HierarchyNodeIdentifiersPath[] }>,\n nodeId: TIdentifier,\n classHierarchy: ECClassHierarchyInspector,\n) {\n for (const filter of filters) {\n if (await identifiersEqual(filter.id, nodeId, classHierarchy)) {\n return filter.childrenIdentifierPaths;\n }\n }\n return undefined;\n}\n\nasync function identifiersEqual<TIdentifier extends HierarchyNodeIdentifier>(lhs: TIdentifier, rhs: TIdentifier, classHierarchy: ECClassHierarchyInspector) {\n if (HierarchyNodeIdentifier.isInstanceNodeIdentifier(lhs) && HierarchyNodeIdentifier.isInstanceNodeIdentifier(rhs)) {\n return (\n lhs.id === rhs.id &&\n (lhs.className === rhs.className ||\n (await classHierarchy.classDerivesFrom(lhs.className, rhs.className)) ||\n (await classHierarchy.classDerivesFrom(rhs.className, lhs.className)))\n );\n }\n return HierarchyNodeIdentifier.equal(lhs, rhs);\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
+ {"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 { HierarchyFilteringPath } from \"../HierarchyProvider\";\nimport { defaultNodesParser } from \"./TreeNodesReader\";\n\n/** @internal */\nexport interface FilteringQueryBuilderProps {\n classHierarchy: ECClassHierarchyInspector;\n source: HierarchyDefinition;\n nodeIdentifierPaths: HierarchyFilteringPath[];\n}\n\n/** @internal */\nexport class FilteringHierarchyDefinition implements HierarchyDefinition {\n private _classHierarchy: ECClassHierarchyInspector;\n private _source: HierarchyDefinition;\n private _nodeIdentifierPaths: HierarchyFilteringPath[];\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) =>\n child.filtering &&\n (child.filtering.isFilterTarget || child.filtering.filteredChildrenIdentifierPaths?.some((path) => \"path\" in path && path.options?.autoExpand)),\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 this._classHierarchy,\n (def, matchingFilters) => {\n const filteredChildrenIdentifierPaths = matchingFilters.reduce(\n (r, c) => [...r, ...c.childrenIdentifierPaths],\n new Array<HierarchyFilteringPath>(),\n );\n return {\n ...def,\n node: applyFilterAttributes(\n def.node,\n filteredChildrenIdentifierPaths,\n matchingFilters.some((mc) => mc.isFilterTarget),\n !!hasFilterTargetAncestor,\n ),\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 this._classHierarchy,\n (def, matchingFilters) => applyECInstanceIdsFilter(def, matchingFilters, !!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: HierarchyFilteringPath[]; isDirectParentFilterTarget?: boolean },\n predicate: (id: HierarchyNodeIdentifier) => Promise<boolean>,\n classHierarchy: ECClassHierarchyInspector,\n matchedDefinitionProcessor: (\n def: TDefinition,\n matchingFilters: Array<{ id: TIdentifier; isFilterTarget: boolean; childrenIdentifierPaths: HierarchyFilteringPath[] }>,\n ) => TDefinition,\n): Promise<TDefinition | undefined> {\n const { filteredNodePaths, isDirectParentFilterTarget } = filteringProps;\n const matchingFilters: Array<{ id: TIdentifier; isFilterTarget: boolean; childrenIdentifierPaths: HierarchyFilteringPath[] }> = [];\n for (const filteredNodePath of filteredNodePaths) {\n const { path, options } = \"path\" in filteredNodePath ? filteredNodePath : { path: filteredNodePath, options: undefined };\n\n if (path.length === 0) {\n continue;\n }\n const nodeId = path[0];\n if (await predicate(nodeId)) {\n let entry = await findMatchingFilterEntry(matchingFilters, nodeId, classHierarchy);\n if (!entry) {\n entry = {\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 isFilterTarget: false,\n };\n matchingFilters.push(entry);\n }\n const remainingPath = path.slice(1);\n if (remainingPath.length > 0) {\n const remainingPathWithOptions = options ? { path: remainingPath, options } : remainingPath;\n entry.childrenIdentifierPaths.push(remainingPathWithOptions);\n } else {\n entry.isFilterTarget = true;\n }\n }\n }\n if (isDirectParentFilterTarget || matchingFilters.length > 0) {\n return matchedDefinitionProcessor(definition, matchingFilters);\n }\n return undefined;\n}\n\nasync function findMatchingFilterEntry<TEntry extends { id: TIdentifier }, TIdentifier extends HierarchyNodeIdentifier>(\n filters: TEntry[],\n nodeId: TIdentifier,\n classHierarchy: ECClassHierarchyInspector,\n): Promise<TEntry | undefined> {\n for (const filter of filters) {\n if (await identifiersEqual(filter.id, nodeId, classHierarchy)) {\n return filter;\n }\n }\n return undefined;\n}\n\nasync function identifiersEqual<TIdentifier extends HierarchyNodeIdentifier>(lhs: TIdentifier, rhs: TIdentifier, classHierarchy: ECClassHierarchyInspector) {\n if (HierarchyNodeIdentifier.isInstanceNodeIdentifier(lhs) && HierarchyNodeIdentifier.isInstanceNodeIdentifier(rhs)) {\n return (\n lhs.id === rhs.id &&\n (lhs.className === rhs.className ||\n (await classHierarchy.classDerivesFrom(lhs.className, rhs.className)) ||\n (await classHierarchy.classDerivesFrom(rhs.className, lhs.className)))\n );\n }\n return HierarchyNodeIdentifier.equal(lhs, rhs);\n}\n\nfunction applyFilterAttributes<TNode extends ParsedHierarchyNode>(\n node: TNode,\n filteredChildrenIdentifierPaths: HierarchyFilteringPath[] | undefined,\n isFilterTarget: boolean,\n hasFilterTargetAncestor: boolean,\n): TNode {\n const shouldAutoExpand = !!filteredChildrenIdentifierPaths?.some((childPath) => {\n return \"path\" in childPath && childPath.path.length && childPath.options?.autoExpand;\n });\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; isFilterTarget: boolean; childrenIdentifierPaths: HierarchyFilteringPath[] }>,\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, IsFilterTarget, FilteredChildrenPaths) AS (\n ${matchingFilters\n .map(\n ({ id: key, isFilterTarget, childrenIdentifierPaths }) =>\n `VALUES (${key.id}, CAST(${isFilterTarget ? \"1\" : \"0\"} AS BOOLEAN), '${JSON.stringify(childrenIdentifierPaths)}')`,\n )\n .join(\" UNION ALL \")}\n )`,\n ],\n ecsql: `\n SELECT\n [q].*,\n [f].[IsFilterTarget] 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,4 @@
1
- import { ECSqlQueryDef, LogLevel } from "@itwin/presentation-shared";
1
+ import { LogLevel } from "@itwin/presentation-shared";
2
2
  /** @internal */
3
3
  export interface LogMessageProps<TMessageArg = void> {
4
4
  category: string;
@@ -9,6 +9,4 @@ export interface LogMessageProps<TMessageArg = void> {
9
9
  export declare function doLog(props: LogMessageProps): void;
10
10
  /** @internal */
11
11
  export declare function log<TMessageArg>(props: LogMessageProps<TMessageArg>): import("rxjs").MonoTypeOperatorFunction<TMessageArg>;
12
- /** @internal */
13
- export declare function createQueryLogMessage(query: ECSqlQueryDef): string;
14
12
  //# sourceMappingURL=LoggingUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoggingUtils.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/LoggingUtils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAW,QAAQ,EAAkB,MAAM,4BAA4B,CAAC;AAG9F,gBAAgB;AAChB,MAAM,WAAW,eAAe,CAAC,WAAW,GAAG,IAAI;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;CACvC;AAED,gBAAgB;AAChB,wBAAgB,KAAK,CAAC,KAAK,EAAE,eAAe,QAQ3C;AAeD,gBAAgB;AAChB,wBAAgB,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,wDAEnE;AAED,gBAAgB;AAEhB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAalE"}
1
+ {"version":3,"file":"LoggingUtils.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/internal/LoggingUtils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAW,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG/D,gBAAgB;AAChB,MAAM,WAAW,eAAe,CAAC,WAAW,GAAG,IAAI;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;CACvC;AAED,gBAAgB;AAChB,wBAAgB,KAAK,CAAC,KAAK,EAAE,eAAe,QAQ3C;AAeD,gBAAgB;AAChB,wBAAgB,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,wDAEnE"}
@@ -4,9 +4,9 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createQueryLogMessage = exports.log = exports.doLog = void 0;
7
+ exports.doLog = doLog;
8
+ exports.log = log;
8
9
  const rxjs_1 = require("rxjs");
9
- const presentation_shared_1 = require("@itwin/presentation-shared");
10
10
  const Logging_1 = require("../Logging");
11
11
  /** @internal */
12
12
  function doLog(props) {
@@ -18,7 +18,6 @@ function doLog(props) {
18
18
  const logFunc = getLogFunc(logger, severity);
19
19
  logFunc(props.category, props.message());
20
20
  }
21
- exports.doLog = doLog;
22
21
  function getLogFunc(logger, severity) {
23
22
  switch (severity) {
24
23
  case "error":
@@ -35,22 +34,4 @@ function getLogFunc(logger, severity) {
35
34
  function log(props) {
36
35
  return (0, rxjs_1.tap)((n) => doLog({ ...props, message: () => props.message(n) }));
37
36
  }
38
- exports.log = log;
39
- /** @internal */
40
- // istanbul ignore next
41
- function createQueryLogMessage(query) {
42
- const ctes = query.ctes?.map((cte) => ` ${(0, presentation_shared_1.trimWhitespace)(cte)}`).join(", \n");
43
- const bindings = query.bindings?.map((b) => JSON.stringify(b.value)).join(", ");
44
- let output = "{\n";
45
- if (ctes) {
46
- output += ` ctes: [ \n${ctes} \n], \n`;
47
- }
48
- output += ` ecsql: ${(0, presentation_shared_1.trimWhitespace)(query.ecsql)}, \n`;
49
- if (bindings) {
50
- output += ` bindings: [${bindings}], \n`;
51
- }
52
- output += "}";
53
- return output;
54
- }
55
- exports.createQueryLogMessage = createQueryLogMessage;
56
37
  //# sourceMappingURL=LoggingUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoggingUtils.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/LoggingUtils.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,+BAA2B;AAC3B,oEAA8F;AAC9F,wCAAuC;AASvC,gBAAgB;AAChB,SAAgB,KAAK,CAAC,KAAsB;IAC1C,MAAM,MAAM,GAAG,IAAA,mBAAS,GAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC;AARD,sBAQC;AAED,SAAS,UAAU,CAAC,MAAe,EAAE,QAAkB;IACrD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,SAAgB,GAAG,CAAc,KAAmC;IAClE,OAAO,IAAA,UAAG,EAAc,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC;AAFD,kBAEC;AAED,gBAAgB;AAChB,uBAAuB;AACvB,SAAgB,qBAAqB,CAAC,KAAoB;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,IAAA,oCAAc,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,eAAe,IAAI,UAAU,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,YAAY,IAAA,oCAAc,EAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACxD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,gBAAgB,QAAQ,OAAO,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,CAAC;IACd,OAAO,MAAM,CAAC;AAChB,CAAC;AAbD,sDAaC","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 { tap } from \"rxjs\";\nimport { ECSqlQueryDef, ILogger, LogLevel, trimWhitespace } from \"@itwin/presentation-shared\";\nimport { getLogger } from \"../Logging\";\n\n/** @internal */\nexport interface LogMessageProps<TMessageArg = void> {\n category: string;\n severity?: LogLevel;\n message: (arg: TMessageArg) => string;\n}\n\n/** @internal */\nexport function doLog(props: LogMessageProps) {\n const logger = getLogger();\n const severity = props.severity ?? \"trace\";\n if (!logger.isEnabled(props.category, severity)) {\n return;\n }\n const logFunc = getLogFunc(logger, severity);\n logFunc(props.category, props.message());\n}\n\nfunction getLogFunc(logger: ILogger, severity: LogLevel) {\n switch (severity) {\n case \"error\":\n return logger.logError.bind(logger);\n case \"warning\":\n return logger.logWarning.bind(logger);\n case \"info\":\n return logger.logInfo.bind(logger);\n case \"trace\":\n return logger.logTrace.bind(logger);\n }\n}\n\n/** @internal */\nexport function log<TMessageArg>(props: LogMessageProps<TMessageArg>) {\n return tap<TMessageArg>((n) => doLog({ ...props, message: () => props.message(n) }));\n}\n\n/** @internal */\n// istanbul ignore next\nexport function createQueryLogMessage(query: ECSqlQueryDef): string {\n const ctes = query.ctes?.map((cte) => ` ${trimWhitespace(cte)}`).join(\", \\n\");\n const bindings = query.bindings?.map((b) => JSON.stringify(b.value)).join(\", \");\n let output = \"{\\n\";\n if (ctes) {\n output += ` ctes: [ \\n${ctes} \\n], \\n`;\n }\n output += ` ecsql: ${trimWhitespace(query.ecsql)}, \\n`;\n if (bindings) {\n output += ` bindings: [${bindings}], \\n`;\n }\n output += \"}\";\n return output;\n}\n"]}
1
+ {"version":3,"file":"LoggingUtils.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/LoggingUtils.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAchG,sBAQC;AAgBD,kBAEC;AAtCD,+BAA2B;AAE3B,wCAAuC;AASvC,gBAAgB;AAChB,SAAgB,KAAK,CAAC,KAAsB;IAC1C,MAAM,MAAM,GAAG,IAAA,mBAAS,GAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,MAAe,EAAE,QAAkB;IACrD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,SAAgB,GAAG,CAAc,KAAmC;IAClE,OAAO,IAAA,UAAG,EAAc,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,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 { tap } from \"rxjs\";\nimport { ILogger, LogLevel } from \"@itwin/presentation-shared\";\nimport { getLogger } from \"../Logging\";\n\n/** @internal */\nexport interface LogMessageProps<TMessageArg = void> {\n category: string;\n severity?: LogLevel;\n message: (arg: TMessageArg) => string;\n}\n\n/** @internal */\nexport function doLog(props: LogMessageProps) {\n const logger = getLogger();\n const severity = props.severity ?? \"trace\";\n if (!logger.isEnabled(props.category, severity)) {\n return;\n }\n const logFunc = getLogFunc(logger, severity);\n logFunc(props.category, props.message());\n}\n\nfunction getLogFunc(logger: ILogger, severity: LogLevel) {\n switch (severity) {\n case \"error\":\n return logger.logError.bind(logger);\n case \"warning\":\n return logger.logWarning.bind(logger);\n case \"info\":\n return logger.logInfo.bind(logger);\n case \"trace\":\n return logger.logTrace.bind(logger);\n }\n}\n\n/** @internal */\nexport function log<TMessageArg>(props: LogMessageProps<TMessageArg>) {\n return tap<TMessageArg>((n) => doLog({ ...props, message: () => props.message(n) }));\n}\n"]}
@@ -4,7 +4,8 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.defaultNodesParser = exports.readNodes = void 0;
7
+ exports.readNodes = readNodes;
8
+ exports.defaultNodesParser = defaultNodesParser;
8
9
  const rxjs_1 = require("rxjs");
9
10
  const presentation_shared_1 = require("@itwin/presentation-shared");
10
11
  const NodeSelectQueryFactory_1 = require("../NodeSelectQueryFactory");
@@ -18,7 +19,6 @@ function readNodes(props) {
18
19
  };
19
20
  return (0, rxjs_1.from)(queryExecutor.createQueryReader(query, config)).pipe((0, rxjs_1.map)(parser));
20
21
  }
21
- exports.readNodes = readNodes;
22
22
  /* eslint-enable @typescript-eslint/naming-convention */
23
23
  /** @internal */
24
24
  function defaultNodesParser(row) {
@@ -42,5 +42,4 @@ function defaultNodesParser(row) {
42
42
  ...(Object.keys(processingParams).length > 0 ? { processingParams } : undefined),
43
43
  };
44
44
  }
45
- exports.defaultNodesParser = defaultNodesParser;
46
45
  //# sourceMappingURL=TreeNodesReader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TreeNodesReader.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/TreeNodesReader.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,+BAA6C;AAE7C,oEAA+E;AAI/E,sEAAwE;AASxE,gBAAgB;AAChB,SAAgB,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,kBAAkB,CAAC;IACnD,MAAM,MAAM,GAAmE;QAC7E,SAAS,EAAE,oBAAoB;QAC/B,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjD,CAAC;IACF,OAAO,IAAA,WAAI,EAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,MAAM,CAAC,CAAC,CAAC;AAChF,CAAC;AARD,8BAQC;AAmBD,wDAAwD;AAExD,gBAAgB;AAChB,SAAgB,kBAAkB,CAAC,GAAkC;IACnE,MAAM,QAAQ,GAAG,GAAa,CAAC;IAC/B,MAAM,gBAAgB,GAA0C;QAC9D,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjF,CAAC;IACF,OAAO;QACL,8HAA8H;QAC9H,KAAK,EAAE,IAAA,wCAAkB,EAAC,QAAQ,CAAC,YAAY,CAAC;QAChD,GAAG,EAAE;YACH,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;SACnG;QACD,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5F,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjF,CAAC;AACJ,CAAC;AApBD,gDAoBC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { from, map, Observable } from \"rxjs\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ECSqlQueryDef, parseInstanceLabel } from \"@itwin/presentation-shared\";\nimport { NodeParser } from \"../HierarchyDefinition\";\nimport { InstanceHierarchyNodeProcessingParams, ParsedHierarchyNode, ParsedInstanceHierarchyNode } from \"../HierarchyNode\";\nimport { LimitingECSqlQueryExecutor } from \"../LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"../NodeSelectQueryFactory\";\n\ninterface ReadNodesProps {\n queryExecutor: LimitingECSqlQueryExecutor;\n query: ECSqlQueryDef;\n limit?: number | \"unbounded\";\n parser?: NodeParser;\n}\n\n/** @internal */\nexport function readNodes(props: ReadNodesProps): Observable<ParsedHierarchyNode> {\n const { queryExecutor, query, limit } = props;\n const parser = props?.parser ?? defaultNodesParser;\n const config: Parameters<LimitingECSqlQueryExecutor[\"createQueryReader\"]>[1] = {\n rowFormat: \"ECSqlPropertyNames\",\n ...(limit !== undefined ? { limit } : undefined),\n };\n return from(queryExecutor.createQueryReader(query, config)).pipe(map(parser));\n}\n\n/**\n * The interface should contain a member for each `NodeSelectClauseColumnNames` value.\n * @internal\n */\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface RowDef {\n [NodeSelectClauseColumnNames.FullClassName]: string;\n [NodeSelectClauseColumnNames.ECInstanceId]: Id64String;\n [NodeSelectClauseColumnNames.DisplayLabel]: string;\n [NodeSelectClauseColumnNames.HasChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideIfNoChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideNodeInHierarchy]?: boolean;\n [NodeSelectClauseColumnNames.Grouping]?: string;\n [NodeSelectClauseColumnNames.ExtendedData]?: string;\n [NodeSelectClauseColumnNames.AutoExpand]?: boolean;\n [NodeSelectClauseColumnNames.SupportsFiltering]?: boolean;\n}\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/** @internal */\nexport function defaultNodesParser(row: { [columnName: string]: any }): ParsedInstanceHierarchyNode {\n const typedRow = row as RowDef;\n const processingParams: InstanceHierarchyNodeProcessingParams = {\n ...(typedRow.HideIfNoChildren ? { hideIfNoChildren: true } : undefined),\n ...(typedRow.HideNodeInHierarchy ? { hideInHierarchy: true } : undefined),\n ...(typedRow.Grouping ? { grouping: JSON.parse(typedRow.Grouping) } : undefined),\n };\n return {\n // don't format the label here - we're going to do that at node pre-processing step to handle both - instance and custom nodes\n label: parseInstanceLabel(typedRow.DisplayLabel),\n key: {\n type: \"instances\",\n instanceKeys: [{ className: typedRow.FullClassName.replace(\":\", \".\"), id: typedRow.ECInstanceId }],\n },\n ...(typedRow.HasChildren !== undefined ? { children: !!typedRow.HasChildren } : undefined),\n ...(typedRow.AutoExpand ? { autoExpand: true } : undefined),\n ...(typedRow.SupportsFiltering ? { supportsFiltering: true } : undefined),\n ...(typedRow.ExtendedData ? { extendedData: JSON.parse(typedRow.ExtendedData) } : undefined),\n ...(Object.keys(processingParams).length > 0 ? { processingParams } : undefined),\n };\n}\n"]}
1
+ {"version":3,"file":"TreeNodesReader.js","sourceRoot":"","sources":["../../../../src/hierarchies/internal/TreeNodesReader.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAkBhG,8BAQC;AAsBD,gDAoBC;AAlED,+BAA6C;AAE7C,oEAA+E;AAI/E,sEAAwE;AASxE,gBAAgB;AAChB,SAAgB,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,kBAAkB,CAAC;IACnD,MAAM,MAAM,GAAmE;QAC7E,SAAS,EAAE,oBAAoB;QAC/B,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjD,CAAC;IACF,OAAO,IAAA,WAAI,EAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,MAAM,CAAC,CAAC,CAAC;AAChF,CAAC;AAmBD,wDAAwD;AAExD,gBAAgB;AAChB,SAAgB,kBAAkB,CAAC,GAAkC;IACnE,MAAM,QAAQ,GAAG,GAAa,CAAC;IAC/B,MAAM,gBAAgB,GAA0C;QAC9D,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjF,CAAC;IACF,OAAO;QACL,8HAA8H;QAC9H,KAAK,EAAE,IAAA,wCAAkB,EAAC,QAAQ,CAAC,YAAY,CAAC;QAChD,GAAG,EAAE;YACH,IAAI,EAAE,WAAW;YACjB,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;SACnG;QACD,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5F,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;KACjF,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 { from, map, Observable } from \"rxjs\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ECSqlQueryDef, parseInstanceLabel } from \"@itwin/presentation-shared\";\nimport { NodeParser } from \"../HierarchyDefinition\";\nimport { InstanceHierarchyNodeProcessingParams, ParsedHierarchyNode, ParsedInstanceHierarchyNode } from \"../HierarchyNode\";\nimport { LimitingECSqlQueryExecutor } from \"../LimitingECSqlQueryExecutor\";\nimport { NodeSelectClauseColumnNames } from \"../NodeSelectQueryFactory\";\n\ninterface ReadNodesProps {\n queryExecutor: LimitingECSqlQueryExecutor;\n query: ECSqlQueryDef;\n limit?: number | \"unbounded\";\n parser?: NodeParser;\n}\n\n/** @internal */\nexport function readNodes(props: ReadNodesProps): Observable<ParsedHierarchyNode> {\n const { queryExecutor, query, limit } = props;\n const parser = props?.parser ?? defaultNodesParser;\n const config: Parameters<LimitingECSqlQueryExecutor[\"createQueryReader\"]>[1] = {\n rowFormat: \"ECSqlPropertyNames\",\n ...(limit !== undefined ? { limit } : undefined),\n };\n return from(queryExecutor.createQueryReader(query, config)).pipe(map(parser));\n}\n\n/**\n * The interface should contain a member for each `NodeSelectClauseColumnNames` value.\n * @internal\n */\n/* eslint-disable @typescript-eslint/naming-convention */\nexport interface RowDef {\n [NodeSelectClauseColumnNames.FullClassName]: string;\n [NodeSelectClauseColumnNames.ECInstanceId]: Id64String;\n [NodeSelectClauseColumnNames.DisplayLabel]: string;\n [NodeSelectClauseColumnNames.HasChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideIfNoChildren]?: boolean;\n [NodeSelectClauseColumnNames.HideNodeInHierarchy]?: boolean;\n [NodeSelectClauseColumnNames.Grouping]?: string;\n [NodeSelectClauseColumnNames.ExtendedData]?: string;\n [NodeSelectClauseColumnNames.AutoExpand]?: boolean;\n [NodeSelectClauseColumnNames.SupportsFiltering]?: boolean;\n}\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/** @internal */\nexport function defaultNodesParser(row: { [columnName: string]: any }): ParsedInstanceHierarchyNode {\n const typedRow = row as RowDef;\n const processingParams: InstanceHierarchyNodeProcessingParams = {\n ...(typedRow.HideIfNoChildren ? { hideIfNoChildren: true } : undefined),\n ...(typedRow.HideNodeInHierarchy ? { hideInHierarchy: true } : undefined),\n ...(typedRow.Grouping ? { grouping: JSON.parse(typedRow.Grouping) } : undefined),\n };\n return {\n // don't format the label here - we're going to do that at node pre-processing step to handle both - instance and custom nodes\n label: parseInstanceLabel(typedRow.DisplayLabel),\n key: {\n type: \"instances\",\n instanceKeys: [{ className: typedRow.FullClassName.replace(\":\", \".\"), id: typedRow.ECInstanceId }],\n },\n ...(typedRow.HasChildren !== undefined ? { children: !!typedRow.HasChildren } : undefined),\n ...(typedRow.AutoExpand ? { autoExpand: true } : undefined),\n ...(typedRow.SupportsFiltering ? { supportsFiltering: true } : undefined),\n ...(typedRow.ExtendedData ? { extendedData: JSON.parse(typedRow.ExtendedData) } : undefined),\n ...(Object.keys(processingParams).length > 0 ? { processingParams } : undefined),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"DetermineChildren.d.ts","sourceRoot":"","sources":["../../../../../src/hierarchies/internal/operators/DetermineChildren.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAM,MAAM,MAAM,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAAgD,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,UAAU,CAAC,OAAO,CAAC,WACrF,WAAW,sBAAsB,CAAC,KAAG,WAAW,sBAAsB,CAAC,CAmBhG"}
1
+ {"version":3,"file":"DetermineChildren.d.ts","sourceRoot":"","sources":["../../../../../src/hierarchies/internal/operators/DetermineChildren.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAAM,MAAM,MAAM,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAA4E,CAAC;AAE3G;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,UAAU,CAAC,OAAO,CAAC,WACrF,UAAU,CAAC,sBAAsB,CAAC,KAAG,UAAU,CAAC,sBAAsB,CAAC,CAmBhG"}
@@ -4,14 +4,15 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createDetermineChildrenOperator = exports.LOGGING_NAMESPACE = void 0;
7
+ exports.LOGGING_NAMESPACE = void 0;
8
+ exports.createDetermineChildrenOperator = createDetermineChildrenOperator;
8
9
  const rxjs_1 = require("rxjs");
9
10
  const Common_1 = require("../Common");
10
11
  const LoggingUtils_1 = require("../LoggingUtils");
11
12
  const ReleaseMainThread_1 = require("./ReleaseMainThread");
12
13
  const OPERATOR_NAME = "DetermineChildren";
13
14
  /** @internal */
14
- exports.LOGGING_NAMESPACE = (0, Common_1.createOperatorLoggingNamespace)(OPERATOR_NAME);
15
+ exports.LOGGING_NAMESPACE = (0, Common_1.createOperatorLoggingNamespace)(OPERATOR_NAME, Common_1.LOGGING_NAMESPACE_INTERNAL);
15
16
  /**
16
17
  * Ensures all input nodes have their children determined.
17
18
  *
@@ -30,5 +31,4 @@ function createDetermineChildrenOperator(hasNodes) {
30
31
  }), (0, LoggingUtils_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `out: ${(0, Common_1.createNodeIdentifierForLogging)(n)}` }));
31
32
  };
32
33
  }
33
- exports.createDetermineChildrenOperator = createDetermineChildrenOperator;
34
34
  //# sourceMappingURL=DetermineChildren.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DetermineChildren.js","sourceRoot":"","sources":["../../../../../src/hierarchies/internal/operators/DetermineChildren.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,+BAAsD;AAEtD,sCAA2F;AAC3F,kDAAsC;AACtC,2DAAoE;AAEpE,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAC1C,gBAAgB;AACH,QAAA,iBAAiB,GAAG,IAAA,uCAA8B,EAAC,aAAa,CAAC,CAAC;AAE/E;;;;GAIG;AACH,SAAgB,+BAA+B,CAAC,QAA+D;IAC7G,OAAO,UAAU,KAAyC;QACxD,OAAO,KAAK,CAAC,IAAI,CACf,IAAA,kBAAG,EAAC,EAAE,QAAQ,EAAE,yBAAiB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAA,uCAA8B,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAC3H,IAAA,iDAA6B,EAAC,GAAG,CAAC,EAClC,IAAA,gBAAS,EAAC,CAAC,CAAyB,EAAsC,EAAE;YAC1E,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,IAAA,SAAE,EAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACrB,IAAA,kBAAG,EAAC;gBACF,QAAQ,EAAE,yBAAiB;gBAC3B,OAAO,EAAE,0BAA0B,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,IAAA,uCAA8B,EAAC,CAAC,CAAC,0BAA0B,eAAe,EAAE;aACzI,CAAC,EACF,IAAA,UAAG,EAAC,CAAC,eAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,CAC1E,CAAC;QACJ,CAAC,CAAC,EACF,IAAA,kBAAG,EAAC,EAAE,QAAQ,EAAE,yBAAiB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,IAAA,uCAA8B,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC7H,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AApBD,0EAoBC","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 { concatMap, map, Observable, of } from \"rxjs\";\nimport { ProcessedHierarchyNode } from \"../../HierarchyNode\";\nimport { createNodeIdentifierForLogging, createOperatorLoggingNamespace } from \"../Common\";\nimport { log } from \"../LoggingUtils\";\nimport { releaseMainThreadOnItemsCount } from \"./ReleaseMainThread\";\n\nconst OPERATOR_NAME = \"DetermineChildren\";\n/** @internal */\nexport const LOGGING_NAMESPACE = createOperatorLoggingNamespace(OPERATOR_NAME);\n\n/**\n * Ensures all input nodes have their children determined.\n *\n * @internal\n */\nexport function createDetermineChildrenOperator(hasNodes: (node: ProcessedHierarchyNode) => Observable<boolean>) {\n return function (nodes: Observable<ProcessedHierarchyNode>): Observable<ProcessedHierarchyNode> {\n return nodes.pipe(\n log({ category: LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `in: ${createNodeIdentifierForLogging(n)}` }),\n releaseMainThreadOnItemsCount(200),\n concatMap((n: ProcessedHierarchyNode): Observable<ProcessedHierarchyNode> => {\n if (n.children !== undefined) {\n return of(n);\n }\n return hasNodes(n).pipe(\n log({\n category: LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ (hasChildrenFlag) => `${createNodeIdentifierForLogging(n)}: determined children: ${hasChildrenFlag}`,\n }),\n map((hasChildrenFlag) => Object.assign(n, { children: hasChildrenFlag })),\n );\n }),\n log({ category: LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `out: ${createNodeIdentifierForLogging(n)}` }),\n );\n };\n}\n"]}
1
+ {"version":3,"file":"DetermineChildren.js","sourceRoot":"","sources":["../../../../../src/hierarchies/internal/operators/DetermineChildren.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAiBhG,0EAoBC;AAnCD,+BAAsD;AAEtD,sCAAuH;AACvH,kDAAsC;AACtC,2DAAoE;AAEpE,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAC1C,gBAAgB;AACH,QAAA,iBAAiB,GAAG,IAAA,uCAA8B,EAAC,aAAa,EAAE,mCAA0B,CAAC,CAAC;AAE3G;;;;GAIG;AACH,SAAgB,+BAA+B,CAAC,QAA+D;IAC7G,OAAO,UAAU,KAAyC;QACxD,OAAO,KAAK,CAAC,IAAI,CACf,IAAA,kBAAG,EAAC,EAAE,QAAQ,EAAE,yBAAiB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAA,uCAA8B,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAC3H,IAAA,iDAA6B,EAAC,GAAG,CAAC,EAClC,IAAA,gBAAS,EAAC,CAAC,CAAyB,EAAsC,EAAE;YAC1E,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,IAAA,SAAE,EAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CACrB,IAAA,kBAAG,EAAC;gBACF,QAAQ,EAAE,yBAAiB;gBAC3B,OAAO,EAAE,0BAA0B,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,GAAG,IAAA,uCAA8B,EAAC,CAAC,CAAC,0BAA0B,eAAe,EAAE;aACzI,CAAC,EACF,IAAA,UAAG,EAAC,CAAC,eAAe,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,CAC1E,CAAC;QACJ,CAAC,CAAC,EACF,IAAA,kBAAG,EAAC,EAAE,QAAQ,EAAE,yBAAiB,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,IAAA,uCAA8B,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC7H,CAAC;IACJ,CAAC,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 { concatMap, map, Observable, of } from \"rxjs\";\nimport { ProcessedHierarchyNode } from \"../../HierarchyNode\";\nimport { createNodeIdentifierForLogging, createOperatorLoggingNamespace, LOGGING_NAMESPACE_INTERNAL } from \"../Common\";\nimport { log } from \"../LoggingUtils\";\nimport { releaseMainThreadOnItemsCount } from \"./ReleaseMainThread\";\n\nconst OPERATOR_NAME = \"DetermineChildren\";\n/** @internal */\nexport const LOGGING_NAMESPACE = createOperatorLoggingNamespace(OPERATOR_NAME, LOGGING_NAMESPACE_INTERNAL);\n\n/**\n * Ensures all input nodes have their children determined.\n *\n * @internal\n */\nexport function createDetermineChildrenOperator(hasNodes: (node: ProcessedHierarchyNode) => Observable<boolean>) {\n return function (nodes: Observable<ProcessedHierarchyNode>): Observable<ProcessedHierarchyNode> {\n return nodes.pipe(\n log({ category: LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `in: ${createNodeIdentifierForLogging(n)}` }),\n releaseMainThreadOnItemsCount(200),\n concatMap((n: ProcessedHierarchyNode): Observable<ProcessedHierarchyNode> => {\n if (n.children !== undefined) {\n return of(n);\n }\n return hasNodes(n).pipe(\n log({\n category: LOGGING_NAMESPACE,\n message: /* istanbul ignore next */ (hasChildrenFlag) => `${createNodeIdentifierForLogging(n)}: determined children: ${hasChildrenFlag}`,\n }),\n map((hasChildrenFlag) => Object.assign(n, { children: hasChildrenFlag })),\n );\n }),\n log({ category: LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `out: ${createNodeIdentifierForLogging(n)}` }),\n );\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Grouping.d.ts","sourceRoot":"","sources":["../../../../../src/hierarchies/internal/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,EAEL,mBAAmB,EACnB,8BAA8B,EAC9B,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EAAoC,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AAKrH,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAAgD,CAAC;AAG/E,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,WAAW,sBAAsB,CAAC,KAAG,WAAW,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/internal/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,EAEL,mBAAmB,EACnB,8BAA8B,EAC9B,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,qBAAqB,CAAC;AAa7B,OAAO,EAAoC,kCAAkC,EAAE,MAAM,+BAA+B,CAAC;AAKrH,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,QAAgD,CAAC;AAI/E,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"}
@@ -4,7 +4,9 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createGroupingHandlers = exports.createGroupingOperator = exports.LOGGING_NAMESPACE = void 0;
7
+ exports.LOGGING_NAMESPACE = void 0;
8
+ exports.createGroupingOperator = createGroupingOperator;
9
+ exports.createGroupingHandlers = createGroupingHandlers;
8
10
  const rxjs_1 = require("rxjs");
9
11
  const core_bentley_1 = require("@itwin/core-bentley");
10
12
  const HierarchyNode_1 = require("../../HierarchyNode");
@@ -21,13 +23,14 @@ const TapOnce_1 = require("./TapOnce");
21
23
  const OPERATOR_NAME = "Grouping";
22
24
  /** @internal */
23
25
  exports.LOGGING_NAMESPACE = (0, Common_1.createOperatorLoggingNamespace)(OPERATOR_NAME);
24
- const PERF_LOGGING_NAMESPACE = `${exports.LOGGING_NAMESPACE}.Performance`;
26
+ const LOGGING_NAMESPACE_PERFORMANCE = (0, Common_1.createOperatorLoggingNamespace)(OPERATOR_NAME, Common_1.LOGGING_NAMESPACE_PERFORMANCE);
27
+ const LOGGING_NAMESPACE_PERFORMANCE_INTERNAL = (0, Common_1.createOperatorLoggingNamespace)(OPERATOR_NAME, Common_1.LOGGING_NAMESPACE_PERFORMANCE_INTERNAL);
25
28
  /** @internal */
26
29
  function createGroupingOperator(imodelAccess, parentNode, valueFormatter, localizedStrings, onGroupingNodeCreated, groupingHandlers) {
27
30
  return function (nodes) {
28
31
  return nodes.pipe((0, LoggingUtils_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `in: ${(0, Common_1.createNodeIdentifierForLogging)(n)}` }), (0, TapOnce_1.tapOnce)(() => {
29
32
  (0, LoggingUtils_1.doLog)({
30
- category: PERF_LOGGING_NAMESPACE,
33
+ category: LOGGING_NAMESPACE_PERFORMANCE,
31
34
  message: /* istanbul ignore next */ () => `Starting grouping (parent: ${(0, Common_1.createNodeIdentifierForLogging)(parentNode)})`,
32
35
  });
33
36
  }), (0, rxjs_1.reduce)((resolvedNodes, node) => {
@@ -40,7 +43,7 @@ function createGroupingOperator(imodelAccess, parentNode, valueFormatter, locali
40
43
  return resolvedNodes;
41
44
  }, { instanceNodes: [], restNodes: [] }), (0, rxjs_1.tap)(({ instanceNodes, restNodes }) => {
42
45
  (0, LoggingUtils_1.doLog)({
43
- category: PERF_LOGGING_NAMESPACE,
46
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
44
47
  message: /* istanbul ignore next */ () => `Nodes partitioned. Got ${instanceNodes.length} instance nodes and ${restNodes.length} rest nodes.`,
45
48
  });
46
49
  }), (0, rxjs_1.mergeMap)((res) => {
@@ -55,14 +58,13 @@ function createGroupingOperator(imodelAccess, parentNode, valueFormatter, locali
55
58
  : createGroupingHandlers(imodelAccess, parentNode, instanceNodes, valueFormatter, localizedStrings);
56
59
  return (0, rxjs_1.merge)(groupingHandlersObs.pipe((0, rxjs_1.toArray)(), (0, rxjs_1.mergeMap)((createdGroupingHandlers) => groupInstanceNodes(instanceNodes, restNodes.length, createdGroupingHandlers, parentNode, onGroupingNodeCreated)), (0, rxjs_1.finalize)(() => {
57
60
  (0, LoggingUtils_1.doLog)({
58
- category: PERF_LOGGING_NAMESPACE,
61
+ category: LOGGING_NAMESPACE_PERFORMANCE,
59
62
  message: /* istanbul ignore next */ () => `Grouping ${instanceNodes.length} nodes took ${timer.elapsedSeconds.toFixed(3)} s`,
60
63
  });
61
64
  })), (0, rxjs_1.from)(restNodes));
62
65
  }), (0, ReleaseMainThread_1.releaseMainThreadOnItemsCount)(500), (0, LoggingUtils_1.log)({ category: exports.LOGGING_NAMESPACE, message: /* istanbul ignore next */ (n) => `out: ${(0, Common_1.createNodeIdentifierForLogging)(n)}` }));
63
66
  };
64
67
  }
65
- exports.createGroupingOperator = createGroupingOperator;
66
68
  function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode, onGroupingNodeCreated) {
67
69
  if (groupingHandlers.length === 0) {
68
70
  return (0, rxjs_1.from)(nodes);
@@ -74,7 +76,7 @@ function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode,
74
76
  const timer = new core_bentley_1.StopWatch(undefined, true);
75
77
  const currentHandler = groupingHandlers[handlerIndex];
76
78
  return (0, rxjs_1.from)(currentHandler(curr?.ungrouped ?? nodes, curr?.grouped ?? [])).pipe((0, LoggingUtils_1.log)({
77
- category: PERF_LOGGING_NAMESPACE,
79
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
78
80
  message: /* istanbul ignore next */ () => `Grouping handler ${handlerIndex} exclusively took ${timer.elapsedSeconds.toFixed(3)} s.`,
79
81
  }), (0, rxjs_1.mergeMap)((result) => {
80
82
  if (result.grouped.length === 0) {
@@ -82,11 +84,11 @@ function groupInstanceNodes(nodes, extraSiblings, groupingHandlers, parentNode,
82
84
  }
83
85
  const groupingPostProcessingTimer = new core_bentley_1.StopWatch(undefined, true);
84
86
  return (0, rxjs_1.of)(result).pipe((0, rxjs_1.map)((r) => (0, GroupHiding_1.applyGroupHidingParams)(r, extraSiblings)), (0, rxjs_1.map)((r) => (0, AutoExpand_1.assignAutoExpand)(r)), (0, rxjs_1.map)((r) => ({ handlerIndex: handlerIndex + 1, result: { ...r, grouped: mergeInPlace(curr?.grouped, r.grouped) } })), (0, LoggingUtils_1.log)({
85
- category: PERF_LOGGING_NAMESPACE,
87
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
86
88
  message: /* istanbul ignore next */ () => `Post-processing grouping handler ${handlerIndex} exclusively took ${groupingPostProcessingTimer.elapsedSeconds.toFixed(3)} s.`,
87
89
  }), (0, rxjs_1.delay)(0));
88
90
  }), (0, LoggingUtils_1.log)({
89
- category: PERF_LOGGING_NAMESPACE,
91
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
90
92
  message: /* istanbul ignore next */ () => `Total time for grouping handler ${handlerIndex}: ${timer.elapsedSeconds.toFixed(3)} s.`,
91
93
  }));
92
94
  }), (0, rxjs_1.last)(), (0, rxjs_1.mergeMap)(({ result }) => {
@@ -126,19 +128,18 @@ function createGroupingHandlers(imodelAccess, parentNode, processedInstanceNodes
126
128
  : rxjs_1.EMPTY, groupingLevel < GroupingLevel.Label ? (0, rxjs_1.of)(async (allNodes) => (0, LabelGrouping_1.createLabelGroups)(allNodes)) : rxjs_1.EMPTY).pipe((0, rxjs_1.tap)({
127
129
  subscribe: () => {
128
130
  (0, LoggingUtils_1.doLog)({
129
- category: PERF_LOGGING_NAMESPACE,
131
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
130
132
  message: /* istanbul ignore next */ () => `Start creating grouping handlers`,
131
133
  });
132
134
  timer.start();
133
135
  },
134
136
  }), (0, rxjs_1.finalize)(() => {
135
137
  (0, LoggingUtils_1.doLog)({
136
- category: PERF_LOGGING_NAMESPACE,
138
+ category: LOGGING_NAMESPACE_PERFORMANCE_INTERNAL,
137
139
  message: /* istanbul ignore next */ () => `Creating grouping handlers took ${timer.elapsedSeconds.toFixed(3)} s`,
138
140
  });
139
141
  }));
140
142
  }
141
- exports.createGroupingHandlers = createGroupingHandlers;
142
143
  function getNodeGroupingLevel(node) {
143
144
  if (node && HierarchyNode_1.HierarchyNode.isClassGroupingNode(node)) {
144
145
  return GroupingLevel.Class;