@itwin/imodel-transformer 2.0.0-dev.53 → 2.0.0-dev.54

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.
@@ -17,6 +17,7 @@ export declare class ElementAspectExportProcessor {
17
17
  /** ElementAspect classes excluded from source queries. */
18
18
  private readonly _excludedElementAspectClassFullNames;
19
19
  private _hasExportableAspects;
20
+ private _expandedExcludedElementAspectClassFullNames;
20
21
  private _aspectChanges;
21
22
  /** ElementAspect class names excluded from source queries. */
22
23
  get excludedElementAspectClassFullNames(): ReadonlySet<string>;
@@ -36,8 +37,8 @@ export declare class ElementAspectExportProcessor {
36
37
  private getExcludedClassFilter;
37
38
  private getHasExportableAspects;
38
39
  private queryHasExportableAspects;
39
- private getAspectProps;
40
- private queryAspects;
40
+ private getExpandedExcludedElementAspectClassFullNames;
41
+ private queryExpandedExcludedElementAspectClassFullNames;
41
42
  }
42
43
  export {};
43
44
  //# sourceMappingURL=ElementAspectExportProcessor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElementAspectExportProcessor.d.ts","sourceRoot":"","sources":["../../src/ElementAspectExportProcessor.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAa,MAAM,qBAAqB,CAAC;AAS5D,UAAU,aAAa;IACrB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAmC;IAClD,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,2BAA2B,CACzB,YAAY,EAAE,mBAAmB,EACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,2BAA2B,CACzB,YAAY,EAAE,kBAAkB,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,4BAA4B;IACvC,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAqB;IAC1E,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,cAAc,CAA4B;IAElD,8DAA8D;IAC9D,IAAW,mCAAmC,IAAI,WAAW,CAAC,MAAM,CAAC,CAEpE;IACD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,YACE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mCAAmC,EAI7C;IAED;;OAEG;IACU,uBAAuB,CAClC,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CA2Cf;IAED,4GAA4G;IACrG,gBAAgB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAE3D;IAED,iFAAiF;IAC1E,WAAW,IAAI,IAAI,CAEzB;IAED,oFAAoF;IAC7E,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAI5D;IAED,OAAO,CAAC,sBAAsB;YAkBhB,uBAAuB;YAKvB,yBAAyB;IAuBvC,OAAO,CAAC,cAAc;YA4BP,YAAY;CAqC5B"}
1
+ {"version":3,"file":"ElementAspectExportProcessor.d.ts","sourceRoot":"","sources":["../../src/ElementAspectExportProcessor.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,UAAU,aAAa;IACrB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAmC;IAClD,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,2BAA2B,CACzB,YAAY,EAAE,mBAAmB,EACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,2BAA2B,CACzB,YAAY,EAAE,kBAAkB,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,4BAA4B;IACvC,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAqB;IAC1E,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,4CAA4C,CAEtC;IACd,OAAO,CAAC,cAAc,CAA4B;IAElD,8DAA8D;IAC9D,IAAW,mCAAmC,IAAI,WAAW,CAAC,MAAM,CAAC,CAEpE;IACD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,YACE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mCAAmC,EAI7C;IAED;;OAEG;IACU,uBAAuB,CAClC,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAkDf;IAED,4GAA4G;IACrG,gBAAgB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAE3D;IAED,iFAAiF;IAC1E,WAAW,IAAI,IAAI,CAGzB;IAED,oFAAoF;IAC7E,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAM5D;IAED,OAAO,CAAC,sBAAsB;YAkBhB,uBAAuB;YAKvB,yBAAyB;YAuBzB,8CAA8C;YAQ9C,gDAAgD;CAmB/D"}
@@ -6,7 +6,6 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.ElementAspectExportProcessor = void 0;
8
8
  const core_backend_1 = require("@itwin/core-backend");
9
- const core_bentley_1 = require("@itwin/core-bentley");
10
9
  const ECSqlReaderAsyncIterableIteratorAdapter_1 = require("./ECSqlReaderAsyncIterableIteratorAdapter");
11
10
  const core_common_1 = require("@itwin/core-common");
12
11
  /** Queries and exports ElementAspects for accepted source owners, applying class and handler filters and grouping multi-aspects by owner.
@@ -16,6 +15,7 @@ class ElementAspectExportProcessor {
16
15
  /** ElementAspect classes excluded from source queries. */
17
16
  _excludedElementAspectClassFullNames = new Set();
18
17
  _hasExportableAspects;
18
+ _expandedExcludedElementAspectClassFullNames;
19
19
  _aspectChanges;
20
20
  /** ElementAspect class names excluded from source queries. */
21
21
  get excludedElementAspectClassFullNames() {
@@ -43,7 +43,13 @@ class ElementAspectExportProcessor {
43
43
  multiAspects = [];
44
44
  multiAspectOwnerId = undefined;
45
45
  };
46
- for await (const aspect of this.queryAspects(ownerElementIds)) {
46
+ const excludedAspectClassFullNames = await this.getExpandedExcludedElementAspectClassFullNames();
47
+ for await (const aspect of this._sourceDb.elements.queryAspects({
48
+ elementIds: new Set(ownerElementIds),
49
+ excludedAspectClassFullNames,
50
+ groupByOwner: true,
51
+ usePrimaryConn: true,
52
+ })) {
47
53
  if (!(await this._handler.shouldExportElementAspect(aspect)))
48
54
  continue;
49
55
  if (multiAspectOwnerId !== undefined &&
@@ -76,12 +82,14 @@ class ElementAspectExportProcessor {
76
82
  /** Clears source schema and content caches at an outer export-scope boundary. */
77
83
  resetCaches() {
78
84
  this._hasExportableAspects = undefined;
85
+ this._expandedExcludedElementAspectClassFullNames = undefined;
79
86
  }
80
87
  /** Excludes an ElementAspect class from subsequent queries and export callbacks. */
81
88
  excludeElementAspectClass(classFullName) {
82
- if (this._excludedElementAspectClassFullNames.has(classFullName))
89
+ const normalizedClassFullName = classFullName.replace(".", ":");
90
+ if (this._excludedElementAspectClassFullNames.has(normalizedClassFullName))
83
91
  return;
84
- this._excludedElementAspectClassFullNames.add(classFullName);
92
+ this._excludedElementAspectClassFullNames.add(normalizedClassFullName);
85
93
  this.resetCaches();
86
94
  }
87
95
  getExcludedClassFilter(queryParams) {
@@ -90,7 +98,7 @@ class ElementAspectExportProcessor {
90
98
  for (const classFullName of this._excludedElementAspectClassFullNames) {
91
99
  const parameterName = `excludedAspectClass${excludedClassIndex++}`;
92
100
  excludedClassParameters.push(`ec_classid(:${parameterName})`);
93
- queryParams.bindString(parameterName, classFullName.replace(".", ":"));
101
+ queryParams.bindString(parameterName, classFullName);
94
102
  }
95
103
  return excludedClassParameters.length === 0
96
104
  ? ""
@@ -121,46 +129,23 @@ class ElementAspectExportProcessor {
121
129
  return true;
122
130
  return false;
123
131
  }
124
- getAspectProps(rawInstance) {
125
- const parsedRow = typeof rawInstance === "string"
126
- ? JSON.parse(rawInstance, core_common_1.Base64EncodedString.reviver)
127
- : rawInstance;
128
- if (!core_bentley_1.JsonUtils.isObject(parsedRow))
129
- throw new Error("Expected an ElementAspect instance query to return an object");
130
- const row = {};
131
- for (const [key, value] of Object.entries(parsedRow)) {
132
- const ecPropertyName = key.length === 0 ? key : key[0].toUpperCase() + key.substring(1);
133
- row[core_common_1.ECJsNames.toJsName(ecPropertyName)] = value;
134
- }
135
- const className = row.className;
136
- if (typeof className !== "string")
137
- throw new Error("Expected an ElementAspect instance query to return a className");
138
- row.classFullName = className.replace(".", ":");
139
- delete row.className;
140
- return row;
132
+ async getExpandedExcludedElementAspectClassFullNames() {
133
+ this._expandedExcludedElementAspectClassFullNames ??=
134
+ this.queryExpandedExcludedElementAspectClassFullNames();
135
+ return this._expandedExcludedElementAspectClassFullNames;
141
136
  }
142
- async *queryAspects(ownerElementIds) {
143
- const queryParams = new core_common_1.QueryBinder().bindIdSet("ownerElementIds", ownerElementIds);
144
- const excludedClassFilter = this.getExcludedClassFilter(queryParams);
145
- const aspectQueryReader = this._sourceDb.createQueryReader(`WITH OwnerIds AS (SELECT id FROM IdSet(:ownerElementIds))
146
- SELECT $ FROM (
147
- SELECT aspect.ECInstanceId, aspect.ECClassId,
148
- aspect.Element.Id AS OwnerId, 1 AS AspectKind
149
- FROM OwnerIds owners
150
- CROSS JOIN Bis.ElementMultiAspect aspect
151
- WHERE aspect.Element.Id = owners.id ${excludedClassFilter}
152
- UNION ALL
153
- SELECT aspect.ECInstanceId, aspect.ECClassId,
154
- aspect.Element.Id AS OwnerId, 0 AS AspectKind
155
- FROM OwnerIds owners
156
- CROSS JOIN Bis.ElementUniqueAspect aspect
157
- WHERE aspect.Element.Id = owners.id ${excludedClassFilter}
158
- )
159
- ORDER BY AspectKind, OwnerId, ECClassId, ECInstanceId
160
- OPTIONS USE_JS_PROP_NAMES DO_NOT_TRUNCATE_BLOB`, queryParams, { usePrimaryConn: true });
161
- for await (const rowProxy of (0, ECSqlReaderAsyncIterableIteratorAdapter_1.ensureECSqlReaderIsAsyncIterableIterator)(aspectQueryReader)) {
162
- yield this._sourceDb.constructEntity(this.getAspectProps(rowProxy[0]));
137
+ async queryExpandedExcludedElementAspectClassFullNames() {
138
+ const excludedClassFullNames = new Set();
139
+ for (const classFullName of this._excludedElementAspectClassFullNames) {
140
+ const reader = this._sourceDb.createQueryReader(`SELECT ec_classname(classes.ECInstanceId, 's:c') AS classFullName
141
+ FROM meta.ClassHasAllBaseClasses inheritance
142
+ JOIN meta.ECClassDef classes
143
+ ON classes.ECInstanceId = inheritance.SourceECInstanceId
144
+ WHERE inheritance.TargetECInstanceId = ec_classid(:excludedClassName)`, new core_common_1.QueryBinder().bindString("excludedClassName", classFullName), { usePrimaryConn: true });
145
+ for await (const row of (0, ECSqlReaderAsyncIterableIteratorAdapter_1.ensureECSqlReaderIsAsyncIterableIterator)(reader))
146
+ excludedClassFullNames.add(row.classFullName);
163
147
  }
148
+ return excludedClassFullNames;
164
149
  }
165
150
  }
166
151
  exports.ElementAspectExportProcessor = ElementAspectExportProcessor;
@@ -1 +1 @@
1
- {"version":3,"file":"ElementAspectExportProcessor.js","sourceRoot":"","sources":["../../src/ElementAspectExportProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport {\n ElementAspect,\n ElementMultiAspect,\n ElementUniqueAspect,\n IModelDb,\n} from \"@itwin/core-backend\";\nimport { Id64String, JsonUtils } from \"@itwin/core-bentley\";\nimport { ensureECSqlReaderIsAsyncIterableIterator } from \"./ECSqlReaderAsyncIterableIteratorAdapter\";\nimport {\n Base64EncodedString,\n ECJsNames,\n ElementAspectProps,\n QueryBinder,\n} from \"@itwin/core-common\";\n\ninterface AspectChanges {\n readonly insertIds: ReadonlySet<Id64String>;\n readonly updateIds: ReadonlySet<Id64String>;\n}\n\nexport interface ElementAspectExportProcessorHandler {\n shouldExportElementAspect(aspect: ElementAspect): Promise<boolean>;\n onExportElementUniqueAspect(\n uniqueAspect: ElementUniqueAspect,\n isUpdate?: boolean | undefined\n ): Promise<void>;\n onExportElementMultiAspects(\n multiAspects: ElementMultiAspect[]\n ): Promise<void>;\n trackProgress: () => Promise<void>;\n}\n\n/** Queries and exports ElementAspects for accepted source owners, applying class and handler filters and grouping multi-aspects by owner.\n * @internal\n */\nexport class ElementAspectExportProcessor {\n /** ElementAspect classes excluded from source queries. */\n private readonly _excludedElementAspectClassFullNames = new Set<string>();\n private _hasExportableAspects: Promise<boolean> | undefined;\n private _aspectChanges: AspectChanges | undefined;\n\n /** ElementAspect class names excluded from source queries. */\n public get excludedElementAspectClassFullNames(): ReadonlySet<string> {\n return this._excludedElementAspectClassFullNames;\n }\n private readonly _sourceDb: IModelDb;\n private readonly _handler: ElementAspectExportProcessorHandler;\n\n public constructor(\n sourceDb: IModelDb,\n handler: ElementAspectExportProcessorHandler\n ) {\n this._sourceDb = sourceDb;\n this._handler = handler;\n }\n\n /** Exports ElementAspects owned by the supplied elements.\n * Multi-aspects are emitted in one callback group per owner.\n */\n public async exportAllElementAspects(\n ownerElementIds: ReadonlySet<Id64String>\n ): Promise<void> {\n if (ownerElementIds.size === 0 || !(await this.getHasExportableAspects()))\n return;\n\n let multiAspectOwnerId: Id64String | undefined;\n let multiAspects: ElementMultiAspect[] = [];\n const exportMultiAspects = async () => {\n if (multiAspects.length === 0) return;\n await this._handler.onExportElementMultiAspects(multiAspects);\n await this._handler.trackProgress();\n multiAspects = [];\n multiAspectOwnerId = undefined;\n };\n\n for await (const aspect of this.queryAspects(ownerElementIds)) {\n if (!(await this._handler.shouldExportElementAspect(aspect))) continue;\n\n if (\n multiAspectOwnerId !== undefined &&\n multiAspectOwnerId !== aspect.element.id\n ) {\n await exportMultiAspects();\n }\n\n if (aspect instanceof ElementUniqueAspect) {\n const isUpdate = this._aspectChanges?.updateIds.has(aspect.id)\n ? true\n : this._aspectChanges?.insertIds.has(aspect.id)\n ? false\n : undefined;\n await this._handler.onExportElementUniqueAspect(aspect, isUpdate);\n await this._handler.trackProgress();\n } else if (aspect instanceof ElementMultiAspect) {\n multiAspectOwnerId = aspect.element.id;\n multiAspects.push(aspect);\n } else {\n throw new Error(\n `Unexpected ElementAspect type ${aspect.classFullName}`\n );\n }\n }\n\n await exportMultiAspects();\n }\n\n /** Sets the aspect changes used to distinguish inserted and updated unique aspects during change export. */\n public setAspectChanges(aspectChanges?: AspectChanges): void {\n this._aspectChanges = aspectChanges;\n }\n\n /** Clears source schema and content caches at an outer export-scope boundary. */\n public resetCaches(): void {\n this._hasExportableAspects = undefined;\n }\n\n /** Excludes an ElementAspect class from subsequent queries and export callbacks. */\n public excludeElementAspectClass(classFullName: string): void {\n if (this._excludedElementAspectClassFullNames.has(classFullName)) return;\n this._excludedElementAspectClassFullNames.add(classFullName);\n this.resetCaches();\n }\n\n private getExcludedClassFilter(queryParams: QueryBinder): string {\n const excludedClassParameters: string[] = [];\n let excludedClassIndex = 0;\n for (const classFullName of this._excludedElementAspectClassFullNames) {\n const parameterName = `excludedAspectClass${excludedClassIndex++}`;\n excludedClassParameters.push(`ec_classid(:${parameterName})`);\n queryParams.bindString(parameterName, classFullName.replace(\".\", \":\"));\n }\n\n return excludedClassParameters.length === 0\n ? \"\"\n : `AND NOT EXISTS (\n SELECT 1 FROM meta.ClassHasAllBaseClasses excluded\n WHERE excluded.SourceECInstanceId = aspect.ECClassId\n AND excluded.TargetECInstanceId IN (${excludedClassParameters.join(\",\")})\n )`;\n }\n\n private async getHasExportableAspects(): Promise<boolean> {\n this._hasExportableAspects ??= this.queryHasExportableAspects();\n return this._hasExportableAspects;\n }\n\n private async queryHasExportableAspects(): Promise<boolean> {\n const queryParams = new QueryBinder();\n const excludedClassFilter = this.getExcludedClassFilter(queryParams);\n const reader = this._sourceDb.createQueryReader(\n `SELECT ECInstanceId FROM (\n SELECT aspect.ECInstanceId\n FROM Bis.ElementMultiAspect aspect\n WHERE TRUE ${excludedClassFilter}\n UNION ALL\n SELECT aspect.ECInstanceId\n FROM Bis.ElementUniqueAspect aspect\n WHERE TRUE ${excludedClassFilter}\n )\n LIMIT 1`,\n queryParams,\n { usePrimaryConn: true }\n );\n\n for await (const _row of ensureECSqlReaderIsAsyncIterableIterator(reader))\n return true;\n return false;\n }\n\n private getAspectProps(rawInstance: unknown): ElementAspectProps {\n const parsedRow: unknown =\n typeof rawInstance === \"string\"\n ? JSON.parse(rawInstance, Base64EncodedString.reviver)\n : rawInstance;\n if (!JsonUtils.isObject(parsedRow))\n throw new Error(\n \"Expected an ElementAspect instance query to return an object\"\n );\n\n const row: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsedRow)) {\n const ecPropertyName =\n key.length === 0 ? key : key[0].toUpperCase() + key.substring(1);\n row[ECJsNames.toJsName(ecPropertyName)] = value;\n }\n\n const className = row.className;\n if (typeof className !== \"string\")\n throw new Error(\n \"Expected an ElementAspect instance query to return a className\"\n );\n\n row.classFullName = className.replace(\".\", \":\");\n delete row.className;\n return row as unknown as ElementAspectProps;\n }\n\n private async *queryAspects(\n ownerElementIds: ReadonlySet<Id64String>\n ): AsyncIterableIterator<ElementAspect> {\n const queryParams = new QueryBinder().bindIdSet(\n \"ownerElementIds\",\n ownerElementIds\n );\n const excludedClassFilter = this.getExcludedClassFilter(queryParams);\n const aspectQueryReader = this._sourceDb.createQueryReader(\n `WITH OwnerIds AS (SELECT id FROM IdSet(:ownerElementIds))\n SELECT $ FROM (\n SELECT aspect.ECInstanceId, aspect.ECClassId,\n aspect.Element.Id AS OwnerId, 1 AS AspectKind\n FROM OwnerIds owners\n CROSS JOIN Bis.ElementMultiAspect aspect\n WHERE aspect.Element.Id = owners.id ${excludedClassFilter}\n UNION ALL\n SELECT aspect.ECInstanceId, aspect.ECClassId,\n aspect.Element.Id AS OwnerId, 0 AS AspectKind\n FROM OwnerIds owners\n CROSS JOIN Bis.ElementUniqueAspect aspect\n WHERE aspect.Element.Id = owners.id ${excludedClassFilter}\n )\n ORDER BY AspectKind, OwnerId, ECClassId, ECInstanceId\n OPTIONS USE_JS_PROP_NAMES DO_NOT_TRUNCATE_BLOB`,\n queryParams,\n { usePrimaryConn: true }\n );\n\n for await (const rowProxy of ensureECSqlReaderIsAsyncIterableIterator(\n aspectQueryReader\n )) {\n yield this._sourceDb.constructEntity<ElementAspect>(\n this.getAspectProps(rowProxy[0])\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ElementAspectExportProcessor.js","sourceRoot":"","sources":["../../src/ElementAspectExportProcessor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport {\n ElementAspect,\n ElementMultiAspect,\n ElementUniqueAspect,\n IModelDb,\n} from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ensureECSqlReaderIsAsyncIterableIterator } from \"./ECSqlReaderAsyncIterableIteratorAdapter\";\nimport { QueryBinder } from \"@itwin/core-common\";\n\ninterface AspectChanges {\n readonly insertIds: ReadonlySet<Id64String>;\n readonly updateIds: ReadonlySet<Id64String>;\n}\n\nexport interface ElementAspectExportProcessorHandler {\n shouldExportElementAspect(aspect: ElementAspect): Promise<boolean>;\n onExportElementUniqueAspect(\n uniqueAspect: ElementUniqueAspect,\n isUpdate?: boolean | undefined\n ): Promise<void>;\n onExportElementMultiAspects(\n multiAspects: ElementMultiAspect[]\n ): Promise<void>;\n trackProgress: () => Promise<void>;\n}\n\n/** Queries and exports ElementAspects for accepted source owners, applying class and handler filters and grouping multi-aspects by owner.\n * @internal\n */\nexport class ElementAspectExportProcessor {\n /** ElementAspect classes excluded from source queries. */\n private readonly _excludedElementAspectClassFullNames = new Set<string>();\n private _hasExportableAspects: Promise<boolean> | undefined;\n private _expandedExcludedElementAspectClassFullNames:\n | Promise<ReadonlySet<string>>\n | undefined;\n private _aspectChanges: AspectChanges | undefined;\n\n /** ElementAspect class names excluded from source queries. */\n public get excludedElementAspectClassFullNames(): ReadonlySet<string> {\n return this._excludedElementAspectClassFullNames;\n }\n private readonly _sourceDb: IModelDb;\n private readonly _handler: ElementAspectExportProcessorHandler;\n\n public constructor(\n sourceDb: IModelDb,\n handler: ElementAspectExportProcessorHandler\n ) {\n this._sourceDb = sourceDb;\n this._handler = handler;\n }\n\n /** Exports ElementAspects owned by the supplied elements.\n * Multi-aspects are emitted in one callback group per owner.\n */\n public async exportAllElementAspects(\n ownerElementIds: ReadonlySet<Id64String>\n ): Promise<void> {\n if (ownerElementIds.size === 0 || !(await this.getHasExportableAspects()))\n return;\n\n let multiAspectOwnerId: Id64String | undefined;\n let multiAspects: ElementMultiAspect[] = [];\n const exportMultiAspects = async () => {\n if (multiAspects.length === 0) return;\n await this._handler.onExportElementMultiAspects(multiAspects);\n await this._handler.trackProgress();\n multiAspects = [];\n multiAspectOwnerId = undefined;\n };\n\n const excludedAspectClassFullNames =\n await this.getExpandedExcludedElementAspectClassFullNames();\n for await (const aspect of this._sourceDb.elements.queryAspects({\n elementIds: new Set(ownerElementIds),\n excludedAspectClassFullNames,\n groupByOwner: true,\n usePrimaryConn: true,\n })) {\n if (!(await this._handler.shouldExportElementAspect(aspect))) continue;\n\n if (\n multiAspectOwnerId !== undefined &&\n multiAspectOwnerId !== aspect.element.id\n ) {\n await exportMultiAspects();\n }\n\n if (aspect instanceof ElementUniqueAspect) {\n const isUpdate = this._aspectChanges?.updateIds.has(aspect.id)\n ? true\n : this._aspectChanges?.insertIds.has(aspect.id)\n ? false\n : undefined;\n await this._handler.onExportElementUniqueAspect(aspect, isUpdate);\n await this._handler.trackProgress();\n } else if (aspect instanceof ElementMultiAspect) {\n multiAspectOwnerId = aspect.element.id;\n multiAspects.push(aspect);\n } else {\n throw new Error(\n `Unexpected ElementAspect type ${aspect.classFullName}`\n );\n }\n }\n\n await exportMultiAspects();\n }\n\n /** Sets the aspect changes used to distinguish inserted and updated unique aspects during change export. */\n public setAspectChanges(aspectChanges?: AspectChanges): void {\n this._aspectChanges = aspectChanges;\n }\n\n /** Clears source schema and content caches at an outer export-scope boundary. */\n public resetCaches(): void {\n this._hasExportableAspects = undefined;\n this._expandedExcludedElementAspectClassFullNames = undefined;\n }\n\n /** Excludes an ElementAspect class from subsequent queries and export callbacks. */\n public excludeElementAspectClass(classFullName: string): void {\n const normalizedClassFullName = classFullName.replace(\".\", \":\");\n if (this._excludedElementAspectClassFullNames.has(normalizedClassFullName))\n return;\n this._excludedElementAspectClassFullNames.add(normalizedClassFullName);\n this.resetCaches();\n }\n\n private getExcludedClassFilter(queryParams: QueryBinder): string {\n const excludedClassParameters: string[] = [];\n let excludedClassIndex = 0;\n for (const classFullName of this._excludedElementAspectClassFullNames) {\n const parameterName = `excludedAspectClass${excludedClassIndex++}`;\n excludedClassParameters.push(`ec_classid(:${parameterName})`);\n queryParams.bindString(parameterName, classFullName);\n }\n\n return excludedClassParameters.length === 0\n ? \"\"\n : `AND NOT EXISTS (\n SELECT 1 FROM meta.ClassHasAllBaseClasses excluded\n WHERE excluded.SourceECInstanceId = aspect.ECClassId\n AND excluded.TargetECInstanceId IN (${excludedClassParameters.join(\",\")})\n )`;\n }\n\n private async getHasExportableAspects(): Promise<boolean> {\n this._hasExportableAspects ??= this.queryHasExportableAspects();\n return this._hasExportableAspects;\n }\n\n private async queryHasExportableAspects(): Promise<boolean> {\n const queryParams = new QueryBinder();\n const excludedClassFilter = this.getExcludedClassFilter(queryParams);\n const reader = this._sourceDb.createQueryReader(\n `SELECT ECInstanceId FROM (\n SELECT aspect.ECInstanceId\n FROM Bis.ElementMultiAspect aspect\n WHERE TRUE ${excludedClassFilter}\n UNION ALL\n SELECT aspect.ECInstanceId\n FROM Bis.ElementUniqueAspect aspect\n WHERE TRUE ${excludedClassFilter}\n )\n LIMIT 1`,\n queryParams,\n { usePrimaryConn: true }\n );\n\n for await (const _row of ensureECSqlReaderIsAsyncIterableIterator(reader))\n return true;\n return false;\n }\n\n private async getExpandedExcludedElementAspectClassFullNames(): Promise<\n ReadonlySet<string>\n > {\n this._expandedExcludedElementAspectClassFullNames ??=\n this.queryExpandedExcludedElementAspectClassFullNames();\n return this._expandedExcludedElementAspectClassFullNames;\n }\n\n private async queryExpandedExcludedElementAspectClassFullNames(): Promise<\n ReadonlySet<string>\n > {\n const excludedClassFullNames = new Set<string>();\n for (const classFullName of this._excludedElementAspectClassFullNames) {\n const reader = this._sourceDb.createQueryReader(\n `SELECT ec_classname(classes.ECInstanceId, 's:c') AS classFullName\n FROM meta.ClassHasAllBaseClasses inheritance\n JOIN meta.ECClassDef classes\n ON classes.ECInstanceId = inheritance.SourceECInstanceId\n WHERE inheritance.TargetECInstanceId = ec_classid(:excludedClassName)`,\n new QueryBinder().bindString(\"excludedClassName\", classFullName),\n { usePrimaryConn: true }\n );\n for await (const row of ensureECSqlReaderIsAsyncIterableIterator(reader))\n excludedClassFullNames.add(row.classFullName);\n }\n return excludedClassFullNames;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/imodel-transformer",
3
- "version": "2.0.0-dev.53",
3
+ "version": "2.0.0-dev.54",
4
4
  "description": "API for exporting an iModel's parts and also importing them into another iModel",
5
5
  "main": "lib/cjs/imodel-transformer.js",
6
6
  "typings": "lib/cjs/imodel-transformer.d.ts",
@@ -74,14 +74,14 @@
74
74
  "Removing Dependencies on internal APIs is ongoing."
75
75
  ],
76
76
  "peerDependencies": {
77
- "@itwin/core-backend": "^5.9.1",
78
- "@itwin/core-bentley": "^5.9.1",
79
- "@itwin/core-common": "^5.9.1",
80
- "@itwin/core-geometry": "^5.9.1",
81
- "@itwin/core-quantity": "^5.9.1",
82
- "@itwin/ecschema-editing": "^5.9.1",
83
- "@itwin/ecschema-locaters": "^5.9.1",
84
- "@itwin/ecschema-metadata": "^5.9.1"
77
+ "@itwin/core-backend": "^5.13.0",
78
+ "@itwin/core-bentley": "^5.13.0",
79
+ "@itwin/core-common": "^5.13.0",
80
+ "@itwin/core-geometry": "^5.13.0",
81
+ "@itwin/core-quantity": "^5.13.0",
82
+ "@itwin/ecschema-editing": "^5.13.0",
83
+ "@itwin/ecschema-locaters": "^5.13.0",
84
+ "@itwin/ecschema-metadata": "^5.13.0"
85
85
  },
86
86
  "peerDependenciesMeta": {
87
87
  "@itwin/ecschema-editing": {
@@ -96,15 +96,15 @@
96
96
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
97
97
  ],
98
98
  "devDependencies": {
99
- "@itwin/build-tools": "^5.10.3",
100
- "@itwin/core-backend": "^5.10.3",
101
- "@itwin/core-bentley": "^5.10.3",
102
- "@itwin/core-common": "^5.10.3",
103
- "@itwin/core-geometry": "^5.10.3",
104
- "@itwin/core-quantity": "^5.10.3",
105
- "@itwin/ecschema-editing": "5.10.3",
106
- "@itwin/ecschema-locaters": "5.10.3",
107
- "@itwin/ecschema-metadata": "^5.10.3",
99
+ "@itwin/build-tools": "^5.13.0",
100
+ "@itwin/core-backend": "^5.13.0",
101
+ "@itwin/core-bentley": "^5.13.0",
102
+ "@itwin/core-common": "^5.13.0",
103
+ "@itwin/core-geometry": "^5.13.0",
104
+ "@itwin/core-quantity": "^5.13.0",
105
+ "@itwin/ecschema-editing": "5.13.0",
106
+ "@itwin/ecschema-locaters": "5.13.0",
107
+ "@itwin/ecschema-metadata": "^5.13.0",
108
108
  "@itwin/eslint-plugin": "^6.1.0",
109
109
  "@itwin/imodel-transformer-test-utils": "0.0.0",
110
110
  "@types/node": "^22.18.8",