@itwin/imodel-transformer 0.3.0 → 0.3.18-fedguidopt.5
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 +2 -2
- package/lib/cjs/Algo.d.ts +7 -0
- package/lib/cjs/Algo.d.ts.map +1 -0
- package/lib/cjs/Algo.js +50 -0
- package/lib/cjs/Algo.js.map +1 -0
- package/lib/cjs/IModelCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelCloneContext.js +0 -2
- package/lib/cjs/IModelCloneContext.js.map +1 -1
- package/lib/cjs/IModelExporter.d.ts +31 -8
- package/lib/cjs/IModelExporter.d.ts.map +1 -1
- package/lib/cjs/IModelExporter.js +81 -35
- package/lib/cjs/IModelExporter.js.map +1 -1
- package/lib/cjs/IModelTransformer.d.ts +146 -26
- package/lib/cjs/IModelTransformer.d.ts.map +1 -1
- package/lib/cjs/IModelTransformer.js +884 -212
- package/lib/cjs/IModelTransformer.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Change Log - @itwin/imodel-transformer
|
|
2
2
|
|
|
3
|
-
This log was last generated on Tue, 11 Jul 2023 18:59:
|
|
3
|
+
This log was last generated on Tue, 11 Jul 2023 18:59:25 GMT and should not be manually modified.
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
7
|
## 0.3.0
|
|
8
8
|
|
|
9
|
-
Tue, 11 Jul 2023 18:59:
|
|
9
|
+
Tue, 11 Jul 2023 18:59:25 GMT
|
|
10
10
|
|
|
11
11
|
### Minor changes
|
|
12
12
|
|
|
@@ -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"}
|
package/lib/cjs/Algo.js
ADDED
|
@@ -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"]}
|
|
@@ -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;
|
|
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":";;;AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,iCAAiC;AACjC,sDAAyE;AACzE,oDAK4B;AAC5B,sDAE6B;AAC7B,mEAAgE;AAChE,mDAAgD;AAChD,2EAAwE;AAExE,MAAM,cAAc,GAAW,qDAAyB,CAAC,kBAAkB,CAAC;AAE5E;;GAEG;AACH,MAAa,kBAAmB,SAAQ,wCAAyB;IAAjE;;QAEU,mBAAc,GAAG,IAAI,6CAAqB,EAAE,CAAC;QAC7C,sBAAiB,GAAG,IAAI,GAAG,EAA0B,CAAC;IAsNhE,CAAC;IApNC,0HAA0H;IAC1G,KAAK,CAAC,UAAU;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACa,YAAY,CAAC,aAAsB,EAAE,YAAiD;QACpG,MAAM,kBAAkB,GAAiB,IAAI,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAC7G,iJAAiJ;QACjJ,aAAa,CAAC,eAAe,CAAC,CAAC,YAAoB,EAAE,IAAsB,EAAE,EAAE;YAC7E,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,KAAM,aAAqB,CAAC,YAAY,CAAC,CAAC,EAAE;gBAC9E,kBAA0B,CAAC,YAAY,CAAC,GAAG,4BAAc,CAAC,IAAI,CAAC;aACjE;QACH,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,sDAAsD;QACjE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,kHAAkH;YAClH,kBAAkB,CAAC,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC;YACjE,MAAM,0BAA0B,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;YAC3G,IAAI,2BAAa,CAAC,IAAI,CAAC,UAAU,KAAK,0BAA0B,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,KAAK,oBAAM,CAAC,aAAa,EAAE;gBAC1H,qBAAM,CAAC,UAAU,CAAC,cAAc,EAAE,wBAAwB,0BAA0B,+BAA+B,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;aAC7I;SACF;QACD,yFAAyF;QACzF,yEAAyE;QACzE,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,KAAK,mBAAI,CAAC,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,KAAK,mBAAI,CAAC,OAAO,EAAE;YACnG,kBAAkB,CAAC,IAAI,GAAG,kBAAI,CAAC,WAAW,EAAE,CAAC;SAC9C;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAiB,aAAa,CAAC,aAAa,CAAC,CAAC;QACtF,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACtE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,uGAAuG;IAChG,kBAAkB,CAAC,cAA0B,EAAE,cAA0B;QAC9E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAED,mEAAmE;IAC5D,mBAAmB,CAAC,cAA0B;QACnD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,cAA0B;QAClD,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,mBAAI,CAAC,OAAO,CAAC;IACpE,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,cAA+B;QACvD,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,+BAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7D,IAAI,mBAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACvB,QAAQ,IAAI,EAAE;gBACZ,KAAK,iCAAmB,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAW,CAAC;oBAChE,sHAAsH;oBACtH,gGAAgG;oBAChG,IAAI,6BAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;wBACpE,OAAO,QAAQ,CAAC;oBAClB,MAAM;iBACP;gBACD,KAAK,iCAAmB,CAAC,OAAO;oBAC9B,OAAO,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,KAAK,iCAAmB,CAAC,aAAa;oBACpC,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,KAAK,iCAAmB,CAAC,YAAY,CAAC,CAAC;oBACrC,MAAM,4BAA4B,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC;;sBAE/C,QAAQ,0CAA0C,QAAQ;;sBAE1D,QAAQ;;sBAER,QAAQ;;sBAER,QAAQ;;sBAER,QAAQ;;;;WAInB,CAAC;oBACF,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CACrD;;;;iBAIK,4BAA4B,CAAC,iBAAiB,CAAC;iBAC/C,4BAA4B,CAAC,iBAAiB,CAAC;;;aAGnD,EAAE,CAAC,IAAI,EAAE,EAAE;wBACV,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;wBACtB,IAAI,MAAgB,CAAC;wBACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,uBAAQ,CAAC,aAAa,EAAE;4BACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;4BAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;4BAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAmC,CAAC;4BACjF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAmC,CAAC;4BACjF,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,OAAO;gCAClD,MAAM,KAAK,CAAC,yCAAyC,CAAC,CAAC;4BACzD,OAAO;gCACL,QAAQ,EAAE,GAAG,UAAU,GAAG,QAAQ,EAAE;gCACpC,QAAQ,EAAE,GAAG,UAAU,GAAG,QAAQ,EAAE;6BAC5B,CAAC;yBACZ;wBACD,IAAI,MAAM,KAAK,uBAAQ,CAAC,cAAc;4BACpC,MAAM,IAAI,yBAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;wBAC5D,OAAO,SAAS,CAAC;oBACnB,CAAC,CAAC,CAAC;oBACL,IAAI,WAAW,KAAK,SAAS;wBAC3B,MAAM;oBACR,iCAAiC;oBACjC,IAAI,WAAW,CAAC,QAAQ,KAAK,cAAc,IAAI,WAAW,CAAC,QAAQ,KAAK,cAAc;wBACpF,MAAM,KAAK,CAAC,+EAA+E,CAAC,CAAC;oBAC/F,MAAM,WAAW,GAAG;wBAClB,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC;wBACvD,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC;qBACxD,CAAC;oBACF,gBAAgB;oBAChB,IAAI,CAAC,+BAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,+BAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;wBACpG,MAAM;oBACR,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CACvD;;;;;aAKC,EAAE,CAAC,IAAI,EAAE,EAAE;wBACV,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,+BAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAC9D,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,+BAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAC9D,MAAM,MAAM,GAAa,IAAI,CAAC,IAAI,EAAE,CAAC;wBACrC,IAAI,MAAM,KAAK,uBAAQ,CAAC,aAAa;4BACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;wBAClC,IAAI,MAAM,KAAK,uBAAQ,CAAC,cAAc;4BACpC,MAAM,IAAI,yBAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;wBAC5D,OAAO,mBAAI,CAAC,OAAO,CAAC;oBACtB,CAAC,CAAC,CAAC;oBACL,OAAO,IAAI,aAAa,EAAE,CAAC;iBAC5B;aACF;SACF;QACD,OAAO,GAAG,IAAI,GAAG,mBAAI,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,mBAAkC;QAC1D,MAAM,wBAAwB,GAAuB,mBAAmB,CAAC,MAAM,EAAE,CAAC;QAClF,wBAAwB,CAAC,EAAE,GAAG,SAAS,CAAC;QACxC,mBAAmB,CAAC,eAAe,CAAC,CAAC,YAAY,EAAE,gBAAgB,EAAE,EAAE;YACrE,IAAI,gBAAgB,CAAC,YAAY,EAAE;gBACjC,MAAM,aAAa,GAAoC,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC/F,IAAI,aAAa,EAAE,EAAE,EAAE;oBACrB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAC1D,mBAAmB,CAAC,UAAU,EAC9B,mBAAmB,CAAC,SAAS,EAC7B,YAAY,CACb,CAAC;oBACF,MAAM,CAAC,cAAc,KAAK,SAAS,EAAC,0BAA0B,YAAY,wCAAwC,CAAC,CAAC;oBACpH,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,+BAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;oBACzH,MAAM,cAAc,GAAG,+BAAgB,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;oBACtE,wDAAwD;oBACvD,wBAAgC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAI,wBAAgC,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;iBAC9H;aACF;iBAAM,IAAI,CAAC,+BAAiB,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY,CAAC,EAAE;gBACjH,wBAAgC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;aACrH;QACH,CAAC,CAAC,CAAC;QACH,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAIe,aAAa,CAAC,EAAY;QACxC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,uBAAQ,CAAC,cAAc,KAAK,EAAE,CAAC,UAAU,CAC3C,gBAAgB,kBAAkB,CAAC,oBAAoB,mCAAmC,CAC3F;YACC,MAAM,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,EAAE,CAAC,WAAW,EAAE,CAAC;QACjB,EAAE,CAAC,2BAA2B,CAC5B,eAAe,kBAAkB,CAAC,oBAAoB,iCAAiC,EACvF,CAAC,IAAI,EAAE,EAAE;YACP,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvB,IAAI,uBAAQ,CAAC,cAAc,KAAK,IAAI,CAAC,IAAI,EAAE;oBACzC,MAAM,KAAK,CAAC,2DAA2D,CAAC,CAAC;aAC5E;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAEe,eAAe,CAAC,EAAY;QAC1C,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC1B,mBAAmB;QACnB,EAAE,CAAC,mBAAmB,CAAC,8BAA8B,kBAAkB,CAAC,oBAAoB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;YACvG,IAAI,MAAM,GAAG,uBAAQ,CAAC,eAAe,CAAC;YACtC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,uBAAQ,CAAC,aAAa,EAAE;gBACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAC5C;YACD,MAAM,CAAC,MAAM,KAAK,uBAAQ,CAAC,cAAc,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;;AAxNH,gDAyNC;AAnCgB,uCAAoB,GAAG,gBAAgB,AAAnB,CAAoB","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 {
|
|
6
|
+
import { CodeSpec, FontProps } from "@itwin/core-common";
|
|
7
7
|
import { Schema, SchemaKey } from "@itwin/ecschema-metadata";
|
|
8
|
-
import type {
|
|
8
|
+
import type { InitOptions } from "./IModelTransformer";
|
|
9
9
|
/**
|
|
10
10
|
* @beta
|
|
11
11
|
* The (optional) result of [[IModelExportHandler.onExportSchema]]
|
|
@@ -18,14 +18,26 @@ export interface ExportSchemaResult {
|
|
|
18
18
|
* Arguments for [[IModelExporter.exportChanges]]
|
|
19
19
|
* @public
|
|
20
20
|
*/
|
|
21
|
-
export interface ExportChangesOptions extends
|
|
21
|
+
export interface ExportChangesOptions extends InitOptions {
|
|
22
22
|
/**
|
|
23
23
|
* Class instance that contains modified elements between 2 versions of an iModel.
|
|
24
24
|
* If this parameter is not provided, then [[ChangedInstanceIds.initialize]] in [[IModelExporter.exportChanges]]
|
|
25
25
|
* will be called to discover changed elements.
|
|
26
|
+
* @note mutually exclusive with @see changesetRanges and @see startChangeset, so define one of the three, never more
|
|
26
27
|
*/
|
|
27
28
|
changedInstanceIds?: ChangedInstanceIds;
|
|
29
|
+
/**
|
|
30
|
+
* An ordered array of changeset index ranges, e.g. [[2,2], [4,5]] is [2,4,5]
|
|
31
|
+
* @note mutually exclusive with @see changedInstanceIds and @see startChangeset, so define one of the three, never more
|
|
32
|
+
*/
|
|
33
|
+
changesetRanges?: [number, number][];
|
|
28
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Arguments for [[IModelExporter.initialize]], usually in case you want to query changedata early
|
|
37
|
+
* such as in the case of the IModelTransformer
|
|
38
|
+
* @beta
|
|
39
|
+
*/
|
|
40
|
+
export type ExporterInitOptions = ExportChangesOptions;
|
|
29
41
|
/** Handles the events generated by IModelExporter.
|
|
30
42
|
* @note Change information is available when `IModelExportHandler` methods are invoked via [IModelExporter.exportChanges]($transformer), but not available when invoked via [IModelExporter.exportAll]($transformer).
|
|
31
43
|
* @note The handler is intended to be owned by (registered with) and called from the IModelExporter exclusively
|
|
@@ -188,6 +200,14 @@ export declare class IModelExporter {
|
|
|
188
200
|
* @see registerHandler
|
|
189
201
|
*/
|
|
190
202
|
constructor(sourceDb: IModelDb);
|
|
203
|
+
/**
|
|
204
|
+
* Initialize prerequisites of exporting. This is implicitly done by any `export*` calls that need initialization
|
|
205
|
+
* which is currently just `exportChanges`.
|
|
206
|
+
* Prefer to not call this explicitly (e.g. just call [[IModelExporter.exportChanges]])
|
|
207
|
+
* @note that if you do call this explicitly, you must do so with the same options that
|
|
208
|
+
* you pass to [[IModelExporter.exportChanges]]
|
|
209
|
+
*/
|
|
210
|
+
initialize(options: ExporterInitOptions): Promise<void>;
|
|
191
211
|
/** Register the handler that will be called by IModelExporter. */
|
|
192
212
|
registerHandler(handler: IModelExportHandler): void;
|
|
193
213
|
/** Add a rule to exclude a CodeSpec */
|
|
@@ -206,12 +226,17 @@ export declare class IModelExporter {
|
|
|
206
226
|
* @note [[exportSchemas]] must be called separately.
|
|
207
227
|
*/
|
|
208
228
|
exportAll(): Promise<void>;
|
|
209
|
-
/**
|
|
210
|
-
*
|
|
229
|
+
/** Export changes from the source iModel.
|
|
230
|
+
* Inserts, updates, and deletes are determined by inspecting the changeset(s).
|
|
231
|
+
* @note To form a range of versions to process, set `startChangesetId` for the start (inclusive) of the desired
|
|
232
|
+
* range and open the source iModel as of the end (inclusive) of the desired range.
|
|
233
|
+
* @note the changedInstanceIds are just for this call to exportChanges, so you must continue to pass it in
|
|
234
|
+
* for consecutive calls
|
|
211
235
|
*/
|
|
212
236
|
exportChanges(args?: ExportChangesOptions): Promise<void>;
|
|
213
|
-
/** @deprecated in 0.1.x, use a single
|
|
237
|
+
/** @deprecated in 0.1.x, use a single [[ExportChangesOptions]] object instead */
|
|
214
238
|
exportChanges(accessToken?: AccessToken, startChangesetId?: string, args?: ExportChangesOptions): Promise<void>;
|
|
239
|
+
private _resetChangeDataOnExport;
|
|
215
240
|
/** Export schemas from the source iModel.
|
|
216
241
|
* @note This must be called separately from [[exportAll]] or [[exportChanges]].
|
|
217
242
|
*/
|
|
@@ -338,8 +363,6 @@ export interface IModelExporterState {
|
|
|
338
363
|
* @beta
|
|
339
364
|
*/
|
|
340
365
|
export interface ChangedInstanceIdsInitOptions extends ExportChangesOptions {
|
|
341
|
-
/** @inheritdoc */
|
|
342
|
-
startChangeset: ChangesetIndexOrId;
|
|
343
366
|
iModel: BriefcaseDb;
|
|
344
367
|
}
|
|
345
368
|
/** Class for holding change information.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelExporter.d.ts","sourceRoot":"","sources":["../../src/IModelExporter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EACL,WAAW,EAAqD,OAAO,EAAE,aAAa,EACtF,kBAAkB,EAA2B,mBAAmB,EAAoB,QAAQ,EAChF,cAAc,EAAE,KAAK,EAA2B,YAAY,EACzE,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAU,iBAAiB,EAAkB,UAAU,EAAsC,MAAM,qBAAqB,CAAC;AAC7I,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"IModelExporter.d.ts","sourceRoot":"","sources":["../../src/IModelExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ const core_bentley_1 = require("@itwin/core-bentley");
|
|
|
13
13
|
const core_common_1 = require("@itwin/core-common");
|
|
14
14
|
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
15
15
|
const TransformerLoggerCategory_1 = require("./TransformerLoggerCategory");
|
|
16
|
+
const nodeAssert = require("assert");
|
|
16
17
|
const loggerCategory = TransformerLoggerCategory_1.TransformerLoggerCategory.IModelExporter;
|
|
17
18
|
/** Handles the events generated by IModelExporter.
|
|
18
19
|
* @note Change information is available when `IModelExportHandler` methods are invoked via [IModelExporter.exportChanges]($transformer), but not available when invoked via [IModelExporter.exportAll]($transformer).
|
|
@@ -178,9 +179,24 @@ class IModelExporter {
|
|
|
178
179
|
this._excludedElementAspectClassFullNames = new Set();
|
|
179
180
|
/** The set of classes of Relationships that will be excluded (polymorphically) from transformation to the target iModel. */
|
|
180
181
|
this._excludedRelationshipClasses = new Set();
|
|
182
|
+
this._resetChangeDataOnExport = true;
|
|
181
183
|
this._yieldManager = new core_bentley_1.YieldManager();
|
|
182
184
|
this.sourceDb = sourceDb;
|
|
183
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* Initialize prerequisites of exporting. This is implicitly done by any `export*` calls that need initialization
|
|
188
|
+
* which is currently just `exportChanges`.
|
|
189
|
+
* Prefer to not call this explicitly (e.g. just call [[IModelExporter.exportChanges]])
|
|
190
|
+
* @note that if you do call this explicitly, you must do so with the same options that
|
|
191
|
+
* you pass to [[IModelExporter.exportChanges]]
|
|
192
|
+
*/
|
|
193
|
+
async initialize(options) {
|
|
194
|
+
const hasChangeData = options.startChangeset || options.changesetRanges || options.changedInstanceIds;
|
|
195
|
+
if (this._sourceDbChanges || !this.sourceDb.isBriefcaseDb() || !hasChangeData)
|
|
196
|
+
return;
|
|
197
|
+
this._sourceDbChanges = options.changedInstanceIds
|
|
198
|
+
?? await ChangedInstanceIds.initialize({ iModel: this.sourceDb, ...options });
|
|
199
|
+
}
|
|
184
200
|
/** Register the handler that will be called by IModelExporter. */
|
|
185
201
|
registerHandler(handler) {
|
|
186
202
|
this._handler = handler;
|
|
@@ -214,35 +230,28 @@ class IModelExporter {
|
|
|
214
230
|
* @note [[exportSchemas]] must be called separately.
|
|
215
231
|
*/
|
|
216
232
|
async exportAll() {
|
|
233
|
+
await this.initialize({});
|
|
217
234
|
await this.exportCodeSpecs();
|
|
218
235
|
await this.exportFonts();
|
|
219
236
|
await this.exportModel(core_common_1.IModel.repositoryModelId);
|
|
220
237
|
await this.exportRelationships(core_backend_1.ElementRefersToElements.classFullName);
|
|
221
238
|
}
|
|
222
|
-
async exportChanges(
|
|
239
|
+
async exportChanges(accessTokenOrOpts, startChangesetId) {
|
|
223
240
|
if (!this.sourceDb.isBriefcaseDb())
|
|
224
241
|
throw new core_common_1.IModelError(core_bentley_1.IModelStatus.BadRequest, "Must be a briefcase to export changes");
|
|
225
242
|
if ("" === this.sourceDb.changeset.id) {
|
|
226
243
|
await this.exportAll(); // no changesets, so revert to exportAll
|
|
227
244
|
return;
|
|
228
245
|
}
|
|
229
|
-
const
|
|
230
|
-
?
|
|
246
|
+
const initOpts = typeof accessTokenOrOpts === "object"
|
|
247
|
+
? accessTokenOrOpts
|
|
231
248
|
: {
|
|
232
|
-
accessToken:
|
|
249
|
+
accessToken: accessTokenOrOpts,
|
|
233
250
|
startChangeset: { id: startChangesetId },
|
|
234
251
|
};
|
|
235
|
-
this.
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
: undefined)
|
|
239
|
-
?? await ChangedInstanceIds.initialize({
|
|
240
|
-
accessToken,
|
|
241
|
-
startChangeset: startChangeset?.id !== undefined || startChangeset?.index !== undefined
|
|
242
|
-
? startChangeset
|
|
243
|
-
: this.sourceDb.changeset,
|
|
244
|
-
iModel: this.sourceDb,
|
|
245
|
-
});
|
|
252
|
+
await this.initialize(initOpts);
|
|
253
|
+
// _sourceDbChanges are initialized in this.initialize
|
|
254
|
+
nodeAssert(this._sourceDbChanges !== undefined, "sourceDbChanges must be initialized.");
|
|
246
255
|
await this.exportCodeSpecs();
|
|
247
256
|
await this.exportFonts();
|
|
248
257
|
await this.exportModelContents(core_common_1.IModel.repositoryModelId);
|
|
@@ -276,6 +285,12 @@ class IModelExporter {
|
|
|
276
285
|
this.handler.onDeleteRelationship(relInstanceId);
|
|
277
286
|
}
|
|
278
287
|
}
|
|
288
|
+
// Enable consecutive exportChanges runs without the need to re-instantiate the exporter.
|
|
289
|
+
// You can counteract the obvious impact of losing this expensive data by always calling
|
|
290
|
+
// exportChanges with the [[ExportChangesOptions.changedInstanceIds]] option set to
|
|
291
|
+
// whatever you want
|
|
292
|
+
if (this._resetChangeDataOnExport)
|
|
293
|
+
this._sourceDbChanges = undefined;
|
|
279
294
|
}
|
|
280
295
|
/** Export schemas from the source iModel.
|
|
281
296
|
* @note This must be called separately from [[exportAll]] or [[exportChanges]].
|
|
@@ -549,20 +564,10 @@ class IModelExporter {
|
|
|
549
564
|
core_bentley_1.Logger.logTrace(loggerCategory, `visitElements=false, skipping exportElement(${elementId})`);
|
|
550
565
|
return;
|
|
551
566
|
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
}
|
|
557
|
-
else if (this._sourceDbChanges.element.updateIds.has(elementId)) {
|
|
558
|
-
isUpdate = true;
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
// NOTE: This optimization assumes that the Element will change (LastMod) if an owned ElementAspect changes
|
|
562
|
-
// NOTE: However, child elements may have changed without the parent changing
|
|
563
|
-
return this.exportChildElements(elementId);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
567
|
+
// are we processing changes?
|
|
568
|
+
const isUpdate = this._sourceDbChanges?.element.insertIds.has(elementId) ? false
|
|
569
|
+
: this._sourceDbChanges?.element.updateIds.has(elementId) ? true
|
|
570
|
+
: undefined;
|
|
566
571
|
const element = this.sourceDb.elements.getElement({ id: elementId, wantGeometry: this.wantGeometry, wantBRepData: this.wantGeometry });
|
|
567
572
|
core_bentley_1.Logger.logTrace(loggerCategory, `exportElement(${element.id}, "${element.getDisplayLabel()}")${this.getChangeOpSuffix(isUpdate)}`);
|
|
568
573
|
// the order and `await`ing of calls beyond here is depended upon by the IModelTransformer for a current bug workaround
|
|
@@ -749,6 +754,29 @@ class IModelExporter {
|
|
|
749
754
|
}
|
|
750
755
|
}
|
|
751
756
|
exports.IModelExporter = IModelExporter;
|
|
757
|
+
/**
|
|
758
|
+
* Asserts that the passed in options have exactly one of:
|
|
759
|
+
* startChangeset xor changesetRanges xor changedInstanceIds
|
|
760
|
+
* defined
|
|
761
|
+
*/
|
|
762
|
+
function assertHasChangeDataOptions(opts) {
|
|
763
|
+
const xor = (...args) => {
|
|
764
|
+
let result = false;
|
|
765
|
+
for (const a of args) {
|
|
766
|
+
if (!result && a)
|
|
767
|
+
result = true;
|
|
768
|
+
else if (result && a)
|
|
769
|
+
return false;
|
|
770
|
+
}
|
|
771
|
+
return result;
|
|
772
|
+
};
|
|
773
|
+
nodeAssert(xor(opts.startChangeset, opts.changesetRanges, opts.changedInstanceIds), "exactly one of startChangeset, XOR changesetRanges XOR opts.changedInstanceIds may be defined but "
|
|
774
|
+
+ `received ${JSON.stringify({
|
|
775
|
+
startChangeset: !!opts.startChangeset,
|
|
776
|
+
changesetRanges: !!opts.changesetRanges,
|
|
777
|
+
ChangedInstanceIds: !!opts.changedInstanceIds,
|
|
778
|
+
})}`);
|
|
779
|
+
}
|
|
752
780
|
/** Class for holding change information.
|
|
753
781
|
* @beta
|
|
754
782
|
*/
|
|
@@ -800,13 +828,31 @@ class ChangedInstanceIds {
|
|
|
800
828
|
iModel: iModel,
|
|
801
829
|
startChangeset: { id: startChangesetId },
|
|
802
830
|
};
|
|
803
|
-
|
|
831
|
+
assertHasChangeDataOptions(opts);
|
|
804
832
|
const iModelId = opts.iModel.iModelId;
|
|
805
|
-
const
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
833
|
+
const accessToken = opts.accessToken;
|
|
834
|
+
const changesetRanges = opts.changesetRanges
|
|
835
|
+
?? [[
|
|
836
|
+
// we know startChangeset is defined because of the assert above
|
|
837
|
+
opts.startChangeset.index
|
|
838
|
+
?? (await core_backend_1.IModelHost.hubAccess.queryChangeset({
|
|
839
|
+
iModelId,
|
|
840
|
+
changeset: { id: opts.startChangeset.id ?? opts.iModel.changeset.id },
|
|
841
|
+
accessToken,
|
|
842
|
+
})).index,
|
|
843
|
+
opts.iModel.changeset.index
|
|
844
|
+
?? (await core_backend_1.IModelHost.hubAccess.queryChangeset({
|
|
845
|
+
iModelId,
|
|
846
|
+
changeset: { id: opts.iModel.changeset.id },
|
|
847
|
+
accessToken,
|
|
848
|
+
})).index,
|
|
849
|
+
]];
|
|
850
|
+
core_bentley_1.Logger.logTrace(loggerCategory, `ChangedInstanceIds.initialize ranges: ${changesetRanges.join("|")}`);
|
|
851
|
+
const changesets = (await Promise.all(changesetRanges.map(async ([first, end]) => core_backend_1.IModelHost.hubAccess.downloadChangesets({
|
|
852
|
+
accessToken,
|
|
853
|
+
iModelId, range: { first, end },
|
|
854
|
+
targetDir: core_backend_1.BriefcaseManager.getChangeSetsPath(iModelId),
|
|
855
|
+
})))).flat();
|
|
810
856
|
const changedInstanceIds = new ChangedInstanceIds();
|
|
811
857
|
const changesetFiles = changesets.map((c) => c.pathname);
|
|
812
858
|
const statusOrResult = opts.iModel.nativeDb.extractChangedInstanceIdsFromChangeSets(changesetFiles);
|