@itwin/presentation-backend 3.0.0-dev.126 → 3.0.0-dev.130

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.
@@ -2,11 +2,11 @@
2
2
  * @module Core
3
3
  */
4
4
  import { IModelDb } from "@itwin/core-backend";
5
- import { Content, ElementProperties, PageOptions } from "@itwin/presentation-common";
5
+ import { Content, ElementProperties } from "@itwin/presentation-common";
6
6
  /** @internal */
7
7
  export declare const buildElementsProperties: (content: Content | undefined) => ElementProperties[];
8
8
  /** @internal */
9
9
  export declare function getElementsCount(db: IModelDb, classNames?: string[]): number;
10
10
  /** @internal */
11
- export declare function getElementIdsByClass(db: IModelDb, classNames?: string[], pageOptions?: PageOptions): Map<string, string[]>;
11
+ export declare function iterateElementIds(db: IModelDb, classNames?: string[], limit?: number): Generator<Map<string, string[]>, void, unknown>;
12
12
  //# sourceMappingURL=ElementPropertiesHelper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElementPropertiesHelper.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/ElementPropertiesHelper.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAkB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EACgB,OAAO,EAAE,iBAAiB,EACkB,WAAW,EAG7E,MAAM,4BAA4B,CAAC;AAEpC,gBAAgB;AAChB,eAAO,MAAM,uBAAuB,YAAa,OAAO,GAAG,SAAS,KAAG,iBAAiB,EAOvF,CAAC;AAEF,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAUnE;AAED,gBAAgB;AAChB,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,yBAkClG"}
1
+ {"version":3,"file":"ElementPropertiesHelper.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/ElementPropertiesHelper.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAkB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EACgB,OAAO,EAAE,iBAAiB,EAIhD,MAAM,4BAA4B,CAAC;AAEpC,gBAAgB;AAChB,eAAO,MAAM,uBAAuB,YAAa,OAAO,GAAG,SAAS,KAAG,iBAAiB,EAOvF,CAAC;AAEF,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAWnE;AAED,gBAAgB;AAChB,wBAAiB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,mDASrF"}
@@ -7,7 +7,7 @@
7
7
  * @module Core
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.getElementIdsByClass = exports.getElementsCount = exports.buildElementsProperties = void 0;
10
+ exports.iterateElementIds = exports.getElementsCount = exports.buildElementsProperties = void 0;
11
11
  const core_bentley_1 = require("@itwin/core-bentley");
12
12
  const presentation_common_1 = require("@itwin/presentation-common");
13
13
  /** @internal */
@@ -21,10 +21,11 @@ const buildElementsProperties = (content) => {
21
21
  exports.buildElementsProperties = buildElementsProperties;
22
22
  /** @internal */
23
23
  function getElementsCount(db, classNames) {
24
+ const filter = createElementsFilter("e", classNames);
24
25
  const query = `
25
26
  SELECT COUNT(e.ECInstanceId)
26
27
  FROM bis.Element e
27
- ${createElementsFilterClause("e", classNames)}
28
+ ${filter ? `WHERE ${filter}` : ""}
28
29
  `;
29
30
  return db.withPreparedStatement(query, (stmt) => {
30
31
  return stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW ? stmt.getValue(0).getInteger() : 0;
@@ -32,20 +33,42 @@ function getElementsCount(db, classNames) {
32
33
  }
33
34
  exports.getElementsCount = getElementsCount;
34
35
  /** @internal */
35
- function getElementIdsByClass(db, classNames, pageOptions) {
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
+ }
36
57
  const query = `
37
58
  SELECT e.ECInstanceId elId, eSchemaDef.Name || ':' || eClassDef.Name elClassName
38
59
  FROM bis.Element e
39
60
  LEFT JOIN meta.ECClassDef eClassDef ON eClassDef.ECInstanceId = e.ECClassId
40
61
  LEFT JOIN meta.ECSchemaDef eSchemaDef ON eSchemaDef.ECInstanceId = eClassDef.Schema.Id
41
- ${createElementsFilterClause("e", classNames)}
42
- ORDER BY e.ECClassId, e.ECInstanceId
43
- ${createElementsLimitClause(pageOptions)}
62
+ ${createWhereClause()}
63
+ ORDER BY e.ECInstanceId ASC
44
64
  `;
45
65
  return db.withPreparedStatement(query, (stmt) => {
66
+ if (lastElementId)
67
+ stmt.bindId(1, lastElementId);
46
68
  const ids = new Map();
47
69
  let currentClassName = "";
48
70
  let currentIds = [];
71
+ let loadedIds = 0;
49
72
  while (stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW) {
50
73
  const row = stmt.getRow();
51
74
  if (!row.elId || !row.elClassName)
@@ -62,20 +85,16 @@ function getElementIdsByClass(db, classNames, pageOptions) {
62
85
  }
63
86
  }
64
87
  currentIds.push(row.elId);
88
+ loadedIds++;
89
+ if (limit && loadedIds >= limit)
90
+ return { ids, lastElementId: row.elId };
65
91
  }
66
- return ids;
92
+ return { ids, lastElementId: undefined };
67
93
  });
68
94
  }
69
- exports.getElementIdsByClass = getElementIdsByClass;
70
- function createElementsLimitClause(pageOptions) {
71
- var _a, _b;
72
- if (pageOptions === undefined || (pageOptions.size === undefined && pageOptions.start === undefined))
73
- return "";
74
- return `LIMIT ${(_a = pageOptions.size) !== null && _a !== void 0 ? _a : -1} OFFSET ${(_b = pageOptions.start) !== null && _b !== void 0 ? _b : 0}`;
75
- }
76
- function createElementsFilterClause(elementAlias, classNames) {
95
+ function createElementsFilter(elementAlias, classNames) {
77
96
  if (classNames === undefined || classNames.length === 0)
78
- return "";
97
+ return undefined;
79
98
  // check if list contains only valid class names
80
99
  const classNameRegExp = new RegExp(/^[\w]+[.:][\w]+$/);
81
100
  const invalidName = classNames.find((name) => !name.match(classNameRegExp));
@@ -83,7 +102,7 @@ function createElementsFilterClause(elementAlias, classNames) {
83
102
  throw new presentation_common_1.PresentationError(presentation_common_1.PresentationStatus.InvalidArgument, `Encountered invalid class name - ${invalidName}.
84
103
  Valid class name formats: "<schema name or alias>.<class name>", "<schema name or alias>:<class name>"`);
85
104
  }
86
- return `WHERE ${elementAlias}.ECClassId IS (${classNames.join(",")})`;
105
+ return `${elementAlias}.ECClassId IS (${classNames.join(",")})`;
87
106
  }
88
107
  class ElementPropertiesAppender {
89
108
  constructor(_item, _onItemFinished) {
@@ -1 +1 @@
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 } from \"@itwin/core-bentley\";\r\nimport {\r\n CategoryDescription, Content, ElementProperties, ElementPropertiesItem, ElementPropertiesPrimitiveArrayPropertyItem, ElementPropertiesPropertyItem,\r\n ElementPropertiesStructArrayPropertyItem, IContentVisitor, Item, PageOptions, 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 query = `\r\n SELECT COUNT(e.ECInstanceId)\r\n FROM bis.Element e\r\n ${createElementsFilterClause(\"e\", classNames)}\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 getElementIdsByClass(db: IModelDb, classNames?: string[], pageOptions?: PageOptions) {\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 ${createElementsFilterClause(\"e\", classNames)}\r\n ORDER BY e.ECClassId, e.ECInstanceId\r\n ${createElementsLimitClause(pageOptions)}\r\n `;\r\n\r\n return db.withPreparedStatement(query, (stmt: ECSqlStatement) => {\r\n const ids = new Map<string, string[]>();\r\n let currentClassName = \"\";\r\n let currentIds: string[] = [];\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 }\r\n return ids;\r\n });\r\n}\r\n\r\nfunction createElementsLimitClause(pageOptions?: PageOptions) {\r\n if (pageOptions === undefined || (pageOptions.size === undefined && pageOptions.start === undefined))\r\n return \"\";\r\n\r\n return `LIMIT ${pageOptions.size ?? -1} OFFSET ${pageOptions.start ?? 0}`;\r\n}\r\n\r\nfunction createElementsFilterClause(elementAlias: string, classNames?: string[]) {\r\n if (classNames === undefined || classNames.length === 0)\r\n return \"\";\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 `WHERE ${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":";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,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnH,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 +1 @@
1
- {"version":3,"file":"Presentation.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/Presentation.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAMtF;;;;;GAKG;AACH,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC7E;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,KAAK,mBAAmB,CAAC;IAElG;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,oBAAY,iBAAiB,GAAG,6BAA6B,GAAG,8BAA8B,CAAC;AAM/F;;;;;;;;;GASG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAgC;IACzD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAgD;IAC9E,OAAO,CAAC,MAAM,CAAC,eAAe,CAAqB;IACnD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA0B;IAC3D,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAA0B;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkC;IAGzD,OAAO;IAEP,+DAA+D;IAC/D,WAAkB,SAAS,kCAA8B;IAEzD;;;;;;;;OAQG;WACW,UAAU,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI;IA6BzD;;;OAGG;WACW,SAAS,IAAI,IAAI;IAsB/B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IASlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAInC;;;;OAIG;WACW,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAShE;;OAEG;WACW,iBAAiB,IAAI,MAAM;CAK1C"}
1
+ {"version":3,"file":"Presentation.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/Presentation.ts"],"names":[],"mappings":"AAIA;;GAEG;AAQH,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAMtF;;;;;GAKG;AACH,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC7E;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,KAAK,mBAAmB,CAAC;IAElG;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,8BAA+B,SAAQ,wBAAwB;IAC9E;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,oBAAY,iBAAiB,GAAG,6BAA6B,GAAG,8BAA8B,CAAC;AAM/F;;;;;;;;;GASG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAgC;IACzD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAgD;IAC9E,OAAO,CAAC,MAAM,CAAC,eAAe,CAAqB;IACnD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA0B;IAC3D,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAA0B;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkC;IAGzD,OAAO;IAEP,+DAA+D;IAC/D,WAAkB,SAAS,kCAA8B;IAEzD;;;;;;;;OAQG;WACW,UAAU,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAgCzD;;;OAGG;WACW,SAAS,IAAI,IAAI;IAsB/B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IASlC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAInC;;;;OAIG;WACW,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAShE;;OAEG;WACW,iBAAiB,IAAI,MAAM;CAK1C"}
@@ -65,7 +65,11 @@ class Presentation {
65
65
  // by default, manager is disposed after 1 hour of being unused
66
66
  valueLifetime: (_a = this._initProps.unusedClientLifetime) !== null && _a !== void 0 ? _a : 60 * 60 * 1000,
67
67
  // add some logging
68
- onCreated: /* istanbul ignore next */ (id) => { var _a; return core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.PresentationBackendLoggerCategory.PresentationManager, `Created a PresentationManager instance with ID: ${id}. Total instances: ${(_a = this._clientsStorage) === null || _a === void 0 ? void 0 : _a.values.length}.`); },
68
+ onCreated: /* istanbul ignore next */ (id, value, onValueUsed) => {
69
+ var _a;
70
+ core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.PresentationBackendLoggerCategory.PresentationManager, `Created a PresentationManager instance with ID: ${id}. Total instances: ${(_a = this._clientsStorage) === null || _a === void 0 ? void 0 : _a.values.length}.`);
71
+ value.manager.setOnManagerUsedHandler(onValueUsed);
72
+ },
69
73
  onDisposedSingle: /* istanbul ignore next */ (id) => { var _a; return core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.PresentationBackendLoggerCategory.PresentationManager, `Disposed PresentationManager instance with ID: ${id}. Total instances: ${(_a = this._clientsStorage) === null || _a === void 0 ? void 0 : _a.values.length}.`); },
70
74
  onDisposedAll: /* istanbul ignore next */ () => core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.PresentationBackendLoggerCategory.PresentationManager, `Disposed all PresentationManager instances.`),
71
75
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../../src/presentation-backend/Presentation.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 { IModelHost, IpcHost } from \"@itwin/core-backend\";\r\nimport { DisposeFunc, Logger } from \"@itwin/core-bentley\";\r\nimport { RpcManager } from \"@itwin/core-common\";\r\nimport { PresentationError, PresentationRpcInterface, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { PresentationBackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { PresentationIpcHandler } from \"./PresentationIpcHandler\";\r\nimport { PresentationManager, PresentationManagerProps } from \"./PresentationManager\";\r\nimport { PresentationRpcImpl } from \"./PresentationRpcImpl\";\r\nimport { TemporaryStorage } from \"./TemporaryStorage\";\r\n\r\nconst defaultRequestTimeout: number = 90000;\r\n\r\n/**\r\n * Props for initializing the [[Presentation]] library for using multiple [[PresentationManager]]\r\n * instances, one for each frontend.\r\n *\r\n * @public\r\n */\r\nexport interface MultiManagerPresentationProps extends PresentationManagerProps {\r\n /**\r\n * Factory method for creating separate managers for each client\r\n * @internal\r\n */\r\n clientManagerFactory?: (clientId: string, props: PresentationManagerProps) => PresentationManager;\r\n\r\n /**\r\n * Time in milliseconds after which the request will timeout.\r\n */\r\n requestTimeout?: number;\r\n\r\n /**\r\n * How much time should an unused client manager be stored in memory\r\n * before it's disposed.\r\n */\r\n unusedClientLifetime?: number;\r\n}\r\n\r\n/**\r\n * Props for initializing the [[Presentation]] library with ability to use a single\r\n * [[PresentationManager]] instance for handling all requests.\r\n *\r\n * @public\r\n */\r\nexport interface SingleManagerPresentationProps extends PresentationManagerProps {\r\n /**\r\n * How much time should an unused client manager be stored in memory\r\n * before it's disposed.\r\n */\r\n requestTimeout?: number;\r\n\r\n /**\r\n * Specifies to use single manager for all clients.\r\n * @alpha\r\n */\r\n useSingleManager?: boolean;\r\n}\r\n\r\n/**\r\n * Properties that can be used to configure [[Presentation]] API\r\n * @public\r\n */\r\nexport type PresentationProps = MultiManagerPresentationProps | SingleManagerPresentationProps;\r\n\r\ninterface ClientStoreItem {\r\n manager: PresentationManager;\r\n}\r\n\r\n/**\r\n * Static class used to statically set up Presentation library for the backend.\r\n * Basically what it does is:\r\n * - Register a RPC implementation\r\n * - Create a singleton [[PresentationManager]] instance\r\n * - Subscribe for [IModelHost.onBeforeShutdown]($core-backend) event and terminate\r\n * the presentation manager when that happens.\r\n *\r\n * @public\r\n */\r\nexport class Presentation {\r\n\r\n private static _initProps: PresentationProps | undefined;\r\n private static _clientsStorage: TemporaryStorage<ClientStoreItem> | undefined;\r\n private static _requestTimeout: number | undefined;\r\n private static _disposeIpcHandler: DisposeFunc | undefined;\r\n private static _shutdownListener: DisposeFunc | undefined;\r\n private static _manager: PresentationManager | undefined;\r\n\r\n /* istanbul ignore next */\r\n private constructor() { }\r\n\r\n /** Properties used to initialize the presentation framework */\r\n public static get initProps() { return this._initProps; }\r\n\r\n /**\r\n * Initializes Presentation library for the backend.\r\n *\r\n * See [this]($docs/presentation/Setup/index.md#backend) for an example.\r\n *\r\n * **Important:** The method should be called after a call to [IModelHost.startup]($core-backend)\r\n *\r\n * @param props Optional properties for [[PresentationManager]]\r\n */\r\n public static initialize(props?: PresentationProps): void {\r\n RpcManager.registerImpl(PresentationRpcInterface, PresentationRpcImpl);\r\n if (IpcHost.isValid) {\r\n this._disposeIpcHandler = PresentationIpcHandler.register();\r\n }\r\n this._initProps = props || {};\r\n this._shutdownListener = IModelHost.onBeforeShutdown.addListener(() => Presentation.terminate());\r\n this._requestTimeout = (props && props.requestTimeout !== undefined)\r\n ? props.requestTimeout\r\n : defaultRequestTimeout;\r\n\r\n if (isSingleManagerProps(this._initProps)) {\r\n this._manager = new PresentationManager(Presentation._initProps);\r\n } else {\r\n this._clientsStorage = new TemporaryStorage<ClientStoreItem>({\r\n factory: this.createClientManager,\r\n cleanupHandler: this.disposeClientManager,\r\n // cleanup unused managers every minute\r\n cleanupInterval: 60 * 1000,\r\n // by default, manager is disposed after 1 hour of being unused\r\n valueLifetime: this._initProps.unusedClientLifetime ?? 60 * 60 * 1000,\r\n // add some logging\r\n onCreated: /* istanbul ignore next */ (id: string) => Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Created a PresentationManager instance with ID: ${id}. Total instances: ${this._clientsStorage?.values.length}.`),\r\n onDisposedSingle: /* istanbul ignore next */ (id: string) => Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Disposed PresentationManager instance with ID: ${id}. Total instances: ${this._clientsStorage?.values.length}.`),\r\n onDisposedAll: /* istanbul ignore next */ () => Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Disposed all PresentationManager instances.`),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Terminates Presentation. Consumers don't need to call this as it's automatically\r\n * called on [IModelHost.onBeforeShutdown]($core-backend) event.\r\n */\r\n public static terminate(): void {\r\n if (this._clientsStorage) {\r\n this._clientsStorage.dispose();\r\n this._clientsStorage = undefined;\r\n }\r\n if (this._shutdownListener) {\r\n this._shutdownListener();\r\n this._shutdownListener = undefined;\r\n }\r\n if (this._manager) {\r\n this._manager.dispose();\r\n this._manager = undefined;\r\n }\r\n RpcManager.unregisterImpl(PresentationRpcInterface);\r\n if (this._disposeIpcHandler) {\r\n this._disposeIpcHandler();\r\n }\r\n this._initProps = undefined;\r\n if (this._requestTimeout)\r\n this._requestTimeout = undefined;\r\n }\r\n\r\n private static createClientManager(clientId: string): ClientStoreItem {\r\n let manager: PresentationManager;\r\n if (Presentation._initProps && !isSingleManagerProps(Presentation._initProps) && Presentation._initProps.clientManagerFactory)\r\n manager = Presentation._initProps.clientManagerFactory(clientId, Presentation._initProps);\r\n else\r\n manager = new PresentationManager(Presentation._initProps);\r\n return { manager };\r\n }\r\n\r\n private static disposeClientManager(storeItem: ClientStoreItem) {\r\n storeItem.manager.dispose();\r\n }\r\n\r\n /**\r\n * Get an instance of [[PresentationManager]] for specific client\r\n * @param clientId ID of the client requesting presentation data. If no\r\n * ID is provided, the default [[PresentationManager]] is returned.\r\n */\r\n public static getManager(clientId?: string): PresentationManager {\r\n if (this._initProps && isSingleManagerProps(this._initProps) && this._manager)\r\n return this._manager;\r\n if (this._clientsStorage)\r\n return this._clientsStorage.getValue(clientId || \"\").manager;\r\n\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Presentation must be first initialized by calling Presentation.initialize\");\r\n }\r\n\r\n /**\r\n * Get the time in milliseconds that backend should respond in .\r\n */\r\n public static getRequestTimeout(): number {\r\n if (this._requestTimeout === undefined)\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Presentation must be first initialized by calling Presentation.initialize\");\r\n return this._requestTimeout;\r\n }\r\n}\r\n\r\nfunction isSingleManagerProps(props: PresentationProps): props is SingleManagerPresentationProps {\r\n return !!(props as SingleManagerPresentationProps).useSingleManager;\r\n}\r\n"]}
1
+ {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../../src/presentation-backend/Presentation.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 { IModelHost, IpcHost } from \"@itwin/core-backend\";\r\nimport { DisposeFunc, Logger } from \"@itwin/core-bentley\";\r\nimport { RpcManager } from \"@itwin/core-common\";\r\nimport { PresentationError, PresentationRpcInterface, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { PresentationBackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { PresentationIpcHandler } from \"./PresentationIpcHandler\";\r\nimport { PresentationManager, PresentationManagerProps } from \"./PresentationManager\";\r\nimport { PresentationRpcImpl } from \"./PresentationRpcImpl\";\r\nimport { TemporaryStorage } from \"./TemporaryStorage\";\r\n\r\nconst defaultRequestTimeout: number = 90000;\r\n\r\n/**\r\n * Props for initializing the [[Presentation]] library for using multiple [[PresentationManager]]\r\n * instances, one for each frontend.\r\n *\r\n * @public\r\n */\r\nexport interface MultiManagerPresentationProps extends PresentationManagerProps {\r\n /**\r\n * Factory method for creating separate managers for each client\r\n * @internal\r\n */\r\n clientManagerFactory?: (clientId: string, props: PresentationManagerProps) => PresentationManager;\r\n\r\n /**\r\n * Time in milliseconds after which the request will timeout.\r\n */\r\n requestTimeout?: number;\r\n\r\n /**\r\n * How much time should an unused client manager be stored in memory\r\n * before it's disposed.\r\n */\r\n unusedClientLifetime?: number;\r\n}\r\n\r\n/**\r\n * Props for initializing the [[Presentation]] library with ability to use a single\r\n * [[PresentationManager]] instance for handling all requests.\r\n *\r\n * @public\r\n */\r\nexport interface SingleManagerPresentationProps extends PresentationManagerProps {\r\n /**\r\n * How much time should an unused client manager be stored in memory\r\n * before it's disposed.\r\n */\r\n requestTimeout?: number;\r\n\r\n /**\r\n * Specifies to use single manager for all clients.\r\n * @alpha\r\n */\r\n useSingleManager?: boolean;\r\n}\r\n\r\n/**\r\n * Properties that can be used to configure [[Presentation]] API\r\n * @public\r\n */\r\nexport type PresentationProps = MultiManagerPresentationProps | SingleManagerPresentationProps;\r\n\r\ninterface ClientStoreItem {\r\n manager: PresentationManager;\r\n}\r\n\r\n/**\r\n * Static class used to statically set up Presentation library for the backend.\r\n * Basically what it does is:\r\n * - Register a RPC implementation\r\n * - Create a singleton [[PresentationManager]] instance\r\n * - Subscribe for [IModelHost.onBeforeShutdown]($core-backend) event and terminate\r\n * the presentation manager when that happens.\r\n *\r\n * @public\r\n */\r\nexport class Presentation {\r\n\r\n private static _initProps: PresentationProps | undefined;\r\n private static _clientsStorage: TemporaryStorage<ClientStoreItem> | undefined;\r\n private static _requestTimeout: number | undefined;\r\n private static _disposeIpcHandler: DisposeFunc | undefined;\r\n private static _shutdownListener: DisposeFunc | undefined;\r\n private static _manager: PresentationManager | undefined;\r\n\r\n /* istanbul ignore next */\r\n private constructor() { }\r\n\r\n /** Properties used to initialize the presentation framework */\r\n public static get initProps() { return this._initProps; }\r\n\r\n /**\r\n * Initializes Presentation library for the backend.\r\n *\r\n * See [this]($docs/presentation/Setup/index.md#backend) for an example.\r\n *\r\n * **Important:** The method should be called after a call to [IModelHost.startup]($core-backend)\r\n *\r\n * @param props Optional properties for [[PresentationManager]]\r\n */\r\n public static initialize(props?: PresentationProps): void {\r\n RpcManager.registerImpl(PresentationRpcInterface, PresentationRpcImpl);\r\n if (IpcHost.isValid) {\r\n this._disposeIpcHandler = PresentationIpcHandler.register();\r\n }\r\n this._initProps = props || {};\r\n this._shutdownListener = IModelHost.onBeforeShutdown.addListener(() => Presentation.terminate());\r\n this._requestTimeout = (props && props.requestTimeout !== undefined)\r\n ? props.requestTimeout\r\n : defaultRequestTimeout;\r\n\r\n if (isSingleManagerProps(this._initProps)) {\r\n this._manager = new PresentationManager(Presentation._initProps);\r\n } else {\r\n this._clientsStorage = new TemporaryStorage<ClientStoreItem>({\r\n factory: this.createClientManager,\r\n cleanupHandler: this.disposeClientManager,\r\n // cleanup unused managers every minute\r\n cleanupInterval: 60 * 1000,\r\n // by default, manager is disposed after 1 hour of being unused\r\n valueLifetime: this._initProps.unusedClientLifetime ?? 60 * 60 * 1000,\r\n // add some logging\r\n onCreated: /* istanbul ignore next */(id: string, value: ClientStoreItem, onValueUsed: () => void) => {\r\n Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Created a PresentationManager instance with ID: ${id}. Total instances: ${this._clientsStorage?.values.length}.`);\r\n value.manager.setOnManagerUsedHandler(onValueUsed);\r\n },\r\n onDisposedSingle: /* istanbul ignore next */(id: string) => Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Disposed PresentationManager instance with ID: ${id}. Total instances: ${this._clientsStorage?.values.length}.`),\r\n onDisposedAll: /* istanbul ignore next */() => Logger.logInfo(PresentationBackendLoggerCategory.PresentationManager, `Disposed all PresentationManager instances.`),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Terminates Presentation. Consumers don't need to call this as it's automatically\r\n * called on [IModelHost.onBeforeShutdown]($core-backend) event.\r\n */\r\n public static terminate(): void {\r\n if (this._clientsStorage) {\r\n this._clientsStorage.dispose();\r\n this._clientsStorage = undefined;\r\n }\r\n if (this._shutdownListener) {\r\n this._shutdownListener();\r\n this._shutdownListener = undefined;\r\n }\r\n if (this._manager) {\r\n this._manager.dispose();\r\n this._manager = undefined;\r\n }\r\n RpcManager.unregisterImpl(PresentationRpcInterface);\r\n if (this._disposeIpcHandler) {\r\n this._disposeIpcHandler();\r\n }\r\n this._initProps = undefined;\r\n if (this._requestTimeout)\r\n this._requestTimeout = undefined;\r\n }\r\n\r\n private static createClientManager(clientId: string): ClientStoreItem {\r\n let manager: PresentationManager;\r\n if (Presentation._initProps && !isSingleManagerProps(Presentation._initProps) && Presentation._initProps.clientManagerFactory)\r\n manager = Presentation._initProps.clientManagerFactory(clientId, Presentation._initProps);\r\n else\r\n manager = new PresentationManager(Presentation._initProps);\r\n return { manager };\r\n }\r\n\r\n private static disposeClientManager(storeItem: ClientStoreItem) {\r\n storeItem.manager.dispose();\r\n }\r\n\r\n /**\r\n * Get an instance of [[PresentationManager]] for specific client\r\n * @param clientId ID of the client requesting presentation data. If no\r\n * ID is provided, the default [[PresentationManager]] is returned.\r\n */\r\n public static getManager(clientId?: string): PresentationManager {\r\n if (this._initProps && isSingleManagerProps(this._initProps) && this._manager)\r\n return this._manager;\r\n if (this._clientsStorage)\r\n return this._clientsStorage.getValue(clientId || \"\").manager;\r\n\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Presentation must be first initialized by calling Presentation.initialize\");\r\n }\r\n\r\n /**\r\n * Get the time in milliseconds that backend should respond in .\r\n */\r\n public static getRequestTimeout(): number {\r\n if (this._requestTimeout === undefined)\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Presentation must be first initialized by calling Presentation.initialize\");\r\n return this._requestTimeout;\r\n }\r\n}\r\n\r\nfunction isSingleManagerProps(props: PresentationProps): props is SingleManagerPresentationProps {\r\n return !!(props as SingleManagerPresentationProps).useSingleManager;\r\n}\r\n"]}
@@ -113,6 +113,14 @@ export interface UnitSystemFormat {
113
113
  unitSystems: UnitSystemKey[];
114
114
  format: FormatProps;
115
115
  }
