@itwin/imodel-transformer 2.0.0-dev.71 → 2.0.0-dev.73
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/README.md +11 -0
- package/lib/Algo.d.ts.map +1 -0
- package/lib/{cjs/Algo.js → Algo.js} +1 -4
- package/lib/Algo.js.map +1 -0
- package/lib/BigMap.d.ts.map +1 -0
- package/lib/{cjs/BigMap.js → BigMap.js} +1 -5
- package/lib/BigMap.js.map +1 -0
- package/lib/BranchProvenanceInitializer.d.ts.map +1 -0
- package/lib/{cjs/BranchProvenanceInitializer.js → BranchProvenanceInitializer.js} +34 -37
- package/lib/BranchProvenanceInitializer.js.map +1 -0
- package/lib/ChangedElementForest.d.ts.map +1 -0
- package/lib/{cjs/ChangedElementForest.js → ChangedElementForest.js} +12 -14
- package/lib/ChangedElementForest.js.map +1 -0
- package/lib/{cjs/ChangesetScanner.d.ts → ChangesetScanner.d.ts} +2 -2
- package/lib/ChangesetScanner.d.ts.map +1 -0
- package/lib/{cjs/ChangesetScanner.js → ChangesetScanner.js} +19 -24
- package/lib/ChangesetScanner.js.map +1 -0
- package/lib/ECReferenceTypesCache.d.ts.map +1 -0
- package/lib/{cjs/ECReferenceTypesCache.js → ECReferenceTypesCache.js} +32 -37
- package/lib/ECReferenceTypesCache.js.map +1 -0
- package/lib/ECSqlReaderAsyncIterableIteratorAdapter.d.ts.map +1 -0
- package/lib/{cjs/ECSqlReaderAsyncIterableIteratorAdapter.js → ECSqlReaderAsyncIterableIteratorAdapter.js} +2 -7
- package/lib/ECSqlReaderAsyncIterableIteratorAdapter.js.map +1 -0
- package/lib/ElementAspectCleanup.d.ts.map +1 -0
- package/lib/{cjs/ElementAspectCleanup.js → ElementAspectCleanup.js} +9 -13
- package/lib/ElementAspectCleanup.js.map +1 -0
- package/lib/ElementAspectExportCoordinator.d.ts.map +1 -0
- package/lib/{cjs/ElementAspectExportCoordinator.js → ElementAspectExportCoordinator.js} +1 -5
- package/lib/ElementAspectExportCoordinator.js.map +1 -0
- package/lib/ElementAspectExportProcessor.d.ts.map +1 -0
- package/lib/{cjs/ElementAspectExportProcessor.js → ElementAspectExportProcessor.js} +10 -14
- package/lib/ElementAspectExportProcessor.js.map +1 -0
- package/lib/ElementBulkDelete.d.ts.map +1 -0
- package/lib/{cjs/ElementBulkDelete.js → ElementBulkDelete.js} +9 -12
- package/lib/{cjs/ElementBulkDelete.js.map → ElementBulkDelete.js.map} +1 -1
- package/lib/EntityExistenceCache.d.ts.map +1 -0
- package/lib/{cjs/EntityExistenceCache.js → EntityExistenceCache.js} +4 -8
- package/lib/EntityExistenceCache.js.map +1 -0
- package/lib/EntityUnifier.d.ts.map +1 -0
- package/lib/{cjs/EntityUnifier.js → EntityUnifier.js} +21 -22
- package/lib/EntityUnifier.js.map +1 -0
- package/lib/{cjs/IModelCloneContext.d.ts → IModelCloneContext.d.ts} +2 -2
- package/lib/IModelCloneContext.d.ts.map +1 -0
- package/lib/{cjs/IModelCloneContext.js → IModelCloneContext.js} +52 -56
- package/lib/IModelCloneContext.js.map +1 -0
- package/lib/{cjs/IModelExporter.d.ts → IModelExporter.d.ts} +1 -1
- package/lib/IModelExporter.d.ts.map +1 -0
- package/lib/{cjs/IModelExporter.js → IModelExporter.js} +156 -161
- package/lib/IModelExporter.js.map +1 -0
- package/lib/{cjs/IModelImporter.d.ts → IModelImporter.d.ts} +3 -3
- package/lib/IModelImporter.d.ts.map +1 -0
- package/lib/{cjs/IModelImporter.js → IModelImporter.js} +104 -109
- package/lib/IModelImporter.js.map +1 -0
- package/lib/IModelTransformContext.d.ts.map +1 -0
- package/lib/IModelTransformContext.js +2 -0
- package/lib/IModelTransformContext.js.map +1 -0
- package/lib/{cjs/IModelTransformer.d.ts → IModelTransformer.d.ts} +6 -6
- package/lib/IModelTransformer.d.ts.map +1 -0
- package/lib/{cjs/IModelTransformer.js → IModelTransformer.js} +240 -276
- package/lib/IModelTransformer.js.map +1 -0
- package/lib/IModelTransformerError.d.ts.map +1 -0
- package/lib/{cjs/IModelTransformerError.js → IModelTransformerError.js} +3 -6
- package/lib/IModelTransformerError.js.map +1 -0
- package/lib/{cjs/ProvenanceManager.d.ts → ProvenanceManager.d.ts} +3 -3
- package/lib/ProvenanceManager.d.ts.map +1 -0
- package/lib/{cjs/ProvenanceManager.js → ProvenanceManager.js} +69 -73
- package/lib/ProvenanceManager.js.map +1 -0
- package/lib/SourceClassKinds.d.ts.map +1 -0
- package/lib/{cjs/SourceClassKinds.js → SourceClassKinds.js} +1 -5
- package/lib/SourceClassKinds.js.map +1 -0
- package/lib/SyncTypeResolver.d.ts.map +1 -0
- package/lib/{cjs/SyncTypeResolver.js → SyncTypeResolver.js} +15 -19
- package/lib/SyncTypeResolver.js.map +1 -0
- package/lib/TransformerLoggerCategory.d.ts.map +1 -0
- package/lib/{cjs/TransformerLoggerCategory.js → TransformerLoggerCategory.js} +2 -5
- package/lib/TransformerLoggerCategory.js.map +1 -0
- package/lib/TransformerPackageMetadata.d.ts.map +1 -0
- package/lib/TransformerPackageMetadata.js +8 -0
- package/lib/TransformerPackageMetadata.js.map +1 -0
- package/lib/{cjs/imodel-transformer.d.ts → imodel-transformer.d.ts} +9 -9
- package/lib/imodel-transformer.d.ts.map +1 -0
- package/lib/imodel-transformer.js +88 -0
- package/lib/imodel-transformer.js.map +1 -0
- package/lib/{cjs/schema-processing → schema-processing}/DynamicSchemaUnionStrategy.d.ts +1 -1
- package/lib/schema-processing/DynamicSchemaUnionStrategy.d.ts.map +1 -0
- package/lib/{cjs/schema-processing → schema-processing}/DynamicSchemaUnionStrategy.js +16 -20
- package/lib/schema-processing/DynamicSchemaUnionStrategy.js.map +1 -0
- package/lib/{cjs/schema-processing → schema-processing}/SchemaProcessingCoordinator.d.ts +2 -2
- package/lib/schema-processing/SchemaProcessingCoordinator.d.ts.map +1 -0
- package/lib/{cjs/schema-processing → schema-processing}/SchemaProcessingCoordinator.js +15 -52
- package/lib/schema-processing/SchemaProcessingCoordinator.js.map +1 -0
- package/lib/schema-processing/SchemaProcessingStrategy.d.ts.map +1 -0
- package/lib/{cjs/schema-processing → schema-processing}/SchemaProcessingStrategy.js +1 -5
- package/lib/schema-processing/SchemaProcessingStrategy.js.map +1 -0
- package/lib/schema-processing.d.ts +7 -0
- package/lib/schema-processing.d.ts.map +1 -0
- package/lib/schema-processing.js +11 -0
- package/lib/schema-processing.js.map +1 -0
- package/package.json +14 -14
- package/lib/cjs/Algo.d.ts.map +0 -1
- package/lib/cjs/Algo.js.map +0 -1
- package/lib/cjs/BigMap.d.ts.map +0 -1
- package/lib/cjs/BigMap.js.map +0 -1
- package/lib/cjs/BranchProvenanceInitializer.d.ts.map +0 -1
- package/lib/cjs/BranchProvenanceInitializer.js.map +0 -1
- package/lib/cjs/ChangedElementForest.d.ts.map +0 -1
- package/lib/cjs/ChangedElementForest.js.map +0 -1
- package/lib/cjs/ChangesetScanner.d.ts.map +0 -1
- package/lib/cjs/ChangesetScanner.js.map +0 -1
- package/lib/cjs/ECReferenceTypesCache.d.ts.map +0 -1
- package/lib/cjs/ECReferenceTypesCache.js.map +0 -1
- package/lib/cjs/ECSqlReaderAsyncIterableIteratorAdapter.d.ts.map +0 -1
- package/lib/cjs/ECSqlReaderAsyncIterableIteratorAdapter.js.map +0 -1
- package/lib/cjs/ElementAspectCleanup.d.ts.map +0 -1
- package/lib/cjs/ElementAspectCleanup.js.map +0 -1
- package/lib/cjs/ElementAspectExportCoordinator.d.ts.map +0 -1
- package/lib/cjs/ElementAspectExportCoordinator.js.map +0 -1
- package/lib/cjs/ElementAspectExportProcessor.d.ts.map +0 -1
- package/lib/cjs/ElementAspectExportProcessor.js.map +0 -1
- package/lib/cjs/ElementBulkDelete.d.ts.map +0 -1
- package/lib/cjs/EntityExistenceCache.d.ts.map +0 -1
- package/lib/cjs/EntityExistenceCache.js.map +0 -1
- package/lib/cjs/EntityUnifier.d.ts.map +0 -1
- package/lib/cjs/EntityUnifier.js.map +0 -1
- package/lib/cjs/IModelCloneContext.d.ts.map +0 -1
- package/lib/cjs/IModelCloneContext.js.map +0 -1
- package/lib/cjs/IModelExporter.d.ts.map +0 -1
- package/lib/cjs/IModelExporter.js.map +0 -1
- package/lib/cjs/IModelImporter.d.ts.map +0 -1
- package/lib/cjs/IModelImporter.js.map +0 -1
- package/lib/cjs/IModelTransformContext.d.ts.map +0 -1
- package/lib/cjs/IModelTransformContext.js +0 -3
- package/lib/cjs/IModelTransformContext.js.map +0 -1
- package/lib/cjs/IModelTransformer.d.ts.map +0 -1
- package/lib/cjs/IModelTransformer.js.map +0 -1
- package/lib/cjs/IModelTransformerError.d.ts.map +0 -1
- package/lib/cjs/IModelTransformerError.js.map +0 -1
- package/lib/cjs/ProvenanceManager.d.ts.map +0 -1
- package/lib/cjs/ProvenanceManager.js.map +0 -1
- package/lib/cjs/SourceClassKinds.d.ts.map +0 -1
- package/lib/cjs/SourceClassKinds.js.map +0 -1
- package/lib/cjs/SyncTypeResolver.d.ts.map +0 -1
- package/lib/cjs/SyncTypeResolver.js.map +0 -1
- package/lib/cjs/TransformerLoggerCategory.d.ts.map +0 -1
- package/lib/cjs/TransformerLoggerCategory.js.map +0 -1
- package/lib/cjs/TransformerPackageMetadata.d.ts.map +0 -1
- package/lib/cjs/TransformerPackageMetadata.js +0 -47
- package/lib/cjs/TransformerPackageMetadata.js.map +0 -1
- package/lib/cjs/imodel-transformer.d.ts.map +0 -1
- package/lib/cjs/imodel-transformer.js +0 -125
- package/lib/cjs/imodel-transformer.js.map +0 -1
- package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.d.ts.map +0 -1
- package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.js.map +0 -1
- package/lib/cjs/schema-processing/SchemaProcessingCoordinator.d.ts.map +0 -1
- package/lib/cjs/schema-processing/SchemaProcessingCoordinator.js.map +0 -1
- package/lib/cjs/schema-processing/SchemaProcessingStrategy.d.ts.map +0 -1
- package/lib/cjs/schema-processing/SchemaProcessingStrategy.js.map +0 -1
- package/lib/cjs/schema-processing.d.ts +0 -7
- package/lib/cjs/schema-processing.d.ts.map +0 -1
- package/lib/cjs/schema-processing.js +0 -27
- package/lib/cjs/schema-processing.js.map +0 -1
- /package/lib/{cjs/Algo.d.ts → Algo.d.ts} +0 -0
- /package/lib/{cjs/BigMap.d.ts → BigMap.d.ts} +0 -0
- /package/lib/{cjs/BranchProvenanceInitializer.d.ts → BranchProvenanceInitializer.d.ts} +0 -0
- /package/lib/{cjs/ChangedElementForest.d.ts → ChangedElementForest.d.ts} +0 -0
- /package/lib/{cjs/ECReferenceTypesCache.d.ts → ECReferenceTypesCache.d.ts} +0 -0
- /package/lib/{cjs/ECSqlReaderAsyncIterableIteratorAdapter.d.ts → ECSqlReaderAsyncIterableIteratorAdapter.d.ts} +0 -0
- /package/lib/{cjs/ElementAspectCleanup.d.ts → ElementAspectCleanup.d.ts} +0 -0
- /package/lib/{cjs/ElementAspectExportCoordinator.d.ts → ElementAspectExportCoordinator.d.ts} +0 -0
- /package/lib/{cjs/ElementAspectExportProcessor.d.ts → ElementAspectExportProcessor.d.ts} +0 -0
- /package/lib/{cjs/ElementBulkDelete.d.ts → ElementBulkDelete.d.ts} +0 -0
- /package/lib/{cjs/EntityExistenceCache.d.ts → EntityExistenceCache.d.ts} +0 -0
- /package/lib/{cjs/EntityUnifier.d.ts → EntityUnifier.d.ts} +0 -0
- /package/lib/{cjs/IModelTransformContext.d.ts → IModelTransformContext.d.ts} +0 -0
- /package/lib/{cjs/IModelTransformerError.d.ts → IModelTransformerError.d.ts} +0 -0
- /package/lib/{cjs/SourceClassKinds.d.ts → SourceClassKinds.d.ts} +0 -0
- /package/lib/{cjs/SyncTypeResolver.d.ts → SyncTypeResolver.d.ts} +0 -0
- /package/lib/{cjs/TransformerLoggerCategory.d.ts → TransformerLoggerCategory.d.ts} +0 -0
- /package/lib/{cjs/TransformerPackageMetadata.d.ts → TransformerPackageMetadata.d.ts} +0 -0
- /package/lib/{cjs/schema-processing → schema-processing}/SchemaProcessingStrategy.d.ts +0 -0
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProvenanceManager = void 0;
|
|
4
1
|
/*---------------------------------------------------------------------------------------------
|
|
5
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
6
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
7
4
|
*--------------------------------------------------------------------------------------------*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const loggerCategory =
|
|
5
|
+
import { ITwinError, Logger, } from "@itwin/core-bentley";
|
|
6
|
+
import { ElementOwnsExternalSourceAspects, ExternalSource, ExternalSourceAspect, ExternalSourceAttachment, FolderLink, SynchronizationConfigLink, } from "@itwin/core-backend";
|
|
7
|
+
import { IModel, QueryBinder, } from "@itwin/core-common";
|
|
8
|
+
import { TransformerLoggerCategory } from "./TransformerLoggerCategory.js";
|
|
9
|
+
import { IModelTransformerError, IModelTransformerErrorScope, } from "./IModelTransformerError.js";
|
|
10
|
+
const loggerCategory = TransformerLoggerCategory.IModelTransformer;
|
|
14
11
|
/**
|
|
15
12
|
* Manages provenance scope aspects and synchronization versioning.
|
|
16
13
|
* Encapsulates all ESA scope management, sync version tracking, and
|
|
17
14
|
* provenance DB direction logic extracted from IModelTransformer.
|
|
18
15
|
* @internal
|
|
19
16
|
*/
|
|
20
|
-
class ProvenanceManager {
|
|
17
|
+
export class ProvenanceManager {
|
|
21
18
|
_context;
|
|
22
19
|
_targetScopeElementId;
|
|
23
20
|
_transformerOptions;
|
|
@@ -41,10 +38,10 @@ class ProvenanceManager {
|
|
|
41
38
|
if (sourceDb.isBriefcase && targetDb.isBriefcase) {
|
|
42
39
|
if (sourceDb.changeset.index === undefined ||
|
|
43
40
|
targetDb.changeset.index === undefined)
|
|
44
|
-
|
|
41
|
+
ITwinError.throwError({
|
|
45
42
|
iTwinErrorId: {
|
|
46
|
-
scope:
|
|
47
|
-
key:
|
|
43
|
+
scope: IModelTransformerErrorScope,
|
|
44
|
+
key: IModelTransformerError.ChangesetIndexUnavailable,
|
|
48
45
|
},
|
|
49
46
|
message: "database has no changeset index",
|
|
50
47
|
});
|
|
@@ -72,7 +69,7 @@ class ProvenanceManager {
|
|
|
72
69
|
and targetecinstanceid=?
|
|
73
70
|
and ecclassid=?
|
|
74
71
|
`;
|
|
75
|
-
const params = new
|
|
72
|
+
const params = new QueryBinder();
|
|
76
73
|
params.bindId(1, targetRelInfo.sourceId);
|
|
77
74
|
params.bindId(2, targetRelInfo.targetId);
|
|
78
75
|
params.bindId(3, await this._targetClassNameToClassId(sourceRelInfo.classFullName));
|
|
@@ -102,16 +99,16 @@ class ProvenanceManager {
|
|
|
102
99
|
const [schemaName, className] = classFullName.indexOf(".") !== -1
|
|
103
100
|
? classFullName.split(".")
|
|
104
101
|
: classFullName.split(":");
|
|
105
|
-
const params = new
|
|
102
|
+
const params = new QueryBinder();
|
|
106
103
|
params.bindString(1, schemaName);
|
|
107
104
|
params.bindString(2, className);
|
|
108
105
|
const result = db.createQueryReader(sql, params, { usePrimaryConn: true });
|
|
109
106
|
if (await result.step())
|
|
110
107
|
return result.current.id;
|
|
111
|
-
|
|
108
|
+
ITwinError.throwError({
|
|
112
109
|
iTwinErrorId: {
|
|
113
|
-
scope:
|
|
114
|
-
key:
|
|
110
|
+
scope: IModelTransformerErrorScope,
|
|
111
|
+
key: IModelTransformerError.RelationshipClassNotFound,
|
|
115
112
|
},
|
|
116
113
|
message: `Could not find class ${classFullName} in the db`,
|
|
117
114
|
});
|
|
@@ -120,15 +117,15 @@ class ProvenanceManager {
|
|
|
120
117
|
/** The element classes that are considered to define provenance in the iModel */
|
|
121
118
|
static get provenanceElementClasses() {
|
|
122
119
|
return [
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
120
|
+
FolderLink,
|
|
121
|
+
SynchronizationConfigLink,
|
|
122
|
+
ExternalSource,
|
|
123
|
+
ExternalSourceAttachment,
|
|
127
124
|
];
|
|
128
125
|
}
|
|
129
126
|
/** The element aspect classes that are considered to define provenance in the iModel */
|
|
130
127
|
static get provenanceElementAspectClasses() {
|
|
131
|
-
return [
|
|
128
|
+
return [ExternalSourceAspect];
|
|
132
129
|
}
|
|
133
130
|
// ── Static provenance queries ──────────────────────────────────────────
|
|
134
131
|
/**
|
|
@@ -140,11 +137,11 @@ class ProvenanceManager {
|
|
|
140
137
|
static async forEachTrackedElement(args) {
|
|
141
138
|
if (args.provenanceDb === args.provenanceSourceDb)
|
|
142
139
|
return;
|
|
143
|
-
if (!args.provenanceDb.containsClass(
|
|
144
|
-
|
|
140
|
+
if (!args.provenanceDb.containsClass(ExternalSourceAspect.classFullName)) {
|
|
141
|
+
ITwinError.throwError({
|
|
145
142
|
iTwinErrorId: {
|
|
146
|
-
scope:
|
|
147
|
-
key:
|
|
143
|
+
scope: IModelTransformerErrorScope,
|
|
144
|
+
key: IModelTransformerError.ProvenanceSchemaUnsupported,
|
|
148
145
|
},
|
|
149
146
|
message: "The BisCore schema version of the target database is too old",
|
|
150
147
|
});
|
|
@@ -204,9 +201,9 @@ class ProvenanceManager {
|
|
|
204
201
|
const runFnInDataFlowDirection = (sourceId, targetId) => args.isReverseSynchronization
|
|
205
202
|
? args.fn(sourceId, targetId)
|
|
206
203
|
: args.fn(targetId, sourceId);
|
|
207
|
-
const params = new
|
|
204
|
+
const params = new QueryBinder();
|
|
208
205
|
params.bindId("scopeId", args.targetScopeElementId);
|
|
209
|
-
params.bindString("kind",
|
|
206
|
+
params.bindString("kind", ExternalSourceAspect.Kind.Element);
|
|
210
207
|
const provenanceReader = args.provenanceDb.createQueryReader(provenanceAspectsQuery, params, { usePrimaryConn: true });
|
|
211
208
|
for await (const row of provenanceReader) {
|
|
212
209
|
// ExternalSourceAspect.Identifier is of type string
|
|
@@ -223,7 +220,7 @@ class ProvenanceManager {
|
|
|
223
220
|
static async queryScopeExternalSourceAspect(dbToQuery, aspectProps) {
|
|
224
221
|
const sql = `
|
|
225
222
|
SELECT ECInstanceId, Version, JsonProperties
|
|
226
|
-
FROM ${
|
|
223
|
+
FROM ${ExternalSourceAspect.classFullName}
|
|
227
224
|
WHERE Element.Id=:elementId
|
|
228
225
|
AND Scope.Id=:scopeId
|
|
229
226
|
AND Kind=:kind
|
|
@@ -232,7 +229,7 @@ class ProvenanceManager {
|
|
|
232
229
|
`;
|
|
233
230
|
if (aspectProps.scope === undefined)
|
|
234
231
|
return undefined;
|
|
235
|
-
const params = new
|
|
232
|
+
const params = new QueryBinder()
|
|
236
233
|
.bindId("elementId", aspectProps.element.id)
|
|
237
234
|
.bindId("scopeId", aspectProps.scope.id)
|
|
238
235
|
.bindString("kind", aspectProps.kind)
|
|
@@ -261,10 +258,10 @@ class ProvenanceManager {
|
|
|
261
258
|
async getProvenanceEditTxn() {
|
|
262
259
|
if (await this._isReverseSynchronization()) {
|
|
263
260
|
if (!this._sourceEditTxn) {
|
|
264
|
-
|
|
261
|
+
ITwinError.throwError({
|
|
265
262
|
iTwinErrorId: {
|
|
266
|
-
scope:
|
|
267
|
-
key:
|
|
263
|
+
scope: IModelTransformerErrorScope,
|
|
264
|
+
key: IModelTransformerError.SourceEditTxnRequired,
|
|
268
265
|
},
|
|
269
266
|
message: "A reverse synchronization requires a sourceEditTxn to write provenance back to the source iModel. " +
|
|
270
267
|
"Pass sourceEditTxn in IModelTransformOptions.",
|
|
@@ -290,11 +287,11 @@ class ProvenanceManager {
|
|
|
290
287
|
async tryGetProvenanceScopeAspect() {
|
|
291
288
|
const scopeProvenanceAspectProps = await ProvenanceManager.queryScopeExternalSourceAspect(await this.getProvenanceDb(), {
|
|
292
289
|
id: undefined,
|
|
293
|
-
classFullName:
|
|
294
|
-
scope: { id:
|
|
295
|
-
kind:
|
|
290
|
+
classFullName: ExternalSourceAspect.classFullName,
|
|
291
|
+
scope: { id: IModel.rootSubjectId },
|
|
292
|
+
kind: ExternalSourceAspect.Kind.Scope,
|
|
296
293
|
element: {
|
|
297
|
-
id: this._targetScopeElementId ??
|
|
294
|
+
id: this._targetScopeElementId ?? IModel.rootSubjectId,
|
|
298
295
|
},
|
|
299
296
|
identifier: (await this.getProvenanceSourceDb()).iModelId,
|
|
300
297
|
});
|
|
@@ -313,14 +310,14 @@ class ProvenanceManager {
|
|
|
313
310
|
const aspectProps = {
|
|
314
311
|
id: undefined,
|
|
315
312
|
version: undefined,
|
|
316
|
-
classFullName:
|
|
313
|
+
classFullName: ExternalSourceAspect.classFullName,
|
|
317
314
|
element: {
|
|
318
315
|
id: this._targetScopeElementId,
|
|
319
|
-
relClassName:
|
|
316
|
+
relClassName: ElementOwnsExternalSourceAspects.classFullName,
|
|
320
317
|
},
|
|
321
|
-
scope: { id:
|
|
318
|
+
scope: { id: IModel.rootSubjectId },
|
|
322
319
|
identifier: sourceProvenanceDb.iModelId,
|
|
323
|
-
kind:
|
|
320
|
+
kind: ExternalSourceAspect.Kind.Scope,
|
|
324
321
|
jsonProperties: undefined,
|
|
325
322
|
};
|
|
326
323
|
const foundEsaProps = await ProvenanceManager.queryScopeExternalSourceAspect(provenanceDb, aspectProps);
|
|
@@ -334,13 +331,13 @@ class ProvenanceManager {
|
|
|
334
331
|
// query without "identifier" to find possible conflicts
|
|
335
332
|
const sql = `
|
|
336
333
|
SELECT ECInstanceId
|
|
337
|
-
FROM ${
|
|
334
|
+
FROM ${ExternalSourceAspect.classFullName}
|
|
338
335
|
WHERE Element.Id=:elementId
|
|
339
336
|
AND Scope.Id=:scopeId
|
|
340
337
|
AND Kind=:kind
|
|
341
338
|
LIMIT 1
|
|
342
339
|
`;
|
|
343
|
-
const params = new
|
|
340
|
+
const params = new QueryBinder();
|
|
344
341
|
params.bindId("elementId", aspectProps.element.id);
|
|
345
342
|
params.bindId("scopeId", aspectProps.scope.id);
|
|
346
343
|
params.bindString("kind", aspectProps.kind);
|
|
@@ -349,10 +346,10 @@ class ProvenanceManager {
|
|
|
349
346
|
});
|
|
350
347
|
const hasConflictingScope = await reader.step();
|
|
351
348
|
if (hasConflictingScope) {
|
|
352
|
-
|
|
349
|
+
ITwinError.throwError({
|
|
353
350
|
iTwinErrorId: {
|
|
354
|
-
scope:
|
|
355
|
-
key:
|
|
351
|
+
scope: IModelTransformerErrorScope,
|
|
352
|
+
key: IModelTransformerError.ProvenanceScopeConflict,
|
|
356
353
|
},
|
|
357
354
|
message: "Provenance scope conflict",
|
|
358
355
|
});
|
|
@@ -374,7 +371,7 @@ class ProvenanceManager {
|
|
|
374
371
|
: undefined;
|
|
375
372
|
const oldProps = JSON.parse(JSON.stringify(aspectProps));
|
|
376
373
|
if (this.handleUnsafeMigrate(aspectProps)) {
|
|
377
|
-
|
|
374
|
+
Logger.logInfo(loggerCategory, "Unsafe migrate made a change to the target scope's external source aspect. Updating aspect in database.", { oldProps, newProps: aspectProps });
|
|
378
375
|
provenanceEditTxn.updateAspect({
|
|
379
376
|
...aspectProps,
|
|
380
377
|
jsonProperties: JSON.stringify(aspectProps.jsonProperties),
|
|
@@ -419,12 +416,12 @@ class ProvenanceManager {
|
|
|
419
416
|
}
|
|
420
417
|
if (aspectProps.jsonProperties.pendingReverseSyncChangesetIndices ===
|
|
421
418
|
undefined) {
|
|
422
|
-
|
|
419
|
+
Logger.logWarning(loggerCategory, "Property pendingReverseSyncChangesetIndices missing on the jsonProperties of the scoping ESA. Setting to [].");
|
|
423
420
|
aspectProps.jsonProperties.pendingReverseSyncChangesetIndices = [];
|
|
424
421
|
madeChange = true;
|
|
425
422
|
}
|
|
426
423
|
if (aspectProps.jsonProperties.pendingSyncChangesetIndices === undefined) {
|
|
427
|
-
|
|
424
|
+
Logger.logWarning(loggerCategory, "Property pendingSyncChangesetIndices missing on the jsonProperties of the scoping ESA. Setting to [].");
|
|
428
425
|
aspectProps.jsonProperties.pendingSyncChangesetIndices = [];
|
|
429
426
|
madeChange = true;
|
|
430
427
|
}
|
|
@@ -457,10 +454,10 @@ class ProvenanceManager {
|
|
|
457
454
|
return { index: -1, id: "" };
|
|
458
455
|
}
|
|
459
456
|
if (version === undefined) {
|
|
460
|
-
|
|
457
|
+
ITwinError.throwError({
|
|
461
458
|
iTwinErrorId: {
|
|
462
|
-
scope:
|
|
463
|
-
key:
|
|
459
|
+
scope: IModelTransformerErrorScope,
|
|
460
|
+
key: IModelTransformerError.SynchronizationVersionMissing,
|
|
464
461
|
},
|
|
465
462
|
message: `Could not find synchronization version in scope aspect. This may be due to the last successful run of the transformer being done with an older version.
|
|
466
463
|
Consider running the transformer with branchRelationshipDataBehavior set to 'unsafe-migrate'`,
|
|
@@ -521,14 +518,14 @@ class ProvenanceManager {
|
|
|
521
518
|
const targetVersion = `${this._context.targetDb.changeset.id};${this._context.targetDb.changeset.index}`;
|
|
522
519
|
if (await this._isReverseSynchronization()) {
|
|
523
520
|
const oldVersion = scopeProps.jsonProperties.reverseSyncVersion;
|
|
524
|
-
|
|
521
|
+
Logger.logInfo(loggerCategory, `updating reverse version from ${oldVersion} to ${sourceVersion}`);
|
|
525
522
|
scopeProps.jsonProperties.reverseSyncVersion = sourceVersion;
|
|
526
523
|
}
|
|
527
524
|
else {
|
|
528
|
-
|
|
525
|
+
Logger.logInfo(loggerCategory, `updating sync version from ${scopeProps.version} to ${sourceVersion}`);
|
|
529
526
|
scopeProps.version = sourceVersion;
|
|
530
527
|
if (initializeReverseSyncVersion) {
|
|
531
|
-
|
|
528
|
+
Logger.logInfo(loggerCategory, `updating reverse sync version from ${scopeProps.jsonProperties.reverseSyncVersion} to ${targetVersion}`);
|
|
532
529
|
scopeProps.jsonProperties.reverseSyncVersion = targetVersion;
|
|
533
530
|
}
|
|
534
531
|
}
|
|
@@ -539,8 +536,8 @@ class ProvenanceManager {
|
|
|
539
536
|
startingChangesetIndices === undefined)
|
|
540
537
|
throw new Error("updateSynchronizationVersion was called without change history");
|
|
541
538
|
const jsonProps = scopeProps.jsonProperties;
|
|
542
|
-
|
|
543
|
-
|
|
539
|
+
Logger.logTrace(loggerCategory, `previous pendingReverseSyncChanges: ${String(jsonProps.pendingReverseSyncChangesetIndices)}`);
|
|
540
|
+
Logger.logTrace(loggerCategory, `previous pendingSyncChanges: ${String(jsonProps.pendingSyncChangesetIndices)}`);
|
|
544
541
|
const pendingSyncChangesetIndicesKey = "pendingSyncChangesetIndices";
|
|
545
542
|
const pendingReverseSyncChangesetIndicesKey = "pendingReverseSyncChangesetIndices";
|
|
546
543
|
let syncChangesetsToClearKey;
|
|
@@ -564,8 +561,8 @@ class ProvenanceManager {
|
|
|
564
561
|
for (let i = startingChangesetIndices.source + 1; i <= this._context.sourceDb.changeset.index + 1; i++)
|
|
565
562
|
jsonProps.pendingReverseSyncChangesetIndices.push(i);
|
|
566
563
|
}
|
|
567
|
-
|
|
568
|
-
|
|
564
|
+
Logger.logTrace(loggerCategory, `new pendingReverseSyncChanges: ${String(jsonProps.pendingReverseSyncChangesetIndices)}`);
|
|
565
|
+
Logger.logTrace(loggerCategory, `new pendingSyncChanges: ${String(jsonProps.pendingSyncChangesetIndices)}`);
|
|
569
566
|
}
|
|
570
567
|
(await this.getProvenanceEditTxn()).updateAspect({
|
|
571
568
|
...scopeProps,
|
|
@@ -586,14 +583,14 @@ class ProvenanceManager {
|
|
|
586
583
|
? targetElementId
|
|
587
584
|
: sourceElementId;
|
|
588
585
|
const aspectProps = {
|
|
589
|
-
classFullName:
|
|
586
|
+
classFullName: ExternalSourceAspect.classFullName,
|
|
590
587
|
element: {
|
|
591
588
|
id: elementId,
|
|
592
|
-
relClassName:
|
|
589
|
+
relClassName: ElementOwnsExternalSourceAspects.classFullName,
|
|
593
590
|
},
|
|
594
591
|
scope: { id: args.targetScopeElementId },
|
|
595
592
|
identifier: aspectIdentifier,
|
|
596
|
-
kind:
|
|
593
|
+
kind: ExternalSourceAspect.Kind.Element,
|
|
597
594
|
version,
|
|
598
595
|
};
|
|
599
596
|
return aspectProps;
|
|
@@ -616,15 +613,15 @@ class ProvenanceManager {
|
|
|
616
613
|
: args.knownEndpoints?.targetRelSourceElementId;
|
|
617
614
|
if (undefined === elementId) {
|
|
618
615
|
const sql = "SELECT SourceECInstanceId FROM bis.ElementRefersToElements WHERE ECInstanceId=?";
|
|
619
|
-
const params = new
|
|
616
|
+
const params = new QueryBinder().bindId(1, provenanceRelInstanceId);
|
|
620
617
|
const reader = provenanceDb.createQueryReader(sql, params, {
|
|
621
618
|
usePrimaryConn: true,
|
|
622
619
|
});
|
|
623
620
|
if (!(await reader.step()))
|
|
624
|
-
|
|
621
|
+
ITwinError.throwError({
|
|
625
622
|
iTwinErrorId: {
|
|
626
|
-
scope:
|
|
627
|
-
key:
|
|
623
|
+
scope: IModelTransformerErrorScope,
|
|
624
|
+
key: IModelTransformerError.RelationshipProvenanceNotFound,
|
|
628
625
|
},
|
|
629
626
|
message: "relationship provenance query returned no rows",
|
|
630
627
|
});
|
|
@@ -634,14 +631,14 @@ class ProvenanceManager {
|
|
|
634
631
|
? { targetRelInstanceId }
|
|
635
632
|
: { provenanceRelInstanceId };
|
|
636
633
|
const aspectProps = {
|
|
637
|
-
classFullName:
|
|
634
|
+
classFullName: ExternalSourceAspect.classFullName,
|
|
638
635
|
element: {
|
|
639
636
|
id: elementId,
|
|
640
|
-
relClassName:
|
|
637
|
+
relClassName: ElementOwnsExternalSourceAspects.classFullName,
|
|
641
638
|
},
|
|
642
639
|
scope: { id: args.targetScopeElementId },
|
|
643
640
|
identifier: aspectIdentifier,
|
|
644
|
-
kind:
|
|
641
|
+
kind: ExternalSourceAspect.Kind.Relationship,
|
|
645
642
|
jsonProperties: JSON.stringify(jsonProperties),
|
|
646
643
|
};
|
|
647
644
|
return aspectProps;
|
|
@@ -682,8 +679,8 @@ class ProvenanceManager {
|
|
|
682
679
|
AND Scope.Id=?
|
|
683
680
|
AND Identifier=?
|
|
684
681
|
`;
|
|
685
|
-
const params = new
|
|
686
|
-
params.bindString(1,
|
|
682
|
+
const params = new QueryBinder();
|
|
683
|
+
params.bindString(1, ExternalSourceAspect.Kind.Relationship);
|
|
687
684
|
params.bindId(2, this._targetScopeElementId);
|
|
688
685
|
params.bindString(3, entityInProvenanceSourceId);
|
|
689
686
|
const result = (await this.getProvenanceDb()).createQueryReader(sql, params, {
|
|
@@ -715,5 +712,4 @@ class ProvenanceManager {
|
|
|
715
712
|
});
|
|
716
713
|
}
|
|
717
714
|
}
|
|
718
|
-
exports.ProvenanceManager = ProvenanceManager;
|
|
719
715
|
//# sourceMappingURL=ProvenanceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProvenanceManager.js","sourceRoot":"","sources":["../src/ProvenanceManager.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 *--------------------------------------------------------------------------------------------*/\nimport {\n GuidString,\n Id64String,\n ITwinError,\n Logger,\n} from \"@itwin/core-bentley\";\nimport {\n EditTxn,\n ElementOwnsExternalSourceAspects,\n type Entity,\n ExternalSource,\n ExternalSourceAspect,\n ExternalSourceAttachment,\n FolderLink,\n IModelDb,\n SynchronizationConfigLink,\n} from \"@itwin/core-backend\";\nimport {\n ChangesetIndexAndId,\n ExternalSourceAspectProps,\n IModel,\n QueryBinder,\n} from \"@itwin/core-common\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory.js\";\nimport type {\n IModelTransformOptions,\n TargetScopeProvenanceJsonProps,\n} from \"./IModelTransformer.js\";\nimport type { SyncTypeResolver } from \"./SyncTypeResolver.js\";\nimport type { IModelTransformContext } from \"./IModelTransformContext.js\";\nimport {\n IModelTransformerError,\n IModelTransformerErrorScope,\n} from \"./IModelTransformerError.js\";\n\nconst loggerCategory: string = TransformerLoggerCategory.IModelTransformer;\n\ntype ProvenanceContext = Pick<IModelTransformContext, \"findTargetElementId\"> & {\n readonly sourceDb: IModelDb;\n readonly targetDb: IModelDb;\n};\n\n/**\n * Manages provenance scope aspects and synchronization versioning.\n * Encapsulates all ESA scope management, sync version tracking, and\n * provenance DB direction logic extracted from IModelTransformer.\n * @internal\n */\nexport class ProvenanceManager {\n private readonly _context: ProvenanceContext;\n private readonly _targetScopeElementId: Id64String;\n private readonly _transformerOptions: IModelTransformOptions;\n private readonly _syncTypeResolver: SyncTypeResolver;\n private readonly _startingChangesetIndices?: {\n target: number;\n source: number;\n };\n\n /** NOTE: the json properties must be converted to string before insertion */\n private _targetScopeProvenanceProps:\n | (Omit<ExternalSourceAspectProps, \"jsonProperties\"> & {\n jsonProperties: TargetScopeProvenanceJsonProps;\n })\n | undefined = undefined;\n\n private _cachedSynchronizationVersion: ChangesetIndexAndId | undefined =\n undefined;\n\n private _targetClassNameToClassIdCache = new Map<string, string>();\n\n private readonly _targetEditTxn: EditTxn;\n private readonly _sourceEditTxn?: EditTxn;\n\n public constructor(\n targetScopeElementId: Id64String,\n transformerOptions: IModelTransformOptions,\n context: ProvenanceContext,\n syncTypeResolver: SyncTypeResolver,\n targetEditTxn: EditTxn,\n sourceEditTxn?: EditTxn\n ) {\n this._targetScopeElementId = targetScopeElementId;\n this._transformerOptions = transformerOptions;\n this._context = context;\n this._syncTypeResolver = syncTypeResolver;\n this._targetEditTxn = targetEditTxn;\n this._sourceEditTxn = sourceEditTxn;\n\n const sourceDb = this._context.sourceDb;\n const targetDb = this._context.targetDb;\n if (sourceDb.isBriefcase && targetDb.isBriefcase) {\n if (\n sourceDb.changeset.index === undefined ||\n targetDb.changeset.index === undefined\n )\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.ChangesetIndexUnavailable,\n },\n message: \"database has no changeset index\",\n });\n this._startingChangesetIndices = {\n target: targetDb.changeset.index,\n source: sourceDb.changeset.index,\n };\n }\n }\n\n private async _isReverseSynchronization(): Promise<boolean> {\n return (await this._syncTypeResolver.getSyncType()) === \"reverse\";\n }\n\n private async _queryTargetRelId(sourceRelInfo: {\n classFullName: string;\n sourceId: Id64String;\n targetId: Id64String;\n }): Promise<Id64String | undefined> {\n const targetRelInfo = {\n sourceId: this._context.findTargetElementId(sourceRelInfo.sourceId),\n targetId: this._context.findTargetElementId(sourceRelInfo.targetId),\n };\n if (\n targetRelInfo.sourceId === undefined ||\n targetRelInfo.targetId === undefined\n )\n return undefined;\n const sql = `\n select ecinstanceid\n from bis.elementreferstoelements\n where sourceecinstanceid=?\n and targetecinstanceid=?\n and ecclassid=?\n `;\n const params = new QueryBinder();\n params.bindId(1, targetRelInfo.sourceId);\n params.bindId(2, targetRelInfo.targetId);\n params.bindId(\n 3,\n await this._targetClassNameToClassId(sourceRelInfo.classFullName)\n );\n const result = this._context.targetDb.createQueryReader(sql, params, {\n usePrimaryConn: true,\n });\n if (await result.step()) return result.current.id;\n else return undefined;\n }\n\n private async _targetClassNameToClassId(\n classFullName: string\n ): Promise<Id64String> {\n let classId = this._targetClassNameToClassIdCache.get(classFullName);\n if (classId === undefined) {\n classId = await this._getRelClassId(\n this._context.targetDb,\n classFullName\n );\n this._targetClassNameToClassIdCache.set(classFullName, classId);\n }\n return classId;\n }\n\n private async _getRelClassId(\n db: IModelDb,\n classFullName: string\n ): Promise<Id64String> {\n const sql = `\n SELECT c.ECInstanceId\n FROM ECDbMeta.ECClassDef c\n JOIN ECDbMeta.ECSchemaDef s ON c.Schema.Id=s.ECInstanceId\n WHERE s.Name=? AND c.Name=?\n `;\n const [schemaName, className] =\n classFullName.indexOf(\".\") !== -1\n ? classFullName.split(\".\")\n : classFullName.split(\":\");\n const params = new QueryBinder();\n params.bindString(1, schemaName);\n params.bindString(2, className);\n const result = db.createQueryReader(sql, params, { usePrimaryConn: true });\n if (await result.step()) return result.current.id;\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.RelationshipClassNotFound,\n },\n message: `Could not find class ${classFullName} in the db`,\n });\n }\n\n // ── Static provenance metadata ──────────────────────────────────────────\n\n /** The element classes that are considered to define provenance in the iModel */\n public static get provenanceElementClasses(): (typeof Entity)[] {\n return [\n FolderLink,\n SynchronizationConfigLink,\n ExternalSource,\n ExternalSourceAttachment,\n ];\n }\n\n /** The element aspect classes that are considered to define provenance in the iModel */\n public static get provenanceElementAspectClasses(): (typeof Entity)[] {\n return [ExternalSourceAspect];\n }\n\n // ── Static provenance queries ──────────────────────────────────────────\n\n /**\n * Iterate all matching federation guids and ExternalSourceAspects in the provenance iModel (target unless reverse sync)\n * and call a function for each one.\n * @note provenance is done by federation guids where possible\n * @note this may execute on each element more than once! Only use in cases where that is handled\n */\n public static async forEachTrackedElement(args: {\n provenanceSourceDb: IModelDb;\n provenanceDb: IModelDb;\n targetScopeElementId: Id64String;\n isReverseSynchronization: boolean;\n fn: (sourceElementId: Id64String, targetElementId: Id64String) => void;\n skipPropagateChangesToRootElements: boolean;\n }): Promise<void> {\n if (args.provenanceDb === args.provenanceSourceDb) return;\n\n if (!args.provenanceDb.containsClass(ExternalSourceAspect.classFullName)) {\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.ProvenanceSchemaUnsupported,\n },\n message: \"The BisCore schema version of the target database is too old\",\n });\n }\n\n const sourceDb = args.isReverseSynchronization\n ? args.provenanceDb\n : args.provenanceSourceDb;\n const targetDb = args.isReverseSynchronization\n ? args.provenanceSourceDb\n : args.provenanceDb;\n\n // query for provenanceDb\n const elementIdByFedGuidQuery = `\n SELECT e.ECInstanceId, FederationGuid\n FROM bis.Element e\n ${\n args.skipPropagateChangesToRootElements\n ? \"WHERE e.ECInstanceId NOT IN (0x1, 0xe, 0x10) -- special static elements\"\n : \"\"\n }\n ORDER BY FederationGuid\n `;\n\n // iterate through sorted list of fed guids from both dbs to get the intersection\n // NOTE: if we exposed the native attach database support,\n // we could get the intersection of fed guids in one query, not sure if it would be faster\n // OR we could do a raw sqlite query...\n\n const sourceReader = sourceDb.createQueryReader(\n elementIdByFedGuidQuery,\n undefined,\n { usePrimaryConn: true }\n );\n const targetReader = targetDb.createQueryReader(\n elementIdByFedGuidQuery,\n undefined,\n { usePrimaryConn: true }\n );\n let hasSourceRow = await sourceReader.step();\n let hasTargetRow = await targetReader.step();\n while (hasSourceRow && hasTargetRow) {\n const sourceFedGuid = sourceReader.current.federationGuid as\n GuidString | undefined;\n const targetFedGuid = targetReader.current.federationGuid as\n GuidString | undefined;\n if (\n sourceFedGuid !== undefined &&\n targetFedGuid !== undefined &&\n sourceFedGuid === targetFedGuid\n ) {\n // data flow direction is always sourceDb -> targetDb and it does not depend on where the explicit element provenance is stored\n args.fn(\n sourceReader.current.id as Id64String,\n targetReader.current.id as Id64String\n );\n }\n if (\n targetFedGuid === undefined ||\n (sourceFedGuid !== undefined && sourceFedGuid >= targetFedGuid)\n ) {\n hasTargetRow = await targetReader.step();\n }\n if (\n sourceFedGuid === undefined ||\n (targetFedGuid !== undefined && sourceFedGuid <= targetFedGuid)\n ) {\n hasSourceRow = await sourceReader.step();\n }\n }\n\n // query for provenanceDb\n const provenanceAspectsQuery = `\n SELECT esa.Identifier, Element.Id\n FROM bis.ExternalSourceAspect esa\n WHERE Scope.Id=:scopeId\n AND Kind=:kind\n ORDER BY esa.Identifier, esa.ECInstanceId DESC\n `;\n\n // Technically this will a second time call the function (as documented) on\n // victims of the old provenance method that have both fedguids and an inserted aspect.\n // But this is a private function with one known caller where that doesn't matter\n\n const runFnInDataFlowDirection = (\n sourceId: Id64String,\n targetId: Id64String\n ) =>\n args.isReverseSynchronization\n ? args.fn(sourceId, targetId)\n : args.fn(targetId, sourceId);\n const params = new QueryBinder();\n params.bindId(\"scopeId\", args.targetScopeElementId);\n params.bindString(\"kind\", ExternalSourceAspect.Kind.Element);\n const provenanceReader = args.provenanceDb.createQueryReader(\n provenanceAspectsQuery,\n params,\n { usePrimaryConn: true }\n );\n for await (const row of provenanceReader) {\n // ExternalSourceAspect.Identifier is of type string\n const aspectIdentifier: Id64String = row[0];\n const elementId: Id64String = row.id;\n runFnInDataFlowDirection(elementId, aspectIdentifier);\n }\n }\n\n /**\n * Queries for an ESA which matches the props in the provided aspectProps.\n * @param dbToQuery db to run the query on\n * @param aspectProps aspectProps to search for\n */\n public static async queryScopeExternalSourceAspect(\n dbToQuery: IModelDb,\n aspectProps: ExternalSourceAspectProps\n ): Promise<\n | {\n aspectId: Id64String;\n version?: string;\n /** stringified json */\n jsonProperties?: string;\n }\n | undefined\n > {\n const sql = `\n SELECT ECInstanceId, Version, JsonProperties\n FROM ${ExternalSourceAspect.classFullName}\n WHERE Element.Id=:elementId\n AND Scope.Id=:scopeId\n AND Kind=:kind\n AND Identifier=:identifier\n LIMIT 1\n `;\n\n if (aspectProps.scope === undefined) return undefined;\n\n const params = new QueryBinder()\n .bindId(\"elementId\", aspectProps.element.id)\n .bindId(\"scopeId\", aspectProps.scope.id)\n .bindString(\"kind\", aspectProps.kind)\n .bindString(\"identifier\", aspectProps.identifier);\n\n return dbToQuery.withQueryReader(\n sql,\n (reader) => {\n if (!reader.step()) return undefined;\n const aspectId = reader.current[0] as Id64String;\n const version = reader.current[1] as string | undefined;\n const jsonProperties = reader.current[2] as string | undefined;\n return { aspectId, version, jsonProperties };\n },\n params\n );\n }\n\n // ── Provenance DB direction ────────────────────────────────────────────\n\n /** Return the IModelDb where provenance is stored (for reads/queries).\n * This will be targetDb except when it is a reverse synchronization, in which case it will be sourceDb.\n */\n private async getProvenanceDb(): Promise<IModelDb> {\n return (await this._isReverseSynchronization())\n ? this._context.sourceDb\n : this._context.targetDb;\n }\n\n /** Return the EditTxn for writing provenance.\n * This will be targetEditTxn except when it is a reverse synchronization, in which case it will be sourceEditTxn.\n */\n public async getProvenanceEditTxn(): Promise<EditTxn> {\n if (await this._isReverseSynchronization()) {\n if (!this._sourceEditTxn) {\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.SourceEditTxnRequired,\n },\n message:\n \"A reverse synchronization requires a sourceEditTxn to write provenance back to the source iModel. \" +\n \"Pass sourceEditTxn in IModelTransformOptions.\",\n });\n }\n return this._sourceEditTxn;\n }\n return this._targetEditTxn;\n }\n\n /** Return the IModelDb where entities referred to by stored provenance live.\n * This will be sourceDb except when it is a reverse synchronization, in which case it will be targetDb.\n */\n public async getProvenanceSourceDb(): Promise<IModelDb> {\n return (await this._isReverseSynchronization())\n ? this._context.targetDb\n : this._context.sourceDb;\n }\n\n // ── Scope aspect management ────────────────────────────────────────────\n\n /**\n * @returns provenance scope aspect if it exists in the provenanceDb.\n * Provenance scope aspect is created and inserted into provenanceDb when [[initScopeProvenance]] is invoked.\n */\n public async tryGetProvenanceScopeAspect(): Promise<\n ExternalSourceAspect | undefined\n > {\n const scopeProvenanceAspectProps =\n await ProvenanceManager.queryScopeExternalSourceAspect(\n await this.getProvenanceDb(),\n {\n id: undefined,\n classFullName: ExternalSourceAspect.classFullName,\n scope: { id: IModel.rootSubjectId },\n kind: ExternalSourceAspect.Kind.Scope,\n element: {\n id: this._targetScopeElementId ?? IModel.rootSubjectId,\n },\n identifier: (await this.getProvenanceSourceDb()).iModelId,\n }\n );\n\n return scopeProvenanceAspectProps !== undefined\n ? ((await this.getProvenanceDb()).elements.getAspect(\n scopeProvenanceAspectProps.aspectId\n ) as ExternalSourceAspect)\n : undefined;\n }\n\n /**\n * Make sure there are no conflicting other scope-type external source aspects on the target scope element.\n * If there are none at all, insert one (this must be a first synchronization).\n */\n public async initScopeProvenance(): Promise<void> {\n const provenanceDb = await this.getProvenanceDb();\n const provenanceEditTxn = await this.getProvenanceEditTxn();\n const sourceProvenanceDb = await this.getProvenanceSourceDb();\n const aspectProps = {\n id: undefined as string | undefined,\n version: undefined as string | undefined,\n classFullName: ExternalSourceAspect.classFullName,\n element: {\n id: this._targetScopeElementId,\n relClassName: ElementOwnsExternalSourceAspects.classFullName,\n },\n scope: { id: IModel.rootSubjectId },\n identifier: sourceProvenanceDb.iModelId,\n kind: ExternalSourceAspect.Kind.Scope,\n jsonProperties: undefined as TargetScopeProvenanceJsonProps | undefined,\n };\n\n const foundEsaProps =\n await ProvenanceManager.queryScopeExternalSourceAspect(\n provenanceDb,\n aspectProps\n );\n\n if (foundEsaProps === undefined) {\n aspectProps.version = \"\";\n aspectProps.jsonProperties = {\n pendingReverseSyncChangesetIndices: [],\n pendingSyncChangesetIndices: [],\n reverseSyncVersion: \"\",\n };\n\n // query without \"identifier\" to find possible conflicts\n const sql = `\n SELECT ECInstanceId\n FROM ${ExternalSourceAspect.classFullName}\n WHERE Element.Id=:elementId\n AND Scope.Id=:scopeId\n AND Kind=:kind\n LIMIT 1\n `;\n\n const params = new QueryBinder();\n params.bindId(\"elementId\", aspectProps.element.id);\n params.bindId(\"scopeId\", aspectProps.scope.id);\n params.bindString(\"kind\", aspectProps.kind);\n const reader = provenanceDb.createQueryReader(sql, params, {\n usePrimaryConn: true,\n });\n const hasConflictingScope = await reader.step();\n\n if (hasConflictingScope) {\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.ProvenanceScopeConflict,\n },\n message: \"Provenance scope conflict\",\n });\n }\n if (!this._transformerOptions.noProvenance) {\n const id = provenanceEditTxn.insertAspect({\n ...aspectProps,\n jsonProperties: JSON.stringify(aspectProps.jsonProperties) as any,\n });\n aspectProps.id = id;\n this.clearCachedSynchronizationVersion();\n }\n } else {\n aspectProps.id = foundEsaProps.aspectId;\n aspectProps.version = foundEsaProps.version;\n aspectProps.jsonProperties = foundEsaProps.jsonProperties\n ? JSON.parse(foundEsaProps.jsonProperties)\n : undefined;\n const oldProps = JSON.parse(JSON.stringify(aspectProps));\n if (this.handleUnsafeMigrate(aspectProps)) {\n Logger.logInfo(\n loggerCategory,\n \"Unsafe migrate made a change to the target scope's external source aspect. Updating aspect in database.\",\n { oldProps, newProps: aspectProps }\n );\n provenanceEditTxn.updateAspect({\n ...aspectProps,\n jsonProperties: JSON.stringify(aspectProps.jsonProperties) as any,\n });\n this.clearCachedSynchronizationVersion();\n }\n }\n\n this._targetScopeProvenanceProps =\n aspectProps as typeof this._targetScopeProvenanceProps;\n }\n\n /** Returns true if a change was made to the aspectProps. */\n private handleUnsafeMigrate(aspectProps: {\n version?: string;\n jsonProperties?: TargetScopeProvenanceJsonProps;\n }): boolean {\n let madeChange = false;\n if (\n this._transformerOptions.branchRelationshipDataBehavior !==\n \"unsafe-migrate\"\n )\n return madeChange;\n const fallbackSyncVersionToUse =\n this._transformerOptions.argsForProcessChanges\n ?.unsafeFallbackSyncVersion ?? \"\";\n const fallbackReverseSyncVersionToUse =\n this._transformerOptions.argsForProcessChanges\n ?.unsafeFallbackReverseSyncVersion ?? \"\";\n\n if (\n aspectProps.version === undefined ||\n (aspectProps.version === \"\" &&\n aspectProps.version !== fallbackSyncVersionToUse)\n ) {\n aspectProps.version = fallbackSyncVersionToUse;\n madeChange = true;\n }\n\n if (aspectProps.jsonProperties === undefined) {\n aspectProps.jsonProperties = {\n pendingReverseSyncChangesetIndices: [],\n pendingSyncChangesetIndices: [],\n reverseSyncVersion: fallbackReverseSyncVersionToUse,\n };\n madeChange = true;\n } else if (\n aspectProps.jsonProperties.reverseSyncVersion === undefined ||\n (aspectProps.jsonProperties.reverseSyncVersion === \"\" &&\n aspectProps.jsonProperties.reverseSyncVersion !==\n fallbackReverseSyncVersionToUse)\n ) {\n aspectProps.jsonProperties.reverseSyncVersion =\n fallbackReverseSyncVersionToUse;\n madeChange = true;\n }\n\n if (\n aspectProps.jsonProperties.pendingReverseSyncChangesetIndices ===\n undefined\n ) {\n Logger.logWarning(\n loggerCategory,\n \"Property pendingReverseSyncChangesetIndices missing on the jsonProperties of the scoping ESA. Setting to [].\"\n );\n aspectProps.jsonProperties.pendingReverseSyncChangesetIndices = [];\n madeChange = true;\n }\n if (aspectProps.jsonProperties.pendingSyncChangesetIndices === undefined) {\n Logger.logWarning(\n loggerCategory,\n \"Property pendingSyncChangesetIndices missing on the jsonProperties of the scoping ESA. Setting to [].\"\n );\n aspectProps.jsonProperties.pendingSyncChangesetIndices = [];\n madeChange = true;\n }\n return madeChange;\n }\n\n // ── Synchronization version ────────────────────────────────────────────\n\n /**\n * We cache the synchronization version to avoid querying the target scoping ESA multiple times.\n * Clears the cached value so the next call to getSynchronizationVersion re-queries.\n */\n public clearCachedSynchronizationVersion() {\n this._cachedSynchronizationVersion = undefined;\n }\n\n /** The changeset version in the scoping element's source version found for this transformation.\n * @note the version depends on whether this is a reverse synchronization or not.\n * @note empty string and -1 for changeset and index if it has never been transformed.\n */\n public async getSynchronizationVersion(): Promise<ChangesetIndexAndId> {\n if (this._cachedSynchronizationVersion === undefined) {\n const provenanceScopeAspect = await this.tryGetProvenanceScopeAspect();\n if (!provenanceScopeAspect) {\n return { index: -1, id: \"\" };\n }\n\n const version = (await this._isReverseSynchronization())\n ? (\n JSON.parse(\n provenanceScopeAspect.jsonProperties ?? \"{}\"\n ) as TargetScopeProvenanceJsonProps\n ).reverseSyncVersion\n : provenanceScopeAspect.version;\n if (\n !version &&\n this._transformerOptions.branchRelationshipDataBehavior ===\n \"unsafe-migrate\"\n ) {\n return { index: -1, id: \"\" };\n }\n if (version === undefined) {\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.SynchronizationVersionMissing,\n },\n message: `Could not find synchronization version in scope aspect. This may be due to the last successful run of the transformer being done with an older version.\n Consider running the transformer with branchRelationshipDataBehavior set to 'unsafe-migrate'`,\n });\n }\n const [id, index] = version === \"\" ? [\"\", -1] : version.split(\";\");\n if (Number.isNaN(Number(index)))\n throw new Error(\"Could not parse version data from scope aspect\");\n this._cachedSynchronizationVersion = { index: Number(index), id };\n }\n return this._cachedSynchronizationVersion;\n }\n\n /**\n * Returns the pending changeset indices to skip for the current synchronization direction.\n * Used by changeset initialization to determine which changesets have already been processed.\n */\n public async getChangesetsToSkip(): Promise<number[]> {\n if (this._targetScopeProvenanceProps === undefined)\n throw new Error(\"_targetScopeProvenanceProps should be set by now\");\n const props = this._targetScopeProvenanceProps;\n return (await this._isReverseSynchronization())\n ? props.jsonProperties.pendingReverseSyncChangesetIndices\n : props.jsonProperties.pendingSyncChangesetIndices;\n }\n\n /**\n * Updates the synchronization version on the scope ESA.\n *\n * Called at the end of a transformation, updates the target scope element to record\n * that transformation up through the source's changeset has been performed. Also stores\n * all changesets that occurred during the transformation as \"pending synchronization\n * changeset indices\" @see TargetScopeProvenanceJsonProps\n *\n * @param initializeReverseSyncVersion When true, saves the reverse sync version as the\n * current changeset of the targetDb. This is typically used for the first transformation\n * between a master and branch iModel. Setting this to true has the effect of making it so\n * any changesets in the branch iModel at the time of the first transformation will be\n * ignored during any future reverse synchronizations from the branch to the master iModel.\n *\n * Note that typically, the reverseSyncVersion is saved as the last changeset merged from\n * the branch into master. Setting initializeReverseSyncVersion to true during a forward\n * transformation could overwrite this correct reverseSyncVersion and should only be done\n * during the first transformation between a master and branch iModel.\n *\n * @param sourceChangeDataState The current state of change data — used to skip updates\n * when there are no changes.\n */\n public async updateSynchronizationVersion({\n initializeReverseSyncVersion = false,\n sourceChangeDataState,\n }: {\n initializeReverseSyncVersion?: boolean;\n sourceChangeDataState:\n \"uninited\" | \"has-changes\" | \"no-changes\" | \"unconnected\";\n }) {\n const shouldSkipSyncVersionUpdate =\n !initializeReverseSyncVersion && sourceChangeDataState !== \"has-changes\";\n if (shouldSkipSyncVersionUpdate) return;\n\n // If noProvenance is set, there's no scope ESA to update\n if (this._transformerOptions.noProvenance) return;\n\n if (this._targetScopeProvenanceProps === undefined)\n throw new Error(\"_targetScopeProvenanceProps should be set by now\");\n const scopeProps = this._targetScopeProvenanceProps;\n\n const sourceVersion = `${this._context.sourceDb.changeset.id};${this._context.sourceDb.changeset.index}`;\n const targetVersion = `${this._context.targetDb.changeset.id};${this._context.targetDb.changeset.index}`;\n\n if (await this._isReverseSynchronization()) {\n const oldVersion = scopeProps.jsonProperties.reverseSyncVersion;\n\n Logger.logInfo(\n loggerCategory,\n `updating reverse version from ${oldVersion} to ${sourceVersion}`\n );\n scopeProps.jsonProperties.reverseSyncVersion = sourceVersion;\n } else {\n Logger.logInfo(\n loggerCategory,\n `updating sync version from ${scopeProps.version} to ${sourceVersion}`\n );\n scopeProps.version = sourceVersion;\n\n if (initializeReverseSyncVersion) {\n Logger.logInfo(\n loggerCategory,\n `updating reverse sync version from ${scopeProps.jsonProperties.reverseSyncVersion} to ${targetVersion}`\n );\n scopeProps.jsonProperties.reverseSyncVersion = targetVersion;\n }\n }\n\n const startingChangesetIndices = this._startingChangesetIndices;\n if (\n !!this._transformerOptions.argsForProcessChanges ||\n (startingChangesetIndices && initializeReverseSyncVersion)\n ) {\n if (\n this._context.targetDb.changeset.index === undefined ||\n startingChangesetIndices === undefined\n )\n throw new Error(\n \"updateSynchronizationVersion was called without change history\"\n );\n\n const jsonProps = scopeProps.jsonProperties;\n\n Logger.logTrace(\n loggerCategory,\n `previous pendingReverseSyncChanges: ${String(jsonProps.pendingReverseSyncChangesetIndices)}`\n );\n Logger.logTrace(\n loggerCategory,\n `previous pendingSyncChanges: ${String(jsonProps.pendingSyncChangesetIndices)}`\n );\n\n const pendingSyncChangesetIndicesKey =\n \"pendingSyncChangesetIndices\" as const;\n const pendingReverseSyncChangesetIndicesKey =\n \"pendingReverseSyncChangesetIndices\" as const;\n\n let syncChangesetsToClearKey;\n let syncChangesetsToUpdateKey;\n\n if (await this._isReverseSynchronization()) {\n syncChangesetsToClearKey = pendingReverseSyncChangesetIndicesKey;\n syncChangesetsToUpdateKey = pendingSyncChangesetIndicesKey;\n } else {\n syncChangesetsToClearKey = pendingSyncChangesetIndicesKey;\n syncChangesetsToUpdateKey = pendingReverseSyncChangesetIndicesKey;\n }\n\n for (\n let i = startingChangesetIndices.target + 1;\n i <= this._context.targetDb.changeset.index + 1;\n i++\n )\n jsonProps[syncChangesetsToUpdateKey].push(i);\n jsonProps[syncChangesetsToClearKey] = jsonProps[\n syncChangesetsToClearKey\n ].filter((csIndex) => {\n return csIndex > startingChangesetIndices.source;\n });\n\n if (await this._isReverseSynchronization()) {\n if (this._context.sourceDb.changeset.index === undefined)\n throw new Error(\"changeset didn't exist\");\n for (\n let i = startingChangesetIndices.source + 1;\n i <= this._context.sourceDb.changeset.index + 1;\n i++\n )\n jsonProps.pendingReverseSyncChangesetIndices.push(i);\n }\n\n Logger.logTrace(\n loggerCategory,\n `new pendingReverseSyncChanges: ${String(jsonProps.pendingReverseSyncChangesetIndices)}`\n );\n Logger.logTrace(\n loggerCategory,\n `new pendingSyncChanges: ${String(jsonProps.pendingSyncChangesetIndices)}`\n );\n }\n\n (await this.getProvenanceEditTxn()).updateAspect({\n ...scopeProps,\n jsonProperties: JSON.stringify(scopeProps.jsonProperties) as any,\n });\n this.clearCachedSynchronizationVersion();\n }\n\n // ── Element/Relationship provenance creation ───────────────────────────\n\n /** Create ExternalSourceAspectProps for an element in an iModel → iModel transformation. */\n public static initElementProvenanceOptions(\n sourceElementId: Id64String,\n targetElementId: Id64String,\n args: {\n sourceDb: IModelDb;\n targetDb: IModelDb;\n isReverseSynchronization: boolean;\n targetScopeElementId: Id64String;\n }\n ): ExternalSourceAspectProps {\n const elementId = args.isReverseSynchronization\n ? sourceElementId\n : targetElementId;\n const version = args.isReverseSynchronization\n ? args.targetDb.elements.queryLastModifiedTime(targetElementId)\n : args.sourceDb.elements.queryLastModifiedTime(sourceElementId);\n const aspectIdentifier = args.isReverseSynchronization\n ? targetElementId\n : sourceElementId;\n const aspectProps: ExternalSourceAspectProps = {\n classFullName: ExternalSourceAspect.classFullName,\n element: {\n id: elementId,\n relClassName: ElementOwnsExternalSourceAspects.classFullName,\n },\n scope: { id: args.targetScopeElementId },\n identifier: aspectIdentifier,\n kind: ExternalSourceAspect.Kind.Element,\n version,\n };\n return aspectProps;\n }\n\n /** Create ExternalSourceAspectProps for a relationship in an iModel → iModel transformation. */\n public static async initRelationshipProvenanceOptions(\n sourceRelInstanceId: Id64String,\n targetRelInstanceId: Id64String,\n args: {\n sourceDb: IModelDb;\n targetDb: IModelDb;\n isReverseSynchronization: boolean;\n targetScopeElementId: Id64String;\n forceOldRelationshipProvenanceMethod: boolean;\n /** Already-known source-endpoint element ids of the relationships, used to skip the\n * per-relationship endpoint query when the caller knows the needed id.\n */\n knownEndpoints?: {\n /** `SourceECInstanceId` of the relationship identified by `sourceRelInstanceId` in `sourceDb`. */\n sourceRelSourceElementId?: Id64String;\n /** `SourceECInstanceId` of the relationship identified by `targetRelInstanceId` in `targetDb`. */\n targetRelSourceElementId?: Id64String;\n };\n }\n ): Promise<ExternalSourceAspectProps> {\n const provenanceDb = args.isReverseSynchronization\n ? args.sourceDb\n : args.targetDb;\n const aspectIdentifier = args.isReverseSynchronization\n ? targetRelInstanceId\n : sourceRelInstanceId;\n const provenanceRelInstanceId = args.isReverseSynchronization\n ? sourceRelInstanceId\n : targetRelInstanceId;\n\n // the provenance relationship lives in the provenanceDb, so its known source-endpoint id is\n // the source rel's on reverse synchronization and the target rel's otherwise\n let elementId = args.isReverseSynchronization\n ? args.knownEndpoints?.sourceRelSourceElementId\n : args.knownEndpoints?.targetRelSourceElementId;\n if (undefined === elementId) {\n const sql =\n \"SELECT SourceECInstanceId FROM bis.ElementRefersToElements WHERE ECInstanceId=?\";\n const params = new QueryBinder().bindId(1, provenanceRelInstanceId);\n const reader = provenanceDb.createQueryReader(sql, params, {\n usePrimaryConn: true,\n });\n if (!(await reader.step()))\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.RelationshipProvenanceNotFound,\n },\n message: \"relationship provenance query returned no rows\",\n });\n elementId = reader.current[0] as Id64String;\n }\n\n const jsonProperties = args.forceOldRelationshipProvenanceMethod\n ? { targetRelInstanceId }\n : { provenanceRelInstanceId };\n\n const aspectProps: ExternalSourceAspectProps = {\n classFullName: ExternalSourceAspect.classFullName,\n element: {\n id: elementId,\n relClassName: ElementOwnsExternalSourceAspects.classFullName,\n },\n scope: { id: args.targetScopeElementId },\n identifier: aspectIdentifier,\n kind: ExternalSourceAspect.Kind.Relationship,\n jsonProperties: JSON.stringify(jsonProperties),\n };\n\n return aspectProps;\n }\n\n /** Create an ExternalSourceAspectProps for an element using this manager's context. */\n public async initElementProvenance(\n sourceElementId: Id64String,\n targetElementId: Id64String\n ): Promise<ExternalSourceAspectProps> {\n return ProvenanceManager.initElementProvenanceOptions(\n sourceElementId,\n targetElementId,\n {\n isReverseSynchronization: await this._isReverseSynchronization(),\n targetScopeElementId: this._targetScopeElementId,\n sourceDb: this._context.sourceDb,\n targetDb: this._context.targetDb,\n }\n );\n }\n\n /** Create an ExternalSourceAspectProps for a relationship using this manager's context. */\n public async initRelationshipProvenance(\n sourceRelInstanceId: Id64String,\n targetRelInstanceId: Id64String,\n forceOldRelationshipProvenanceMethod: boolean,\n knownEndpoints?: {\n sourceRelSourceElementId?: Id64String;\n targetRelSourceElementId?: Id64String;\n }\n ): Promise<ExternalSourceAspectProps> {\n return ProvenanceManager.initRelationshipProvenanceOptions(\n sourceRelInstanceId,\n targetRelInstanceId,\n {\n sourceDb: this._context.sourceDb,\n targetDb: this._context.targetDb,\n isReverseSynchronization: await this._isReverseSynchronization(),\n targetScopeElementId: this._targetScopeElementId,\n forceOldRelationshipProvenanceMethod,\n knownEndpoints,\n }\n );\n }\n\n // ── Provenance queries ─────────────────────────────────────────────────\n\n /**\n * Queries the provenanceDb for an ESA whose identifier matches the provided relationship ID.\n * @param entityInProvenanceSourceId ID of the relationship in the provenanceSourceDb\n * @param sourceRelInfo Source relationship class and endpoint info (for legacy fallback)\n */\n public async queryProvenanceForRelationship(\n entityInProvenanceSourceId: Id64String,\n sourceRelInfo: {\n classFullName: string;\n sourceId: Id64String;\n targetId: Id64String;\n }\n ): Promise<\n | {\n aspectId: Id64String;\n /** if undefined, the relationship could not be found, perhaps it was deleted */\n relationshipId: Id64String | undefined;\n }\n | undefined\n > {\n const sql = `\n SELECT\n ECInstanceId,\n JSON_EXTRACT(JsonProperties, '$.provenanceRelInstanceId') AS provenanceRelInstId\n FROM Bis.ExternalSourceAspect\n WHERE Kind=?\n AND Scope.Id=?\n AND Identifier=?\n `;\n const params = new QueryBinder();\n params.bindString(1, ExternalSourceAspect.Kind.Relationship);\n params.bindId(2, this._targetScopeElementId);\n params.bindString(3, entityInProvenanceSourceId);\n const result = (await this.getProvenanceDb()).createQueryReader(\n sql,\n params,\n {\n usePrimaryConn: true,\n }\n );\n if (await result.step()) {\n const aspectId = result.current.id;\n const provenanceRelInstId = result.current.provenanceRelInstId;\n const provenanceRelInstanceId =\n provenanceRelInstId !== undefined\n ? (provenanceRelInstId as string)\n : await this._queryTargetRelId(sourceRelInfo);\n return {\n aspectId,\n relationshipId: provenanceRelInstanceId,\n };\n } else return undefined;\n }\n\n /** Instance convenience that calls the static forEachTrackedElement with this manager's context. */\n public async forEachTrackedElement(\n fn: (sourceElementId: Id64String, targetElementId: Id64String) => void\n ): Promise<void> {\n return ProvenanceManager.forEachTrackedElement({\n provenanceSourceDb: await this.getProvenanceSourceDb(),\n provenanceDb: await this.getProvenanceDb(),\n targetScopeElementId: this._targetScopeElementId,\n isReverseSynchronization: await this._isReverseSynchronization(),\n fn,\n skipPropagateChangesToRootElements:\n this._transformerOptions.skipPropagateChangesToRootElements ?? true,\n });\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourceClassKinds.d.ts","sourceRoot":"","sources":["../src/SourceClassKinds.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,OAAO,GACP,SAAS,GACT,QAAQ,GACR,sBAAsB,GACtB,cAAc,GACd,qBAAqB,CAAC;AAE1B;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAElE,OAAO,eAEN;IAED,OAAoB,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkDrE;IAED,oHAAoH;IAC7G,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe,GAAG,SAAS,CAEhE;CACF"}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*---------------------------------------------------------------------------------------------
|
|
3
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
4
|
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.SourceClassKinds = void 0;
|
|
8
5
|
/**
|
|
9
6
|
* The [[SourceClassKind]] of every class in an iModel's current schemas that change processing handles.
|
|
10
7
|
* @internal
|
|
11
8
|
*/
|
|
12
|
-
class SourceClassKinds {
|
|
9
|
+
export class SourceClassKinds {
|
|
13
10
|
_kinds;
|
|
14
11
|
constructor(kinds) {
|
|
15
12
|
this._kinds = kinds;
|
|
@@ -56,5 +53,4 @@ class SourceClassKinds {
|
|
|
56
53
|
return this._kinds.get(ecClassId);
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
|
-
exports.SourceClassKinds = SourceClassKinds;
|
|
60
56
|
//# sourceMappingURL=SourceClassKinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourceClassKinds.js","sourceRoot":"","sources":["../src/SourceClassKinds.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAqBhG;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACV,MAAM,CAA2C;IAElE,YAAoB,KAA+C;QACjE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAgB;QACxC,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;YACvC,MAAM,GAAG,GAAiB,EAAE,CAAC;YAC7B,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE;gBACjE,cAAc,EAAE,IAAI;aACrB,CAAC;gBACA,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC7B,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE,CAC9C,QAAQ,CACN,uEAAuE,SAAS,GAAG,CACpF,CAAC;QACJ,MAAM,CACJ,SAAS,EACT,MAAM,EACN,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACrB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpB,WAAW,CAAC,kBAAkB,CAAC;YAC/B,WAAW,CAAC,eAAe,CAAC;YAC5B,WAAW,CAAC,iBAAiB,CAAC;YAC9B,WAAW,CAAC,6BAA6B,CAAC;YAC1C,WAAW,CAAC,4BAA4B,CAAC;YACzC,QAAQ,CACN,2KAA2K,CAC5K;YACD,WAAW,CAAC,iCAAiC,CAAC;YAC9C,WAAW,CAAC,8BAA8B,CAAC;SAC5C,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;QACrD,gIAAgI;QAChI,MAAM,OAAO,GAAsC;YACjD,CAAC,SAAS,EAAE,UAAU,CAAC;YACvB,CAAC,MAAM,EAAE,OAAO,CAAC;YACjB,CAAC,QAAQ,EAAE,SAAS,CAAC;YACrB,CAAC,aAAa,EAAE,QAAQ,CAAC;YACzB,CAAC,YAAY,EAAE,QAAQ,CAAC;YACxB,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;YAC/C,CAAC,aAAa,EAAE,cAAc,CAAC;YAC/B,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;SAC9C,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO;YAC/B,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,oHAAoH;IAC7G,MAAM,CAAC,SAAqB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IModelDb } from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\n\n/**\n * What instances of a source EC class are to change processing.\n * - `relationship`: a `BisCore:ElementRefersToElements` relationship.\n * - `skippedRelationship`: a `BisCore:ElementDrivesElement` relationship, which change processing ignores.\n * - `externalSourceAspect`: exactly `BisCore:ExternalSourceAspect`, not a subclass.\n * @internal\n */\nexport type SourceClassKind =\n | \"codeSpec\"\n | \"model\"\n | \"element\"\n | \"aspect\"\n | \"externalSourceAspect\"\n | \"relationship\"\n | \"skippedRelationship\";\n\n/**\n * The [[SourceClassKind]] of every class in an iModel's current schemas that change processing handles.\n * @internal\n */\nexport class SourceClassKinds {\n private readonly _kinds: ReadonlyMap<Id64String, SourceClassKind>;\n\n private constructor(kinds: ReadonlyMap<Id64String, SourceClassKind>) {\n this._kinds = kinds;\n }\n\n public static async query(iModel: IModelDb): Promise<SourceClassKinds> {\n const classIds = async (ecsql: string) => {\n const ids: Id64String[] = [];\n for await (const row of iModel.createQueryReader(ecsql, undefined, {\n usePrimaryConn: true,\n }))\n ids.push(row.ECInstanceId);\n return ids;\n };\n const subclassIds = async (baseClass: string) =>\n classIds(\n `SELECT ECInstanceId FROM ECDbMeta.ECClassDef WHERE ECInstanceId IS (${baseClass})`\n );\n const [\n codeSpecs,\n models,\n elements,\n uniqueAspects,\n multiAspects,\n externalSourceAspects,\n relationships,\n skippedRelationships,\n ] = await Promise.all([\n subclassIds(\"BisCore.CodeSpec\"),\n subclassIds(\"BisCore.Model\"),\n subclassIds(\"BisCore.Element\"),\n subclassIds(\"BisCore.ElementUniqueAspect\"),\n subclassIds(\"BisCore.ElementMultiAspect\"),\n classIds(\n \"SELECT c.ECInstanceId FROM ECDbMeta.ECClassDef c JOIN ECDbMeta.ECSchemaDef s ON c.Schema.Id = s.ECInstanceId WHERE s.Name = 'BisCore' AND c.Name = 'ExternalSourceAspect'\"\n ),\n subclassIds(\"BisCore.ElementRefersToElements\"),\n subclassIds(\"BisCore.ElementDrivesElement\"),\n ]);\n\n const kinds = new Map<Id64String, SourceClassKind>();\n // Later entries refine earlier ones: ExternalSourceAspect is an aspect, and ElementDrivesElement is an ElementRefersToElements.\n const entries: [Id64String[], SourceClassKind][] = [\n [codeSpecs, \"codeSpec\"],\n [models, \"model\"],\n [elements, \"element\"],\n [uniqueAspects, \"aspect\"],\n [multiAspects, \"aspect\"],\n [externalSourceAspects, \"externalSourceAspect\"],\n [relationships, \"relationship\"],\n [skippedRelationships, \"skippedRelationship\"],\n ];\n for (const [ids, kind] of entries)\n for (const id of ids) kinds.set(id, kind);\n return new SourceClassKinds(kinds);\n }\n\n /** Returns undefined for classes that change processing doesn't handle and for classes missing from the schemas. */\n public kindOf(ecClassId: Id64String): SourceClassKind | undefined {\n return this._kinds.get(ecClassId);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncTypeResolver.d.ts","sourceRoot":"","sources":["../src/SyncTypeResolver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAGL,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAS7B,gBAAgB;AAChB,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1D;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAc,8BAA8B,SAC8L;IAE1O,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAU;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAE3C,YACE,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,UAAU,EAChC,yBAAyB,GAAE,OAAe,EAC1C,eAAe,GAAE,OAAe,EAOjC;IAED;;;;;;;OAOG;IACH,OAAoB,iBAAiB,CACnC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,UAAU,GAC/B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA0ChC;IAED,gEAAgE;IACnD,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CAe5C;CACF"}
|