@itwin/presentation-hierarchies 2.0.0-alpha.14 → 2.0.0-alpha.16

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 (199) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/README.md +12 -22
  3. package/lib/cjs/hierarchies/HierarchyMerge.d.ts +1 -1
  4. package/lib/cjs/hierarchies/HierarchyMerge.d.ts.map +1 -1
  5. package/lib/cjs/hierarchies/HierarchyMerge.js +1 -1
  6. package/lib/cjs/hierarchies/HierarchyMerge.js.map +1 -1
  7. package/lib/cjs/hierarchies/HierarchyNode.d.ts.map +1 -1
  8. package/lib/cjs/hierarchies/HierarchyNode.js.map +1 -1
  9. package/lib/cjs/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  10. package/lib/cjs/hierarchies/HierarchyNodeKey.js.map +1 -1
  11. package/lib/cjs/hierarchies/HierarchyProvider.d.ts.map +1 -1
  12. package/lib/cjs/hierarchies/HierarchyProvider.js +7 -3
  13. package/lib/cjs/hierarchies/HierarchyProvider.js.map +1 -1
  14. package/lib/cjs/hierarchies/HierarchySearch.d.ts.map +1 -1
  15. package/lib/cjs/hierarchies/HierarchySearch.js +19 -12
  16. package/lib/cjs/hierarchies/HierarchySearch.js.map +1 -1
  17. package/lib/cjs/hierarchies/Logging.js +1 -1
  18. package/lib/cjs/hierarchies/Logging.js.map +1 -1
  19. package/lib/cjs/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  20. package/lib/cjs/hierarchies/imodel/HierarchyCache.js +1 -4
  21. package/lib/cjs/hierarchies/imodel/HierarchyCache.js.map +1 -1
  22. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts +4 -2
  23. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  24. package/lib/cjs/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  25. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  26. package/lib/cjs/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  27. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts +20 -2
  28. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  29. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js +157 -85
  30. package/lib/cjs/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  31. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  32. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js +12 -9
  33. package/lib/cjs/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  34. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts +4 -3
  35. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  36. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js +44 -68
  37. package/lib/cjs/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  38. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  39. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
  40. package/lib/cjs/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  41. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
  42. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
  43. package/lib/cjs/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
  44. package/lib/cjs/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  45. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js +3 -5
  46. package/lib/cjs/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  47. package/lib/cjs/hierarchies/imodel/Utils.d.ts +1 -0
  48. package/lib/cjs/hierarchies/imodel/Utils.d.ts.map +1 -1
  49. package/lib/cjs/hierarchies/imodel/Utils.js +21 -7
  50. package/lib/cjs/hierarchies/imodel/Utils.js.map +1 -1
  51. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  52. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js +10 -4
  53. package/lib/cjs/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  54. package/lib/cjs/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  55. package/lib/cjs/hierarchies/imodel/operators/Grouping.js +32 -18
  56. package/lib/cjs/hierarchies/imodel/operators/Grouping.js.map +1 -1
  57. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  58. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js +31 -9
  59. package/lib/cjs/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  60. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  61. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js +30 -14
  62. package/lib/cjs/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  63. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  64. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +4 -6
  65. package/lib/cjs/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  66. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  67. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js +4 -9
  68. package/lib/cjs/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  69. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  70. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
  71. package/lib/cjs/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  72. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  73. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
  74. package/lib/cjs/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  75. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  76. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
  77. package/lib/cjs/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  78. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  79. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js +3 -1
  80. package/lib/cjs/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  81. package/lib/cjs/hierarchies/internal/Common.d.ts.map +1 -1
  82. package/lib/cjs/hierarchies/internal/Common.js +2 -2
  83. package/lib/cjs/hierarchies/internal/Common.js.map +1 -1
  84. package/lib/cjs/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  85. package/lib/cjs/hierarchies/internal/EachValueFrom.js +0 -2
  86. package/lib/cjs/hierarchies/internal/EachValueFrom.js.map +1 -1
  87. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  88. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
  89. package/lib/cjs/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  90. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  91. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js +1 -4
  92. package/lib/cjs/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  93. package/lib/cjs/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  94. package/lib/cjs/hierarchies/internal/operators/Partition.js.map +1 -1
  95. package/lib/cjs/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  96. package/lib/cjs/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  97. package/lib/cjs/presentation-hierarchies.d.ts +2 -4
  98. package/lib/cjs/presentation-hierarchies.d.ts.map +1 -1
  99. package/lib/cjs/presentation-hierarchies.js +1 -4
  100. package/lib/cjs/presentation-hierarchies.js.map +1 -1
  101. package/lib/esm/hierarchies/HierarchyMerge.d.ts +1 -1
  102. package/lib/esm/hierarchies/HierarchyMerge.d.ts.map +1 -1
  103. package/lib/esm/hierarchies/HierarchyMerge.js +1 -1
  104. package/lib/esm/hierarchies/HierarchyMerge.js.map +1 -1
  105. package/lib/esm/hierarchies/HierarchyNode.d.ts.map +1 -1
  106. package/lib/esm/hierarchies/HierarchyNode.js.map +1 -1
  107. package/lib/esm/hierarchies/HierarchyNodeKey.d.ts.map +1 -1
  108. package/lib/esm/hierarchies/HierarchyNodeKey.js.map +1 -1
  109. package/lib/esm/hierarchies/HierarchyProvider.d.ts.map +1 -1
  110. package/lib/esm/hierarchies/HierarchyProvider.js +7 -3
  111. package/lib/esm/hierarchies/HierarchyProvider.js.map +1 -1
  112. package/lib/esm/hierarchies/HierarchySearch.d.ts.map +1 -1
  113. package/lib/esm/hierarchies/HierarchySearch.js +19 -12
  114. package/lib/esm/hierarchies/HierarchySearch.js.map +1 -1
  115. package/lib/esm/hierarchies/Logging.js +1 -1
  116. package/lib/esm/hierarchies/Logging.js.map +1 -1
  117. package/lib/esm/hierarchies/imodel/HierarchyCache.d.ts.map +1 -1
  118. package/lib/esm/hierarchies/imodel/HierarchyCache.js +1 -4
  119. package/lib/esm/hierarchies/imodel/HierarchyCache.js.map +1 -1
  120. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts +4 -2
  121. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.d.ts.map +1 -1
  122. package/lib/esm/hierarchies/imodel/IModelHierarchyDefinition.js.map +1 -1
  123. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.d.ts.map +1 -1
  124. package/lib/esm/hierarchies/imodel/IModelHierarchyNode.js.map +1 -1
  125. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts +20 -2
  126. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.d.ts.map +1 -1
  127. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js +160 -88
  128. package/lib/esm/hierarchies/imodel/IModelHierarchyProvider.js.map +1 -1
  129. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.d.ts.map +1 -1
  130. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js +13 -10
  131. package/lib/esm/hierarchies/imodel/LimitingECSqlQueryExecutor.js.map +1 -1
  132. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts +4 -3
  133. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.d.ts.map +1 -1
  134. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js +45 -69
  135. package/lib/esm/hierarchies/imodel/NodeSelectQueryFactory.js.map +1 -1
  136. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.d.ts.map +1 -1
  137. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js +2 -1
  138. package/lib/esm/hierarchies/imodel/PredicateBasedHierarchyDefinition.js.map +1 -1
  139. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.d.ts.map +1 -1
  140. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js +11 -4
  141. package/lib/esm/hierarchies/imodel/SearchHierarchyDefinition.js.map +1 -1
  142. package/lib/esm/hierarchies/imodel/TreeNodesReader.d.ts.map +1 -1
  143. package/lib/esm/hierarchies/imodel/TreeNodesReader.js +3 -5
  144. package/lib/esm/hierarchies/imodel/TreeNodesReader.js.map +1 -1
  145. package/lib/esm/hierarchies/imodel/Utils.d.ts +1 -0
  146. package/lib/esm/hierarchies/imodel/Utils.d.ts.map +1 -1
  147. package/lib/esm/hierarchies/imodel/Utils.js +20 -7
  148. package/lib/esm/hierarchies/imodel/Utils.js.map +1 -1
  149. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.d.ts.map +1 -1
  150. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js +11 -5
  151. package/lib/esm/hierarchies/imodel/operators/DetermineChildren.js.map +1 -1
  152. package/lib/esm/hierarchies/imodel/operators/Grouping.d.ts.map +1 -1
  153. package/lib/esm/hierarchies/imodel/operators/Grouping.js +33 -19
  154. package/lib/esm/hierarchies/imodel/operators/Grouping.js.map +1 -1
  155. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.d.ts.map +1 -1
  156. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js +32 -10
  157. package/lib/esm/hierarchies/imodel/operators/HideIfNoChildren.js.map +1 -1
  158. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.d.ts.map +1 -1
  159. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js +31 -15
  160. package/lib/esm/hierarchies/imodel/operators/HideNodesInHierarchy.js.map +1 -1
  161. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.d.ts.map +1 -1
  162. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js +5 -7
  163. package/lib/esm/hierarchies/imodel/operators/grouping/BaseClassGrouping.js.map +1 -1
  164. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.d.ts.map +1 -1
  165. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js +5 -10
  166. package/lib/esm/hierarchies/imodel/operators/grouping/ClassGrouping.js.map +1 -1
  167. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.d.ts.map +1 -1
  168. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js +1 -5
  169. package/lib/esm/hierarchies/imodel/operators/grouping/GroupHiding.js.map +1 -1
  170. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.d.ts.map +1 -1
  171. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js +2 -10
  172. package/lib/esm/hierarchies/imodel/operators/grouping/LabelGrouping.js.map +1 -1
  173. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.d.ts.map +1 -1
  174. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js +24 -28
  175. package/lib/esm/hierarchies/imodel/operators/grouping/PropertiesGrouping.js.map +1 -1
  176. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.d.ts.map +1 -1
  177. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js +3 -1
  178. package/lib/esm/hierarchies/imodel/operators/grouping/Shared.js.map +1 -1
  179. package/lib/esm/hierarchies/internal/Common.d.ts.map +1 -1
  180. package/lib/esm/hierarchies/internal/Common.js +2 -2
  181. package/lib/esm/hierarchies/internal/Common.js.map +1 -1
  182. package/lib/esm/hierarchies/internal/EachValueFrom.d.ts.map +1 -1
  183. package/lib/esm/hierarchies/internal/EachValueFrom.js +0 -2
  184. package/lib/esm/hierarchies/internal/EachValueFrom.js.map +1 -1
  185. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.d.ts.map +1 -1
  186. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js +3 -1
  187. package/lib/esm/hierarchies/internal/RxjsHierarchyDefinition.js.map +1 -1
  188. package/lib/esm/hierarchies/internal/SubscriptionScheduler.d.ts.map +1 -1
  189. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js +1 -4
  190. package/lib/esm/hierarchies/internal/SubscriptionScheduler.js.map +1 -1
  191. package/lib/esm/hierarchies/internal/operators/Partition.d.ts.map +1 -1
  192. package/lib/esm/hierarchies/internal/operators/Partition.js.map +1 -1
  193. package/lib/esm/hierarchies/internal/operators/ReduceToMergeMap.d.ts.map +1 -1
  194. package/lib/esm/hierarchies/internal/operators/ReleaseMainThread.d.ts.map +1 -1
  195. package/lib/esm/presentation-hierarchies.d.ts +2 -4
  196. package/lib/esm/presentation-hierarchies.d.ts.map +1 -1
  197. package/lib/esm/presentation-hierarchies.js +2 -3
  198. package/lib/esm/presentation-hierarchies.js.map +1 -1
  199. package/package.json +17 -25
@@ -4,7 +4,7 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { assert } from "@itwin/core-bentley";
6
6
  import { GenericInstanceFilter, GenericInstanceFilterRuleValue } from "@itwin/core-common";
7
- import { compareFullClassNames, ECSql, getClass, normalizeFullClassName, parseFullClassName, PrimitiveValue } from "@itwin/presentation-shared";
7
+ import { compareFullClassNames, ECSql, getClass, normalizeFullClassName, parseFullClassName, PrimitiveValue, } from "@itwin/presentation-shared";
8
8
  /**
9
9
  * Column names of the SELECT clause created by `NodeSelectClauseFactory`. Order of the names matches the order of columns
10
10
  * created by the factory.
@@ -41,7 +41,6 @@ export var NodeSelectClauseColumnNames;
41
41
  })(NodeSelectClauseColumnNames || (NodeSelectClauseColumnNames = {}));
42
42
  /**
43
43
  * Creates an instance of `NodeSelectQueryFactory`.
44
- * @public
45
44
  */