116
+ /**
117
+ * Data structure for multiple element properties request response.
118
+ * @alpha
119
+ */
120
+ export interface MultiElementPropertiesResponse {
121
+ total: number;
122
+ iterator: () => AsyncGenerator<ElementProperties[]>;
123
+ }
116
124
  /**
117
125
  * Properties that can be used to configure [[PresentationManager]]
118
126
  * @public
@@ -252,6 +260,7 @@ export declare class PresentationManager {
252
260
  private _isDisposed;
253
261
  private _disposeIModelOpenedListener?;
254
262
  private _updatesTracker?;
263
+ private _onManagerUsed?;
255
264
  /** Get / set active locale used for localizing presentation data */
256
265
  activeLocale: string | undefined;
257
266
  /** Get / set active unit system used to format property values with units */
@@ -265,6 +274,8 @@ export declare class PresentationManager {
265
274
  * Dispose the presentation manager. Must be called to clean up native resources.
266
275
  */
267
276
  dispose(): void;
277
+ /** @internal */
278
+ setOnManagerUsedHandler(handler: () => void): void;
268
279
  /** Properties used to initialize the manager */
269
280
  get props(): PresentationManagerProps;
270
281
  /**
@@ -338,11 +349,11 @@ export declare class PresentationManager {
338
349
  */
339
350
  getElementProperties(requestOptions: Prioritized<SingleElementPropertiesRequestOptions<IModelDb>>): Promise<ElementProperties | undefined>;
340
351
  /**
341
- * Retrieves property data in simplified format for multiple elements specified by class
342
- * or all element.
352
+ * Retrieves property data in simplified format for multiple elements specified by class or all element.
353
+ * @return An object that contains element count and AsyncGenerator to iterate over properties of those elements in batches of undefined size.
343
354
  * @alpha
344
355
  */
345
- getElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>): Promise<PagedResponse<ElementProperties>>;
356
+ getElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>): Promise<MultiElementPropertiesResponse>;
346
357
  private getMultipleElementProperties;
347
358
  /**
348
359
  * Retrieves display label definition of specific item
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationManager.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PresentationManager.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationManager.ts"],"names":[],"mappings":"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"}
@@ -154,6 +154,10 @@ class PresentationManager {
154
154
  }
155
155
  this._isDisposed = true;
156
156
  }
157
+ /** @internal */
158
+ setOnManagerUsedHandler(handler) {
159
+ this._onManagerUsed = handler;
160
+ }
157
161
  /** Properties used to initialize the manager */
158
162
  get props() { return this._props; }
