@itwin/presentation-backend 4.0.0-dev.8 → 4.0.0-dev.80

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 (59) hide show
  1. package/CHANGELOG.md +47 -1
  2. package/lib/cjs/assets/supplemental-presentation-rules/BisCore.PresentationRuleSet.json +5 -3
  3. package/lib/cjs/presentation-backend/BackendLoggerCategory.d.ts +41 -41
  4. package/lib/cjs/presentation-backend/BackendLoggerCategory.js +50 -50
  5. package/lib/cjs/presentation-backend/Constants.d.ts +8 -8
  6. package/lib/cjs/presentation-backend/Constants.js +40 -36
  7. package/lib/cjs/presentation-backend/Constants.js.map +1 -1
  8. package/lib/cjs/presentation-backend/ElementPropertiesHelper.d.ts +11 -11
  9. package/lib/cjs/presentation-backend/ElementPropertiesHelper.js +260 -262
  10. package/lib/cjs/presentation-backend/ElementPropertiesHelper.js.map +1 -1
  11. package/lib/cjs/presentation-backend/NativePlatform.d.ts +87 -87
  12. package/lib/cjs/presentation-backend/NativePlatform.d.ts.map +1 -1
  13. package/lib/cjs/presentation-backend/NativePlatform.js +140 -140
  14. package/lib/cjs/presentation-backend/NativePlatform.js.map +1 -1
  15. package/lib/cjs/presentation-backend/Presentation.d.ts +106 -106
  16. package/lib/cjs/presentation-backend/Presentation.d.ts.map +1 -1
  17. package/lib/cjs/presentation-backend/Presentation.js +148 -150
  18. package/lib/cjs/presentation-backend/Presentation.js.map +1 -1
  19. package/lib/cjs/presentation-backend/PresentationIpcHandler.d.ts +12 -12
  20. package/lib/cjs/presentation-backend/PresentationIpcHandler.js +41 -41
  21. package/lib/cjs/presentation-backend/PresentationManager.d.ts +456 -445
  22. package/lib/cjs/presentation-backend/PresentationManager.d.ts.map +1 -1
  23. package/lib/cjs/presentation-backend/PresentationManager.js +309 -311
  24. package/lib/cjs/presentation-backend/PresentationManager.js.map +1 -1
  25. package/lib/cjs/presentation-backend/PresentationManagerDetail.d.ts +61 -61
  26. package/lib/cjs/presentation-backend/PresentationManagerDetail.js +430 -430
  27. package/lib/cjs/presentation-backend/PresentationManagerDetail.js.map +1 -1
  28. package/lib/cjs/presentation-backend/PresentationRpcImpl.d.ts +62 -62
  29. package/lib/cjs/presentation-backend/PresentationRpcImpl.d.ts.map +1 -1
  30. package/lib/cjs/presentation-backend/PresentationRpcImpl.js +388 -388
  31. package/lib/cjs/presentation-backend/PresentationRpcImpl.js.map +1 -1
  32. package/lib/cjs/presentation-backend/RulesetEmbedder.d.ts +102 -102
  33. package/lib/cjs/presentation-backend/RulesetEmbedder.d.ts.map +1 -1
  34. package/lib/cjs/presentation-backend/RulesetEmbedder.js +284 -279
  35. package/lib/cjs/presentation-backend/RulesetEmbedder.js.map +1 -1
  36. package/lib/cjs/presentation-backend/RulesetManager.d.ts +53 -53
  37. package/lib/cjs/presentation-backend/RulesetManager.js +73 -73
  38. package/lib/cjs/presentation-backend/RulesetVariablesManager.d.ts +140 -140
  39. package/lib/cjs/presentation-backend/RulesetVariablesManager.js +129 -129
  40. package/lib/cjs/presentation-backend/SelectionScopesHelper.d.ts +28 -28
  41. package/lib/cjs/presentation-backend/SelectionScopesHelper.js +210 -213
  42. package/lib/cjs/presentation-backend/SelectionScopesHelper.js.map +1 -1
  43. package/lib/cjs/presentation-backend/TemporaryStorage.d.ts +123 -123
  44. package/lib/cjs/presentation-backend/TemporaryStorage.js +151 -151
  45. package/lib/cjs/presentation-backend/UpdatesTracker.d.ts +27 -27
  46. package/lib/cjs/presentation-backend/UpdatesTracker.js +54 -54
  47. package/lib/cjs/presentation-backend/Utils.d.ts +49 -49
  48. package/lib/cjs/presentation-backend/Utils.d.ts.map +1 -1
  49. package/lib/cjs/presentation-backend/Utils.js +107 -106
  50. package/lib/cjs/presentation-backend/Utils.js.map +1 -1
  51. package/lib/cjs/presentation-backend/domain/PresentationRulesDomain.d.ts +16 -16
  52. package/lib/cjs/presentation-backend/domain/PresentationRulesDomain.js +55 -51
  53. package/lib/cjs/presentation-backend/domain/PresentationRulesDomain.js.map +1 -1
  54. package/lib/cjs/presentation-backend/domain/RulesetElements.d.ts +21 -21
  55. package/lib/cjs/presentation-backend/domain/RulesetElements.js +38 -38
  56. package/lib/cjs/presentation-backend.d.ts +19 -19
  57. package/lib/cjs/presentation-backend.js +39 -35
  58. package/lib/cjs/presentation-backend.js.map +1 -1
  59. package/package.json +18 -18
