@itwin/imodel-transformer 0.4.18-fedguidopt.3 → 0.4.18-fedguidopt.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BranchProvenanceInitializer.d.ts","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6D,QAAQ,EAAgC,MAAM,qBAAqB,CAAC;AACxI,OAAO,EAAY,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AAK7E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;;;;OAOG;IACH,uBAAuB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,kBAAkB,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,UAAU,CAAC;IACjC,sBAAsB,EAAE,UAAU,CAAC;IACnC,sBAAsB,EAAE,UAAU,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyHxG"}
1
+ {"version":3,"file":"BranchProvenanceInitializer.d.ts","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6D,QAAQ,EAAgC,MAAM,qBAAqB,CAAC;AACxI,OAAO,EAAY,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AAK7E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;;;;OAOG;IACH,uBAAuB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,kBAAkB,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,UAAU,CAAC;IACjC,sBAAsB,EAAE,UAAU,CAAC;IACnC,sBAAsB,EAAE,UAAU,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6HxG"}
@@ -6,6 +6,7 @@ const core_bentley_1 = require("@itwin/core-bentley");
6
6
  const core_common_1 = require("@itwin/core-common");
7
7
  const assert = require("assert");
8
8
  const IModelTransformer_1 = require("./IModelTransformer");
9
+ const url_1 = require("url");
9
10
  /**
10
11
  * @alpha
11
12
  */
@@ -16,18 +17,24 @@ async function initializeBranchProvenance(args) {
16
17
  SET FederationGuid=randomblob(16)
17
18
  WHERE FederationGuid IS NULL
18
19
  AND Id NOT IN (0x1, 0xe, 0x10) -- ignore special elems
19
- `, (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE));
20
+ `,
21
+ // eslint-disable-next-line @itwin/no-internal
22
+ (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()));
20
23
  const masterPath = args.master.pathName;
21
24
  const reopenMaster = makeDbReopener(args.master);
22
25
  args.master.close(); // prevent busy