159
163
  /**
@@ -373,26 +377,33 @@ class PresentationManager {
373
377
  return this.getMultipleElementProperties(requestOptions);
374
378
  }
375
379
  async getMultipleElementProperties(requestOptions) {
376
- const { elementClasses, paging, ...optionsNoElementClasses } = requestOptions;
380
+ const { elementClasses, ...optionsNoElementClasses } = requestOptions;
377
381
  const elementsCount = (0, ElementPropertiesHelper_1.getElementsCount)(requestOptions.imodel, requestOptions.elementClasses);
378
- const elementIds = (0, ElementPropertiesHelper_1.getElementIdsByClass)(requestOptions.imodel, elementClasses, paging);
379
- const elementProperties = [];
380
- for (const entry of elementIds) {
381
- const properties = await buildElementsPropertiesInPages(entry[0], entry[1], async (keys) => {
382
- const content = await this.getContent({
383
- ...optionsNoElementClasses,
384
- descriptor: {
385
- displayType: presentation_common_1.DefaultContentDisplayTypes.PropertyPane,
386
- contentFlags: presentation_common_1.ContentFlags.ShowLabels,
387
- },
388
- rulesetOrId: "ElementProperties",
389
- keys,
390
- });
391
- return (0, ElementPropertiesHelper_1.buildElementsProperties)(content);
382
+ const propertiesGetter = async (className, ids) => buildElementsPropertiesInPages(className, ids, async (keys) => {
383
+ const content = await this.getContent({
384
+ ...optionsNoElementClasses,
385
+ descriptor: {
386
+ displayType: presentation_common_1.DefaultContentDisplayTypes.PropertyPane,
387
+ contentFlags: presentation_common_1.ContentFlags.ShowLabels,
388
+ },
389
+ rulesetOrId: "ElementProperties",
390
+ keys,
392
391
  });
393
- elementProperties.push(...properties);
394
- }
395
- return { total: elementsCount, items: elementProperties };
392
+ return (0, ElementPropertiesHelper_1.buildElementsProperties)(content);
393
+ });
394
+ const ELEMENT_IDS_BATCH_SIZE = 1000;
395
+ return {
396
+ total: elementsCount,
397
+ async *iterator() {
398
+ for (const idsByClass of (0, ElementPropertiesHelper_1.iterateElementIds)(requestOptions.imodel, elementClasses, ELEMENT_IDS_BATCH_SIZE)) {
399
+ const propertiesPage = [];
400
+ for (const entry of idsByClass) {
401
+ propertiesPage.push(...(await propertiesGetter(entry[0], entry[1])));
402
+ }
403
+ yield propertiesPage;
404
+ }
405
+ },
406
+ };
396
407
  }
397
408
  /**
398
409
  * Retrieves display label definition of specific item
@@ -450,6 +461,8 @@ class PresentationManager {
450
461
  }
451
462
  async request(params, reviver) {
452
463
  const { requestId, imodel, locale, unitSystem, diagnostics, ...strippedParams } = params;
464
+ if (this._onManagerUsed)
465
+ this._onManagerUsed();
453
466
  const imodelAddon = this.getNativePlatform().getImodelAddon(imodel);
454
467
  const nativeRequestParams = {
455
468
  requestId,
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationManager.js","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationManager.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 * as hash from \"object-hash\";\r\nimport * as path from \"path\";\r\nimport { BriefcaseDb, IModelDb, IModelJsNative, IpcHost } from \"@itwin/core-backend\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { FormatProps, UnitSystemKey } from \"@itwin/core-quantity\";\r\nimport {\r\n Content, ContentDescriptorRequestOptions, ContentFlags, ContentRequestOptions, ContentSourcesRequestOptions, DefaultContentDisplayTypes, Descriptor,\r\n DescriptorOverrides, DiagnosticsOptionsWithHandler, DisplayLabelRequestOptions, DisplayLabelsRequestOptions, DisplayValueGroup,\r\n DistinctValuesRequestOptions, ElementProperties, ElementPropertiesRequestOptions, FilterByInstancePathsHierarchyRequestOptions,\r\n FilterByTextHierarchyRequestOptions, getLocalesDirectory, HierarchyCompareInfo, HierarchyCompareOptions, HierarchyRequestOptions, InstanceKey,\r\n isSingleElementPropertiesRequestOptions, Key, KeySet, LabelDefinition, MultiElementPropertiesRequestOptions, Node, NodeKey, NodePathElement, Paged,\r\n PagedResponse, PresentationError, PresentationStatus, Prioritized, Ruleset, SelectClassInfo, SelectionScope, SelectionScopeRequestOptions,\r\n SingleElementPropertiesRequestOptions,\r\n} from \"@itwin/presentation-common\";\r\nimport { PRESENTATION_BACKEND_ASSETS_ROOT, PRESENTATION_COMMON_ASSETS_ROOT } from \"./Constants\";\r\nimport { buildElementsProperties, getElementIdsByClass, getElementsCount } from \"./ElementPropertiesHelper\";\r\nimport {\r\n createDefaultNativePlatform, NativePlatformDefinition, NativePlatformRequestTypes, NativePresentationDefaultUnitFormats,\r\n NativePresentationKeySetJSON, NativePresentationUnitSystem,\r\n} from \"./NativePlatform\";\r\nimport { RulesetManager, RulesetManagerImpl } from \"./RulesetManager\";\r\nimport { RulesetVariablesManager, RulesetVariablesManagerImpl } from \"./RulesetVariablesManager\";\r\nimport { SelectionScopesHelper } from \"./SelectionScopesHelper\";\r\nimport { UpdatesTracker } from \"./UpdatesTracker\";\r\nimport { getElementKey } from \"./Utils\";\r\n\r\n/**\r\n * Presentation manager working mode.\r\n * @public\r\n */\r\nexport enum PresentationManagerMode {\r\n /**\r\n * Presentation manager assumes iModels are opened in read-only mode and avoids doing some work\r\n * related to reacting to changes in iModels.\r\n */\r\n ReadOnly,\r\n\r\n /**\r\n * Presentation manager assumes iModels are opened in read-write mode and it may need to\r\n * react to changes. This involves some additional work and gives slightly worse performance.\r\n */\r\n ReadWrite,\r\n}\r\n\r\n/**\r\n * Presentation hierarchy cache mode.\r\n * @beta\r\n */\r\nexport enum HierarchyCacheMode {\r\n /**\r\n * Hierarchy cache is created in memory.\r\n */\r\n Memory = \"memory\",\r\n /**\r\n * Hierarchy cache is created on disk. In this mode hierarchy cache is persisted between iModel\r\n * openings.\r\n */\r\n Disk = \"disk\",\r\n /**\r\n * Hierarchy cache is created on disk. In this mode everything is cached in memory while creating hierarchy level\r\n * and persisted in disk cache when whole hierarchy level is created.\r\n */\r\n Hybrid = \"hybrid\",\r\n}\r\n\r\n/**\r\n * Configuration for hierarchy cache.\r\n * @beta\r\n */\r\nexport type HierarchyCacheConfig = MemoryHierarchyCacheConfig | DiskHierarchyCacheConfig | HybridCacheConfig;\r\n\r\n/**\r\n * Base interface for all [[HierarchyCacheConfig]] implementations.\r\n * @beta\r\n */\r\nexport interface HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode;\r\n}\r\n\r\n/**\r\n * Configuration for in-memory hierarchy cache.\r\n * @beta\r\n */\r\nexport interface MemoryHierarchyCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Memory;\r\n}\r\n\r\n/**\r\n * Configuration for persistent disk hierarchy cache.\r\n * @beta\r\n */\r\nexport interface DiskHierarchyCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Disk;\r\n\r\n /**\r\n * A directory for Presentation hierarchy cache. If set, the directory must exist.\r\n *\r\n * The default directory depends on the iModel and the way it's opened.\r\n */\r\n directory?: string;\r\n}\r\n\r\n/**\r\n * Configuration for the experimental hybrid hierarchy cache.\r\n *\r\n * Hybrid cache uses a combination of in-memory and disk caches, which should make it a better\r\n * alternative for cases when there are lots of simultaneous requests.\r\n *\r\n * @beta\r\n */\r\nexport interface HybridCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Hybrid;\r\n\r\n /** Configuration for disk cache used to persist hierarchies. */\r\n disk?: DiskHierarchyCacheConfig;\r\n}\r\n\r\n/**\r\n * Configuration for content cache.\r\n * @public\r\n */\r\nexport interface ContentCacheConfig {\r\n /**\r\n * Maximum number of content descriptors cached in memory for quicker paged content requests.\r\n *\r\n * Defaults to `100`.\r\n *\r\n * @alpha\r\n */\r\n size?: number;\r\n}\r\n\r\n/**\r\n * A data structure that associates unit systems with a format. The associations are used for\r\n * assigning default unit formats for specific phenomenons (see [[PresentationManagerProps.defaultFormats]]).\r\n *\r\n * @public\r\n */\r\nexport interface UnitSystemFormat {\r\n unitSystems: UnitSystemKey[];\r\n format: FormatProps;\r\n}\r\n\r\n/**\r\n * Properties that can be used to configure [[PresentationManager]]\r\n * @public\r\n */\r\nexport interface PresentationManagerProps {\r\n /**\r\n * Path overrides for presentation assets. Need to be overriden by application if it puts these assets someplace else than the default.\r\n *\r\n * By default paths to asset directories are determined during the call of [[Presentation.initialize]] using this algorithm:\r\n *\r\n * - for `presentation-backend` assets:\r\n *\r\n * - if path of `.js` file that contains [[PresentationManager]] definition contains \"presentation-backend\", assume the package is in `node_modules` and the directory structure is:\r\n * - `assets/*\\*\\/*`\r\n * - `presentation-backend/{presentation-backend source files}`\r\n *\r\n * which means the assets can be found through a relative path `../assets/` from the JS file being executed.\r\n *\r\n * - for `presentation-common` assets:\r\n *\r\n * - if path of `.js` files of `presentation-common` package contain \"presentation-common\", assume the package is in `node_modules` and the directory structure is:\r\n * - `assets/*\\*\\/*`\r\n * - `presentation-common/{presentation-common source files}`\r\n *\r\n * which means the assets can be found through a relative path `../assets/` from the package's source files.\r\n *\r\n * - in both cases, if we determine that source files are not in `node_modules`, assume the backend is webpacked into a single file with assets next to it:\r\n * - `assets/*\\*\\/*`\r\n * - `{source file being executed}.js`\r\n *\r\n * which means the assets can be found through a relative path `./assets/` from the `{source file being executed}`.\r\n *\r\n * The overrides can be specified as a single path (when assets of both `presentation-backend` and `presentation-common` packages are merged into a single directory) or as an object with two separate paths for each package.\r\n */\r\n presentationAssetsRoot?: string | {\r\n /** Path to `presentation-backend` assets */\r\n backend: string;\r\n /** Path to `presentation-common` assets */\r\n common: string;\r\n };\r\n\r\n /**\r\n * A list of directories containing application's presentation rulesets.\r\n */\r\n rulesetDirectories?: string[];\r\n\r\n /**\r\n * A list of directories containing application's supplemental presentation rulesets.\r\n */\r\n supplementalRulesetDirectories?: string[];\r\n\r\n /**\r\n * A list of directories containing application's locale-specific localized\r\n * string files (in simplified i18next v3 format)\r\n */\r\n localeDirectories?: string[];\r\n\r\n /**\r\n * Sets the active locale to use when localizing presentation-related\r\n * strings. It can later be changed through [[PresentationManager.activeLocale]].\r\n */\r\n defaultLocale?: string;\r\n\r\n /**\r\n * Sets the active unit system to use for formatting property values with\r\n * units. Default presentation units are used if this is not specified. The active unit\r\n * system can later be changed through [[PresentationManager.activeUnitSystem]] or overriden for each request\r\n * through request options.\r\n */\r\n defaultUnitSystem?: UnitSystemKey;\r\n\r\n /**\r\n * A map of default unit formats to use for formatting properties that don't have a presentation format\r\n * in requested unit system.\r\n */\r\n defaultFormats?: {\r\n [phenomenon: string]: UnitSystemFormat;\r\n };\r\n\r\n /**\r\n * Should schemas preloading be enabled. If true, presentation manager listens\r\n * for `BriefcaseDb.onOpened` event and force pre-loads all ECSchemas.\r\n */\r\n enableSchemasPreload?: boolean;\r\n\r\n /**\r\n * A number of worker threads to use for handling presentation requests. Defaults to `2`.\r\n */\r\n workerThreadsCount?: number;\r\n\r\n /**\r\n * Presentation manager working mode. Backends that use iModels in read-write mode should\r\n * use `ReadWrite`, others might want to set to `ReadOnly` for better performance.\r\n *\r\n * Defaults to [[PresentationManagerMode.ReadWrite]].\r\n */\r\n mode?: PresentationManagerMode;\r\n\r\n /**\r\n * The interval (in milliseconds) used to poll for presentation data changes. Only has\r\n * effect in read-write mode (see [[mode]]).\r\n *\r\n * @alpha\r\n */\r\n updatesPollInterval?: number;\r\n\r\n /** Options for caching. */\r\n caching?: {\r\n /**\r\n * Hierarchies-related caching options.\r\n * @beta\r\n */\r\n hierarchies?: HierarchyCacheConfig;\r\n\r\n /** Content-related caching options. */\r\n content?: ContentCacheConfig;\r\n };\r\n\r\n /**\r\n * Use [SQLite's Memory-Mapped I/O](https://sqlite.org/mmap.html) for worker connections. This mode improves performance of handling\r\n * requests with high I/O intensity, e.g. filtering large tables on non-indexed columns. No downsides have been noticed.\r\n *\r\n * Set to a falsy value to turn off. `true` for memory-mapping the whole iModel. Number value for memory-mapping the specified amount of bytes.\r\n *\r\n * @alpha\r\n */\r\n useMmap?: boolean | number;\r\n\r\n /**\r\n * An identifier which helps separate multiple presentation managers. It's\r\n * mostly useful in tests where multiple presentation managers can co-exist\r\n * and try to share the same resources, which we don't want. With this identifier\r\n * set, managers put their resources into id-named subdirectories.\r\n *\r\n * @internal\r\n */\r\n id?: string;\r\n\r\n /** @internal */\r\n addon?: NativePlatformDefinition;\r\n}\r\n\r\n/**\r\n * Backend Presentation manager which pulls the presentation data from\r\n * an iModel using native platform.\r\n *\r\n * @public\r\n */\r\nexport class PresentationManager {\r\n\r\n private _props: PresentationManagerProps;\r\n private _nativePlatform?: NativePlatformDefinition;\r\n private _rulesets: RulesetManager;\r\n private _isDisposed: boolean;\r\n private _disposeIModelOpenedListener?: () => void;\r\n private _updatesTracker?: UpdatesTracker;\r\n\r\n /** Get / set active locale used for localizing presentation data */\r\n public activeLocale: string | undefined;\r\n\r\n /** Get / set active unit system used to format property values with units */\r\n public activeUnitSystem: UnitSystemKey | undefined;\r\n\r\n /**\r\n * Creates an instance of PresentationManager.\r\n * @param props Optional configuration properties.\r\n */\r\n constructor(props?: PresentationManagerProps) {\r\n this._props = props ?? {};\r\n this._isDisposed = false;\r\n\r\n const mode = props?.mode ?? PresentationManagerMode.ReadWrite;\r\n const isChangeTrackingEnabled = (mode === PresentationManagerMode.ReadWrite && !!props?.updatesPollInterval);\r\n\r\n if (props && props.addon) {\r\n this._nativePlatform = props.addon;\r\n } else {\r\n const nativePlatformImpl = createDefaultNativePlatform({\r\n id: this._props.id ?? \"\",\r\n localeDirectories: createLocaleDirectoryList(props),\r\n taskAllocationsMap: createTaskAllocationsMap(props),\r\n mode,\r\n isChangeTrackingEnabled,\r\n cacheConfig: createCacheConfig(this._props.caching?.hierarchies),\r\n contentCacheSize: this._props.caching?.content?.size,\r\n defaultFormats: toNativeUnitFormatsMap(this._props.defaultFormats),\r\n useMmap: this._props.useMmap,\r\n });\r\n this._nativePlatform = new nativePlatformImpl();\r\n }\r\n\r\n this.setupRulesetDirectories(props);\r\n if (props) {\r\n this.activeLocale = props.defaultLocale;\r\n this.activeUnitSystem = props.defaultUnitSystem;\r\n }\r\n\r\n this._rulesets = new RulesetManagerImpl(this.getNativePlatform);\r\n\r\n if (this._props.enableSchemasPreload)\r\n this._disposeIModelOpenedListener = BriefcaseDb.onOpened.addListener(this.onIModelOpened);\r\n\r\n if (IpcHost.isValid && isChangeTrackingEnabled) {\r\n this._updatesTracker = UpdatesTracker.create({\r\n nativePlatformGetter: this.getNativePlatform,\r\n pollInterval: props.updatesPollInterval!,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the presentation manager. Must be called to clean up native resources.\r\n */\r\n public dispose() {\r\n if (this._nativePlatform) {\r\n this.getNativePlatform().dispose();\r\n this._nativePlatform = undefined;\r\n }\r\n\r\n if (this._disposeIModelOpenedListener)\r\n this._disposeIModelOpenedListener();\r\n\r\n if (this._updatesTracker) {\r\n this._updatesTracker.dispose();\r\n this._updatesTracker = undefined;\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /** Properties used to initialize the manager */\r\n public get props() { return this._props; }\r\n\r\n /**\r\n * Get rulesets manager\r\n */\r\n public rulesets(): RulesetManager { return this._rulesets; }\r\n\r\n /**\r\n * Get ruleset variables manager for specific ruleset\r\n * @param rulesetId Id of the ruleset to get variables manager for\r\n */\r\n public vars(rulesetId: string): RulesetVariablesManager {\r\n return new RulesetVariablesManagerImpl(this.getNativePlatform, rulesetId);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onIModelOpened = (imodel: BriefcaseDb) => {\r\n const imodelAddon = this.getNativePlatform().getImodelAddon(imodel);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.getNativePlatform().forceLoadSchemas(imodelAddon);\r\n };\r\n\r\n /** @internal */\r\n public getNativePlatform = (): NativePlatformDefinition => {\r\n if (this._isDisposed)\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Attempting to use Presentation manager after disposal\");\r\n return this._nativePlatform!;\r\n };\r\n\r\n private setupRulesetDirectories(props?: PresentationManagerProps) {\r\n const supplementalRulesetDirectories = [path.join(getPresentationBackendAssetsRoot(props?.presentationAssetsRoot), \"supplemental-presentation-rules\")];\r\n if (props && props.supplementalRulesetDirectories) {\r\n props.supplementalRulesetDirectories.forEach((dir) => {\r\n if (-1 === supplementalRulesetDirectories.indexOf(dir))\r\n supplementalRulesetDirectories.push(dir);\r\n });\r\n }\r\n this.getNativePlatform().setupSupplementalRulesetDirectories(supplementalRulesetDirectories);\r\n\r\n const primaryRulesetDirectories = [path.join(getPresentationBackendAssetsRoot(props?.presentationAssetsRoot), \"primary-presentation-rules\")];\r\n if (props && props.rulesetDirectories) {\r\n props.rulesetDirectories.forEach((dir) => {\r\n if (-1 === primaryRulesetDirectories.indexOf(dir))\r\n primaryRulesetDirectories.push(dir);\r\n });\r\n }\r\n this.getNativePlatform().setupRulesetDirectories(primaryRulesetDirectories);\r\n }\r\n\r\n private getRulesetIdObject(rulesetOrId: Ruleset | string): { uniqueId: string, parts: { id: string, hash?: string } } {\r\n if (typeof rulesetOrId === \"object\") {\r\n const hashedId = hash.MD5(rulesetOrId);\r\n return {\r\n uniqueId: `${rulesetOrId.id}-${hashedId}`,\r\n parts: {\r\n id: rulesetOrId.id,\r\n hash: hashedId,\r\n },\r\n };\r\n }\r\n return { uniqueId: rulesetOrId, parts: { id: rulesetOrId } };\r\n }\r\n\r\n /** @internal */\r\n public getRulesetId(rulesetOrId: Ruleset | string) {\r\n return this.getRulesetIdObject(rulesetOrId).uniqueId;\r\n }\r\n\r\n private ensureRulesetRegistered(rulesetOrId: Ruleset | string): string {\r\n if (typeof rulesetOrId === \"object\") {\r\n const rulesetWithNativeId = { ...rulesetOrId, id: this.getRulesetId(rulesetOrId) };\r\n return this.rulesets().add(rulesetWithNativeId).id;\r\n }\r\n return rulesetOrId;\r\n }\r\n\r\n /** Registers given ruleset and replaces the ruleset with its ID in the resulting object */\r\n private registerRuleset<TOptions extends { rulesetOrId: Ruleset | string }>(options: TOptions) {\r\n const { rulesetOrId, ...strippedOptions } = options;\r\n const registeredRulesetId = this.ensureRulesetRegistered(rulesetOrId);\r\n return { rulesetId: registeredRulesetId, strippedOptions };\r\n }\r\n\r\n /**\r\n * Retrieves nodes\r\n * @public\r\n */\r\n public async getNodes(requestOptions: Prioritized<Paged<HierarchyRequestOptions<IModelDb, NodeKey>>>): Promise<Node[]> {\r\n const { rulesetId, strippedOptions: { parentKey, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: parentKey ? NativePlatformRequestTypes.GetChildren : NativePlatformRequestTypes.GetRootNodes,\r\n rulesetId,\r\n ...strippedOptions,\r\n nodeKey: parentKey,\r\n };\r\n return this.request(params, Node.listReviver);\r\n }\r\n\r\n /**\r\n * Retrieves nodes count\r\n * @public\r\n */\r\n public async getNodesCount(requestOptions: Prioritized<HierarchyRequestOptions<IModelDb, NodeKey>>): Promise<number> {\r\n const { rulesetId, strippedOptions: { parentKey, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: parentKey ? NativePlatformRequestTypes.GetChildrenCount : NativePlatformRequestTypes.GetRootNodesCount,\r\n rulesetId,\r\n ...strippedOptions,\r\n nodeKey: parentKey,\r\n };\r\n return this.request(params);\r\n }\r\n\r\n /**\r\n * Retrieves paths from root nodes to children nodes according to specified instance key paths. Intersecting paths will be merged.\r\n * TODO: Return results in pages\r\n * @public\r\n */\r\n public async getNodePaths(requestOptions: Prioritized<FilterByInstancePathsHierarchyRequestOptions<IModelDb>>): Promise<NodePathElement[]> {\r\n const { rulesetId, strippedOptions: { instancePaths, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetNodePaths,\r\n rulesetId,\r\n ...strippedOptions,\r\n paths: instancePaths.map((p) => p.map((s) => InstanceKey.toJSON(s))),\r\n };\r\n return this.request(params, NodePathElement.listReviver);\r\n }\r\n\r\n /**\r\n * Retrieves paths from root nodes to nodes containing filter text in their label.\r\n * TODO: Return results in pages\r\n * @public\r\n */\r\n public async getFilteredNodePaths(requestOptions: Prioritized<FilterByTextHierarchyRequestOptions<IModelDb>>): Promise<NodePathElement[]> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetFilteredNodePaths,\r\n rulesetId,\r\n ...strippedOptions,\r\n };\r\n return this.request(params, NodePathElement.listReviver);\r\n }\r\n\r\n /** @beta */\r\n public async getContentSources(requestOptions: Prioritized<ContentSourcesRequestOptions<IModelDb>>): Promise<SelectClassInfo[]> {\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentSources,\r\n rulesetId: \"ElementProperties\",\r\n ...requestOptions,\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? SelectClassInfo.listFromCompressedJSON(value.sources, value.classesMap) : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves the content descriptor which can be used to get content\r\n * @public\r\n */\r\n public async getContentDescriptor(requestOptions: Prioritized<ContentDescriptorRequestOptions<IModelDb, KeySet>>): Promise<Descriptor | undefined> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentDescriptor,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? Descriptor.fromJSON(value) : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves the content set size based on the supplied content descriptor override\r\n * @public\r\n */\r\n public async getContentSetSize(requestOptions: Prioritized<ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>): Promise<number> {\r\n const { rulesetId, strippedOptions: { descriptor, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentSetSize,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n return this.request(params);\r\n }\r\n\r\n /**\r\n * Retrieves the content based on the supplied content descriptor override.\r\n * @public\r\n */\r\n public async getContent(requestOptions: Prioritized<Paged<ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>>): Promise<Content | undefined> {\r\n const { rulesetId, strippedOptions: { descriptor, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContent,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n return this.request(params, Content.reviver);\r\n }\r\n\r\n /**\r\n * Retrieves distinct values of specific field from the content based on the supplied content descriptor override.\r\n * @param requestOptions Options for the request\r\n * @return A promise object that returns either distinct values on success or an error string on error.\r\n * @public\r\n */\r\n public async getPagedDistinctValues(requestOptions: Prioritized<DistinctValuesRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>): Promise<PagedResponse<DisplayValueGroup>> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const { descriptor, keys, ...strippedOptionsNoDescriptorAndKeys } = strippedOptions;\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetPagedDistinctValues,\r\n rulesetId,\r\n ...strippedOptionsNoDescriptorAndKeys,\r\n keys: getKeysForContentRequest(keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? {\r\n total: value.total,\r\n items: value.items.map(DisplayValueGroup.fromJSON),\r\n } : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves property data in a simplified format for a single element specified by ID.\r\n * @beta\r\n */\r\n public async getElementProperties(requestOptions: Prioritized<SingleElementPropertiesRequestOptions<IModelDb>>): Promise<ElementProperties | undefined>;\r\n /**\r\n * Retrieves property data in simplified format for multiple elements specified by class\r\n * or all element.\r\n * @alpha\r\n */\r\n public async getElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>): Promise<PagedResponse<ElementProperties>>;\r\n public async getElementProperties(requestOptions: Prioritized<ElementPropertiesRequestOptions<IModelDb>>): Promise<ElementProperties | undefined | PagedResponse<ElementProperties>> {\r\n if (isSingleElementPropertiesRequestOptions(requestOptions)) {\r\n const { elementId, ...optionsNoElementId } = requestOptions;\r\n const content = await this.getContent({\r\n ...optionsNoElementId,\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.PropertyPane,\r\n contentFlags: ContentFlags.ShowLabels,\r\n },\r\n rulesetOrId: \"ElementProperties\",\r\n keys: new KeySet([{ className: \"BisCore:Element\", id: elementId }]),\r\n });\r\n const properties = buildElementsProperties(content);\r\n return properties[0];\r\n }\r\n\r\n return this.getMultipleElementProperties(requestOptions);\r\n }\r\n\r\n private async getMultipleElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>) {\r\n const { elementClasses, paging, ...optionsNoElementClasses } = requestOptions;\r\n const elementsCount = getElementsCount(requestOptions.imodel, requestOptions.elementClasses);\r\n const elementIds = getElementIdsByClass(requestOptions.imodel, elementClasses, paging);\r\n\r\n const elementProperties: ElementProperties[] = [];\r\n for (const entry of elementIds) {\r\n const properties = await buildElementsPropertiesInPages(entry[0], entry[1], async (keys) => {\r\n const content = await this.getContent({\r\n ...optionsNoElementClasses,\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.PropertyPane,\r\n contentFlags: ContentFlags.ShowLabels,\r\n },\r\n rulesetOrId: \"ElementProperties\",\r\n keys,\r\n });\r\n return buildElementsProperties(content);\r\n });\r\n elementProperties.push(...properties);\r\n }\r\n\r\n return { total: elementsCount, items: elementProperties };\r\n }\r\n\r\n /**\r\n * Retrieves display label definition of specific item\r\n * @public\r\n */\r\n public async getDisplayLabelDefinition(requestOptions: Prioritized<DisplayLabelRequestOptions<IModelDb, InstanceKey>>): Promise<LabelDefinition> {\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetDisplayLabel,\r\n ...requestOptions,\r\n key: InstanceKey.toJSON(requestOptions.key),\r\n };\r\n return this.request(params, LabelDefinition.reviver);\r\n }\r\n\r\n /**\r\n * Retrieves display label definitions of specific items\r\n * @public\r\n */\r\n public async getDisplayLabelDefinitions(requestOptions: Prioritized<Paged<DisplayLabelsRequestOptions<IModelDb, InstanceKey>>>): Promise<LabelDefinition[]> {\r\n const concreteKeys = requestOptions.keys.map((k) => {\r\n if (k.className === \"BisCore:Element\")\r\n return getElementKey(requestOptions.imodel, k.id);\r\n return k;\r\n }).filter<InstanceKey>((k): k is InstanceKey => !!k);\r\n const contentRequestOptions: ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet> = {\r\n ...requestOptions,\r\n rulesetOrId: \"RulesDrivenECPresentationManager_RulesetId_DisplayLabel\",\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.List,\r\n contentFlags: ContentFlags.ShowLabels | ContentFlags.NoFields,\r\n },\r\n keys: new KeySet(concreteKeys),\r\n };\r\n const content = await this.getContent(contentRequestOptions);\r\n return concreteKeys.map((key) => {\r\n const item = content ? content.contentSet.find((it) => it.primaryKeys.length > 0 && InstanceKey.compare(it.primaryKeys[0], key) === 0) : undefined;\r\n if (!item)\r\n return { displayValue: \"\", rawValue: \"\", typeName: \"\" };\r\n return item.label;\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves available selection scopes.\r\n * @public\r\n */\r\n public async getSelectionScopes(_requestOptions: SelectionScopeRequestOptions<IModelDb>): Promise<SelectionScope[]> {\r\n return SelectionScopesHelper.getSelectionScopes();\r\n }\r\n\r\n /**\r\n * Computes selection set based on provided selection scope.\r\n * @public\r\n */\r\n public async computeSelection(requestOptions: SelectionScopeRequestOptions<IModelDb> & { ids: Id64String[], scopeId: string }): Promise<KeySet> {\r\n const { ids, scopeId, ...opts } = requestOptions; // eslint-disable-line @typescript-eslint/no-unused-vars\r\n return SelectionScopesHelper.computeSelection(opts, ids, scopeId);\r\n }\r\n\r\n private async request<TParams extends { diagnostics?: DiagnosticsOptionsWithHandler, requestId: string, imodel: IModelDb, locale?: string, unitSystem?: UnitSystemKey }, TResult>(params: TParams, reviver?: (key: string, value: any) => any): Promise<TResult> {\r\n const { requestId, imodel, locale, unitSystem, diagnostics, ...strippedParams } = params;\r\n const imodelAddon = this.getNativePlatform().getImodelAddon(imodel);\r\n const nativeRequestParams: any = {\r\n requestId,\r\n params: {\r\n locale: normalizeLocale(locale ?? this.activeLocale),\r\n unitSystem: toOptionalNativeUnitSystem(unitSystem ?? this.activeUnitSystem),\r\n ...strippedParams,\r\n },\r\n };\r\n\r\n let diagnosticsListener;\r\n if (diagnostics) {\r\n const { handler: tempDiagnosticsListener, ...diagnosticsOptions } = diagnostics;\r\n diagnosticsListener = tempDiagnosticsListener;\r\n nativeRequestParams.params.diagnostics = diagnosticsOptions;\r\n }\r\n\r\n const response = await this.getNativePlatform().handleRequest(imodelAddon, JSON.stringify(nativeRequestParams));\r\n diagnosticsListener && response.diagnostics && diagnosticsListener([response.diagnostics]);\r\n return JSON.parse(response.result, reviver);\r\n }\r\n\r\n /**\r\n * Compares two hierarchies specified in the request options\r\n * @public\r\n */\r\n public async compareHierarchies(requestOptions: HierarchyCompareOptions<IModelDb, NodeKey>): Promise<HierarchyCompareInfo> {\r\n if (!requestOptions.prev.rulesetOrId && !requestOptions.prev.rulesetVariables)\r\n return { changes: [] };\r\n\r\n const { strippedOptions: { prev, rulesetVariables, ...options } } = this.registerRuleset(requestOptions);\r\n\r\n const currRulesetId = this.getRulesetIdObject(requestOptions.rulesetOrId);\r\n const prevRulesetId = prev.rulesetOrId ? this.getRulesetIdObject(prev.rulesetOrId) : currRulesetId;\r\n if (prevRulesetId.parts.id !== currRulesetId.parts.id)\r\n throw new PresentationError(PresentationStatus.InvalidArgument, \"Can't compare rulesets with different IDs\");\r\n\r\n const currRulesetVariables = rulesetVariables ?? [];\r\n const prevRulesetVariables = prev.rulesetVariables ?? currRulesetVariables;\r\n\r\n const params = {\r\n requestId: NativePlatformRequestTypes.CompareHierarchies,\r\n ...options,\r\n prevRulesetId: prevRulesetId.uniqueId,\r\n currRulesetId: currRulesetId.uniqueId,\r\n prevRulesetVariables: JSON.stringify(prevRulesetVariables),\r\n currRulesetVariables: JSON.stringify(currRulesetVariables),\r\n expandedNodeKeys: JSON.stringify(options.expandedNodeKeys ?? []),\r\n };\r\n return this.request(params, (key: string, value: any) => ((key === \"\") ? HierarchyCompareInfo.fromJSON(value) : value));\r\n }\r\n}\r\n\r\nfunction addInstanceKey(classInstancesMap: Map<string, Set<string>>, key: InstanceKey) {\r\n let set = classInstancesMap.get(key.className);\r\n // istanbul ignore else\r\n if (!set) {\r\n set = new Set();\r\n classInstancesMap.set(key.className, set);\r\n }\r\n set.add(key.id);\r\n}\r\nfunction bisElementInstanceKeysProcessor(imodel: IModelDb, classInstancesMap: Map<string, Set<string>>) {\r\n const elementClassName = \"BisCore:Element\";\r\n const elementIds = classInstancesMap.get(elementClassName);\r\n if (elementIds) {\r\n const deleteElementIds = new Array<string>();\r\n elementIds.forEach((elementId) => {\r\n const concreteKey = getElementKey(imodel, elementId);\r\n if (concreteKey && concreteKey.className !== elementClassName) {\r\n deleteElementIds.push(elementId);\r\n addInstanceKey(classInstancesMap, { className: concreteKey.className, id: elementId });\r\n }\r\n });\r\n for (const id of deleteElementIds)\r\n elementIds.delete(id);\r\n }\r\n}\r\n/** @internal */\r\nexport function getKeysForContentRequest(keys: Readonly<KeySet>, classInstanceKeysProcessor?: (keys: Map<string, Set<string>>) => void): NativePresentationKeySetJSON {\r\n const result: NativePresentationKeySetJSON = {\r\n instanceKeys: [],\r\n nodeKeys: [],\r\n };\r\n const classInstancesMap = new Map<string, Set<string>>();\r\n keys.forEach((key) => {\r\n if (Key.isNodeKey(key))\r\n result.nodeKeys.push(key);\r\n if (Key.isInstanceKey(key))\r\n addInstanceKey(classInstancesMap, key);\r\n });\r\n\r\n if (classInstanceKeysProcessor)\r\n classInstanceKeysProcessor(classInstancesMap);\r\n\r\n for (const entry of classInstancesMap) {\r\n if (entry[1].size > 0)\r\n result.instanceKeys.push([entry[\"0\"], [...entry[1]]]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nconst createContentDescriptorOverrides = (descriptorOrOverrides: Descriptor | DescriptorOverrides): DescriptorOverrides => {\r\n if (descriptorOrOverrides instanceof Descriptor)\r\n return descriptorOrOverrides.createDescriptorOverrides();\r\n return descriptorOrOverrides;\r\n};\r\n\r\nconst createLocaleDirectoryList = (props?: PresentationManagerProps) => {\r\n const localeDirectories = [getLocalesDirectory(getPresentationCommonAssetsRoot(props?.presentationAssetsRoot))];\r\n if (props && props.localeDirectories) {\r\n props.localeDirectories.forEach((dir) => {\r\n if (-1 === localeDirectories.indexOf(dir))\r\n localeDirectories.push(dir);\r\n });\r\n }\r\n return localeDirectories;\r\n};\r\n\r\nconst createTaskAllocationsMap = (props?: PresentationManagerProps) => {\r\n const count = props?.workerThreadsCount ?? 2;\r\n return {\r\n [Number.MAX_SAFE_INTEGER]: count,\r\n };\r\n};\r\n\r\nconst normalizeLocale = (locale?: string) => {\r\n if (!locale)\r\n return undefined;\r\n return locale.toLocaleLowerCase();\r\n};\r\n\r\nconst normalizeDirectory = (directory?: string) => {\r\n return directory ? path.resolve(directory) : \"\";\r\n};\r\n\r\nconst toNativeUnitSystem = (unitSystem: UnitSystemKey) => {\r\n switch (unitSystem) {\r\n case \"imperial\": return NativePresentationUnitSystem.BritishImperial;\r\n case \"metric\": return NativePresentationUnitSystem.Metric;\r\n case \"usCustomary\": return NativePresentationUnitSystem.UsCustomary;\r\n case \"usSurvey\": return NativePresentationUnitSystem.UsSurvey;\r\n }\r\n};\r\n\r\nconst toOptionalNativeUnitSystem = (unitSystem: UnitSystemKey | undefined) => {\r\n return unitSystem ? toNativeUnitSystem(unitSystem) : undefined;\r\n};\r\n\r\nconst toNativeUnitFormatsMap = (map: { [phenomenon: string]: UnitSystemFormat } | undefined) => {\r\n if (!map)\r\n return undefined;\r\n\r\n const nativeFormatsMap: NativePresentationDefaultUnitFormats = {};\r\n Object.keys(map).forEach((phenomenon) => {\r\n const unitSystemsFormat = map[phenomenon];\r\n nativeFormatsMap[phenomenon] = {\r\n unitSystems: unitSystemsFormat.unitSystems.map(toNativeUnitSystem),\r\n format: unitSystemsFormat.format,\r\n };\r\n });\r\n return nativeFormatsMap;\r\n};\r\n\r\nconst createCacheConfig = (config?: HierarchyCacheConfig): IModelJsNative.ECPresentationHierarchyCacheConfig => {\r\n if (config?.mode === HierarchyCacheMode.Disk)\r\n return { ...config, directory: normalizeDirectory(config.directory) };\r\n if (config?.mode === HierarchyCacheMode.Hybrid)\r\n return { ...config, disk: config.disk ? { ...config.disk, directory: normalizeDirectory(config.disk.directory) } : undefined };\r\n if (config?.mode === HierarchyCacheMode.Memory)\r\n return config;\r\n return { mode: HierarchyCacheMode.Disk, directory: \"\" };\r\n};\r\n\r\nconst getPresentationBackendAssetsRoot = (ovr?: string | { backend: string }) => {\r\n if (typeof ovr === \"string\")\r\n return ovr;\r\n if (typeof ovr === \"object\")\r\n return ovr.backend;\r\n return PRESENTATION_BACKEND_ASSETS_ROOT;\r\n};\r\n\r\nconst getPresentationCommonAssetsRoot = (ovr?: string | { common: string }) => {\r\n if (typeof ovr === \"string\")\r\n return ovr;\r\n if (typeof ovr === \"object\")\r\n return ovr.common;\r\n return PRESENTATION_COMMON_ASSETS_ROOT;\r\n};\r\n\r\nconst ELEMENT_PROPERTIES_CONTENT_BATCH_SIZE = 100;\r\nasync function buildElementsPropertiesInPages(className: string, ids: string[], getter: (keys: KeySet) => Promise<ElementProperties[]>) {\r\n const elementProperties: ElementProperties[] = [];\r\n const elementIds = [...ids];\r\n while (elementIds.length > 0) {\r\n const idsPage = elementIds.splice(0, ELEMENT_PROPERTIES_CONTENT_BATCH_SIZE);\r\n const keys = new KeySet(idsPage.map((id) => ({ id, className })));\r\n elementProperties.push(...(await getter(keys)));\r\n }\r\n return elementProperties;\r\n}\r\n"]}
1
+ {"version":3,"file":"PresentationManager.js","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationManager.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 * as hash from \"object-hash\";\r\nimport * as path from \"path\";\r\nimport { BriefcaseDb, IModelDb, IModelJsNative, IpcHost } from \"@itwin/core-backend\";\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { FormatProps, UnitSystemKey } from \"@itwin/core-quantity\";\r\nimport {\r\n Content, ContentDescriptorRequestOptions, ContentFlags, ContentRequestOptions, ContentSourcesRequestOptions, DefaultContentDisplayTypes, Descriptor,\r\n DescriptorOverrides, DiagnosticsOptionsWithHandler, DisplayLabelRequestOptions, DisplayLabelsRequestOptions, DisplayValueGroup,\r\n DistinctValuesRequestOptions, ElementProperties, ElementPropertiesRequestOptions, FilterByInstancePathsHierarchyRequestOptions,\r\n FilterByTextHierarchyRequestOptions, getLocalesDirectory, HierarchyCompareInfo, HierarchyCompareOptions, HierarchyRequestOptions, InstanceKey,\r\n isSingleElementPropertiesRequestOptions, Key, KeySet, LabelDefinition, MultiElementPropertiesRequestOptions, Node, NodeKey, NodePathElement, Paged,\r\n PagedResponse, PresentationError, PresentationStatus, Prioritized, Ruleset, SelectClassInfo, SelectionScope, SelectionScopeRequestOptions,\r\n SingleElementPropertiesRequestOptions,\r\n} from \"@itwin/presentation-common\";\r\nimport { PRESENTATION_BACKEND_ASSETS_ROOT, PRESENTATION_COMMON_ASSETS_ROOT } from \"./Constants\";\r\nimport { buildElementsProperties, getElementsCount, iterateElementIds } from \"./ElementPropertiesHelper\";\r\nimport {\r\n createDefaultNativePlatform, NativePlatformDefinition, NativePlatformRequestTypes, NativePresentationDefaultUnitFormats,\r\n NativePresentationKeySetJSON, NativePresentationUnitSystem,\r\n} from \"./NativePlatform\";\r\nimport { RulesetManager, RulesetManagerImpl } from \"./RulesetManager\";\r\nimport { RulesetVariablesManager, RulesetVariablesManagerImpl } from \"./RulesetVariablesManager\";\r\nimport { SelectionScopesHelper } from \"./SelectionScopesHelper\";\r\nimport { UpdatesTracker } from \"./UpdatesTracker\";\r\nimport { getElementKey } from \"./Utils\";\r\n\r\n/**\r\n * Presentation manager working mode.\r\n * @public\r\n */\r\nexport enum PresentationManagerMode {\r\n /**\r\n * Presentation manager assumes iModels are opened in read-only mode and avoids doing some work\r\n * related to reacting to changes in iModels.\r\n */\r\n ReadOnly,\r\n\r\n /**\r\n * Presentation manager assumes iModels are opened in read-write mode and it may need to\r\n * react to changes. This involves some additional work and gives slightly worse performance.\r\n */\r\n ReadWrite,\r\n}\r\n\r\n/**\r\n * Presentation hierarchy cache mode.\r\n * @beta\r\n */\r\nexport enum HierarchyCacheMode {\r\n /**\r\n * Hierarchy cache is created in memory.\r\n */\r\n Memory = \"memory\",\r\n /**\r\n * Hierarchy cache is created on disk. In this mode hierarchy cache is persisted between iModel\r\n * openings.\r\n */\r\n Disk = \"disk\",\r\n /**\r\n * Hierarchy cache is created on disk. In this mode everything is cached in memory while creating hierarchy level\r\n * and persisted in disk cache when whole hierarchy level is created.\r\n */\r\n Hybrid = \"hybrid\",\r\n}\r\n\r\n/**\r\n * Configuration for hierarchy cache.\r\n * @beta\r\n */\r\nexport type HierarchyCacheConfig = MemoryHierarchyCacheConfig | DiskHierarchyCacheConfig | HybridCacheConfig;\r\n\r\n/**\r\n * Base interface for all [[HierarchyCacheConfig]] implementations.\r\n * @beta\r\n */\r\nexport interface HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode;\r\n}\r\n\r\n/**\r\n * Configuration for in-memory hierarchy cache.\r\n * @beta\r\n */\r\nexport interface MemoryHierarchyCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Memory;\r\n}\r\n\r\n/**\r\n * Configuration for persistent disk hierarchy cache.\r\n * @beta\r\n */\r\nexport interface DiskHierarchyCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Disk;\r\n\r\n /**\r\n * A directory for Presentation hierarchy cache. If set, the directory must exist.\r\n *\r\n * The default directory depends on the iModel and the way it's opened.\r\n */\r\n directory?: string;\r\n}\r\n\r\n/**\r\n * Configuration for the experimental hybrid hierarchy cache.\r\n *\r\n * Hybrid cache uses a combination of in-memory and disk caches, which should make it a better\r\n * alternative for cases when there are lots of simultaneous requests.\r\n *\r\n * @beta\r\n */\r\nexport interface HybridCacheConfig extends HierarchyCacheConfigBase {\r\n mode: HierarchyCacheMode.Hybrid;\r\n\r\n /** Configuration for disk cache used to persist hierarchies. */\r\n disk?: DiskHierarchyCacheConfig;\r\n}\r\n\r\n/**\r\n * Configuration for content cache.\r\n * @public\r\n */\r\nexport interface ContentCacheConfig {\r\n /**\r\n * Maximum number of content descriptors cached in memory for quicker paged content requests.\r\n *\r\n * Defaults to `100`.\r\n *\r\n * @alpha\r\n */\r\n size?: number;\r\n}\r\n\r\n/**\r\n * A data structure that associates unit systems with a format. The associations are used for\r\n * assigning default unit formats for specific phenomenons (see [[PresentationManagerProps.defaultFormats]]).\r\n *\r\n * @public\r\n */\r\nexport interface UnitSystemFormat {\r\n unitSystems: UnitSystemKey[];\r\n format: FormatProps;\r\n}\r\n\r\n/**\r\n * Data structure for multiple element properties request response.\r\n * @alpha\r\n */\r\nexport interface MultiElementPropertiesResponse {\r\n total: number;\r\n iterator: () => AsyncGenerator<ElementProperties[]>;\r\n}\r\n\r\n/**\r\n * Properties that can be used to configure [[PresentationManager]]\r\n * @public\r\n */\r\nexport interface PresentationManagerProps {\r\n /**\r\n * Path overrides for presentation assets. Need to be overriden by application if it puts these assets someplace else than the default.\r\n *\r\n * By default paths to asset directories are determined during the call of [[Presentation.initialize]] using this algorithm:\r\n *\r\n * - for `presentation-backend` assets:\r\n *\r\n * - if path of `.js` file that contains [[PresentationManager]] definition contains \"presentation-backend\", assume the package is in `node_modules` and the directory structure is:\r\n * - `assets/*\\*\\/*`\r\n * - `presentation-backend/{presentation-backend source files}`\r\n *\r\n * which means the assets can be found through a relative path `../assets/` from the JS file being executed.\r\n *\r\n * - for `presentation-common` assets:\r\n *\r\n * - if path of `.js` files of `presentation-common` package contain \"presentation-common\", assume the package is in `node_modules` and the directory structure is:\r\n * - `assets/*\\*\\/*`\r\n * - `presentation-common/{presentation-common source files}`\r\n *\r\n * which means the assets can be found through a relative path `../assets/` from the package's source files.\r\n *\r\n * - in both cases, if we determine that source files are not in `node_modules`, assume the backend is webpacked into a single file with assets next to it:\r\n * - `assets/*\\*\\/*`\r\n * - `{source file being executed}.js`\r\n *\r\n * which means the assets can be found through a relative path `./assets/` from the `{source file being executed}`.\r\n *\r\n * The overrides can be specified as a single path (when assets of both `presentation-backend` and `presentation-common` packages are merged into a single directory) or as an object with two separate paths for each package.\r\n */\r\n presentationAssetsRoot?: string | {\r\n /** Path to `presentation-backend` assets */\r\n backend: string;\r\n /** Path to `presentation-common` assets */\r\n common: string;\r\n };\r\n\r\n /**\r\n * A list of directories containing application's presentation rulesets.\r\n */\r\n rulesetDirectories?: string[];\r\n\r\n /**\r\n * A list of directories containing application's supplemental presentation rulesets.\r\n */\r\n supplementalRulesetDirectories?: string[];\r\n\r\n /**\r\n * A list of directories containing application's locale-specific localized\r\n * string files (in simplified i18next v3 format)\r\n */\r\n localeDirectories?: string[];\r\n\r\n /**\r\n * Sets the active locale to use when localizing presentation-related\r\n * strings. It can later be changed through [[PresentationManager.activeLocale]].\r\n */\r\n defaultLocale?: string;\r\n\r\n /**\r\n * Sets the active unit system to use for formatting property values with\r\n * units. Default presentation units are used if this is not specified. The active unit\r\n * system can later be changed through [[PresentationManager.activeUnitSystem]] or overriden for each request\r\n * through request options.\r\n */\r\n defaultUnitSystem?: UnitSystemKey;\r\n\r\n /**\r\n * A map of default unit formats to use for formatting properties that don't have a presentation format\r\n * in requested unit system.\r\n */\r\n defaultFormats?: {\r\n [phenomenon: string]: UnitSystemFormat;\r\n };\r\n\r\n /**\r\n * Should schemas preloading be enabled. If true, presentation manager listens\r\n * for `BriefcaseDb.onOpened` event and force pre-loads all ECSchemas.\r\n */\r\n enableSchemasPreload?: boolean;\r\n\r\n /**\r\n * A number of worker threads to use for handling presentation requests. Defaults to `2`.\r\n */\r\n workerThreadsCount?: number;\r\n\r\n /**\r\n * Presentation manager working mode. Backends that use iModels in read-write mode should\r\n * use `ReadWrite`, others might want to set to `ReadOnly` for better performance.\r\n *\r\n * Defaults to [[PresentationManagerMode.ReadWrite]].\r\n */\r\n mode?: PresentationManagerMode;\r\n\r\n /**\r\n * The interval (in milliseconds) used to poll for presentation data changes. Only has\r\n * effect in read-write mode (see [[mode]]).\r\n *\r\n * @alpha\r\n */\r\n updatesPollInterval?: number;\r\n\r\n /** Options for caching. */\r\n caching?: {\r\n /**\r\n * Hierarchies-related caching options.\r\n * @beta\r\n */\r\n hierarchies?: HierarchyCacheConfig;\r\n\r\n /** Content-related caching options. */\r\n content?: ContentCacheConfig;\r\n };\r\n\r\n /**\r\n * Use [SQLite's Memory-Mapped I/O](https://sqlite.org/mmap.html) for worker connections. This mode improves performance of handling\r\n * requests with high I/O intensity, e.g. filtering large tables on non-indexed columns. No downsides have been noticed.\r\n *\r\n * Set to a falsy value to turn off. `true` for memory-mapping the whole iModel. Number value for memory-mapping the specified amount of bytes.\r\n *\r\n * @alpha\r\n */\r\n useMmap?: boolean | number;\r\n\r\n /**\r\n * An identifier which helps separate multiple presentation managers. It's\r\n * mostly useful in tests where multiple presentation managers can co-exist\r\n * and try to share the same resources, which we don't want. With this identifier\r\n * set, managers put their resources into id-named subdirectories.\r\n *\r\n * @internal\r\n */\r\n id?: string;\r\n\r\n /** @internal */\r\n addon?: NativePlatformDefinition;\r\n}\r\n\r\n/**\r\n * Backend Presentation manager which pulls the presentation data from\r\n * an iModel using native platform.\r\n *\r\n * @public\r\n */\r\nexport class PresentationManager {\r\n\r\n private _props: PresentationManagerProps;\r\n private _nativePlatform?: NativePlatformDefinition;\r\n private _rulesets: RulesetManager;\r\n private _isDisposed: boolean;\r\n private _disposeIModelOpenedListener?: () => void;\r\n private _updatesTracker?: UpdatesTracker;\r\n private _onManagerUsed?: () => void;\r\n\r\n /** Get / set active locale used for localizing presentation data */\r\n public activeLocale: string | undefined;\r\n\r\n /** Get / set active unit system used to format property values with units */\r\n public activeUnitSystem: UnitSystemKey | undefined;\r\n\r\n /**\r\n * Creates an instance of PresentationManager.\r\n * @param props Optional configuration properties.\r\n */\r\n constructor(props?: PresentationManagerProps) {\r\n this._props = props ?? {};\r\n this._isDisposed = false;\r\n\r\n const mode = props?.mode ?? PresentationManagerMode.ReadWrite;\r\n const isChangeTrackingEnabled = (mode === PresentationManagerMode.ReadWrite && !!props?.updatesPollInterval);\r\n\r\n if (props && props.addon) {\r\n this._nativePlatform = props.addon;\r\n } else {\r\n const nativePlatformImpl = createDefaultNativePlatform({\r\n id: this._props.id ?? \"\",\r\n localeDirectories: createLocaleDirectoryList(props),\r\n taskAllocationsMap: createTaskAllocationsMap(props),\r\n mode,\r\n isChangeTrackingEnabled,\r\n cacheConfig: createCacheConfig(this._props.caching?.hierarchies),\r\n contentCacheSize: this._props.caching?.content?.size,\r\n defaultFormats: toNativeUnitFormatsMap(this._props.defaultFormats),\r\n useMmap: this._props.useMmap,\r\n });\r\n this._nativePlatform = new nativePlatformImpl();\r\n }\r\n\r\n this.setupRulesetDirectories(props);\r\n if (props) {\r\n this.activeLocale = props.defaultLocale;\r\n this.activeUnitSystem = props.defaultUnitSystem;\r\n }\r\n\r\n this._rulesets = new RulesetManagerImpl(this.getNativePlatform);\r\n\r\n if (this._props.enableSchemasPreload)\r\n this._disposeIModelOpenedListener = BriefcaseDb.onOpened.addListener(this.onIModelOpened);\r\n\r\n if (IpcHost.isValid && isChangeTrackingEnabled) {\r\n this._updatesTracker = UpdatesTracker.create({\r\n nativePlatformGetter: this.getNativePlatform,\r\n pollInterval: props.updatesPollInterval!,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the presentation manager. Must be called to clean up native resources.\r\n */\r\n public dispose() {\r\n if (this._nativePlatform) {\r\n this.getNativePlatform().dispose();\r\n this._nativePlatform = undefined;\r\n }\r\n\r\n if (this._disposeIModelOpenedListener)\r\n this._disposeIModelOpenedListener();\r\n\r\n if (this._updatesTracker) {\r\n this._updatesTracker.dispose();\r\n this._updatesTracker = undefined;\r\n }\r\n\r\n this._isDisposed = true;\r\n }\r\n\r\n /** @internal */\r\n public setOnManagerUsedHandler(handler: () => void) {\r\n this._onManagerUsed = handler;\r\n }\r\n\r\n /** Properties used to initialize the manager */\r\n public get props() { return this._props; }\r\n\r\n /**\r\n * Get rulesets manager\r\n */\r\n public rulesets(): RulesetManager { return this._rulesets; }\r\n\r\n /**\r\n * Get ruleset variables manager for specific ruleset\r\n * @param rulesetId Id of the ruleset to get variables manager for\r\n */\r\n public vars(rulesetId: string): RulesetVariablesManager {\r\n return new RulesetVariablesManagerImpl(this.getNativePlatform, rulesetId);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onIModelOpened = (imodel: BriefcaseDb) => {\r\n const imodelAddon = this.getNativePlatform().getImodelAddon(imodel);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.getNativePlatform().forceLoadSchemas(imodelAddon);\r\n };\r\n\r\n /** @internal */\r\n public getNativePlatform = (): NativePlatformDefinition => {\r\n if (this._isDisposed)\r\n throw new PresentationError(PresentationStatus.NotInitialized, \"Attempting to use Presentation manager after disposal\");\r\n return this._nativePlatform!;\r\n };\r\n\r\n private setupRulesetDirectories(props?: PresentationManagerProps) {\r\n const supplementalRulesetDirectories = [path.join(getPresentationBackendAssetsRoot(props?.presentationAssetsRoot), \"supplemental-presentation-rules\")];\r\n if (props && props.supplementalRulesetDirectories) {\r\n props.supplementalRulesetDirectories.forEach((dir) => {\r\n if (-1 === supplementalRulesetDirectories.indexOf(dir))\r\n supplementalRulesetDirectories.push(dir);\r\n });\r\n }\r\n this.getNativePlatform().setupSupplementalRulesetDirectories(supplementalRulesetDirectories);\r\n\r\n const primaryRulesetDirectories = [path.join(getPresentationBackendAssetsRoot(props?.presentationAssetsRoot), \"primary-presentation-rules\")];\r\n if (props && props.rulesetDirectories) {\r\n props.rulesetDirectories.forEach((dir) => {\r\n if (-1 === primaryRulesetDirectories.indexOf(dir))\r\n primaryRulesetDirectories.push(dir);\r\n });\r\n }\r\n this.getNativePlatform().setupRulesetDirectories(primaryRulesetDirectories);\r\n }\r\n\r\n private getRulesetIdObject(rulesetOrId: Ruleset | string): { uniqueId: string, parts: { id: string, hash?: string } } {\r\n if (typeof rulesetOrId === \"object\") {\r\n const hashedId = hash.MD5(rulesetOrId);\r\n return {\r\n uniqueId: `${rulesetOrId.id}-${hashedId}`,\r\n parts: {\r\n id: rulesetOrId.id,\r\n hash: hashedId,\r\n },\r\n };\r\n }\r\n return { uniqueId: rulesetOrId, parts: { id: rulesetOrId } };\r\n }\r\n\r\n /** @internal */\r\n public getRulesetId(rulesetOrId: Ruleset | string) {\r\n return this.getRulesetIdObject(rulesetOrId).uniqueId;\r\n }\r\n\r\n private ensureRulesetRegistered(rulesetOrId: Ruleset | string): string {\r\n if (typeof rulesetOrId === \"object\") {\r\n const rulesetWithNativeId = { ...rulesetOrId, id: this.getRulesetId(rulesetOrId) };\r\n return this.rulesets().add(rulesetWithNativeId).id;\r\n }\r\n return rulesetOrId;\r\n }\r\n\r\n /** Registers given ruleset and replaces the ruleset with its ID in the resulting object */\r\n private registerRuleset<TOptions extends { rulesetOrId: Ruleset | string }>(options: TOptions) {\r\n const { rulesetOrId, ...strippedOptions } = options;\r\n const registeredRulesetId = this.ensureRulesetRegistered(rulesetOrId);\r\n return { rulesetId: registeredRulesetId, strippedOptions };\r\n }\r\n\r\n /**\r\n * Retrieves nodes\r\n * @public\r\n */\r\n public async getNodes(requestOptions: Prioritized<Paged<HierarchyRequestOptions<IModelDb, NodeKey>>>): Promise<Node[]> {\r\n const { rulesetId, strippedOptions: { parentKey, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: parentKey ? NativePlatformRequestTypes.GetChildren : NativePlatformRequestTypes.GetRootNodes,\r\n rulesetId,\r\n ...strippedOptions,\r\n nodeKey: parentKey,\r\n };\r\n return this.request(params, Node.listReviver);\r\n }\r\n\r\n /**\r\n * Retrieves nodes count\r\n * @public\r\n */\r\n public async getNodesCount(requestOptions: Prioritized<HierarchyRequestOptions<IModelDb, NodeKey>>): Promise<number> {\r\n const { rulesetId, strippedOptions: { parentKey, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: parentKey ? NativePlatformRequestTypes.GetChildrenCount : NativePlatformRequestTypes.GetRootNodesCount,\r\n rulesetId,\r\n ...strippedOptions,\r\n nodeKey: parentKey,\r\n };\r\n return this.request(params);\r\n }\r\n\r\n /**\r\n * Retrieves paths from root nodes to children nodes according to specified instance key paths. Intersecting paths will be merged.\r\n * TODO: Return results in pages\r\n * @public\r\n */\r\n public async getNodePaths(requestOptions: Prioritized<FilterByInstancePathsHierarchyRequestOptions<IModelDb>>): Promise<NodePathElement[]> {\r\n const { rulesetId, strippedOptions: { instancePaths, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetNodePaths,\r\n rulesetId,\r\n ...strippedOptions,\r\n paths: instancePaths.map((p) => p.map((s) => InstanceKey.toJSON(s))),\r\n };\r\n return this.request(params, NodePathElement.listReviver);\r\n }\r\n\r\n /**\r\n * Retrieves paths from root nodes to nodes containing filter text in their label.\r\n * TODO: Return results in pages\r\n * @public\r\n */\r\n public async getFilteredNodePaths(requestOptions: Prioritized<FilterByTextHierarchyRequestOptions<IModelDb>>): Promise<NodePathElement[]> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetFilteredNodePaths,\r\n rulesetId,\r\n ...strippedOptions,\r\n };\r\n return this.request(params, NodePathElement.listReviver);\r\n }\r\n\r\n /** @beta */\r\n public async getContentSources(requestOptions: Prioritized<ContentSourcesRequestOptions<IModelDb>>): Promise<SelectClassInfo[]> {\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentSources,\r\n rulesetId: \"ElementProperties\",\r\n ...requestOptions,\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? SelectClassInfo.listFromCompressedJSON(value.sources, value.classesMap) : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves the content descriptor which can be used to get content\r\n * @public\r\n */\r\n public async getContentDescriptor(requestOptions: Prioritized<ContentDescriptorRequestOptions<IModelDb, KeySet>>): Promise<Descriptor | undefined> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentDescriptor,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? Descriptor.fromJSON(value) : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves the content set size based on the supplied content descriptor override\r\n * @public\r\n */\r\n public async getContentSetSize(requestOptions: Prioritized<ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>): Promise<number> {\r\n const { rulesetId, strippedOptions: { descriptor, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContentSetSize,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n return this.request(params);\r\n }\r\n\r\n /**\r\n * Retrieves the content based on the supplied content descriptor override.\r\n * @public\r\n */\r\n public async getContent(requestOptions: Prioritized<Paged<ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>>): Promise<Content | undefined> {\r\n const { rulesetId, strippedOptions: { descriptor, ...strippedOptions } } = this.registerRuleset(requestOptions);\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetContent,\r\n rulesetId,\r\n ...strippedOptions,\r\n keys: getKeysForContentRequest(requestOptions.keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n return this.request(params, Content.reviver);\r\n }\r\n\r\n /**\r\n * Retrieves distinct values of specific field from the content based on the supplied content descriptor override.\r\n * @param requestOptions Options for the request\r\n * @return A promise object that returns either distinct values on success or an error string on error.\r\n * @public\r\n */\r\n public async getPagedDistinctValues(requestOptions: Prioritized<DistinctValuesRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet>>): Promise<PagedResponse<DisplayValueGroup>> {\r\n const { rulesetId, strippedOptions } = this.registerRuleset(requestOptions);\r\n const { descriptor, keys, ...strippedOptionsNoDescriptorAndKeys } = strippedOptions;\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetPagedDistinctValues,\r\n rulesetId,\r\n ...strippedOptionsNoDescriptorAndKeys,\r\n keys: getKeysForContentRequest(keys, (map) => bisElementInstanceKeysProcessor(requestOptions.imodel, map)),\r\n descriptorOverrides: createContentDescriptorOverrides(descriptor),\r\n };\r\n const reviver = (key: string, value: any) => {\r\n return key === \"\" ? {\r\n total: value.total,\r\n items: value.items.map(DisplayValueGroup.fromJSON),\r\n } : value;\r\n };\r\n return this.request(params, reviver);\r\n }\r\n\r\n /**\r\n * Retrieves property data in a simplified format for a single element specified by ID.\r\n * @beta\r\n */\r\n public async getElementProperties(requestOptions: Prioritized<SingleElementPropertiesRequestOptions<IModelDb>>): Promise<ElementProperties | undefined>;\r\n /**\r\n * Retrieves property data in simplified format for multiple elements specified by class or all element.\r\n * @return An object that contains element count and AsyncGenerator to iterate over properties of those elements in batches of undefined size.\r\n * @alpha\r\n */\r\n public async getElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>): Promise<MultiElementPropertiesResponse>;\r\n public async getElementProperties(requestOptions: Prioritized<ElementPropertiesRequestOptions<IModelDb>>): Promise<ElementProperties | undefined | MultiElementPropertiesResponse> {\r\n if (isSingleElementPropertiesRequestOptions(requestOptions)) {\r\n const { elementId, ...optionsNoElementId } = requestOptions;\r\n const content = await this.getContent({\r\n ...optionsNoElementId,\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.PropertyPane,\r\n contentFlags: ContentFlags.ShowLabels,\r\n },\r\n rulesetOrId: \"ElementProperties\",\r\n keys: new KeySet([{ className: \"BisCore:Element\", id: elementId }]),\r\n });\r\n const properties = buildElementsProperties(content);\r\n return properties[0];\r\n }\r\n\r\n return this.getMultipleElementProperties(requestOptions);\r\n }\r\n\r\n private async getMultipleElementProperties(requestOptions: Prioritized<MultiElementPropertiesRequestOptions<IModelDb>>): Promise<MultiElementPropertiesResponse> {\r\n const { elementClasses, ...optionsNoElementClasses } = requestOptions;\r\n const elementsCount = getElementsCount(requestOptions.imodel, requestOptions.elementClasses);\r\n\r\n const propertiesGetter = async (className: string, ids: string[]) => buildElementsPropertiesInPages(className, ids, async (keys) => {\r\n const content = await this.getContent({\r\n ...optionsNoElementClasses,\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.PropertyPane,\r\n contentFlags: ContentFlags.ShowLabels,\r\n },\r\n rulesetOrId: \"ElementProperties\",\r\n keys,\r\n });\r\n return buildElementsProperties(content);\r\n });\r\n\r\n const ELEMENT_IDS_BATCH_SIZE = 1000;\r\n return {\r\n total: elementsCount,\r\n async *iterator() {\r\n for (const idsByClass of iterateElementIds(requestOptions.imodel, elementClasses, ELEMENT_IDS_BATCH_SIZE)) {\r\n const propertiesPage: ElementProperties[] = [];\r\n for (const entry of idsByClass) {\r\n propertiesPage.push(...(await propertiesGetter(entry[0], entry[1])));\r\n }\r\n yield propertiesPage;\r\n }\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Retrieves display label definition of specific item\r\n * @public\r\n */\r\n public async getDisplayLabelDefinition(requestOptions: Prioritized<DisplayLabelRequestOptions<IModelDb, InstanceKey>>): Promise<LabelDefinition> {\r\n const params = {\r\n requestId: NativePlatformRequestTypes.GetDisplayLabel,\r\n ...requestOptions,\r\n key: InstanceKey.toJSON(requestOptions.key),\r\n };\r\n return this.request(params, LabelDefinition.reviver);\r\n }\r\n\r\n /**\r\n * Retrieves display label definitions of specific items\r\n * @public\r\n */\r\n public async getDisplayLabelDefinitions(requestOptions: Prioritized<Paged<DisplayLabelsRequestOptions<IModelDb, InstanceKey>>>): Promise<LabelDefinition[]> {\r\n const concreteKeys = requestOptions.keys.map((k) => {\r\n if (k.className === \"BisCore:Element\")\r\n return getElementKey(requestOptions.imodel, k.id);\r\n return k;\r\n }).filter<InstanceKey>((k): k is InstanceKey => !!k);\r\n const contentRequestOptions: ContentRequestOptions<IModelDb, Descriptor | DescriptorOverrides, KeySet> = {\r\n ...requestOptions,\r\n rulesetOrId: \"RulesDrivenECPresentationManager_RulesetId_DisplayLabel\",\r\n descriptor: {\r\n displayType: DefaultContentDisplayTypes.List,\r\n contentFlags: ContentFlags.ShowLabels | ContentFlags.NoFields,\r\n },\r\n keys: new KeySet(concreteKeys),\r\n };\r\n const content = await this.getContent(contentRequestOptions);\r\n return concreteKeys.map((key) => {\r\n const item = content ? content.contentSet.find((it) => it.primaryKeys.length > 0 && InstanceKey.compare(it.primaryKeys[0], key) === 0) : undefined;\r\n if (!item)\r\n return { displayValue: \"\", rawValue: \"\", typeName: \"\" };\r\n return item.label;\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves available selection scopes.\r\n * @public\r\n */\r\n public async getSelectionScopes(_requestOptions: SelectionScopeRequestOptions<IModelDb>): Promise<SelectionScope[]> {\r\n return SelectionScopesHelper.getSelectionScopes();\r\n }\r\n\r\n /**\r\n * Computes selection set based on provided selection scope.\r\n * @public\r\n */\r\n public async computeSelection(requestOptions: SelectionScopeRequestOptions<IModelDb> & { ids: Id64String[], scopeId: string }): Promise<KeySet> {\r\n const { ids, scopeId, ...opts } = requestOptions; // eslint-disable-line @typescript-eslint/no-unused-vars\r\n return SelectionScopesHelper.computeSelection(opts, ids, scopeId);\r\n }\r\n\r\n private async request<TParams extends { diagnostics?: DiagnosticsOptionsWithHandler, requestId: string, imodel: IModelDb, locale?: string, unitSystem?: UnitSystemKey }, TResult>(params: TParams, reviver?: (key: string, value: any) => any): Promise<TResult> {\r\n const { requestId, imodel, locale, unitSystem, diagnostics, ...strippedParams } = params;\r\n if (this._onManagerUsed)\r\n this._onManagerUsed();\r\n const imodelAddon = this.getNativePlatform().getImodelAddon(imodel);\r\n const nativeRequestParams: any = {\r\n requestId,\r\n params: {\r\n locale: normalizeLocale(locale ?? this.activeLocale),\r\n unitSystem: toOptionalNativeUnitSystem(unitSystem ?? this.activeUnitSystem),\r\n ...strippedParams,\r\n },\r\n };\r\n\r\n let diagnosticsListener;\r\n if (diagnostics) {\r\n const { handler: tempDiagnosticsListener, ...diagnosticsOptions } = diagnostics;\r\n diagnosticsListener = tempDiagnosticsListener;\r\n nativeRequestParams.params.diagnostics = diagnosticsOptions;\r\n }\r\n\r\n const response = await this.getNativePlatform().handleRequest(imodelAddon, JSON.stringify(nativeRequestParams));\r\n diagnosticsListener && response.diagnostics && diagnosticsListener([response.diagnostics]);\r\n return JSON.parse(response.result, reviver);\r\n }\r\n\r\n /**\r\n * Compares two hierarchies specified in the request options\r\n * @public\r\n */\r\n public async compareHierarchies(requestOptions: HierarchyCompareOptions<IModelDb, NodeKey>): Promise<HierarchyCompareInfo> {\r\n if (!requestOptions.prev.rulesetOrId && !requestOptions.prev.rulesetVariables)\r\n return { changes: [] };\r\n\r\n const { strippedOptions: { prev, rulesetVariables, ...options } } = this.registerRuleset(requestOptions);\r\n\r\n const currRulesetId = this.getRulesetIdObject(requestOptions.rulesetOrId);\r\n const prevRulesetId = prev.rulesetOrId ? this.getRulesetIdObject(prev.rulesetOrId) : currRulesetId;\r\n if (prevRulesetId.parts.id !== currRulesetId.parts.id)\r\n throw new PresentationError(PresentationStatus.InvalidArgument, \"Can't compare rulesets with different IDs\");\r\n\r\n const currRulesetVariables = rulesetVariables ?? [];\r\n const prevRulesetVariables = prev.rulesetVariables ?? currRulesetVariables;\r\n\r\n const params = {\r\n requestId: NativePlatformRequestTypes.CompareHierarchies,\r\n ...options,\r\n prevRulesetId: prevRulesetId.uniqueId,\r\n currRulesetId: currRulesetId.uniqueId,\r\n prevRulesetVariables: JSON.stringify(prevRulesetVariables),\r\n currRulesetVariables: JSON.stringify(currRulesetVariables),\r\n expandedNodeKeys: JSON.stringify(options.expandedNodeKeys ?? []),\r\n };\r\n return this.request(params, (key: string, value: any) => ((key === \"\") ? HierarchyCompareInfo.fromJSON(value) : value));\r\n }\r\n}\r\n\r\nfunction addInstanceKey(classInstancesMap: Map<string, Set<string>>, key: InstanceKey) {\r\n let set = classInstancesMap.get(key.className);\r\n // istanbul ignore else\r\n if (!set) {\r\n set = new Set();\r\n classInstancesMap.set(key.className, set);\r\n }\r\n set.add(key.id);\r\n}\r\nfunction bisElementInstanceKeysProcessor(imodel: IModelDb, classInstancesMap: Map<string, Set<string>>) {\r\n const elementClassName = \"BisCore:Element\";\r\n const elementIds = classInstancesMap.get(elementClassName);\r\n if (elementIds) {\r\n const deleteElementIds = new Array<string>();\r\n elementIds.forEach((elementId) => {\r\n const concreteKey = getElementKey(imodel, elementId);\r\n if (concreteKey && concreteKey.className !== elementClassName) {\r\n deleteElementIds.push(elementId);\r\n addInstanceKey(classInstancesMap, { className: concreteKey.className, id: elementId });\r\n }\r\n });\r\n for (const id of deleteElementIds)\r\n elementIds.delete(id);\r\n }\r\n}\r\n/** @internal */\r\nexport function getKeysForContentRequest(keys: Readonly<KeySet>, classInstanceKeysProcessor?: (keys: Map<string, Set<string>>) => void): NativePresentationKeySetJSON {\r\n const result: NativePresentationKeySetJSON = {\r\n instanceKeys: [],\r\n nodeKeys: [],\r\n };\r\n const classInstancesMap = new Map<string, Set<string>>();\r\n keys.forEach((key) => {\r\n if (Key.isNodeKey(key))\r\n result.nodeKeys.push(key);\r\n if (Key.isInstanceKey(key))\r\n addInstanceKey(classInstancesMap, key);\r\n });\r\n\r\n if (classInstanceKeysProcessor)\r\n classInstanceKeysProcessor(classInstancesMap);\r\n\r\n for (const entry of classInstancesMap) {\r\n if (entry[1].size > 0)\r\n result.instanceKeys.push([entry[\"0\"], [...entry[1]]]);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nconst createContentDescriptorOverrides = (descriptorOrOverrides: Descriptor | DescriptorOverrides): DescriptorOverrides => {\r\n if (descriptorOrOverrides instanceof Descriptor)\r\n return descriptorOrOverrides.createDescriptorOverrides();\r\n return descriptorOrOverrides;\r\n};\r\n\r\nconst createLocaleDirectoryList = (props?: PresentationManagerProps) => {\r\n const localeDirectories = [getLocalesDirectory(getPresentationCommonAssetsRoot(props?.presentationAssetsRoot))];\r\n if (props && props.localeDirectories) {\r\n props.localeDirectories.forEach((dir) => {\r\n if (-1 === localeDirectories.indexOf(dir))\r\n localeDirectories.push(dir);\r\n });\r\n }\r\n return localeDirectories;\r\n};\r\n\r\nconst createTaskAllocationsMap = (props?: PresentationManagerProps) => {\r\n const count = props?.workerThreadsCount ?? 2;\r\n return {\r\n [Number.MAX_SAFE_INTEGER]: count,\r\n };\r\n};\r\n\r\nconst normalizeLocale = (locale?: string) => {\r\n if (!locale)\r\n return undefined;\r\n return locale.toLocaleLowerCase();\r\n};\r\n\r\nconst normalizeDirectory = (directory?: string) => {\r\n return directory ? path.resolve(directory) : \"\";\r\n};\r\n\r\nconst toNativeUnitSystem = (unitSystem: UnitSystemKey) => {\r\n switch (unitSystem) {\r\n case \"imperial\": return NativePresentationUnitSystem.BritishImperial;\r\n case \"metric\": return NativePresentationUnitSystem.Metric;\r\n case \"usCustomary\": return NativePresentationUnitSystem.UsCustomary;\r\n case \"usSurvey\": return NativePresentationUnitSystem.UsSurvey;\r\n }\r\n};\r\n\r\nconst toOptionalNativeUnitSystem = (unitSystem: UnitSystemKey | undefined) => {\r\n return unitSystem ? toNativeUnitSystem(unitSystem) : undefined;\r\n};\r\n\r\nconst toNativeUnitFormatsMap = (map: { [phenomenon: string]: UnitSystemFormat } | undefined) => {\r\n if (!map)\r\n return undefined;\r\n\r\n const nativeFormatsMap: NativePresentationDefaultUnitFormats = {};\r\n Object.keys(map).forEach((phenomenon) => {\r\n const unitSystemsFormat = map[phenomenon];\r\n nativeFormatsMap[phenomenon] = {\r\n unitSystems: unitSystemsFormat.unitSystems.map(toNativeUnitSystem),\r\n format: unitSystemsFormat.format,\r\n };\r\n });\r\n return nativeFormatsMap;\r\n};\r\n\r\nconst createCacheConfig = (config?: HierarchyCacheConfig): IModelJsNative.ECPresentationHierarchyCacheConfig => {\r\n if (config?.mode === HierarchyCacheMode.Disk)\r\n return { ...config, directory: normalizeDirectory(config.directory) };\r\n if (config?.mode === HierarchyCacheMode.Hybrid)\r\n return { ...config, disk: config.disk ? { ...config.disk, directory: normalizeDirectory(config.disk.directory) } : undefined };\r\n if (config?.mode === HierarchyCacheMode.Memory)\r\n return config;\r\n return { mode: HierarchyCacheMode.Disk, directory: \"\" };\r\n};\r\n\r\nconst getPresentationBackendAssetsRoot = (ovr?: string | { backend: string }) => {\r\n if (typeof ovr === \"string\")\r\n return ovr;\r\n if (typeof ovr === \"object\")\r\n return ovr.backend;\r\n return PRESENTATION_BACKEND_ASSETS_ROOT;\r\n};\r\n\r\nconst getPresentationCommonAssetsRoot = (ovr?: string | { common: string }) => {\r\n if (typeof ovr === \"string\")\r\n return ovr;\r\n if (typeof ovr === \"object\")\r\n return ovr.common;\r\n return PRESENTATION_COMMON_ASSETS_ROOT;\r\n};\r\n\r\nconst ELEMENT_PROPERTIES_CONTENT_BATCH_SIZE = 100;\r\nasync function buildElementsPropertiesInPages(className: string, ids: string[], getter: (keys: KeySet) => Promise<ElementProperties[]>) {\r\n const elementProperties: ElementProperties[] = [];\r\n const elementIds = [...ids];\r\n while (elementIds.length > 0) {\r\n const idsPage = elementIds.splice(0, ELEMENT_PROPERTIES_CONTENT_BATCH_SIZE);\r\n const keys = new KeySet(idsPage.map((id) => ({ id, className })));\r\n elementProperties.push(...(await getter(keys)));\r\n }\r\n return elementProperties;\r\n}\r\n"]}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { Id64String } from "@itwin/core-bentley";
5
5
  import { IModelRpcProps } from "@itwin/core-common";