46
45
  export function createNodesQueryClauseFactory(props) {
47
46
  return new NodeSelectQueryFactory(props);
@@ -60,7 +59,9 @@ class NodeSelectQueryFactory {
60
59
  return `
61
60
  ec_ClassName(${props.ecClassId.selector}) AS ${NodeSelectClauseColumnNames.FullClassName},
62
61
  ${props.ecInstanceId.selector} AS ${NodeSelectClauseColumnNames.ECInstanceId},
63
- ${createECSqlValueSelector(props.nodeLabel)} AS ${NodeSelectClauseColumnNames.DisplayLabel},
62
+ ${createECSqlValueSelector(typeof props.nodeLabel === "object" && "of" in props.nodeLabel
63
+ ? { selector: await this._instanceLabelSelectClauseFactory.createSelectClause(props.nodeLabel.of) }
64
+ : props.nodeLabel)} AS ${NodeSelectClauseColumnNames.DisplayLabel},
64
65
  CAST(${createECSqlValueSelector(props.hasChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HasChildren},
65
66
  CAST(${createECSqlValueSelector(props.hideIfNoChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideIfNoChildren},
66
67
  CAST(${createECSqlValueSelector(props.hideNodeInHierarchy)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideNodeInHierarchy},
@@ -90,21 +91,13 @@ class NodeSelectQueryFactory {
90
91
  const { contentClass, filter } = props;
91
92
  const { from, joins, where } = filter
92
93
  ? await createInstanceFilterClauses({ imodelAccess: this._imodelAccess, contentClass, filter })
93
- : {
94
- from: contentClass.fullName,
95
- joins: [],
96
- where: [],
97
- };
94
+ : { from: contentClass.fullName, joins: [], where: [] };
98
95
  const fromClass = await getClass(this._imodelAccess, normalizeFullClassName(from));
99
96
  const hiddenClasses = await getHiddenClassesTree(fromClass);
100
97
  const hiddenClassesWhereClause = createWhereClauseForHiddenClasses(hiddenClasses, contentClass.alias);
101
98
  hiddenClassesWhereClause.hideClause && where.push(hiddenClassesWhereClause.hideClause);
102
99
  assert(!hiddenClassesWhereClause.showClause, "`showClause` is expected to always be empty here");
103
- return {
104
- from,
105
- joins: joins.join("\n"),
106
- where: where.join(" AND "),
107
- };
100
+ return { from, joins: joins.join("\n"), where: where.join(" AND ") };
108
101
  }
109
102
  }
110
103
  /**
@@ -131,11 +124,12 @@ async function createInstanceFilterClauses(props) {
131
124
  return await imodelAccess.classDerivesFrom(derivedClassName, baseClassName);
132
125
  }
133
126
  catch (e) {
127
+ /* v8 ignore else -- @preserve */
134
128
  if (isSchemaOrClassNotFoundError(e)) {
135
129
  // either derived or base class doesn't exist in this iModel
136
130
  return false;
137
131
  }
138
- /* c8 ignore next 2 */
132
+ /* v8 ignore next -- @preserve */
139
133
  throw e;
140
134
  }
141
135
  },
@@ -149,7 +143,9 @@ async function createInstanceFilterClauses(props) {
149
143
  }
150
144
  let filteredClassNamesInThisIModel;
151
145
  if (filter.filteredClassNames && filter.filteredClassNames.length > 0) {
152
- filteredClassNamesInThisIModel = (await Promise.all(filter.filteredClassNames.map(normalizeFullClassName).map(async (fullClassName) => ({
146
+ filteredClassNamesInThisIModel = (await Promise.all(filter.filteredClassNames
147
+ .map(normalizeFullClassName)
148
+ .map(async (fullClassName) => ({
153
149
  fullClassName,
154
150
  filteredClass: await tryGetClass(imodelAccess, fullClassName),
155
151
  }))))
@@ -162,17 +158,22 @@ async function createInstanceFilterClauses(props) {
162
158
  }
163
159
  let joins;
164
160
  try {
165
- joins = await Promise.all(filter.relatedInstances.map(async (rel, i) => ECSql.createRelationshipPathJoinClause({
166
- schemaProvider: imodelAccess,
167
- path: assignRelationshipPathAliases(rel.path, i, contentClass.alias, rel.alias),
168
- })));
161
+ joins = await Promise.all(filter.relatedInstances.map(async (rel, i) => {
162
+ const res = await ECSql.createRelationshipPathJoinClause({
163
+ schemaProvider: imodelAccess,
164
+ path: assignRelationshipPathAliases(rel.path, i, contentClass.alias, rel.alias),
165
+ });
166
+ assert(!res.bindings, "Expecting no bindings as the relationship path has no instance filter.");
167
+ return res.joins;
168
+ }));
169
169
  }
170
170
  catch (e) {
171
+ /* v8 ignore else -- @preserve */
171
172
  if (isSchemaOrClassNotFoundError(e)) {
172
173
  // at least one related instance spec uses a class that doesn't exist in this iModel
173
174
  return DISABLE_QUERY;
174
175
  }
175
- /* c8 ignore next 2 */
176
+ /* v8 ignore next -- @preserve */
176
177
  throw e;
177
178
  }
178
179
  const classAliasMap = new Map([[contentClass.alias, from]]);
@@ -187,11 +188,12 @@ async function createInstanceFilterClauses(props) {
187
188
  catch (e) {
188
189
  // note: don't need to worry about schemas & classes here, because that's taken care of above, when
189
190
  // validating property class names & related instance defs
191
+ /* v8 ignore else -- @preserve */
190
192
  if (isPropertyNotFoundError(e)) {
191
193
  // filter uses a property that doesn't exist in this iModel
192
194
  return DISABLE_QUERY;
193
195
  }
194
- /* c8 ignore next 2 */
196
+ /* v8 ignore next -- @preserve */
195
197
  throw e;
196
198
  }
197
199
  const where = new Array();
@@ -247,6 +249,8 @@ async function createGroupingSelector(grouping, imodelAccess, instanceLabelSelec
247
249
  ...createBaseGroupingParamSelectors(grouping.byBaseClasses),
248
250
  ]),
249
251
  });
252
+ // TODO: MISSING_COVERAGE
253
+ /* v8 ignore else -- @preserve */
250
254
  if (grouping.byProperties) {
251
255
  const propertyClass = await getClass(imodelAccess, grouping.byProperties.propertiesClassName);
252
256
  groupingSelectors.push({
@@ -285,16 +289,10 @@ async function createGroupingSelector(grouping, imodelAccess, instanceLabelSelec
285
289
  function createLabelGroupingBaseParamsSelectors(byLabel) {
286
290
  const selectors = new Array();
287
291
  if (byLabel.action !== undefined) {
288
- selectors.push({
289
- key: "action",
290
- selector: `${createECSqlValueSelector(byLabel.action)}`,
291
- });
292
+ selectors.push({ key: "action", selector: `${createECSqlValueSelector(byLabel.action)}` });
292
293
  }
293
294
  if (byLabel.groupId !== undefined) {
294
- selectors.push({
295
- key: "groupId",
296
- selector: createECSqlValueSelector(byLabel.groupId),
297
- });
295
+ selectors.push({ key: "groupId", selector: createECSqlValueSelector(byLabel.groupId) });
298
296
  }
299
297
  if (byLabel.action !== "merge") {
300
298
  selectors.push(...createBaseGroupingParamSelectors(byLabel));
@@ -303,17 +301,18 @@ function createLabelGroupingBaseParamsSelectors(byLabel) {
303
301
  }
304
302
  async function createPropertyGroupSelectors(propertyGroup, propertyClass, instanceLabelSelectClauseFactory) {
305
303
  const selectors = new Array();
306
- selectors.push({
307
- key: "propertyName",
308
- selector: `${createECSqlValueSelector(propertyGroup.propertyName)}`,
309
- });
304
+ selectors.push({ key: "propertyName", selector: `${createECSqlValueSelector(propertyGroup.propertyName)}` });
310
305
  const property = await propertyClass.getProperty(propertyGroup.propertyName);
311
306
  if (!property) {
312
307
  throw new Error(`Property "${propertyGroup.propertyName}" not found in ECClass "${propertyClass.fullName}".`);
313
308
  }
314
309
  if (property.isNavigation()) {
315
310
  const relationshipClass = await property.relationshipClass;
316
- const abstractConstraint = property.direction === "Forward" ? await relationshipClass.target.abstractConstraint : await relationshipClass.source.abstractConstraint;
311
+ const abstractConstraint = property.direction === "Forward"
312
+ ? await relationshipClass.target.abstractConstraint
313
+ : await relationshipClass.source.abstractConstraint;
314
+ // TODO: MISSING_COVERAGE
315
+ /* v8 ignore else -- @preserve */
317
316
  if (!abstractConstraint) {
318
317
  throw new Error(`Could not determine class name for navigation property with direction "${property.direction}".`);
319
318
  }
@@ -344,21 +343,10 @@ function createRangeParamSelectors(ranges) {
344
343
  key: "ranges",
345
344
  selector: `json_array(${ranges
346
345
  .map((range) => serializeJsonObject([
347
- {
348
- key: "fromValue",
349
- selector: createECSqlValueSelector(range.fromValue),
350
- },
351
- {
352
- key: "toValue",
353
- selector: createECSqlValueSelector(range.toValue),
354
- },
346
+ { key: "fromValue", selector: createECSqlValueSelector(range.fromValue) },
347
+ { key: "toValue", selector: createECSqlValueSelector(range.toValue) },
355
348
  ...(range.rangeLabel
356
- ? [
357
- {
358
- key: "rangeLabel",
359
- selector: `${createECSqlValueSelector(range.rangeLabel)}`,
360
- },
361
- ]
349
+ ? [{ key: "rangeLabel", selector: `${createECSqlValueSelector(range.rangeLabel)}` }]
362
350
  : []),
363
351
  ]))
364
352
  .join(", ")})`,
@@ -367,22 +355,13 @@ function createRangeParamSelectors(ranges) {
367
355
  function createBaseGroupingParamSelectors(params) {
368
356
  const selectors = new Array();
369
357
  if (params.hideIfNoSiblings !== undefined) {
370
- selectors.push({
371
- key: "hideIfNoSiblings",
372
- selector: createECSqlValueSelector(params.hideIfNoSiblings),
373
- });
358
+ selectors.push({ key: "hideIfNoSiblings", selector: createECSqlValueSelector(params.hideIfNoSiblings) });
374
359
  }
375
360
  if (params.hideIfOneGroupedNode !== undefined) {
376
- selectors.push({
377
- key: "hideIfOneGroupedNode",
378
- selector: createECSqlValueSelector(params.hideIfOneGroupedNode),
379
- });
361
+ selectors.push({ key: "hideIfOneGroupedNode", selector: createECSqlValueSelector(params.hideIfOneGroupedNode) });
380
362
  }
381
363
  if (params.autoExpand !== undefined) {
382
- selectors.push({
383
- key: "autoExpand",
384
- selector: createECSqlValueSelector(params.autoExpand),
385
- });
364
+ selectors.push({ key: "autoExpand", selector: createECSqlValueSelector(params.autoExpand) });
386
365
  }
387
366
  return selectors;
388
367
  }
@@ -558,6 +537,7 @@ async function getSpecializedPropertyClass(classHierarchyInspector, classes) {
558
537
  async function getHiddenClassesTree(selectClass, selectClassAttribute = "show") {
559
538
  const derivedClasses = await getDirectDerivedClasses(selectClass);
560
539
  const derivedClassSchemas = derivedClasses.reduce((acc, ecClass) => {
540
+ /* v8 ignore else -- @preserve */
561
541
  if (!acc.set.has(ecClass.schema.name)) {
562
542
  acc.schemas.push(ecClass.schema);
563
543
  acc.set.add(ecClass.schema.name);
@@ -574,13 +554,7 @@ async function getHiddenClassesTree(selectClass, selectClassAttribute = "show")
574
554
  if (!attr || attr === selectClassAttribute) {
575
555
  return getHiddenClassesTree(ecClass, selectClassAttribute);
576
556
  }
577
- return [
578
- {
579
- fullName: ecClass.fullName,
580
- state: attr,
581
- children: await getHiddenClassesTree(ecClass, attr),
582
- },
583
- ];
557
+ return [{ fullName: ecClass.fullName, state: attr, children: await getHiddenClassesTree(ecClass, attr) }];
584
558
  }))).flat();
585
559
  return tree;
586
560
  }
@@ -633,15 +607,17 @@ async function tryGetClass(schemaProvider, fullClassName) {
633
607
  return await getClass(schemaProvider, fullClassName);
634
608
  }
635
609
  catch (e) {
610
+ /* v8 ignore else -- @preserve */
636
611
  if (isSchemaOrClassNotFoundError(e)) {
637
612
  return undefined;
638
613
  }
639
- /* c8 ignore next 2 */
614
+ /* v8 ignore next -- @preserve */
640
615
  throw e;
641
616
  }
642
617
  }
643
618
  function isSchemaOrClassNotFoundError(e) {
644
- return e instanceof Error && (!!e.message.match(/^Schema "[\w\d_]+" not found/) || !!e.message.match(/^Class "[\w\d_\.:]+" not found/));
619
+ return (e instanceof Error &&
620
+ (!!e.message.match(/^Schema "[\w\d_]+" not found/) || !!e.message.match(/^Class "[\w\d_\.:]+" not found/)));
645
621
  }
646
622
  function isPropertyNotFoundError(e) {
647
623
  return e instanceof Error && !!e.message.match(/^Property "[\w\d]+" not found in ECClass/);
@@ -1 +1 @@
1
- {"version":3,"file":"NodeSelectQueryFactory.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/NodeSelectQueryFactory.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 { assert } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter, GenericInstanceFilterRuleValue } from \"@itwin/core-common\";\nimport { compareFullClassNames, ECSql, getClass, normalizeFullClassName, parseFullClassName, PrimitiveValue } from \"@itwin/presentation-shared\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type {\n GenericInstanceFilterRelationshipStep,\n GenericInstanceFilterRule,\n GenericInstanceFilterRuleGroup,\n GenericInstanceFilterRuleGroupOperator,\n GenericInstanceFilterRuleOperator,\n} from \"@itwin/core-common\";\nimport type { EC, ECClassHierarchyInspector, ECSchemaProvider, IInstanceLabelSelectClauseFactory, Props } from \"@itwin/presentation-shared\";\nimport type { HierarchyNodeAutoExpandProp } from \"./IModelHierarchyNode.js\";\n\n/**\n * Column names of the SELECT clause created by `NodeSelectClauseFactory`. Order of the names matches the order of columns\n * created by the factory.\n *\n * @public\n */\nexport enum NodeSelectClauseColumnNames {\n /** Full class name of the instance the node represents. Type: `string` in format `{schema name}:{class name}`. */\n FullClassName = \"FullClassName\",\n /** ECInstance ID of the instance the node represents. Type: `Id64String`. */\n ECInstanceId = \"ECInstanceId\",\n /** Display label. Type: `string`. */\n DisplayLabel = \"DisplayLabel\",\n /**\n * A flag indicating if the node has children. Type: `boolean`. Values:\n * - `false` - node never has children.\n * - `true` - node always has children.\n * - NULL - unknown, needs to be determined by requesting children for the node.\n */\n HasChildren = \"HasChildren\",\n /** A flag indicating that a node should be hidden if it has no children. Type: `boolean`. */\n HideIfNoChildren = \"HideIfNoChildren\",\n /** A flag indicating that a node should be hidden and its children should be displayed instead. Type: `boolean`. */\n HideNodeInHierarchy = \"HideNodeInHierarchy\",\n /** A serialized JSON object for providing grouping information. */\n Grouping = \"Grouping\",\n /** A serialized JSON object for associating a node with additional data. */\n ExtendedData = \"ExtendedData\",\n /** A flag indicating the node should be auto-expanded when it's loaded. */\n AutoExpand = \"AutoExpand\",\n /** A flag indicating the node supports child hierarchy level filtering. */\n SupportsFiltering = \"SupportsFiltering\",\n}\n\n/**\n * A data structure for defining an ECSQL value selector.\n * @public\n */\ninterface ECSqlValueSelector {\n selector: string;\n}\n\n/**\n * Props for `NodeSelectClauseFactory.createSelectClause`.\n * @public\n */\ninterface NodeSelectClauseProps {\n ecClassId: ECSqlValueSelector;\n ecInstanceId: ECSqlValueSelector;\n nodeLabel: string | ECSqlValueSelector;\n extendedData?: {\n [key: string]: Id64String | string | number | boolean | ECSqlValueSelector;\n };\n autoExpand?: boolean | ECSqlValueSelector;\n supportsFiltering?: boolean | ECSqlValueSelector;\n hasChildren?: boolean | ECSqlValueSelector;\n hideNodeInHierarchy?: boolean | ECSqlValueSelector;\n hideIfNoChildren?: boolean | ECSqlValueSelector;\n grouping?: ECSqlSelectClauseGroupingParams;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n * @public\n */\ninterface ECSqlSelectClauseGroupingParams {\n byLabel?: ECSqlSelectClauseLabelGroupingParams;\n byClass?: boolean | ECSqlSelectClauseGroupingParamsBase | ECSqlValueSelector;\n byBaseClasses?: ECSqlSelectClauseBaseClassGroupingParams;\n byProperties?: ECSqlSelectClausePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining label grouping params.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Id that needs to match for nodes to be grouped or merged.*/\n groupId?: string | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining label merging.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingMergeParams extends ECSqlSelectClauseLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingGroupParams extends ECSqlSelectClauseLabelGroupingBaseParams, ECSqlSelectClauseGroupingParamsBase {\n action?: \"group\";\n}\n\n/**\n * A data structure for defining possible label grouping types.\n * @public\n */\ntype ECSqlSelectClauseLabelGroupingParams =\n | boolean\n | ECSqlValueSelector\n | ECSqlSelectClauseLabelGroupingMergeParams\n | ECSqlSelectClauseLabelGroupingGroupParams;\n\n/**\n * A data structure for defining base grouping parameters shared across all types of grouping.\n * @public\n */\ninterface ECSqlSelectClauseGroupingParamsBase {\n hideIfNoSiblings?: boolean | ECSqlValueSelector;\n hideIfOneGroupedNode?: boolean | ECSqlValueSelector;\n autoExpand?: HierarchyNodeAutoExpandProp | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining properties grouping.\n * @public\n */\ninterface ECSqlSelectClausePropertiesGroupingParams extends ECSqlSelectClauseGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: EC.FullClassName;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean | ECSqlValueSelector;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean | ECSqlValueSelector;\n /**\n * Properties of the specified class, by which the nodes should be grouped.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyClassAlias: \"this\"\n * },\n * {\n * propertyName: \"length\",\n * propertyClassAlias: \"x\",\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: ECSqlSelectClausePropertyGroup[];\n}\n\n/**\n * A data structure for defining specific properties' grouping params.\n * @public\n */\ninterface ECSqlSelectClausePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Alias to of the class containing the property. Used to select the property value. */\n propertyClassAlias: string;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: ECSqlSelectClausePropertyValueRange[];\n}\n\n/**\n * A data structure for defining boundaries for a value.\n * @public\n */\ninterface ECSqlSelectClausePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number | ECSqlValueSelector;\n /** Defines the upper bound of the range. */\n toValue: number | ECSqlValueSelector;\n /** Defines the range label. Will be used as grouping node's display label. */\n rangeLabel?: string | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining base class grouping.\n * @public\n */\ninterface ECSqlSelectClauseBaseClassGroupingParams extends ECSqlSelectClauseGroupingParamsBase {\n fullClassNames: EC.FullClassName[] | ECSqlValueSelector[];\n}\n\n/**\n * An interface of a factory that knows how to create nodes' select ECSQL query.\n * @public\n */\nexport interface NodesQueryClauseFactory {\n /** Create a SELECT clause in a format understood by nodes query parser used by `HierarchyProvider`. */\n createSelectClause(props: NodeSelectClauseProps): Promise<string>;\n\n /**\n * Creates the necessary ECSQL snippets to create an instance filter described by the given `GenericInstanceFilter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter OR referenced schema items (classes/properties)\n * don't exist in the iModel, a special result is returned to make sure the resulting query is valid and doesn't return anything.\n */\n createFilterClauses(props: {\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter?: GenericInstanceFilter;\n }): Promise<{ from: string; where: string; joins: string }>;\n}\n\n/**\n * Creates an instance of `NodeSelectQueryFactory`.\n * @public\n */\nexport function createNodesQueryClauseFactory(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n}): NodesQueryClauseFactory {\n return new NodeSelectQueryFactory(props);\n}\n\n/** A factory for creating a nodes' select ECSQL query. */\nclass NodeSelectQueryFactory {\n private _imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n private _instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n\n public constructor(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n }) {\n this._imodelAccess = props.imodelAccess;\n this._instanceLabelSelectClauseFactory = props.instanceLabelSelectClauseFactory;\n }\n\n /** Create a SELECT clause in a format understood by results reader of the library. */\n public async createSelectClause(props: NodeSelectClauseProps) {\n // note: the columns order must match the order in `NodeSelectClauseColumnNames`\n return `\n ec_ClassName(${props.ecClassId.selector}) AS ${NodeSelectClauseColumnNames.FullClassName},\n ${props.ecInstanceId.selector} AS ${NodeSelectClauseColumnNames.ECInstanceId},\n ${createECSqlValueSelector(props.nodeLabel)} AS ${NodeSelectClauseColumnNames.DisplayLabel},\n CAST(${createECSqlValueSelector(props.hasChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HasChildren},\n CAST(${createECSqlValueSelector(props.hideIfNoChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideIfNoChildren},\n CAST(${createECSqlValueSelector(props.hideNodeInHierarchy)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideNodeInHierarchy},\n ${props.grouping ? await createGroupingSelector(props.grouping, this._imodelAccess, this._instanceLabelSelectClauseFactory) : \"CAST(NULL AS TEXT)\"} AS ${NodeSelectClauseColumnNames.Grouping},\n ${\n props.extendedData\n ? `json_object(${Object.entries(props.extendedData)\n .map(([key, value]) => `'${key}', ${createECSqlValueSelector(value)}`)\n .join(\", \")})`\n : \"CAST(NULL AS TEXT)\"\n } AS ${NodeSelectClauseColumnNames.ExtendedData},\n CAST(${createECSqlValueSelector(props.autoExpand)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.AutoExpand},\n CAST(${createECSqlValueSelector(props.supportsFiltering)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.SupportsFiltering}\n `;\n }\n\n /**\n * Creates the necessary ECSQL snippets to create an instance filter described by the `filter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter OR referenced schema items (classes/properties)\n * don't exist in the iModel, a special result is returned to make sure the resulting query is valid and doesn't return anything.\n */\n public async createFilterClauses(props: {\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter?: GenericInstanceFilter;\n }): Promise<{ from: string; where: string; joins: string }> {\n const { contentClass, filter } = props;\n const { from, joins, where } = filter\n ? await createInstanceFilterClauses({ imodelAccess: this._imodelAccess, contentClass, filter })\n : {\n from: contentClass.fullName,\n joins: [],\n where: [],\n };\n\n const fromClass = await getClass(this._imodelAccess, normalizeFullClassName(from));\n const hiddenClasses = await getHiddenClassesTree(fromClass);\n const hiddenClassesWhereClause = createWhereClauseForHiddenClasses(hiddenClasses, contentClass.alias);\n hiddenClassesWhereClause.hideClause && where.push(hiddenClassesWhereClause.hideClause);\n assert(!hiddenClassesWhereClause.showClause, \"`showClause` is expected to always be empty here\");\n\n return {\n from,\n joins: joins.join(\"\\n\"),\n where: where.join(\" AND \"),\n };\n }\n}\n\n/**\n * Creates the necessary ECSQL snippets to create an instance filter described by the `filter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter, a special result\n * is returned to make sure the resulting query is valid and doesn't return anything.\n */\nasync function createInstanceFilterClauses(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter: GenericInstanceFilter;\n}): Promise<{ from: EC.FullClassName; where: string[]; joins: string[] }> {\n const { imodelAccess, contentClass, filter } = props;\n\n // In some cases the given filter means we want the query to return nothing - e.g. when filtering by classes that don't intersect\n // with the given content class. Return a special result that makes sure the resulting query is valid, but returns no rows.\n const DISABLE_QUERY = { from: contentClass.fullName, joins: [], where: [\"FALSE\"] };\n\n const from = await specializeContentClass({\n classHierarchyInspector: {\n async classDerivesFrom(derivedClassName: EC.FullClassName, baseClassName: EC.FullClassName): Promise<boolean> {\n try {\n return await imodelAccess.classDerivesFrom(derivedClassName, baseClassName);\n } catch (e) {\n if (isSchemaOrClassNotFoundError(e)) {\n // either derived or base class doesn't exist in this iModel\n return false;\n }\n /* c8 ignore next 2 */\n throw e;\n }\n },\n },\n contentClassName: contentClass.fullName,\n filterClassNames: filter.propertyClassNames.map(normalizeFullClassName),\n });\n if (!from) {\n // filter class doesn't intersect with content class\n return DISABLE_QUERY;\n }\n\n let filteredClassNamesInThisIModel: EC.FullClassName[] | undefined;\n if (filter.filteredClassNames && filter.filteredClassNames.length > 0) {\n filteredClassNamesInThisIModel = (\n await Promise.all(\n filter.filteredClassNames.map(normalizeFullClassName).map(async (fullClassName) => ({\n fullClassName,\n filteredClass: await tryGetClass(imodelAccess, fullClassName),\n })),\n )\n )\n .filter(({ filteredClass }) => !!filteredClass)\n .map(({ fullClassName }) => fullClassName);\n\n if (filteredClassNamesInThisIModel.length === 0) {\n // we had filter classes, but none of them exist in this iModel\n return DISABLE_QUERY;\n }\n }\n\n let joins: string[] | undefined;\n try {\n joins = await Promise.all(\n filter.relatedInstances.map(async (rel, i) =>\n ECSql.createRelationshipPathJoinClause({\n schemaProvider: imodelAccess,\n path: assignRelationshipPathAliases(rel.path, i, contentClass.alias, rel.alias),\n }),\n ),\n );\n } catch (e) {\n if (isSchemaOrClassNotFoundError(e)) {\n // at least one related instance spec uses a class that doesn't exist in this iModel\n return DISABLE_QUERY;\n }\n /* c8 ignore next 2 */\n throw e;\n }\n\n const classAliasMap = new Map<string, EC.FullClassName>([[contentClass.alias, from]]);\n filter.relatedInstances.forEach(\n ({ path, alias }) => path.length > 0 && classAliasMap.set(alias, normalizeFullClassName(path[path.length - 1].targetClassName)),\n );\n let propertiesFilter: string | undefined;\n try {\n propertiesFilter = await createWhereClause(\n contentClass.alias,\n async (alias) => {\n const aliasClassName = classAliasMap.get(alias);\n return aliasClassName ? getClass(imodelAccess, aliasClassName) : undefined;\n },\n filter.rules,\n );\n } catch (e) {\n // note: don't need to worry about schemas & classes here, because that's taken care of above, when\n // validating property class names & related instance defs\n if (isPropertyNotFoundError(e)) {\n // filter uses a property that doesn't exist in this iModel\n return DISABLE_QUERY;\n }\n /* c8 ignore next 2 */\n throw e;\n }\n\n const where = new Array<string>();\n if (filteredClassNamesInThisIModel) {\n where.push(\n `${ECSql.createRawPropertyValueSelector(contentClass.alias, \"ECClassId\")} IS (\n ${filteredClassNamesInThisIModel\n .map(parseFullClassName)\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")}\n )`,\n );\n }\n if (propertiesFilter) {\n where.push(propertiesFilter);\n }\n\n return { from, joins, where };\n}\n\nfunction createECSqlValueSelector(input: undefined | PrimitiveValue | ECSqlValueSelector) {\n if (input === undefined) {\n return \"NULL\";\n }\n if (isSelector(input)) {\n return input.selector;\n }\n return ECSql.createRawPrimitiveValueSelector(input);\n}\n\nfunction isSelector(x: any): x is ECSqlValueSelector {\n return !!x.selector;\n}\n\nasync function createGroupingSelector(\n grouping: ECSqlSelectClauseGroupingParams,\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory,\n): Promise<string> {\n const groupingSelectors = new Array<{ key: string; selector: string }>();\n\n grouping.byLabel &&\n groupingSelectors.push({\n key: \"byLabel\",\n selector:\n typeof grouping.byLabel === \"boolean\" || isSelector(grouping.byLabel)\n ? createECSqlValueSelector(grouping.byLabel)\n : serializeJsonObject(createLabelGroupingBaseParamsSelectors(grouping.byLabel)),\n });\n\n grouping.byClass &&\n groupingSelectors.push({\n key: \"byClass\",\n selector:\n typeof grouping.byClass === \"boolean\" || isSelector(grouping.byClass)\n ? createECSqlValueSelector(grouping.byClass)\n : serializeJsonObject(createBaseGroupingParamSelectors(grouping.byClass)),\n });\n\n grouping.byBaseClasses &&\n groupingSelectors.push({\n key: \"byBaseClasses\",\n selector: serializeJsonObject([\n {\n key: \"fullClassNames\",\n selector: `json_array(${grouping.byBaseClasses.fullClassNames.map((className) => createECSqlValueSelector(className)).join(\", \")})`,\n },\n ...createBaseGroupingParamSelectors(grouping.byBaseClasses),\n ]),\n });\n\n if (grouping.byProperties) {\n const propertyClass = await getClass(imodelAccess, grouping.byProperties.propertiesClassName);\n groupingSelectors.push({\n key: \"byProperties\",\n selector: serializeJsonObject([\n {\n key: \"propertiesClassName\",\n selector: `${createECSqlValueSelector(grouping.byProperties.propertiesClassName)}`,\n },\n {\n key: \"propertyGroups\",\n selector: `json_array(${(\n await Promise.all(\n grouping.byProperties.propertyGroups.map(async (propertyGroup) =>\n serializeJsonObject(await createPropertyGroupSelectors(propertyGroup, propertyClass, instanceLabelSelectClauseFactory)),\n ),\n )\n ).join(\", \")})`,\n },\n ...(grouping.byProperties.createGroupForOutOfRangeValues !== undefined\n ? [\n {\n key: \"createGroupForOutOfRangeValues\",\n selector: `CAST(${createECSqlValueSelector(grouping.byProperties.createGroupForOutOfRangeValues)} AS BOOLEAN)`,\n },\n ]\n : []),\n ...(grouping.byProperties.createGroupForUnspecifiedValues !== undefined\n ? [\n {\n key: \"createGroupForUnspecifiedValues\",\n selector: `CAST(${createECSqlValueSelector(grouping.byProperties.createGroupForUnspecifiedValues)} AS BOOLEAN)`,\n },\n ]\n : []),\n ...createBaseGroupingParamSelectors(grouping.byProperties),\n ]),\n });\n }\n\n return serializeJsonObject(groupingSelectors);\n}\n\nfunction createLabelGroupingBaseParamsSelectors(byLabel: ECSqlSelectClauseLabelGroupingMergeParams | ECSqlSelectClauseLabelGroupingGroupParams) {\n const selectors = new Array<{ key: string; selector: string }>();\n if (byLabel.action !== undefined) {\n selectors.push({\n key: \"action\",\n selector: `${createECSqlValueSelector(byLabel.action)}`,\n });\n }\n if (byLabel.groupId !== undefined) {\n selectors.push({\n key: \"groupId\",\n selector: createECSqlValueSelector(byLabel.groupId),\n });\n }\n if (byLabel.action !== \"merge\") {\n selectors.push(...createBaseGroupingParamSelectors(byLabel));\n }\n\n return selectors;\n}\n\nasync function createPropertyGroupSelectors(\n propertyGroup: ECSqlSelectClausePropertyGroup,\n propertyClass: EC.Class,\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory,\n) {\n const selectors = new Array<{ key: string; selector: string }>();\n selectors.push({\n key: \"propertyName\",\n selector: `${createECSqlValueSelector(propertyGroup.propertyName)}`,\n });\n\n const property = await propertyClass.getProperty(propertyGroup.propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyGroup.propertyName}\" not found in ECClass \"${propertyClass.fullName}\".`);\n }\n\n if (property.isNavigation()) {\n const relationshipClass = await property.relationshipClass;\n const abstractConstraint =\n property.direction === \"Forward\" ? await relationshipClass.target.abstractConstraint : await relationshipClass.source.abstractConstraint;\n if (!abstractConstraint) {\n throw new Error(`Could not determine class name for navigation property with direction \"${property.direction}\".`);\n }\n\n const fullName = abstractConstraint.fullName;\n const targetAlias = \"target\";\n selectors.push({\n key: \"propertyValue\",\n selector: `(\n SELECT ${await instanceLabelSelectClauseFactory.createSelectClause({ className: fullName, classAlias: targetAlias })}\n FROM ${fullName} AS ${targetAlias}\n WHERE [${targetAlias}].[ECInstanceId] = [${propertyGroup.propertyClassAlias}].[${propertyGroup.propertyName}].[Id]\n )`,\n });\n } else {\n selectors.push({\n key: \"propertyValue\",\n selector: `[${propertyGroup.propertyClassAlias}].[${propertyGroup.propertyName}]`,\n });\n }\n\n if (propertyGroup.ranges) {\n selectors.push(createRangeParamSelectors(propertyGroup.ranges));\n }\n\n return selectors;\n}\n\nfunction createRangeParamSelectors(ranges: ECSqlSelectClausePropertyValueRange[]) {\n return {\n key: \"ranges\",\n selector: `json_array(${ranges\n .map((range) =>\n serializeJsonObject([\n {\n key: \"fromValue\",\n selector: createECSqlValueSelector(range.fromValue),\n },\n {\n key: \"toValue\",\n selector: createECSqlValueSelector(range.toValue),\n },\n ...(range.rangeLabel\n ? [\n {\n key: \"rangeLabel\",\n selector: `${createECSqlValueSelector(range.rangeLabel)}`,\n },\n ]\n : []),\n ]),\n )\n .join(\", \")})`,\n };\n}\n\nfunction createBaseGroupingParamSelectors(params: ECSqlSelectClauseGroupingParamsBase) {\n const selectors = new Array<{ key: string; selector: string }>();\n if (params.hideIfNoSiblings !== undefined) {\n selectors.push({\n key: \"hideIfNoSiblings\",\n selector: createECSqlValueSelector(params.hideIfNoSiblings),\n });\n }\n if (params.hideIfOneGroupedNode !== undefined) {\n selectors.push({\n key: \"hideIfOneGroupedNode\",\n selector: createECSqlValueSelector(params.hideIfOneGroupedNode),\n });\n }\n if (params.autoExpand !== undefined) {\n selectors.push({\n key: \"autoExpand\",\n selector: createECSqlValueSelector(params.autoExpand),\n });\n }\n return selectors;\n}\n\nfunction serializeJsonObject(selectors: Array<{ key: string; selector: string }>): string {\n return `json_object(${selectors.map(({ key, selector }) => `'${key}', ${selector}`).join(\", \")})`;\n}\n\nasync function createWhereClause(\n contentClassAlias: string,\n classLoader: (alias: string) => Promise<EC.Class | undefined>,\n rule: GenericInstanceFilterRule | GenericInstanceFilterRuleGroup,\n): Promise<string | undefined> {\n if (GenericInstanceFilter.isFilterRuleGroup(rule)) {\n const clause = (await Promise.all(rule.rules.map(async (r) => createWhereClause(contentClassAlias, classLoader, r))))\n .filter((c) => !!c)\n .join(` ${getECSqlLogicalOperator(rule.operator)} `);\n return clause ? (rule.operator === \"or\" ? `(${clause})` : clause) : undefined;\n }\n\n const sourceAlias = rule.sourceAlias ? rule.sourceAlias : contentClassAlias;\n const propertyClass = await classLoader(sourceAlias);\n if (!propertyClass) {\n throw new Error(`Class with alias \"${sourceAlias}\" not found.`);\n }\n const property = await propertyClass.getProperty(rule.propertyName);\n if (!property) {\n throw new Error(`Property \"${rule.propertyName}\" not found in ECClass \"${propertyClass.fullName}\".`);\n }\n\n const propertyValueSelector = ECSql.createRawPropertyValueSelector(sourceAlias, property.name);\n if (isUnaryRuleOperator(rule.operator)) {\n switch (rule.operator) {\n case \"is-true\":\n return propertyValueSelector;\n case \"is-false\":\n return `NOT ${propertyValueSelector}`;\n case \"is-null\":\n return `${propertyValueSelector} IS NULL`;\n case \"is-not-null\":\n return `${propertyValueSelector} IS NOT NULL`;\n }\n }\n const ecsqlOperator = getECSqlComparisonOperator(rule.operator);\n if (rule.value === undefined) {\n throw new Error(`Rule \"${rule.propertyName}\" ${ecsqlOperator} is missing value.`);\n }\n\n const value = rule.value.rawValue;\n\n if (rule.operator === \"like\" && typeof value === \"string\") {\n const escapedValue = value.replace(/[%_\\\\]/g, \"\\\\$&\");\n return `${propertyValueSelector} ${ecsqlOperator} '%${escapedValue}%' ESCAPE '\\\\'`;\n }\n\n if (property.isNavigation()) {\n assert(GenericInstanceFilterRuleValue.isInstanceKey(value));\n return `${propertyValueSelector}.[Id] ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value.id)}`;\n }\n if (property.isEnumeration()) {\n assert(!GenericInstanceFilterRuleValue.isInstanceKey(value));\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n if (property.isPrimitive()) {\n assert(!GenericInstanceFilterRuleValue.isInstanceKey(value));\n switch (property.primitiveType) {\n case \"Point2d\": {\n assert(rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\");\n assert(PrimitiveValue.isPoint2d(value));\n const condition = `\n ${createFloatingPointEqualityClause(`${propertyValueSelector}.[x]`, \"is-equal\", value.x)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[y]`, \"is-equal\", value.y)}\n `;\n return rule.operator === \"is-equal\" ? condition : `NOT (${condition})`;\n }\n case \"Point3d\": {\n assert(rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\");\n assert(PrimitiveValue.isPoint3d(value));\n const condition = `\n ${createFloatingPointEqualityClause(`${propertyValueSelector}.[x]`, \"is-equal\", value.x)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[y]`, \"is-equal\", value.y)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[z]`, \"is-equal\", value.z)}\n `;\n return rule.operator === \"is-equal\" ? condition : `NOT (${condition})`;\n }\n case \"Double\": {\n assert(typeof value === \"number\");\n if (rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\") {\n return `${createFloatingPointEqualityClause(propertyValueSelector, rule.operator, value)}`;\n }\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n default: {\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n }\n }\n throw new Error(\"Struct and array properties are not supported for filtering\");\n}\n\nfunction createFloatingPointEqualityClause(valueSelector: string, operator: \"is-equal\" | \"is-not-equal\", value: number) {\n const [from, to] = getFloatingPointValueRange(value);\n return `${valueSelector} ${operator === \"is-not-equal\" ? \"NOT \" : \"\"} BETWEEN ${from} AND ${to}`;\n}\n\nfunction getFloatingPointValueRange(value: number): [number, number] {\n return [value - Number.EPSILON, value + Number.EPSILON];\n}\n\nfunction getECSqlLogicalOperator(op: GenericInstanceFilterRuleGroupOperator) {\n switch (op) {\n case \"and\":\n return \"AND\";\n case \"or\":\n return \"OR\";\n }\n}\n\nfunction isUnaryRuleOperator(\n op: GenericInstanceFilterRuleOperator,\n): op is Extract<GenericInstanceFilterRuleOperator, \"is-true\" | \"is-false\" | \"is-null\" | \"is-not-null\"> {\n return op === \"is-true\" || op === \"is-false\" || op === \"is-null\" || op === \"is-not-null\";\n}\n\nfunction getECSqlComparisonOperator(op: Exclude<GenericInstanceFilterRuleOperator, \"is-true\" | \"is-false\" | \"is-null\" | \"is-not-null\">) {\n switch (op) {\n case \"is-equal\":\n return `=`;\n case \"is-not-equal\":\n return `<>`;\n case \"greater\":\n return `>`;\n case \"greater-or-equal\":\n return `>=`;\n case \"less\":\n return `<`;\n case \"less-or-equal\":\n return `<=`;\n case \"like\":\n return `LIKE`;\n }\n}\n\ntype JoinRelationshipPath = Props<typeof ECSql.createRelationshipPathJoinClause>[\"path\"];\nfunction assignRelationshipPathAliases(\n path: GenericInstanceFilterRelationshipStep[],\n pathIndex: number,\n sourceAlias: string,\n targetAlias: string,\n): JoinRelationshipPath {\n function createAlias(fullClassName: EC.FullClassName, index: number) {\n return `rel_${pathIndex}_${fullClassName.replaceAll(/[\\.:]/g, \"_\")}_${index}`;\n }\n const result: JoinRelationshipPath = [];\n path.forEach((step, i) => {\n const sourceClassName = normalizeFullClassName(step.sourceClassName);\n const targetClassName = normalizeFullClassName(step.targetClassName);\n const relationshipName = normalizeFullClassName(step.relationshipClassName);\n result.push({\n targetClassName,\n relationshipName,\n sourceClassName,\n relationshipReverse: !step.isForwardRelationship,\n sourceAlias: i === 0 ? sourceAlias : result[i - 1].targetAlias,\n relationshipAlias: createAlias(relationshipName, i),\n targetAlias: i === path.length - 1 ? targetAlias : createAlias(targetClassName, i),\n joinType: \"inner\",\n });\n });\n return result;\n}\n\ninterface SpecializeContentClassProps {\n classHierarchyInspector: ECClassHierarchyInspector;\n contentClassName: EC.FullClassName;\n filterClassNames: EC.FullClassName[];\n}\nasync function specializeContentClass(props: SpecializeContentClassProps): Promise<EC.FullClassName | undefined> {\n const filterClass = await getSpecializedPropertyClass(props.classHierarchyInspector, props.filterClassNames);\n if (!filterClass) {\n return props.contentClassName;\n }\n if (await props.classHierarchyInspector.classDerivesFrom(filterClass, props.contentClassName)) {\n return filterClass;\n }\n if (await props.classHierarchyInspector.classDerivesFrom(props.contentClassName, filterClass)) {\n return props.contentClassName;\n }\n return undefined;\n}\n\nasync function getSpecializedPropertyClass(\n classHierarchyInspector: ECClassHierarchyInspector,\n classes: EC.FullClassName[],\n): Promise<EC.FullClassName | undefined> {\n if (classes.length === 0) {\n return undefined;\n }\n const [currClassName, ...restClasses] = classes;\n let resolvedClassName = currClassName;\n for (const propClassName of restClasses) {\n if (await classHierarchyInspector.classDerivesFrom(propClassName, resolvedClassName)) {\n resolvedClassName = propClassName;\n }\n }\n return resolvedClassName;\n}\n\ninterface HiddenClassNode {\n fullName: EC.FullClassName;\n state: \"hide\" | \"show\";\n children: HiddenClassNode[];\n}\n\nasync function getHiddenClassesTree(selectClass: EC.Class, selectClassAttribute: \"show\" | \"hide\" = \"show\"): Promise<HiddenClassNode[]> {\n const derivedClasses = await getDirectDerivedClasses(selectClass);\n\n const derivedClassSchemas = derivedClasses.reduce(\n (acc, ecClass) => {\n if (!acc.set.has(ecClass.schema.name)) {\n acc.schemas.push(ecClass.schema);\n acc.set.add(ecClass.schema.name);\n }\n return acc;\n },\n { set: new Set<string>(), schemas: new Array<EC.Schema>() },\n ).schemas;\n const hiddenSchemas = new Map<string, \"hide\" | \"show\" | undefined>();\n await Promise.all(\n derivedClassSchemas.map(async (ecSchema) => {\n hiddenSchemas.set(ecSchema.name, await getHiddenSchemaAttribute(ecSchema));\n }),\n );\n\n const tree = (\n await Promise.all(\n derivedClasses.map(async (ecClass): Promise<HiddenClassNode[]> => {\n const hiddenClassAttr = await getHiddenClassAttribute(ecClass);\n const attr = hiddenClassAttr ?? hiddenSchemas.get(ecClass.schema.name);\n if (!attr || attr === selectClassAttribute) {\n return getHiddenClassesTree(ecClass, selectClassAttribute);\n }\n return [\n {\n fullName: ecClass.fullName,\n state: attr,\n children: await getHiddenClassesTree(ecClass, attr),\n },\n ];\n }),\n )\n ).flat();\n return tree;\n}\n\nasync function getDirectDerivedClasses(ecClass: EC.Class): Promise<EC.Class[]> {\n const allDerived = await ecClass.getDerivedClasses();\n return (await Promise.all(allDerived.map(async (c) => ({ derived: c, base: await c.baseClass }))))\n .filter(({ base }) => base && compareFullClassNames(base.fullName, ecClass.fullName) === 0)\n .map(({ derived }) => derived);\n}\n\nasync function getHiddenClassAttribute(ecClass: EC.Class): Promise<\"hide\" | \"show\" | undefined> {\n const customAttributes = await ecClass.getCustomAttributes();\n const hiddenClassAttribute = customAttributes.get(\"CoreCustomAttributes.HiddenClass\");\n return hiddenClassAttribute ? (hiddenClassAttribute.Show ? \"show\" : \"hide\") : undefined;\n}\n\nasync function getHiddenSchemaAttribute(ecSchema: EC.Schema): Promise<\"hide\" | \"show\" | undefined> {\n const customAttributes = await ecSchema.getCustomAttributes();\n const hiddenSchemaAttribute = customAttributes.get(\"CoreCustomAttributes.HiddenSchema\");\n return hiddenSchemaAttribute ? (hiddenSchemaAttribute.ShowClasses ? \"show\" : \"hide\") : undefined;\n}\n\nfunction createWhereClauseForHiddenClasses(hiddenClasses: HiddenClassNode[], selectAlias: string): { showClause?: string; hideClause?: string } {\n const res: { showClause?: string; hideClause?: string } = {};\n\n const show = hiddenClasses.filter(({ state }) => state === \"show\");\n if (show.length > 0) {\n let showClause = `[${selectAlias}].[ECClassId] IS (${show\n .map(({ fullName }) => parseFullClassName(fullName))\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")})`;\n const childClauses = createWhereClauseForHiddenClasses(\n show.flatMap(({ children }) => children),\n selectAlias,\n );\n if (childClauses.hideClause) {\n showClause = `(${showClause} AND ${childClauses.hideClause})`;\n }\n res.showClause = showClause;\n }\n\n const hide = hiddenClasses.filter(({ state }) => state === \"hide\");\n if (hide.length > 0) {\n let hideClause = `[${selectAlias}].[ECClassId] IS NOT (${hide\n .map(({ fullName }) => parseFullClassName(fullName))\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")})`;\n const childClauses = createWhereClauseForHiddenClasses(\n hide.flatMap(({ children }) => children),\n selectAlias,\n );\n if (childClauses.showClause) {\n hideClause = `(${hideClause} OR ${childClauses.showClause})`;\n }\n res.hideClause = hideClause;\n }\n\n return res;\n}\n\nasync function tryGetClass(schemaProvider: ECSchemaProvider, fullClassName: EC.FullClassName): Promise<EC.Class | undefined> {\n try {\n return await getClass(schemaProvider, fullClassName);\n } catch (e) {\n if (isSchemaOrClassNotFoundError(e)) {\n return undefined;\n }\n /* c8 ignore next 2 */\n throw e;\n }\n}\nfunction isSchemaOrClassNotFoundError(e: unknown): e is Error {\n return e instanceof Error && (!!e.message.match(/^Schema \"[\\w\\d_]+\" not found/) || !!e.message.match(/^Class \"[\\w\\d_\\.:]+\" not found/));\n}\nfunction isPropertyNotFoundError(e: unknown): e is Error {\n return e instanceof Error && !!e.message.match(/^Property \"[\\w\\d]+\" not found in ECClass/);\n}\n"]}
1
+ {"version":3,"file":"NodeSelectQueryFactory.js","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/NodeSelectQueryFactory.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 { assert } from \"@itwin/core-bentley\";\nimport { GenericInstanceFilter, GenericInstanceFilterRuleValue } from \"@itwin/core-common\";\nimport {\n compareFullClassNames,\n ECSql,\n getClass,\n normalizeFullClassName,\n parseFullClassName,\n PrimitiveValue,\n} from \"@itwin/presentation-shared\";\n\nimport type { Id64String } from \"@itwin/core-bentley\";\nimport type {\n GenericInstanceFilterRelationshipStep,\n GenericInstanceFilterRule,\n GenericInstanceFilterRuleGroup,\n GenericInstanceFilterRuleGroupOperator,\n GenericInstanceFilterRuleOperator,\n} from \"@itwin/core-common\";\nimport type {\n EC,\n ECClassHierarchyInspector,\n ECSchemaProvider,\n IInstanceLabelSelectClauseFactory,\n Props,\n} from \"@itwin/presentation-shared\";\nimport type { HierarchyNodeAutoExpandProp } from \"./IModelHierarchyNode.js\";\n\n/**\n * Column names of the SELECT clause created by `NodeSelectClauseFactory`. Order of the names matches the order of columns\n * created by the factory.\n *\n * @public\n */\nexport enum NodeSelectClauseColumnNames {\n /** Full class name of the instance the node represents. Type: `string` in format `{schema name}:{class name}`. */\n FullClassName = \"FullClassName\",\n /** ECInstance ID of the instance the node represents. Type: `Id64String`. */\n ECInstanceId = \"ECInstanceId\",\n /** Display label. Type: `string`. */\n DisplayLabel = \"DisplayLabel\",\n /**\n * A flag indicating if the node has children. Type: `boolean`. Values:\n * - `false` - node never has children.\n * - `true` - node always has children.\n * - NULL - unknown, needs to be determined by requesting children for the node.\n */\n HasChildren = \"HasChildren\",\n /** A flag indicating that a node should be hidden if it has no children. Type: `boolean`. */\n HideIfNoChildren = \"HideIfNoChildren\",\n /** A flag indicating that a node should be hidden and its children should be displayed instead. Type: `boolean`. */\n HideNodeInHierarchy = \"HideNodeInHierarchy\",\n /** A serialized JSON object for providing grouping information. */\n Grouping = \"Grouping\",\n /** A serialized JSON object for associating a node with additional data. */\n ExtendedData = \"ExtendedData\",\n /** A flag indicating the node should be auto-expanded when it's loaded. */\n AutoExpand = \"AutoExpand\",\n /** A flag indicating the node supports child hierarchy level filtering. */\n SupportsFiltering = \"SupportsFiltering\",\n}\n\n/**\n * A data structure for defining an ECSQL value selector.\n * @public\n */\ninterface ECSqlValueSelector {\n selector: string;\n}\n\n/**\n * Props for `NodeSelectClauseFactory.createSelectClause`.\n * @public\n */\ninterface NodeSelectClauseProps {\n ecClassId: ECSqlValueSelector;\n ecInstanceId: ECSqlValueSelector;\n nodeLabel: string | ECSqlValueSelector | { of: Props<IInstanceLabelSelectClauseFactory[\"createSelectClause\"]> };\n extendedData?: { [key: string]: Id64String | string | number | boolean | ECSqlValueSelector };\n autoExpand?: boolean | ECSqlValueSelector;\n supportsFiltering?: boolean | ECSqlValueSelector;\n hasChildren?: boolean | ECSqlValueSelector;\n hideNodeInHierarchy?: boolean | ECSqlValueSelector;\n hideIfNoChildren?: boolean | ECSqlValueSelector;\n grouping?: ECSqlSelectClauseGroupingParams;\n}\n\n/**\n * A data structure for defining nodes' grouping requirements.\n * @public\n */\ninterface ECSqlSelectClauseGroupingParams {\n byLabel?: ECSqlSelectClauseLabelGroupingParams;\n byClass?: boolean | ECSqlSelectClauseGroupingParamsBase | ECSqlValueSelector;\n byBaseClasses?: ECSqlSelectClauseBaseClassGroupingParams;\n byProperties?: ECSqlSelectClausePropertiesGroupingParams;\n}\n\n/**\n * A data structure for defining label grouping params.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingBaseParams {\n /** Label grouping option that determines whether to group nodes or to merge them. Defaults to \"group\".*/\n action?: \"group\" | \"merge\";\n /** Id that needs to match for nodes to be grouped or merged.*/\n groupId?: string | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining label merging.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingMergeParams extends ECSqlSelectClauseLabelGroupingBaseParams {\n action: \"merge\";\n}\n\n/**\n * A data structure for defining label grouping.\n * @public\n */\ninterface ECSqlSelectClauseLabelGroupingGroupParams\n extends ECSqlSelectClauseLabelGroupingBaseParams, ECSqlSelectClauseGroupingParamsBase {\n action?: \"group\";\n}\n\n/**\n * A data structure for defining possible label grouping types.\n * @public\n */\ntype ECSqlSelectClauseLabelGroupingParams =\n | boolean\n | ECSqlValueSelector\n | ECSqlSelectClauseLabelGroupingMergeParams\n | ECSqlSelectClauseLabelGroupingGroupParams;\n\n/**\n * A data structure for defining base grouping parameters shared across all types of grouping.\n * @public\n */\ninterface ECSqlSelectClauseGroupingParamsBase {\n hideIfNoSiblings?: boolean | ECSqlValueSelector;\n hideIfOneGroupedNode?: boolean | ECSqlValueSelector;\n autoExpand?: HierarchyNodeAutoExpandProp | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining properties grouping.\n * @public\n */\ninterface ECSqlSelectClausePropertiesGroupingParams extends ECSqlSelectClauseGroupingParamsBase {\n /**\n * Full name of a class whose properties are used to group the node. Only has effect if the node\n * represents an instance of that class.\n *\n * Full class name format: `SchemaName.ClassName`.\n */\n propertiesClassName: EC.FullClassName;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value is not set or is set to an empty string.\n *\n * Label of the created grouping node will be `Not Specified`.\n */\n createGroupForUnspecifiedValues?: boolean | ECSqlValueSelector;\n /**\n * Property grouping option that determines whether to group nodes whose grouping value doesn't fit within any of the provided\n * ranges, or is not a numeric value.\n *\n * Label of the created grouping node will be `Other`.\n */\n createGroupForOutOfRangeValues?: boolean | ECSqlValueSelector;\n /**\n * Properties of the specified class, by which the nodes should be grouped.\n *\n * Example usage:\n * ```ts\n * propertyGroups: [\n * {\n * propertyName: \"type\",\n * propertyClassAlias: \"this\"\n * },\n * {\n * propertyName: \"length\",\n * propertyClassAlias: \"x\",\n * ranges: [\n * { fromValue: 1, toValue: 10, rangeLabel: \"Small\" },\n * { fromValue: 11, toValue: 20, rangeLabel: \"Medium\" }\n * ]\n * },\n * ]\n * ```\n */\n propertyGroups: ECSqlSelectClausePropertyGroup[];\n}\n\n/**\n * A data structure for defining specific properties' grouping params.\n * @public\n */\ninterface ECSqlSelectClausePropertyGroup {\n /** A string indicating the name of the property to group by. */\n propertyName: string;\n /** Alias to of the class containing the property. Used to select the property value. */\n propertyClassAlias: string;\n /** Ranges are used to group nodes by numeric properties which are within specified bounds. */\n ranges?: ECSqlSelectClausePropertyValueRange[];\n}\n\n/**\n * A data structure for defining boundaries for a value.\n * @public\n */\ninterface ECSqlSelectClausePropertyValueRange {\n /** Defines the lower bound of the range. */\n fromValue: number | ECSqlValueSelector;\n /** Defines the upper bound of the range. */\n toValue: number | ECSqlValueSelector;\n /** Defines the range label. Will be used as grouping node's display label. */\n rangeLabel?: string | ECSqlValueSelector;\n}\n\n/**\n * A data structure for defining base class grouping.\n * @public\n */\ninterface ECSqlSelectClauseBaseClassGroupingParams extends ECSqlSelectClauseGroupingParamsBase {\n fullClassNames: EC.FullClassName[] | ECSqlValueSelector[];\n}\n\n/**\n * An interface of a factory that knows how to create nodes' select ECSQL query.\n * @public\n */\nexport interface NodesQueryClauseFactory {\n /** Create a SELECT clause in a format understood by nodes query parser used by `HierarchyProvider`. */\n createSelectClause(props: NodeSelectClauseProps): Promise<string>;\n\n /**\n * Creates the necessary ECSQL snippets to create an instance filter described by the given `GenericInstanceFilter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter OR referenced schema items (classes/properties)\n * don't exist in the iModel, a special result is returned to make sure the resulting query is valid and doesn't return anything.\n */\n createFilterClauses(props: {\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter?: GenericInstanceFilter;\n }): Promise<{ from: string; where: string; joins: string }>;\n}\n\n/**\n * Creates an instance of `NodeSelectQueryFactory`.\n */\nexport function createNodesQueryClauseFactory(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n}): NodesQueryClauseFactory {\n return new NodeSelectQueryFactory(props);\n}\n\n/** A factory for creating a nodes' select ECSQL query. */\nclass NodeSelectQueryFactory {\n private _imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n private _instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n\n public constructor(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory;\n }) {\n this._imodelAccess = props.imodelAccess;\n this._instanceLabelSelectClauseFactory = props.instanceLabelSelectClauseFactory;\n }\n\n /** Create a SELECT clause in a format understood by results reader of the library. */\n public async createSelectClause(props: NodeSelectClauseProps) {\n // note: the columns order must match the order in `NodeSelectClauseColumnNames`\n return `\n ec_ClassName(${props.ecClassId.selector}) AS ${NodeSelectClauseColumnNames.FullClassName},\n ${props.ecInstanceId.selector} AS ${NodeSelectClauseColumnNames.ECInstanceId},\n ${createECSqlValueSelector(\n typeof props.nodeLabel === \"object\" && \"of\" in props.nodeLabel\n ? { selector: await this._instanceLabelSelectClauseFactory.createSelectClause(props.nodeLabel.of) }\n : props.nodeLabel,\n )} AS ${NodeSelectClauseColumnNames.DisplayLabel},\n CAST(${createECSqlValueSelector(props.hasChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HasChildren},\n CAST(${createECSqlValueSelector(props.hideIfNoChildren)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideIfNoChildren},\n CAST(${createECSqlValueSelector(props.hideNodeInHierarchy)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.HideNodeInHierarchy},\n ${props.grouping ? await createGroupingSelector(props.grouping, this._imodelAccess, this._instanceLabelSelectClauseFactory) : \"CAST(NULL AS TEXT)\"} AS ${NodeSelectClauseColumnNames.Grouping},\n ${\n props.extendedData\n ? `json_object(${Object.entries(props.extendedData)\n .map(([key, value]) => `'${key}', ${createECSqlValueSelector(value)}`)\n .join(\", \")})`\n : \"CAST(NULL AS TEXT)\"\n } AS ${NodeSelectClauseColumnNames.ExtendedData},\n CAST(${createECSqlValueSelector(props.autoExpand)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.AutoExpand},\n CAST(${createECSqlValueSelector(props.supportsFiltering)} AS BOOLEAN) AS ${NodeSelectClauseColumnNames.SupportsFiltering}\n `;\n }\n\n /**\n * Creates the necessary ECSQL snippets to create an instance filter described by the `filter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter OR referenced schema items (classes/properties)\n * don't exist in the iModel, a special result is returned to make sure the resulting query is valid and doesn't return anything.\n */\n public async createFilterClauses(props: {\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter?: GenericInstanceFilter;\n }): Promise<{ from: string; where: string; joins: string }> {\n const { contentClass, filter } = props;\n const { from, joins, where } = filter\n ? await createInstanceFilterClauses({ imodelAccess: this._imodelAccess, contentClass, filter })\n : { from: contentClass.fullName, joins: [], where: [] };\n\n const fromClass = await getClass(this._imodelAccess, normalizeFullClassName(from));\n const hiddenClasses = await getHiddenClassesTree(fromClass);\n const hiddenClassesWhereClause = createWhereClauseForHiddenClasses(hiddenClasses, contentClass.alias);\n hiddenClassesWhereClause.hideClause && where.push(hiddenClassesWhereClause.hideClause);\n assert(!hiddenClassesWhereClause.showClause, \"`showClause` is expected to always be empty here\");\n\n return { from, joins: joins.join(\"\\n\"), where: where.join(\" AND \") };\n }\n}\n\n/**\n * Creates the necessary ECSQL snippets to create an instance filter described by the `filter` argument.\n * - `from` is set to either the `contentClass.fullName` or one of `filter.propertyClassNames`, depending on which is more specific.\n * - `joins` is set to a number of `JOIN` clauses required to join all relationships described by `filter.relatedInstances`.\n * - `where` is set to a `WHERE` clause (without the `WHERE` keyword) that filters instances by classes on\n * `filter.filterClassNames` and by properties as described by `filter.rules`.\n *\n * Special cases:\n * - If `filter` is `undefined`, `joins` and `where` are set to empty strings and `from` is set to `contentClass.fullName`.\n * - If the provided content class doesn't intersect with the property class in provided filter, a special result\n * is returned to make sure the resulting query is valid and doesn't return anything.\n */\nasync function createInstanceFilterClauses(props: {\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector;\n contentClass: { fullName: EC.FullClassName; alias: string };\n filter: GenericInstanceFilter;\n}): Promise<{ from: EC.FullClassName; where: string[]; joins: string[] }> {\n const { imodelAccess, contentClass, filter } = props;\n\n // In some cases the given filter means we want the query to return nothing - e.g. when filtering by classes that don't intersect\n // with the given content class. Return a special result that makes sure the resulting query is valid, but returns no rows.\n const DISABLE_QUERY = { from: contentClass.fullName, joins: [], where: [\"FALSE\"] };\n\n const from = await specializeContentClass({\n classHierarchyInspector: {\n async classDerivesFrom(derivedClassName: EC.FullClassName, baseClassName: EC.FullClassName): Promise<boolean> {\n try {\n return await imodelAccess.classDerivesFrom(derivedClassName, baseClassName);\n } catch (e) {\n /* v8 ignore else -- @preserve */\n if (isSchemaOrClassNotFoundError(e)) {\n // either derived or base class doesn't exist in this iModel\n return false;\n }\n\n /* v8 ignore next -- @preserve */\n throw e;\n }\n },\n },\n contentClassName: contentClass.fullName,\n filterClassNames: filter.propertyClassNames.map(normalizeFullClassName),\n });\n if (!from) {\n // filter class doesn't intersect with content class\n return DISABLE_QUERY;\n }\n\n let filteredClassNamesInThisIModel: EC.FullClassName[] | undefined;\n if (filter.filteredClassNames && filter.filteredClassNames.length > 0) {\n filteredClassNamesInThisIModel = (\n await Promise.all(\n filter.filteredClassNames\n .map(normalizeFullClassName)\n .map(async (fullClassName) => ({\n fullClassName,\n filteredClass: await tryGetClass(imodelAccess, fullClassName),\n })),\n )\n )\n .filter(({ filteredClass }) => !!filteredClass)\n .map(({ fullClassName }) => fullClassName);\n\n if (filteredClassNamesInThisIModel.length === 0) {\n // we had filter classes, but none of them exist in this iModel\n return DISABLE_QUERY;\n }\n }\n\n let joins: string[] | undefined;\n try {\n joins = await Promise.all(\n filter.relatedInstances.map(async (rel, i) => {\n const res = await ECSql.createRelationshipPathJoinClause({\n schemaProvider: imodelAccess,\n path: assignRelationshipPathAliases(rel.path, i, contentClass.alias, rel.alias),\n });\n assert(!res.bindings, \"Expecting no bindings as the relationship path has no instance filter.\");\n return res.joins;\n }),\n );\n } catch (e) {\n /* v8 ignore else -- @preserve */\n if (isSchemaOrClassNotFoundError(e)) {\n // at least one related instance spec uses a class that doesn't exist in this iModel\n return DISABLE_QUERY;\n }\n\n /* v8 ignore next -- @preserve */\n throw e;\n }\n\n const classAliasMap = new Map<string, EC.FullClassName>([[contentClass.alias, from]]);\n filter.relatedInstances.forEach(\n ({ path, alias }) =>\n path.length > 0 && classAliasMap.set(alias, normalizeFullClassName(path[path.length - 1].targetClassName)),\n );\n let propertiesFilter: string | undefined;\n try {\n propertiesFilter = await createWhereClause(\n contentClass.alias,\n async (alias) => {\n const aliasClassName = classAliasMap.get(alias);\n return aliasClassName ? getClass(imodelAccess, aliasClassName) : undefined;\n },\n filter.rules,\n );\n } catch (e) {\n // note: don't need to worry about schemas & classes here, because that's taken care of above, when\n // validating property class names & related instance defs\n /* v8 ignore else -- @preserve */\n if (isPropertyNotFoundError(e)) {\n // filter uses a property that doesn't exist in this iModel\n return DISABLE_QUERY;\n }\n\n /* v8 ignore next -- @preserve */\n throw e;\n }\n\n const where = new Array<string>();\n if (filteredClassNamesInThisIModel) {\n where.push(\n `${ECSql.createRawPropertyValueSelector(contentClass.alias, \"ECClassId\")} IS (\n ${filteredClassNamesInThisIModel\n .map(parseFullClassName)\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")}\n )`,\n );\n }\n if (propertiesFilter) {\n where.push(propertiesFilter);\n }\n\n return { from, joins, where };\n}\n\nfunction createECSqlValueSelector(input: undefined | PrimitiveValue | ECSqlValueSelector) {\n if (input === undefined) {\n return \"NULL\";\n }\n if (isSelector(input)) {\n return input.selector;\n }\n return ECSql.createRawPrimitiveValueSelector(input);\n}\n\nfunction isSelector(x: any): x is ECSqlValueSelector {\n return !!x.selector;\n}\n\nasync function createGroupingSelector(\n grouping: ECSqlSelectClauseGroupingParams,\n imodelAccess: ECSchemaProvider & ECClassHierarchyInspector,\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory,\n): Promise<string> {\n const groupingSelectors = new Array<{ key: string; selector: string }>();\n\n grouping.byLabel &&\n groupingSelectors.push({\n key: \"byLabel\",\n selector:\n typeof grouping.byLabel === \"boolean\" || isSelector(grouping.byLabel)\n ? createECSqlValueSelector(grouping.byLabel)\n : serializeJsonObject(createLabelGroupingBaseParamsSelectors(grouping.byLabel)),\n });\n\n grouping.byClass &&\n groupingSelectors.push({\n key: \"byClass\",\n selector:\n typeof grouping.byClass === \"boolean\" || isSelector(grouping.byClass)\n ? createECSqlValueSelector(grouping.byClass)\n : serializeJsonObject(createBaseGroupingParamSelectors(grouping.byClass)),\n });\n\n grouping.byBaseClasses &&\n groupingSelectors.push({\n key: \"byBaseClasses\",\n selector: serializeJsonObject([\n {\n key: \"fullClassNames\",\n selector: `json_array(${grouping.byBaseClasses.fullClassNames.map((className) => createECSqlValueSelector(className)).join(\", \")})`,\n },\n ...createBaseGroupingParamSelectors(grouping.byBaseClasses),\n ]),\n });\n\n // TODO: MISSING_COVERAGE\n /* v8 ignore else -- @preserve */\n if (grouping.byProperties) {\n const propertyClass = await getClass(imodelAccess, grouping.byProperties.propertiesClassName);\n groupingSelectors.push({\n key: \"byProperties\",\n selector: serializeJsonObject([\n {\n key: \"propertiesClassName\",\n selector: `${createECSqlValueSelector(grouping.byProperties.propertiesClassName)}`,\n },\n {\n key: \"propertyGroups\",\n selector: `json_array(${(\n await Promise.all(\n grouping.byProperties.propertyGroups.map(async (propertyGroup) =>\n serializeJsonObject(\n await createPropertyGroupSelectors(propertyGroup, propertyClass, instanceLabelSelectClauseFactory),\n ),\n ),\n )\n ).join(\", \")})`,\n },\n ...(grouping.byProperties.createGroupForOutOfRangeValues !== undefined\n ? [\n {\n key: \"createGroupForOutOfRangeValues\",\n selector: `CAST(${createECSqlValueSelector(grouping.byProperties.createGroupForOutOfRangeValues)} AS BOOLEAN)`,\n },\n ]\n : []),\n ...(grouping.byProperties.createGroupForUnspecifiedValues !== undefined\n ? [\n {\n key: \"createGroupForUnspecifiedValues\",\n selector: `CAST(${createECSqlValueSelector(grouping.byProperties.createGroupForUnspecifiedValues)} AS BOOLEAN)`,\n },\n ]\n : []),\n ...createBaseGroupingParamSelectors(grouping.byProperties),\n ]),\n });\n }\n\n return serializeJsonObject(groupingSelectors);\n}\n\nfunction createLabelGroupingBaseParamsSelectors(\n byLabel: ECSqlSelectClauseLabelGroupingMergeParams | ECSqlSelectClauseLabelGroupingGroupParams,\n) {\n const selectors = new Array<{ key: string; selector: string }>();\n if (byLabel.action !== undefined) {\n selectors.push({ key: \"action\", selector: `${createECSqlValueSelector(byLabel.action)}` });\n }\n if (byLabel.groupId !== undefined) {\n selectors.push({ key: \"groupId\", selector: createECSqlValueSelector(byLabel.groupId) });\n }\n if (byLabel.action !== \"merge\") {\n selectors.push(...createBaseGroupingParamSelectors(byLabel));\n }\n\n return selectors;\n}\n\nasync function createPropertyGroupSelectors(\n propertyGroup: ECSqlSelectClausePropertyGroup,\n propertyClass: EC.Class,\n instanceLabelSelectClauseFactory: IInstanceLabelSelectClauseFactory,\n) {\n const selectors = new Array<{ key: string; selector: string }>();\n selectors.push({ key: \"propertyName\", selector: `${createECSqlValueSelector(propertyGroup.propertyName)}` });\n\n const property = await propertyClass.getProperty(propertyGroup.propertyName);\n if (!property) {\n throw new Error(`Property \"${propertyGroup.propertyName}\" not found in ECClass \"${propertyClass.fullName}\".`);\n }\n\n if (property.isNavigation()) {\n const relationshipClass = await property.relationshipClass;\n const abstractConstraint =\n property.direction === \"Forward\"\n ? await relationshipClass.target.abstractConstraint\n : await relationshipClass.source.abstractConstraint;\n // TODO: MISSING_COVERAGE\n /* v8 ignore else -- @preserve */\n if (!abstractConstraint) {\n throw new Error(`Could not determine class name for navigation property with direction \"${property.direction}\".`);\n }\n\n const fullName = abstractConstraint.fullName;\n const targetAlias = \"target\";\n selectors.push({\n key: \"propertyValue\",\n selector: `(\n SELECT ${await instanceLabelSelectClauseFactory.createSelectClause({ className: fullName, classAlias: targetAlias })}\n FROM ${fullName} AS ${targetAlias}\n WHERE [${targetAlias}].[ECInstanceId] = [${propertyGroup.propertyClassAlias}].[${propertyGroup.propertyName}].[Id]\n )`,\n });\n } else {\n selectors.push({\n key: \"propertyValue\",\n selector: `[${propertyGroup.propertyClassAlias}].[${propertyGroup.propertyName}]`,\n });\n }\n\n if (propertyGroup.ranges) {\n selectors.push(createRangeParamSelectors(propertyGroup.ranges));\n }\n\n return selectors;\n}\n\nfunction createRangeParamSelectors(ranges: ECSqlSelectClausePropertyValueRange[]) {\n return {\n key: \"ranges\",\n selector: `json_array(${ranges\n .map((range) =>\n serializeJsonObject([\n { key: \"fromValue\", selector: createECSqlValueSelector(range.fromValue) },\n { key: \"toValue\", selector: createECSqlValueSelector(range.toValue) },\n ...(range.rangeLabel\n ? [{ key: \"rangeLabel\", selector: `${createECSqlValueSelector(range.rangeLabel)}` }]\n : []),\n ]),\n )\n .join(\", \")})`,\n };\n}\n\nfunction createBaseGroupingParamSelectors(params: ECSqlSelectClauseGroupingParamsBase) {\n const selectors = new Array<{ key: string; selector: string }>();\n if (params.hideIfNoSiblings !== undefined) {\n selectors.push({ key: \"hideIfNoSiblings\", selector: createECSqlValueSelector(params.hideIfNoSiblings) });\n }\n if (params.hideIfOneGroupedNode !== undefined) {\n selectors.push({ key: \"hideIfOneGroupedNode\", selector: createECSqlValueSelector(params.hideIfOneGroupedNode) });\n }\n if (params.autoExpand !== undefined) {\n selectors.push({ key: \"autoExpand\", selector: createECSqlValueSelector(params.autoExpand) });\n }\n return selectors;\n}\n\nfunction serializeJsonObject(selectors: Array<{ key: string; selector: string }>): string {\n return `json_object(${selectors.map(({ key, selector }) => `'${key}', ${selector}`).join(\", \")})`;\n}\n\nasync function createWhereClause(\n contentClassAlias: string,\n classLoader: (alias: string) => Promise<EC.Class | undefined>,\n rule: GenericInstanceFilterRule | GenericInstanceFilterRuleGroup,\n): Promise<string | undefined> {\n if (GenericInstanceFilter.isFilterRuleGroup(rule)) {\n const clause = (\n await Promise.all(rule.rules.map(async (r) => createWhereClause(contentClassAlias, classLoader, r)))\n )\n .filter((c) => !!c)\n .join(` ${getECSqlLogicalOperator(rule.operator)} `);\n return clause ? (rule.operator === \"or\" ? `(${clause})` : clause) : undefined;\n }\n\n const sourceAlias = rule.sourceAlias ? rule.sourceAlias : contentClassAlias;\n const propertyClass = await classLoader(sourceAlias);\n if (!propertyClass) {\n throw new Error(`Class with alias \"${sourceAlias}\" not found.`);\n }\n const property = await propertyClass.getProperty(rule.propertyName);\n if (!property) {\n throw new Error(`Property \"${rule.propertyName}\" not found in ECClass \"${propertyClass.fullName}\".`);\n }\n\n const propertyValueSelector = ECSql.createRawPropertyValueSelector(sourceAlias, property.name);\n if (isUnaryRuleOperator(rule.operator)) {\n switch (rule.operator) {\n case \"is-true\":\n return propertyValueSelector;\n case \"is-false\":\n return `NOT ${propertyValueSelector}`;\n case \"is-null\":\n return `${propertyValueSelector} IS NULL`;\n case \"is-not-null\":\n return `${propertyValueSelector} IS NOT NULL`;\n }\n }\n const ecsqlOperator = getECSqlComparisonOperator(rule.operator);\n if (rule.value === undefined) {\n throw new Error(`Rule \"${rule.propertyName}\" ${ecsqlOperator} is missing value.`);\n }\n\n const value = rule.value.rawValue;\n\n if (rule.operator === \"like\" && typeof value === \"string\") {\n const escapedValue = value.replace(/[%_\\\\]/g, \"\\\\$&\");\n return `${propertyValueSelector} ${ecsqlOperator} '%${escapedValue}%' ESCAPE '\\\\'`;\n }\n\n if (property.isNavigation()) {\n assert(GenericInstanceFilterRuleValue.isInstanceKey(value));\n return `${propertyValueSelector}.[Id] ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value.id)}`;\n }\n if (property.isEnumeration()) {\n assert(!GenericInstanceFilterRuleValue.isInstanceKey(value));\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n if (property.isPrimitive()) {\n assert(!GenericInstanceFilterRuleValue.isInstanceKey(value));\n switch (property.primitiveType) {\n case \"Point2d\": {\n assert(rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\");\n assert(PrimitiveValue.isPoint2d(value));\n const condition = `\n ${createFloatingPointEqualityClause(`${propertyValueSelector}.[x]`, \"is-equal\", value.x)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[y]`, \"is-equal\", value.y)}\n `;\n return rule.operator === \"is-equal\" ? condition : `NOT (${condition})`;\n }\n case \"Point3d\": {\n assert(rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\");\n assert(PrimitiveValue.isPoint3d(value));\n const condition = `\n ${createFloatingPointEqualityClause(`${propertyValueSelector}.[x]`, \"is-equal\", value.x)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[y]`, \"is-equal\", value.y)}\n AND ${createFloatingPointEqualityClause(`${propertyValueSelector}.[z]`, \"is-equal\", value.z)}\n `;\n return rule.operator === \"is-equal\" ? condition : `NOT (${condition})`;\n }\n case \"Double\": {\n assert(typeof value === \"number\");\n if (rule.operator === \"is-equal\" || rule.operator === \"is-not-equal\") {\n return `${createFloatingPointEqualityClause(propertyValueSelector, rule.operator, value)}`;\n }\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n default: {\n return `${propertyValueSelector} ${ecsqlOperator} ${ECSql.createRawPrimitiveValueSelector(value)}`;\n }\n }\n }\n throw new Error(\"Struct and array properties are not supported for filtering\");\n}\n\nfunction createFloatingPointEqualityClause(\n valueSelector: string,\n operator: \"is-equal\" | \"is-not-equal\",\n value: number,\n) {\n const [from, to] = getFloatingPointValueRange(value);\n return `${valueSelector} ${operator === \"is-not-equal\" ? \"NOT \" : \"\"} BETWEEN ${from} AND ${to}`;\n}\n\nfunction getFloatingPointValueRange(value: number): [number, number] {\n return [value - Number.EPSILON, value + Number.EPSILON];\n}\n\nfunction getECSqlLogicalOperator(op: GenericInstanceFilterRuleGroupOperator) {\n switch (op) {\n case \"and\":\n return \"AND\";\n case \"or\":\n return \"OR\";\n }\n}\n\nfunction isUnaryRuleOperator(\n op: GenericInstanceFilterRuleOperator,\n): op is Extract<GenericInstanceFilterRuleOperator, \"is-true\" | \"is-false\" | \"is-null\" | \"is-not-null\"> {\n return op === \"is-true\" || op === \"is-false\" || op === \"is-null\" || op === \"is-not-null\";\n}\n\nfunction getECSqlComparisonOperator(\n op: Exclude<GenericInstanceFilterRuleOperator, \"is-true\" | \"is-false\" | \"is-null\" | \"is-not-null\">,\n) {\n switch (op) {\n case \"is-equal\":\n return `=`;\n case \"is-not-equal\":\n return `<>`;\n case \"greater\":\n return `>`;\n case \"greater-or-equal\":\n return `>=`;\n case \"less\":\n return `<`;\n case \"less-or-equal\":\n return `<=`;\n case \"like\":\n return `LIKE`;\n }\n}\n\ntype JoinRelationshipPath = Props<typeof ECSql.createRelationshipPathJoinClause>[\"path\"];\nfunction assignRelationshipPathAliases(\n path: GenericInstanceFilterRelationshipStep[],\n pathIndex: number,\n sourceAlias: string,\n targetAlias: string,\n): JoinRelationshipPath {\n function createAlias(fullClassName: EC.FullClassName, index: number) {\n return `rel_${pathIndex}_${fullClassName.replaceAll(/[\\.:]/g, \"_\")}_${index}`;\n }\n const result: JoinRelationshipPath = [];\n path.forEach((step, i) => {\n const sourceClassName = normalizeFullClassName(step.sourceClassName);\n const targetClassName = normalizeFullClassName(step.targetClassName);\n const relationshipName = normalizeFullClassName(step.relationshipClassName);\n result.push({\n targetClassName,\n relationshipName,\n sourceClassName,\n relationshipReverse: !step.isForwardRelationship,\n sourceAlias: i === 0 ? sourceAlias : result[i - 1].targetAlias,\n relationshipAlias: createAlias(relationshipName, i),\n targetAlias: i === path.length - 1 ? targetAlias : createAlias(targetClassName, i),\n joinType: \"inner\",\n });\n });\n return result;\n}\n\ninterface SpecializeContentClassProps {\n classHierarchyInspector: ECClassHierarchyInspector;\n contentClassName: EC.FullClassName;\n filterClassNames: EC.FullClassName[];\n}\nasync function specializeContentClass(props: SpecializeContentClassProps): Promise<EC.FullClassName | undefined> {\n const filterClass = await getSpecializedPropertyClass(props.classHierarchyInspector, props.filterClassNames);\n if (!filterClass) {\n return props.contentClassName;\n }\n if (await props.classHierarchyInspector.classDerivesFrom(filterClass, props.contentClassName)) {\n return filterClass;\n }\n if (await props.classHierarchyInspector.classDerivesFrom(props.contentClassName, filterClass)) {\n return props.contentClassName;\n }\n return undefined;\n}\n\nasync function getSpecializedPropertyClass(\n classHierarchyInspector: ECClassHierarchyInspector,\n classes: EC.FullClassName[],\n): Promise<EC.FullClassName | undefined> {\n if (classes.length === 0) {\n return undefined;\n }\n const [currClassName, ...restClasses] = classes;\n let resolvedClassName = currClassName;\n for (const propClassName of restClasses) {\n if (await classHierarchyInspector.classDerivesFrom(propClassName, resolvedClassName)) {\n resolvedClassName = propClassName;\n }\n }\n return resolvedClassName;\n}\n\ninterface HiddenClassNode {\n fullName: EC.FullClassName;\n state: \"hide\" | \"show\";\n children: HiddenClassNode[];\n}\n\nasync function getHiddenClassesTree(\n selectClass: EC.Class,\n selectClassAttribute: \"show\" | \"hide\" = \"show\",\n): Promise<HiddenClassNode[]> {\n const derivedClasses = await getDirectDerivedClasses(selectClass);\n\n const derivedClassSchemas = derivedClasses.reduce(\n (acc, ecClass) => {\n /* v8 ignore else -- @preserve */\n if (!acc.set.has(ecClass.schema.name)) {\n acc.schemas.push(ecClass.schema);\n acc.set.add(ecClass.schema.name);\n }\n return acc;\n },\n { set: new Set<string>(), schemas: new Array<EC.Schema>() },\n ).schemas;\n const hiddenSchemas = new Map<string, \"hide\" | \"show\" | undefined>();\n await Promise.all(\n derivedClassSchemas.map(async (ecSchema) => {\n hiddenSchemas.set(ecSchema.name, await getHiddenSchemaAttribute(ecSchema));\n }),\n );\n\n const tree = (\n await Promise.all(\n derivedClasses.map(async (ecClass): Promise<HiddenClassNode[]> => {\n const hiddenClassAttr = await getHiddenClassAttribute(ecClass);\n const attr = hiddenClassAttr ?? hiddenSchemas.get(ecClass.schema.name);\n if (!attr || attr === selectClassAttribute) {\n return getHiddenClassesTree(ecClass, selectClassAttribute);\n }\n return [{ fullName: ecClass.fullName, state: attr, children: await getHiddenClassesTree(ecClass, attr) }];\n }),\n )\n ).flat();\n return tree;\n}\n\nasync function getDirectDerivedClasses(ecClass: EC.Class): Promise<EC.Class[]> {\n const allDerived = await ecClass.getDerivedClasses();\n return (await Promise.all(allDerived.map(async (c) => ({ derived: c, base: await c.baseClass }))))\n .filter(({ base }) => base && compareFullClassNames(base.fullName, ecClass.fullName) === 0)\n .map(({ derived }) => derived);\n}\n\nasync function getHiddenClassAttribute(ecClass: EC.Class): Promise<\"hide\" | \"show\" | undefined> {\n const customAttributes = await ecClass.getCustomAttributes();\n const hiddenClassAttribute = customAttributes.get(\"CoreCustomAttributes.HiddenClass\");\n return hiddenClassAttribute ? (hiddenClassAttribute.Show ? \"show\" : \"hide\") : undefined;\n}\n\nasync function getHiddenSchemaAttribute(ecSchema: EC.Schema): Promise<\"hide\" | \"show\" | undefined> {\n const customAttributes = await ecSchema.getCustomAttributes();\n const hiddenSchemaAttribute = customAttributes.get(\"CoreCustomAttributes.HiddenSchema\");\n return hiddenSchemaAttribute ? (hiddenSchemaAttribute.ShowClasses ? \"show\" : \"hide\") : undefined;\n}\n\nfunction createWhereClauseForHiddenClasses(\n hiddenClasses: HiddenClassNode[],\n selectAlias: string,\n): { showClause?: string; hideClause?: string } {\n const res: { showClause?: string; hideClause?: string } = {};\n\n const show = hiddenClasses.filter(({ state }) => state === \"show\");\n if (show.length > 0) {\n let showClause = `[${selectAlias}].[ECClassId] IS (${show\n .map(({ fullName }) => parseFullClassName(fullName))\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")})`;\n const childClauses = createWhereClauseForHiddenClasses(\n show.flatMap(({ children }) => children),\n selectAlias,\n );\n if (childClauses.hideClause) {\n showClause = `(${showClause} AND ${childClauses.hideClause})`;\n }\n res.showClause = showClause;\n }\n\n const hide = hiddenClasses.filter(({ state }) => state === \"hide\");\n if (hide.length > 0) {\n let hideClause = `[${selectAlias}].[ECClassId] IS NOT (${hide\n .map(({ fullName }) => parseFullClassName(fullName))\n .map(({ schemaName, className }) => `[${schemaName}].[${className}]`)\n .join(\", \")})`;\n const childClauses = createWhereClauseForHiddenClasses(\n hide.flatMap(({ children }) => children),\n selectAlias,\n );\n if (childClauses.showClause) {\n hideClause = `(${hideClause} OR ${childClauses.showClause})`;\n }\n res.hideClause = hideClause;\n }\n\n return res;\n}\n\nasync function tryGetClass(\n schemaProvider: ECSchemaProvider,\n fullClassName: EC.FullClassName,\n): Promise<EC.Class | undefined> {\n try {\n return await getClass(schemaProvider, fullClassName);\n } catch (e) {\n /* v8 ignore else -- @preserve */\n if (isSchemaOrClassNotFoundError(e)) {\n return undefined;\n }\n\n /* v8 ignore next -- @preserve */\n throw e;\n }\n}\nfunction isSchemaOrClassNotFoundError(e: unknown): e is Error {\n return (\n e instanceof Error &&\n (!!e.message.match(/^Schema \"[\\w\\d_]+\" not found/) || !!e.message.match(/^Class \"[\\w\\d_\\.:]+\" not found/))\n );\n}\nfunction isPropertyNotFoundError(e: unknown): e is Error {\n return e instanceof Error && !!e.message.match(/^Property \"[\\w\\d]+\" not found in ECClass/);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PredicateBasedHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/PredicateBasedHierarchyDefinition.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAAE,yBAAyB,EAAe,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EAIzB,MAAM,gCAAgC,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,0CAA0C,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,GAAG;IACvG,gCAAgC;IAChC,UAAU,EAAE,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,GAAG;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAEnF;;;;;;;OAOG;IACH,mBAAmB,EAAE,EAAE,CAAC,aAAa,CAAC;IAEtC;;;;;;;OAOG;IACH,qBAAqB,EAAE,UAAU,EAAE,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,UAAU,0CAA0C;IAClD;;;;;;;;;OASG;IACH,4BAA4B,EAAE,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzG;;OAEG;IACH,WAAW,EAAE,CAAC,YAAY,EAAE,0CAA0C,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAE7G;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,yCAAyC,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,GAAG;IACtG,+BAA+B;IAC/B,UAAU,EAAE,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,GAAG;QAAE,GAAG,EAAE,cAAc,CAAA;KAAE,CAAC;CAClF,CAAC;AAEF;;;;GAIG;AACH,UAAU,wCAAwC;IAChD;;;OAGG;IACH,0BAA0B,EAAE,CAAC,aAAa,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhF;;OAEG;IACH,WAAW,EAAE,CAAC,YAAY,EAAE,yCAAyC,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7G;AAED;;;;GAIG;AACH,KAAK,sCAAsC,GAAG,0CAA0C,GAAG,wCAAwC,CAAC;AAEpI;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;AAE1F;;;GAGG;AACH,UAAU,sCAAuC,SAAQ,IAAI,CAAC,mBAAmB,EAAE,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;IACpI,gDAAgD;IAChD,uBAAuB,EAAE,yBAAyB,CAAC;IAEnD,kCAAkC;IAClC,SAAS,EAAE;QACT,4DAA4D;QAC5D,SAAS,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAEvF;;;WAGG;QACH,UAAU,EAAE,sCAAsC,EAAE,CAAC;KACtD,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,sCAAsC,GAAG,mBAAmB,CAE1H"}
1
+ {"version":3,"file":"PredicateBasedHierarchyDefinition.d.ts","sourceRoot":"","sources":["../../../../src/hierarchies/imodel/PredicateBasedHierarchyDefinition.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAAE,yBAAyB,EAAe,MAAM,4BAA4B,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EAIzB,MAAM,gCAAgC,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,0CAA0C,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,GAAG;IACvG,gCAAgC;IAChC,UAAU,EAAE,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,GAAG;QAAE,GAAG,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAEnF;;;;;;;OAOG;IACH,mBAAmB,EAAE,EAAE,CAAC,aAAa,CAAC;IAEtC;;;;;;;OAOG;IACH,qBAAqB,EAAE,UAAU,EAAE,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,UAAU,0CAA0C;IAClD;;;;;;;;;OASG;IACH,4BAA4B,EAAE,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzG;;OAEG;IACH,WAAW,EAAE,CAAC,YAAY,EAAE,0CAA0C,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAE7G;;;;;;;;;;;;;;;;OAgBG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,yCAAyC,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,GAAG;IACtG,+BAA+B;IAC/B,UAAU,EAAE,IAAI,CAAC,6BAA6B,EAAE,KAAK,CAAC,GAAG;QAAE,GAAG,EAAE,cAAc,CAAA;KAAE,CAAC;CAClF,CAAC;AAEF;;;;GAIG;AACH,UAAU,wCAAwC;IAChD;;;OAGG;IACH,0BAA0B,EAAE,CAAC,aAAa,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhF;;OAEG;IACH,WAAW,EAAE,CAAC,YAAY,EAAE,yCAAyC,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7G;AAED;;;;GAIG;AACH,KAAK,sCAAsC,GACvC,0CAA0C,GAC1C,wCAAwC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;AAE1F;;;GAGG;AACH,UAAU,sCAAuC,SAAQ,IAAI,CAC3D,mBAAmB,EACnB,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,CACnD;IACC,gDAAgD;IAChD,uBAAuB,EAAE,yBAAyB,CAAC;IAEnD,kCAAkC;IAClC,SAAS,EAAE;QACT,4DAA4D;QAC5D,SAAS,EAAE,CAAC,KAAK,EAAE,6BAA6B,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAEvF;;;WAGG;QACH,UAAU,EAAE,sCAAsC,EAAE,CAAC;KACtD,CAAC;CACH;AAED;;;;;;GAMG;AACH,wBAAgB,uCAAuC,CACrD,KAAK,EAAE,sCAAsC,GAC5C,mBAAmB,CAErB"}
@@ -63,7 +63,8 @@ async function createHierarchyLevelDefinitions(classHierarchy, defs, requestProp
63
63
  (await classHierarchy.classDerivesFrom(requestProps.parentNodeClassName, def.parentInstancesNodePredicate))) {
64
64
  return { def, idx };
65
65
  }
66
- if (typeof def.parentInstancesNodePredicate === "function" && (await def.parentInstancesNodePredicate(requestProps.parentNode.key))) {
66
+ if (typeof def.parentInstancesNodePredicate === "function" &&
67
+ (await def.parentInstancesNodePredicate(requestProps.parentNode.key))) {
67
68
  return { def, idx };
68
69
  }
69
70
  return undefined;