@@ -1,59 +1,59 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module Core
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.iterateElementIds = exports.getElementsCount = exports.buildElementsProperties = void 0;
11
- const core_bentley_1 = require("@itwin/core-bentley");
12
- const presentation_common_1 = require("@itwin/presentation-common");
13
- /** @internal */
14
- const buildElementsProperties = (content) => {
15
- if (!content || content.contentSet.length === 0)
16
- return [];
17
- const builder = new ElementPropertiesBuilder();
18
- (0, presentation_common_1.traverseContent)(builder, content);
19
- return builder.items;
20
- };
21
- exports.buildElementsProperties = buildElementsProperties;
22
- /** @internal */
23
- function getElementsCount(db, classNames) {
24
- const filter = createElementsFilter("e", classNames);
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module Core
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.iterateElementIds = exports.getElementsCount = exports.buildElementsProperties = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const presentation_common_1 = require("@itwin/presentation-common");
13
+ /** @internal */
14
+ const buildElementsProperties = (content) => {
15
+ if (!content || content.contentSet.length === 0)
16
+ return [];
17
+ const builder = new ElementPropertiesBuilder();
18
+ (0, presentation_common_1.traverseContent)(builder, content);
19
+ return builder.items;
20
+ };
21
+ exports.buildElementsProperties = buildElementsProperties;
22
+ /** @internal */
23
+ function getElementsCount(db, classNames) {
24
+ const filter = createElementsFilter("e", classNames);
25
25
  const query = `
26
26
  SELECT COUNT(e.ECInstanceId)
27
27
  FROM bis.Element e
28
28
  ${filter ? `WHERE ${filter}` : ""}
29
- `;
30
- return db.withPreparedStatement(query, (stmt) => {
31
- return stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW ? stmt.getValue(0).getInteger() : 0;
32
- });
33
- }
34
- exports.getElementsCount = getElementsCount;
35
- /** @internal */
36
- function* iterateElementIds(db, classNames, limit) {
37
- let lastElementId;
38
- while (true) {
39
- const result = queryElementIds(db, classNames, limit, lastElementId);
40
- yield result.ids;
41
- lastElementId = result.lastElementId;
42
- if (!lastElementId)
43
- break;
44
- }
45
- }
46
- exports.iterateElementIds = iterateElementIds;
47
- function queryElementIds(db, classNames, limit, lastElementId) {
48
- function createWhereClause() {
49
- const classFilter = createElementsFilter("e", classNames);
50
- const elementFilter = lastElementId ? `e.ECInstanceId > ?` : undefined;
51
- if (!classFilter && !elementFilter)
52
- return "";
53
- if (classFilter && elementFilter)
54
- return `WHERE ${classFilter} AND ${elementFilter}`;
55
- return `WHERE ${classFilter !== null && classFilter !== void 0 ? classFilter : ""} ${elementFilter !== null && elementFilter !== void 0 ? elementFilter : ""}`;
56
- }
29
+ `;
30
+ return db.withPreparedStatement(query, (stmt) => {
31
+ return stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW ? stmt.getValue(0).getInteger() : 0;
32
+ });
33
+ }
34
+ exports.getElementsCount = getElementsCount;
35
+ /** @internal */
36
+ function* iterateElementIds(db, classNames, limit) {
37
+ let lastElementId;
38
+ while (true) {
39
+ const result = queryElementIds(db, classNames, limit, lastElementId);
40
+ yield result.ids;
41
+ lastElementId = result.lastElementId;
42
+ if (!lastElementId)
43
+ break;
44
+ }
45
+ }
46
+ exports.iterateElementIds = iterateElementIds;
47
+ function queryElementIds(db, classNames, limit, lastElementId) {
48
+ function createWhereClause() {
49
+ const classFilter = createElementsFilter("e", classNames);
50
+ const elementFilter = lastElementId ? `e.ECInstanceId > ?` : undefined;
51
+ if (!classFilter && !elementFilter)
52
+ return "";
53
+ if (classFilter && elementFilter)
54
+ return `WHERE ${classFilter} AND ${elementFilter}`;
55
+ return `WHERE ${classFilter ?? ""} ${elementFilter ?? ""}`;
56
+ }
57
57
  const query = `
58
58
  SELECT e.ECInstanceId elId, eSchemaDef.Name || ':' || eClassDef.Name elClassName
59
59
  FROM bis.Element e
@@ -61,215 +61,213 @@ function queryElementIds(db, classNames, limit, lastElementId) {
61
61
  LEFT JOIN meta.ECSchemaDef eSchemaDef ON eSchemaDef.ECInstanceId = eClassDef.Schema.Id
62
62
  ${createWhereClause()}
63
63
  ORDER BY e.ECInstanceId ASC
64
- `;
65
- return db.withPreparedStatement(query, (stmt) => {
66
- if (lastElementId)
67
- stmt.bindId(1, lastElementId);
68
- const ids = new Map();
69
- let currentClassName = "";
70
- let currentIds = [];
71
- let loadedIds = 0;
72
- while (stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW) {
73
- const row = stmt.getRow();
74
- if (!row.elId || !row.elClassName)
75
- continue;
76
- if (currentClassName !== row.elClassName) {
77
- currentClassName = row.elClassName;
78
- const existingIds = ids.get(row.elClassName);
79
- if (!existingIds) {
80
- currentIds = [];
81
- ids.set(row.elClassName, currentIds);
82
- }
83
- else {
84
- currentIds = existingIds;
85
- }
86
- }
87
- currentIds.push(row.elId);
88
- loadedIds++;
89
- if (limit && loadedIds >= limit)
90
- return { ids, lastElementId: row.elId };
91
- }
92
- return { ids, lastElementId: undefined };
93
- });
94
- }
95
- function createElementsFilter(elementAlias, classNames) {
96
- if (classNames === undefined || classNames.length === 0)
97
- return undefined;
98
- // check if list contains only valid class names
99
- const classNameRegExp = new RegExp(/^[\w]+[.:][\w]+$/);
100
- const invalidName = classNames.find((name) => !name.match(classNameRegExp));
101
- if (invalidName) {
64
+ `;
65
+ return db.withPreparedStatement(query, (stmt) => {
66
+ if (lastElementId)
67
+ stmt.bindId(1, lastElementId);
68
+ const ids = new Map();
69
+ let currentClassName = "";
70
+ let currentIds = [];
71
+ let loadedIds = 0;
72
+ while (stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW) {
73
+ const row = stmt.getRow();
74
+ if (!row.elId || !row.elClassName)
75
+ continue;
76
+ if (currentClassName !== row.elClassName) {
77
+ currentClassName = row.elClassName;
78
+ const existingIds = ids.get(row.elClassName);
79
+ if (!existingIds) {
80
+ currentIds = [];
81
+ ids.set(row.elClassName, currentIds);
82
+ }
83
+ else {
84
+ currentIds = existingIds;
85
+ }
86
+ }
87
+ currentIds.push(row.elId);
88
+ loadedIds++;
89
+ if (limit && loadedIds >= limit)
90
+ return { ids, lastElementId: row.elId };
91
+ }
92
+ return { ids, lastElementId: undefined };
93
+ });
94
+ }
95
+ function createElementsFilter(elementAlias, classNames) {
96
+ if (classNames === undefined || classNames.length === 0)
97
+ return undefined;
98
+ // check if list contains only valid class names
99
+ const classNameRegExp = new RegExp(/^[\w]+[.:][\w]+$/);
100
+ const invalidName = classNames.find((name) => !name.match(classNameRegExp));
101
+ if (invalidName) {
102
102
  throw new presentation_common_1.PresentationError(presentation_common_1.PresentationStatus.InvalidArgument, `Encountered invalid class name - ${invalidName}.
103
- Valid class name formats: "<schema name or alias>.<class name>", "<schema name or alias>:<class name>"`);
104
- }
105
- return `${elementAlias}.ECClassId IS (${classNames.join(",")})`;
106
- }
107
- class ElementPropertiesAppender {
108
- constructor(_item, _onItemFinished) {
109
- this._item = _item;
110
- this._onItemFinished = _onItemFinished;
111
- this._propertyItems = {};
112
- this._categoryItemAppenders = {};
113
- }
114
- append(label, item) {
115
- this._propertyItems[label] = item;
116
- }
117
- finish() {
118
- var _a, _b, _c, _d;
119
- // eslint-disable-next-line guard-for-in
120
- for (const categoryName in this._categoryItemAppenders) {
121
- const appender = this._categoryItemAppenders[categoryName];
122
- appender.finish();
123
- }
124
- this._onItemFinished({
125
- class: (_b = (_a = this._item.classInfo) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : "",
126
- id: (_d = (_c = this._item.primaryKeys[0]) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : core_bentley_1.Id64.invalid,
127
- label: this._item.label.displayValue,
128
- items: this._propertyItems,
129
- });
130
- }
131
- getCategoryAppender(parentAppender, category) {
132
- let appender = this._categoryItemAppenders[category.name];
133
- if (!appender) {
134
- appender = new CategoryItemAppender(parentAppender, category);
135
- this._categoryItemAppenders[category.name] = appender;
136
- }
137
- return appender;
138
- }
139
- }
140
- class CategoryItemAppender {
141
- constructor(_parentAppender, _category) {
142
- this._parentAppender = _parentAppender;
143
- this._category = _category;
144
- this._items = {};
145
- }
146
- append(label, item) {
147
- this._items[label] = item;
148
- }
149
- finish() {
150
- if (Object.keys(this._items).length === 0)
151
- return;
152
- this._parentAppender.append(this._category.label, {
153
- type: "category",
154
- items: this._items,
155
- });
156
- }
157
- }
158
- class ArrayItemAppender {
159
- constructor(_parentAppender, _props) {
160
- this._parentAppender = _parentAppender;
161
- this._props = _props;
162
- this._items = [];
163
- }
164
- append(_label, item) {
165
- (0, core_bentley_1.assert)(item.type !== "category");
166
- this._items.push(item);
167
- }
168
- finish() {
169
- (0, core_bentley_1.assert)(this._props.valueType.valueFormat === presentation_common_1.PropertyValueFormat.Array);
170
- if (this._props.valueType.memberType.valueFormat === presentation_common_1.PropertyValueFormat.Primitive)
171
- this._parentAppender.append(this._props.hierarchy.field.label, this.createPrimitivesArray());
172
- else
173
- this._parentAppender.append(this._props.hierarchy.field.label, this.createStructsArray());
174
- }
175
- createPrimitivesArray() {
176
- return {
177
- type: "array",
178
- valueType: "primitive",
179
- values: this._items.map((item) => {
180
- (0, core_bentley_1.assert)(item.type === "primitive");
181
- return item.value;
182
- }),
183
- };
184
- }
185
- createStructsArray() {
186
- return {
187
- type: "array",
188
- valueType: "struct",
189
- values: this._items.map((item) => {
190
- (0, core_bentley_1.assert)(item.type === "struct");
191
- return item.members;
192
- }),
193
- };
194
- }
195
- }
196
- class StructItemAppender {
197
- constructor(_parentAppender, _props) {
198
- this._parentAppender = _parentAppender;
199
- this._props = _props;
200
- this._members = {};
201
- }
202
- append(label, item) {
203
- (0, core_bentley_1.assert)(item.type !== "category");
204
- this._members[label] = item;
205
- }
206
- finish() {
207
- (0, core_bentley_1.assert)(this._props.valueType.valueFormat === presentation_common_1.PropertyValueFormat.Struct);
208
- this._parentAppender.append(this._props.hierarchy.field.label, {
209
- type: "struct",
210
- members: this._members,
211
- });
212
- }
213
- }
214
- class ElementPropertiesBuilder {
215
- constructor() {
216
- this._appendersStack = [];
217
- this._items = [];
218
- }
219
- get items() {
220
- return this._items;
221
- }
222
- get _currentAppender() {
223
- const appender = this._appendersStack[this._appendersStack.length - 1];
224
- (0, core_bentley_1.assert)(appender !== undefined);
225
- return appender;
226
- }
227
- startContent(_props) { return true; }
228
- finishContent() { }
229
- processFieldHierarchies(_props) { }
230
- startItem(props) {
231
- this._elementPropertiesAppender = new ElementPropertiesAppender(props.item, (item) => this._items.push(item));
232
- this._appendersStack.push(this._elementPropertiesAppender);
233
- return true;
234
- }
235
- finishItem() {
236
- this._appendersStack.pop();
237
- (0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
238
- this._elementPropertiesAppender.finish();
239
- this._elementPropertiesAppender = undefined;
240
- }
241
- startCategory(props) {
242
- (0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
243
- this._appendersStack.push(this._elementPropertiesAppender.getCategoryAppender(this._currentAppender, props.category));
244
- return true;
245
- }
246
- finishCategory() {
247
- this._appendersStack.pop();
248
- }
249
- startField(_props) { return true; }
250
- finishField() { }
251
- startStruct(props) {
252
- this._appendersStack.push(new StructItemAppender(this._currentAppender, props));
253
- return true;
254
- }
255
- finishStruct() { this._appendersStack.pop().finish(); }
256
- startArray(props) {
257
- this._appendersStack.push(new ArrayItemAppender(this._currentAppender, props));
258
- return true;
259
- }
260
- finishArray() { this._appendersStack.pop().finish(); }
261
- processMergedValue(props) {
262
- this._currentAppender.append(props.mergedField.label, {
263
- type: "primitive",
264
- value: "",
265
- });
266
- }
267
- processPrimitiveValue(props) {
268
- var _a, _b;
269
- this._currentAppender.append(props.field.label, {
270
- type: "primitive",
271
- value: (_b = (_a = props.displayValue) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : "",
272
- });
273
- }
274
- }
103
+ Valid class name formats: "<schema name or alias>.<class name>", "<schema name or alias>:<class name>"`);
104
+ }
105
+ return `${elementAlias}.ECClassId IS (${classNames.join(",")})`;
106
+ }
107
+ class ElementPropertiesAppender {
108
+ constructor(_item, _onItemFinished) {
109
+ this._item = _item;
110
+ this._onItemFinished = _onItemFinished;
111
+ this._propertyItems = {};
112
+ this._categoryItemAppenders = {};
113
+ }
114
+ append(label, item) {
115
+ this._propertyItems[label] = item;
116
+ }
117
+ finish() {
118
+ // eslint-disable-next-line guard-for-in
119
+ for (const categoryName in this._categoryItemAppenders) {
120
+ const appender = this._categoryItemAppenders[categoryName];
121
+ appender.finish();
122
+ }
123
+ this._onItemFinished({
124
+ class: this._item.classInfo?.label ?? "",
125
+ id: this._item.primaryKeys[0]?.id ?? core_bentley_1.Id64.invalid,
126
+ label: this._item.label.displayValue,
127
+ items: this._propertyItems,
128
+ });
129
+ }
130
+ getCategoryAppender(parentAppender, category) {
131
+ let appender = this._categoryItemAppenders[category.name];
132
+ if (!appender) {
133
+ appender = new CategoryItemAppender(parentAppender, category);
134
+ this._categoryItemAppenders[category.name] = appender;
135
+ }
136
+ return appender;
137
+ }
138
+ }
139
+ class CategoryItemAppender {
140
+ constructor(_parentAppender, _category) {
141
+ this._parentAppender = _parentAppender;
142
+ this._category = _category;
143
+ this._items = {};
144
+ }
145
+ append(label, item) {
146
+ this._items[label] = item;
147
+ }
148
+ finish() {
149
+ if (Object.keys(this._items).length === 0)
150
+ return;
151
+ this._parentAppender.append(this._category.label, {
152
+ type: "category",
153
+ items: this._items,
154
+ });
155
+ }
156
+ }
157
+ class ArrayItemAppender {
158
+ constructor(_parentAppender, _props) {
159
+ this._parentAppender = _parentAppender;
160
+ this._props = _props;
161
+ this._items = [];
162
+ }
163
+ append(_label, item) {
164
+ (0, core_bentley_1.assert)(item.type !== "category");
165
+ this._items.push(item);
166
+ }
167
+ finish() {
168
+ (0, core_bentley_1.assert)(this._props.valueType.valueFormat === presentation_common_1.PropertyValueFormat.Array);
169
+ if (this._props.valueType.memberType.valueFormat === presentation_common_1.PropertyValueFormat.Primitive)
170
+ this._parentAppender.append(this._props.hierarchy.field.label, this.createPrimitivesArray());
171
+ else
172
+ this._parentAppender.append(this._props.hierarchy.field.label, this.createStructsArray());
173
+ }
174
+ createPrimitivesArray() {
175
+ return {
176
+ type: "array",
177
+ valueType: "primitive",
178
+ values: this._items.map((item) => {
179
+ (0, core_bentley_1.assert)(item.type === "primitive");
180
+ return item.value;
181
+ }),
182
+ };
183
+ }
184
+ createStructsArray() {
185
+ return {
186
+ type: "array",
187
+ valueType: "struct",
188
+ values: this._items.map((item) => {
189
+ (0, core_bentley_1.assert)(item.type === "struct");
190
+ return item.members;
191
+ }),
192
+ };
193
+ }
194
+ }
195
+ class StructItemAppender {
196
+ constructor(_parentAppender, _props) {
197
+ this._parentAppender = _parentAppender;
198
+ this._props = _props;
199
+ this._members = {};
200
+ }
201
+ append(label, item) {
202
+ (0, core_bentley_1.assert)(item.type !== "category");
203
+ this._members[label] = item;
204
+ }
205
+ finish() {
206
+ (0, core_bentley_1.assert)(this._props.valueType.valueFormat === presentation_common_1.PropertyValueFormat.Struct);
207
+ this._parentAppender.append(this._props.hierarchy.field.label, {
208
+ type: "struct",
209
+ members: this._members,
210
+ });
211
+ }
212
+ }
213
+ class ElementPropertiesBuilder {
214
+ constructor() {
215
+ this._appendersStack = [];
216
+ this._items = [];
217
+ }
218
+ get items() {
219
+ return this._items;
220
+ }
221
+ get _currentAppender() {
222
+ const appender = this._appendersStack[this._appendersStack.length - 1];
223
+ (0, core_bentley_1.assert)(appender !== undefined);
224
+ return appender;
225
+ }
226
+ startContent(_props) { return true; }
227
+ finishContent() { }
228
+ processFieldHierarchies(_props) { }
229
+ startItem(props) {
230
+ this._elementPropertiesAppender = new ElementPropertiesAppender(props.item, (item) => this._items.push(item));
231
+ this._appendersStack.push(this._elementPropertiesAppender);
232
+ return true;
233
+ }
234
+ finishItem() {
235
+ this._appendersStack.pop();
236
+ (0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
237
+ this._elementPropertiesAppender.finish();
238
+ this._elementPropertiesAppender = undefined;
239
+ }
240
+ startCategory(props) {
241
+ (0, core_bentley_1.assert)(this._elementPropertiesAppender !== undefined);
242
+ this._appendersStack.push(this._elementPropertiesAppender.getCategoryAppender(this._currentAppender, props.category));
243
+ return true;
244
+ }
245
+ finishCategory() {
246
+ this._appendersStack.pop();
247
+ }
248
+ startField(_props) { return true; }
249
+ finishField() { }
250
+ startStruct(props) {
251
+ this._appendersStack.push(new StructItemAppender(this._currentAppender, props));
252
+ return true;
253
+ }
254
+ finishStruct() { this._appendersStack.pop().finish(); }
255
+ startArray(props) {
256
+ this._appendersStack.push(new ArrayItemAppender(this._currentAppender, props));
257
+ return true;
258
+ }
259
+ finishArray() { this._appendersStack.pop().finish(); }
260
+ processMergedValue(props) {
261
+ this._currentAppender.append(props.mergedField.label, {
262
+ type: "primitive",
263
+ value: "",
264
+ });
265
+ }
266
+ processPrimitiveValue(props) {
267
+ this._currentAppender.append(props.field.label, {
268
+ type: "primitive",
269
+ value: props.displayValue?.toString() ?? "",
270
+ });
271
+ }
272
+ }
275
273
  //# sourceMappingURL=ElementPropertiesHelper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElementPropertiesHelper.js","sourceRoot":"","sources":["../../../src/presentation-backend/ElementPropertiesHelper.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAGH,sDAAyE;AACzE,oEAKoC;AAEpC,gBAAgB;AACT,MAAM,uBAAuB,GAAG,CAAC,OAA4B,EAAuB,EAAE;IAC3F,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAC7C,OAAO,EAAE,CAAC;IAEZ,MAAM,OAAO,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC/C,IAAA,qCAAe,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC,CAAC;AAPW,QAAA,uBAAuB,2BAOlC;AAEF,gBAAgB;AAChB,SAAgB,gBAAgB,CAAC,EAAY,EAAE,UAAqB;IAClE,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG;;;MAGV,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE;GAClC,CAAC;IAEF,OAAO,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,IAAoB,EAAE,EAAE;QAC9D,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAXD,4CAWC;AAED,gBAAgB;AAChB,QAAe,CAAC,CAAC,iBAAiB,CAAC,EAAY,EAAE,UAAqB,EAAE,KAAc;IACpF,IAAI,aAAa,CAAC;IAClB,OAAO,IAAI,EAAE;QACX,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,GAAG,CAAC;QACjB,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,aAAa;YAChB,MAAM;KACT;AACH,CAAC;AATD,8CASC;AAED,SAAS,eAAe,CAAC,EAAY,EAAE,UAAqB,EAAE,KAAc,EAAE,aAA0B;IACtG,SAAS,iBAAiB;QACxB,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa;YAChC,OAAO,EAAE,CAAC;QACZ,IAAI,WAAW,IAAI,aAAa;YAC9B,OAAO,SAAS,WAAW,QAAQ,aAAa,EAAE,CAAC;QACrD,OAAO,SAAS,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,EAAE,IAAI,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG;;;;;MAKV,iBAAiB,EAAE;;GAEtB,CAAC;IAEF,OAAO,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,IAAoB,EAAE,EAAE;QAC9D,IAAI,aAAa;YACf,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;QACxC,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,UAAU,GAAa,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,aAAa,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW;gBAC/B,SAAS;YAEX,IAAI,gBAAgB,KAAK,GAAG,CAAC,WAAW,EAAE;gBACxC,gBAAgB,GAAG,GAAG,CAAC,WAAW,CAAC;gBACnC,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC7C,IAAI,CAAC,WAAW,EAAE;oBAChB,UAAU,GAAG,EAAE,CAAC;oBAChB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;iBACtC;qBAAM;oBACL,UAAU,GAAG,WAAW,CAAC;iBAC1B;aACF;YACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,SAAS,EAAE,CAAC;YACZ,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK;gBAC7B,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;SAC3C;QACD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,YAAoB,EAAE,UAAqB;IACvE,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QACrD,OAAO,SAAS,CAAC;IAEnB,gDAAgD;IAChD,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC5E,IAAI,WAAW,EAAE;QACf,MAAM,IAAI,uCAAiB,CAAC,wCAAkB,CAAC,eAAe,EAAE,oCAAoC,WAAW;6GACN,CAAC,CAAC;KAC5G;IAED,OAAO,GAAG,YAAY,kBAAkB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClE,CAAC;AAOD,MAAM,yBAAyB;IAG7B,YAAoB,KAAW,EAAU,eAAkD;QAAvE,UAAK,GAAL,KAAK,CAAM;QAAU,oBAAe,GAAf,eAAe,CAAmC;QAFnF,mBAAc,GAA+C,EAAE,CAAC;QAChE,2BAAsB,GAAoD,EAAE,CAAC;IACU,CAAC;IAEzF,MAAM,CAAC,KAAa,EAAE,IAA2B;QACtD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,MAAM;;QACX,wCAAwC;QACxC,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,sBAAsB,EAAE;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YAC3D,QAAQ,CAAC,MAAM,EAAE,CAAC;SACnB;QAED,IAAI,CAAC,eAAe,CAAC;YACnB,KAAK,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,SAAS,0CAAE,KAAK,mCAAI,EAAE;YACxC,EAAE,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,0CAAE,EAAE,mCAAI,mBAAI,CAAC,OAAO;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY;YACpC,KAAK,EAAE,IAAI,CAAC,cAAc;SAC3B,CAAC,CAAC;IACL,CAAC;IAEM,mBAAmB,CAAC,cAAmC,EAAE,QAA6B;QAC3F,IAAI,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,IAAI,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;SACvD;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,oBAAoB;IAExB,YAAoB,eAAoC,EAAU,SAA8B;QAA5E,oBAAe,GAAf,eAAe,CAAqB;QAAU,cAAS,GAAT,SAAS,CAAqB;QADxF,WAAM,GAA+C,EAAE,CAAC;IACoC,CAAC;IAC9F,MAAM,CAAC,KAAa,EAAE,IAA2B;QACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC5B,CAAC;IACM,MAAM;QACX,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;YACvC,OAAO;QAET,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YAChD,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,iBAAiB;IAErB,YAAoB,eAAoC,EAAU,MAAuB;QAArE,oBAAe,GAAf,eAAe,CAAqB;QAAU,WAAM,GAAN,MAAM,CAAiB;QADjF,WAAM,GAAoC,EAAE,CAAC;IACwC,CAAC;IACvF,MAAM,CAAC,MAAc,EAAE,IAA2B;QACvD,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACM,MAAM;QACX,IAAA,qBAAM,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,KAAK,yCAAmB,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,KAAK,yCAAmB,CAAC,SAAS;YAChF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;;YAE7F,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9F,CAAC;IACO,qBAAqB;QAC3B,OAAO;YACL,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC/B,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAClC,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IACO,kBAAkB;QACxB,OAAO;YACL,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC/B,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBAC/B,OAAO,IAAI,CAAC,OAAO,CAAC;YACtB,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;CACF;AAED,MAAM,kBAAkB;IAEtB,YAAoB,eAAoC,EAAU,MAAwB;QAAtE,oBAAe,GAAf,eAAe,CAAqB;QAAU,WAAM,GAAN,MAAM,CAAkB;QADlF,aAAQ,GAAuD,EAAE,CAAC;IACoB,CAAC;IACxF,MAAM,CAAC,KAAa,EAAE,IAA2B;QACtD,IAAA,qBAAM,EAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC9B,CAAC;IACM,MAAM;QACX,IAAA,qBAAM,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,KAAK,yCAAmB,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE;YAC7D,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,wBAAwB;IAA9B;QACU,oBAAe,GAA0B,EAAE,CAAC;QAC5C,WAAM,GAAwB,EAAE,CAAC;IAkE3C,CAAC;IA/DC,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAY,gBAAgB;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvE,IAAA,qBAAM,EAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,YAAY,CAAC,MAAyB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC;IACjE,aAAa,KAAW,CAAC;IAEzB,uBAAuB,CAAC,MAAoC,IAAU,CAAC;IAEvE,SAAS,CAAC,KAAqB;QACpC,IAAI,CAAC,0BAA0B,GAAG,IAAI,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IACM,UAAU;QACf,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAA,qBAAM,EAAC,IAAI,CAAC,0BAA0B,KAAK,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,CAAC;QACzC,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAC9C,CAAC;IAEM,aAAa,CAAC,KAAyB;QAC5C,IAAA,qBAAM,EAAC,IAAI,CAAC,0BAA0B,KAAK,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtH,OAAO,IAAI,CAAC;IACd,CAAC;IACM,cAAc;QACnB,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAEM,UAAU,CAAC,MAAuB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC;IAC7D,WAAW,KAAW,CAAC;IAEvB,WAAW,CAAC,KAAuB;QACxC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IACM,YAAY,KAAW,IAAI,CAAC,eAAe,CAAC,GAAG,EAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE9D,UAAU,CAAC,KAAsB;QACtC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IACM,WAAW,KAAW,IAAI,CAAC,eAAe,CAAC,GAAG,EAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE7D,kBAAkB,CAAC,KAA8B;QACtD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;YACpD,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;IACL,CAAC;IACM,qBAAqB,CAAC,KAAiC;;QAC5D,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;YAC9C,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,MAAA,MAAA,KAAK,CAAC,YAAY,0CAAE,QAAQ,EAAE,mCAAI,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Core\r\n */\r\n\r\nimport { ECSqlStatement, IModelDb } from \"@itwin/core-backend\";\r\nimport { assert, DbResult, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n CategoryDescription, Content, ElementProperties, ElementPropertiesItem, ElementPropertiesPrimitiveArrayPropertyItem, ElementPropertiesPropertyItem,\r\n ElementPropertiesStructArrayPropertyItem, IContentVisitor, Item, PresentationError, PresentationStatus, ProcessFieldHierarchiesProps, ProcessMergedValueProps,\r\n ProcessPrimitiveValueProps, PropertyValueFormat, StartArrayProps, StartCategoryProps, StartContentProps, StartFieldProps, StartItemProps,\r\n StartStructProps, traverseContent,\r\n} from \"@itwin/presentation-common\";\r\n\r\n/** @internal */\r\nexport const buildElementsProperties = (content: Content | undefined): ElementProperties[] => {\r\n if (!content || content.contentSet.length === 0)\r\n return [];\r\n\r\n const builder = new ElementPropertiesBuilder();\r\n traverseContent(builder, content);\r\n return builder.items;\r\n};\r\n\r\n/** @internal */\r\nexport function getElementsCount(db: IModelDb, classNames?: string[]) {\r\n const filter = createElementsFilter(\"e\", classNames);\r\n const query = `\r\n SELECT COUNT(e.ECInstanceId)\r\n FROM bis.Element e\r\n ${filter ? `WHERE ${filter}` : \"\"}\r\n `;\r\n\r\n return db.withPreparedStatement(query, (stmt: ECSqlStatement) => {\r\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValue(0).getInteger() : 0;\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function* iterateElementIds(db: IModelDb, classNames?: string[], limit?: number) {\r\n let lastElementId;\r\n while (true) {\r\n const result = queryElementIds(db, classNames, limit, lastElementId);\r\n yield result.ids;\r\n lastElementId = result.lastElementId;\r\n if (!lastElementId)\r\n break;\r\n }\r\n}\r\n\r\nfunction queryElementIds(db: IModelDb, classNames?: string[], limit?: number, lastElementId?: Id64String) {\r\n function createWhereClause() {\r\n const classFilter = createElementsFilter(\"e\", classNames);\r\n const elementFilter = lastElementId ? `e.ECInstanceId > ?` : undefined;\r\n if (!classFilter && !elementFilter)\r\n return \"\";\r\n if (classFilter && elementFilter)\r\n return `WHERE ${classFilter} AND ${elementFilter}`;\r\n return `WHERE ${classFilter ?? \"\"} ${elementFilter ?? \"\"}`;\r\n }\r\n\r\n const query = `\r\n SELECT e.ECInstanceId elId, eSchemaDef.Name || ':' || eClassDef.Name elClassName\r\n FROM bis.Element e\r\n LEFT JOIN meta.ECClassDef eClassDef ON eClassDef.ECInstanceId = e.ECClassId\r\n LEFT JOIN meta.ECSchemaDef eSchemaDef ON eSchemaDef.ECInstanceId = eClassDef.Schema.Id\r\n ${createWhereClause()}\r\n ORDER BY e.ECInstanceId ASC\r\n `;\r\n\r\n return db.withPreparedStatement(query, (stmt: ECSqlStatement) => {\r\n if (lastElementId)\r\n stmt.bindId(1, lastElementId);\r\n\r\n const ids = new Map<string, string[]>();\r\n let currentClassName = \"\";\r\n let currentIds: string[] = [];\r\n let loadedIds = 0;\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const row = stmt.getRow();\r\n if (!row.elId || !row.elClassName)\r\n continue;\r\n\r\n if (currentClassName !== row.elClassName) {\r\n currentClassName = row.elClassName;\r\n const existingIds = ids.get(row.elClassName);\r\n if (!existingIds) {\r\n currentIds = [];\r\n ids.set(row.elClassName, currentIds);\r\n } else {\r\n currentIds = existingIds;\r\n }\r\n }\r\n currentIds.push(row.elId);\r\n loadedIds++;\r\n if (limit && loadedIds >= limit)\r\n return { ids, lastElementId: row.elId };\r\n }\r\n return { ids, lastElementId: undefined };\r\n });\r\n}\r\n\r\nfunction createElementsFilter(elementAlias: string, classNames?: string[]) {\r\n if (classNames === undefined || classNames.length === 0)\r\n return undefined;\r\n\r\n // check if list contains only valid class names\r\n const classNameRegExp = new RegExp(/^[\\w]+[.:][\\w]+$/);\r\n const invalidName = classNames.find((name) => !name.match(classNameRegExp));\r\n if (invalidName) {\r\n throw new PresentationError(PresentationStatus.InvalidArgument, `Encountered invalid class name - ${invalidName}.\r\n Valid class name formats: \"<schema name or alias>.<class name>\", \"<schema name or alias>:<class name>\"`);\r\n }\r\n\r\n return `${elementAlias}.ECClassId IS (${classNames.join(\",\")})`;\r\n}\r\n\r\ninterface IPropertiesAppender {\r\n append(label: string, item: ElementPropertiesItem): void;\r\n finish(): void;\r\n}\r\n\r\nclass ElementPropertiesAppender implements IPropertiesAppender {\r\n private _propertyItems: { [label: string]: ElementPropertiesItem } = {};\r\n private _categoryItemAppenders: { [categoryName: string]: IPropertiesAppender } = {};\r\n constructor(private _item: Item, private _onItemFinished: (item: ElementProperties) => void) { }\r\n\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n this._propertyItems[label] = item;\r\n }\r\n\r\n public finish(): void {\r\n // eslint-disable-next-line guard-for-in\r\n for (const categoryName in this._categoryItemAppenders) {\r\n const appender = this._categoryItemAppenders[categoryName];\r\n appender.finish();\r\n }\r\n\r\n this._onItemFinished({\r\n class: this._item.classInfo?.label ?? \"\",\r\n id: this._item.primaryKeys[0]?.id ?? Id64.invalid,\r\n label: this._item.label.displayValue,\r\n items: this._propertyItems,\r\n });\r\n }\r\n\r\n public getCategoryAppender(parentAppender: IPropertiesAppender, category: CategoryDescription): IPropertiesAppender {\r\n let appender = this._categoryItemAppenders[category.name];\r\n if (!appender) {\r\n appender = new CategoryItemAppender(parentAppender, category);\r\n this._categoryItemAppenders[category.name] = appender;\r\n }\r\n return appender;\r\n }\r\n}\r\n\r\nclass CategoryItemAppender implements IPropertiesAppender {\r\n private _items: { [label: string]: ElementPropertiesItem } = {};\r\n constructor(private _parentAppender: IPropertiesAppender, private _category: CategoryDescription) { }\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n this._items[label] = item;\r\n }\r\n public finish(): void {\r\n if (Object.keys(this._items).length === 0)\r\n return;\r\n\r\n this._parentAppender.append(this._category.label, {\r\n type: \"category\",\r\n items: this._items,\r\n });\r\n }\r\n}\r\n\r\nclass ArrayItemAppender implements IPropertiesAppender {\r\n private _items: ElementPropertiesPropertyItem[] = [];\r\n constructor(private _parentAppender: IPropertiesAppender, private _props: StartArrayProps) { }\r\n public append(_label: string, item: ElementPropertiesItem): void {\r\n assert(item.type !== \"category\");\r\n this._items.push(item);\r\n }\r\n public finish(): void {\r\n assert(this._props.valueType.valueFormat === PropertyValueFormat.Array);\r\n if (this._props.valueType.memberType.valueFormat === PropertyValueFormat.Primitive)\r\n this._parentAppender.append(this._props.hierarchy.field.label, this.createPrimitivesArray());\r\n else\r\n this._parentAppender.append(this._props.hierarchy.field.label, this.createStructsArray());\r\n }\r\n private createPrimitivesArray(): ElementPropertiesPrimitiveArrayPropertyItem {\r\n return {\r\n type: \"array\",\r\n valueType: \"primitive\",\r\n values: this._items.map((item) => {\r\n assert(item.type === \"primitive\");\r\n return item.value;\r\n }),\r\n };\r\n }\r\n private createStructsArray(): ElementPropertiesStructArrayPropertyItem {\r\n return {\r\n type: \"array\",\r\n valueType: \"struct\",\r\n values: this._items.map((item) => {\r\n assert(item.type === \"struct\");\r\n return item.members;\r\n }),\r\n };\r\n }\r\n}\r\n\r\nclass StructItemAppender implements IPropertiesAppender {\r\n private _members: { [label: string]: ElementPropertiesPropertyItem } = {};\r\n constructor(private _parentAppender: IPropertiesAppender, private _props: StartStructProps) { }\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n assert(item.type !== \"category\");\r\n this._members[label] = item;\r\n }\r\n public finish(): void {\r\n assert(this._props.valueType.valueFormat === PropertyValueFormat.Struct);\r\n this._parentAppender.append(this._props.hierarchy.field.label, {\r\n type: \"struct\",\r\n members: this._members,\r\n });\r\n }\r\n}\r\n\r\nclass ElementPropertiesBuilder implements IContentVisitor {\r\n private _appendersStack: IPropertiesAppender[] = [];\r\n private _items: ElementProperties[] = [];\r\n private _elementPropertiesAppender: ElementPropertiesAppender | undefined;\r\n\r\n public get items(): ElementProperties[] {\r\n return this._items;\r\n }\r\n\r\n private get _currentAppender(): IPropertiesAppender {\r\n const appender = this._appendersStack[this._appendersStack.length - 1];\r\n assert(appender !== undefined);\r\n return appender;\r\n }\r\n\r\n public startContent(_props: StartContentProps): boolean { return true; }\r\n public finishContent(): void { }\r\n\r\n public processFieldHierarchies(_props: ProcessFieldHierarchiesProps): void { }\r\n\r\n public startItem(props: StartItemProps): boolean {\r\n this._elementPropertiesAppender = new ElementPropertiesAppender(props.item, (item) => this._items.push(item));\r\n this._appendersStack.push(this._elementPropertiesAppender);\r\n return true;\r\n }\r\n public finishItem(): void {\r\n this._appendersStack.pop();\r\n assert(this._elementPropertiesAppender !== undefined);\r\n this._elementPropertiesAppender.finish();\r\n this._elementPropertiesAppender = undefined;\r\n }\r\n\r\n public startCategory(props: StartCategoryProps): boolean {\r\n assert(this._elementPropertiesAppender !== undefined);\r\n this._appendersStack.push(this._elementPropertiesAppender.getCategoryAppender(this._currentAppender, props.category));\r\n return true;\r\n }\r\n public finishCategory(): void {\r\n this._appendersStack.pop();\r\n }\r\n\r\n public startField(_props: StartFieldProps): boolean { return true; }\r\n public finishField(): void { }\r\n\r\n public startStruct(props: StartStructProps): boolean {\r\n this._appendersStack.push(new StructItemAppender(this._currentAppender, props));\r\n return true;\r\n }\r\n public finishStruct(): void { this._appendersStack.pop()!.finish(); }\r\n\r\n public startArray(props: StartArrayProps): boolean {\r\n this._appendersStack.push(new ArrayItemAppender(this._currentAppender, props));\r\n return true;\r\n }\r\n public finishArray(): void { this._appendersStack.pop()!.finish(); }\r\n\r\n public processMergedValue(props: ProcessMergedValueProps): void {\r\n this._currentAppender.append(props.mergedField.label, {\r\n type: \"primitive\",\r\n value: \"\",\r\n });\r\n }\r\n public processPrimitiveValue(props: ProcessPrimitiveValueProps): void {\r\n this._currentAppender.append(props.field.label, {\r\n type: \"primitive\",\r\n value: props.displayValue?.toString() ?? \"\",\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ElementPropertiesHelper.js","sourceRoot":"","sources":["../../../src/presentation-backend/ElementPropertiesHelper.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Core\r\n */\r\n\r\nimport { ECSqlStatement, IModelDb } from \"@itwin/core-backend\";\r\nimport { assert, DbResult, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n CategoryDescription, Content, ElementProperties, ElementPropertiesItem, ElementPropertiesPrimitiveArrayPropertyItem, ElementPropertiesPropertyItem,\r\n ElementPropertiesStructArrayPropertyItem, IContentVisitor, Item, PresentationError, PresentationStatus, ProcessFieldHierarchiesProps, ProcessMergedValueProps,\r\n ProcessPrimitiveValueProps, PropertyValueFormat, StartArrayProps, StartCategoryProps, StartContentProps, StartFieldProps, StartItemProps,\r\n StartStructProps, traverseContent,\r\n} from \"@itwin/presentation-common\";\r\n\r\n/** @internal */\r\nexport const buildElementsProperties = (content: Content | undefined): ElementProperties[] => {\r\n if (!content || content.contentSet.length === 0)\r\n return [];\r\n\r\n const builder = new ElementPropertiesBuilder();\r\n traverseContent(builder, content);\r\n return builder.items;\r\n};\r\n\r\n/** @internal */\r\nexport function getElementsCount(db: IModelDb, classNames?: string[]) {\r\n const filter = createElementsFilter(\"e\", classNames);\r\n const query = `\r\n SELECT COUNT(e.ECInstanceId)\r\n FROM bis.Element e\r\n ${filter ? `WHERE ${filter}` : \"\"}\r\n `;\r\n\r\n return db.withPreparedStatement(query, (stmt: ECSqlStatement) => {\r\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValue(0).getInteger() : 0;\r\n });\r\n}\r\n\r\n/** @internal */\r\nexport function* iterateElementIds(db: IModelDb, classNames?: string[], limit?: number) {\r\n let lastElementId;\r\n while (true) {\r\n const result = queryElementIds(db, classNames, limit, lastElementId);\r\n yield result.ids;\r\n lastElementId = result.lastElementId;\r\n if (!lastElementId)\r\n break;\r\n }\r\n}\r\n\r\nfunction queryElementIds(db: IModelDb, classNames?: string[], limit?: number, lastElementId?: Id64String) {\r\n function createWhereClause() {\r\n const classFilter = createElementsFilter(\"e\", classNames);\r\n const elementFilter = lastElementId ? `e.ECInstanceId > ?` : undefined;\r\n if (!classFilter && !elementFilter)\r\n return \"\";\r\n if (classFilter && elementFilter)\r\n return `WHERE ${classFilter} AND ${elementFilter}`;\r\n return `WHERE ${classFilter ?? \"\"} ${elementFilter ?? \"\"}`;\r\n }\r\n\r\n const query = `\r\n SELECT e.ECInstanceId elId, eSchemaDef.Name || ':' || eClassDef.Name elClassName\r\n FROM bis.Element e\r\n LEFT JOIN meta.ECClassDef eClassDef ON eClassDef.ECInstanceId = e.ECClassId\r\n LEFT JOIN meta.ECSchemaDef eSchemaDef ON eSchemaDef.ECInstanceId = eClassDef.Schema.Id\r\n ${createWhereClause()}\r\n ORDER BY e.ECInstanceId ASC\r\n `;\r\n\r\n return db.withPreparedStatement(query, (stmt: ECSqlStatement) => {\r\n if (lastElementId)\r\n stmt.bindId(1, lastElementId);\r\n\r\n const ids = new Map<string, string[]>();\r\n let currentClassName = \"\";\r\n let currentIds: string[] = [];\r\n let loadedIds = 0;\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n const row = stmt.getRow();\r\n if (!row.elId || !row.elClassName)\r\n continue;\r\n\r\n if (currentClassName !== row.elClassName) {\r\n currentClassName = row.elClassName;\r\n const existingIds = ids.get(row.elClassName);\r\n if (!existingIds) {\r\n currentIds = [];\r\n ids.set(row.elClassName, currentIds);\r\n } else {\r\n currentIds = existingIds;\r\n }\r\n }\r\n currentIds.push(row.elId);\r\n loadedIds++;\r\n if (limit && loadedIds >= limit)\r\n return { ids, lastElementId: row.elId };\r\n }\r\n return { ids, lastElementId: undefined };\r\n });\r\n}\r\n\r\nfunction createElementsFilter(elementAlias: string, classNames?: string[]) {\r\n if (classNames === undefined || classNames.length === 0)\r\n return undefined;\r\n\r\n // check if list contains only valid class names\r\n const classNameRegExp = new RegExp(/^[\\w]+[.:][\\w]+$/);\r\n const invalidName = classNames.find((name) => !name.match(classNameRegExp));\r\n if (invalidName) {\r\n throw new PresentationError(PresentationStatus.InvalidArgument, `Encountered invalid class name - ${invalidName}.\r\n Valid class name formats: \"<schema name or alias>.<class name>\", \"<schema name or alias>:<class name>\"`);\r\n }\r\n\r\n return `${elementAlias}.ECClassId IS (${classNames.join(\",\")})`;\r\n}\r\n\r\ninterface IPropertiesAppender {\r\n append(label: string, item: ElementPropertiesItem): void;\r\n finish(): void;\r\n}\r\n\r\nclass ElementPropertiesAppender implements IPropertiesAppender {\r\n private _propertyItems: { [label: string]: ElementPropertiesItem } = {};\r\n private _categoryItemAppenders: { [categoryName: string]: IPropertiesAppender } = {};\r\n constructor(private _item: Item, private _onItemFinished: (item: ElementProperties) => void) { }\r\n\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n this._propertyItems[label] = item;\r\n }\r\n\r\n public finish(): void {\r\n // eslint-disable-next-line guard-for-in\r\n for (const categoryName in this._categoryItemAppenders) {\r\n const appender = this._categoryItemAppenders[categoryName];\r\n appender.finish();\r\n }\r\n\r\n this._onItemFinished({\r\n class: this._item.classInfo?.label ?? \"\",\r\n id: this._item.primaryKeys[0]?.id ?? Id64.invalid,\r\n label: this._item.label.displayValue,\r\n items: this._propertyItems,\r\n });\r\n }\r\n\r\n public getCategoryAppender(parentAppender: IPropertiesAppender, category: CategoryDescription): IPropertiesAppender {\r\n let appender = this._categoryItemAppenders[category.name];\r\n if (!appender) {\r\n appender = new CategoryItemAppender(parentAppender, category);\r\n this._categoryItemAppenders[category.name] = appender;\r\n }\r\n return appender;\r\n }\r\n}\r\n\r\nclass CategoryItemAppender implements IPropertiesAppender {\r\n private _items: { [label: string]: ElementPropertiesItem } = {};\r\n constructor(private _parentAppender: IPropertiesAppender, private _category: CategoryDescription) { }\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n this._items[label] = item;\r\n }\r\n public finish(): void {\r\n if (Object.keys(this._items).length === 0)\r\n return;\r\n\r\n this._parentAppender.append(this._category.label, {\r\n type: \"category\",\r\n items: this._items,\r\n });\r\n }\r\n}\r\n\r\nclass ArrayItemAppender implements IPropertiesAppender {\r\n private _items: ElementPropertiesPropertyItem[] = [];\r\n constructor(private _parentAppender: IPropertiesAppender, private _props: StartArrayProps) { }\r\n public append(_label: string, item: ElementPropertiesItem): void {\r\n assert(item.type !== \"category\");\r\n this._items.push(item);\r\n }\r\n public finish(): void {\r\n assert(this._props.valueType.valueFormat === PropertyValueFormat.Array);\r\n if (this._props.valueType.memberType.valueFormat === PropertyValueFormat.Primitive)\r\n this._parentAppender.append(this._props.hierarchy.field.label, this.createPrimitivesArray());\r\n else\r\n this._parentAppender.append(this._props.hierarchy.field.label, this.createStructsArray());\r\n }\r\n private createPrimitivesArray(): ElementPropertiesPrimitiveArrayPropertyItem {\r\n return {\r\n type: \"array\",\r\n valueType: \"primitive\",\r\n values: this._items.map((item) => {\r\n assert(item.type === \"primitive\");\r\n return item.value;\r\n }),\r\n };\r\n }\r\n private createStructsArray(): ElementPropertiesStructArrayPropertyItem {\r\n return {\r\n type: \"array\",\r\n valueType: \"struct\",\r\n values: this._items.map((item) => {\r\n assert(item.type === \"struct\");\r\n return item.members;\r\n }),\r\n };\r\n }\r\n}\r\n\r\nclass StructItemAppender implements IPropertiesAppender {\r\n private _members: { [label: string]: ElementPropertiesPropertyItem } = {};\r\n constructor(private _parentAppender: IPropertiesAppender, private _props: StartStructProps) { }\r\n public append(label: string, item: ElementPropertiesItem): void {\r\n assert(item.type !== \"category\");\r\n this._members[label] = item;\r\n }\r\n public finish(): void {\r\n assert(this._props.valueType.valueFormat === PropertyValueFormat.Struct);\r\n this._parentAppender.append(this._props.hierarchy.field.label, {\r\n type: \"struct\",\r\n members: this._members,\r\n });\r\n }\r\n}\r\n\r\nclass ElementPropertiesBuilder implements IContentVisitor {\r\n private _appendersStack: IPropertiesAppender[] = [];\r\n private _items: ElementProperties[] = [];\r\n private _elementPropertiesAppender: ElementPropertiesAppender | undefined;\r\n\r\n public get items(): ElementProperties[] {\r\n return this._items;\r\n }\r\n\r\n private get _currentAppender(): IPropertiesAppender {\r\n const appender = this._appendersStack[this._appendersStack.length - 1];\r\n assert(appender !== undefined);\r\n return appender;\r\n }\r\n\r\n public startContent(_props: StartContentProps): boolean { return true; }\r\n public finishContent(): void { }\r\n\r\n public processFieldHierarchies(_props: ProcessFieldHierarchiesProps): void { }\r\n\r\n public startItem(props: StartItemProps): boolean {\r\n this._elementPropertiesAppender = new ElementPropertiesAppender(props.item, (item) => this._items.push(item));\r\n this._appendersStack.push(this._elementPropertiesAppender);\r\n return true;\r\n }\r\n public finishItem(): void {\r\n this._appendersStack.pop();\r\n assert(this._elementPropertiesAppender !== undefined);\r\n this._elementPropertiesAppender.finish();\r\n this._elementPropertiesAppender = undefined;\r\n }\r\n\r\n public startCategory(props: StartCategoryProps): boolean {\r\n assert(this._elementPropertiesAppender !== undefined);\r\n this._appendersStack.push(this._elementPropertiesAppender.getCategoryAppender(this._currentAppender, props.category));\r\n return true;\r\n }\r\n public finishCategory(): void {\r\n this._appendersStack.pop();\r\n }\r\n\r\n public startField(_props: StartFieldProps): boolean { return true; }\r\n public finishField(): void { }\r\n\r\n public startStruct(props: StartStructProps): boolean {\r\n this._appendersStack.push(new StructItemAppender(this._currentAppender, props));\r\n return true;\r\n }\r\n public finishStruct(): void { this._appendersStack.pop()!.finish(); }\r\n\r\n public startArray(props: StartArrayProps): boolean {\r\n this._appendersStack.push(new ArrayItemAppender(this._currentAppender, props));\r\n return true;\r\n }\r\n public finishArray(): void { this._appendersStack.pop()!.finish(); }\r\n\r\n public processMergedValue(props: ProcessMergedValueProps): void {\r\n this._currentAppender.append(props.mergedField.label, {\r\n type: \"primitive\",\r\n value: \"\",\r\n });\r\n }\r\n public processPrimitiveValue(props: ProcessPrimitiveValueProps): void {\r\n this._currentAppender.append(props.field.label, {\r\n type: \"primitive\",\r\n value: props.displayValue?.toString() ?? \"\",\r\n });\r\n }\r\n}\r\n"]}