6
- import { ContentDescriptorRpcRequestOptions, ContentInstanceKeysRpcRequestOptions, ContentRpcRequestOptions, ContentSourcesRpcRequestOptions, ContentSourcesRpcResult, DescriptorJSON, DisplayLabelRpcRequestOptions, DisplayLabelsRpcRequestOptions, DisplayValueGroupJSON, DistinctValuesRpcRequestOptions, ElementProperties, FilterByInstancePathsHierarchyRpcRequestOptions, FilterByTextHierarchyRpcRequestOptions, HierarchyRpcRequestOptions, ItemJSON, KeySetJSON, LabelDefinitionJSON, MultiElementPropertiesRpcRequestOptions, NodeJSON, NodePathElementJSON, Paged, PagedResponse, PresentationRpcInterface, PresentationRpcResponse, SelectionScope, SelectionScopeRpcRequestOptions, SingleElementPropertiesRpcRequestOptions } from "@itwin/presentation-common";
6
+ import { ContentDescriptorRpcRequestOptions, ContentInstanceKeysRpcRequestOptions, ContentRpcRequestOptions, ContentSourcesRpcRequestOptions, ContentSourcesRpcResult, DescriptorJSON, DisplayLabelRpcRequestOptions, DisplayLabelsRpcRequestOptions, DisplayValueGroupJSON, DistinctValuesRpcRequestOptions, ElementProperties, FilterByInstancePathsHierarchyRpcRequestOptions, FilterByTextHierarchyRpcRequestOptions, HierarchyRpcRequestOptions, ItemJSON, KeySetJSON, LabelDefinitionJSON, NodeJSON, NodePathElementJSON, Paged, PagedResponse, PresentationRpcInterface, PresentationRpcResponse, SelectionScope, SelectionScopeRpcRequestOptions, SingleElementPropertiesRpcRequestOptions } from "@itwin/presentation-common";
7
7
  import { PresentationManager } from "./PresentationManager";
