@itwin/imodel-transformer 2.0.0-dev.20 → 2.0.0-dev.22

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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { Id64String } from "@itwin/core-bentley";
5
5
  import { ElementAspectProps, ElementProps, EntityProps, ModelProps } from "@itwin/core-common";
6
- import { ElementAspect, ElementMultiAspect, Entity, IModelDb, RelationshipProps } from "@itwin/core-backend";
6
+ import { EditTxn, ElementAspect, ElementMultiAspect, Entity, IModelDb, RelationshipProps } from "@itwin/core-backend";
7
7
  import type { RelationshipPropsForDelete } from "./IModelTransformer";
8
8
  /** Options provided to [[IModelImporter.optimizeGeometry]] specifying post-processing optimizations to be applied to the iModel's geometry.
9
9
  * @beta
@@ -48,6 +48,14 @@ export interface IModelImportOptions {
48
48
  export declare class IModelImporter {
49
49
  /** The read/write target iModel. */
50
50
  readonly targetDb: IModelDb;
51
+ /** The [[EditTxn]] used for write operations on the target iModel.
52
+ * @beta
53
+ */
54
+ protected readonly _editTxn: EditTxn;
55
+ /** The [[EditTxn]] used for write operations on the target iModel.
56
+ * @beta
57
+ */
58
+ get editTxn(): EditTxn;
51
59
  /** resolved initialization options for the importer
52
60
  * @beta
53
61
  */