23
- args.branch.withSqliteStatement(`ATTACH DATABASE 'file://${masterPath}?mode=ro' AS master`, (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE));
26
+ args.branch.withSqliteStatement(`ATTACH DATABASE '${(0, url_1.pathToFileURL)(`${masterPath}`)}?mode=ro' AS master`,
27
+ // eslint-disable-next-line @itwin/no-internal
28
+ (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()));
24
29
  args.branch.withSqliteStatement(`
25
30
  UPDATE main.bis_Element
26
31
  SET FederationGuid = (
27
32
  SELECT m.FederationGuid
28
33
  FROM master.bis_Element m
29
34
  WHERE m.Id=main.bis_Element.Id
30
- )`, (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE));
35
+ )`,
36
+ // eslint-disable-next-line @itwin/no-internal
37
+ (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()));
31
38
  args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)
32
39
  args.branch.saveChanges();
33
40
  args.branch.withSqliteStatement(`DETACH DATABASE master`, (s) => {
@@ -35,7 +42,8 @@ async function initializeBranchProvenance(args) {
35
42
  if (res !== core_bentley_1.DbResult.BE_SQLITE_DONE)
36
43
  core_bentley_1.Logger.logTrace("initializeBranchProvenance", `Error detaching db (we will close anyway): ${args.branch.nativeDb.getLastError()}`);
37
44
  // this is the case until native side changes
38
- assert(res === core_bentley_1.DbResult.BE_SQLITE_ERROR);
45
+ // eslint-disable-next-line @itwin/no-internal
46
+ assert(res === core_bentley_1.DbResult.BE_SQLITE_ERROR, args.branch.nativeDb.getLastError());
39
47
  });
40
48
  args.branch.performCheckpoint();
41
49
  const reopenBranch = makeDbReopener(args.branch);
@@ -1 +1 @@
1
- {"version":3,"file":"BranchProvenanceInitializer.js","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { BriefcaseDb, ExternalSource, ExternalSourceIsInRepository, IModelDb, RepositoryLink, StandaloneDb } from \"@itwin/core-backend\";\nimport { DbResult, Id64String, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport { Code, ExternalSourceProps, RepositoryLinkProps } from \"@itwin/core-common\";\nimport assert = require(\"assert\");\nimport { IModelTransformer } from \"./IModelTransformer\";\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitArgs {\n /** the master iModel which is the source of the provenance */\n master: IModelDb;\n /** the canonical url of the master iModel */\n masterUrl?: string;\n /** the description of the master iModel */\n masterDescription?: string;\n /**\n * @param {IModelDb} branchDb - the branch iModel which is the container of the provenance\n * Must be opened Read/Write\n */\n branch: IModelDb;\n /**\n * insert Federation Guids in all lacking elements in the master database, which will prevent\n * needing to insert External Source Aspects for provenance tracking\n * @note requires a read/write master\n * @note closes both the master and branch iModels to reset caches, so you must reopen them.\n * If you pass `\"keep-reopened-db\"`, this object's `master` and `branch` properties will\n * be set to new, open databases.\n */\n createFedGuidsForMaster?: true | false | \"keep-reopened-db\";\n}\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitResult {\n targetScopeElementId: Id64String;\n masterExternalSourceId: Id64String;\n masterRepositoryLinkId: Id64String;\n}\n\n/**\n * @alpha\n */\nexport async function initializeBranchProvenance(args: ProvenanceInitArgs): Promise<ProvenanceInitResult> {\n if (args.createFedGuidsForMaster) {\n args.master.withSqliteStatement(`\n UPDATE bis_Element\n SET FederationGuid=randomblob(16)\n WHERE FederationGuid IS NULL\n AND Id NOT IN (0x1, 0xe, 0x10) -- ignore special elems\n `,\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE),\n );\n const masterPath = args.master.pathName;\n const reopenMaster = makeDbReopener(args.master);\n args.master.close(); // prevent busy\n args.branch.withSqliteStatement(\n `ATTACH DATABASE 'file://${masterPath}?mode=ro' AS master`,\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE),\n );\n args.branch.withSqliteStatement(`\n UPDATE main.bis_Element\n SET FederationGuid = (\n SELECT m.FederationGuid\n FROM master.bis_Element m\n WHERE m.Id=main.bis_Element.Id\n )`,\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE)\n );\n args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)\n args.branch.saveChanges();\n args.branch.withSqliteStatement(\n `DETACH DATABASE master`,\n (s) => {\n const res = s.step();\n if (res !== DbResult.BE_SQLITE_DONE)\n Logger.logTrace(\n \"initializeBranchProvenance\",\n `Error detaching db (we will close anyway): ${args.branch.nativeDb.getLastError()}`\n );\n // this is the case until native side changes\n assert(res === DbResult.BE_SQLITE_ERROR);\n }\n );\n args.branch.performCheckpoint();\n\n const reopenBranch = makeDbReopener(args.branch);\n // close dbs because element cache could be invalid\n args.branch.close();\n [args.master, args.branch] = await Promise.all([reopenMaster(), reopenBranch()]);\n }\n\n // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations\n const masterRepoLinkId = args.branch.elements.insertElement({\n classFullName: RepositoryLink.classFullName,\n code: RepositoryLink.createCode(args.branch, IModelDb.repositoryModelId, \"example-code-value\"),\n model: IModelDb.repositoryModelId,\n url: args.masterUrl,\n format: \"iModel\",\n repositoryGuid: args.master.iModelId,\n description: args.masterDescription,\n } as RepositoryLinkProps);\n\n const masterExternalSourceId = args.branch.elements.insertElement({\n classFullName: ExternalSource.classFullName,\n model: IModelDb.rootSubjectId,\n code: Code.createEmpty(),\n repository: new ExternalSourceIsInRepository(masterRepoLinkId),\n /* eslint-disable @typescript-eslint/no-var-requires */\n connectorName: require(\"../../package.json\").name,\n connectorVersion: require(\"../../package.json\").version,\n /* eslint-enable @typescript-eslint/no-var-requires */\n } as ExternalSourceProps);\n\n const fedGuidLessElemsSql = `\n SELECT ECInstanceId AS id\n FROM Bis.Element\n WHERE FederationGuid IS NULL\n AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */\n `;\n const elemReader = args.branch.createQueryReader(fedGuidLessElemsSql, undefined, { usePrimaryConn: true });\n while (await elemReader.step()) {\n const id: string = elemReader.current.toRow().id;\n const aspectProps = IModelTransformer.initElementProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n });\n args.branch.elements.insertAspect(aspectProps);\n }\n\n const fedGuidLessRelsSql = `\n SELECT erte.ECInstanceId as id\n FROM Bis.ElementRefersToElements erte\n JOIN bis.Element se\n ON se.ECInstanceId=erte.SourceECInstanceId\n JOIN bis.Element te\n ON te.ECInstanceId=erte.TargetECInstanceId\n WHERE se.FederationGuid IS NULL\n OR te.FederationGuid IS NULL`;\n const relReader = args.branch.createQueryReader(fedGuidLessRelsSql, undefined, { usePrimaryConn: true });\n while (await relReader.step()) {\n const id: string = relReader.current.toRow().id;\n const aspectProps = IModelTransformer.initRelationshipProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n forceOldRelationshipProvenanceMethod: false,\n });\n args.branch.elements.insertAspect(aspectProps);\n }\n\n if (args.createFedGuidsForMaster === true) {\n args.master.close();\n args.branch.close();\n }\n\n return {\n targetScopeElementId: masterExternalSourceId,\n masterExternalSourceId,\n masterRepositoryLinkId: masterRepoLinkId,\n };\n}\n\nfunction makeDbReopener(db: IModelDb) {\n const originalMode = db.isReadonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const dbPath = db.pathName;\n let reopenDb: (mode?: OpenMode) => IModelDb | Promise<IModelDb>;\n if (db instanceof BriefcaseDb)\n reopenDb = async (mode = originalMode) => BriefcaseDb.open({ fileName: dbPath, readonly: mode === OpenMode.Readonly });\n else if (db instanceof StandaloneDb)\n reopenDb = (mode = originalMode) => StandaloneDb.openFile(dbPath, mode);\n else\n assert(false, `db type '${db.constructor.name}' not supported`);\n return reopenDb;\n}\n\n"]}
1
+ {"version":3,"file":"BranchProvenanceInitializer.js","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"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","sourcesContent":["import { BriefcaseDb, ExternalSource, ExternalSourceIsInRepository, IModelDb, RepositoryLink, StandaloneDb } from \"@itwin/core-backend\";\nimport { DbResult, Id64String, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport { Code, ExternalSourceProps, RepositoryLinkProps } from \"@itwin/core-common\";\nimport * as assert from \"assert\";\nimport { IModelTransformer } from \"./IModelTransformer\";\nimport { pathToFileURL } from \"url\";\n/**\n * @alpha\n */\nexport interface ProvenanceInitArgs {\n /** the master iModel which is the source of the provenance */\n master: IModelDb;\n /** the canonical url of the master iModel */\n masterUrl?: string;\n /** the description of the master iModel */\n masterDescription?: string;\n /**\n * @param {IModelDb} branchDb - the branch iModel which is the container of the provenance\n * Must be opened Read/Write\n */\n branch: IModelDb;\n /**\n * insert Federation Guids in all lacking elements in the master database, which will prevent\n * needing to insert External Source Aspects for provenance tracking\n * @note requires a read/write master\n * @note closes both the master and branch iModels to reset caches, so you must reopen them.\n * If you pass `\"keep-reopened-db\"`, this object's `master` and `branch` properties will\n * be set to new, open databases.\n */\n createFedGuidsForMaster?: true | false | \"keep-reopened-db\";\n}\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitResult {\n targetScopeElementId: Id64String;\n masterExternalSourceId: Id64String;\n masterRepositoryLinkId: Id64String;\n}\n\n/**\n * @alpha\n */\nexport async function initializeBranchProvenance(args: ProvenanceInitArgs): Promise<ProvenanceInitResult> {\n if (args.createFedGuidsForMaster) {\n args.master.withSqliteStatement(`\n UPDATE bis_Element\n SET FederationGuid=randomblob(16)\n WHERE FederationGuid IS NULL\n AND Id NOT IN (0x1, 0xe, 0x10) -- ignore special elems\n `,\n // eslint-disable-next-line @itwin/no-internal\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()),\n );\n const masterPath = args.master.pathName;\n const reopenMaster = makeDbReopener(args.master);\n args.master.close(); // prevent busy\n args.branch.withSqliteStatement(\n `ATTACH DATABASE '${pathToFileURL(`${masterPath}`)}?mode=ro' AS master`,\n // eslint-disable-next-line @itwin/no-internal\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()),\n );\n args.branch.withSqliteStatement(`\n UPDATE main.bis_Element\n SET FederationGuid = (\n SELECT m.FederationGuid\n FROM master.bis_Element m\n WHERE m.Id=main.bis_Element.Id\n )`,\n // eslint-disable-next-line @itwin/no-internal\n (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.nativeDb.getLastError()),\n );\n args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)\n args.branch.saveChanges();\n args.branch.withSqliteStatement(\n `DETACH DATABASE master`,\n (s) => {\n const res = s.step();\n if (res !== DbResult.BE_SQLITE_DONE)\n Logger.logTrace(\n \"initializeBranchProvenance\",\n `Error detaching db (we will close anyway): ${args.branch.nativeDb.getLastError()}`\n );\n // this is the case until native side changes\n // eslint-disable-next-line @itwin/no-internal\n assert(res === DbResult.BE_SQLITE_ERROR, args.branch.nativeDb.getLastError());\n }\n );\n args.branch.performCheckpoint();\n\n const reopenBranch = makeDbReopener(args.branch);\n // close dbs because element cache could be invalid\n args.branch.close();\n [args.master, args.branch] = await Promise.all([reopenMaster(), reopenBranch()]);\n }\n\n // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations\n const masterRepoLinkId = args.branch.elements.insertElement({\n classFullName: RepositoryLink.classFullName,\n code: RepositoryLink.createCode(args.branch, IModelDb.repositoryModelId, \"example-code-value\"),\n model: IModelDb.repositoryModelId,\n url: args.masterUrl,\n format: \"iModel\",\n repositoryGuid: args.master.iModelId,\n description: args.masterDescription,\n } as RepositoryLinkProps);\n\n const masterExternalSourceId = args.branch.elements.insertElement({\n classFullName: ExternalSource.classFullName,\n model: IModelDb.rootSubjectId,\n code: Code.createEmpty(),\n repository: new ExternalSourceIsInRepository(masterRepoLinkId),\n /* eslint-disable @typescript-eslint/no-var-requires */\n connectorName: require(\"../../package.json\").name,\n connectorVersion: require(\"../../package.json\").version,\n /* eslint-enable @typescript-eslint/no-var-requires */\n } as ExternalSourceProps);\n\n const fedGuidLessElemsSql = `\n SELECT ECInstanceId AS id\n FROM Bis.Element\n WHERE FederationGuid IS NULL\n AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */\n `;\n const elemReader = args.branch.createQueryReader(fedGuidLessElemsSql, undefined, { usePrimaryConn: true });\n while (await elemReader.step()) {\n const id: string = elemReader.current.toRow().id;\n const aspectProps = IModelTransformer.initElementProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n });\n args.branch.elements.insertAspect(aspectProps);\n }\n\n const fedGuidLessRelsSql = `\n SELECT erte.ECInstanceId as id\n FROM Bis.ElementRefersToElements erte\n JOIN bis.Element se\n ON se.ECInstanceId=erte.SourceECInstanceId\n JOIN bis.Element te\n ON te.ECInstanceId=erte.TargetECInstanceId\n WHERE se.FederationGuid IS NULL\n OR te.FederationGuid IS NULL`;\n const relReader = args.branch.createQueryReader(fedGuidLessRelsSql, undefined, { usePrimaryConn: true });\n while (await relReader.step()) {\n const id: string = relReader.current.toRow().id;\n const aspectProps = IModelTransformer.initRelationshipProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n forceOldRelationshipProvenanceMethod: false,\n });\n args.branch.elements.insertAspect(aspectProps);\n }\n\n if (args.createFedGuidsForMaster === true) {\n args.master.close();\n args.branch.close();\n }\n\n return {\n targetScopeElementId: masterExternalSourceId,\n masterExternalSourceId,\n masterRepositoryLinkId: masterRepoLinkId,\n };\n}\n\nfunction makeDbReopener(db: IModelDb) {\n const originalMode = db.isReadonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const dbPath = db.pathName;\n let reopenDb: (mode?: OpenMode) => IModelDb | Promise<IModelDb>;\n if (db instanceof BriefcaseDb)\n reopenDb = async (mode = originalMode) => BriefcaseDb.open({ fileName: dbPath, readonly: mode === OpenMode.Readonly });\n else if (db instanceof StandaloneDb)\n reopenDb = (mode = originalMode) => StandaloneDb.openFile(dbPath, mode);\n else\n assert(false, `db type '${db.constructor.name}' not supported`);\n return reopenDb;\n}\n\n"]}
@@ -66,6 +66,14 @@ export declare class IModelImporter implements Required<IModelImportOptions> {
66
66
  get simplifyElementGeometry(): boolean;
67
67
  set simplifyElementGeometry(val: boolean);
68
68
  private static _realityDataSourceLinkPartitionStaticId;
69
+ /**
70
+ * A map of conflicting element code values.
71
+ * 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.
72
+ * The actual codeValue will be stored in this ElementId->CodeValue map.
73
+ * 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.
74
+ * To resolve code values to their intended values call [[IModelImporter.resolveDuplicateCodeValues]].
75
+ */
76
+ private _duplicateCodeValueMap;
69
77
  /** The set of elements that should not be updated by this IModelImporter.
70
78
  * Defaults to the elements that are always present (even in an "empty" iModel) and therefore do not need to be updated
71
79
  * @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.
@@ -204,6 +212,14 @@ export declare class IModelImporter implements Required<IModelImportOptions> {
204
212
  * You can add custom json to the importer save state for custom importers by overriding [[IModelImporter.getAdditionalStateJson]]
205
213
  */
206
214
  saveStateToJson(): IModelImporterState;
215
+ private resolveDuplicateCodeValues;
216
+ /**
217
+ * Needs to be called to perform necessary cleanup operations.
218
+ * By not calling `finalize` there is a risk that data imported into targetDb will not be as expected.
219
+ *
220
+ * @note No need to call this If using [[IModelTransformer]] as it automatically invokes this method.
221
+ */
222
+ finalize(): void;
207
223
  }