8
8
  /** @internal */
9
9
  export declare const MAX_ALLOWED_PAGE_SIZE = 1000;
@@ -50,7 +50,6 @@ export declare class PresentationRpcImpl extends PresentationRpcInterface {
50
50
  } | undefined>;
51
51
  getPagedContentSet(token: IModelRpcProps, requestOptions: Paged<ContentRpcRequestOptions>): PresentationRpcResponse<PagedResponse<ItemJSON>>;
52
52
  getElementProperties(token: IModelRpcProps, requestOptions: SingleElementPropertiesRpcRequestOptions): PresentationRpcResponse<ElementProperties | undefined>;
53
- getElementProperties(token: IModelRpcProps, requestOptions: MultiElementPropertiesRpcRequestOptions): PresentationRpcResponse<PagedResponse<ElementProperties>>;
54
53
  getPagedDistinctValues(token: IModelRpcProps, requestOptions: DistinctValuesRpcRequestOptions): PresentationRpcResponse<PagedResponse<DisplayValueGroupJSON>>;
55
54
  getContentInstanceKeys(token: IModelRpcProps, requestOptions: ContentInstanceKeysRpcRequestOptions): PresentationRpcResponse<{
56
55
  total: number;
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationRpcImpl.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationRpcImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PresentationRpcImpl.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationRpcImpl.ts"],"names":[],"mappings":"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"}
@@ -206,9 +206,6 @@ class PresentationRpcImpl extends presentation_common_1.PresentationRpcInterface
206
206
  }