@@ -88,10 +96,10 @@ export declare class IModelImporter {
88
96
  /** */
89
97
  private _modelPropertiesToIgnore;
90
98
  /** Construct a new IModelImporter
91
- * @param targetDb The target IModelDb
99
+ * @param editTxn The [[EditTxn]] to use for write operations on the target iModel. The target db is derived from `editTxn.iModel`.
92
100
  * @param options The options that specify how the import should be done.
93
101
  */
94
- constructor(targetDb: IModelDb, options?: IModelImportOptions);
102
+ constructor(editTxn: EditTxn, options?: IModelImportOptions);
95
103
  /**
96
104
  * Checks [[IModelImportOptions.skipPropagateChangesToRootElements]], [[IModelImporter.rootElementIds]], and [[IModelImporter.doNotUpdateElementIds]] and returns true for 'do not update', false for do 'update'.
97
105
  */
@@ -1 +1 @@
1
- {"version":3,"file":"IModelImporter.d.ts","sourceRoot":"","sources":["../../src/IModelImporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IModelImporter.d.ts","sourceRoot":"","sources":["../../src/IModelImporter.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,16 @@ const loggerCategory = TransformerLoggerCategory_1.TransformerLoggerCategory.IMo
26
26
  class IModelImporter {
27
27
  /** The read/write target iModel. */
28
28
  targetDb;
29
+ /** The [[EditTxn]] used for write operations on the target iModel.
30
+ * @beta
31
+ */
32
+ _editTxn;
33
+ /** The [[EditTxn]] used for write operations on the target iModel.
34
+ * @beta
35
+ */
36
+ get editTxn() {
37
+ return this._editTxn;
38
+ }
29
39
  /** resolved initialization options for the importer
30
40
  * @beta
31
41
  */
@@ -72,11 +82,12 @@ class IModelImporter {
72
82
  "geometryGuid", // cannot compare GeometricModel.GeometryGuid values across iModels
73
83
  ]);
74
84
  /** Construct a new IModelImporter
75
- * @param targetDb The target IModelDb
85
+ * @param editTxn The [[EditTxn]] to use for write operations on the target iModel. The target db is derived from `editTxn.iModel`.
76
86
  * @param options The options that specify how the import should be done.
77
87
  */
78
- constructor(targetDb, options) {
79
- this.targetDb = targetDb;
88
+ constructor(editTxn, options) {
89
+ this.targetDb = editTxn.iModel;
90
+ this._editTxn = editTxn;
80
91
  this.options = {
81
92
  autoExtendProjectExtents: options?.autoExtendProjectExtents ?? true,
82
93
  preserveElementIdsForFiltering: options?.preserveElementIdsForFiltering ?? false,
@@ -134,8 +145,7 @@ class IModelImporter {
134
145
  */
135
146
  async onInsertModel(modelProps) {
136
147
  try {
137
- // eslint-disable-next-line @typescript-eslint/no-deprecated
138
- const modelId = this.targetDb.models.insertModel(modelProps);
148
+ const modelId = this._editTxn.insertModel(modelProps);
139
149
  core_bentley_1.Logger.logInfo(loggerCategory, `Inserted ${this.formatModelForLogger(modelProps)}`);
140
150
  await this.trackProgress();
141
151
  return modelId;
@@ -153,8 +163,7 @@ class IModelImporter {
153
163
  * @note A subclass may override this method to customize update behavior but should call `super.onUpdateModel`.
154
164
  */
155
165
  async onUpdateModel(modelProps) {
156
- // eslint-disable-next-line @typescript-eslint/no-deprecated
157
- this.targetDb.models.updateModel(modelProps);
166
+ this._editTxn.updateModel(modelProps);
158
167
  core_bentley_1.Logger.logInfo(loggerCategory, `Updated ${this.formatModelForLogger(modelProps)}`);
159
168
  await this.trackProgress();
160
169
  }
@@ -230,8 +239,7 @@ class IModelImporter {
230
239
  */
231
240
  async onInsertElement(elementProps) {
232
241
  try {
233
- // eslint-disable-next-line @typescript-eslint/no-deprecated
234
- const elementId = this.targetDb.elements.insertElement(elementProps, {
242
+ const elementId = this._editTxn.insertElement(elementProps, {
235
243
  forceUseId: this.options.preserveElementIdsForFiltering,
236
244
  });
237
245
  // set the id like [IModelDb.insertElement]($backend), does, the raw nativeDb method does not
@@ -263,8 +271,7 @@ class IModelImporter {
263
271
  if (!elementProps.id) {
264
272
  throw new core_common_1.IModelError(core_bentley_1.IModelStatus.InvalidId, "ElementId not provided");
265
273
  }
266
- // eslint-disable-next-line @typescript-eslint/no-deprecated
267
- this.targetDb.elements.updateElement(elementProps);
274
+ this._editTxn.updateElement(elementProps);
268
275
  core_bentley_1.Logger.logInfo(loggerCategory, `Updated ${this.formatElementForLogger(elementProps)}`);
269
276
  await this.trackProgress();
270
277
  if (this.options.simplifyElementGeometry) {
@@ -280,7 +287,7 @@ class IModelImporter {
280
287
  * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElement`.
281
288
  */
282
289
  async onDeleteElement(elementId) {
283
- (0, ElementCascadingDeleter_1.deleteElementTreeCascade)(this.targetDb, elementId);
290
+ (0, ElementCascadingDeleter_1.deleteElementTreeCascade)(this._editTxn, elementId);
284
291
  core_bentley_1.Logger.logInfo(loggerCategory, `Deleted element ${elementId} and its descendants`);
285
292
  await this.trackProgress();
286
293
  }
@@ -296,8 +303,7 @@ class IModelImporter {
296
303
  * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteModel`.
297
304
  */
298
305
  async onDeleteModel(modelId) {
299
- // eslint-disable-next-line @typescript-eslint/no-deprecated
300
- this.targetDb.models.deleteModel(modelId);
306
+ this._editTxn.deleteModel(modelId);
301
307
  core_bentley_1.Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);
302
308
  await this.trackProgress();
303
309
  }
@@ -398,8 +404,7 @@ class IModelImporter {
398
404
  */
399
405
  async onInsertElementAspect(aspectProps) {
400
406
  try {
401
- // eslint-disable-next-line @typescript-eslint/no-deprecated
402
- const id = this.targetDb.elements.insertAspect(aspectProps);
407
+ const id = this._editTxn.insertAspect(aspectProps);
403
408
  core_bentley_1.Logger.logInfo(loggerCategory, `Inserted ${this.formatElementAspectForLogger(aspectProps)}`);
404
409
  await this.trackProgress();
405
410
  return id;
@@ -417,8 +422,7 @@ class IModelImporter {
417
422
  * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElementAspect`.
418
423
  */
419
424
  async onUpdateElementAspect(aspectProps) {
420
- // eslint-disable-next-line @typescript-eslint/no-deprecated
421
- this.targetDb.elements.updateAspect(aspectProps);
425
+ this._editTxn.updateAspect(aspectProps);
422
426
  core_bentley_1.Logger.logInfo(loggerCategory, `Updated ${this.formatElementAspectForLogger(aspectProps)}`);
423
427
  await this.trackProgress();
424
428
  }
@@ -426,8 +430,7 @@ class IModelImporter {
426
430
  * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElementAspect`.
427
431
  */
428
432
  async onDeleteElementAspect(targetElementAspect) {
429
- // eslint-disable-next-line @typescript-eslint/no-deprecated
430
- this.targetDb.elements.deleteAspect(targetElementAspect.id);
433
+ this._editTxn.deleteAspect(targetElementAspect.id);
431
434
  core_bentley_1.Logger.logInfo(loggerCategory, `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`);
432
435
  await this.trackProgress();
433
436
  }
@@ -473,9 +476,7 @@ class IModelImporter {
473
476
  */
474
477
  async onInsertRelationship(relationshipProps) {
475
478
  try {
476
- const targetRelInstanceId =
477
- // eslint-disable-next-line @typescript-eslint/no-deprecated
478
- this.targetDb.relationships.insertInstance(relationshipProps);
479
+ const targetRelInstanceId = this._editTxn.insertRelationship(relationshipProps);
479
480
  core_bentley_1.Logger.logInfo(loggerCategory, `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`);
480
481
  await this.trackProgress();
481
482
  return targetRelInstanceId;
@@ -496,16 +497,14 @@ class IModelImporter {
496
497
  if (!relationshipProps.id) {
497
498
  throw new core_common_1.IModelError(core_bentley_1.IModelStatus.InvalidId, "Relationship instance Id not provided");
498
499
  }
499
- // eslint-disable-next-line @typescript-eslint/no-deprecated
500
- this.targetDb.relationships.updateInstance(relationshipProps);
500
+ this._editTxn.updateRelationship(relationshipProps);
501
501
  core_bentley_1.Logger.logInfo(loggerCategory, `Updated ${this.formatRelationshipForLogger(relationshipProps)}`);
502
502
  await this.trackProgress();
503
503
  }
504
504
  /** Delete the specified Relationship from the target iModel. */
505
505
  async onDeleteRelationship(relationshipProps) {
506
506
  // Only passing in what deleteInstance actually uses, full relationshipProps is not necessary.
507
- // eslint-disable-next-line @typescript-eslint/no-deprecated
508
- this.targetDb.relationships.deleteInstance({
507
+ this._editTxn.deleteRelationship({
509
508
  id: relationshipProps.id,
510
509
  classFullName: relationshipProps.classFullName,
511
510
  });
@@ -555,8 +554,7 @@ class IModelImporter {
555
554
  ? extentsWithOutliers
556
555
  : computedProjectExtents.extents;
557
556
  if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {
558
- // eslint-disable-next-line @typescript-eslint/no-deprecated
559
- this.targetDb.updateProjectExtents(newProjectExtents);
557
+ this._editTxn.updateProjectExtents(newProjectExtents);
560
558
  core_bentley_1.Logger.logInfo(loggerCategory, `Updated projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);
561
559
  }
562
560
  if (!excludeOutliers &&
@@ -589,8 +587,7 @@ class IModelImporter {
589
587
  for (const [elementId, codeValue] of this._duplicateCodeValueMap) {
590
588
  const element = this.targetDb.elements.getElement(elementId);
591
589
  element.code.value = codeValue;
592
- // eslint-disable-next-line @typescript-eslint/no-deprecated
593
- element.update();
590
+ this._editTxn.updateElement(element.toJSON());
594
591
  }
595
592
  this._duplicateCodeValueMap.clear();
596
593
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IModelImporter.js","sourceRoot":"","sources":["../../src/IModelImporter.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/** @packageDocumentation\n * @module iModels\n */\nimport {\n Guid,\n Id64,\n Id64String,\n IModelStatus,\n Logger,\n} from \"@itwin/core-bentley\";\nimport {\n Base64EncodedString,\n ECJsNames,\n ElementAspectProps,\n ElementProps,\n EntityProps,\n IModel,\n IModelError,\n ModelProps,\n RelatedElement,\n SubCategoryProps,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\nimport {\n ElementAspect,\n ElementMultiAspect,\n Entity,\n IModelDb,\n Relationship,\n RelationshipProps,\n SourceAndTarget,\n SubCategory,\n} from \"@itwin/core-backend\";\nimport type { RelationshipPropsForDelete } from \"./IModelTransformer\";\nimport * as assert from \"assert\";\nimport { deleteElementTreeCascade } from \"./ElementCascadingDeleter\";\nimport { Property, PropertyType } from \"@itwin/ecschema-metadata\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelImporter;\n\n/** Options provided to [[IModelImporter.optimizeGeometry]] specifying post-processing optimizations to be applied to the iModel's geometry.\n * @beta\n */\nexport interface OptimizeGeometryOptions {\n /** If true, identify any [GeometryPart]($backend)s that are referenced exactly once. For each such part,\n * replace the reference in the element's geometry stream with the part's own geometry stream, then delete the part.\n */\n inlineUniqueGeometryParts?: boolean;\n}\n\n/** Options provided to the [[IModelImporter]] constructor.\n * @beta\n */\nexport interface IModelImportOptions {\n /** If `true` (the default), compute the projectExtents of the target iModel after elements are imported.\n * The computed projectExtents will either include or exclude *outliers* depending on the `excludeOutliers` flag that defaults to `false`.\n * @see [[IModelImporter.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n */\n autoExtendProjectExtents?: boolean | { excludeOutliers: boolean };\n /** See [IModelTransformOptions]($transformer) */\n preserveElementIdsForFiltering?: boolean;\n /** If `true`, simplify the element geometry for visualization purposes. For example, convert b-reps into meshes.\n * @default false\n */\n simplifyElementGeometry?: boolean;\n /**\n * Skip propagating changes made to the root subject, dictionaryModel and IModelImporter._realityDataSourceLinkPartitionStaticId (0xe)\n * If it is set to false, changes to root elements are propagated, the root subject name gets changed and leads to the iModelDb.name property being updated in .initializeiModelDb\n * @default true\n */\n skipPropagateChangesToRootElements?: boolean;\n}\n\n/** Base class for importing data into an iModel.\n * @see [iModel Transformation and Data Exchange]($docs/learning/transformer/index.md)\n * @see [IModelExporter]($transformer)\n * @see [IModelTransformer]($transformer)\n * @beta\n */\nexport class IModelImporter {\n /** The read/write target iModel. */\n public readonly targetDb: IModelDb;\n\n /** resolved initialization options for the importer\n * @beta\n */\n public readonly options: Required<IModelImportOptions>;\n\n private static _realityDataSourceLinkPartitionStaticId: Id64String = \"0xe\";\n\n /**\n * A map of conflicting element code values.\n * In cases where updating an element's code value results in a codeValue conflict, the element's code value will instead be updated to a random guid.\n * The actual codeValue will be stored in this ElementId->CodeValue map.\n * This is needed in cases where the duplicate target element is set to be deleted in the future, or when elements are switching code values with one another and we need a temporary code value.\n * To resolve code values to their intended values call [[IModelImporter.resolveDuplicateCodeValues]].\n */\n private _duplicateCodeValueMap: Map<Id64String, string>;\n\n /**\n * A set of elementIds that the transformer adds to while exporting elements to indicate that the element already exists in the target.\n * Defaults to an empty set.\n * @note\n *\n * This is used as an optimization when `[[IModelTransformOptions.preserveElementIdsForFiltering]]` is set to `true`\n * In normal cases where this option set to `false`,\n * the importer determines whether to insert or update based off of whether the ID is defined on the `elementProps` passed to `importElement`.\n * However, with `preserveElementIdsForFiltering` set to `true`, IDs are always set, so we can't determine insert/update like the normal case.\n * The transformer already knows if an element exists or not by the time `importElement` is called and pushes to this set with `markElementToUpdateForPreserveId`.\n * @note This set should stay small, as right after the transformer pushes to it, the importer will remove from the set.\n */\n private _elementsToUpdateDuringPreserveIds = new Set<Id64String>([]);\n\n /** The set of elements that should not be updated by this IModelImporter.\n * Defaults to an empty set.\n * @note Adding an element to this set is typically necessary when remapping a source element to one that already exists in the target and already has the desired properties.\n */\n public readonly doNotUpdateElementIds = new Set<Id64String>([]);\n\n /** This set is ONLY used for elements that are always present even in an \"empty\" iModel. We will use this set to filter out changes to root elements if [[IModelTransformOptions.skipPropagateChangesToRootElements]] is false. */\n private readonly _rootElementIds = new Set<Id64String>([\n IModel.rootSubjectId,\n IModel.dictionaryId,\n IModelImporter._realityDataSourceLinkPartitionStaticId,\n ]);\n\n /** The number of entity changes before incremental progress should be reported via the [[onProgress]] callback. */\n public progressInterval: number = 1000;\n /** Tracks the current total number of entity changes. */\n private _progressCounter: number = 0;\n /** */\n private _modelPropertiesToIgnore = new Set<string>([\n \"geometryGuid\", // cannot compare GeometricModel.GeometryGuid values across iModels\n ]);\n\n /** Construct a new IModelImporter\n * @param targetDb The target IModelDb\n * @param options The options that specify how the import should be done.\n */\n public constructor(targetDb: IModelDb, options?: IModelImportOptions) {\n this.targetDb = targetDb;\n this.options = {\n autoExtendProjectExtents: options?.autoExtendProjectExtents ?? true,\n preserveElementIdsForFiltering:\n options?.preserveElementIdsForFiltering ?? false,\n simplifyElementGeometry: options?.simplifyElementGeometry ?? false,\n skipPropagateChangesToRootElements:\n options?.skipPropagateChangesToRootElements ?? true,\n };\n this._duplicateCodeValueMap = new Map<Id64String, string>();\n }\n\n /**\n * Checks [[IModelImportOptions.skipPropagateChangesToRootElements]], [[IModelImporter.rootElementIds]], and [[IModelImporter.doNotUpdateElementIds]] and returns true for 'do not update', false for do 'update'.\n */\n private doNotUpdateElement(elementId: Id64String): boolean {\n if (\n this.options.skipPropagateChangesToRootElements &&\n this._rootElementIds.has(elementId)\n )\n return true;\n if (this.doNotUpdateElementIds.has(elementId)) return true;\n return false;\n }\n\n /**\n * Marks an element so that it can be updated during import when [[IModelTransformOptions.preserveElementIdsForFiltering]] is set to true.\n */\n public markElementToUpdateDuringPreserveIds(elementId: Id64String) {\n if (this._rootElementIds.has(elementId)) {\n return;\n }\n this._elementsToUpdateDuringPreserveIds.add(elementId);\n }\n\n /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */\n public async importModel(modelProps: ModelProps): Promise<void> {\n if (undefined === modelProps.id || !Id64.isValidId64(modelProps.id))\n throw new IModelError(\n IModelStatus.InvalidId,\n \"Model Id not provided, should be the same as the ModeledElementId\"\n );\n\n if (this.doNotUpdateElement(modelProps.id)) {\n Logger.logInfo(\n loggerCategory,\n `Do not update target model ${modelProps.id}`\n );\n return;\n }\n try {\n const model = this.targetDb.models.getModel(modelProps.id); // throws IModelError.NotFound if model does not exist\n if (hasEntityChanged(model, modelProps, this._modelPropertiesToIgnore)) {\n await this.onUpdateModel(modelProps);\n }\n } catch (error) {\n // catch NotFound error and insertModel\n if (\n error instanceof IModelError &&\n error.errorNumber === IModelStatus.NotFound\n ) {\n await this.onInsertModel(modelProps);\n return;\n }\n throw error;\n }\n }\n\n /** Create a new Model from the specified ModelProps and insert it into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertModel`.\n */\n protected async onInsertModel(modelProps: ModelProps): Promise<Id64String> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const modelId: Id64String = this.targetDb.models.insertModel(modelProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatModelForLogger(modelProps)}`\n );\n await this.trackProgress();\n return modelId;\n } catch (error) {\n if (!this.targetDb.containsClass(modelProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Model class \"${modelProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Model in the target iModel from the specified ModelProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateModel`.\n */\n protected async onUpdateModel(modelProps: ModelProps): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.models.updateModel(modelProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatModelForLogger(modelProps)}`\n );\n await this.trackProgress();\n }\n\n /** Format a Model for the Logger. */\n private formatModelForLogger(modelProps: ModelProps): string {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return `${modelProps.classFullName} [${modelProps.id!}]`;\n }\n\n /**\n * Tries to update an element with the specified element properties.\n * If a duplicate code error occurs, it assigns a new unique code value and retries the update\n */\n private async tryUpdateElement(elemProps: ElementProps) {\n try {\n await this.onUpdateElement(elemProps);\n } catch (err) {\n if ((err as IModelError).errorNumber === IModelStatus.DuplicateCode) {\n assert(\n elemProps.code.value !== undefined,\n \"NULL code values are always considered unique and cannot clash\"\n );\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this._duplicateCodeValueMap.set(elemProps.id!, elemProps.code.value);\n // Using NULL code values as an alternative is not valid because definition elements cannot have NULL code values.\n elemProps.code.value = Guid.createValue();\n await this.onUpdateElement(elemProps);\n } else {\n throw err;\n }\n }\n }\n\n /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */\n public async importElement(elementProps: ElementProps): Promise<Id64String> {\n if (\n undefined !== elementProps.id &&\n this.doNotUpdateElement(elementProps.id)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Do not update target element ${elementProps.id}`\n );\n return elementProps.id;\n }\n\n if (this.options.preserveElementIdsForFiltering) {\n if (elementProps.id === undefined) {\n throw new IModelError(\n IModelStatus.BadElement,\n \"elementProps.id must be defined during a preserveIds operation\"\n );\n }\n\n // Categories are the only element that onInserted will immediately insert a new element (their default subcategory)\n // since default subcategories always exist and always will be inserted after their categories, we treat them as an update\n // to prevent duplicate inserts.\n // Always present elements (0xe, 0x1, 0x10) also will be updated to prevent duplicate inserts.\n if (\n (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) ||\n this._rootElementIds.has(elementProps.id)\n ) {\n await this.onUpdateElement(elementProps);\n } else {\n if (this._elementsToUpdateDuringPreserveIds.has(elementProps.id)) {\n await this.tryUpdateElement(elementProps);\n this._elementsToUpdateDuringPreserveIds.delete(elementProps.id);\n } else {\n await this.onInsertElement(elementProps);\n }\n }\n } else {\n if (undefined !== elementProps.id) {\n await this.tryUpdateElement(elementProps);\n } else {\n elementProps.id = await this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement\n }\n }\n return elementProps.id;\n }\n\n /** Create a new Element from the specified ElementProps and insert it into the target iModel.\n * @returns The Id of the newly inserted Element.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElement`.\n */\n protected async onInsertElement(\n elementProps: ElementProps\n ): Promise<Id64String> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const elementId = this.targetDb.elements.insertElement(elementProps, {\n forceUseId: this.options.preserveElementIdsForFiltering,\n });\n // set the id like [IModelDb.insertElement]($backend), does, the raw nativeDb method does not\n elementProps.id = elementId;\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatElementForLogger(elementProps)}`\n );\n await this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.simplifyElementGeometry({\n id: elementId,\n convertBReps: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Simplified element geometry for ${this.formatElementForLogger(\n elementProps\n )}`\n );\n }\n return elementId;\n } catch (error) {\n if (!this.targetDb.containsClass(elementProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Element class \"${elementProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Element in the target iModel from the specified ElementProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElement`.\n */\n protected async onUpdateElement(elementProps: ElementProps): Promise<void> {\n if (!elementProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"ElementId not provided\");\n }\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.elements.updateElement(elementProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatElementForLogger(elementProps)}`\n );\n await this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.simplifyElementGeometry({\n id: elementProps.id,\n convertBReps: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Simplified element geometry for ${this.formatElementForLogger(\n elementProps\n )}`\n );\n }\n }\n\n /** Delete the specified Element (and all its children) from the target iModel.\n * Will delete special elements like definition elements and subjects.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElement`.\n */\n protected async onDeleteElement(elementId: Id64String): Promise<void> {\n deleteElementTreeCascade(this.targetDb, elementId);\n Logger.logInfo(\n loggerCategory,\n `Deleted element ${elementId} and its descendants`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Element from the target iModel. */\n public async deleteElement(elementId: Id64String): Promise<void> {\n if (this.doNotUpdateElement(elementId)) {\n Logger.logInfo(\n loggerCategory,\n `Do not delete target element ${elementId}`\n );\n return;\n }\n await this.onDeleteElement(elementId);\n }\n\n /** Delete the specified Model from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteModel`.\n */\n protected async onDeleteModel(modelId: Id64String): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.models.deleteModel(modelId);\n Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);\n await this.trackProgress();\n }\n\n /** Delete the specified Model from the target iModel. */\n public async deleteModel(modelId: Id64String): Promise<void> {\n await this.onDeleteModel(modelId);\n }\n\n /** Format an Element for the Logger. */\n private formatElementForLogger(elementProps: ElementProps): string {\n const namePiece: string = elementProps.code.value\n ? `${elementProps.code.value} `\n : elementProps.userLabel\n ? `${elementProps.userLabel} `\n : \"\";\n return `${elementProps.classFullName} ${namePiece}[${elementProps.id}]`;\n }\n\n /** Import an ElementUniqueAspect into the target iModel. */\n public async importElementUniqueAspect(\n aspectProps: ElementAspectProps\n ): Promise<Id64String> {\n const aspects: ElementAspect[] = this.targetDb.elements.getAspects(\n aspectProps.element.id,\n aspectProps.classFullName\n );\n if (aspects.length === 0) {\n return this.onInsertElementAspect(aspectProps);\n } else if (hasEntityChanged(aspects[0], aspectProps)) {\n aspectProps.id = aspects[0].id;\n await this.onUpdateElementAspect(aspectProps);\n }\n return aspects[0].id;\n }\n\n /** Import the collection of ElementMultiAspects into the target iModel.\n * @param aspectPropsArray The ElementMultiAspects to import\n * @param filterFunc Optional filter func that is used to exclude target ElementMultiAspects that were added during iModel transformation from the update detection logic.\n * @note For insert vs. update reasons, it is important to process all ElementMultiAspects owned by an Element at once since we don't have aspect-specific provenance.\n * @returns the array of ids of the resulting ElementMultiAspects, in the same order of the aspectPropsArray parameter\n */\n public async importElementMultiAspects(\n aspectPropsArray: ElementAspectProps[],\n /** caller must use this to enforce any aspects added by IModelTransformer are not considered for update */\n filterFunc: (a: ElementMultiAspect) => boolean = () => true\n ): Promise<Id64String[]> {\n const result = new Array<Id64String | undefined>(\n aspectPropsArray.length\n ).fill(undefined);\n\n if (aspectPropsArray.length === 0) {\n return result as Id64String[];\n }\n\n const elementId: Id64String = aspectPropsArray[0].element.id;\n // Determine the set of ElementMultiAspect classes to consider\n const aspectClassFullNames = new Set<string>();\n aspectPropsArray.forEach((aspectsProps: ElementAspectProps): void => {\n aspectClassFullNames.add(aspectsProps.classFullName);\n });\n\n // Handle ElementMultiAspects in groups by class\n for (const aspectClassFullName of aspectClassFullNames) {\n const proposedAspects = aspectPropsArray\n .map((props, index) => ({ props, index }))\n .filter(({ props }) => aspectClassFullName === props.classFullName);\n\n const currentAspects = this.targetDb.elements\n .getAspects(elementId, aspectClassFullName)\n .map((props, index) => ({ props, index }) as const)\n .filter(({ props }) => filterFunc(props));\n\n if (proposedAspects.length >= currentAspects.length) {\n for (let index = 0; index < proposedAspects.length; index++) {\n const { props, index: resultIndex } = proposedAspects[index];\n let id: Id64String;\n if (index < currentAspects.length) {\n id = currentAspects[index].props.id;\n props.id = id;\n if (hasEntityChanged(currentAspects[index].props, props)) {\n await this.onUpdateElementAspect(props);\n }\n id = props.id;\n } else {\n id = await this.onInsertElementAspect(props);\n }\n result[resultIndex] = id;\n }\n } else {\n for (let index = 0; index < currentAspects.length; index++) {\n const { props, index: resultIndex } = currentAspects[index];\n let id: Id64String;\n if (index < proposedAspects.length) {\n id = props.id;\n proposedAspects[index].props.id = id;\n if (hasEntityChanged(props, proposedAspects[index].props)) {\n await this.onUpdateElementAspect(proposedAspects[index].props);\n }\n result[resultIndex] = id;\n } else {\n await this.onDeleteElementAspect(props);\n }\n }\n }\n }\n\n assert(result.every((r) => typeof r !== undefined));\n return result as Id64String[];\n }\n\n /** Insert the ElementAspect into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElementAspect`.\n */\n protected async onInsertElementAspect(\n aspectProps: ElementAspectProps\n ): Promise<Id64String> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const id = this.targetDb.elements.insertAspect(aspectProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatElementAspectForLogger(aspectProps)}`\n );\n await this.trackProgress();\n return id;\n } catch (error) {\n if (!this.targetDb.containsClass(aspectProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `ElementAspect class \"${aspectProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update the ElementAspect within the target iModel.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElementAspect`.\n */\n protected async onUpdateElementAspect(\n aspectProps: ElementAspectProps\n ): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.elements.updateAspect(aspectProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatElementAspectForLogger(aspectProps)}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified ElementAspect from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElementAspect`.\n */\n protected async onDeleteElementAspect(\n targetElementAspect: ElementAspect\n ): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.elements.deleteAspect(targetElementAspect.id);\n Logger.logInfo(\n loggerCategory,\n `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`\n );\n await this.trackProgress();\n }\n\n /** Format an ElementAspect for the Logger. */\n private formatElementAspectForLogger(\n elementAspectProps: ElementAspectProps | ElementAspect\n ): string {\n return `${elementAspectProps.classFullName} elementId=[${elementAspectProps.element.id}]`;\n }\n\n /** Import the specified RelationshipProps (either as an insert or an update) into the target iModel.\n * @returns The instance Id of the inserted or updated Relationship.\n */\n public async importRelationship(\n relationshipProps: RelationshipProps\n ): Promise<Id64String> {\n if (\n undefined === relationshipProps.sourceId ||\n !Id64.isValidId64(relationshipProps.sourceId)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.sourceId`\n );\n return Id64.invalid;\n }\n if (\n undefined === relationshipProps.targetId ||\n !Id64.isValidId64(relationshipProps.targetId)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.targetId`\n );\n return Id64.invalid;\n }\n // check for an existing relationship\n const relSourceAndTarget: SourceAndTarget = {\n sourceId: relationshipProps.sourceId,\n targetId: relationshipProps.targetId,\n };\n const relationship: Relationship | undefined =\n this.targetDb.relationships.tryGetInstance(\n relationshipProps.classFullName,\n relSourceAndTarget\n );\n if (undefined !== relationship) {\n // if relationship found, update it\n relationshipProps.id = relationship.id;\n if (hasEntityChanged(relationship, relationshipProps)) {\n await this.onUpdateRelationship(relationshipProps);\n }\n return relationshipProps.id;\n } else {\n return this.onInsertRelationship(relationshipProps);\n }\n }\n\n /** Create a new Relationship from the specified RelationshipProps and insert it into the target iModel.\n * @returns The instance Id of the newly inserted relationship.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertRelationship`.\n */\n protected async onInsertRelationship(\n relationshipProps: RelationshipProps\n ): Promise<Id64String> {\n try {\n const targetRelInstanceId: Id64String =\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.relationships.insertInstance(relationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`\n );\n await this.trackProgress();\n return targetRelInstanceId;\n } catch (error) {\n if (!this.targetDb.containsClass(relationshipProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Relationship class \"${relationshipProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Relationship in the target iModel from the specified RelationshipProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateRelationship`.\n */\n protected async onUpdateRelationship(\n relationshipProps: RelationshipProps\n ): Promise<void> {\n if (!relationshipProps.id) {\n throw new IModelError(\n IModelStatus.InvalidId,\n \"Relationship instance Id not provided\"\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.relationships.updateInstance(relationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatRelationshipForLogger(relationshipProps)}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n protected async onDeleteRelationship(\n relationshipProps: RelationshipPropsForDelete\n ): Promise<void> {\n // Only passing in what deleteInstance actually uses, full relationshipProps is not necessary.\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.relationships.deleteInstance({\n id: relationshipProps.id,\n classFullName: relationshipProps.classFullName,\n } as RelationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Deleted relationship ${relationshipProps.classFullName} id=${relationshipProps.id}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n public async deleteRelationship(\n relationshipProps: RelationshipPropsForDelete\n ): Promise<void> {\n await this.onDeleteRelationship(relationshipProps);\n }\n\n /** Format a Relationship for the Logger. */\n private formatRelationshipForLogger(relProps: RelationshipProps): string {\n return `${relProps.classFullName} sourceId=[${relProps.sourceId}] targetId=[${relProps.targetId}]`;\n }\n\n /** Tracks incremental progress */\n private async trackProgress(): Promise<void> {\n this._progressCounter++;\n if (0 === this._progressCounter % this.progressInterval) {\n await this.onProgress();\n }\n }\n\n /** This method is called when IModelImporter has made incremental progress based on the [[progressInterval]] setting.\n * @note A subclass may override this method to report custom progress but should call `super.onProgress`.\n */\n protected async onProgress(): Promise<void> {}\n\n /** Optionally compute the projectExtents for the target iModel depending on the options for this IModelImporter.\n * @note This method is automatically called from [IModelTransformer.process]($transformer).\n * @see [IModelDb.computeProjectExtents]($backend), [[autoExtendProjectExtents]]\n */\n public computeProjectExtents(): void {\n const computedProjectExtents = this.targetDb.computeProjectExtents({\n reportExtentsWithOutliers: true,\n reportOutliers: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Current projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`\n );\n Logger.logInfo(\n loggerCategory,\n `Computed projectExtents without outliers=${JSON.stringify(\n computedProjectExtents.extents\n )}`\n );\n Logger.logInfo(\n loggerCategory,\n `Computed projectExtents with outliers=${JSON.stringify(\n computedProjectExtents.extentsWithOutliers\n )}`\n );\n if (this.options.autoExtendProjectExtents) {\n const excludeOutliers: boolean =\n typeof this.options.autoExtendProjectExtents === \"object\"\n ? this.options.autoExtendProjectExtents.excludeOutliers\n : false;\n // If excludeOutliers is true, use the extents without outliers.\n // Otherwise prefer extentsWithOutliers, but fall back to extents if it's undefined or a null range.\n const extentsWithOutliers = computedProjectExtents.extentsWithOutliers;\n const useExtentsWithOutliers =\n !excludeOutliers && extentsWithOutliers && !extentsWithOutliers.isNull;\n const newProjectExtents = useExtentsWithOutliers\n ? extentsWithOutliers\n : computedProjectExtents.extents;\n if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n this.targetDb.updateProjectExtents(newProjectExtents);\n Logger.logInfo(\n loggerCategory,\n `Updated projectExtents=${JSON.stringify(\n this.targetDb.projectExtents\n )}`\n );\n }\n if (\n !excludeOutliers &&\n computedProjectExtents.outliers &&\n computedProjectExtents.outliers.length > 0\n ) {\n Logger.logInfo(\n loggerCategory,\n `${computedProjectExtents.outliers.length} outliers detected within projectExtents`\n );\n }\n } else {\n if (\n !this.targetDb.projectExtents.containsRange(\n computedProjectExtents.extents\n )\n ) {\n Logger.logWarning(\n loggerCategory,\n \"Current project extents may be too small\"\n );\n }\n if (\n computedProjectExtents.outliers &&\n computedProjectExtents.outliers.length > 0\n ) {\n Logger.logInfo(\n loggerCategory,\n `${computedProjectExtents.outliers.length} outliers detected within projectExtents`\n );\n }\n }\n }\n\n /** Examine the geometry streams of every [GeometricElement3d]($backend) in the target iModel and apply the specified optimizations.\n * @note This method is automatically called from [[IModelTransformer.process]] if\n * [[IModelTransformOptions.optimizeGeometry]] is defined.\n */\n public optimizeGeometry(options: OptimizeGeometryOptions): void {\n if (options.inlineUniqueGeometryParts) {\n const result = this.targetDb.inlineGeometryParts();\n Logger.logInfo(\n loggerCategory,\n `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.`\n );\n }\n }\n\n private resolveDuplicateCodeValues(): void {\n for (const [elementId, codeValue] of this._duplicateCodeValueMap) {\n const element = this.targetDb.elements.getElement(elementId);\n element.code.value = codeValue;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n element.update();\n }\n this._duplicateCodeValueMap.clear();\n }\n\n /**\n * Needs to be called to perform necessary cleanup operations.\n * By not calling `finalize` there is a risk that data imported into targetDb will not be as expected.\n *\n * @note No need to call this If using [[IModelTransformer]] as it automatically invokes this method.\n */\n public finalize(): void {\n this.resolveDuplicateCodeValues();\n }\n}\n\n/** Returns true if a change within an Entity is detected.\n * @param entity The current persistent Entity.\n * @param entityProps The new EntityProps to compare against\n * @note This method should only be called if changeset information is not available.\n * @internal\n */\nexport function hasEntityChanged(\n entity: Entity,\n entityProps: EntityProps,\n namesToIgnore?: Set<string>\n): boolean {\n let changed: boolean = false;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n entity.forEach((propertyName: string, property: Property) => {\n if (!changed) {\n if (namesToIgnore && namesToIgnore.has(propertyName)) {\n // skip\n } else if (PropertyType.Binary === property.propertyType) {\n changed = hasBinaryValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n } else if (property.isNavigation()) {\n changed = hasNavigationValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n } else {\n changed = hasValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n }\n }\n });\n return changed;\n}\n\n/** Returns true if the specified binary values are different. */\nfunction hasBinaryValueChanged(\n binaryProperty1: any,\n binaryProperty2: any\n): boolean {\n const jsonString1 = JSON.stringify(\n binaryProperty1,\n Base64EncodedString.replacer\n );\n const jsonString2 = JSON.stringify(\n binaryProperty2,\n Base64EncodedString.replacer\n );\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasNavigationValueChanged(\n navigationProperty1: any,\n navigationProperty2: any\n): boolean {\n const relatedElement1 = RelatedElement.fromJSON(navigationProperty1);\n const relatedElement2 = RelatedElement.fromJSON(navigationProperty2);\n const jsonString1 = JSON.stringify(relatedElement1);\n const jsonString2 = JSON.stringify(relatedElement2);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasValueChanged(property1: any, property2: any): boolean {\n return JSON.stringify(property1) !== JSON.stringify(property2);\n}\n\n/** check if element props are a subcategory */\nfunction isSubCategory(props: ElementProps): props is SubCategoryProps {\n return props.classFullName === SubCategory.classFullName;\n}\n\n/** check if element props are a subcategory without loading the element */\nfunction isDefaultSubCategory(props: SubCategoryProps): boolean {\n if (props.id === undefined) return false;\n\n if (!Id64.isId64(props.id))\n throw new IModelError(\n IModelStatus.BadElement,\n \"subcategory had invalid id\"\n );\n if (props.parent?.id === undefined)\n throw new IModelError(\n IModelStatus.BadElement,\n `subcategory with id ${props.id} had no parent`\n );\n return props.id === IModelDb.getDefaultSubCategoryId(props.parent.id);\n}\n"]}
1
+ {"version":3,"file":"IModelImporter.js","sourceRoot":"","sources":["../../src/IModelImporter.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/** @packageDocumentation\n * @module iModels\n */\nimport {\n Guid,\n Id64,\n Id64String,\n IModelStatus,\n Logger,\n} from \"@itwin/core-bentley\";\nimport {\n Base64EncodedString,\n ECJsNames,\n ElementAspectProps,\n ElementProps,\n EntityProps,\n IModel,\n IModelError,\n ModelProps,\n RelatedElement,\n SubCategoryProps,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\nimport {\n EditTxn,\n ElementAspect,\n ElementMultiAspect,\n Entity,\n IModelDb,\n Relationship,\n RelationshipProps,\n SourceAndTarget,\n SubCategory,\n} from \"@itwin/core-backend\";\nimport type { RelationshipPropsForDelete } from \"./IModelTransformer\";\nimport * as assert from \"assert\";\nimport { deleteElementTreeCascade } from \"./ElementCascadingDeleter\";\nimport { Property, PropertyType } from \"@itwin/ecschema-metadata\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelImporter;\n\n/** Options provided to [[IModelImporter.optimizeGeometry]] specifying post-processing optimizations to be applied to the iModel's geometry.\n * @beta\n */\nexport interface OptimizeGeometryOptions {\n /** If true, identify any [GeometryPart]($backend)s that are referenced exactly once. For each such part,\n * replace the reference in the element's geometry stream with the part's own geometry stream, then delete the part.\n */\n inlineUniqueGeometryParts?: boolean;\n}\n\n/** Options provided to the [[IModelImporter]] constructor.\n * @beta\n */\nexport interface IModelImportOptions {\n /** If `true` (the default), compute the projectExtents of the target iModel after elements are imported.\n * The computed projectExtents will either include or exclude *outliers* depending on the `excludeOutliers` flag that defaults to `false`.\n * @see [[IModelImporter.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n */\n autoExtendProjectExtents?: boolean | { excludeOutliers: boolean };\n /** See [IModelTransformOptions]($transformer) */\n preserveElementIdsForFiltering?: boolean;\n /** If `true`, simplify the element geometry for visualization purposes. For example, convert b-reps into meshes.\n * @default false\n */\n simplifyElementGeometry?: boolean;\n /**\n * Skip propagating changes made to the root subject, dictionaryModel and IModelImporter._realityDataSourceLinkPartitionStaticId (0xe)\n * If it is set to false, changes to root elements are propagated, the root subject name gets changed and leads to the iModelDb.name property being updated in .initializeiModelDb\n * @default true\n */\n skipPropagateChangesToRootElements?: boolean;\n}\n\n/** Base class for importing data into an iModel.\n * @see [iModel Transformation and Data Exchange]($docs/learning/transformer/index.md)\n * @see [IModelExporter]($transformer)\n * @see [IModelTransformer]($transformer)\n * @beta\n */\nexport class IModelImporter {\n /** The read/write target iModel. */\n public readonly targetDb: IModelDb;\n\n /** The [[EditTxn]] used for write operations on the target iModel.\n * @beta\n */\n protected readonly _editTxn: EditTxn;\n\n /** The [[EditTxn]] used for write operations on the target iModel.\n * @beta\n */\n public get editTxn(): EditTxn {\n return this._editTxn;\n }\n\n /** resolved initialization options for the importer\n * @beta\n */\n public readonly options: Required<IModelImportOptions>;\n\n private static _realityDataSourceLinkPartitionStaticId: Id64String = \"0xe\";\n\n /**\n * A map of conflicting element code values.\n * In cases where updating an element's code value results in a codeValue conflict, the element's code value will instead be updated to a random guid.\n * The actual codeValue will be stored in this ElementId->CodeValue map.\n * This is needed in cases where the duplicate target element is set to be deleted in the future, or when elements are switching code values with one another and we need a temporary code value.\n * To resolve code values to their intended values call [[IModelImporter.resolveDuplicateCodeValues]].\n */\n private _duplicateCodeValueMap: Map<Id64String, string>;\n\n /**\n * A set of elementIds that the transformer adds to while exporting elements to indicate that the element already exists in the target.\n * Defaults to an empty set.\n * @note\n *\n * This is used as an optimization when `[[IModelTransformOptions.preserveElementIdsForFiltering]]` is set to `true`\n * In normal cases where this option set to `false`,\n * the importer determines whether to insert or update based off of whether the ID is defined on the `elementProps` passed to `importElement`.\n * However, with `preserveElementIdsForFiltering` set to `true`, IDs are always set, so we can't determine insert/update like the normal case.\n * The transformer already knows if an element exists or not by the time `importElement` is called and pushes to this set with `markElementToUpdateForPreserveId`.\n * @note This set should stay small, as right after the transformer pushes to it, the importer will remove from the set.\n */\n private _elementsToUpdateDuringPreserveIds = new Set<Id64String>([]);\n\n /** The set of elements that should not be updated by this IModelImporter.\n * Defaults to an empty set.\n * @note Adding an element to this set is typically necessary when remapping a source element to one that already exists in the target and already has the desired properties.\n */\n public readonly doNotUpdateElementIds = new Set<Id64String>([]);\n\n /** This set is ONLY used for elements that are always present even in an \"empty\" iModel. We will use this set to filter out changes to root elements if [[IModelTransformOptions.skipPropagateChangesToRootElements]] is false. */\n private readonly _rootElementIds = new Set<Id64String>([\n IModel.rootSubjectId,\n IModel.dictionaryId,\n IModelImporter._realityDataSourceLinkPartitionStaticId,\n ]);\n\n /** The number of entity changes before incremental progress should be reported via the [[onProgress]] callback. */\n public progressInterval: number = 1000;\n /** Tracks the current total number of entity changes. */\n private _progressCounter: number = 0;\n /** */\n private _modelPropertiesToIgnore = new Set<string>([\n \"geometryGuid\", // cannot compare GeometricModel.GeometryGuid values across iModels\n ]);\n\n /** Construct a new IModelImporter\n * @param editTxn The [[EditTxn]] to use for write operations on the target iModel. The target db is derived from `editTxn.iModel`.\n * @param options The options that specify how the import should be done.\n */\n public constructor(editTxn: EditTxn, options?: IModelImportOptions) {\n this.targetDb = editTxn.iModel;\n this._editTxn = editTxn;\n this.options = {\n autoExtendProjectExtents: options?.autoExtendProjectExtents ?? true,\n preserveElementIdsForFiltering:\n options?.preserveElementIdsForFiltering ?? false,\n simplifyElementGeometry: options?.simplifyElementGeometry ?? false,\n skipPropagateChangesToRootElements:\n options?.skipPropagateChangesToRootElements ?? true,\n };\n this._duplicateCodeValueMap = new Map<Id64String, string>();\n }\n\n /**\n * Checks [[IModelImportOptions.skipPropagateChangesToRootElements]], [[IModelImporter.rootElementIds]], and [[IModelImporter.doNotUpdateElementIds]] and returns true for 'do not update', false for do 'update'.\n */\n private doNotUpdateElement(elementId: Id64String): boolean {\n if (\n this.options.skipPropagateChangesToRootElements &&\n this._rootElementIds.has(elementId)\n )\n return true;\n if (this.doNotUpdateElementIds.has(elementId)) return true;\n return false;\n }\n\n /**\n * Marks an element so that it can be updated during import when [[IModelTransformOptions.preserveElementIdsForFiltering]] is set to true.\n */\n public markElementToUpdateDuringPreserveIds(elementId: Id64String) {\n if (this._rootElementIds.has(elementId)) {\n return;\n }\n this._elementsToUpdateDuringPreserveIds.add(elementId);\n }\n\n /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */\n public async importModel(modelProps: ModelProps): Promise<void> {\n if (undefined === modelProps.id || !Id64.isValidId64(modelProps.id))\n throw new IModelError(\n IModelStatus.InvalidId,\n \"Model Id not provided, should be the same as the ModeledElementId\"\n );\n\n if (this.doNotUpdateElement(modelProps.id)) {\n Logger.logInfo(\n loggerCategory,\n `Do not update target model ${modelProps.id}`\n );\n return;\n }\n try {\n const model = this.targetDb.models.getModel(modelProps.id); // throws IModelError.NotFound if model does not exist\n if (hasEntityChanged(model, modelProps, this._modelPropertiesToIgnore)) {\n await this.onUpdateModel(modelProps);\n }\n } catch (error) {\n // catch NotFound error and insertModel\n if (\n error instanceof IModelError &&\n error.errorNumber === IModelStatus.NotFound\n ) {\n await this.onInsertModel(modelProps);\n return;\n }\n throw error;\n }\n }\n\n /** Create a new Model from the specified ModelProps and insert it into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertModel`.\n */\n protected async onInsertModel(modelProps: ModelProps): Promise<Id64String> {\n try {\n const modelId: Id64String = this._editTxn.insertModel(modelProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatModelForLogger(modelProps)}`\n );\n await this.trackProgress();\n return modelId;\n } catch (error) {\n if (!this.targetDb.containsClass(modelProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Model class \"${modelProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Model in the target iModel from the specified ModelProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateModel`.\n */\n protected async onUpdateModel(modelProps: ModelProps): Promise<void> {\n this._editTxn.updateModel(modelProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatModelForLogger(modelProps)}`\n );\n await this.trackProgress();\n }\n\n /** Format a Model for the Logger. */\n private formatModelForLogger(modelProps: ModelProps): string {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return `${modelProps.classFullName} [${modelProps.id!}]`;\n }\n\n /**\n * Tries to update an element with the specified element properties.\n * If a duplicate code error occurs, it assigns a new unique code value and retries the update\n */\n private async tryUpdateElement(elemProps: ElementProps) {\n try {\n await this.onUpdateElement(elemProps);\n } catch (err) {\n if ((err as IModelError).errorNumber === IModelStatus.DuplicateCode) {\n assert(\n elemProps.code.value !== undefined,\n \"NULL code values are always considered unique and cannot clash\"\n );\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this._duplicateCodeValueMap.set(elemProps.id!, elemProps.code.value);\n // Using NULL code values as an alternative is not valid because definition elements cannot have NULL code values.\n elemProps.code.value = Guid.createValue();\n await this.onUpdateElement(elemProps);\n } else {\n throw err;\n }\n }\n }\n\n /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */\n public async importElement(elementProps: ElementProps): Promise<Id64String> {\n if (\n undefined !== elementProps.id &&\n this.doNotUpdateElement(elementProps.id)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Do not update target element ${elementProps.id}`\n );\n return elementProps.id;\n }\n\n if (this.options.preserveElementIdsForFiltering) {\n if (elementProps.id === undefined) {\n throw new IModelError(\n IModelStatus.BadElement,\n \"elementProps.id must be defined during a preserveIds operation\"\n );\n }\n\n // Categories are the only element that onInserted will immediately insert a new element (their default subcategory)\n // since default subcategories always exist and always will be inserted after their categories, we treat them as an update\n // to prevent duplicate inserts.\n // Always present elements (0xe, 0x1, 0x10) also will be updated to prevent duplicate inserts.\n if (\n (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) ||\n this._rootElementIds.has(elementProps.id)\n ) {\n await this.onUpdateElement(elementProps);\n } else {\n if (this._elementsToUpdateDuringPreserveIds.has(elementProps.id)) {\n await this.tryUpdateElement(elementProps);\n this._elementsToUpdateDuringPreserveIds.delete(elementProps.id);\n } else {\n await this.onInsertElement(elementProps);\n }\n }\n } else {\n if (undefined !== elementProps.id) {\n await this.tryUpdateElement(elementProps);\n } else {\n elementProps.id = await this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement\n }\n }\n return elementProps.id;\n }\n\n /** Create a new Element from the specified ElementProps and insert it into the target iModel.\n * @returns The Id of the newly inserted Element.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElement`.\n */\n protected async onInsertElement(\n elementProps: ElementProps\n ): Promise<Id64String> {\n try {\n const elementId = this._editTxn.insertElement(elementProps, {\n forceUseId: this.options.preserveElementIdsForFiltering,\n });\n // set the id like [IModelDb.insertElement]($backend), does, the raw nativeDb method does not\n elementProps.id = elementId;\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatElementForLogger(elementProps)}`\n );\n await this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.simplifyElementGeometry({\n id: elementId,\n convertBReps: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Simplified element geometry for ${this.formatElementForLogger(\n elementProps\n )}`\n );\n }\n return elementId;\n } catch (error) {\n if (!this.targetDb.containsClass(elementProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Element class \"${elementProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Element in the target iModel from the specified ElementProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElement`.\n */\n protected async onUpdateElement(elementProps: ElementProps): Promise<void> {\n if (!elementProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"ElementId not provided\");\n }\n this._editTxn.updateElement(elementProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatElementForLogger(elementProps)}`\n );\n await this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.simplifyElementGeometry({\n id: elementProps.id,\n convertBReps: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Simplified element geometry for ${this.formatElementForLogger(\n elementProps\n )}`\n );\n }\n }\n\n /** Delete the specified Element (and all its children) from the target iModel.\n * Will delete special elements like definition elements and subjects.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElement`.\n */\n protected async onDeleteElement(elementId: Id64String): Promise<void> {\n deleteElementTreeCascade(this._editTxn, elementId);\n Logger.logInfo(\n loggerCategory,\n `Deleted element ${elementId} and its descendants`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Element from the target iModel. */\n public async deleteElement(elementId: Id64String): Promise<void> {\n if (this.doNotUpdateElement(elementId)) {\n Logger.logInfo(\n loggerCategory,\n `Do not delete target element ${elementId}`\n );\n return;\n }\n await this.onDeleteElement(elementId);\n }\n\n /** Delete the specified Model from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteModel`.\n */\n protected async onDeleteModel(modelId: Id64String): Promise<void> {\n this._editTxn.deleteModel(modelId);\n Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);\n await this.trackProgress();\n }\n\n /** Delete the specified Model from the target iModel. */\n public async deleteModel(modelId: Id64String): Promise<void> {\n await this.onDeleteModel(modelId);\n }\n\n /** Format an Element for the Logger. */\n private formatElementForLogger(elementProps: ElementProps): string {\n const namePiece: string = elementProps.code.value\n ? `${elementProps.code.value} `\n : elementProps.userLabel\n ? `${elementProps.userLabel} `\n : \"\";\n return `${elementProps.classFullName} ${namePiece}[${elementProps.id}]`;\n }\n\n /** Import an ElementUniqueAspect into the target iModel. */\n public async importElementUniqueAspect(\n aspectProps: ElementAspectProps\n ): Promise<Id64String> {\n const aspects: ElementAspect[] = this.targetDb.elements.getAspects(\n aspectProps.element.id,\n aspectProps.classFullName\n );\n if (aspects.length === 0) {\n return this.onInsertElementAspect(aspectProps);\n } else if (hasEntityChanged(aspects[0], aspectProps)) {\n aspectProps.id = aspects[0].id;\n await this.onUpdateElementAspect(aspectProps);\n }\n return aspects[0].id;\n }\n\n /** Import the collection of ElementMultiAspects into the target iModel.\n * @param aspectPropsArray The ElementMultiAspects to import\n * @param filterFunc Optional filter func that is used to exclude target ElementMultiAspects that were added during iModel transformation from the update detection logic.\n * @note For insert vs. update reasons, it is important to process all ElementMultiAspects owned by an Element at once since we don't have aspect-specific provenance.\n * @returns the array of ids of the resulting ElementMultiAspects, in the same order of the aspectPropsArray parameter\n */\n public async importElementMultiAspects(\n aspectPropsArray: ElementAspectProps[],\n /** caller must use this to enforce any aspects added by IModelTransformer are not considered for update */\n filterFunc: (a: ElementMultiAspect) => boolean = () => true\n ): Promise<Id64String[]> {\n const result = new Array<Id64String | undefined>(\n aspectPropsArray.length\n ).fill(undefined);\n\n if (aspectPropsArray.length === 0) {\n return result as Id64String[];\n }\n\n const elementId: Id64String = aspectPropsArray[0].element.id;\n // Determine the set of ElementMultiAspect classes to consider\n const aspectClassFullNames = new Set<string>();\n aspectPropsArray.forEach((aspectsProps: ElementAspectProps): void => {\n aspectClassFullNames.add(aspectsProps.classFullName);\n });\n\n // Handle ElementMultiAspects in groups by class\n for (const aspectClassFullName of aspectClassFullNames) {\n const proposedAspects = aspectPropsArray\n .map((props, index) => ({ props, index }))\n .filter(({ props }) => aspectClassFullName === props.classFullName);\n\n const currentAspects = this.targetDb.elements\n .getAspects(elementId, aspectClassFullName)\n .map((props, index) => ({ props, index }) as const)\n .filter(({ props }) => filterFunc(props));\n\n if (proposedAspects.length >= currentAspects.length) {\n for (let index = 0; index < proposedAspects.length; index++) {\n const { props, index: resultIndex } = proposedAspects[index];\n let id: Id64String;\n if (index < currentAspects.length) {\n id = currentAspects[index].props.id;\n props.id = id;\n if (hasEntityChanged(currentAspects[index].props, props)) {\n await this.onUpdateElementAspect(props);\n }\n id = props.id;\n } else {\n id = await this.onInsertElementAspect(props);\n }\n result[resultIndex] = id;\n }\n } else {\n for (let index = 0; index < currentAspects.length; index++) {\n const { props, index: resultIndex } = currentAspects[index];\n let id: Id64String;\n if (index < proposedAspects.length) {\n id = props.id;\n proposedAspects[index].props.id = id;\n if (hasEntityChanged(props, proposedAspects[index].props)) {\n await this.onUpdateElementAspect(proposedAspects[index].props);\n }\n result[resultIndex] = id;\n } else {\n await this.onDeleteElementAspect(props);\n }\n }\n }\n }\n\n assert(result.every((r) => typeof r !== undefined));\n return result as Id64String[];\n }\n\n /** Insert the ElementAspect into the target iModel.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertElementAspect`.\n */\n protected async onInsertElementAspect(\n aspectProps: ElementAspectProps\n ): Promise<Id64String> {\n try {\n const id = this._editTxn.insertAspect(aspectProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatElementAspectForLogger(aspectProps)}`\n );\n await this.trackProgress();\n return id;\n } catch (error) {\n if (!this.targetDb.containsClass(aspectProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `ElementAspect class \"${aspectProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update the ElementAspect within the target iModel.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateElementAspect`.\n */\n protected async onUpdateElementAspect(\n aspectProps: ElementAspectProps\n ): Promise<void> {\n this._editTxn.updateAspect(aspectProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatElementAspectForLogger(aspectProps)}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified ElementAspect from the target iModel.\n * @note A subclass may override this method to customize delete behavior but should call `super.onDeleteElementAspect`.\n */\n protected async onDeleteElementAspect(\n targetElementAspect: ElementAspect\n ): Promise<void> {\n this._editTxn.deleteAspect(targetElementAspect.id);\n Logger.logInfo(\n loggerCategory,\n `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`\n );\n await this.trackProgress();\n }\n\n /** Format an ElementAspect for the Logger. */\n private formatElementAspectForLogger(\n elementAspectProps: ElementAspectProps | ElementAspect\n ): string {\n return `${elementAspectProps.classFullName} elementId=[${elementAspectProps.element.id}]`;\n }\n\n /** Import the specified RelationshipProps (either as an insert or an update) into the target iModel.\n * @returns The instance Id of the inserted or updated Relationship.\n */\n public async importRelationship(\n relationshipProps: RelationshipProps\n ): Promise<Id64String> {\n if (\n undefined === relationshipProps.sourceId ||\n !Id64.isValidId64(relationshipProps.sourceId)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.sourceId`\n );\n return Id64.invalid;\n }\n if (\n undefined === relationshipProps.targetId ||\n !Id64.isValidId64(relationshipProps.targetId)\n ) {\n Logger.logInfo(\n loggerCategory,\n `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.targetId`\n );\n return Id64.invalid;\n }\n // check for an existing relationship\n const relSourceAndTarget: SourceAndTarget = {\n sourceId: relationshipProps.sourceId,\n targetId: relationshipProps.targetId,\n };\n const relationship: Relationship | undefined =\n this.targetDb.relationships.tryGetInstance(\n relationshipProps.classFullName,\n relSourceAndTarget\n );\n if (undefined !== relationship) {\n // if relationship found, update it\n relationshipProps.id = relationship.id;\n if (hasEntityChanged(relationship, relationshipProps)) {\n await this.onUpdateRelationship(relationshipProps);\n }\n return relationshipProps.id;\n } else {\n return this.onInsertRelationship(relationshipProps);\n }\n }\n\n /** Create a new Relationship from the specified RelationshipProps and insert it into the target iModel.\n * @returns The instance Id of the newly inserted relationship.\n * @note A subclass may override this method to customize insert behavior but should call `super.onInsertRelationship`.\n */\n protected async onInsertRelationship(\n relationshipProps: RelationshipProps\n ): Promise<Id64String> {\n try {\n const targetRelInstanceId: Id64String =\n this._editTxn.insertRelationship(relationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`\n );\n await this.trackProgress();\n return targetRelInstanceId;\n } catch (error) {\n if (!this.targetDb.containsClass(relationshipProps.classFullName)) {\n // replace standard insert error with something more helpful\n const errorMessage = `Relationship class \"${relationshipProps.classFullName}\" not found in the target iModel. Was the latest version of the schema imported?`;\n throw new IModelError(IModelStatus.InvalidName, errorMessage);\n }\n throw error; // throw original error\n }\n }\n\n /** Update an existing Relationship in the target iModel from the specified RelationshipProps.\n * @note A subclass may override this method to customize update behavior but should call `super.onUpdateRelationship`.\n */\n protected async onUpdateRelationship(\n relationshipProps: RelationshipProps\n ): Promise<void> {\n if (!relationshipProps.id) {\n throw new IModelError(\n IModelStatus.InvalidId,\n \"Relationship instance Id not provided\"\n );\n }\n this._editTxn.updateRelationship(relationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Updated ${this.formatRelationshipForLogger(relationshipProps)}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n protected async onDeleteRelationship(\n relationshipProps: RelationshipPropsForDelete\n ): Promise<void> {\n // Only passing in what deleteInstance actually uses, full relationshipProps is not necessary.\n this._editTxn.deleteRelationship({\n id: relationshipProps.id,\n classFullName: relationshipProps.classFullName,\n } as RelationshipProps);\n Logger.logInfo(\n loggerCategory,\n `Deleted relationship ${relationshipProps.classFullName} id=${relationshipProps.id}`\n );\n await this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n public async deleteRelationship(\n relationshipProps: RelationshipPropsForDelete\n ): Promise<void> {\n await this.onDeleteRelationship(relationshipProps);\n }\n\n /** Format a Relationship for the Logger. */\n private formatRelationshipForLogger(relProps: RelationshipProps): string {\n return `${relProps.classFullName} sourceId=[${relProps.sourceId}] targetId=[${relProps.targetId}]`;\n }\n\n /** Tracks incremental progress */\n private async trackProgress(): Promise<void> {\n this._progressCounter++;\n if (0 === this._progressCounter % this.progressInterval) {\n await this.onProgress();\n }\n }\n\n /** This method is called when IModelImporter has made incremental progress based on the [[progressInterval]] setting.\n * @note A subclass may override this method to report custom progress but should call `super.onProgress`.\n */\n protected async onProgress(): Promise<void> {}\n\n /** Optionally compute the projectExtents for the target iModel depending on the options for this IModelImporter.\n * @note This method is automatically called from [IModelTransformer.process]($transformer).\n * @see [IModelDb.computeProjectExtents]($backend), [[autoExtendProjectExtents]]\n */\n public computeProjectExtents(): void {\n const computedProjectExtents = this.targetDb.computeProjectExtents({\n reportExtentsWithOutliers: true,\n reportOutliers: true,\n });\n Logger.logInfo(\n loggerCategory,\n `Current projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`\n );\n Logger.logInfo(\n loggerCategory,\n `Computed projectExtents without outliers=${JSON.stringify(\n computedProjectExtents.extents\n )}`\n );\n Logger.logInfo(\n loggerCategory,\n `Computed projectExtents with outliers=${JSON.stringify(\n computedProjectExtents.extentsWithOutliers\n )}`\n );\n if (this.options.autoExtendProjectExtents) {\n const excludeOutliers: boolean =\n typeof this.options.autoExtendProjectExtents === \"object\"\n ? this.options.autoExtendProjectExtents.excludeOutliers\n : false;\n // If excludeOutliers is true, use the extents without outliers.\n // Otherwise prefer extentsWithOutliers, but fall back to extents if it's undefined or a null range.\n const extentsWithOutliers = computedProjectExtents.extentsWithOutliers;\n const useExtentsWithOutliers =\n !excludeOutliers && extentsWithOutliers && !extentsWithOutliers.isNull;\n const newProjectExtents = useExtentsWithOutliers\n ? extentsWithOutliers\n : computedProjectExtents.extents;\n if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {\n this._editTxn.updateProjectExtents(newProjectExtents);\n Logger.logInfo(\n loggerCategory,\n `Updated projectExtents=${JSON.stringify(\n this.targetDb.projectExtents\n )}`\n );\n }\n if (\n !excludeOutliers &&\n computedProjectExtents.outliers &&\n computedProjectExtents.outliers.length > 0\n ) {\n Logger.logInfo(\n loggerCategory,\n `${computedProjectExtents.outliers.length} outliers detected within projectExtents`\n );\n }\n } else {\n if (\n !this.targetDb.projectExtents.containsRange(\n computedProjectExtents.extents\n )\n ) {\n Logger.logWarning(\n loggerCategory,\n \"Current project extents may be too small\"\n );\n }\n if (\n computedProjectExtents.outliers &&\n computedProjectExtents.outliers.length > 0\n ) {\n Logger.logInfo(\n loggerCategory,\n `${computedProjectExtents.outliers.length} outliers detected within projectExtents`\n );\n }\n }\n }\n\n /** Examine the geometry streams of every [GeometricElement3d]($backend) in the target iModel and apply the specified optimizations.\n * @note This method is automatically called from [[IModelTransformer.process]] if\n * [[IModelTransformOptions.optimizeGeometry]] is defined.\n */\n public optimizeGeometry(options: OptimizeGeometryOptions): void {\n if (options.inlineUniqueGeometryParts) {\n const result = this.targetDb.inlineGeometryParts();\n Logger.logInfo(\n loggerCategory,\n `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.`\n );\n }\n }\n\n private resolveDuplicateCodeValues(): void {\n for (const [elementId, codeValue] of this._duplicateCodeValueMap) {\n const element = this.targetDb.elements.getElement(elementId);\n element.code.value = codeValue;\n this._editTxn.updateElement(element.toJSON());\n }\n this._duplicateCodeValueMap.clear();\n }\n\n /**\n * Needs to be called to perform necessary cleanup operations.\n * By not calling `finalize` there is a risk that data imported into targetDb will not be as expected.\n *\n * @note No need to call this If using [[IModelTransformer]] as it automatically invokes this method.\n */\n public finalize(): void {\n this.resolveDuplicateCodeValues();\n }\n}\n\n/** Returns true if a change within an Entity is detected.\n * @param entity The current persistent Entity.\n * @param entityProps The new EntityProps to compare against\n * @note This method should only be called if changeset information is not available.\n * @internal\n */\nexport function hasEntityChanged(\n entity: Entity,\n entityProps: EntityProps,\n namesToIgnore?: Set<string>\n): boolean {\n let changed: boolean = false;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n entity.forEach((propertyName: string, property: Property) => {\n if (!changed) {\n if (namesToIgnore && namesToIgnore.has(propertyName)) {\n // skip\n } else if (PropertyType.Binary === property.propertyType) {\n changed = hasBinaryValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n } else if (property.isNavigation()) {\n changed = hasNavigationValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n } else {\n changed = hasValueChanged(\n entity.asAny[ECJsNames.toJsName(propertyName)],\n (entityProps as any)[ECJsNames.toJsName(propertyName)]\n );\n }\n }\n });\n return changed;\n}\n\n/** Returns true if the specified binary values are different. */\nfunction hasBinaryValueChanged(\n binaryProperty1: any,\n binaryProperty2: any\n): boolean {\n const jsonString1 = JSON.stringify(\n binaryProperty1,\n Base64EncodedString.replacer\n );\n const jsonString2 = JSON.stringify(\n binaryProperty2,\n Base64EncodedString.replacer\n );\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasNavigationValueChanged(\n navigationProperty1: any,\n navigationProperty2: any\n): boolean {\n const relatedElement1 = RelatedElement.fromJSON(navigationProperty1);\n const relatedElement2 = RelatedElement.fromJSON(navigationProperty2);\n const jsonString1 = JSON.stringify(relatedElement1);\n const jsonString2 = JSON.stringify(relatedElement2);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasValueChanged(property1: any, property2: any): boolean {\n return JSON.stringify(property1) !== JSON.stringify(property2);\n}\n\n/** check if element props are a subcategory */\nfunction isSubCategory(props: ElementProps): props is SubCategoryProps {\n return props.classFullName === SubCategory.classFullName;\n}\n\n/** check if element props are a subcategory without loading the element */\nfunction isDefaultSubCategory(props: SubCategoryProps): boolean {\n if (props.id === undefined) return false;\n\n if (!Id64.isId64(props.id))\n throw new IModelError(\n IModelStatus.BadElement,\n \"subcategory had invalid id\"\n );\n if (props.parent?.id === undefined)\n throw new IModelError(\n IModelStatus.BadElement,\n `subcategory with id ${props.id} had no parent`\n );\n return props.id === IModelDb.getDefaultSubCategoryId(props.parent.id);\n}\n"]}
@@ -1,12 +1,21 @@
1
1
  import { Id64Array, Id64Set, Id64String } from "@itwin/core-bentley";
2
2
  import * as ECSchemaMetaData from "@itwin/ecschema-metadata";
3
3
  import { Transform } from "@itwin/core-geometry";
4
- import { Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, Entity, ExternalSourceAspect, IModelDb, Model, Relationship, RelationshipProps } from "@itwin/core-backend";
4
+ import { EditTxn, Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, Entity, ExternalSourceAspect, IModelDb, Model, Relationship, RelationshipProps } from "@itwin/core-backend";
5
5
  import { ChangesetIndexAndId, CodeSpec, ElementAspectProps, ElementProps, ExternalSourceAspectProps, FontProps, Helmert2DWithZOffset, ModelProps, Placement2d, Placement3d } from "@itwin/core-common";
6
6
  import { ChangedInstanceIds, ExportChangesOptions, ExportSchemaResult, IModelExporter, IModelExportHandler } from "./IModelExporter";
7
7
  import { IModelImporter, OptimizeGeometryOptions } from "./IModelImporter";
8
8
  import { IModelCloneContext } from "./IModelCloneContext";
9
9
  import { ProvenanceManager } from "./ProvenanceManager";
10
+ /** Required arguments for the [[IModelTransformer]] constructor.
11
+ * @beta
12
+ */
13
+ export interface IModelTransformArgs {
14
+ /** The source iModel or exporter to read elements from. */
15
+ source: IModelDb | IModelExporter;
16
+ /** The target for the transformation. Pass an [[EditTxn]] to have the transformer create a default [[IModelImporter]], or pass a pre-configured [[IModelImporter]]. */
17
+ target: EditTxn | IModelImporter;
18
+ }
10
19
  /** Options provided to the [[IModelTransformer]] constructor.
11
20
  * @beta
12
21
  * @note if adding an option, you must explicitly add its serialization to [[IModelTransformer.saveStateToFile]]!
@@ -123,6 +132,13 @@ export interface IModelTransformOptions {
123
132
  * @default false
124
133
  */
125
134
  tryAlignGeolocation?: boolean;
135
+ /** An optional [[EditTxn]] for write operations on the **source** iModel.
136
+ * Only needed for reverse synchronization workflows where provenance must be written back to the source.
137
+ * If not provided, the source iModel is treated as read-only.
138
+ * Must be started before calling [[IModelTransformer.process]].
139
+ * @beta
140
+ */
141
+ sourceEditTxn?: EditTxn;
126
142
  }
127
143
  /**
128
144
  * Data type for persisting change version information within provenance Scope ExternalSourceAspect.
@@ -165,7 +181,7 @@ export interface InitOptions {
165
181
  * @beta
166
182
  */
167
183
  export type ProcessChangesOptions = ExportChangesOptions & {
168
- /** how to call saveChanges on the target. Must call targetDb.saveChanges, should not edit the iModel */
184
+ /** how to save changes on the target. Must call `editTxn.saveChanges()` on the target EditTxn, should not edit the iModel */
169
185
  saveTargetChanges?: (transformer: IModelTransformer) => Promise<void>;
170
186
  /**
171
187
  * The forward sync 'version' to set on the scoping ESA @see ExternalSourceAspectProps upon startup, if the version property on the scoping ESA is undefined or empty string.
@@ -222,6 +238,15 @@ export declare class IModelTransformer extends IModelExportHandler {
222
238
  * @beta
223
239
  */
224
240
  private _linearSpatialTransform?;
241
+ /** The [[EditTxn]] used for write operations on the target iModel.
242
+ * The caller is responsible for starting, committing or abandoning this transaction.
243
+ * @beta
244
+ */
245
+ protected readonly _targetEditTxn: EditTxn;
246
+ /** The optional [[EditTxn]] used for write operations on the source iModel during reverse synchronization.
247
+ * @beta
248
+ */
249
+ protected readonly _sourceEditTxn?: EditTxn;
225
250
  private _syncTypeResolver;
226
251
  protected _provenanceManager: ProvenanceManager;
227
252
  /** The Id of the Element in the **target** iModel that represents the **source** repository as a whole and scopes its [ExternalSourceAspect]($backend) instances. */
@@ -256,11 +281,10 @@ export declare class IModelTransformer extends IModelExportHandler {
256
281
  /** The element aspect classes that are considered to define provenance in the iModel */
257
282
  static get provenanceElementAspectClasses(): (typeof Entity)[];
258
283
  /** Construct a new IModelTransformer
259
- * @param source Specifies the source IModelExporter or the source IModelDb that will be used to construct the source IModelExporter.
260
- * @param target Specifies the target IModelImporter or the target IModelDb that will be used to construct the target IModelImporter.
284
+ * @param args The required arguments including source and target.
261
285
  * @param options The options that specify how the transformation should be done.
262
286
  */
263
- constructor(source: IModelDb | IModelExporter, target: IModelDb | IModelImporter, options?: IModelTransformOptions);
287
+ constructor(args: IModelTransformArgs, options?: IModelTransformOptions);
264
288
  /** validates that the importer set on the transformer has the same values for its shared options as the transformer.
265
289
  * @note This expects that the importer is already set on the transformer.
266
290
  */
@@ -530,6 +554,8 @@ export declare class IModelTransformer extends IModelExportHandler {
530
554
  */
531
555
  private processDeletedOp;
532
556
  private _tryInitChangesetData;
557
+ /** Asserts that the EditTxn is active before any write operations. */
558
+ private assertEditTxnActive;
533
559
  /**
534
560
  * The behavior of process is influenced by [[IModelTransformOptions.argsForProcessChanges]] being defined or not defined during construction passed of the IModelTransformer.
535
561
  * @section When argsForProcessChanges are defined:
@@ -588,12 +614,10 @@ export declare class TemplateModelCloner extends IModelTransformer {
588
614
  /** Accumulates the mapping of sourceElementIds to targetElementIds from the elements in the template model that were cloned. */
589
615
  private _sourceIdToTargetIdMap?;
590
616
  /** Construct a new TemplateModelCloner
591
- * @param sourceDb The source IModelDb that contains the templates to clone
592
- * @param targetDb Optionally specify the target IModelDb where the cloned template will be inserted.
593
- * Typically this is left unspecified, and the default is to use the sourceDb as the target
617
+ * @param editTxn The [[EditTxn]] to use for all read and write operations. The source and target db are both derived from `editTxn.iModel`. Must be started before constructing.
594
618
  * @note The expectation is that the template definitions are within the same iModel where instances will be placed.
595
619
  */
596
- constructor(sourceDb: IModelDb, targetDb?: IModelDb);
620
+ constructor(editTxn: EditTxn);
597
621
  /** Place a template from the sourceDb at the specified placement in the target model within the targetDb.
598
622
  * @param sourceTemplateModelId The Id of the template model in the sourceDb
599
623
  * @param targetModelId The Id of the target model (must be a subclass of GeometricModel3d) where the cloned component will be inserted.