@itwin/imodel-transformer 0.4.1 → 0.4.18-fedguidopt.2

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.
package/CHANGELOG.md CHANGED
@@ -1,17 +1,9 @@
1
1
  # Change Log - @itwin/imodel-transformer
2
2
 
3
- This log was last generated on Wed, 20 Sep 2023 15:34:05 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 11 Sep 2023 12:37:44 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.4.1
8
-
9
- Wed, 20 Sep 2023 15:34:05 GMT
10
-
11
- ### Patches
12
-
13
- - revert to original behavior of provenance ExternalSourceAspect version behavior ([commit](https://github.com/iTwin/transformer/commit/46373c33920c763ba3eb866fc415e433aa0952e6))
14
-
15
7
  ## 0.4.0
16
8
 
17
9
  Mon, 11 Sep 2023 12:37:44 GMT
@@ -0,0 +1,7 @@
1
+ /** given a discrete inclusive range [start, end] e.g. [-10, 12] and several "skipped" values", e.g.
2
+ * (-10, 1, -3, 5, 15), return the ordered set of subranges of the original range that exclude
3
+ * those values
4
+ */
5
+ export declare function rangesFromRangeAndSkipped(start: number, end: number, skipped: number[]): [number, number][];
6
+ export declare function renderRanges(ranges: [number, number][]): number[];
7
+ //# sourceMappingURL=Algo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Algo.d.ts","sourceRoot":"","sources":["../../src/Algo.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAiC3G;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAMjE"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.renderRanges = exports.rangesFromRangeAndSkipped = void 0;
8
+ // FIXME: tests
9
+ /** given a discrete inclusive range [start, end] e.g. [-10, 12] and several "skipped" values", e.g.
10
+ * (-10, 1, -3, 5, 15), return the ordered set of subranges of the original range that exclude
11
+ * those values
12
+ */
13
+ function rangesFromRangeAndSkipped(start, end, skipped) {
14
+ function validRange(range) {
15
+ return range[0] <= range[1];
16
+ }
17
+ const firstRange = [start, end];
18
+ if (!validRange(firstRange))
19
+ throw RangeError(`invalid range: [${start}, ${end}]`);
20
+ const ranges = [firstRange];
21
+ function findRangeContaining(pt, inRanges) {
22
+ // TODO: binary search
23
+ return inRanges.findIndex((r) => (pt >= r[0] && pt <= r[1]));
24
+ }
25
+ for (const skip of skipped) {
26
+ const rangeIndex = findRangeContaining(skip, ranges);
27
+ if (rangeIndex === -1)
28
+ continue;
29
+ const range = ranges[rangeIndex];
30
+ const leftRange = [range[0], skip - 1];
31
+ const rightRange = [skip + 1, range[1]];
32
+ if (validRange(leftRange) && validRange(rightRange))
33
+ ranges.splice(rangeIndex, 1, leftRange, rightRange);
34
+ else if (validRange(leftRange))
35
+ ranges.splice(rangeIndex, 1, leftRange);
36
+ else if (validRange(rightRange))
37
+ ranges.splice(rangeIndex, 1, rightRange);
38
+ }
39
+ return ranges;
40
+ }
41
+ exports.rangesFromRangeAndSkipped = rangesFromRangeAndSkipped;
42
+ function renderRanges(ranges) {
43
+ const result = [];
44
+ for (const range of ranges)
45
+ for (let i = range[0]; i <= range[1]; ++i)
46
+ result.push(i);
47
+ return result;
48
+ }
49
+ exports.renderRanges = renderRanges;
50
+ //# sourceMappingURL=Algo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Algo.js","sourceRoot":"","sources":["../../src/Algo.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,eAAe;AACf;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,KAAa,EAAE,GAAW,EAAE,OAAiB;IACrF,SAAS,UAAU,CAAC,KAAsB;QACxC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,GAAG,CAAqB,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QACzB,MAAM,UAAU,CAAC,mBAAmB,KAAK,KAAK,GAAG,GAAG,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC;IAE5B,SAAS,mBAAmB,CAAC,EAAU,EAAE,QAA4B;QACnE,sBAAsB;QACtB,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;QAC1B,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAqB,CAAC;QAC3D,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAqB,CAAC;QAC5D,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;aACjD,IAAI,UAAU,CAAC,SAAS,CAAC;YAC5B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;aACrC,IAAI,UAAU,CAAC,UAAU,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;KAC5C;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAjCD,8DAiCC;AAED,SAAgB,YAAY,CAAC,MAA0B;IACrD,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,KAAK,IAAI,MAAM;QACxB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC;AAND,oCAMC","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\n// FIXME: tests\n/** given a discrete inclusive range [start, end] e.g. [-10, 12] and several \"skipped\" values\", e.g.\n * (-10, 1, -3, 5, 15), return the ordered set of subranges of the original range that exclude\n * those values\n */\nexport function rangesFromRangeAndSkipped(start: number, end: number, skipped: number[]): [number, number][] {\n function validRange(range: [number,number]): boolean {\n return range[0] <= range[1];\n }\n\n const firstRange = [start, end] as [number, number];\n\n if (!validRange(firstRange))\n throw RangeError(`invalid range: [${start}, ${end}]`);\n\n const ranges = [firstRange];\n\n function findRangeContaining(pt: number, inRanges: [number, number][]): number {\n // TODO: binary search\n return inRanges.findIndex((r) => (pt >= r[0] && pt <= r[1]));\n }\n\n for (const skip of skipped) {\n const rangeIndex = findRangeContaining(skip, ranges);\n if (rangeIndex === -1)\n continue;\n const range = ranges[rangeIndex];\n const leftRange = [range[0], skip - 1] as [number, number];\n const rightRange = [skip + 1, range[1]] as [number, number];\n if (validRange(leftRange) && validRange(rightRange))\n ranges.splice(rangeIndex, 1, leftRange, rightRange);\n else if (validRange(leftRange))\n ranges.splice(rangeIndex, 1, leftRange);\n else if (validRange(rightRange))\n ranges.splice(rangeIndex, 1, rightRange);\n }\n\n return ranges;\n}\n\nexport function renderRanges(ranges: [number, number][]): number[] {\n const result = [];\n for (const range of ranges)\n for (let i = range[0]; i <= range[1]; ++i)\n result.push(i);\n return result;\n}\n\n"]}
@@ -19,15 +19,22 @@ export interface ProvenanceInitArgs {
19
19
  * insert Federation Guids in all lacking elements in the master database, which will prevent
20
20
  * needing to insert External Source Aspects for provenance tracking
21
21
  * @note requires a read/write master
22
+ * @note closes both the master and branch iModels to reset caches, so you must reopen them.
23
+ * If you pass `"keep-reopened-db"`, this object's `master` and `branch` properties will
24
+ * be set to new, open databases.
22
25
  */
23
- createFedGuidsForMaster?: boolean;
26
+ createFedGuidsForMaster?: true | false | "keep-reopened-db";
24
27
  }
25
- interface ProvenanceInitResult {
28
+ /**
29
+ * @alpha
30
+ */
31
+ export interface ProvenanceInitResult {
26
32
  targetScopeElementId: Id64String;
33
+ masterExternalSourceId: Id64String;
34
+ masterRepositoryLinkId: Id64String;
27
35
  }
28
36
  /**
29
37
  * @alpha
30
38
  */
31
39
  export declare function initializeBranchProvenance(args: ProvenanceInitArgs): Promise<ProvenanceInitResult>;
32
- export {};
33
40
  //# sourceMappingURL=BranchProvenanceInitializer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BranchProvenanceInitializer.d.ts","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,QAAQ,EAAkB,MAAM,qBAAqB,CAAC;AAC7G,OAAO,EAAY,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAK3D;;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;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,UAAU,oBAAoB;IAC5B,oBAAoB,EAAE,UAAU,CAAC;CAClC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6CxG"}
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"}
@@ -11,13 +11,40 @@ const IModelTransformer_1 = require("./IModelTransformer");
11
11
  */
12
12
  async function initializeBranchProvenance(args) {
13
13
  if (args.createFedGuidsForMaster) {
14
- // FIXME: elements in the cache could be wrong after this so need to purge cache somehow, maybe close the iModel
15
- args.master.withSqliteStatement("UPDATE bis_Element SET FederationGuid=randomblob(16) WHERE FederationGuid IS NULL", (s) => {
16
- assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE);
14
+ args.master.withSqliteStatement(`
15
+ UPDATE bis_Element
16
+ SET FederationGuid=randomblob(16)
17
+ WHERE FederationGuid IS NULL
18
+ AND Id NOT IN (0x1, 0xe, 0x10) -- ignore special elems
19
+ `, (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE));
20
+ const masterPath = args.master.pathName;
21
+ const reopenMaster = makeDbReopener(args.master);
22
+ 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));
24
+ args.branch.withSqliteStatement(`
25
+ UPDATE main.bis_Element
26
+ SET FederationGuid = (
27
+ SELECT m.FederationGuid
28
+ FROM master.bis_Element m
29
+ WHERE m.Id=main.bis_Element.Id
30
+ )`, (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE));
31
+ args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)
32
+ args.branch.saveChanges();
33
+ args.branch.withSqliteStatement(`DETACH DATABASE master`, (s) => {
34
+ const res = s.step();
35
+ if (res !== core_bentley_1.DbResult.BE_SQLITE_DONE)
36
+ core_bentley_1.Logger.logTrace("initializeBranchProvenance", `Error detaching db (we will close anyway): ${args.branch.nativeDb.getLastError()}`);
37
+ // this is the case until native side changes
38
+ assert(res === core_bentley_1.DbResult.BE_SQLITE_ERROR);
17
39
  });
40
+ args.branch.performCheckpoint();
41
+ const reopenBranch = makeDbReopener(args.branch);
42
+ // close dbs because element cache could be invalid
43
+ args.branch.close();
44
+ [args.master, args.branch] = await Promise.all([reopenMaster(), reopenBranch()]);
18
45
  }
19
46
  // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations
20
- const masterLinkRepoId = args.branch.elements.insertElement({
47
+ const masterRepoLinkId = args.branch.elements.insertElement({
21
48
  classFullName: core_backend_1.RepositoryLink.classFullName,
22
49
  code: core_backend_1.RepositoryLink.createCode(args.branch, core_backend_1.IModelDb.repositoryModelId, "example-code-value"),
23
50
  model: core_backend_1.IModelDb.repositoryModelId,
@@ -30,26 +57,71 @@ async function initializeBranchProvenance(args) {
30
57
  classFullName: core_backend_1.ExternalSource.classFullName,
31
58
  model: core_backend_1.IModelDb.rootSubjectId,
32
59
  code: core_common_1.Code.createEmpty(),
33
- repository: new core_backend_1.ExternalSourceIsInRepository(masterLinkRepoId),
60
+ repository: new core_backend_1.ExternalSourceIsInRepository(masterRepoLinkId),
34
61
  /* eslint-disable @typescript-eslint/no-var-requires */
35
62
  connectorName: require("../../package.json").name,
36
63
  connectorVersion: require("../../package.json").version,
37
64
  /* eslint-enable @typescript-eslint/no-var-requires */
38
65
  });
39
- const fedGuidLessElemsSql = "SELECT ECInstanceId as id FROM Bis.Element WHERE FederationGuid IS NULL";
40
- const reader = args.branch.createQueryReader(fedGuidLessElemsSql);
41
- while (await reader.step()) {
42
- const id = reader.current.toRow().id;
43
- IModelTransformer_1.IModelTransformer.initElementProvenanceOptions(id, id, {
66
+ const fedGuidLessElemsSql = `
67
+ SELECT ECInstanceId AS id
68
+ FROM Bis.Element
69
+ WHERE FederationGuid IS NULL
70
+ AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */
71
+ `;
72
+ const elemReader = args.branch.createQueryReader(fedGuidLessElemsSql, undefined, { usePrimaryConn: true });
73
+ while (await elemReader.step()) {
74
+ const id = elemReader.current.toRow().id;
75
+ const aspectProps = IModelTransformer_1.IModelTransformer.initElementProvenanceOptions(id, id, {
44
76
  isReverseSynchronization: false,
45
77
  targetScopeElementId: masterExternalSourceId,
46
78
  sourceDb: args.master,
47
79
  targetDb: args.branch,
48
80
  });
81
+ args.branch.elements.insertAspect(aspectProps);
82
+ }
83
+ const fedGuidLessRelsSql = `
84
+ SELECT erte.ECInstanceId as id
85
+ FROM Bis.ElementRefersToElements erte
86
+ JOIN bis.Element se
87
+ ON se.ECInstanceId=erte.SourceECInstanceId
88
+ JOIN bis.Element te
89
+ ON te.ECInstanceId=erte.TargetECInstanceId
90
+ WHERE se.FederationGuid IS NULL
91
+ OR te.FederationGuid IS NULL`;
92
+ const relReader = args.branch.createQueryReader(fedGuidLessRelsSql, undefined, { usePrimaryConn: true });
93
+ while (await relReader.step()) {
94
+ const id = relReader.current.toRow().id;
95
+ const aspectProps = IModelTransformer_1.IModelTransformer.initRelationshipProvenanceOptions(id, id, {
96
+ isReverseSynchronization: false,
97
+ targetScopeElementId: masterExternalSourceId,
98
+ sourceDb: args.master,
99
+ targetDb: args.branch,
100
+ forceOldRelationshipProvenanceMethod: false,
101
+ });
102
+ args.branch.elements.insertAspect(aspectProps);
103
+ }
104
+ if (args.createFedGuidsForMaster === true) {
105
+ args.master.close();
106
+ args.branch.close();
49
107
  }
50
108
  return {
51
109
  targetScopeElementId: masterExternalSourceId,
110
+ masterExternalSourceId,
111
+ masterRepositoryLinkId: masterRepoLinkId,
52
112
  };
53
113
  }
54
114
  exports.initializeBranchProvenance = initializeBranchProvenance;
115
+ function makeDbReopener(db) {
116
+ const originalMode = db.isReadonly ? core_bentley_1.OpenMode.Readonly : core_bentley_1.OpenMode.ReadWrite;
117
+ const dbPath = db.pathName;
118
+ let reopenDb;
119
+ if (db instanceof core_backend_1.BriefcaseDb)
120
+ reopenDb = async (mode = originalMode) => core_backend_1.BriefcaseDb.open({ fileName: dbPath, readonly: mode === core_bentley_1.OpenMode.Readonly });
121
+ else if (db instanceof core_backend_1.StandaloneDb)
122
+ reopenDb = (mode = originalMode) => core_backend_1.StandaloneDb.openFile(dbPath, mode);
123
+ else
124
+ assert(false, `db type '${db.constructor.name}' not supported`);
125
+ return reopenDb;
126
+ }
55
127
  //# sourceMappingURL=BranchProvenanceInitializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BranchProvenanceInitializer.js","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":";;;AAAA,sDAA6G;AAC7G,sDAA2D;AAC3D,oDAAoF;AACpF,iCAAkC;AAClC,2DAAwD;AA6BxD;;GAEG;AACI,KAAK,UAAU,0BAA0B,CAAC,IAAwB;IACvE,IAAI,IAAI,CAAC,uBAAuB,EAAE;QAChC,gHAAgH;QAChH,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,mFAAmF,EAAE,CAAC,CAAC,EAAE,EAAE;YACzH,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,uBAAQ,CAAC,cAAc,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;KACJ;IAED,wHAAwH;IACxH,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1D,aAAa,EAAE,6BAAc,CAAC,aAAa;QAC3C,IAAI,EAAE,6BAAc,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAQ,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;QAC9F,KAAK,EAAE,uBAAQ,CAAC,iBAAiB;QACjC,GAAG,EAAE,IAAI,CAAC,SAAS;QACnB,MAAM,EAAE,QAAQ;QAChB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;QACpC,WAAW,EAAE,IAAI,CAAC,iBAAiB;KACb,CAAC,CAAC;IAE1B,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChE,aAAa,EAAE,6BAAc,CAAC,aAAa;QAC3C,KAAK,EAAE,uBAAQ,CAAC,aAAa;QAC7B,IAAI,EAAE,kBAAI,CAAC,WAAW,EAAE;QACxB,UAAU,EAAE,IAAI,2CAA4B,CAAC,gBAAgB,CAAC;QAC9D,uDAAuD;QACvD,aAAa,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI;QACjD,gBAAgB,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO;QACvD,sDAAsD;KAChC,CAAC,CAAC;IAE1B,MAAM,mBAAmB,GAAG,yEAAyE,CAAC;IACtG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAClE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAW,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,qCAAiB,CAAC,4BAA4B,CAAC,EAAE,EAAE,EAAE,EAAE;YACrD,wBAAwB,EAAE,KAAK;YAC/B,oBAAoB,EAAE,sBAAsB;YAC5C,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,QAAQ,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC,CAAC;KACJ;IAED,OAAO;QACL,oBAAoB,EAAE,sBAAsB;KAC7C,CAAC;AACJ,CAAC;AA7CD,gEA6CC","sourcesContent":["import { ExternalSource, ExternalSourceIsInRepository, IModelDb, RepositoryLink } from \"@itwin/core-backend\";\nimport { DbResult, Id64String } 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 */\n createFedGuidsForMaster?: boolean;\n}\n\ninterface ProvenanceInitResult {\n targetScopeElementId: Id64String;\n}\n\n/**\n * @alpha\n */\nexport async function initializeBranchProvenance(args: ProvenanceInitArgs): Promise<ProvenanceInitResult> {\n if (args.createFedGuidsForMaster) {\n // FIXME: elements in the cache could be wrong after this so need to purge cache somehow, maybe close the iModel\n args.master.withSqliteStatement(\"UPDATE bis_Element SET FederationGuid=randomblob(16) WHERE FederationGuid IS NULL\", (s) => {\n assert(s.step() === DbResult.BE_SQLITE_DONE);\n });\n }\n\n // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations\n const masterLinkRepoId = 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(masterLinkRepoId),\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 = \"SELECT ECInstanceId as id FROM Bis.Element WHERE FederationGuid IS NULL\";\n const reader = args.branch.createQueryReader(fedGuidLessElemsSql);\n while (await reader.step()) {\n const id: string = reader.current.toRow().id;\n IModelTransformer.initElementProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n });\n }\n\n return {\n targetScopeElementId: masterExternalSourceId,\n };\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 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 +1 @@
1
- {"version":3,"file":"IModelCloneContext.d.ts","sourceRoot":"","sources":["../../src/IModelCloneContext.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,UAAU,EAAU,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAGgB,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAEvE,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,OAAO,EAAE,aAAa,EAAoB,yBAAyB,EAAE,cAAc,EAAE,QAAQ,EAC9F,MAAM,qBAAqB,CAAC;AAO7B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,yBAAyB;IAE/D,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAqC;IAE9D,0HAA0H;IACpG,UAAU;IAIhC;;OAEG;IACa,YAAY,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,mBAAmB,GAAG,YAAY;IA4BrH,uGAAuG;IAChG,kBAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,GAAG,IAAI;IAIvF,mEAAmE;IAC5D,mBAAmB,CAAC,cAAc,EAAE,UAAU,GAAG,IAAI;IAI5D;;OAEG;IACI,kBAAkB,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU;IAIjE;;OAEG;IACI,kBAAkB,CAAC,cAAc,EAAE,eAAe,GAAG,eAAe;IA+F3E;;OAEG;IACI,kBAAkB,CAAC,mBAAmB,EAAE,aAAa,GAAG,kBAAkB;IAyBjF,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAoB;IAEvC,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAoBjC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;CAapD"}
1
+ {"version":3,"file":"IModelCloneContext.d.ts","sourceRoot":"","sources":["../../src/IModelCloneContext.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,UAAU,EAAU,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAGgB,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAEvE,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,OAAO,EAAE,aAAa,EAAoB,yBAAyB,EAAE,cAAc,EAAE,QAAQ,EAC9F,MAAM,qBAAqB,CAAC;AAO7B;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,yBAAyB;IAE/D,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAqC;IAE9D,0HAA0H;IACpG,UAAU;IAIhC;;OAEG;IACa,YAAY,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,mBAAmB,GAAG,YAAY;IA0BrH,uGAAuG;IAChG,kBAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,GAAG,IAAI;IAIvF,mEAAmE;IAC5D,mBAAmB,CAAC,cAAc,EAAE,UAAU,GAAG,IAAI;IAI5D;;OAEG;IACI,kBAAkB,CAAC,cAAc,EAAE,UAAU,GAAG,UAAU;IAIjE;;OAEG;IACI,kBAAkB,CAAC,cAAc,EAAE,eAAe,GAAG,eAAe;IA+F3E;;OAEG;IACI,kBAAkB,CAAC,mBAAmB,EAAE,aAAa,GAAG,kBAAkB;IAyBjF,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAoB;IAEvC,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAoBjC,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;CAapD"}
@@ -33,7 +33,6 @@ class IModelCloneContext extends core_backend_1.IModelElementCloneContext {
33
33
  * @internal
34
34
  */
35
35
  cloneElement(sourceElement, cloneOptions) {
36
- // eslint-disable-next-line @typescript-eslint/dot-notation
37
36
  const targetElementProps = this["_nativeContext"].cloneElement(sourceElement.id, cloneOptions);
38
37
  // Ensure that all NavigationProperties in targetElementProps have a defined value so "clearing" changes will be part of the JSON used for update
39
38
  sourceElement.forEachProperty((propertyName, meta) => {
@@ -55,7 +54,6 @@ class IModelCloneContext extends core_backend_1.IModelElementCloneContext {
55
54
  targetElementProps.code = core_common_1.Code.createEmpty();
56
55
  }
57
56
  const jsClass = this.sourceDb.getJsClass(sourceElement.classFullName);
58
- // eslint-disable-next-line @typescript-eslint/dot-notation
59
57
  jsClass["onCloned"](this, sourceElement.toJSON(), targetElementProps);
60
58
  return targetElementProps;
61
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IModelCloneContext.js","sourceRoot":"","sources":["../../src/IModelCloneContext.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 * as assert from \"assert\";\nimport { DbResult, Id64, Id64String, Logger } from \"@itwin/core-bentley\";\nimport {\n Code,\n CodeScopeSpec,\n ConcreteEntityTypes, ElementAspectProps, ElementProps, EntityReference, IModel, IModelError,\n PrimitiveTypeCode, PropertyMetaData, RelatedElement, RelatedElementProps,\n} from \"@itwin/core-common\";\nimport {\n Element, ElementAspect, EntityReferences, IModelElementCloneContext, IModelJsNative, SQLiteDb,\n} from \"@itwin/core-backend\";\nimport { ECReferenceTypesCache } from \"./ECReferenceTypesCache\";\nimport { EntityUnifier } from \"./EntityUnifier\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelCloneContext;\n\n/** The context for transforming a *source* Element to a *target* Element and remapping internal identifiers to the target iModel.\n * @beta\n */\nexport class IModelCloneContext extends IModelElementCloneContext {\n\n private _refTypesCache = new ECReferenceTypesCache();\n private _aspectRemapTable = new Map<Id64String, Id64String>();\n\n /** perform necessary initialization to use a clone context, namely caching the reference types in the source's schemas */\n public override async initialize() {\n await this._refTypesCache.initAllSchemasInIModel(this.sourceDb);\n }\n\n /** Clone the specified source Element into ElementProps for the target iModel.\n * @internal\n */\n public override cloneElement(sourceElement: Element, cloneOptions?: IModelJsNative.CloneElementOptions): ElementProps {\n // eslint-disable-next-line @typescript-eslint/dot-notation\n const targetElementProps: ElementProps = this[\"_nativeContext\"].cloneElement(sourceElement.id, cloneOptions);\n // Ensure that all NavigationProperties in targetElementProps have a defined value so \"clearing\" changes will be part of the JSON used for update\n sourceElement.forEachProperty((propertyName: string, meta: PropertyMetaData) => {\n if ((meta.isNavigation) && (undefined === (sourceElement as any)[propertyName])) {\n (targetElementProps as any)[propertyName] = RelatedElement.none;\n }\n }, false); // exclude custom because C++ has already handled them\n if (this.isBetweenIModels) {\n // The native C++ cloneElement strips off federationGuid, want to put it back if transformation is between iModels\n targetElementProps.federationGuid = sourceElement.federationGuid;\n const targetElementCodeScopeType = this.targetDb.codeSpecs.getById(targetElementProps.code.spec).scopeType;\n if (CodeScopeSpec.Type.Repository === targetElementCodeScopeType && targetElementProps.code.scope !== IModel.rootSubjectId) {\n Logger.logWarning(loggerCategory, `Incorrect CodeScope '${targetElementCodeScopeType}' is set for target element ${targetElementProps.id}`);\n }\n }\n // unlike other references, code cannot be null. If it is null, use an empty code instead\n // this will be updated back later as the transformer resolves references\n if (targetElementProps.code.scope === Id64.invalid || targetElementProps.code.spec === Id64.invalid) {\n targetElementProps.code = Code.createEmpty();\n }\n const jsClass = this.sourceDb.getJsClass<typeof Element>(sourceElement.classFullName);\n // eslint-disable-next-line @typescript-eslint/dot-notation\n jsClass[\"onCloned\"](this, sourceElement.toJSON(), targetElementProps);\n return targetElementProps;\n }\n\n /** Add a rule that remaps the specified source ElementAspect to the specified target ElementAspect. */\n public remapElementAspect(aspectSourceId: Id64String, aspectTargetId: Id64String): void {\n this._aspectRemapTable.set(aspectSourceId, aspectTargetId);\n }\n\n /** Remove a rule that remaps the specified source ElementAspect */\n public removeElementAspect(aspectSourceId: Id64String): void {\n this._aspectRemapTable.delete(aspectSourceId);\n }\n\n /** Look up a target AspectId from the source AspectId.\n * @returns the target AspectId or [Id64.invalid]($bentley) if a mapping not found.\n */\n public findTargetAspectId(sourceAspectId: Id64String): Id64String {\n return this._aspectRemapTable.get(sourceAspectId) ?? Id64.invalid;\n }\n\n /** Look up a target [EntityReference]($bentley) from a source [EntityReference]($bentley)\n * @returns the target CodeSpecId or a [EntityReference]($bentley) containing [Id64.invalid]($bentley) if a mapping is not found.\n */\n public findTargetEntityId(sourceEntityId: EntityReference): EntityReference {\n const [type, rawId] = EntityReferences.split(sourceEntityId);\n if (Id64.isValid(rawId)) {\n switch (type) {\n case ConcreteEntityTypes.Model: {\n const targetId = `m${this.findTargetElementId(rawId)}` as const;\n // Check if the model exists, `findTargetElementId` may have worked because the element exists when the model doesn't.\n // That can occur in the transformer since a submodeled element is imported before its submodel.\n if (EntityUnifier.exists(this.targetDb, { entityReference: targetId }))\n return targetId;\n break;\n }\n case ConcreteEntityTypes.Element:\n return `e${this.findTargetElementId(rawId)}`;\n case ConcreteEntityTypes.ElementAspect:\n return `a${this.findTargetAspectId(rawId)}`;\n case ConcreteEntityTypes.Relationship: {\n const makeGetConcreteEntityTypeSql = (property: string) => `\n CASE\n WHEN [${property}] IS (BisCore.ElementUniqueAspect) OR [${property}] IS (BisCore.ElementMultiAspect)\n THEN 'a'\n WHEN [${property}] IS (BisCore.Element)\n THEN 'e'\n WHEN [${property}] IS (BisCore.Model)\n THEN 'm'\n WHEN [${property}] IS (BisCore.CodeSpec)\n THEN 'c'\n WHEN [${property}] IS (BisCore.ElementRefersToElements) -- TODO: ElementDrivesElement still not handled by the transformer\n THEN 'r'\n ELSE 'error'\n END\n `;\n const relInSource = this.sourceDb.withPreparedStatement(\n `\n SELECT\n SourceECInstanceId,\n TargetECInstanceId,\n (${makeGetConcreteEntityTypeSql(\"SourceECClassId\")}) AS SourceType,\n (${makeGetConcreteEntityTypeSql(\"TargetECClassId\")}) AS TargetType\n FROM BisCore:ElementRefersToElements\n WHERE ECInstanceId=?\n `, (stmt) => {\n stmt.bindId(1, rawId);\n let status: DbResult;\n while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) {\n const sourceId = stmt.getValue(0).getId();\n const targetId = stmt.getValue(1).getId();\n const sourceType = stmt.getValue(2).getString() as ConcreteEntityTypes | \"error\";\n const targetType = stmt.getValue(3).getString() as ConcreteEntityTypes | \"error\";\n if (sourceType === \"error\" || targetType === \"error\")\n throw Error(\"relationship end had unknown root class\");\n return {\n sourceId: `${sourceType}${sourceId}`,\n targetId: `${targetType}${targetId}`,\n } as const;\n }\n if (status !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(status, \"unexpected query failure\");\n return undefined;\n });\n if (relInSource === undefined)\n break;\n // just in case prevent recursion\n if (relInSource.sourceId === sourceEntityId || relInSource.targetId === sourceEntityId)\n throw Error(\"link table relationship end was resolved to itself. This should be impossible\");\n const relInTarget = {\n sourceId: this.findTargetEntityId(relInSource.sourceId),\n targetId: this.findTargetEntityId(relInSource.targetId),\n };\n // return a null\n if (!EntityReferences.isValid(relInTarget.sourceId) || !EntityReferences.isValid(relInTarget.targetId))\n break;\n const relInTargetId = this.targetDb.withPreparedStatement(\n `\n SELECT ECInstanceId\n FROM BisCore:ElementRefersToElements\n WHERE SourceECInstanceId=?\n AND TargetECInstanceId=?\n `, (stmt) => {\n stmt.bindId(1, EntityReferences.toId64(relInTarget.sourceId));\n stmt.bindId(2, EntityReferences.toId64(relInTarget.targetId));\n const status: DbResult = stmt.step();\n if (status === DbResult.BE_SQLITE_ROW)\n return stmt.getValue(0).getId();\n if (status !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(status, \"unexpected query failure\");\n return Id64.invalid;\n });\n return `r${relInTargetId}`;\n }\n }\n }\n return `${type}${Id64.invalid}`;\n }\n\n /** Clone the specified source Element into ElementProps for the target iModel.\n * @internal\n */\n public cloneElementAspect(sourceElementAspect: ElementAspect): ElementAspectProps {\n const targetElementAspectProps: ElementAspectProps = sourceElementAspect.toJSON();\n targetElementAspectProps.id = undefined;\n sourceElementAspect.forEachProperty((propertyName, propertyMetaData) => {\n if (propertyMetaData.isNavigation) {\n const sourceNavProp: RelatedElementProps | undefined = sourceElementAspect.asAny[propertyName];\n if (sourceNavProp?.id) {\n const navPropRefType = this._refTypesCache.getNavPropRefType(\n sourceElementAspect.schemaName,\n sourceElementAspect.className,\n propertyName\n );\n assert(navPropRefType !== undefined,`nav prop ref type for '${propertyName}' was not in the cache, this is a bug.`);\n const targetEntityReference = this.findTargetEntityId(EntityReferences.fromEntityType(sourceNavProp.id, navPropRefType));\n const targetEntityId = EntityReferences.toId64(targetEntityReference);\n // spread the property in case toJSON did not deep-clone\n (targetElementAspectProps as any)[propertyName] = { ...(targetElementAspectProps as any)[propertyName], id: targetEntityId };\n }\n } else if ((PrimitiveTypeCode.Long === propertyMetaData.primitiveType) && (\"Id\" === propertyMetaData.extendedType)) {\n (targetElementAspectProps as any)[propertyName] = this.findTargetElementId(sourceElementAspect.asAny[propertyName]);\n }\n });\n return targetElementAspectProps;\n }\n\n private static aspectRemapTableName = \"AspectIdRemaps\";\n\n public override saveStateToDb(db: SQLiteDb): void {\n super.saveStateToDb(db);\n if (DbResult.BE_SQLITE_DONE !== db.executeSQL(\n `CREATE TABLE ${IModelCloneContext.aspectRemapTableName} (Source INTEGER, Target INTEGER)`\n ))\n throw Error(\"Failed to create the aspect remap table in the state database\");\n db.saveChanges();\n db.withPreparedSqliteStatement(\n `INSERT INTO ${IModelCloneContext.aspectRemapTableName} (Source, Target) VALUES (?, ?)`,\n (stmt) => {\n for (const [source, target] of this._aspectRemapTable) {\n stmt.reset();\n stmt.bindId(1, source);\n stmt.bindId(2, target);\n if (DbResult.BE_SQLITE_DONE !== stmt.step())\n throw Error(\"Failed to insert aspect remapping into the state database\");\n }\n });\n }\n\n public override loadStateFromDb(db: SQLiteDb): void {\n super.loadStateFromDb(db);\n // FIXME: test this\n db.withSqliteStatement(`SELECT Source, Target FROM ${IModelCloneContext.aspectRemapTableName}`, (stmt) => {\n let status = DbResult.BE_SQLITE_ERROR;\n while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) {\n const source = stmt.getValue(0).getId();\n const target = stmt.getValue(1).getId();\n this._aspectRemapTable.set(source, target);\n }\n assert(status === DbResult.BE_SQLITE_DONE);\n });\n }\n}\n"]}
1
+ {"version":3,"file":"IModelCloneContext.js","sourceRoot":"","sources":["../../src/IModelCloneContext.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 * as assert from \"assert\";\nimport { DbResult, Id64, Id64String, Logger } from \"@itwin/core-bentley\";\nimport {\n Code,\n CodeScopeSpec,\n ConcreteEntityTypes, ElementAspectProps, ElementProps, EntityReference, IModel, IModelError,\n PrimitiveTypeCode, PropertyMetaData, RelatedElement, RelatedElementProps,\n} from \"@itwin/core-common\";\nimport {\n Element, ElementAspect, EntityReferences, IModelElementCloneContext, IModelJsNative, SQLiteDb,\n} from \"@itwin/core-backend\";\nimport { ECReferenceTypesCache } from \"./ECReferenceTypesCache\";\nimport { EntityUnifier } from \"./EntityUnifier\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelCloneContext;\n\n/** The context for transforming a *source* Element to a *target* Element and remapping internal identifiers to the target iModel.\n * @beta\n */\nexport class IModelCloneContext extends IModelElementCloneContext {\n\n private _refTypesCache = new ECReferenceTypesCache();\n private _aspectRemapTable = new Map<Id64String, Id64String>();\n\n /** perform necessary initialization to use a clone context, namely caching the reference types in the source's schemas */\n public override async initialize() {\n await this._refTypesCache.initAllSchemasInIModel(this.sourceDb);\n }\n\n /** Clone the specified source Element into ElementProps for the target iModel.\n * @internal\n */\n public override cloneElement(sourceElement: Element, cloneOptions?: IModelJsNative.CloneElementOptions): ElementProps {\n const targetElementProps: ElementProps = this[\"_nativeContext\"].cloneElement(sourceElement.id, cloneOptions);\n // Ensure that all NavigationProperties in targetElementProps have a defined value so \"clearing\" changes will be part of the JSON used for update\n sourceElement.forEachProperty((propertyName: string, meta: PropertyMetaData) => {\n if ((meta.isNavigation) && (undefined === (sourceElement as any)[propertyName])) {\n (targetElementProps as any)[propertyName] = RelatedElement.none;\n }\n }, false); // exclude custom because C++ has already handled them\n if (this.isBetweenIModels) {\n // The native C++ cloneElement strips off federationGuid, want to put it back if transformation is between iModels\n targetElementProps.federationGuid = sourceElement.federationGuid;\n const targetElementCodeScopeType = this.targetDb.codeSpecs.getById(targetElementProps.code.spec).scopeType;\n if (CodeScopeSpec.Type.Repository === targetElementCodeScopeType && targetElementProps.code.scope !== IModel.rootSubjectId) {\n Logger.logWarning(loggerCategory, `Incorrect CodeScope '${targetElementCodeScopeType}' is set for target element ${targetElementProps.id}`);\n }\n }\n // unlike other references, code cannot be null. If it is null, use an empty code instead\n // this will be updated back later as the transformer resolves references\n if (targetElementProps.code.scope === Id64.invalid || targetElementProps.code.spec === Id64.invalid) {\n targetElementProps.code = Code.createEmpty();\n }\n const jsClass = this.sourceDb.getJsClass<typeof Element>(sourceElement.classFullName);\n jsClass[\"onCloned\"](this, sourceElement.toJSON(), targetElementProps);\n return targetElementProps;\n }\n\n /** Add a rule that remaps the specified source ElementAspect to the specified target ElementAspect. */\n public remapElementAspect(aspectSourceId: Id64String, aspectTargetId: Id64String): void {\n this._aspectRemapTable.set(aspectSourceId, aspectTargetId);\n }\n\n /** Remove a rule that remaps the specified source ElementAspect */\n public removeElementAspect(aspectSourceId: Id64String): void {\n this._aspectRemapTable.delete(aspectSourceId);\n }\n\n /** Look up a target AspectId from the source AspectId.\n * @returns the target AspectId or [Id64.invalid]($bentley) if a mapping not found.\n */\n public findTargetAspectId(sourceAspectId: Id64String): Id64String {\n return this._aspectRemapTable.get(sourceAspectId) ?? Id64.invalid;\n }\n\n /** Look up a target [EntityReference]($bentley) from a source [EntityReference]($bentley)\n * @returns the target CodeSpecId or a [EntityReference]($bentley) containing [Id64.invalid]($bentley) if a mapping is not found.\n */\n public findTargetEntityId(sourceEntityId: EntityReference): EntityReference {\n const [type, rawId] = EntityReferences.split(sourceEntityId);\n if (Id64.isValid(rawId)) {\n switch (type) {\n case ConcreteEntityTypes.Model: {\n const targetId = `m${this.findTargetElementId(rawId)}` as const;\n // Check if the model exists, `findTargetElementId` may have worked because the element exists when the model doesn't.\n // That can occur in the transformer since a submodeled element is imported before its submodel.\n if (EntityUnifier.exists(this.targetDb, { entityReference: targetId }))\n return targetId;\n break;\n }\n case ConcreteEntityTypes.Element:\n return `e${this.findTargetElementId(rawId)}`;\n case ConcreteEntityTypes.ElementAspect:\n return `a${this.findTargetAspectId(rawId)}`;\n case ConcreteEntityTypes.Relationship: {\n const makeGetConcreteEntityTypeSql = (property: string) => `\n CASE\n WHEN [${property}] IS (BisCore.ElementUniqueAspect) OR [${property}] IS (BisCore.ElementMultiAspect)\n THEN 'a'\n WHEN [${property}] IS (BisCore.Element)\n THEN 'e'\n WHEN [${property}] IS (BisCore.Model)\n THEN 'm'\n WHEN [${property}] IS (BisCore.CodeSpec)\n THEN 'c'\n WHEN [${property}] IS (BisCore.ElementRefersToElements) -- TODO: ElementDrivesElement still not handled by the transformer\n THEN 'r'\n ELSE 'error'\n END\n `;\n const relInSource = this.sourceDb.withPreparedStatement(\n `\n SELECT\n SourceECInstanceId,\n TargetECInstanceId,\n (${makeGetConcreteEntityTypeSql(\"SourceECClassId\")}) AS SourceType,\n (${makeGetConcreteEntityTypeSql(\"TargetECClassId\")}) AS TargetType\n FROM BisCore:ElementRefersToElements\n WHERE ECInstanceId=?\n `, (stmt) => {\n stmt.bindId(1, rawId);\n let status: DbResult;\n while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) {\n const sourceId = stmt.getValue(0).getId();\n const targetId = stmt.getValue(1).getId();\n const sourceType = stmt.getValue(2).getString() as ConcreteEntityTypes | \"error\";\n const targetType = stmt.getValue(3).getString() as ConcreteEntityTypes | \"error\";\n if (sourceType === \"error\" || targetType === \"error\")\n throw Error(\"relationship end had unknown root class\");\n return {\n sourceId: `${sourceType}${sourceId}`,\n targetId: `${targetType}${targetId}`,\n } as const;\n }\n if (status !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(status, \"unexpected query failure\");\n return undefined;\n });\n if (relInSource === undefined)\n break;\n // just in case prevent recursion\n if (relInSource.sourceId === sourceEntityId || relInSource.targetId === sourceEntityId)\n throw Error(\"link table relationship end was resolved to itself. This should be impossible\");\n const relInTarget = {\n sourceId: this.findTargetEntityId(relInSource.sourceId),\n targetId: this.findTargetEntityId(relInSource.targetId),\n };\n // return a null\n if (!EntityReferences.isValid(relInTarget.sourceId) || !EntityReferences.isValid(relInTarget.targetId))\n break;\n const relInTargetId = this.targetDb.withPreparedStatement(\n `\n SELECT ECInstanceId\n FROM BisCore:ElementRefersToElements\n WHERE SourceECInstanceId=?\n AND TargetECInstanceId=?\n `, (stmt) => {\n stmt.bindId(1, EntityReferences.toId64(relInTarget.sourceId));\n stmt.bindId(2, EntityReferences.toId64(relInTarget.targetId));\n const status: DbResult = stmt.step();\n if (status === DbResult.BE_SQLITE_ROW)\n return stmt.getValue(0).getId();\n if (status !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(status, \"unexpected query failure\");\n return Id64.invalid;\n });\n return `r${relInTargetId}`;\n }\n }\n }\n return `${type}${Id64.invalid}`;\n }\n\n /** Clone the specified source Element into ElementProps for the target iModel.\n * @internal\n */\n public cloneElementAspect(sourceElementAspect: ElementAspect): ElementAspectProps {\n const targetElementAspectProps: ElementAspectProps = sourceElementAspect.toJSON();\n targetElementAspectProps.id = undefined;\n sourceElementAspect.forEachProperty((propertyName, propertyMetaData) => {\n if (propertyMetaData.isNavigation) {\n const sourceNavProp: RelatedElementProps | undefined = sourceElementAspect.asAny[propertyName];\n if (sourceNavProp?.id) {\n const navPropRefType = this._refTypesCache.getNavPropRefType(\n sourceElementAspect.schemaName,\n sourceElementAspect.className,\n propertyName\n );\n assert(navPropRefType !== undefined,`nav prop ref type for '${propertyName}' was not in the cache, this is a bug.`);\n const targetEntityReference = this.findTargetEntityId(EntityReferences.fromEntityType(sourceNavProp.id, navPropRefType));\n const targetEntityId = EntityReferences.toId64(targetEntityReference);\n // spread the property in case toJSON did not deep-clone\n (targetElementAspectProps as any)[propertyName] = { ...(targetElementAspectProps as any)[propertyName], id: targetEntityId };\n }\n } else if ((PrimitiveTypeCode.Long === propertyMetaData.primitiveType) && (\"Id\" === propertyMetaData.extendedType)) {\n (targetElementAspectProps as any)[propertyName] = this.findTargetElementId(sourceElementAspect.asAny[propertyName]);\n }\n });\n return targetElementAspectProps;\n }\n\n private static aspectRemapTableName = \"AspectIdRemaps\";\n\n public override saveStateToDb(db: SQLiteDb): void {\n super.saveStateToDb(db);\n if (DbResult.BE_SQLITE_DONE !== db.executeSQL(\n `CREATE TABLE ${IModelCloneContext.aspectRemapTableName} (Source INTEGER, Target INTEGER)`\n ))\n throw Error(\"Failed to create the aspect remap table in the state database\");\n db.saveChanges();\n db.withPreparedSqliteStatement(\n `INSERT INTO ${IModelCloneContext.aspectRemapTableName} (Source, Target) VALUES (?, ?)`,\n (stmt) => {\n for (const [source, target] of this._aspectRemapTable) {\n stmt.reset();\n stmt.bindId(1, source);\n stmt.bindId(2, target);\n if (DbResult.BE_SQLITE_DONE !== stmt.step())\n throw Error(\"Failed to insert aspect remapping into the state database\");\n }\n });\n }\n\n public override loadStateFromDb(db: SQLiteDb): void {\n super.loadStateFromDb(db);\n // FIXME: test this\n db.withSqliteStatement(`SELECT Source, Target FROM ${IModelCloneContext.aspectRemapTableName}`, (stmt) => {\n let status = DbResult.BE_SQLITE_ERROR;\n while ((status = stmt.step()) === DbResult.BE_SQLITE_ROW) {\n const source = stmt.getValue(0).getId();\n const target = stmt.getValue(1).getId();\n this._aspectRemapTable.set(source, target);\n }\n assert(status === DbResult.BE_SQLITE_DONE);\n });\n }\n}\n"]}
@@ -3,9 +3,9 @@
3
3
  */
4
4
  import { BriefcaseDb, Element, ElementAspect, ElementMultiAspect, ElementUniqueAspect, IModelDb, IModelJsNative, Model, Relationship } from "@itwin/core-backend";
5
5
  import { AccessToken, CompressedId64Set, Id64String } from "@itwin/core-bentley";
6
- import { ChangesetIndexOrId, CodeSpec, FontProps } from "@itwin/core-common";
6
+ import { CodeSpec, FontProps } from "@itwin/core-common";
7
7
  import { Schema, SchemaKey } from "@itwin/ecschema-metadata";
8
- import type { InitFromExternalSourceAspectsArgs } from "./IModelTransformer";
8
+ import type { InitOptions } from "./IModelTransformer";
9
9
  import { ElementAspectsHandler, ExportElementAspectsStrategy } from "./ExportElementAspectsStrategy";
10
10
  /**
11
11
  * @beta
@@ -19,14 +19,26 @@ export interface ExportSchemaResult {
19
19
  * Arguments for [[IModelExporter.exportChanges]]
20
20
  * @public
21
21
  */
22
- export interface ExportChangesOptions extends InitFromExternalSourceAspectsArgs {
22
+ export interface ExportChangesOptions extends InitOptions {
23
23
  /**
24
24
  * Class instance that contains modified elements between 2 versions of an iModel.
25
25
  * If this parameter is not provided, then [[ChangedInstanceIds.initialize]] in [[IModelExporter.exportChanges]]
26
26
  * will be called to discover changed elements.
27
+ * @note mutually exclusive with @see changesetRanges and @see startChangeset, so define one of the three, never more
27
28
  */
28
29
  changedInstanceIds?: ChangedInstanceIds;
30
+ /**
31
+ * An ordered array of changeset index ranges, e.g. [[2,2], [4,5]] is [2,4,5]
32
+ * @note mutually exclusive with @see changedInstanceIds and @see startChangeset, so define one of the three, never more
33
+ */
34
+ changesetRanges?: [number, number][];
29
35
  }
36
+ /**
37
+ * Arguments for [[IModelExporter.initialize]], usually in case you want to query changedata early
38
+ * such as in the case of the IModelTransformer
39
+ * @beta
40
+ */
41
+ export type ExporterInitOptions = ExportChangesOptions;
30
42
  /** Handles the events generated by IModelExporter.
31
43
  * @note Change information is available when `IModelExportHandler` methods are invoked via [IModelExporter.exportChanges]($transformer), but not available when invoked via [IModelExporter.exportAll]($transformer).
32
44
  * @note The handler is intended to be owned by (registered with) and called from the IModelExporter exclusively
@@ -187,6 +199,14 @@ export declare class IModelExporter {
187
199
  * @see registerHandler
188
200
  */
189
201
  constructor(sourceDb: IModelDb, elementAspectsStrategy?: new (source: IModelDb, handler: ElementAspectsHandler) => ExportElementAspectsStrategy);
202
+ /**
203
+ * Initialize prerequisites of exporting. This is implicitly done by any `export*` calls that need initialization
204
+ * which is currently just `exportChanges`.
205
+ * Prefer to not call this explicitly (e.g. just call [[IModelExporter.exportChanges]])
206
+ * @note that if you do call this explicitly, you must do so with the same options that
207
+ * you pass to [[IModelExporter.exportChanges]]
208
+ */
209
+ initialize(options: ExporterInitOptions): Promise<void>;
190
210
  /** Register the handler that will be called by IModelExporter. */
191
211
  registerHandler(handler: IModelExportHandler): void;
192
212
  /** Add a rule to exclude a CodeSpec */
@@ -205,12 +225,17 @@ export declare class IModelExporter {
205
225
  * @note [[exportSchemas]] must be called separately.
206
226
  */
207
227
  exportAll(): Promise<void>;
208
- /**
209
- * Export changes from the source iModel.
228
+ /** Export changes from the source iModel.
229
+ * Inserts, updates, and deletes are determined by inspecting the changeset(s).
230
+ * @note To form a range of versions to process, set `startChangesetId` for the start (inclusive) of the desired
231
+ * range and open the source iModel as of the end (inclusive) of the desired range.
232
+ * @note the changedInstanceIds are just for this call to exportChanges, so you must continue to pass it in
233
+ * for consecutive calls
210
234
  */
211
235
  exportChanges(args?: ExportChangesOptions): Promise<void>;
212
- /** @deprecated in 0.1.x, use a single ExportChangesArgs object instead */
236
+ /** @deprecated in 0.1.x, use a single [[ExportChangesOptions]] object instead */
213
237
  exportChanges(accessToken?: AccessToken, startChangesetId?: string, args?: ExportChangesOptions): Promise<void>;
238
+ private _resetChangeDataOnExport;
214
239
  /** Export schemas from the source iModel.
215
240
  * @note This must be called separately from [[exportAll]] or [[exportChanges]].
216
241
  */
@@ -336,8 +361,6 @@ export interface IModelExporterState {
336
361
  * @beta
337
362
  */
338
363
  export interface ChangedInstanceIdsInitOptions extends ExportChangesOptions {
339
- /** @inheritdoc */
340
- startChangeset: ChangesetIndexOrId;
341
364
  iModel: BriefcaseDb;
342
365
  }
343
366
  /** Class for holding change information.
@@ -1 +1 @@
1
- {"version":3,"file":"IModelExporter.d.ts","sourceRoot":"","sources":["../../src/IModelExporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IModelExporter.d.ts","sourceRoot":"","sources":["../../src/IModelExporter.ts"],"names":[],"mappings":"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"}