207
207
  async getElementProperties(token, requestOptions) {
208
208
  return this.makeRequest(token, "getElementProperties", { ...requestOptions }, async (options) => {
209
- if (!(0, presentation_common_1.isSingleElementPropertiesRequestOptions)(options)) {
210
- options = enforceValidPageSize(options);
211
- }
212
209
  return this.getManager(requestOptions.clientId).getElementProperties(options);
213
210
  });
214
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationRpcImpl.js","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationRpcImpl.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 RPC\r\n */\r\n\r\nimport { IModelDb } from \"@itwin/core-backend\";\r\nimport { Id64String, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelRpcProps } from \"@itwin/core-common\";\r\nimport {\r\n ContentDescriptorRpcRequestOptions, ContentFlags, ContentInstanceKeysRpcRequestOptions, ContentRpcRequestOptions, ContentSourcesRpcRequestOptions,\r\n ContentSourcesRpcResult, DescriptorJSON, DiagnosticsOptions, DiagnosticsScopeLogs, DisplayLabelRpcRequestOptions, DisplayLabelsRpcRequestOptions,\r\n DisplayValueGroup, DisplayValueGroupJSON, DistinctValuesRpcRequestOptions, ElementProperties, ElementPropertiesRpcRequestOptions,\r\n ElementPropertiesRpcResult, FilterByInstancePathsHierarchyRpcRequestOptions, FilterByTextHierarchyRpcRequestOptions, HierarchyRpcRequestOptions,\r\n InstanceKey, isSingleElementPropertiesRequestOptions, ItemJSON, KeySet, KeySetJSON, LabelDefinition, LabelDefinitionJSON,\r\n MultiElementPropertiesRpcRequestOptions, Node, NodeJSON, NodeKey, NodeKeyJSON, NodePathElement, NodePathElementJSON, Paged, PagedResponse,\r\n PageOptions, PresentationError, PresentationRpcInterface, PresentationRpcResponse, PresentationStatus, Ruleset, RulesetVariable,\r\n RulesetVariableJSON, SelectClassInfo, SelectionScope, SelectionScopeRpcRequestOptions, SingleElementPropertiesRpcRequestOptions,\r\n} from \"@itwin/presentation-common\";\r\nimport { PresentationBackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { Presentation } from \"./Presentation\";\r\nimport { PresentationManager } from \"./PresentationManager\";\r\n\r\ntype ContentGetter<TResult = any, TOptions = any> = (requestOptions: TOptions) => TResult;\r\n\r\n/** @internal */\r\nexport const MAX_ALLOWED_PAGE_SIZE = 1000;\r\n/** @internal */\r\nexport const MAX_ALLOWED_KEYS_PAGE_SIZE = 10000;\r\n\r\n/**\r\n * The backend implementation of PresentationRpcInterface. All it's basically\r\n * responsible for is forwarding calls to [[Presentation.manager]].\r\n *\r\n * Consumers should not use this class. Instead, they should register\r\n * [PresentationRpcInterface]($presentation-common):\r\n * ``` ts\r\n * [[include:Backend.Initialization.RpcInterface]]\r\n * ```\r\n *\r\n * @internal\r\n */\r\nexport class PresentationRpcImpl extends PresentationRpcInterface {\r\n\r\n public constructor(_id?: string) {\r\n super();\r\n }\r\n\r\n /**\r\n * Get the maximum result waiting time.\r\n */\r\n public get requestTimeout(): number { return Presentation.getRequestTimeout(); }\r\n\r\n /** Returns an ok response with result inside */\r\n private successResponse<TResult>(result: TResult, diagnostics?: DiagnosticsScopeLogs[]) {\r\n return {\r\n statusCode: PresentationStatus.Success,\r\n result,\r\n diagnostics,\r\n };\r\n }\r\n\r\n /** Returns a bad request response with empty result and an error code */\r\n private errorResponse(errorCode: PresentationStatus, errorMessage?: string, diagnostics?: DiagnosticsScopeLogs[]) {\r\n return {\r\n statusCode: errorCode,\r\n result: undefined,\r\n errorMessage,\r\n diagnostics,\r\n };\r\n }\r\n\r\n /**\r\n * Get the [[PresentationManager]] used by this RPC impl.\r\n */\r\n public getManager(clientId?: string): PresentationManager {\r\n return Presentation.getManager(clientId);\r\n }\r\n\r\n private getIModel(token: IModelRpcProps): IModelDb {\r\n let imodel: IModelDb;\r\n try {\r\n imodel = IModelDb.findByKey(token.key);\r\n } catch {\r\n throw new PresentationError(PresentationStatus.InvalidArgument, \"IModelRpcProps doesn't point to a valid iModel\");\r\n }\r\n return imodel;\r\n }\r\n\r\n private async makeRequest<TRpcOptions extends { rulesetOrId?: Ruleset | string, clientId?: string, diagnostics?: DiagnosticsOptions, rulesetVariables?: RulesetVariableJSON[] }, TResult>(token: IModelRpcProps, requestId: string, requestOptions: TRpcOptions, request: ContentGetter<Promise<TResult>>): PresentationRpcResponse<TResult> {\r\n Logger.logInfo(PresentationBackendLoggerCategory.Rpc, `Received '${requestId}' request. Params: ${JSON.stringify(requestOptions)}`);\r\n let imodel: IModelDb;\r\n try {\r\n imodel = this.getIModel(token);\r\n } catch (e) {\r\n return this.errorResponse((e as PresentationError).errorNumber, (e as PresentationError).message);\r\n }\r\n\r\n const { clientId, diagnostics: diagnosticsOptions, rulesetVariables, ...options } = requestOptions; // eslint-disable-line @typescript-eslint/no-unused-vars\r\n const managerRequestOptions: any = {\r\n ...options,\r\n imodel,\r\n };\r\n\r\n // set up ruleset variables\r\n if (rulesetVariables)\r\n managerRequestOptions.rulesetVariables = rulesetVariables.map(RulesetVariable.fromJSON);\r\n\r\n // set up diagnostics listener\r\n let diagnosticLogs: DiagnosticsScopeLogs[] | undefined;\r\n if (diagnosticsOptions) {\r\n managerRequestOptions.diagnostics = {\r\n ...diagnosticsOptions,\r\n handler: (logs: DiagnosticsScopeLogs[]) => {\r\n // istanbul ignore else\r\n if (!diagnosticLogs)\r\n diagnosticLogs = [];\r\n diagnosticLogs.push(...logs);\r\n },\r\n };\r\n }\r\n\r\n // initiate request\r\n const resultPromise = request(managerRequestOptions)\r\n .then((result) => this.successResponse(result, diagnosticLogs))\r\n .catch((e: PresentationError) => this.errorResponse(e.errorNumber, e.message, diagnosticLogs));\r\n\r\n if (this.requestTimeout === 0)\r\n return resultPromise;\r\n\r\n let timeout: NodeJS.Timeout;\r\n const timeoutPromise = new Promise<any>((_resolve, reject) => {\r\n timeout = setTimeout(() => {\r\n reject(\"Timed out\");\r\n }, this.requestTimeout);\r\n });\r\n\r\n return Promise.race([resultPromise, timeoutPromise])\r\n .catch(() => this.errorResponse(PresentationStatus.BackendTimeout))\r\n .finally(() => clearTimeout(timeout));\r\n }\r\n\r\n public override async getNodesCount(token: IModelRpcProps, requestOptions: HierarchyRpcRequestOptions): PresentationRpcResponse<number> {\r\n return this.makeRequest(token, \"getNodesCount\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n parentKey: nodeKeyFromJson(options.parentKey),\r\n };\r\n return this.getManager(requestOptions.clientId).getNodesCount(options);\r\n });\r\n }\r\n\r\n public override async getPagedNodes(token: IModelRpcProps, requestOptions: Paged<HierarchyRpcRequestOptions>): PresentationRpcResponse<PagedResponse<NodeJSON>> {\r\n return this.makeRequest(token, \"getPagedNodes\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n parentKey: nodeKeyFromJson(options.parentKey),\r\n });\r\n const [nodes, count] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getNodes(options),\r\n this.getManager(requestOptions.clientId).getNodesCount(options),\r\n ]);\r\n return { total: count, items: nodes.map(Node.toJSON) };\r\n });\r\n }\r\n\r\n public override async getNodePaths(token: IModelRpcProps, requestOptions: FilterByInstancePathsHierarchyRpcRequestOptions): PresentationRpcResponse<NodePathElementJSON[]> {\r\n return this.makeRequest(token, \"getNodePaths\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getNodePaths(options);\r\n return result.map(NodePathElement.toJSON);\r\n });\r\n }\r\n\r\n public override async getFilteredNodePaths(token: IModelRpcProps, requestOptions: FilterByTextHierarchyRpcRequestOptions): PresentationRpcResponse<NodePathElementJSON[]> {\r\n return this.makeRequest(token, \"getFilteredNodePaths\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getFilteredNodePaths(options);\r\n return result.map(NodePathElement.toJSON);\r\n });\r\n }\r\n\r\n public override async getContentSources(token: IModelRpcProps, requestOptions: ContentSourcesRpcRequestOptions): PresentationRpcResponse<ContentSourcesRpcResult> {\r\n return this.makeRequest(token, \"getContentSources\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getContentSources(options);\r\n const classesMap = {};\r\n const selectClasses = result.map((sci) => SelectClassInfo.toCompressedJSON(sci, classesMap));\r\n return { sources: selectClasses, classesMap };\r\n });\r\n }\r\n\r\n public override async getContentDescriptor(token: IModelRpcProps, requestOptions: ContentDescriptorRpcRequestOptions): PresentationRpcResponse<DescriptorJSON | undefined> {\r\n return this.makeRequest(token, \"getContentDescriptor\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n };\r\n const descriptor = await this.getManager(requestOptions.clientId).getContentDescriptor(options);\r\n if (descriptor)\r\n return descriptor.toJSON();\r\n return undefined;\r\n });\r\n }\r\n\r\n public override async getContentSetSize(token: IModelRpcProps, requestOptions: ContentRpcRequestOptions): PresentationRpcResponse<number> {\r\n return this.makeRequest(token, \"getContentSetSize\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n };\r\n return this.getManager(requestOptions.clientId).getContentSetSize(options);\r\n });\r\n }\r\n\r\n public override async getPagedContent(token: IModelRpcProps, requestOptions: Paged<ContentRpcRequestOptions>): PresentationRpcResponse<{ descriptor: DescriptorJSON, contentSet: PagedResponse<ItemJSON> } | undefined> {\r\n return this.makeRequest(token, \"getPagedContent\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n });\r\n\r\n const [size, content] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getContentSetSize(options),\r\n this.getManager(requestOptions.clientId).getContent(options),\r\n ]);\r\n\r\n if (!content)\r\n return undefined;\r\n\r\n return {\r\n descriptor: content.descriptor.toJSON(),\r\n contentSet: {\r\n total: size,\r\n items: content.contentSet.map((i) => i.toJSON()),\r\n },\r\n };\r\n });\r\n }\r\n\r\n public override async getPagedContentSet(token: IModelRpcProps, requestOptions: Paged<ContentRpcRequestOptions>): PresentationRpcResponse<PagedResponse<ItemJSON>> {\r\n const content = await this.getPagedContent(token, requestOptions);\r\n return this.successResponse(content.result ? content.result.contentSet : { total: 0, items: [] });\r\n }\r\n\r\n public override async getElementProperties(token: IModelRpcProps, requestOptions: SingleElementPropertiesRpcRequestOptions): PresentationRpcResponse<ElementProperties | undefined>;\r\n public override async getElementProperties(token: IModelRpcProps, requestOptions: MultiElementPropertiesRpcRequestOptions): PresentationRpcResponse<PagedResponse<ElementProperties>>;\r\n public override async getElementProperties(token: IModelRpcProps, requestOptions: ElementPropertiesRpcRequestOptions): PresentationRpcResponse<ElementPropertiesRpcResult> {\r\n return this.makeRequest(token, \"getElementProperties\", { ...requestOptions }, async (options) => {\r\n if (!isSingleElementPropertiesRequestOptions(options)) {\r\n options = enforceValidPageSize(options);\r\n }\r\n return this.getManager(requestOptions.clientId).getElementProperties(options);\r\n });\r\n }\r\n\r\n public override async getPagedDistinctValues(token: IModelRpcProps, requestOptions: DistinctValuesRpcRequestOptions): PresentationRpcResponse<PagedResponse<DisplayValueGroupJSON>> {\r\n return this.makeRequest(token, \"getPagedDistinctValues\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n });\r\n const response = await this.getManager(requestOptions.clientId).getPagedDistinctValues(options);\r\n return {\r\n ...response,\r\n items: response.items.map(DisplayValueGroup.toJSON),\r\n };\r\n });\r\n }\r\n\r\n public override async getContentInstanceKeys(token: IModelRpcProps, requestOptions: ContentInstanceKeysRpcRequestOptions): PresentationRpcResponse<{ total: number, items: KeySetJSON }> {\r\n return this.makeRequest(token, \"getContentInstanceKeys\", requestOptions, async (options) => {\r\n const { displayType, ...optionsNoDisplayType } = options;\r\n options = enforceValidPageSize({\r\n ...optionsNoDisplayType,\r\n keys: KeySet.fromJSON(optionsNoDisplayType.keys),\r\n descriptor: {\r\n displayType,\r\n contentFlags: ContentFlags.KeysOnly,\r\n },\r\n }, MAX_ALLOWED_KEYS_PAGE_SIZE);\r\n\r\n const [size, content] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getContentSetSize(options),\r\n this.getManager(requestOptions.clientId).getContent(options),\r\n ]);\r\n\r\n if (size === 0 || !content)\r\n return { total: 0, items: new KeySet().toJSON() };\r\n\r\n return {\r\n total: size,\r\n items: content.contentSet.reduce((keys, item) => keys.add(item.primaryKeys), new KeySet()).toJSON(),\r\n };\r\n });\r\n }\r\n\r\n public override async getDisplayLabelDefinition(token: IModelRpcProps, requestOptions: DisplayLabelRpcRequestOptions): PresentationRpcResponse<LabelDefinitionJSON> {\r\n return this.makeRequest(token, \"getDisplayLabelDefinition\", requestOptions, async (options) => {\r\n const label = await this.getManager(requestOptions.clientId).getDisplayLabelDefinition(options);\r\n return LabelDefinition.toJSON(label);\r\n });\r\n }\r\n\r\n public override async getPagedDisplayLabelDefinitions(token: IModelRpcProps, requestOptions: DisplayLabelsRpcRequestOptions): PresentationRpcResponse<PagedResponse<LabelDefinitionJSON>> {\r\n const pageOpts = enforceValidPageSize({ paging: { start: 0, size: requestOptions.keys.length } });\r\n if (pageOpts.paging.size < requestOptions.keys.length)\r\n requestOptions.keys.splice(pageOpts.paging.size);\r\n return this.makeRequest(token, \"getPagedDisplayLabelDefinitions\", requestOptions, async (options) => {\r\n const labels = await this.getManager(requestOptions.clientId).getDisplayLabelDefinitions({ ...options, keys: options.keys.map(InstanceKey.fromJSON) });\r\n return {\r\n total: options.keys.length,\r\n items: labels.map(LabelDefinition.toJSON),\r\n };\r\n });\r\n }\r\n\r\n public override async getSelectionScopes(token: IModelRpcProps, requestOptions: SelectionScopeRpcRequestOptions): PresentationRpcResponse<SelectionScope[]> {\r\n return this.makeRequest(token, \"getSelectionScopes\", requestOptions, async (options) =>\r\n this.getManager(requestOptions.clientId).getSelectionScopes(options),\r\n );\r\n }\r\n\r\n public override async computeSelection(token: IModelRpcProps, requestOptions: SelectionScopeRpcRequestOptions, ids: Id64String[], scopeId: string): PresentationRpcResponse<KeySetJSON> {\r\n return this.makeRequest(token, \"computeSelection\", { ...requestOptions, ids, scopeId }, async (options) => {\r\n const keys = await this.getManager(requestOptions.clientId).computeSelection(options);\r\n return keys.toJSON();\r\n });\r\n }\r\n}\r\n\r\nconst enforceValidPageSize = <TOptions extends Paged<object>>(requestOptions: TOptions, maxPageSize = MAX_ALLOWED_PAGE_SIZE): TOptions & { paging: PageOptions } => {\r\n const validPageSize = getValidPageSize(requestOptions.paging?.size, maxPageSize);\r\n if (!requestOptions.paging || requestOptions.paging.size !== validPageSize)\r\n return { ...requestOptions, paging: { ...requestOptions.paging, size: validPageSize } };\r\n return requestOptions as (TOptions & { paging: PageOptions });\r\n};\r\n\r\nconst getValidPageSize = (size: number | undefined, maxPageSize: number) => {\r\n const requestedSize = size ?? 0;\r\n return (requestedSize === 0 || requestedSize > maxPageSize) ? maxPageSize : requestedSize;\r\n};\r\n\r\nconst nodeKeyFromJson = (json: NodeKeyJSON | undefined): NodeKey | undefined => {\r\n if (!json)\r\n return undefined;\r\n return NodeKey.fromJSON(json);\r\n};\r\n"]}
1
+ {"version":3,"file":"PresentationRpcImpl.js","sourceRoot":"","sources":["../../../src/presentation-backend/PresentationRpcImpl.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 RPC\r\n */\r\n\r\nimport { IModelDb } from \"@itwin/core-backend\";\r\nimport { Id64String, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelRpcProps } from \"@itwin/core-common\";\r\nimport {\r\n ContentDescriptorRpcRequestOptions, ContentFlags, ContentInstanceKeysRpcRequestOptions, ContentRpcRequestOptions, ContentSourcesRpcRequestOptions,\r\n ContentSourcesRpcResult, DescriptorJSON, DiagnosticsOptions, DiagnosticsScopeLogs, DisplayLabelRpcRequestOptions, DisplayLabelsRpcRequestOptions,\r\n DisplayValueGroup, DisplayValueGroupJSON, DistinctValuesRpcRequestOptions, ElementProperties,\r\n FilterByInstancePathsHierarchyRpcRequestOptions, FilterByTextHierarchyRpcRequestOptions, HierarchyRpcRequestOptions,\r\n InstanceKey, ItemJSON, KeySet, KeySetJSON, LabelDefinition, LabelDefinitionJSON,\r\n Node, NodeJSON, NodeKey, NodeKeyJSON, NodePathElement, NodePathElementJSON, Paged, PagedResponse,\r\n PageOptions, PresentationError, PresentationRpcInterface, PresentationRpcResponse, PresentationStatus, Ruleset, RulesetVariable,\r\n RulesetVariableJSON, SelectClassInfo, SelectionScope, SelectionScopeRpcRequestOptions, SingleElementPropertiesRpcRequestOptions,\r\n} from \"@itwin/presentation-common\";\r\nimport { PresentationBackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { Presentation } from \"./Presentation\";\r\nimport { PresentationManager } from \"./PresentationManager\";\r\n\r\ntype ContentGetter<TResult = any, TOptions = any> = (requestOptions: TOptions) => TResult;\r\n\r\n/** @internal */\r\nexport const MAX_ALLOWED_PAGE_SIZE = 1000;\r\n/** @internal */\r\nexport const MAX_ALLOWED_KEYS_PAGE_SIZE = 10000;\r\n\r\n/**\r\n * The backend implementation of PresentationRpcInterface. All it's basically\r\n * responsible for is forwarding calls to [[Presentation.manager]].\r\n *\r\n * Consumers should not use this class. Instead, they should register\r\n * [PresentationRpcInterface]($presentation-common):\r\n * ``` ts\r\n * [[include:Backend.Initialization.RpcInterface]]\r\n * ```\r\n *\r\n * @internal\r\n */\r\nexport class PresentationRpcImpl extends PresentationRpcInterface {\r\n\r\n public constructor(_id?: string) {\r\n super();\r\n }\r\n\r\n /**\r\n * Get the maximum result waiting time.\r\n */\r\n public get requestTimeout(): number { return Presentation.getRequestTimeout(); }\r\n\r\n /** Returns an ok response with result inside */\r\n private successResponse<TResult>(result: TResult, diagnostics?: DiagnosticsScopeLogs[]) {\r\n return {\r\n statusCode: PresentationStatus.Success,\r\n result,\r\n diagnostics,\r\n };\r\n }\r\n\r\n /** Returns a bad request response with empty result and an error code */\r\n private errorResponse(errorCode: PresentationStatus, errorMessage?: string, diagnostics?: DiagnosticsScopeLogs[]) {\r\n return {\r\n statusCode: errorCode,\r\n result: undefined,\r\n errorMessage,\r\n diagnostics,\r\n };\r\n }\r\n\r\n /**\r\n * Get the [[PresentationManager]] used by this RPC impl.\r\n */\r\n public getManager(clientId?: string): PresentationManager {\r\n return Presentation.getManager(clientId);\r\n }\r\n\r\n private getIModel(token: IModelRpcProps): IModelDb {\r\n let imodel: IModelDb;\r\n try {\r\n imodel = IModelDb.findByKey(token.key);\r\n } catch {\r\n throw new PresentationError(PresentationStatus.InvalidArgument, \"IModelRpcProps doesn't point to a valid iModel\");\r\n }\r\n return imodel;\r\n }\r\n\r\n private async makeRequest<TRpcOptions extends { rulesetOrId?: Ruleset | string, clientId?: string, diagnostics?: DiagnosticsOptions, rulesetVariables?: RulesetVariableJSON[] }, TResult>(token: IModelRpcProps, requestId: string, requestOptions: TRpcOptions, request: ContentGetter<Promise<TResult>>): PresentationRpcResponse<TResult> {\r\n Logger.logInfo(PresentationBackendLoggerCategory.Rpc, `Received '${requestId}' request. Params: ${JSON.stringify(requestOptions)}`);\r\n let imodel: IModelDb;\r\n try {\r\n imodel = this.getIModel(token);\r\n } catch (e) {\r\n return this.errorResponse((e as PresentationError).errorNumber, (e as PresentationError).message);\r\n }\r\n\r\n const { clientId, diagnostics: diagnosticsOptions, rulesetVariables, ...options } = requestOptions; // eslint-disable-line @typescript-eslint/no-unused-vars\r\n const managerRequestOptions: any = {\r\n ...options,\r\n imodel,\r\n };\r\n\r\n // set up ruleset variables\r\n if (rulesetVariables)\r\n managerRequestOptions.rulesetVariables = rulesetVariables.map(RulesetVariable.fromJSON);\r\n\r\n // set up diagnostics listener\r\n let diagnosticLogs: DiagnosticsScopeLogs[] | undefined;\r\n if (diagnosticsOptions) {\r\n managerRequestOptions.diagnostics = {\r\n ...diagnosticsOptions,\r\n handler: (logs: DiagnosticsScopeLogs[]) => {\r\n // istanbul ignore else\r\n if (!diagnosticLogs)\r\n diagnosticLogs = [];\r\n diagnosticLogs.push(...logs);\r\n },\r\n };\r\n }\r\n\r\n // initiate request\r\n const resultPromise = request(managerRequestOptions)\r\n .then((result) => this.successResponse(result, diagnosticLogs))\r\n .catch((e: PresentationError) => this.errorResponse(e.errorNumber, e.message, diagnosticLogs));\r\n\r\n if (this.requestTimeout === 0)\r\n return resultPromise;\r\n\r\n let timeout: NodeJS.Timeout;\r\n const timeoutPromise = new Promise<any>((_resolve, reject) => {\r\n timeout = setTimeout(() => {\r\n reject(\"Timed out\");\r\n }, this.requestTimeout);\r\n });\r\n\r\n return Promise.race([resultPromise, timeoutPromise])\r\n .catch(() => this.errorResponse(PresentationStatus.BackendTimeout))\r\n .finally(() => clearTimeout(timeout));\r\n }\r\n\r\n public override async getNodesCount(token: IModelRpcProps, requestOptions: HierarchyRpcRequestOptions): PresentationRpcResponse<number> {\r\n return this.makeRequest(token, \"getNodesCount\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n parentKey: nodeKeyFromJson(options.parentKey),\r\n };\r\n return this.getManager(requestOptions.clientId).getNodesCount(options);\r\n });\r\n }\r\n\r\n public override async getPagedNodes(token: IModelRpcProps, requestOptions: Paged<HierarchyRpcRequestOptions>): PresentationRpcResponse<PagedResponse<NodeJSON>> {\r\n return this.makeRequest(token, \"getPagedNodes\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n parentKey: nodeKeyFromJson(options.parentKey),\r\n });\r\n const [nodes, count] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getNodes(options),\r\n this.getManager(requestOptions.clientId).getNodesCount(options),\r\n ]);\r\n return { total: count, items: nodes.map(Node.toJSON) };\r\n });\r\n }\r\n\r\n public override async getNodePaths(token: IModelRpcProps, requestOptions: FilterByInstancePathsHierarchyRpcRequestOptions): PresentationRpcResponse<NodePathElementJSON[]> {\r\n return this.makeRequest(token, \"getNodePaths\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getNodePaths(options);\r\n return result.map(NodePathElement.toJSON);\r\n });\r\n }\r\n\r\n public override async getFilteredNodePaths(token: IModelRpcProps, requestOptions: FilterByTextHierarchyRpcRequestOptions): PresentationRpcResponse<NodePathElementJSON[]> {\r\n return this.makeRequest(token, \"getFilteredNodePaths\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getFilteredNodePaths(options);\r\n return result.map(NodePathElement.toJSON);\r\n });\r\n }\r\n\r\n public override async getContentSources(token: IModelRpcProps, requestOptions: ContentSourcesRpcRequestOptions): PresentationRpcResponse<ContentSourcesRpcResult> {\r\n return this.makeRequest(token, \"getContentSources\", requestOptions, async (options) => {\r\n const result = await this.getManager(requestOptions.clientId).getContentSources(options);\r\n const classesMap = {};\r\n const selectClasses = result.map((sci) => SelectClassInfo.toCompressedJSON(sci, classesMap));\r\n return { sources: selectClasses, classesMap };\r\n });\r\n }\r\n\r\n public override async getContentDescriptor(token: IModelRpcProps, requestOptions: ContentDescriptorRpcRequestOptions): PresentationRpcResponse<DescriptorJSON | undefined> {\r\n return this.makeRequest(token, \"getContentDescriptor\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n };\r\n const descriptor = await this.getManager(requestOptions.clientId).getContentDescriptor(options);\r\n if (descriptor)\r\n return descriptor.toJSON();\r\n return undefined;\r\n });\r\n }\r\n\r\n public override async getContentSetSize(token: IModelRpcProps, requestOptions: ContentRpcRequestOptions): PresentationRpcResponse<number> {\r\n return this.makeRequest(token, \"getContentSetSize\", requestOptions, async (options) => {\r\n options = {\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n };\r\n return this.getManager(requestOptions.clientId).getContentSetSize(options);\r\n });\r\n }\r\n\r\n public override async getPagedContent(token: IModelRpcProps, requestOptions: Paged<ContentRpcRequestOptions>): PresentationRpcResponse<{ descriptor: DescriptorJSON, contentSet: PagedResponse<ItemJSON> } | undefined> {\r\n return this.makeRequest(token, \"getPagedContent\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n });\r\n\r\n const [size, content] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getContentSetSize(options),\r\n this.getManager(requestOptions.clientId).getContent(options),\r\n ]);\r\n\r\n if (!content)\r\n return undefined;\r\n\r\n return {\r\n descriptor: content.descriptor.toJSON(),\r\n contentSet: {\r\n total: size,\r\n items: content.contentSet.map((i) => i.toJSON()),\r\n },\r\n };\r\n });\r\n }\r\n\r\n public override async getPagedContentSet(token: IModelRpcProps, requestOptions: Paged<ContentRpcRequestOptions>): PresentationRpcResponse<PagedResponse<ItemJSON>> {\r\n const content = await this.getPagedContent(token, requestOptions);\r\n return this.successResponse(content.result ? content.result.contentSet : { total: 0, items: [] });\r\n }\r\n\r\n public override async getElementProperties(token: IModelRpcProps, requestOptions: SingleElementPropertiesRpcRequestOptions): PresentationRpcResponse<ElementProperties | undefined> {\r\n return this.makeRequest(token, \"getElementProperties\", { ...requestOptions }, async (options) => {\r\n return this.getManager(requestOptions.clientId).getElementProperties(options);\r\n });\r\n }\r\n\r\n public override async getPagedDistinctValues(token: IModelRpcProps, requestOptions: DistinctValuesRpcRequestOptions): PresentationRpcResponse<PagedResponse<DisplayValueGroupJSON>> {\r\n return this.makeRequest(token, \"getPagedDistinctValues\", requestOptions, async (options) => {\r\n options = enforceValidPageSize({\r\n ...options,\r\n keys: KeySet.fromJSON(options.keys),\r\n });\r\n const response = await this.getManager(requestOptions.clientId).getPagedDistinctValues(options);\r\n return {\r\n ...response,\r\n items: response.items.map(DisplayValueGroup.toJSON),\r\n };\r\n });\r\n }\r\n\r\n public override async getContentInstanceKeys(token: IModelRpcProps, requestOptions: ContentInstanceKeysRpcRequestOptions): PresentationRpcResponse<{ total: number, items: KeySetJSON }> {\r\n return this.makeRequest(token, \"getContentInstanceKeys\", requestOptions, async (options) => {\r\n const { displayType, ...optionsNoDisplayType } = options;\r\n options = enforceValidPageSize({\r\n ...optionsNoDisplayType,\r\n keys: KeySet.fromJSON(optionsNoDisplayType.keys),\r\n descriptor: {\r\n displayType,\r\n contentFlags: ContentFlags.KeysOnly,\r\n },\r\n }, MAX_ALLOWED_KEYS_PAGE_SIZE);\r\n\r\n const [size, content] = await Promise.all([\r\n this.getManager(requestOptions.clientId).getContentSetSize(options),\r\n this.getManager(requestOptions.clientId).getContent(options),\r\n ]);\r\n\r\n if (size === 0 || !content)\r\n return { total: 0, items: new KeySet().toJSON() };\r\n\r\n return {\r\n total: size,\r\n items: content.contentSet.reduce((keys, item) => keys.add(item.primaryKeys), new KeySet()).toJSON(),\r\n };\r\n });\r\n }\r\n\r\n public override async getDisplayLabelDefinition(token: IModelRpcProps, requestOptions: DisplayLabelRpcRequestOptions): PresentationRpcResponse<LabelDefinitionJSON> {\r\n return this.makeRequest(token, \"getDisplayLabelDefinition\", requestOptions, async (options) => {\r\n const label = await this.getManager(requestOptions.clientId).getDisplayLabelDefinition(options);\r\n return LabelDefinition.toJSON(label);\r\n });\r\n }\r\n\r\n public override async getPagedDisplayLabelDefinitions(token: IModelRpcProps, requestOptions: DisplayLabelsRpcRequestOptions): PresentationRpcResponse<PagedResponse<LabelDefinitionJSON>> {\r\n const pageOpts = enforceValidPageSize({ paging: { start: 0, size: requestOptions.keys.length } });\r\n if (pageOpts.paging.size < requestOptions.keys.length)\r\n requestOptions.keys.splice(pageOpts.paging.size);\r\n return this.makeRequest(token, \"getPagedDisplayLabelDefinitions\", requestOptions, async (options) => {\r\n const labels = await this.getManager(requestOptions.clientId).getDisplayLabelDefinitions({ ...options, keys: options.keys.map(InstanceKey.fromJSON) });\r\n return {\r\n total: options.keys.length,\r\n items: labels.map(LabelDefinition.toJSON),\r\n };\r\n });\r\n }\r\n\r\n public override async getSelectionScopes(token: IModelRpcProps, requestOptions: SelectionScopeRpcRequestOptions): PresentationRpcResponse<SelectionScope[]> {\r\n return this.makeRequest(token, \"getSelectionScopes\", requestOptions, async (options) =>\r\n this.getManager(requestOptions.clientId).getSelectionScopes(options),\r\n );\r\n }\r\n\r\n public override async computeSelection(token: IModelRpcProps, requestOptions: SelectionScopeRpcRequestOptions, ids: Id64String[], scopeId: string): PresentationRpcResponse<KeySetJSON> {\r\n return this.makeRequest(token, \"computeSelection\", { ...requestOptions, ids, scopeId }, async (options) => {\r\n const keys = await this.getManager(requestOptions.clientId).computeSelection(options);\r\n return keys.toJSON();\r\n });\r\n }\r\n}\r\n\r\nconst enforceValidPageSize = <TOptions extends Paged<object>>(requestOptions: TOptions, maxPageSize = MAX_ALLOWED_PAGE_SIZE): TOptions & { paging: PageOptions } => {\r\n const validPageSize = getValidPageSize(requestOptions.paging?.size, maxPageSize);\r\n if (!requestOptions.paging || requestOptions.paging.size !== validPageSize)\r\n return { ...requestOptions, paging: { ...requestOptions.paging, size: validPageSize } };\r\n return requestOptions as (TOptions & { paging: PageOptions });\r\n};\r\n\r\nconst getValidPageSize = (size: number | undefined, maxPageSize: number) => {\r\n const requestedSize = size ?? 0;\r\n return (requestedSize === 0 || requestedSize > maxPageSize) ? maxPageSize : requestedSize;\r\n};\r\n\r\nconst nodeKeyFromJson = (json: NodeKeyJSON | undefined): NodeKey | undefined => {\r\n if (!json)\r\n return undefined;\r\n return NodeKey.fromJSON(json);\r\n};\r\n"]}
@@ -67,7 +67,7 @@ class RulesetEmbedder {
67
67
  SELECT ECInstanceId, JsonProperties
68
68
  FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}