208
224
  /**
209
225
  * The JSON format of a serialized IModelimporter instance
@@ -218,6 +234,7 @@ export interface IModelImporterState {
218
234
  options: IModelImportOptions;
219
235
  targetDbId: string;
220
236
  doNotUpdateElementIds: CompressedId64Set;
237
+ duplicateCodeValueMap: Record<Id64String, string>;
221
238
  additionalState?: any;
222
239
  }
223
240
  /** Returns true if a change within an Entity is detected.
@@ -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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"}
@@ -82,6 +82,7 @@ class IModelImporter {
82
82
  preserveElementIdsForFiltering: options?.preserveElementIdsForFiltering ?? false,
83
83
  simplifyElementGeometry: options?.simplifyElementGeometry ?? false,
84
84
  };
85
+ this._duplicateCodeValueMap = new Map();
85
86
  }
86
87
  /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */
87
88
  importModel(modelProps) {
@@ -160,7 +161,21 @@ class IModelImporter {
160
161
  }
161
162
  else {
162
163
  if (undefined !== elementProps.id) {
163
- this.onUpdateElement(elementProps);
164
+ try {
165
+ this.onUpdateElement(elementProps);
166
+ }
167
+ catch (err) {
168
+ if (err.errorNumber === core_bentley_1.IModelStatus.DuplicateCode) {
169
+ assert(elementProps.code.value !== undefined, "NULL code values are always considered unique and cannot clash");
170
+ this._duplicateCodeValueMap.set(elementProps.id, elementProps.code.value);
171
+ // Using NULL code values as an alternative is not valid because definition elements cannot have NULL code values.
172
+ elementProps.code.value = core_bentley_1.Guid.createValue();
173
+ this.onUpdateElement(elementProps);
174
+ }
175
+ else {
176
+ throw err;
177
+ }
178
+ }
164
179
  }
165
180
  else {
166
181
  this.onInsertElement(elementProps); // targetElementProps.id assigned by insertElement
@@ -418,6 +433,7 @@ class IModelImporter {
418
433
  }
419
434
  /** Delete the specified Relationship from the target iModel. */
420
435
  onDeleteRelationship(relationshipProps) {
436
+ // FIXME: pass only what the implementation of deleteInstance actually needs, e.g. { id: 5 } as RelationshipProps
421
437
  this.targetDb.relationships.deleteInstance(relationshipProps);
422
438
  core_bentley_1.Logger.logInfo(loggerCategory, `Deleted relationship ${this.formatRelationshipForLogger(relationshipProps)}`);
423
439
  this.trackProgress();
@@ -508,6 +524,7 @@ class IModelImporter {
508
524
  // TODO: fix upstream, looks like a bad case for the linter rule when casting away readonly for this generic
509
525
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
510
526
  this.doNotUpdateElementIds = core_bentley_1.CompressedId64Set.decompressSet(state.doNotUpdateElementIds);
527
+ this._duplicateCodeValueMap = new Map(Object.entries(state.duplicateCodeValueMap));
511
528
  this.loadAdditionalStateJson(state.additionalState);
512
529
  }
513
530
  /**
@@ -522,9 +539,27 @@ class IModelImporter {
522
539
  options: this.options,
523
540
  targetDbId: this.targetDb.iModelId || this.targetDb.nativeDb.getFilePath(),
524
541
  doNotUpdateElementIds: core_bentley_1.CompressedId64Set.compressSet(this.doNotUpdateElementIds),
542
+ duplicateCodeValueMap: Object.fromEntries(this._duplicateCodeValueMap),
525
543
  additionalState: this.getAdditionalStateJson(),
526
544
  };
527
545
  }
546
+ resolveDuplicateCodeValues() {
547
+ for (const [elementId, codeValue] of this._duplicateCodeValueMap) {
548
+ const element = this.targetDb.elements.getElement(elementId);
549
+ element.code.value = codeValue;
550
+ element.update();
551
+ }
552
+ this._duplicateCodeValueMap.clear();
553
+ }
554
+ /**
555
+ * Needs to be called to perform necessary cleanup operations.
556
+ * By not calling `finalize` there is a risk that data imported into targetDb will not be as expected.
557
+ *
558
+ * @note No need to call this If using [[IModelTransformer]] as it automatically invokes this method.
559
+ */
560
+ finalize() {
561
+ this.resolveDuplicateCodeValues();
562
+ }
528
563
  }
529
564
  exports.IModelImporter = IModelImporter;
530
565
  IModelImporter._realityDataSourceLinkPartitionStaticId = "0xe";
@@ -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 { CompressedId64Set, Id64, Id64String, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n AxisAlignedBox3d, Base64EncodedString, ElementAspectProps, ElementProps, EntityProps, IModel, IModelError, ModelProps, PrimitiveTypeCode,\n PropertyMetaData, RelatedElement, SubCategoryProps,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\nimport { ElementAspect, ElementMultiAspect, Entity, IModelDb, Relationship, RelationshipProps, SourceAndTarget, SubCategory } from \"@itwin/core-backend\";\nimport type { IModelTransformOptions } from \"./IModelTransformer\";\nimport * as assert from \"assert\";\nimport { deleteElementTreeCascade } from \"./ElementCascadingDeleter\";\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\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 implements Required<IModelImportOptions> {\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 /** 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 [[IModelImportOptions.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n * @deprecated in 3.x. Use [[IModelImporter.options.autoExtendProjectExtents]] instead\n */\n public get autoExtendProjectExtents(): Required<IModelImportOptions>[\"autoExtendProjectExtents\"] {\n return this.options.autoExtendProjectExtents;\n }\n public set autoExtendProjectExtents(val: Required<IModelImportOptions>[\"autoExtendProjectExtents\"]) {\n this.options.autoExtendProjectExtents = val;\n }\n\n /**\n * See [IModelTransformOptions.preserveElementIdsForFiltering]($transformer)\n * @deprecated in 3.x. Use [[IModelImporter.options.preserveElementIdsForFiltering]] instead\n */\n public get preserveElementIdsForFiltering(): boolean {\n return this.options.preserveElementIdsForFiltering;\n }\n public set preserveElementIdsForFiltering(val: boolean) {\n this.options.preserveElementIdsForFiltering = val;\n }\n\n /**\n * See [[IModelImportOptions.simplifyElementGeometry]]\n * @deprecated in 3.x. Use [[IModelImporter.options.simplifyElementGeometry]] instead\n */\n public get simplifyElementGeometry(): boolean {\n return this.options.simplifyElementGeometry;\n }\n public set simplifyElementGeometry(val: boolean) {\n this.options.simplifyElementGeometry = val;\n }\n\n private static _realityDataSourceLinkPartitionStaticId: Id64String = \"0xe\";\n\n /** The set of elements that should not be updated by this IModelImporter.\n * Defaults to the elements that are always present (even in an \"empty\" iModel) and therefore do not need to be updated\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 IModel.rootSubjectId,\n IModel.dictionaryId,\n IModelImporter._realityDataSourceLinkPartitionStaticId,\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: options?.preserveElementIdsForFiltering ?? false,\n simplifyElementGeometry: options?.simplifyElementGeometry ?? false,\n };\n }\n\n /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */\n public importModel(modelProps: ModelProps): void {\n if ((undefined === modelProps.id) || !Id64.isValidId64(modelProps.id))\n throw new IModelError(IModelStatus.InvalidId, \"Model Id not provided, should be the same as the ModeledElementId\");\n\n if (this.doNotUpdateElementIds.has(modelProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target model ${modelProps.id}`);\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 this.onUpdateModel(modelProps);\n }\n } catch (error) {\n // catch NotFound error and insertModel\n if (error instanceof IModelError && error.errorNumber === IModelStatus.NotFound) {\n 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 onInsertModel(modelProps: ModelProps): Id64String {\n try {\n const modelId: Id64String = this.targetDb.models.insertModel(modelProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatModelForLogger(modelProps)}`);\n 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 onUpdateModel(modelProps: ModelProps): void {\n this.targetDb.models.updateModel(modelProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatModelForLogger(modelProps)}`);\n this.trackProgress();\n }\n\n /** Format a Model for the Logger. */\n private formatModelForLogger(modelProps: ModelProps): string {\n return `${modelProps.classFullName} [${modelProps.id!}]`;\n }\n\n /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */\n public importElement(elementProps: ElementProps): Id64String {\n if (undefined !== elementProps.id && this.doNotUpdateElementIds.has(elementProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target element ${elementProps.id}`);\n return elementProps.id;\n }\n if (this.options.preserveElementIdsForFiltering) {\n if (elementProps.id === undefined) {\n throw new IModelError(IModelStatus.BadElement, `elementProps.id must be defined during a preserveIds operation`);\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 // Otherwise we always insert during a preserveElementIdsForFiltering operation\n if (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) {\n this.onUpdateElement(elementProps);\n } else {\n this.onInsertElement(elementProps);\n }\n } else {\n if (undefined !== elementProps.id) {\n this.onUpdateElement(elementProps);\n } else {\n 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 onInsertElement(elementProps: ElementProps): Id64String {\n try {\n const elementId = this.targetDb.nativeDb.insertElement(\n 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(loggerCategory, `Inserted ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementId, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\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 onUpdateElement(elementProps: ElementProps): void {\n if (!elementProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"ElementId not provided\");\n }\n this.targetDb.elements.updateElement(elementProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementProps.id, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\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 onDeleteElement(elementId: Id64String): void {\n deleteElementTreeCascade(this.targetDb, elementId);\n Logger.logInfo(loggerCategory, `Deleted element ${elementId} and its descendants`);\n this.trackProgress();\n }\n\n /** Delete the specified Element from the target iModel. */\n public deleteElement(elementId: Id64String): void {\n if (this.doNotUpdateElementIds.has(elementId)) {\n Logger.logInfo(loggerCategory, `Do not delete target element ${elementId}`);\n return;\n }\n 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 onDeleteModel(modelId: Id64String): void {\n this.targetDb.models.deleteModel(modelId);\n Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);\n this.trackProgress();\n }\n\n /** Delete the specified Model from the target iModel. */\n public deleteModel(modelId: Id64String): void {\n 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 ? `${elementProps.code.value} ` : elementProps.userLabel ? `${elementProps.userLabel} ` : \"\";\n return `${elementProps.classFullName} ${namePiece}[${elementProps.id}]`;\n }\n\n /** Import an ElementUniqueAspect into the target iModel. */\n public importElementUniqueAspect(aspectProps: ElementAspectProps): Id64String {\n const aspects: ElementAspect[] = this.targetDb.elements.getAspects(aspectProps.element.id, aspectProps.classFullName);\n if (aspects.length === 0) {\n return this.onInsertElementAspect(aspectProps);\n } else if (hasEntityChanged(aspects[0], aspectProps)) {\n aspectProps.id = aspects[0].id;\n 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 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 ): Id64String[] {\n const result = new Array<Id64String | undefined>(aspectPropsArray.length).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 aspectClassFullNames.forEach((aspectClassFullName: string) => {\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 proposedAspects.forEach(({props, index: resultIndex}, 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 this.onUpdateElementAspect(props);\n }\n id = props.id;\n } else {\n id = this.onInsertElementAspect(props);\n }\n result[resultIndex] = id;\n });\n } else {\n currentAspects.forEach(({props, index: resultIndex}, 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 this.onUpdateElementAspect(proposedAspects[index].props);\n }\n result[resultIndex] = id;\n } else {\n 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 onInsertElementAspect(aspectProps: ElementAspectProps): Id64String {\n try {\n const id = this.targetDb.elements.insertAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatElementAspectForLogger(aspectProps)}`);\n 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 onUpdateElementAspect(aspectProps: ElementAspectProps): void {\n this.targetDb.elements.updateAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementAspectForLogger(aspectProps)}`);\n 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 onDeleteElementAspect(targetElementAspect: ElementAspect): void {\n this.targetDb.elements.deleteAspect(targetElementAspect.id);\n Logger.logInfo(loggerCategory, `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`);\n this.trackProgress();\n }\n\n /** Format an ElementAspect for the Logger. */\n private formatElementAspectForLogger(elementAspectProps: ElementAspectProps | ElementAspect): 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 importRelationship(relationshipProps: RelationshipProps): Id64String {\n if ((undefined === relationshipProps.sourceId) || !Id64.isValidId64(relationshipProps.sourceId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.sourceId`);\n return Id64.invalid;\n }\n if ((undefined === relationshipProps.targetId) || !Id64.isValidId64(relationshipProps.targetId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.targetId`);\n return Id64.invalid;\n }\n // check for an existing relationship\n const relSourceAndTarget: SourceAndTarget = { sourceId: relationshipProps.sourceId, targetId: relationshipProps.targetId };\n const relationship: Relationship | undefined = this.targetDb.relationships.tryGetInstance(relationshipProps.classFullName, relSourceAndTarget);\n if (undefined !== relationship) { // if relationship found, update it\n relationshipProps.id = relationship.id;\n if (hasEntityChanged(relationship, relationshipProps)) {\n 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 onInsertRelationship(relationshipProps: RelationshipProps): Id64String {\n try {\n const targetRelInstanceId: Id64String = this.targetDb.relationships.insertInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`);\n 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 onUpdateRelationship(relationshipProps: RelationshipProps): void {\n if (!relationshipProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"Relationship instance Id not provided\");\n }\n this.targetDb.relationships.updateInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n protected onDeleteRelationship(relationshipProps: RelationshipProps): void {\n this.targetDb.relationships.deleteInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Deleted relationship ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n public deleteRelationship(relationshipProps: RelationshipProps): void {\n 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 trackProgress(): void {\n this._progressCounter++;\n if (0 === (this._progressCounter % this.progressInterval)) {\n 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 onProgress(): 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.processChanges]($transformer) and [IModelTransformer.processAll]($transformer).\n * @see [IModelDb.computeProjectExtents]($backend), [[autoExtendProjectExtents]]\n */\n public computeProjectExtents(): void {\n const computedProjectExtents = this.targetDb.computeProjectExtents({ reportExtentsWithOutliers: true, reportOutliers: true });\n Logger.logInfo(loggerCategory, `Current projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents without outliers=${JSON.stringify(computedProjectExtents.extents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents with outliers=${JSON.stringify(computedProjectExtents.extentsWithOutliers)}`);\n if (this.options.autoExtendProjectExtents) {\n const excludeOutliers: boolean = typeof this.options.autoExtendProjectExtents === \"object\" ? this.options.autoExtendProjectExtents.excludeOutliers : false;\n const newProjectExtents: AxisAlignedBox3d = excludeOutliers ? computedProjectExtents.extents : computedProjectExtents.extentsWithOutliers!;\n if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {\n this.targetDb.updateProjectExtents(newProjectExtents);\n Logger.logInfo(loggerCategory, `Updated projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n }\n if (!excludeOutliers && computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\n }\n } else {\n if (!this.targetDb.projectExtents.containsRange(computedProjectExtents.extents)) {\n Logger.logWarning(loggerCategory, \"Current project extents may be too small\");\n }\n if (computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\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.processChanges]] and [[IModelTransformer.processAll]] if\n * [[IModelTransformOptions.optimizeGeometry]] is defined.\n */\n public optimizeGeometry(options: OptimizeGeometryOptions): void {\n if (options.inlineUniqueGeometryParts) {\n const result = this.targetDb.nativeDb.inlineGeometryPartReferences();\n Logger.logInfo(loggerCategory, `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.`);\n }\n }\n\n /**\n * You may override this to store arbitrary json state in a exporter state dump, useful for some resumptions\n * @see [[IModelTransformer.saveStateToFile]]\n */\n protected getAdditionalStateJson(): any {\n return {};\n }\n\n /**\n * You may override this to load arbitrary json state in a transformer state dump, useful for some resumptions\n * @see [[IModelTransformer.loadStateFromFile]]\n */\n protected loadAdditionalStateJson(_additionalState: any): void {}\n\n /**\n * Reload our state from a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can load custom json from the importer save state for custom importers by overriding [[IModelImporter.loadAdditionalStateJson]]\n */\n public loadStateFromJson(state: IModelImporterState): void {\n if (state.importerClass !== this.constructor.name)\n throw Error(\"resuming from a differently named importer class, it is not necessarily valid to resume with a different importer class\");\n // ignore readonly since this runs right after construction in [[IModelTransformer.resumeTransformation]]\n (this.options as IModelTransformOptions) = state.options;\n if (this.targetDb.iModelId !== state.targetDbId)\n throw Error(\"can only load importer state when the same target is reused\");\n // TODO: fix upstream, looks like a bad case for the linter rule when casting away readonly for this generic\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n (this.doNotUpdateElementIds as Set<Id64String>) = CompressedId64Set.decompressSet(state.doNotUpdateElementIds);\n this.loadAdditionalStateJson(state.additionalState);\n }\n\n /**\n * Serialize state to a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can add custom json to the importer save state for custom importers by overriding [[IModelImporter.getAdditionalStateJson]]\n */\n public saveStateToJson(): IModelImporterState {\n return {\n importerClass: this.constructor.name,\n options: this.options,\n targetDbId: this.targetDb.iModelId || this.targetDb.nativeDb.getFilePath(),\n doNotUpdateElementIds: CompressedId64Set.compressSet(this.doNotUpdateElementIds),\n additionalState: this.getAdditionalStateJson(),\n };\n }\n}\n\n/**\n * The JSON format of a serialized IModelimporter instance\n * Used for starting an importer in the middle of an imxport operation,\n * such as resuming a crashed transformation\n *\n * @note Must be kept synchronized with IModelImxporter\n * @internal\n */\nexport interface IModelImporterState {\n importerClass: string;\n options: IModelImportOptions;\n targetDbId: string;\n doNotUpdateElementIds: CompressedId64Set;\n additionalState?: any;\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(entity: Entity, entityProps: EntityProps, namesToIgnore?: Set<string>): boolean {\n let changed: boolean = false;\n entity.forEachProperty((propertyName: string, propertyMeta: PropertyMetaData) => {\n if (!changed) {\n if (namesToIgnore && namesToIgnore.has(propertyName)) {\n // skip\n } else if (PrimitiveTypeCode.Binary === propertyMeta.primitiveType) {\n changed = hasBinaryValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else if (propertyMeta.isNavigation) {\n changed = hasNavigationValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else {\n changed = hasValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n }\n }\n });\n return changed;\n}\n\n/** Returns true if the specified binary values are different. */\nfunction hasBinaryValueChanged(binaryProperty1: any, binaryProperty2: any): boolean {\n const jsonString1 = JSON.stringify(binaryProperty1, Base64EncodedString.replacer);\n const jsonString2 = JSON.stringify(binaryProperty2, Base64EncodedString.replacer);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasNavigationValueChanged(navigationProperty1: any, navigationProperty2: any): 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)\n return false;\n\n if (!Id64.isId64(props.id))\n throw new IModelError(IModelStatus.BadElement, `subcategory had invalid id`);\n if (props.parent?.id === undefined)\n throw new IModelError(IModelStatus.BadElement, `subcategory with id ${props.id} had no parent`);\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 { CompressedId64Set, Guid, Id64, Id64String, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n AxisAlignedBox3d, Base64EncodedString, ElementAspectProps, ElementProps, EntityProps, IModel, IModelError, ModelProps, PrimitiveTypeCode,\n PropertyMetaData, RelatedElement, SubCategoryProps,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\nimport { ElementAspect, ElementMultiAspect, Entity, IModelDb, Relationship, RelationshipProps, SourceAndTarget, SubCategory } from \"@itwin/core-backend\";\nimport type { IModelTransformOptions } from \"./IModelTransformer\";\nimport * as assert from \"assert\";\nimport { deleteElementTreeCascade } from \"./ElementCascadingDeleter\";\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\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 implements Required<IModelImportOptions> {\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 /** 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 [[IModelImportOptions.autoExtendProjectExtents]]\n * @see [IModelImporter Options]($docs/learning/transformer/index.md#IModelImporter)\n * @deprecated in 3.x. Use [[IModelImporter.options.autoExtendProjectExtents]] instead\n */\n public get autoExtendProjectExtents(): Required<IModelImportOptions>[\"autoExtendProjectExtents\"] {\n return this.options.autoExtendProjectExtents;\n }\n public set autoExtendProjectExtents(val: Required<IModelImportOptions>[\"autoExtendProjectExtents\"]) {\n this.options.autoExtendProjectExtents = val;\n }\n\n /**\n * See [IModelTransformOptions.preserveElementIdsForFiltering]($transformer)\n * @deprecated in 3.x. Use [[IModelImporter.options.preserveElementIdsForFiltering]] instead\n */\n public get preserveElementIdsForFiltering(): boolean {\n return this.options.preserveElementIdsForFiltering;\n }\n public set preserveElementIdsForFiltering(val: boolean) {\n this.options.preserveElementIdsForFiltering = val;\n }\n\n /**\n * See [[IModelImportOptions.simplifyElementGeometry]]\n * @deprecated in 3.x. Use [[IModelImporter.options.simplifyElementGeometry]] instead\n */\n public get simplifyElementGeometry(): boolean {\n return this.options.simplifyElementGeometry;\n }\n public set simplifyElementGeometry(val: boolean) {\n this.options.simplifyElementGeometry = val;\n }\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 /** The set of elements that should not be updated by this IModelImporter.\n * Defaults to the elements that are always present (even in an \"empty\" iModel) and therefore do not need to be updated\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 IModel.rootSubjectId,\n IModel.dictionaryId,\n IModelImporter._realityDataSourceLinkPartitionStaticId,\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: options?.preserveElementIdsForFiltering ?? false,\n simplifyElementGeometry: options?.simplifyElementGeometry ?? false,\n };\n this._duplicateCodeValueMap = new Map<Id64String, string> ();\n }\n\n /** Import the specified ModelProps (either as an insert or an update) into the target iModel. */\n public importModel(modelProps: ModelProps): void {\n if ((undefined === modelProps.id) || !Id64.isValidId64(modelProps.id))\n throw new IModelError(IModelStatus.InvalidId, \"Model Id not provided, should be the same as the ModeledElementId\");\n\n if (this.doNotUpdateElementIds.has(modelProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target model ${modelProps.id}`);\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 this.onUpdateModel(modelProps);\n }\n } catch (error) {\n // catch NotFound error and insertModel\n if (error instanceof IModelError && error.errorNumber === IModelStatus.NotFound) {\n 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 onInsertModel(modelProps: ModelProps): Id64String {\n try {\n const modelId: Id64String = this.targetDb.models.insertModel(modelProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatModelForLogger(modelProps)}`);\n 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 onUpdateModel(modelProps: ModelProps): void {\n this.targetDb.models.updateModel(modelProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatModelForLogger(modelProps)}`);\n this.trackProgress();\n }\n\n /** Format a Model for the Logger. */\n private formatModelForLogger(modelProps: ModelProps): string {\n return `${modelProps.classFullName} [${modelProps.id!}]`;\n }\n\n /** Import the specified ElementProps (either as an insert or an update) into the target iModel. */\n public importElement(elementProps: ElementProps): Id64String {\n if (undefined !== elementProps.id && this.doNotUpdateElementIds.has(elementProps.id)) {\n Logger.logInfo(loggerCategory, `Do not update target element ${elementProps.id}`);\n return elementProps.id;\n }\n if (this.options.preserveElementIdsForFiltering) {\n if (elementProps.id === undefined) {\n throw new IModelError(IModelStatus.BadElement, `elementProps.id must be defined during a preserveIds operation`);\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 // Otherwise we always insert during a preserveElementIdsForFiltering operation\n if (isSubCategory(elementProps) && isDefaultSubCategory(elementProps)) {\n this.onUpdateElement(elementProps);\n } else {\n this.onInsertElement(elementProps);\n }\n } else {\n if (undefined !== elementProps.id) {\n try {\n this.onUpdateElement(elementProps);\n } catch(err) {\n if ((err as IModelError).errorNumber === IModelStatus.DuplicateCode) {\n assert(elementProps.code.value !== undefined, \"NULL code values are always considered unique and cannot clash\");\n this._duplicateCodeValueMap.set(elementProps.id, elementProps.code.value);\n // Using NULL code values as an alternative is not valid because definition elements cannot have NULL code values.\n elementProps.code.value = Guid.createValue();\n this.onUpdateElement(elementProps);\n } else {\n throw err;\n }\n }\n } else {\n 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 onInsertElement(elementProps: ElementProps): Id64String {\n try {\n const elementId = this.targetDb.nativeDb.insertElement(\n 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(loggerCategory, `Inserted ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementId, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\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 onUpdateElement(elementProps: ElementProps): void {\n if (!elementProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"ElementId not provided\");\n }\n this.targetDb.elements.updateElement(elementProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementForLogger(elementProps)}`);\n this.trackProgress();\n if (this.options.simplifyElementGeometry) {\n this.targetDb.nativeDb.simplifyElementGeometry({ id: elementProps.id, convertBReps: true });\n Logger.logInfo(loggerCategory, `Simplified element geometry for ${this.formatElementForLogger(elementProps)}`);\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 onDeleteElement(elementId: Id64String): void {\n deleteElementTreeCascade(this.targetDb, elementId);\n Logger.logInfo(loggerCategory, `Deleted element ${elementId} and its descendants`);\n this.trackProgress();\n }\n\n /** Delete the specified Element from the target iModel. */\n public deleteElement(elementId: Id64String): void {\n if (this.doNotUpdateElementIds.has(elementId)) {\n Logger.logInfo(loggerCategory, `Do not delete target element ${elementId}`);\n return;\n }\n 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 onDeleteModel(modelId: Id64String): void {\n this.targetDb.models.deleteModel(modelId);\n Logger.logInfo(loggerCategory, `Deleted model ${modelId}`);\n this.trackProgress();\n }\n\n /** Delete the specified Model from the target iModel. */\n public deleteModel(modelId: Id64String): void {\n 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 ? `${elementProps.code.value} ` : elementProps.userLabel ? `${elementProps.userLabel} ` : \"\";\n return `${elementProps.classFullName} ${namePiece}[${elementProps.id}]`;\n }\n\n /** Import an ElementUniqueAspect into the target iModel. */\n public importElementUniqueAspect(aspectProps: ElementAspectProps): Id64String {\n const aspects: ElementAspect[] = this.targetDb.elements.getAspects(aspectProps.element.id, aspectProps.classFullName);\n if (aspects.length === 0) {\n return this.onInsertElementAspect(aspectProps);\n } else if (hasEntityChanged(aspects[0], aspectProps)) {\n aspectProps.id = aspects[0].id;\n 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 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 ): Id64String[] {\n const result = new Array<Id64String | undefined>(aspectPropsArray.length).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 aspectClassFullNames.forEach((aspectClassFullName: string) => {\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 proposedAspects.forEach(({props, index: resultIndex}, 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 this.onUpdateElementAspect(props);\n }\n id = props.id;\n } else {\n id = this.onInsertElementAspect(props);\n }\n result[resultIndex] = id;\n });\n } else {\n currentAspects.forEach(({props, index: resultIndex}, 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 this.onUpdateElementAspect(proposedAspects[index].props);\n }\n result[resultIndex] = id;\n } else {\n 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 onInsertElementAspect(aspectProps: ElementAspectProps): Id64String {\n try {\n const id = this.targetDb.elements.insertAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatElementAspectForLogger(aspectProps)}`);\n 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 onUpdateElementAspect(aspectProps: ElementAspectProps): void {\n this.targetDb.elements.updateAspect(aspectProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatElementAspectForLogger(aspectProps)}`);\n 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 onDeleteElementAspect(targetElementAspect: ElementAspect): void {\n this.targetDb.elements.deleteAspect(targetElementAspect.id);\n Logger.logInfo(loggerCategory, `Deleted ${this.formatElementAspectForLogger(targetElementAspect)}`);\n this.trackProgress();\n }\n\n /** Format an ElementAspect for the Logger. */\n private formatElementAspectForLogger(elementAspectProps: ElementAspectProps | ElementAspect): 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 importRelationship(relationshipProps: RelationshipProps): Id64String {\n if ((undefined === relationshipProps.sourceId) || !Id64.isValidId64(relationshipProps.sourceId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.sourceId`);\n return Id64.invalid;\n }\n if ((undefined === relationshipProps.targetId) || !Id64.isValidId64(relationshipProps.targetId)) {\n Logger.logInfo(loggerCategory, `Ignoring ${relationshipProps.classFullName} instance because of invalid RelationshipProps.targetId`);\n return Id64.invalid;\n }\n // check for an existing relationship\n const relSourceAndTarget: SourceAndTarget = { sourceId: relationshipProps.sourceId, targetId: relationshipProps.targetId };\n const relationship: Relationship | undefined = this.targetDb.relationships.tryGetInstance(relationshipProps.classFullName, relSourceAndTarget);\n if (undefined !== relationship) { // if relationship found, update it\n relationshipProps.id = relationship.id;\n if (hasEntityChanged(relationship, relationshipProps)) {\n 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 onInsertRelationship(relationshipProps: RelationshipProps): Id64String {\n try {\n const targetRelInstanceId: Id64String = this.targetDb.relationships.insertInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Inserted ${this.formatRelationshipForLogger(relationshipProps)}`);\n 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 onUpdateRelationship(relationshipProps: RelationshipProps): void {\n if (!relationshipProps.id) {\n throw new IModelError(IModelStatus.InvalidId, \"Relationship instance Id not provided\");\n }\n this.targetDb.relationships.updateInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Updated ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n protected onDeleteRelationship(relationshipProps: RelationshipProps): void {\n // FIXME: pass only what the implementation of deleteInstance actually needs, e.g. { id: 5 } as RelationshipProps\n this.targetDb.relationships.deleteInstance(relationshipProps);\n Logger.logInfo(loggerCategory, `Deleted relationship ${this.formatRelationshipForLogger(relationshipProps)}`);\n this.trackProgress();\n }\n\n /** Delete the specified Relationship from the target iModel. */\n public deleteRelationship(relationshipProps: RelationshipProps): void {\n 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 trackProgress(): void {\n this._progressCounter++;\n if (0 === (this._progressCounter % this.progressInterval)) {\n 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 onProgress(): 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.processChanges]($transformer) and [IModelTransformer.processAll]($transformer).\n * @see [IModelDb.computeProjectExtents]($backend), [[autoExtendProjectExtents]]\n */\n public computeProjectExtents(): void {\n const computedProjectExtents = this.targetDb.computeProjectExtents({ reportExtentsWithOutliers: true, reportOutliers: true });\n Logger.logInfo(loggerCategory, `Current projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents without outliers=${JSON.stringify(computedProjectExtents.extents)}`);\n Logger.logInfo(loggerCategory, `Computed projectExtents with outliers=${JSON.stringify(computedProjectExtents.extentsWithOutliers)}`);\n if (this.options.autoExtendProjectExtents) {\n const excludeOutliers: boolean = typeof this.options.autoExtendProjectExtents === \"object\" ? this.options.autoExtendProjectExtents.excludeOutliers : false;\n const newProjectExtents: AxisAlignedBox3d = excludeOutliers ? computedProjectExtents.extents : computedProjectExtents.extentsWithOutliers!;\n if (!newProjectExtents.isAlmostEqual(this.targetDb.projectExtents)) {\n this.targetDb.updateProjectExtents(newProjectExtents);\n Logger.logInfo(loggerCategory, `Updated projectExtents=${JSON.stringify(this.targetDb.projectExtents)}`);\n }\n if (!excludeOutliers && computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\n }\n } else {\n if (!this.targetDb.projectExtents.containsRange(computedProjectExtents.extents)) {\n Logger.logWarning(loggerCategory, \"Current project extents may be too small\");\n }\n if (computedProjectExtents.outliers && computedProjectExtents.outliers.length > 0) {\n Logger.logInfo(loggerCategory, `${computedProjectExtents.outliers.length} outliers detected within projectExtents`);\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.processChanges]] and [[IModelTransformer.processAll]] if\n * [[IModelTransformOptions.optimizeGeometry]] is defined.\n */\n public optimizeGeometry(options: OptimizeGeometryOptions): void {\n if (options.inlineUniqueGeometryParts) {\n const result = this.targetDb.nativeDb.inlineGeometryPartReferences();\n Logger.logInfo(loggerCategory, `Inlined ${result.numRefsInlined} references to ${result.numCandidateParts} geometry parts and deleted ${result.numPartsDeleted} parts.`);\n }\n }\n\n /**\n * You may override this to store arbitrary json state in a exporter state dump, useful for some resumptions\n * @see [[IModelTransformer.saveStateToFile]]\n */\n protected getAdditionalStateJson(): any {\n return {};\n }\n\n /**\n * You may override this to load arbitrary json state in a transformer state dump, useful for some resumptions\n * @see [[IModelTransformer.loadStateFromFile]]\n */\n protected loadAdditionalStateJson(_additionalState: any): void {}\n\n /**\n * Reload our state from a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can load custom json from the importer save state for custom importers by overriding [[IModelImporter.loadAdditionalStateJson]]\n */\n public loadStateFromJson(state: IModelImporterState): void {\n if (state.importerClass !== this.constructor.name)\n throw Error(\"resuming from a differently named importer class, it is not necessarily valid to resume with a different importer class\");\n // ignore readonly since this runs right after construction in [[IModelTransformer.resumeTransformation]]\n (this.options as IModelTransformOptions) = state.options;\n if (this.targetDb.iModelId !== state.targetDbId)\n throw Error(\"can only load importer state when the same target is reused\");\n // TODO: fix upstream, looks like a bad case for the linter rule when casting away readonly for this generic\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n (this.doNotUpdateElementIds as Set<Id64String>) = CompressedId64Set.decompressSet(state.doNotUpdateElementIds);\n this._duplicateCodeValueMap = new Map(Object.entries(state.duplicateCodeValueMap));\n this.loadAdditionalStateJson(state.additionalState);\n }\n\n /**\n * Serialize state to a JSON object\n * Intended for [[IModelTransformer.resumeTransformation]]\n * @internal\n * You can add custom json to the importer save state for custom importers by overriding [[IModelImporter.getAdditionalStateJson]]\n */\n public saveStateToJson(): IModelImporterState {\n return {\n importerClass: this.constructor.name,\n options: this.options,\n targetDbId: this.targetDb.iModelId || this.targetDb.nativeDb.getFilePath(),\n doNotUpdateElementIds: CompressedId64Set.compressSet(this.doNotUpdateElementIds),\n duplicateCodeValueMap: Object.fromEntries(this._duplicateCodeValueMap),\n additionalState: this.getAdditionalStateJson(),\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 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/**\n * The JSON format of a serialized IModelimporter instance\n * Used for starting an importer in the middle of an imxport operation,\n * such as resuming a crashed transformation\n *\n * @note Must be kept synchronized with IModelImxporter\n * @internal\n */\nexport interface IModelImporterState {\n importerClass: string;\n options: IModelImportOptions;\n targetDbId: string;\n doNotUpdateElementIds: CompressedId64Set;\n duplicateCodeValueMap: Record<Id64String, string>;\n additionalState?: any;\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(entity: Entity, entityProps: EntityProps, namesToIgnore?: Set<string>): boolean {\n let changed: boolean = false;\n entity.forEachProperty((propertyName: string, propertyMeta: PropertyMetaData) => {\n if (!changed) {\n if (namesToIgnore && namesToIgnore.has(propertyName)) {\n // skip\n } else if (PrimitiveTypeCode.Binary === propertyMeta.primitiveType) {\n changed = hasBinaryValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else if (propertyMeta.isNavigation) {\n changed = hasNavigationValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n } else {\n changed = hasValueChanged(entity.asAny[propertyName], (entityProps as any)[propertyName]);\n }\n }\n });\n return changed;\n}\n\n/** Returns true if the specified binary values are different. */\nfunction hasBinaryValueChanged(binaryProperty1: any, binaryProperty2: any): boolean {\n const jsonString1 = JSON.stringify(binaryProperty1, Base64EncodedString.replacer);\n const jsonString2 = JSON.stringify(binaryProperty2, Base64EncodedString.replacer);\n return jsonString1 !== jsonString2;\n}\n\n/** Returns true if the specified navigation property values are different. */\nfunction hasNavigationValueChanged(navigationProperty1: any, navigationProperty2: any): 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)\n return false;\n\n if (!Id64.isId64(props.id))\n throw new IModelError(IModelStatus.BadElement, `subcategory had invalid id`);\n if (props.parent?.id === undefined)\n throw new IModelError(IModelStatus.BadElement, `subcategory with id ${props.id} had no parent`);\n return props.id === IModelDb.getDefaultSubCategoryId(props.parent.id);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { AccessToken, Id64Array, Id64String } from "@itwin/core-bentley";
2
2
  import * as ECSchemaMetaData from "@itwin/ecschema-metadata";
3
- import { Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, Entity, IModelDb, Model, Relationship, RelationshipProps, SQLiteDb } from "@itwin/core-backend";
4
- import { CodeSpec, ElementAspectProps, ElementProps, EntityReference, EntityReferenceSet, ExternalSourceAspectProps, FontProps, ModelProps, Placement2d, Placement3d } from "@itwin/core-common";
3
+ import { Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, Entity, ExternalSourceAspect, IModelDb, Model, Relationship, RelationshipProps, SQLiteDb } from "@itwin/core-backend";
4
+ import { ChangesetIndexAndId, CodeSpec, ElementAspectProps, ElementProps, EntityReference, EntityReferenceSet, ExternalSourceAspectProps, FontProps, ModelProps, Placement2d, Placement3d } from "@itwin/core-common";
5
5
  import { ExportChangesOptions, ExportSchemaResult, IModelExporter, IModelExportHandler } from "./IModelExporter";
6
6
  import { IModelImporter, OptimizeGeometryOptions } from "./IModelImporter";
7
7
  import { PendingReferenceMap } from "./PendingReferenceMap";
@@ -146,6 +146,16 @@ declare class PartiallyCommittedEntity {
146
146
  resolveReference(id: EntityReference): void;
147
147
  forceComplete(): void;
148
148
  }
149
+ /**
150
+ * Data type for persisting change version information within provenance Scope ExternalSourceAspect.
151
+ * Additionally, forward synchronization version is stored in Scope aspect's 'version' field.
152
+ * @beta
153
+ */
154
+ export interface TargetScopeProvenanceJsonProps {
155
+ pendingReverseSyncChangesetIndices: number[];
156
+ pendingSyncChangesetIndices: number[];
157
+ reverseSyncVersion: string;
158
+ }
149
159
  /** Arguments you can pass to [[IModelTransformer.initialize]]
150
160
  * @beta
151
161
  */
@@ -166,6 +176,8 @@ export interface InitOptions {
166
176
  * Arguments for [[IModelTransformer.processChanges]]
167
177
  */
168
178
  export interface ProcessChangesOptions extends ExportChangesOptions {
179
+ /** how to call saveChanges on the target. Must call targetDb.saveChanges, should not edit the iModel */
180
+ saveTargetChanges?: (transformer: IModelTransformer) => Promise<void>;
169
181
  }
170
182
  /** Arguments you can pass to [[IModelTransformer.initExternalSourceAspects]]
171
183
  * @deprecated in 0.1.0. Use [[InitOptions]] (and [[IModelTransformer.initialize]]) instead.
@@ -253,7 +265,7 @@ export declare class IModelTransformer extends IModelExportHandler {
253
265
  */
254
266
  private _forceOldRelationshipProvenanceMethod;
255
267
  /** Create an ExternalSourceAspectProps in a standard way for an Element in an iModel --> iModel transformation. */
256
- private initElementProvenance;
268
+ initElementProvenance(sourceElementId: Id64String, targetElementId: Id64String): ExternalSourceAspectProps;
257
269
  /** Create an ExternalSourceAspectProps in a standard way for a Relationship in an iModel --> iModel transformations.
258
270
  * The ExternalSourceAspect is meant to be owned by the Element in the target iModel that is the `sourceId` of transformed relationship.
259
271
  * The `identifier` property of the ExternalSourceAspect will be the ECInstanceId of the relationship in the source iModel.
@@ -270,17 +282,29 @@ export declare class IModelTransformer extends IModelExportHandler {
270
282
  private _cachedSynchronizationVersion;
271
283
  /** the changeset in the scoping element's source version found for this transformation
272
284
  * @note: the version depends on whether this is a reverse synchronization or not, as
273
- * it is stored separately for both synchronization directions
274
- * @note: empty string and -1 for changeset and index if it has never been transformed
285
+ * it is stored separately for both synchronization directions.
286
+ * @note: must call [[initScopeProvenance]] before using this property.
287
+ * @note: empty string and -1 for changeset and index if it has never been transformed or was transformed before federation guid update (pre 1.x).
275
288
  */
276
289
  private get _synchronizationVersion();
290
+ /** the changeset in the scoping element's source version found for this transformation
291
+ * @note: the version depends on whether this is a reverse synchronization or not, as
292
+ * it is stored separately for both synchronization directions.
293
+ * @note: empty string and -1 for changeset and index if it has never been transformed, or was transformed before federation guid update (pre 1.x).
294
+ */
295
+ protected get synchronizationVersion(): ChangesetIndexAndId;
296
+ /**
297
+ * @returns provenance scope aspect if it exists in the provenanceDb.
298
+ * Provenance scope aspect is created and inserted into provenanceDb when [[initScopeProvenance]] is invoked.
299
+ */
300
+ protected tryGetProvenanceScopeAspect(): ExternalSourceAspect | undefined;
277
301
  /**
278
302
  * Make sure there are no conflicting other scope-type external source aspects on the *target scope element*,
279
303
  * If there are none at all, insert one, then this must be a first synchronization.
280
304
  * @returns the last synced version (changesetId) on the target scope's external source aspect,
281
305
  * if this was a [BriefcaseDb]($backend)
282
306
  */
283
- private initScopeProvenance;
307
+ protected initScopeProvenance(): void;
284
308
  /**
285
309
  * @returns the id and version of an aspect with the given element, scope, kind, and identifier
286
310
  * May also return a reverseSyncVersion from json properties if requested
@@ -326,7 +350,8 @@ export declare class IModelTransformer extends IModelExportHandler {
326
350
  /**
327
351
  * Detect Element deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against Elements
328
352
  * in the source iModel.
329
- * @deprecated in 0.1.x. This method is only called during [[processAll]] when the option
353
+ * @deprecated in 1.x. Do not use this. // FIXME<MIKE>: how to better explain this?
354
+ * This method is only called during [[processAll]] when the option
330
355
  * [[IModelTransformerOptions.forceExternalSourceAspectProvenance]] is enabled. It is not
331
356
  * necessary when using [[processChanges]] since changeset information is sufficient.
332
357
  * @note you do not need to call this directly unless processing a subset of an iModel.
@@ -458,7 +483,7 @@ export declare class IModelTransformer extends IModelExportHandler {
458
483
  onDeleteRelationship(sourceRelInstanceId: Id64String): void;
459
484
  private _yieldManager;
460
485
  /** Detect Relationship deletes using ExternalSourceAspects in the target iModel and a *brute force* comparison against relationships in the source iModel.
461
- * @deprecated
486
+ * @deprecated in 1.x. Don't use this anymore
462
487
  * @see processChanges
463
488
  * @note This method is called from [[processAll]] and is not needed by [[processChanges]], so it only needs to be called directly when processing a subset of an iModel.
464
489
  * @throws [[IModelError]] If the required provenance information is not available to detect deletes.