69
69
  WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;
70
- for await (const row of this._imodel.query(query, core_common_1.QueryBinder.from({ rulesetId: ruleset.id }), core_common_1.QueryRowFormat.UseJsPropertyNames)) {
70
+ for await (const row of this._imodel.query(query, core_common_1.QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: core_common_1.QueryRowFormat.UseJsPropertyNames })) {
71
71
  const existingRulesetElementId = row.id;
72
72
  const existingRuleset = JSON.parse(row.jsonProperties).jsonProperties;
73
73
  rulesetsWithSameId.push({
@@ -1 +1 @@
1
- {"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.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 * as path from \"path\";\r\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\r\nimport {\r\n DefinitionElement, DefinitionModel, DefinitionPartition, ECSqlStatement, Element, Entity, IModelDb, KnownLocations, Model, Subject,\r\n} from \"@itwin/core-backend\";\r\nimport { assert, DbResult, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n BisCodeSpec, Code, CodeScopeSpec, CodeSpec, DefinitionElementProps, ElementProps, InformationPartitionElementProps, ModelProps, QueryBinder,\r\n QueryRowFormat, SubjectProps,\r\n} from \"@itwin/core-common\";\r\nimport { Ruleset } from \"@itwin/presentation-common\";\r\nimport { PresentationRules } from \"./domain/PresentationRulesDomain\";\r\nimport * as RulesetElements from \"./domain/RulesetElements\";\r\nimport { normalizeVersion } from \"./Utils\";\r\n\r\n/**\r\n * Interface for callbacks which will be called before and after Element/Model updates\r\n * @beta\r\n */\r\ninterface UpdateCallbacks {\r\n onBeforeUpdate: (props: Entity) => Promise<void>;\r\n onAfterUpdate: (props: Entity) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Interface for callbacks which will be called before and after Element/Model is inserted\r\n * @beta\r\n */\r\ninterface InsertCallbacks {\r\n onBeforeInsert: (props: Entity) => Promise<void>;\r\n onAfterInsert: (props: Entity) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\r\n * @beta\r\n */\r\nexport interface RulesetInsertOptions {\r\n /**\r\n * When should insertion be skipped:\r\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\r\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\r\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\r\n * version greater or equal to version of the inserted ruleset.\r\n *\r\n * Defaults to `same-id-and-version-eq`.\r\n */\r\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\r\n\r\n /**\r\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\r\n * - `all` - replace all rulesets with same id.\r\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\r\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\r\n *\r\n * Defaults to `exact`.\r\n */\r\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\r\n\r\n /**\r\n * Callbacks that will be called before and after `Entity` updates\r\n * @beta\r\n */\r\n onEntityUpdate?: UpdateCallbacks;\r\n\r\n /**\r\n * Callbacks that will be called before and after `Entity` is inserted\r\n * @beta\r\n */\r\n onEntityInsert?: InsertCallbacks;\r\n}\r\n\r\n/**\r\n * Properties for creating a `RulesetEmbedder` instance.\r\n * @public\r\n */\r\nexport interface RulesetEmbedderProps {\r\n /** iModel to embed rulesets to */\r\n imodel: IModelDb;\r\n}\r\n\r\n/**\r\n * An API for embedding presentation rulesets into iModels.\r\n * @beta\r\n */\r\nexport class RulesetEmbedder {\r\n\r\n private _imodel: IModelDb;\r\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\r\n private readonly _rulesetModelName = \"PresentationRules\";\r\n private readonly _rulesetSubjectName = \"PresentationRules\";\r\n\r\n /**\r\n * Constructs RulesetEmbedder\r\n */\r\n public constructor(props: RulesetEmbedderProps) {\r\n PresentationRules.registerSchema();\r\n this._imodel = props.imodel;\r\n }\r\n\r\n /**\r\n * Inserts a ruleset into iModel.\r\n * @param ruleset Ruleset to insert.\r\n * @param options Options for inserting a ruleset.\r\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\r\n */\r\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\r\n const normalizedOptions = normalizeRulesetInsertOptions(options);\r\n const rulesetVersion = normalizeVersion(ruleset.version);\r\n\r\n // ensure imodel has PresentationRules schema and required CodeSpecs\r\n await this.handleElementOperationPrerequisites();\r\n\r\n // find all rulesets with the same ID\r\n const rulesetsWithSameId: Array<{\r\n ruleset: Ruleset;\r\n id: Id64String;\r\n normalizedVersion: string;\r\n }> = [];\r\n const query = `\r\n SELECT ECInstanceId, JsonProperties\r\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\r\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\r\n for await (const row of this._imodel.query(query, QueryBinder.from({ rulesetId: ruleset.id }), QueryRowFormat.UseJsPropertyNames)) {\r\n const existingRulesetElementId: Id64String = row.id;\r\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\r\n rulesetsWithSameId.push({\r\n id: existingRulesetElementId,\r\n ruleset: existingRuleset,\r\n normalizedVersion: normalizeVersion(existingRuleset.version),\r\n });\r\n }\r\n\r\n // check if we need to do anything at all\r\n const shouldSkip = normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0\r\n || normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)\r\n || normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion));\r\n if (shouldSkip) {\r\n // we're not inserting anything - return ID of the ruleset element with the highest version\r\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\r\n if (!highest.ruleset.version || curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))\r\n return curr;\r\n return highest;\r\n }, rulesetsWithSameId[0]);\r\n return rulesetEntryWithHighestVersion.id;\r\n }\r\n\r\n // if requested, delete existing rulesets\r\n const rulesetsToRemove: Id64String[] = [];\r\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\r\n switch (normalizedOptions.replaceVersions) {\r\n case \"all\":\r\n return normalizedVersion !== rulesetVersion;\r\n case \"all-lower\":\r\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\r\n }\r\n return false;\r\n };\r\n rulesetsWithSameId.forEach((entry) => {\r\n if (shouldRemove(entry.ruleset, entry.normalizedVersion))\r\n rulesetsToRemove.push(entry.id);\r\n });\r\n this._imodel.elements.deleteElement(rulesetsToRemove);\r\n\r\n // attempt to update ruleset with same ID and version\r\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\r\n if (exactMatch !== undefined) {\r\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\r\n }\r\n\r\n // no exact match found - insert a new ruleset element\r\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\r\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\r\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\r\n }\r\n\r\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\r\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\r\n assert(existingRulesetElement !== undefined);\r\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\r\n\r\n await this.updateElement(existingRulesetElement, callbacks);\r\n\r\n this._imodel.saveChanges();\r\n return existingRulesetElement.id;\r\n }\r\n\r\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\r\n const props: DefinitionElementProps = {\r\n model: model.id,\r\n code: rulesetCode,\r\n classFullName: RulesetElements.Ruleset.classFullName,\r\n jsonProperties: { jsonProperties: ruleset },\r\n };\r\n\r\n const element = await this.insertElement(props, callbacks);\r\n this._imodel.saveChanges();\r\n return element.id;\r\n }\r\n\r\n /**\r\n * Get all rulesets embedded in the iModel.\r\n */\r\n public async getRulesets(): Promise<Ruleset[]> {\r\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName))\r\n return [];\r\n\r\n const rulesetList: Ruleset[] = [];\r\n this._imodel.withPreparedStatement(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`, (statement: ECSqlStatement) => {\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n const row = statement.getRow();\r\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\r\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\r\n rulesetList.push(ruleset);\r\n }\r\n });\r\n return rulesetList;\r\n }\r\n\r\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\r\n const rulesetModel = this.queryRulesetModel();\r\n if (undefined !== rulesetModel)\r\n return rulesetModel;\r\n\r\n const rulesetSubject = await this.insertSubject(callbacks);\r\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\r\n return this.insertDefinitionModel(definitionPartition, callbacks);\r\n }\r\n\r\n private queryRulesetModel(): DefinitionModel | undefined {\r\n const definitionPartition = this.queryDefinitionPartition();\r\n if (undefined === definitionPartition)\r\n return undefined;\r\n\r\n return this._imodel.models.getSubModel(definitionPartition.id);\r\n }\r\n\r\n private queryDefinitionPartition(): DefinitionPartition | undefined {\r\n const subject = this.querySubject();\r\n if (undefined === subject)\r\n return undefined;\r\n\r\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\r\n }\r\n\r\n private querySubject(): DefinitionPartition | undefined {\r\n const root = this._imodel.elements.getRootSubject();\r\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\r\n const code = new Code({\r\n spec: codeSpec.id,\r\n scope: root.id,\r\n value: this._rulesetSubjectName,\r\n });\r\n\r\n return this._imodel.elements.tryGetElement<DefinitionPartition>(code);\r\n }\r\n\r\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\r\n const modelProps: ModelProps = {\r\n modeledElement: definitionPartition,\r\n name: this._rulesetModelName,\r\n classFullName: DefinitionModel.classFullName,\r\n isPrivate: true,\r\n };\r\n\r\n return this.insertModel(modelProps, callbacks);\r\n }\r\n\r\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\r\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\r\n const definitionPartitionProps: InformationPartitionElementProps = {\r\n parent: {\r\n id: rulesetSubject.id,\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n },\r\n model: rulesetSubject.model,\r\n code: partitionCode,\r\n classFullName: DefinitionPartition.classFullName,\r\n };\r\n\r\n return this.insertElement(definitionPartitionProps, callbacks);\r\n }\r\n\r\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\r\n const root = this._imodel.elements.getRootSubject();\r\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\r\n const subjectCode = new Code({\r\n spec: codeSpec.id,\r\n scope: root.id,\r\n value: this._rulesetSubjectName,\r\n });\r\n const subjectProps: SubjectProps = {\r\n classFullName: Subject.classFullName,\r\n model: root.model,\r\n parent: {\r\n id: root.id,\r\n relClassName: \"BisCore:SubjectOwnsSubjects\",\r\n },\r\n code: subjectCode,\r\n };\r\n\r\n return this.insertElement(subjectProps, callbacks);\r\n }\r\n\r\n private async handleElementOperationPrerequisites(): Promise<void> {\r\n if (this._imodel.containsClass(RulesetElements.Ruleset.classFullName))\r\n return;\r\n\r\n // import PresentationRules ECSchema\r\n await this._imodel.importSchemas([this._schemaPath]);\r\n\r\n // insert CodeSpec for ruleset elements\r\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\r\n\r\n this._imodel.saveChanges();\r\n }\r\n\r\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\r\n const element = this._imodel.elements.createElement(props);\r\n // istanbul ignore next\r\n await callbacks?.onBeforeInsert(element);\r\n try {\r\n return this._imodel.elements.getElement(element.insert());\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterInsert(element);\r\n }\r\n }\r\n\r\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\r\n const model = this._imodel.models.createModel(props);\r\n // istanbul ignore next\r\n await callbacks?.onBeforeInsert(model);\r\n try {\r\n model.id = model.insert();\r\n return model;\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterInsert(model);\r\n }\r\n }\r\n\r\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\r\n // istanbul ignore next\r\n await callbacks?.onBeforeUpdate(element);\r\n try {\r\n element.update();\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterUpdate(element);\r\n }\r\n }\r\n}\r\n\r\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\r\n if (options === undefined)\r\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\r\n\r\n return {\r\n skip: options.skip ?? \"same-id-and-version-eq\",\r\n replaceVersions: options.replaceVersions ?? \"exact\",\r\n onEntityUpdate: options.onEntityUpdate,\r\n onEntityInsert: options.onEntityInsert,\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"RulesetEmbedder.js","sourceRoot":"","sources":["../../../src/presentation-backend/RulesetEmbedder.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 * as path from \"path\";\r\nimport { gt as versionGt, gte as versionGte, lt as versionLt } from \"semver\";\r\nimport {\r\n DefinitionElement, DefinitionModel, DefinitionPartition, ECSqlStatement, Element, Entity, IModelDb, KnownLocations, Model, Subject,\r\n} from \"@itwin/core-backend\";\r\nimport { assert, DbResult, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n BisCodeSpec, Code, CodeScopeSpec, CodeSpec, DefinitionElementProps, ElementProps, InformationPartitionElementProps, ModelProps, QueryBinder,\r\n QueryRowFormat, SubjectProps,\r\n} from \"@itwin/core-common\";\r\nimport { Ruleset } from \"@itwin/presentation-common\";\r\nimport { PresentationRules } from \"./domain/PresentationRulesDomain\";\r\nimport * as RulesetElements from \"./domain/RulesetElements\";\r\nimport { normalizeVersion } from \"./Utils\";\r\n\r\n/**\r\n * Interface for callbacks which will be called before and after Element/Model updates\r\n * @beta\r\n */\r\ninterface UpdateCallbacks {\r\n onBeforeUpdate: (props: Entity) => Promise<void>;\r\n onAfterUpdate: (props: Entity) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Interface for callbacks which will be called before and after Element/Model is inserted\r\n * @beta\r\n */\r\ninterface InsertCallbacks {\r\n onBeforeInsert: (props: Entity) => Promise<void>;\r\n onAfterInsert: (props: Entity) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Options for [[RulesetEmbedder.insertRuleset]] operation.\r\n * @beta\r\n */\r\nexport interface RulesetInsertOptions {\r\n /**\r\n * When should insertion be skipped:\r\n * - `same-id` - if iModel already contains a ruleset with the same id and **any** version\r\n * - `same-id-and-version-eq` - if iModel already contains a ruleset with same id and version\r\n * - `same-id-and-version-gte` - if iModel already contains a ruleset with same id and\r\n * version greater or equal to version of the inserted ruleset.\r\n *\r\n * Defaults to `same-id-and-version-eq`.\r\n */\r\n skip?: \"never\" | \"same-id\" | \"same-id-and-version-eq\" | \"same-id-and-version-gte\";\r\n\r\n /**\r\n * Which existing versions of rulesets with same id should be replaced when we insert a new one:\r\n * - `all` - replace all rulesets with same id.\r\n * - `all-lower` - replace rulesets with same id and version lower than the version of inserted ruleset.\r\n * - `exact` - replace only the ruleset whose id and version matches the inserted ruleset.\r\n *\r\n * Defaults to `exact`.\r\n */\r\n replaceVersions?: \"all\" | \"all-lower\" | \"exact\";\r\n\r\n /**\r\n * Callbacks that will be called before and after `Entity` updates\r\n * @beta\r\n */\r\n onEntityUpdate?: UpdateCallbacks;\r\n\r\n /**\r\n * Callbacks that will be called before and after `Entity` is inserted\r\n * @beta\r\n */\r\n onEntityInsert?: InsertCallbacks;\r\n}\r\n\r\n/**\r\n * Properties for creating a `RulesetEmbedder` instance.\r\n * @public\r\n */\r\nexport interface RulesetEmbedderProps {\r\n /** iModel to embed rulesets to */\r\n imodel: IModelDb;\r\n}\r\n\r\n/**\r\n * An API for embedding presentation rulesets into iModels.\r\n * @beta\r\n */\r\nexport class RulesetEmbedder {\r\n\r\n private _imodel: IModelDb;\r\n private readonly _schemaPath = path.join(KnownLocations.nativeAssetsDir, \"ECSchemas/Domain/PresentationRules.ecschema.xml\");\r\n private readonly _rulesetModelName = \"PresentationRules\";\r\n private readonly _rulesetSubjectName = \"PresentationRules\";\r\n\r\n /**\r\n * Constructs RulesetEmbedder\r\n */\r\n public constructor(props: RulesetEmbedderProps) {\r\n PresentationRules.registerSchema();\r\n this._imodel = props.imodel;\r\n }\r\n\r\n /**\r\n * Inserts a ruleset into iModel.\r\n * @param ruleset Ruleset to insert.\r\n * @param options Options for inserting a ruleset.\r\n * @returns ID of inserted ruleset element or, if insertion was skipped, ID of existing ruleset with the same ID and highest version.\r\n */\r\n public async insertRuleset(ruleset: Ruleset, options?: RulesetInsertOptions): Promise<Id64String> {\r\n const normalizedOptions = normalizeRulesetInsertOptions(options);\r\n const rulesetVersion = normalizeVersion(ruleset.version);\r\n\r\n // ensure imodel has PresentationRules schema and required CodeSpecs\r\n await this.handleElementOperationPrerequisites();\r\n\r\n // find all rulesets with the same ID\r\n const rulesetsWithSameId: Array<{\r\n ruleset: Ruleset;\r\n id: Id64String;\r\n normalizedVersion: string;\r\n }> = [];\r\n const query = `\r\n SELECT ECInstanceId, JsonProperties\r\n FROM ${RulesetElements.Ruleset.schema.name}.${RulesetElements.Ruleset.className}\r\n WHERE json_extract(JsonProperties, '$.jsonProperties.id') = :rulesetId`;\r\n for await (const row of this._imodel.query(query, QueryBinder.from({ rulesetId: ruleset.id }), { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\r\n const existingRulesetElementId: Id64String = row.id;\r\n const existingRuleset: Ruleset = JSON.parse(row.jsonProperties).jsonProperties;\r\n rulesetsWithSameId.push({\r\n id: existingRulesetElementId,\r\n ruleset: existingRuleset,\r\n normalizedVersion: normalizeVersion(existingRuleset.version),\r\n });\r\n }\r\n\r\n // check if we need to do anything at all\r\n const shouldSkip = normalizedOptions.skip === \"same-id\" && rulesetsWithSameId.length > 0\r\n || normalizedOptions.skip === \"same-id-and-version-eq\" && rulesetsWithSameId.some((entry) => entry.normalizedVersion === rulesetVersion)\r\n || normalizedOptions.skip === \"same-id-and-version-gte\" && rulesetsWithSameId.some((entry) => versionGte(entry.normalizedVersion, rulesetVersion));\r\n if (shouldSkip) {\r\n // we're not inserting anything - return ID of the ruleset element with the highest version\r\n const rulesetEntryWithHighestVersion = rulesetsWithSameId.reduce((highest, curr) => {\r\n if (!highest.ruleset.version || curr.ruleset.version && versionGt(curr.ruleset.version, highest.ruleset.version))\r\n return curr;\r\n return highest;\r\n }, rulesetsWithSameId[0]);\r\n return rulesetEntryWithHighestVersion.id;\r\n }\r\n\r\n // if requested, delete existing rulesets\r\n const rulesetsToRemove: Id64String[] = [];\r\n const shouldRemove = (_: Ruleset, normalizedVersion: string): boolean => {\r\n switch (normalizedOptions.replaceVersions) {\r\n case \"all\":\r\n return normalizedVersion !== rulesetVersion;\r\n case \"all-lower\":\r\n return normalizedVersion !== rulesetVersion && versionLt(normalizedVersion, rulesetVersion);\r\n }\r\n return false;\r\n };\r\n rulesetsWithSameId.forEach((entry) => {\r\n if (shouldRemove(entry.ruleset, entry.normalizedVersion))\r\n rulesetsToRemove.push(entry.id);\r\n });\r\n this._imodel.elements.deleteElement(rulesetsToRemove);\r\n\r\n // attempt to update ruleset with same ID and version\r\n const exactMatch = rulesetsWithSameId.find((curr) => curr.normalizedVersion === rulesetVersion);\r\n if (exactMatch !== undefined) {\r\n return this.updateRuleset(exactMatch.id, ruleset, normalizedOptions.onEntityUpdate);\r\n }\r\n\r\n // no exact match found - insert a new ruleset element\r\n const model = await this.getOrCreateRulesetModel(normalizedOptions.onEntityInsert);\r\n const rulesetCode = RulesetElements.Ruleset.createRulesetCode(this._imodel, model.id, ruleset);\r\n return this.insertNewRuleset(ruleset, model, rulesetCode, normalizedOptions.onEntityInsert);\r\n }\r\n\r\n private async updateRuleset(elementId: Id64String, ruleset: Ruleset, callbacks?: UpdateCallbacks) {\r\n const existingRulesetElement = this._imodel.elements.tryGetElement<DefinitionElement>(elementId);\r\n assert(existingRulesetElement !== undefined);\r\n existingRulesetElement.jsonProperties.jsonProperties = ruleset;\r\n\r\n await this.updateElement(existingRulesetElement, callbacks);\r\n\r\n this._imodel.saveChanges();\r\n return existingRulesetElement.id;\r\n }\r\n\r\n private async insertNewRuleset(ruleset: Ruleset, model: Model, rulesetCode: Code, callbacks?: InsertCallbacks): Promise<Id64String> {\r\n const props: DefinitionElementProps = {\r\n model: model.id,\r\n code: rulesetCode,\r\n classFullName: RulesetElements.Ruleset.classFullName,\r\n jsonProperties: { jsonProperties: ruleset },\r\n };\r\n\r\n const element = await this.insertElement(props, callbacks);\r\n this._imodel.saveChanges();\r\n return element.id;\r\n }\r\n\r\n /**\r\n * Get all rulesets embedded in the iModel.\r\n */\r\n public async getRulesets(): Promise<Ruleset[]> {\r\n if (!this._imodel.containsClass(RulesetElements.Ruleset.classFullName))\r\n return [];\r\n\r\n const rulesetList: Ruleset[] = [];\r\n this._imodel.withPreparedStatement(`SELECT ECInstanceId AS id FROM ${RulesetElements.Ruleset.classFullName}`, (statement: ECSqlStatement) => {\r\n while (DbResult.BE_SQLITE_ROW === statement.step()) {\r\n const row = statement.getRow();\r\n const rulesetElement = this._imodel.elements.getElement({ id: row.id });\r\n const ruleset = rulesetElement.jsonProperties.jsonProperties;\r\n rulesetList.push(ruleset);\r\n }\r\n });\r\n return rulesetList;\r\n }\r\n\r\n private async getOrCreateRulesetModel(callbacks?: InsertCallbacks): Promise<DefinitionModel> {\r\n const rulesetModel = this.queryRulesetModel();\r\n if (undefined !== rulesetModel)\r\n return rulesetModel;\r\n\r\n const rulesetSubject = await this.insertSubject(callbacks);\r\n const definitionPartition = await this.insertDefinitionPartition(rulesetSubject, callbacks);\r\n return this.insertDefinitionModel(definitionPartition, callbacks);\r\n }\r\n\r\n private queryRulesetModel(): DefinitionModel | undefined {\r\n const definitionPartition = this.queryDefinitionPartition();\r\n if (undefined === definitionPartition)\r\n return undefined;\r\n\r\n return this._imodel.models.getSubModel(definitionPartition.id);\r\n }\r\n\r\n private queryDefinitionPartition(): DefinitionPartition | undefined {\r\n const subject = this.querySubject();\r\n if (undefined === subject)\r\n return undefined;\r\n\r\n return this._imodel.elements.tryGetElement<DefinitionPartition>(DefinitionPartition.createCode(this._imodel, subject.id, this._rulesetModelName));\r\n }\r\n\r\n private querySubject(): DefinitionPartition | undefined {\r\n const root = this._imodel.elements.getRootSubject();\r\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\r\n const code = new Code({\r\n spec: codeSpec.id,\r\n scope: root.id,\r\n value: this._rulesetSubjectName,\r\n });\r\n\r\n return this._imodel.elements.tryGetElement<DefinitionPartition>(code);\r\n }\r\n\r\n private async insertDefinitionModel(definitionPartition: DefinitionPartition, callbacks?: InsertCallbacks): Promise<DefinitionModel> {\r\n const modelProps: ModelProps = {\r\n modeledElement: definitionPartition,\r\n name: this._rulesetModelName,\r\n classFullName: DefinitionModel.classFullName,\r\n isPrivate: true,\r\n };\r\n\r\n return this.insertModel(modelProps, callbacks);\r\n }\r\n\r\n private async insertDefinitionPartition(rulesetSubject: Subject, callbacks?: InsertCallbacks): Promise<DefinitionPartition> {\r\n const partitionCode = DefinitionPartition.createCode(this._imodel, rulesetSubject.id, this._rulesetModelName);\r\n const definitionPartitionProps: InformationPartitionElementProps = {\r\n parent: {\r\n id: rulesetSubject.id,\r\n relClassName: \"BisCore:SubjectOwnsPartitionElements\",\r\n },\r\n model: rulesetSubject.model,\r\n code: partitionCode,\r\n classFullName: DefinitionPartition.classFullName,\r\n };\r\n\r\n return this.insertElement(definitionPartitionProps, callbacks);\r\n }\r\n\r\n private async insertSubject(callbacks?: InsertCallbacks): Promise<Subject> {\r\n const root = this._imodel.elements.getRootSubject();\r\n const codeSpec: CodeSpec = this._imodel.codeSpecs.getByName(BisCodeSpec.subject);\r\n const subjectCode = new Code({\r\n spec: codeSpec.id,\r\n scope: root.id,\r\n value: this._rulesetSubjectName,\r\n });\r\n const subjectProps: SubjectProps = {\r\n classFullName: Subject.classFullName,\r\n model: root.model,\r\n parent: {\r\n id: root.id,\r\n relClassName: \"BisCore:SubjectOwnsSubjects\",\r\n },\r\n code: subjectCode,\r\n };\r\n\r\n return this.insertElement(subjectProps, callbacks);\r\n }\r\n\r\n private async handleElementOperationPrerequisites(): Promise<void> {\r\n if (this._imodel.containsClass(RulesetElements.Ruleset.classFullName))\r\n return;\r\n\r\n // import PresentationRules ECSchema\r\n await this._imodel.importSchemas([this._schemaPath]);\r\n\r\n // insert CodeSpec for ruleset elements\r\n this._imodel.codeSpecs.insert(CodeSpec.create(this._imodel, PresentationRules.CodeSpec.Ruleset, CodeScopeSpec.Type.Model));\r\n\r\n this._imodel.saveChanges();\r\n }\r\n\r\n private async insertElement<TProps extends ElementProps>(props: TProps, callbacks?: InsertCallbacks): Promise<Element> {\r\n const element = this._imodel.elements.createElement(props);\r\n // istanbul ignore next\r\n await callbacks?.onBeforeInsert(element);\r\n try {\r\n return this._imodel.elements.getElement(element.insert());\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterInsert(element);\r\n }\r\n }\r\n\r\n private async insertModel(props: ModelProps, callbacks?: InsertCallbacks): Promise<Model> {\r\n const model = this._imodel.models.createModel(props);\r\n // istanbul ignore next\r\n await callbacks?.onBeforeInsert(model);\r\n try {\r\n model.id = model.insert();\r\n return model;\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterInsert(model);\r\n }\r\n }\r\n\r\n private async updateElement(element: Element, callbacks?: UpdateCallbacks) {\r\n // istanbul ignore next\r\n await callbacks?.onBeforeUpdate(element);\r\n try {\r\n element.update();\r\n } finally {\r\n // istanbul ignore next\r\n await callbacks?.onAfterUpdate(element);\r\n }\r\n }\r\n}\r\n\r\nfunction normalizeRulesetInsertOptions(options?: RulesetInsertOptions): RulesetInsertOptions {\r\n if (options === undefined)\r\n return { skip: \"same-id-and-version-eq\", replaceVersions: \"exact\" };\r\n\r\n return {\r\n skip: options.skip ?? \"same-id-and-version-eq\",\r\n replaceVersions: options.replaceVersions ?? \"exact\",\r\n onEntityUpdate: options.onEntityUpdate,\r\n onEntityInsert: options.onEntityInsert,\r\n };\r\n}\r\n"]}
@@ -11,7 +11,7 @@ export interface TemporaryStorageProps<T> {
11
11
  factory: (id: string) => T;
12
12
  /** A method that's called for every value before it's removed from storage */
13
13
  cleanupHandler?: (value: T) => void;
14
- onCreated?: (id: string) => void;
14
+ onCreated?: (id: string, value: T, onValueUsed: () => void) => void;
15
15
  onDisposedSingle?: (id: string) => void;
16
16
  onDisposedAll?: () => void;
17
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TemporaryStorage.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/TemporaryStorage.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,yEAAyE;IACzE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,CAAC;IAE3B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAEpC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,CAAC,CAAE,YAAW,WAAW;IAErD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,SAAgB,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEhD;;OAEG;gBACS,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAO3C;;;OAGG;IACI,OAAO;IAad;;;OAGG;IACI,qBAAqB,aAa1B;IAEF;;;;;;OAMG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC;IAa9B;;;;;OAKG;IACH,IAAW,MAAM,IAAI,CAAC,EAAE,CAKvB;CAEF"}
1
+ {"version":3,"file":"TemporaryStorage.d.ts","sourceRoot":"","sources":["../../../src/presentation-backend/TemporaryStorage.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,yEAAyE;IACzE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,CAAC;IAE3B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAEpC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACpE,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAE3B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;;;;GAKG;AACH,qBAAa,gBAAgB,CAAC,CAAC,CAAE,YAAW,WAAW;IAErD,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,SAAgB,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAEhD;;OAEG;gBACS,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAO3C;;;OAGG;IACI,OAAO;IAad;;;OAGG;IACI,qBAAqB,aAa1B;IAEF;;;;;;OAMG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC;IAc9B;;;;;OAKG;IACH,IAAW,MAAM,IAAI,CAAC,EAAE,CAKvB;CAEF"}
@@ -71,8 +71,9 @@ class TemporaryStorage {
71
71
  return v.value;
72
72
  }
73
73
  const value = this.props.factory(id);
74
- this._values.set(id, { value, lastUsed: new Date() });
75
- this.props.onCreated && this.props.onCreated(id);
74
+ const entry = { value, lastUsed: new Date() };
75
+ this._values.set(id, entry);
76
+ this.props.onCreated && this.props.onCreated(id, value, () => entry.lastUsed = new Date());
76
77
  return value;
77
78
  }
78
79
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TemporaryStorage.js","sourceRoot":"","sources":["../../../src/presentation-backend/TemporaryStorage.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AA2CH;;;;;GAKG;AACH,MAAa,gBAAgB;IAM3B;;OAEG;IACH,YAAY,KAA+B;QAwB3C;;;WAGG;QACI,0BAAqB,GAAG,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,eAAe,GAAa,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;gBAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;oBACjG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;aACpC;YACD,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE;gBAChC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc;oBAC3B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;aAChE;QACH,CAAC,CAAC;QAxCA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe;YAC5B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtF,CAAC;IAED;;;OAGG;IACI,OAAO;QACZ,IAAI,IAAI,CAAC,MAAM;YACb,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzB,IAAI,CAAC,KAAK,CAAC,cAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;SACJ;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC;IAqBD;;;;;;OAMG;IACI,QAAQ,CAAC,EAAU;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAChC,CAAC,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,KAAK,CAAC;SAChB;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACH,IAAW,MAAM;QACf,MAAM,MAAM,GAAG,IAAI,KAAK,EAAK,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;CAEF;AArFD,4CAqFC","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 { IDisposable } from \"@itwin/core-bentley\";\r\n\r\n/**\r\n * Configuration properties for [[TemporaryStorage]].\r\n * @internal\r\n */\r\nexport interface TemporaryStorageProps<T> {\r\n /** A factory method that creates a stored value given it's identifier */\r\n factory: (id: string) => T;\r\n\r\n /** A method that's called for every value before it's removed from storage */\r\n cleanupHandler?: (value: T) => void;\r\n\r\n onCreated?: (id: string) => void;\r\n onDisposedSingle?: (id: string) => void;\r\n onDisposedAll?: () => void;\r\n\r\n /**\r\n * An interval at which the storage attempts to clean up its values.\r\n * When `0` or `undefined` is specified, values are not cleaned up\r\n * automatically and cleanup has to be initiated manually by calling\r\n * [[TemporaryStorage.disposeOutdatedValues]].\r\n */\r\n cleanupInterval?: number;\r\n\r\n /**\r\n * Shortest period of time which the value should be kept in storage\r\n * unused before it's cleaned up. `0` or `undefined` means values\r\n * are removed from the storage on every cleanup (either manual call to\r\n * [[TemporaryStorage.disposeOutdatedValues]] or scheduled (controlled\r\n * by [[cleanupInterval]]))\r\n */\r\n valueLifetime?: number;\r\n}\r\n\r\n/** Value with know last used time */\r\ninterface TemporaryValue<T> {\r\n lastUsed: Date;\r\n value: T;\r\n}\r\n\r\n/**\r\n * Storage for values that get removed from it after being unused (not-requested\r\n * for a specified amount of time).\r\n *\r\n * @internal\r\n */\r\nexport class TemporaryStorage<T> implements IDisposable {\r\n\r\n private _values: Map<string, TemporaryValue<T>>;\r\n private _timer?: NodeJS.Timer;\r\n public readonly props: TemporaryStorageProps<T>;\r\n\r\n /**\r\n * Constructor. Creates the storage using supplied params.\r\n */\r\n constructor(props: TemporaryStorageProps<T>) {\r\n this.props = props;\r\n this._values = new Map<string, TemporaryValue<T>>();\r\n if (this.props.cleanupInterval)\r\n this._timer = setInterval(this.disposeOutdatedValues, this.props.cleanupInterval);\r\n }\r\n\r\n /**\r\n * Destructor. Must be called to clean up the stored values\r\n * and other resources\r\n */\r\n public dispose() {\r\n if (this._timer)\r\n clearInterval(this._timer);\r\n\r\n if (this.props.cleanupHandler) {\r\n this._values.forEach((v) => {\r\n this.props.cleanupHandler!(v.value);\r\n });\r\n }\r\n this._values.clear();\r\n this.props.onDisposedAll && this.props.onDisposedAll();\r\n }\r\n\r\n /**\r\n * Cleans up values that are currently outdated (based\r\n * on their lifetime specified through [[Props]]).\r\n */\r\n public disposeOutdatedValues = () => {\r\n const now = (new Date()).getTime();\r\n const valuesToDispose: string[] = [];\r\n for (const entry of this._values.entries()) {\r\n if (!this.props.valueLifetime || ((now - entry[\"1\"].lastUsed.getTime()) > this.props.valueLifetime))\r\n valuesToDispose.push(entry[\"0\"]);\r\n }\r\n for (const id of valuesToDispose) {\r\n if (this.props.cleanupHandler)\r\n this.props.cleanupHandler(this._values.get(id)!.value);\r\n this._values.delete(id);\r\n this.props.onDisposedSingle && this.props.onDisposedSingle(id);\r\n }\r\n };\r\n\r\n /**\r\n * Get a value from the storage. If the value with the\r\n * specified id doesn't exist, it gets created.\r\n *\r\n * **Note:** requesting a value with this method updates\r\n * it's last used time.\r\n */\r\n public getValue(id: string): T {\r\n if (this._values.has(id)) {\r\n const v = this._values.get(id)!;\r\n v.lastUsed = new Date();\r\n return v.value;\r\n }\r\n\r\n const value = this.props.factory(id);\r\n this._values.set(id, { value, lastUsed: new Date() });\r\n this.props.onCreated && this.props.onCreated(id);\r\n return value;\r\n }\r\n\r\n /**\r\n * Get all values currently in this storage.\r\n *\r\n * **Note:** requesting values with this method **doesn't**\r\n * update their last used times.\r\n */\r\n public get values(): T[] {\r\n const values = new Array<T>();\r\n for (const v of this._values.values())\r\n values.push(v.value);\r\n return values;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"TemporaryStorage.js","sourceRoot":"","sources":["../../../src/presentation-backend/TemporaryStorage.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 { IDisposable } from \"@itwin/core-bentley\";\r\n\r\n/**\r\n * Configuration properties for [[TemporaryStorage]].\r\n * @internal\r\n */\r\nexport interface TemporaryStorageProps<T> {\r\n /** A factory method that creates a stored value given it's identifier */\r\n factory: (id: string) => T;\r\n\r\n /** A method that's called for every value before it's removed from storage */\r\n cleanupHandler?: (value: T) => void;\r\n\r\n onCreated?: (id: string, value: T, onValueUsed: () => void) => void;\r\n onDisposedSingle?: (id: string) => void;\r\n onDisposedAll?: () => void;\r\n\r\n /**\r\n * An interval at which the storage attempts to clean up its values.\r\n * When `0` or `undefined` is specified, values are not cleaned up\r\n * automatically and cleanup has to be initiated manually by calling\r\n * [[TemporaryStorage.disposeOutdatedValues]].\r\n */\r\n cleanupInterval?: number;\r\n\r\n /**\r\n * Shortest period of time which the value should be kept in storage\r\n * unused before it's cleaned up. `0` or `undefined` means values\r\n * are removed from the storage on every cleanup (either manual call to\r\n * [[TemporaryStorage.disposeOutdatedValues]] or scheduled (controlled\r\n * by [[cleanupInterval]]))\r\n */\r\n valueLifetime?: number;\r\n}\r\n\r\n/** Value with know last used time */\r\ninterface TemporaryValue<T> {\r\n lastUsed: Date;\r\n value: T;\r\n}\r\n\r\n/**\r\n * Storage for values that get removed from it after being unused (not-requested\r\n * for a specified amount of time).\r\n *\r\n * @internal\r\n */\r\nexport class TemporaryStorage<T> implements IDisposable {\r\n\r\n private _values: Map<string, TemporaryValue<T>>;\r\n private _timer?: NodeJS.Timer;\r\n public readonly props: TemporaryStorageProps<T>;\r\n\r\n /**\r\n * Constructor. Creates the storage using supplied params.\r\n */\r\n constructor(props: TemporaryStorageProps<T>) {\r\n this.props = props;\r\n this._values = new Map<string, TemporaryValue<T>>();\r\n if (this.props.cleanupInterval)\r\n this._timer = setInterval(this.disposeOutdatedValues, this.props.cleanupInterval);\r\n }\r\n\r\n /**\r\n * Destructor. Must be called to clean up the stored values\r\n * and other resources\r\n */\r\n public dispose() {\r\n if (this._timer)\r\n clearInterval(this._timer);\r\n\r\n if (this.props.cleanupHandler) {\r\n this._values.forEach((v) => {\r\n this.props.cleanupHandler!(v.value);\r\n });\r\n }\r\n this._values.clear();\r\n this.props.onDisposedAll && this.props.onDisposedAll();\r\n }\r\n\r\n /**\r\n * Cleans up values that are currently outdated (based\r\n * on their lifetime specified through [[Props]]).\r\n */\r\n public disposeOutdatedValues = () => {\r\n const now = (new Date()).getTime();\r\n const valuesToDispose: string[] = [];\r\n for (const entry of this._values.entries()) {\r\n if (!this.props.valueLifetime || ((now - entry[\"1\"].lastUsed.getTime()) > this.props.valueLifetime))\r\n valuesToDispose.push(entry[\"0\"]);\r\n }\r\n for (const id of valuesToDispose) {\r\n if (this.props.cleanupHandler)\r\n this.props.cleanupHandler(this._values.get(id)!.value);\r\n this._values.delete(id);\r\n this.props.onDisposedSingle && this.props.onDisposedSingle(id);\r\n }\r\n };\r\n\r\n /**\r\n * Get a value from the storage. If the value with the\r\n * specified id doesn't exist, it gets created.\r\n *\r\n * **Note:** requesting a value with this method updates\r\n * it's last used time.\r\n */\r\n public getValue(id: string): T {\r\n if (this._values.has(id)) {\r\n const v = this._values.get(id)!;\r\n v.lastUsed = new Date();\r\n return v.value;\r\n }\r\n\r\n const value = this.props.factory(id);\r\n const entry = { value, lastUsed: new Date() };\r\n this._values.set(id, entry);\r\n this.props.onCreated && this.props.onCreated(id, value, () => entry.lastUsed = new Date());\r\n return value;\r\n }\r\n\r\n /**\r\n * Get all values currently in this storage.\r\n *\r\n * **Note:** requesting values with this method **doesn't**\r\n * update their last used times.\r\n */\r\n public get values(): T[] {\r\n const values = new Array<T>();\r\n for (const v of this._values.values())\r\n values.push(v.value);\r\n return values;\r\n }\r\n\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/presentation-backend",
3
- "version": "3.0.0-dev.126",
3
+ "version": "3.0.0-dev.130",
4
4
  "description": "Backend of iModel.js Presentation library",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,20 +21,20 @@
21
21
  "main": "lib/cjs/presentation-backend.js",
22
22
  "typings": "lib/cjs/presentation-backend",
23
23
  "peerDependencies": {
24
- "@itwin/core-bentley": "^3.0.0-dev.126",
25
- "@itwin/core-backend": "^3.0.0-dev.126",
26
- "@itwin/core-common": "^3.0.0-dev.126",
27
- "@itwin/core-quantity": "^3.0.0-dev.126",
28
- "@itwin/presentation-common": "^3.0.0-dev.126"
24
+ "@itwin/core-backend": "^3.0.0-dev.130",
25
+ "@itwin/core-bentley": "^3.0.0-dev.130",
26
+ "@itwin/core-common": "^3.0.0-dev.130",
27
+ "@itwin/core-quantity": "^3.0.0-dev.130",
28
+ "@itwin/presentation-common": "^3.0.0-dev.130"
29
29
  },
30
30
  "devDependencies": {
31
- "@itwin/core-bentley": "3.0.0-dev.126",
32
- "@itwin/build-tools": "3.0.0-dev.126",
33
- "@itwin/eslint-plugin": "3.0.0-dev.126",
34
- "@itwin/core-backend": "3.0.0-dev.126",
35
- "@itwin/core-common": "3.0.0-dev.126",
36
- "@itwin/core-quantity": "3.0.0-dev.126",
37
- "@itwin/presentation-common": "3.0.0-dev.126",
31
+ "@itwin/build-tools": "3.0.0-dev.130",
32
+ "@itwin/core-backend": "3.0.0-dev.130",
33
+ "@itwin/core-bentley": "3.0.0-dev.130",
34
+ "@itwin/core-common": "3.0.0-dev.130",
35
+ "@itwin/core-quantity": "3.0.0-dev.130",
36
+ "@itwin/eslint-plugin": "3.0.0-dev.130",
37
+ "@itwin/presentation-common": "3.0.0-dev.130",
38
38
  "@types/chai": "^4.1.4",
39
39
  "@types/chai-as-promised": "^7",
40
40
  "@types/chai-jest-snapshot": "^1.3.0",