@itwin/imodel-transformer 2.0.0-dev.72 → 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
package/README.md
CHANGED
|
@@ -6,6 +6,17 @@ Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md
|
|
|
6
6
|
|
|
7
7
|
The **@itwin/imodel-transformer** package contains classes that handle traversing iModels for exporting and importing their parts.
|
|
8
8
|
|
|
9
|
+
## Module format
|
|
10
|
+
|
|
11
|
+
`@itwin/imodel-transformer` is an ESM-only package. Import its public API from the package root or from `@itwin/imodel-transformer/schema-processing`:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { IModelTransformer } from "@itwin/imodel-transformer";
|
|
15
|
+
import { DynamicSchemaUnionStrategy } from "@itwin/imodel-transformer/schema-processing";
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
CommonJS applications can `require()` the same entry points on the supported Node.js versions. TypeScript projects that compile to CommonJS must use `module` set to `commonjs`, `node20` (TypeScript 5.9 or later), or `nodenext` (TypeScript 5.8 or later); `node16` and `node18` reject `require()` of ES modules. Paths below `lib/`, including the former `lib/cjs/*` output, are not supported entry points.
|
|
19
|
+
|
|
9
20
|
## Documentation
|
|
10
21
|
|
|
11
22
|
See the [iTwin.js](https://www.itwinjs.org) documentation for more information.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Algo.d.ts","sourceRoot":"","sources":["../src/Algo.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EAAE,GAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CA2BpB"}
|
|
@@ -1,4 +1,3 @@
|
|
|
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.
|
|
@@ -6,14 +5,12 @@
|
|
|
6
5
|
/** @packageDocumentation
|
|
7
6
|
* @module Utils
|
|
8
7
|
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.rangesFromRangeAndSkipped = rangesFromRangeAndSkipped;
|
|
11
8
|
/** given a discrete inclusive range [start, end] e.g. [-10, 12] and several "skipped" values", e.g.
|
|
12
9
|
* (-10, 1, -3, 5, 15), return the ordered set of subranges of the original range that exclude
|
|
13
10
|
* those values
|
|
14
11
|
* @internal
|
|
15
12
|
*/
|
|
16
|
-
function rangesFromRangeAndSkipped(start, end, skipped) {
|
|
13
|
+
export function rangesFromRangeAndSkipped(start, end, skipped) {
|
|
17
14
|
function validRange(range) {
|
|
18
15
|
return range[0] <= range[1];
|
|
19
16
|
}
|
package/lib/Algo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Algo.js","sourceRoot":"","sources":["../src/Algo.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAChG;;GAEG;AAEH;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,GAAW,EACX,OAAiB;IAEjB,SAAS,UAAU,CAAC,KAAuB;QACzC,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;IAC5B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,oIAAoI;QACpI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/B,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;YAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;aACnE,IAAI,UAAU,CAAC,UAAU,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU,EAAE,QAA4B;IACnE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAEjD,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC","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 Utils\n */\n\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 * @internal\n */\nexport function rangesFromRangeAndSkipped(\n start: number,\n end: number,\n skipped: number[]\n): [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 for (const skip of skipped) {\n const rangeIndex = findRangeContaining(skip, ranges);\n if (rangeIndex === -1) continue;\n const range = ranges[rangeIndex];\n // If the range we find ourselves in is just a single point (range[0] === range[1]) then we need to remove it if (range[0] === skip)\n if (range[0] === range[1] && skip === range[0])\n ranges.splice(rangeIndex, 1);\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)) ranges.splice(rangeIndex, 1, leftRange);\n else if (validRange(rightRange)) ranges.splice(rangeIndex, 1, rightRange);\n }\n\n return ranges;\n}\n\nfunction findRangeContaining(pt: number, inRanges: [number, number][]): number {\n let begin = 0;\n let end = inRanges.length - 1;\n while (end >= begin) {\n const mid = begin + Math.floor((end - begin) / 2);\n const range = inRanges[mid];\n\n if (pt >= range[0] && pt <= range[1]) return mid;\n\n if (pt < range[0]) {\n end = mid - 1;\n } else {\n begin = mid + 1;\n }\n }\n return -1;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigMap.d.ts","sourceRoot":"","sources":["../src/BigMap.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,KAAK,CAAS;IAEtB,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,cAoBC;IAEM,KAAK,IAAI,IAAI,CAGnB;IAEM,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAOtC;IAEM,OAAO,CACZ,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,IAAI,EACxE,OAAO,CAAC,EAAE,GAAG,GACZ,IAAI,CAIN;IAEM,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS,CAEzC;IAEM,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAEnC;IAEM,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS1C;IAEM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAEvD;IAED,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC,WAE9B;IAEO,OAAO,IAAI,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAK9C;IAEO,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,CAKtC;IAEO,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAK/B;CACF"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BigMap = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* This class serves as a temporary solution to address the issue of the V8 JavaScript engine's Map implementation,
|
|
6
3
|
* which is limited to approximately 16.7 million elements. Currently, only Id64 string representations are
|
|
@@ -8,7 +5,7 @@ exports.BigMap = void 0;
|
|
|
8
5
|
* replace this stopgap with a more robust solution, utilizing a temporary SQLite database (https://github.com/iTwin/imodel-transformer/issues/83).
|
|
9
6
|
* @internal
|
|
10
7
|
*/
|
|
11
|
-
class BigMap {
|
|
8
|
+
export class BigMap {
|
|
12
9
|
_maps;
|
|
13
10
|
_size;
|
|
14
11
|
get size() {
|
|
@@ -95,5 +92,4 @@ class BigMap {
|
|
|
95
92
|
}
|
|
96
93
|
}
|
|
97
94
|
}
|
|
98
|
-
exports.BigMap = BigMap;
|
|
99
95
|
//# sourceMappingURL=BigMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigMap.js","sourceRoot":"","sources":["../src/BigMap.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 Utils\n */\nimport { Id64String } from \"@itwin/core-bentley\";\n\n/**\n * This class serves as a temporary solution to address the issue of the V8 JavaScript engine's Map implementation,\n * which is limited to approximately 16.7 million elements. Currently, only Id64 string representations are\n * supported by this Map; any other type will lead to errors. It's worth noting that our future plan is to\n * replace this stopgap with a more robust solution, utilizing a temporary SQLite database (https://github.com/iTwin/imodel-transformer/issues/83).\n * @internal\n */\nexport class BigMap<V> implements Map<Id64String, V> {\n private _maps: Record<string, Map<string, V>>;\n private _size: number;\n\n public get size(): number {\n return this._size;\n }\n\n public constructor() {\n this._maps = {\n 0: new Map(),\n 1: new Map(),\n 2: new Map(),\n 3: new Map(),\n 4: new Map(),\n 5: new Map(),\n 6: new Map(),\n 7: new Map(),\n 8: new Map(),\n 9: new Map(),\n a: new Map(),\n b: new Map(),\n c: new Map(),\n d: new Map(),\n e: new Map(),\n f: new Map(),\n };\n this._size = 0;\n }\n\n public clear(): void {\n Object.values(this._maps).forEach((m) => m.clear());\n this._size = 0;\n }\n\n public delete(key: Id64String): boolean {\n const wasDeleted = this._maps[key[key.length - 1]].delete(key);\n if (wasDeleted) {\n this._size--;\n }\n\n return wasDeleted;\n }\n\n public forEach(\n callbackfn: (value: V, key: Id64String, map: Map<Id64String, V>) => void,\n thisArg?: any\n ): void {\n Object.values(this._maps).forEach((m) => {\n m.forEach(callbackfn, thisArg);\n });\n }\n\n public get(key: Id64String): V | undefined {\n return this._maps[key[key.length - 1]].get(key);\n }\n\n public has(key: Id64String): boolean {\n return this._maps[key[key.length - 1]].has(key);\n }\n\n public set(key: Id64String, value: V): this {\n const mapForKey = this._maps[key[key.length - 1]];\n if (mapForKey === undefined)\n throw Error(`Tried to set ${key}, but that key has no submap`);\n const beforeSize = mapForKey.size;\n mapForKey.set(key, value);\n const afterSize = mapForKey.size;\n this._size += afterSize - beforeSize;\n return this;\n }\n\n public [Symbol.iterator](): MapIterator<[Id64String, V]> {\n return this.entries();\n }\n\n public get [Symbol.toStringTag]() {\n return \"BigMap\";\n }\n\n public *entries(): MapIterator<[Id64String, V]> {\n const maps = Object.values(this._maps);\n for (const map of maps) {\n for (const [key, value] of map.entries()) yield [key, value];\n }\n }\n\n public *keys(): MapIterator<Id64String> {\n const maps = Object.values(this._maps);\n for (const map of maps) {\n for (const key of map.keys()) yield key;\n }\n }\n\n public *values(): MapIterator<V> {\n const maps = Object.values(this._maps);\n for (const map of maps) {\n for (const value of map.values()) yield value;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchProvenanceInitializer.d.ts","sourceRoot":"","sources":["../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,QAAQ,EAGT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAY,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AAW7E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC;IACjB;;;;;;;OAOG;IACH,uBAAuB,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,kBAAkB,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,UAAU,CAAC;IACjC,sBAAsB,EAAE,UAAU,CAAC;IACnC,sBAAsB,EAAE,UAAU,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAqJ/B"}
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.initializeBranchProvenance = initializeBranchProvenance;
|
|
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
|
-
|
|
14
|
-
|
|
5
|
+
import { BriefcaseDb, EditTxn, ExternalSource, ExternalSourceIsInRepository, IModelDb, RepositoryLink, StandaloneDb, } from "@itwin/core-backend";
|
|
6
|
+
import { DbResult, Logger, OpenMode } from "@itwin/core-bentley";
|
|
7
|
+
import { Code, } from "@itwin/core-common";
|
|
8
|
+
import { strict as assert } from "node:assert";
|
|
9
|
+
import { ProvenanceManager } from "./ProvenanceManager.js";
|
|
10
|
+
import { pathToFileURL } from "node:url";
|
|
11
|
+
import { transformerPackageMetadata } from "./TransformerPackageMetadata.js";
|
|
15
12
|
/**
|
|
16
13
|
* @alpha
|
|
17
14
|
*/
|
|
18
|
-
async function initializeBranchProvenance(args) {
|
|
19
|
-
let editTxn = new
|
|
15
|
+
export async function initializeBranchProvenance(args) {
|
|
16
|
+
let editTxn = new EditTxn(args.branch, "initializeBranchProvenance");
|
|
20
17
|
editTxn.start();
|
|
21
18
|
if (args.createFedGuidsForMaster) {
|
|
22
19
|
// FIXME<LOW>: Consider enforcing that the master and branch dbs passed as part of ProvenanceInitArgs to this function
|
|
@@ -25,27 +22,27 @@ async function initializeBranchProvenance(args) {
|
|
|
25
22
|
UPDATE bis_Element
|
|
26
23
|
SET FederationGuid=randomblob(16)
|
|
27
24
|
WHERE FederationGuid IS NULL
|
|
28
|
-
`, (s) => (
|
|
25
|
+
`, (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.master.getLastError()));
|
|
29
26
|
const masterPath = args.master.pathName;
|
|
30
27
|
const reopenMaster = makeDbReopener(args.master);
|
|
31
28
|
args.master.close(); // prevent busy
|
|
32
|
-
args.branch.withSqliteStatement(`ATTACH DATABASE '${
|
|
29
|
+
args.branch.withSqliteStatement(`ATTACH DATABASE '${pathToFileURL(`${masterPath}`)}?mode=ro' AS master`, (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
|
|
33
30
|
args.branch.withSqliteStatement(`
|
|
34
31
|
UPDATE main.bis_Element
|
|
35
32
|
SET FederationGuid = (
|
|
36
33
|
SELECT m.FederationGuid
|
|
37
34
|
FROM master.bis_Element m
|
|
38
35
|
WHERE m.Id=main.bis_Element.Id
|
|
39
|
-
)`, (s) => (
|
|
36
|
+
)`, (s) => assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
|
|
40
37
|
args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)
|
|
41
38
|
editTxn.saveChanges();
|
|
42
39
|
editTxn.end();
|
|
43
40
|
args.branch.withSqliteStatement("DETACH DATABASE master", (s) => {
|
|
44
41
|
const res = s.step();
|
|
45
|
-
if (res !==
|
|
46
|
-
|
|
42
|
+
if (res !== DbResult.BE_SQLITE_DONE)
|
|
43
|
+
Logger.logTrace("initializeBranchProvenance", `Error detaching db (we will close anyway): ${args.branch.getLastError()}`);
|
|
47
44
|
// this is the case until native side changes
|
|
48
|
-
(
|
|
45
|
+
assert(res === DbResult.BE_SQLITE_ERROR, args.branch.getLastError());
|
|
49
46
|
});
|
|
50
47
|
args.branch.performCheckpoint();
|
|
51
48
|
const reopenBranch = makeDbReopener(args.branch);
|
|
@@ -56,26 +53,26 @@ async function initializeBranchProvenance(args) {
|
|
|
56
53
|
reopenBranch(),
|
|
57
54
|
]);
|
|
58
55
|
// Recreate editTxn on the reopened branch db
|
|
59
|
-
editTxn = new
|
|
56
|
+
editTxn = new EditTxn(args.branch, "initializeBranchProvenance");
|
|
60
57
|
editTxn.start();
|
|
61
58
|
}
|
|
62
59
|
// create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations
|
|
63
60
|
const masterRepoLinkId = editTxn.insertElement({
|
|
64
|
-
classFullName:
|
|
65
|
-
code:
|
|
66
|
-
model:
|
|
61
|
+
classFullName: RepositoryLink.classFullName,
|
|
62
|
+
code: RepositoryLink.createCode(args.branch, IModelDb.repositoryModelId, "example-code-value"),
|
|
63
|
+
model: IModelDb.repositoryModelId,
|
|
67
64
|
url: args.masterUrl,
|
|
68
65
|
format: "iModel",
|
|
69
66
|
repositoryGuid: args.master.iModelId,
|
|
70
67
|
description: args.masterDescription,
|
|
71
68
|
});
|
|
72
69
|
const masterExternalSourceId = editTxn.insertElement({
|
|
73
|
-
classFullName:
|
|
74
|
-
model:
|
|
75
|
-
code:
|
|
76
|
-
repository: new
|
|
77
|
-
connectorName:
|
|
78
|
-
connectorVersion:
|
|
70
|
+
classFullName: ExternalSource.classFullName,
|
|
71
|
+
model: IModelDb.rootSubjectId,
|
|
72
|
+
code: Code.createEmpty(),
|
|
73
|
+
repository: new ExternalSourceIsInRepository(masterRepoLinkId),
|
|
74
|
+
connectorName: transformerPackageMetadata.name,
|
|
75
|
+
connectorVersion: transformerPackageMetadata.version,
|
|
79
76
|
});
|
|
80
77
|
const fedGuidlessElemsSql = `
|
|
81
78
|
SELECT ECInstanceId AS id
|
|
@@ -86,7 +83,7 @@ async function initializeBranchProvenance(args) {
|
|
|
86
83
|
const elemReader = args.branch.createQueryReader(fedGuidlessElemsSql, undefined, { usePrimaryConn: true });
|
|
87
84
|
for await (const row of elemReader) {
|
|
88
85
|
const id = row.id;
|
|
89
|
-
const aspectProps =
|
|
86
|
+
const aspectProps = ProvenanceManager.initElementProvenanceOptions(id, id, {
|
|
90
87
|
isReverseSynchronization: false,
|
|
91
88
|
targetScopeElementId: masterExternalSourceId,
|
|
92
89
|
sourceDb: args.master,
|
|
@@ -106,7 +103,7 @@ async function initializeBranchProvenance(args) {
|
|
|
106
103
|
const relReader = args.branch.createQueryReader(fedGuidlessRelsSql, undefined, { usePrimaryConn: true });
|
|
107
104
|
for await (const row of relReader) {
|
|
108
105
|
const id = row.id;
|
|
109
|
-
const aspectProps = await
|
|
106
|
+
const aspectProps = await ProvenanceManager.initRelationshipProvenanceOptions(id, id, {
|
|
110
107
|
isReverseSynchronization: false,
|
|
111
108
|
targetScopeElementId: masterExternalSourceId,
|
|
112
109
|
sourceDb: args.master,
|
|
@@ -128,18 +125,18 @@ async function initializeBranchProvenance(args) {
|
|
|
128
125
|
};
|
|
129
126
|
}
|
|
130
127
|
function makeDbReopener(db) {
|
|
131
|
-
const originalMode = db.isReadonly ?
|
|
128
|
+
const originalMode = db.isReadonly ? OpenMode.Readonly : OpenMode.ReadWrite;
|
|
132
129
|
const dbPath = db.pathName;
|
|
133
130
|
let reopenDb;
|
|
134
|
-
if (db instanceof
|
|
135
|
-
reopenDb = async (mode = originalMode) =>
|
|
131
|
+
if (db instanceof BriefcaseDb)
|
|
132
|
+
reopenDb = async (mode = originalMode) => BriefcaseDb.open({
|
|
136
133
|
fileName: dbPath,
|
|
137
|
-
readonly: mode ===
|
|
134
|
+
readonly: mode === OpenMode.Readonly,
|
|
138
135
|
});
|
|
139
|
-
else if (db instanceof
|
|
140
|
-
reopenDb = (mode = originalMode) =>
|
|
136
|
+
else if (db instanceof StandaloneDb)
|
|
137
|
+
reopenDb = (mode = originalMode) => StandaloneDb.openFile(dbPath, mode);
|
|
141
138
|
else
|
|
142
|
-
(
|
|
139
|
+
assert(false, `db type '${db.constructor.name}' not supported`);
|
|
143
140
|
return reopenDb;
|
|
144
141
|
}
|
|
145
142
|
//# sourceMappingURL=BranchProvenanceInitializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BranchProvenanceInitializer.js","sourceRoot":"","sources":["../src/BranchProvenanceInitializer.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 BriefcaseDb,\n EditTxn,\n ExternalSource,\n ExternalSourceIsInRepository,\n IModelDb,\n RepositoryLink,\n StandaloneDb,\n} from \"@itwin/core-backend\";\nimport { DbResult, Id64String, Logger, OpenMode } from \"@itwin/core-bentley\";\nimport {\n Code,\n ExternalSourceProps,\n RepositoryLinkProps,\n} from \"@itwin/core-common\";\nimport { strict as assert } from \"node:assert\";\nimport { ProvenanceManager } from \"./ProvenanceManager.js\";\nimport { pathToFileURL } from \"node:url\";\nimport { transformerPackageMetadata } from \"./TransformerPackageMetadata.js\";\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitArgs {\n /** the master iModel which is the source of the provenance */\n master: IModelDb;\n /** the canonical url of the master iModel */\n masterUrl?: string;\n /** the description of the master iModel */\n masterDescription?: string;\n /**\n * @param {IModelDb} branchDb - the branch iModel which is the container of the provenance\n * Must be opened Read/Write\n */\n branch: IModelDb;\n /**\n * insert Federation Guids in all lacking elements in the master database, which will prevent\n * needing to insert External Source Aspects for provenance tracking\n * @note requires a read/write master\n * @note closes both the master and branch iModels to reset caches, so you must reopen them.\n * If you pass `\"keep-reopened-db\"`, this object's `master` and `branch` properties will\n * be set to new, open databases.\n */\n createFedGuidsForMaster?: true | false | \"keep-reopened-db\";\n}\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitResult {\n targetScopeElementId: Id64String;\n masterExternalSourceId: Id64String;\n masterRepositoryLinkId: Id64String;\n}\n\n/**\n * @alpha\n */\nexport async function initializeBranchProvenance(\n args: ProvenanceInitArgs\n): Promise<ProvenanceInitResult> {\n let editTxn = new EditTxn(args.branch, \"initializeBranchProvenance\");\n editTxn.start();\n\n if (args.createFedGuidsForMaster) {\n // FIXME<LOW>: Consider enforcing that the master and branch dbs passed as part of ProvenanceInitArgs to this function\n // are identical. https://github.com/iTwin/imodel-transformer/issues/138\n args.master.withSqliteStatement(\n `\n UPDATE bis_Element\n SET FederationGuid=randomblob(16)\n WHERE FederationGuid IS NULL\n `,\n (s) =>\n assert(s.step() === DbResult.BE_SQLITE_DONE, args.master.getLastError())\n );\n const masterPath = args.master.pathName;\n const reopenMaster = makeDbReopener(args.master);\n args.master.close(); // prevent busy\n args.branch.withSqliteStatement(\n `ATTACH DATABASE '${pathToFileURL(`${masterPath}`)}?mode=ro' AS master`,\n (s) =>\n assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError())\n );\n args.branch.withSqliteStatement(\n `\n UPDATE main.bis_Element\n SET FederationGuid = (\n SELECT m.FederationGuid\n FROM master.bis_Element m\n WHERE m.Id=main.bis_Element.Id\n )`,\n\n (s) =>\n assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError())\n );\n args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)\n editTxn.saveChanges();\n editTxn.end();\n args.branch.withSqliteStatement(\"DETACH DATABASE master\", (s) => {\n const res = s.step();\n if (res !== DbResult.BE_SQLITE_DONE)\n Logger.logTrace(\n \"initializeBranchProvenance\",\n `Error detaching db (we will close anyway): ${args.branch.getLastError()}`\n );\n // this is the case until native side changes\n assert(res === DbResult.BE_SQLITE_ERROR, args.branch.getLastError());\n });\n args.branch.performCheckpoint();\n\n const reopenBranch = makeDbReopener(args.branch);\n // close dbs because element cache could be invalid\n args.branch.close();\n [args.master, args.branch] = await Promise.all([\n reopenMaster(),\n reopenBranch(),\n ]);\n // Recreate editTxn on the reopened branch db\n editTxn = new EditTxn(args.branch, \"initializeBranchProvenance\");\n editTxn.start();\n }\n\n // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations\n const masterRepoLinkId = editTxn.insertElement({\n classFullName: RepositoryLink.classFullName,\n code: RepositoryLink.createCode(\n args.branch,\n IModelDb.repositoryModelId,\n \"example-code-value\"\n ),\n model: IModelDb.repositoryModelId,\n url: args.masterUrl,\n format: \"iModel\",\n repositoryGuid: args.master.iModelId,\n description: args.masterDescription,\n } as RepositoryLinkProps);\n\n const masterExternalSourceId = editTxn.insertElement({\n classFullName: ExternalSource.classFullName,\n model: IModelDb.rootSubjectId,\n code: Code.createEmpty(),\n repository: new ExternalSourceIsInRepository(masterRepoLinkId),\n connectorName: transformerPackageMetadata.name,\n connectorVersion: transformerPackageMetadata.version,\n } as ExternalSourceProps);\n\n const fedGuidlessElemsSql = `\n SELECT ECInstanceId AS id\n FROM Bis.Element\n WHERE FederationGuid IS NULL\n AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */\n `;\n const elemReader = args.branch.createQueryReader(\n fedGuidlessElemsSql,\n undefined,\n { usePrimaryConn: true }\n );\n for await (const row of elemReader) {\n const id: string = row.id;\n const aspectProps = ProvenanceManager.initElementProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n });\n editTxn.insertAspect(aspectProps);\n }\n\n const fedGuidlessRelsSql = `\n SELECT erte.ECInstanceId as id\n FROM Bis.ElementRefersToElements erte\n JOIN bis.Element se\n ON se.ECInstanceId=erte.SourceECInstanceId\n JOIN bis.Element te\n ON te.ECInstanceId=erte.TargetECInstanceId\n WHERE se.FederationGuid IS NULL\n OR te.FederationGuid IS NULL`;\n const relReader = args.branch.createQueryReader(\n fedGuidlessRelsSql,\n undefined,\n { usePrimaryConn: true }\n );\n for await (const row of relReader) {\n const id: string = row.id;\n const aspectProps =\n await ProvenanceManager.initRelationshipProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n forceOldRelationshipProvenanceMethod: false,\n });\n editTxn.insertAspect(aspectProps);\n }\n\n editTxn.saveChanges();\n editTxn.end();\n\n if (args.createFedGuidsForMaster === true) {\n args.master.close();\n args.branch.close();\n }\n\n return {\n targetScopeElementId: masterExternalSourceId,\n masterExternalSourceId,\n masterRepositoryLinkId: masterRepoLinkId,\n };\n}\n\nfunction makeDbReopener(db: IModelDb) {\n const originalMode = db.isReadonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const dbPath = db.pathName;\n let reopenDb: (mode?: OpenMode) => IModelDb | Promise<IModelDb>;\n if (db instanceof BriefcaseDb)\n reopenDb = async (mode = originalMode) =>\n BriefcaseDb.open({\n fileName: dbPath,\n readonly: mode === OpenMode.Readonly,\n });\n else if (db instanceof StandaloneDb)\n reopenDb = (mode = originalMode) => StandaloneDb.openFile(dbPath, mode);\n else assert(false, `db type '${db.constructor.name}' not supported`);\n return reopenDb;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangedElementForest.d.ts","sourceRoot":"","sources":["../src/ChangedElementForest.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAuB,MAAM,qBAAqB,CAAC;AAGtE,mGAAmG;AACnG,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAI9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,eASH;IAEJ,OAAoB,MAAM,CACxB,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,UAAU,EAAE,EAC/B,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAwD3C;IAED,qDAAqD;IAC9C,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE,CAE/D;IAED,+DAA+D;IACxD,WAAW,CAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE,CAE9D;CACF"}
|
|
@@ -1,15 +1,14 @@
|
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
import {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
7
|
+
Element, } from "@itwin/core-backend";
|
|
8
|
+
import { OrderedId64Iterable } from "@itwin/core-bentley";
|
|
9
|
+
import { QueryBinder } from "@itwin/core-common";
|
|
11
10
|
/** The minimal parent-child forest containing changed or excluded elements and their ancestors. */
|
|
12
|
-
class ChangedElementForest {
|
|
11
|
+
export class ChangedElementForest {
|
|
13
12
|
_rootsByModel;
|
|
14
13
|
_childrenByParent;
|
|
15
14
|
constructor(_rootsByModel, _childrenByParent) {
|
|
@@ -23,18 +22,18 @@ class ChangedElementForest {
|
|
|
23
22
|
const sql = `
|
|
24
23
|
WITH RECURSIVE ChangedElementHierarchy (ECInstanceId, ParentId, ModelId) AS (
|
|
25
24
|
SELECT e.ECInstanceId, e.Parent.Id, e.Model.Id
|
|
26
|
-
FROM ${
|
|
25
|
+
FROM ${Element.classFullName} e
|
|
27
26
|
INNER JOIN IdSet(:candidateIds) ids ON ids.id = e.ECInstanceId
|
|
28
27
|
UNION
|
|
29
28
|
SELECT p.ECInstanceId, p.Parent.Id, p.Model.Id
|
|
30
|
-
FROM ${
|
|
29
|
+
FROM ${Element.classFullName} p
|
|
31
30
|
INNER JOIN ChangedElementHierarchy c ON p.ECInstanceId = c.ParentId
|
|
32
31
|
)
|
|
33
32
|
SELECT ECInstanceId, ParentId, ModelId FROM ChangedElementHierarchy
|
|
34
33
|
LIMIT :resultLimit
|
|
35
34
|
`;
|
|
36
|
-
|
|
37
|
-
const params = new
|
|
35
|
+
OrderedId64Iterable.sortArray(ownedCandidateIds);
|
|
36
|
+
const params = new QueryBinder()
|
|
38
37
|
.bindIdSet("candidateIds", ownedCandidateIds)
|
|
39
38
|
.bindInt("resultLimit", maximumElementCount + 1);
|
|
40
39
|
// QueryBinder serializes the IdSet synchronously, so release this temporary copy before retaining the hierarchy.
|
|
@@ -66,10 +65,10 @@ class ChangedElementForest {
|
|
|
66
65
|
if (elementLimitExceeded)
|
|
67
66
|
return undefined;
|
|
68
67
|
for (const siblings of rootsByModel.values()) {
|
|
69
|
-
|
|
68
|
+
OrderedId64Iterable.sortArray(siblings);
|
|
70
69
|
}
|
|
71
70
|
for (const siblings of childrenByParent.values()) {
|
|
72
|
-
|
|
71
|
+
OrderedId64Iterable.sortArray(siblings);
|
|
73
72
|
}
|
|
74
73
|
return new ChangedElementForest(rootsByModel, childrenByParent);
|
|
75
74
|
}
|
|
@@ -82,5 +81,4 @@ class ChangedElementForest {
|
|
|
82
81
|
return this._childrenByParent.get(parentId) ?? [];
|
|
83
82
|
}
|
|
84
83
|
}
|
|
85
|
-
exports.ChangedElementForest = ChangedElementForest;
|
|
86
84
|
//# sourceMappingURL=ChangedElementForest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangedElementForest.js","sourceRoot":"","sources":["../src/ChangedElementForest.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\nimport {\n // eslint-disable-next-line @typescript-eslint/no-redeclare\n Element,\n IModelDb,\n} from \"@itwin/core-backend\";\nimport { Id64String, OrderedId64Iterable } from \"@itwin/core-bentley\";\nimport { QueryBinder } from \"@itwin/core-common\";\n\n/** The minimal parent-child forest containing changed or excluded elements and their ancestors. */\nexport class ChangedElementForest {\n private constructor(\n private readonly _rootsByModel: ReadonlyMap<\n Id64String,\n readonly Id64String[]\n >,\n private readonly _childrenByParent: ReadonlyMap<\n Id64String,\n readonly Id64String[]\n >\n ) {}\n\n public static async create(\n sourceDb: IModelDb,\n ownedCandidateIds: Id64String[],\n maximumElementCount: number\n ): Promise<ChangedElementForest | undefined> {\n if (ownedCandidateIds.length === 0) {\n return new ChangedElementForest(new Map(), new Map());\n }\n\n const sql = `\n WITH RECURSIVE ChangedElementHierarchy (ECInstanceId, ParentId, ModelId) AS (\n SELECT e.ECInstanceId, e.Parent.Id, e.Model.Id\n FROM ${Element.classFullName} e\n INNER JOIN IdSet(:candidateIds) ids ON ids.id = e.ECInstanceId\n UNION\n SELECT p.ECInstanceId, p.Parent.Id, p.Model.Id\n FROM ${Element.classFullName} p\n INNER JOIN ChangedElementHierarchy c ON p.ECInstanceId = c.ParentId\n )\n SELECT ECInstanceId, ParentId, ModelId FROM ChangedElementHierarchy\n LIMIT :resultLimit\n `;\n OrderedId64Iterable.sortArray(ownedCandidateIds);\n const params = new QueryBinder()\n .bindIdSet(\"candidateIds\", ownedCandidateIds)\n .bindInt(\"resultLimit\", maximumElementCount + 1);\n // QueryBinder serializes the IdSet synchronously, so release this temporary copy before retaining the hierarchy.\n ownedCandidateIds.length = 0;\n const rootsByModel = new Map<Id64String, Id64String[]>();\n const childrenByParent = new Map<Id64String, Id64String[]>();\n let elementCount = 0;\n let elementLimitExceeded = false;\n for await (const row of sourceDb.createQueryReader(sql, params, {\n usePrimaryConn: true,\n })) {\n if (elementCount >= maximumElementCount) {\n // Consume the single overflow row so the ECSqlReader reaches done; it has no disposal API.\n elementLimitExceeded = true;\n continue;\n }\n elementCount++;\n const elementId: Id64String = row[0];\n const parentId: Id64String | undefined = row[1] ?? undefined;\n const modelId: Id64String = row[2];\n const index = parentId === undefined ? rootsByModel : childrenByParent;\n const key = parentId ?? modelId;\n const siblings = index.get(key);\n if (siblings === undefined) index.set(key, [elementId]);\n else siblings.push(elementId);\n }\n\n if (elementLimitExceeded) return undefined;\n\n for (const siblings of rootsByModel.values()) {\n OrderedId64Iterable.sortArray(siblings);\n }\n for (const siblings of childrenByParent.values()) {\n OrderedId64Iterable.sortArray(siblings);\n }\n return new ChangedElementForest(rootsByModel, childrenByParent);\n }\n\n /** Gets the indexed root element IDs for a model. */\n public getModelRoots(modelId: Id64String): readonly Id64String[] {\n return this._rootsByModel.get(modelId) ?? [];\n }\n\n /** Gets the indexed child element IDs for a parent element. */\n public getChildren(parentId: Id64String): readonly Id64String[] {\n return this._childrenByParent.get(parentId) ?? [];\n }\n}\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
import { IModelDb } from "@itwin/core-backend";
|
|
5
5
|
import { Id64String } from "@itwin/core-bentley";
|
|
6
6
|
import { ChangesetFileProps } from "@itwin/core-common";
|
|
7
|
-
import type { ChangedInstanceIds } from "./IModelExporter";
|
|
8
|
-
import { SourceClassKinds } from "./SourceClassKinds";
|
|
7
|
+
import type { ChangedInstanceIds } from "./IModelExporter.js";
|
|
8
|
+
import { SourceClassKinds } from "./SourceClassKinds.js";
|
|
9
9
|
/**
|
|
10
10
|
* Identity shared by all deletion records.
|
|
11
11
|
* @beta
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangesetScanner.d.ts","sourceRoot":"","sources":["../src/ChangesetScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
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.
|
|
@@ -6,20 +5,17 @@
|
|
|
6
5
|
/** @packageDocumentation
|
|
7
6
|
* @module iModels
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const core_bentley_1 = require("@itwin/core-bentley");
|
|
14
|
-
const IModelTransformerError_1 = require("./IModelTransformerError");
|
|
15
|
-
const SourceClassKinds_1 = require("./SourceClassKinds");
|
|
8
|
+
import { BriefcaseManager, ChangesetReader, ExternalSourceAspect, PartialChangeUnifier, PropertyFilter, } from "@itwin/core-backend";
|
|
9
|
+
import { ITwinError } from "@itwin/core-bentley";
|
|
10
|
+
import { IModelTransformerError, IModelTransformerErrorScope, } from "./IModelTransformerError.js";
|
|
11
|
+
import { SourceClassKinds } from "./SourceClassKinds.js";
|
|
16
12
|
/**
|
|
17
13
|
* Adds a deleted instance to the deletion batch for its class.
|
|
18
14
|
* @note Throws `IModelStatus.NotFound` when the instance's class is missing from the current schemas, because such a
|
|
19
15
|
* deletion can't be classified.
|
|
20
16
|
* @internal
|
|
21
17
|
*/
|
|
22
|
-
function addDeletionRecord(batch, deleted, classKinds, iModel) {
|
|
18
|
+
export function addDeletionRecord(batch, deleted, classKinds, iModel) {
|
|
23
19
|
const { ecInstanceId, ecClassId } = deleted;
|
|
24
20
|
switch (classKinds.kindOf(ecClassId)) {
|
|
25
21
|
case "element":
|
|
@@ -35,10 +31,10 @@ function addDeletionRecord(batch, deleted, classKinds, iModel) {
|
|
|
35
31
|
case "relationship": {
|
|
36
32
|
const { sourceECInstanceId, targetECInstanceId } = deleted;
|
|
37
33
|
if (sourceECInstanceId === undefined || targetECInstanceId === undefined)
|
|
38
|
-
|
|
34
|
+
ITwinError.throwError({
|
|
39
35
|
iTwinErrorId: {
|
|
40
|
-
scope:
|
|
41
|
-
key:
|
|
36
|
+
scope: IModelTransformerErrorScope,
|
|
37
|
+
key: IModelTransformerError.ChangedInstanceMetadataMissing,
|
|
42
38
|
},
|
|
43
39
|
message: `Relationship deletion ${ecInstanceId} is missing an endpoint.`,
|
|
44
40
|
});
|
|
@@ -55,7 +51,7 @@ function addDeletionRecord(batch, deleted, classKinds, iModel) {
|
|
|
55
51
|
// Only an Element-kind aspect with these set can identify a target element.
|
|
56
52
|
if (elementId !== undefined &&
|
|
57
53
|
scopeId !== undefined &&
|
|
58
|
-
kind ===
|
|
54
|
+
kind === ExternalSourceAspect.Kind.Element &&
|
|
59
55
|
identifier !== undefined)
|
|
60
56
|
batch.externalSourceAspects.push({
|
|
61
57
|
ecInstanceId,
|
|
@@ -83,7 +79,7 @@ function addDeletionRecord(batch, deleted, classKinds, iModel) {
|
|
|
83
79
|
* to [[ChangedInstanceIds]], and records the deleted instances needed to process deletions.
|
|
84
80
|
* @internal
|
|
85
81
|
*/
|
|
86
|
-
class ChangesetScanner {
|
|
82
|
+
export class ChangesetScanner {
|
|
87
83
|
/**
|
|
88
84
|
* Downloads the changesets in each range of an iModel.
|
|
89
85
|
* @param iModel the iModel to download changesets for.
|
|
@@ -92,10 +88,10 @@ class ChangesetScanner {
|
|
|
92
88
|
*/
|
|
93
89
|
static async download(iModel, ranges) {
|
|
94
90
|
const iModelId = iModel.iModelId;
|
|
95
|
-
return Promise.all(ranges.map(async ([first, end]) =>
|
|
91
|
+
return Promise.all(ranges.map(async ([first, end]) => BriefcaseManager.downloadChangesets({
|
|
96
92
|
iModelId,
|
|
97
93
|
range: { first, end },
|
|
98
|
-
targetDir:
|
|
94
|
+
targetDir: BriefcaseManager.getChangeSetsPath(iModelId),
|
|
99
95
|
})));
|
|
100
96
|
}
|
|
101
97
|
/**
|
|
@@ -107,7 +103,7 @@ class ChangesetScanner {
|
|
|
107
103
|
*/
|
|
108
104
|
static async scan(iModel, csFileGroups, { changedInstanceIds, collectDeletionRecords = true }) {
|
|
109
105
|
const classKinds = collectDeletionRecords
|
|
110
|
-
? await
|
|
106
|
+
? await SourceClassKinds.query(iModel)
|
|
111
107
|
: undefined;
|
|
112
108
|
const batches = csFileGroups.map(() => ({
|
|
113
109
|
elements: [],
|
|
@@ -144,21 +140,21 @@ class ChangesetScanner {
|
|
|
144
140
|
}
|
|
145
141
|
static *readFiles(iModel, csFiles) {
|
|
146
142
|
for (const csFile of csFiles) {
|
|
147
|
-
const csReader =
|
|
143
|
+
const csReader = ChangesetReader.openFile({
|
|
148
144
|
fileName: csFile.pathname,
|
|
149
145
|
db: iModel,
|
|
150
|
-
propFilter:
|
|
146
|
+
propFilter: PropertyFilter.InstanceKeyAndIdentifiers,
|
|
151
147
|
});
|
|
152
|
-
const changeUnifier = new
|
|
148
|
+
const changeUnifier = new PartialChangeUnifier();
|
|
153
149
|
try {
|
|
154
150
|
while (csReader.step())
|
|
155
151
|
changeUnifier.appendFrom(csReader);
|
|
156
152
|
for (const change of changeUnifier.instances) {
|
|
157
153
|
if (change.ECClassId === undefined)
|
|
158
|
-
|
|
154
|
+
ITwinError.throwError({
|
|
159
155
|
iTwinErrorId: {
|
|
160
|
-
scope:
|
|
161
|
-
key:
|
|
156
|
+
scope: IModelTransformerErrorScope,
|
|
157
|
+
key: IModelTransformerError.ChangedInstanceMetadataMissing,
|
|
162
158
|
},
|
|
163
159
|
message: `ECClassId was not found for id: ${change.ECInstanceId}! Table is : ${change.$meta.tables}`,
|
|
164
160
|
});
|
|
@@ -183,5 +179,4 @@ class ChangesetScanner {
|
|
|
183
179
|
}
|
|
184
180
|
}
|
|
185
181
|
}
|
|
186
|
-
exports.ChangesetScanner = ChangesetScanner;
|
|
187
182
|
//# sourceMappingURL=ChangesetScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangesetScanner.js","sourceRoot":"","sources":["../src/ChangesetScanner.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 */\n\nimport {\n BriefcaseManager,\n ChangeInstance,\n ChangesetReader,\n ExternalSourceAspect,\n IModelDb,\n PartialChangeUnifier,\n PropertyFilter,\n} from \"@itwin/core-backend\";\nimport { Id64String, ITwinError } from \"@itwin/core-bentley\";\nimport { ChangesetFileProps } from \"@itwin/core-common\";\nimport type { ChangedInstanceIds } from \"./IModelExporter.js\";\nimport {\n IModelTransformerError,\n IModelTransformerErrorScope,\n} from \"./IModelTransformerError.js\";\nimport { SourceClassKinds } from \"./SourceClassKinds.js\";\n\n/**\n * Identity shared by all deletion records.\n * @beta\n */\nexport interface DeletionRecordBase {\n /** ID of the deleted source instance. */\n ecInstanceId: Id64String;\n /** EC class ID of the deleted source instance. */\n ecClassId: Id64String;\n}\n\n/**\n * A deleted source element.\n * @beta\n */\nexport interface ElementDeletionRecord extends DeletionRecordBase {\n /** Federation GUID used to find the corresponding target element. Undefined when the element had none. */\n federationGuid?: string;\n}\n\n/**\n * A deleted source model.\n * @beta\n */\nexport type ModelDeletionRecord = DeletionRecordBase;\n\n/**\n * A deleted source relationship derived from `BisCore:ElementRefersToElements`, excluding `BisCore:ElementDrivesElement`.\n * @beta\n */\nexport interface RelationshipDeletionRecord extends DeletionRecordBase {\n /** Source endpoint of the deleted relationship. */\n sourceECInstanceId: Id64String;\n /** Target endpoint of the deleted relationship. */\n targetECInstanceId: Id64String;\n}\n\n/**\n * A deleted source ExternalSourceAspect, used to find the target of an element deleted in the same batch.\n * Only aspects of kind `Element` with a scope and identifier are recorded, because only those identify a target element.\n * @beta\n */\nexport interface ExternalSourceAspectDeletionRecord extends DeletionRecordBase {\n /** Element that owned the deleted aspect. */\n elementId: Id64String;\n /** Scope of the deleted aspect. */\n scopeId: Id64String;\n /** Kind of the deleted aspect. */\n kind: string;\n /** Identifier of the deleted aspect. */\n identifier: string;\n}\n\n/**\n * Deleted source instances from one batch of changes.\n * @note Batches are processed in order. An `Element`-kind ExternalSourceAspect deletion is used to identify element deletions in the same batch. An empty array means nothing of that kind was deleted.\n * @beta\n */\nexport interface DeletionBatch {\n /** Deleted elements. */\n elements: ElementDeletionRecord[];\n /** Deleted models. */\n models: ModelDeletionRecord[];\n /** Deleted relationships derived from `BisCore:ElementRefersToElements`, excluding `BisCore:ElementDrivesElement`. */\n relationships: RelationshipDeletionRecord[];\n /** Deleted `Element`-kind ExternalSourceAspects with a scope and identifier. Aspects of other kinds can be omitted. */\n externalSourceAspects: ExternalSourceAspectDeletionRecord[];\n}\n\n/**\n * Changes read for [[IModelTransformer.collectChanges]].\n * @note The result must describe every change in the given ranges, as the default implementation does. Changes missing from\n * `changedInstanceIds`, including CodeSpec changes, aren't exported. Every relationship in\n * `changedInstanceIds.relationship.deleteIds` needs a matching deletion record, or its deletion is skipped with a warning.\n * An element or model deletion whose target can't be found through its record or the transformation's provenance is ignored.\n * @beta\n */\nexport interface CollectedChanges {\n /** Changed instance IDs, including the owning elements of changed aspects. */\n changedInstanceIds: ChangedInstanceIds;\n /** Deletion batches of any granularity: one per changeset, one per range, or one for all ranges. */\n deletionBatches: DeletionBatch[];\n}\n\n/**\n * The identifiers of a deleted instance that deletion records are built from, as read from a changeset with\n * `PropertyFilter.InstanceKeyAndIdentifiers`.\n * @internal\n */\nexport interface DeletedInstance {\n ecInstanceId: Id64String;\n ecClassId: Id64String;\n federationGuid?: string;\n sourceECInstanceId?: Id64String;\n targetECInstanceId?: Id64String;\n /** Owner of a deleted aspect. */\n elementId?: Id64String;\n scopeId?: Id64String;\n kind?: string;\n identifier?: string;\n}\n\ninterface ScanOptions {\n /** Receives the changes. When undefined, changes are read only for their deletion records. */\n changedInstanceIds?: ChangedInstanceIds;\n /** Whether to collect deletion records. Defaults to true. */\n collectDeletionRecords?: boolean;\n}\n\n/**\n * Adds a deleted instance to the deletion batch for its class.\n * @note Throws `IModelStatus.NotFound` when the instance's class is missing from the current schemas, because such a\n * deletion can't be classified.\n * @internal\n */\nexport function addDeletionRecord(\n batch: DeletionBatch,\n deleted: DeletedInstance,\n classKinds: SourceClassKinds,\n iModel: IModelDb\n): void {\n const { ecInstanceId, ecClassId } = deleted;\n switch (classKinds.kindOf(ecClassId)) {\n case \"element\":\n batch.elements.push({\n ecInstanceId,\n ecClassId,\n federationGuid: deleted.federationGuid,\n });\n return;\n case \"model\":\n batch.models.push({ ecInstanceId, ecClassId });\n return;\n case \"relationship\": {\n const { sourceECInstanceId, targetECInstanceId } = deleted;\n if (sourceECInstanceId === undefined || targetECInstanceId === undefined)\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.ChangedInstanceMetadataMissing,\n },\n message: `Relationship deletion ${ecInstanceId} is missing an endpoint.`,\n });\n batch.relationships.push({\n ecInstanceId,\n ecClassId,\n sourceECInstanceId,\n targetECInstanceId,\n });\n return;\n }\n case \"externalSourceAspect\": {\n const { elementId, scopeId, kind, identifier } = deleted;\n // Only an Element-kind aspect with these set can identify a target element.\n if (\n elementId !== undefined &&\n scopeId !== undefined &&\n kind === ExternalSourceAspect.Kind.Element &&\n identifier !== undefined\n )\n batch.externalSourceAspects.push({\n ecInstanceId,\n ecClassId,\n elementId,\n scopeId,\n kind,\n identifier,\n });\n return;\n }\n case \"aspect\":\n case \"codeSpec\":\n case \"skippedRelationship\":\n return;\n case undefined:\n // Throws NotFound for a class missing from the current schemas. Other unhandled classes need no records.\n iModel.getClassNameFromId(ecClassId);\n return;\n }\n}\n\n/**\n * Reads each changeset once, unifies table changes into EC instance changes,\n * normalizes overflow-only inserts and deletes to updates, writes all operations\n * to [[ChangedInstanceIds]], and records the deleted instances needed to process deletions.\n * @internal\n */\nexport class ChangesetScanner {\n /**\n * Downloads the changesets in each range of an iModel.\n * @param iModel the iModel to download changesets for.\n * @param ranges inclusive ranges of changeset indices.\n * @returns one group of changeset files per range, in the order of `ranges`.\n */\n public static async download(\n iModel: IModelDb,\n ranges: readonly (readonly [number, number])[]\n ): Promise<ChangesetFileProps[][]> {\n const iModelId = iModel.iModelId;\n return Promise.all(\n ranges.map(async ([first, end]) =>\n BriefcaseManager.downloadChangesets({\n iModelId,\n range: { first, end },\n targetDir: BriefcaseManager.getChangeSetsPath(iModelId),\n })\n )\n );\n }\n\n /**\n * Scans each group of changeset files in order with one reader and unifier per file.\n * @param iModel Database used to resolve EC classes.\n * @param csFileGroups Ordered groups of changeset files. Each group produces one deletion batch.\n * @param options Where to write the changes, and whether to collect deletion records.\n * @returns One deletion batch per group, empty when deletion records aren't collected.\n */\n public static async scan(\n iModel: IModelDb,\n csFileGroups: ChangesetFileProps[][],\n { changedInstanceIds, collectDeletionRecords = true }: ScanOptions\n ): Promise<DeletionBatch[]> {\n const classKinds = collectDeletionRecords\n ? await SourceClassKinds.query(iModel)\n : undefined;\n const batches = csFileGroups.map((): DeletionBatch => ({\n elements: [],\n models: [],\n relationships: [],\n externalSourceAspects: [],\n }));\n const readChanges = function* (): Generator<ChangeInstance> {\n for (const [index, csFiles] of csFileGroups.entries()) {\n for (const change of ChangesetScanner.readFiles(iModel, csFiles)) {\n if (classKinds !== undefined && change.$meta.op === \"Deleted\")\n addDeletionRecord(\n batches[index],\n {\n ecInstanceId: change.ECInstanceId,\n ecClassId: change.ECClassId,\n federationGuid: change.FederationGuid,\n sourceECInstanceId: change.SourceECInstanceId,\n targetECInstanceId: change.TargetECInstanceId,\n elementId: change.Element?.Id,\n scopeId: change.Scope?.Id,\n kind: change.Kind,\n identifier: change.Identifier,\n },\n classKinds,\n iModel\n );\n yield change;\n }\n }\n };\n if (changedInstanceIds !== undefined)\n await changedInstanceIds.addChanges(readChanges());\n // Without an aggregate, the changes are read only to record their deletions.\n else for (const _change of readChanges());\n return batches;\n }\n\n private static *readFiles(\n iModel: IModelDb,\n csFiles: ChangesetFileProps[]\n ): Generator<ChangeInstance> {\n for (const csFile of csFiles) {\n const csReader = ChangesetReader.openFile({\n fileName: csFile.pathname,\n db: iModel,\n propFilter: PropertyFilter.InstanceKeyAndIdentifiers,\n });\n const changeUnifier = new PartialChangeUnifier();\n try {\n while (csReader.step()) changeUnifier.appendFrom(csReader);\n for (const change of changeUnifier.instances) {\n if (change.ECClassId === undefined)\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.ChangedInstanceMetadataMissing,\n },\n message: `ECClassId was not found for id: ${change.ECInstanceId}! Table is : ${change.$meta.tables}`,\n });\n // Change is recorded at table level, not EC entity level.\n // This normalizes overflow-table expansion records so they do not\n // appear as element inserts or deletes.\n if (\n (change.$meta.op === \"Inserted\" || change.$meta.op === \"Deleted\") &&\n change.$meta.tables.every((table) => table.endsWith(\"Overflow\"))\n ) {\n change.$meta.op = \"Updated\";\n }\n yield change;\n }\n } finally {\n try {\n changeUnifier[Symbol.dispose]();\n } finally {\n csReader[Symbol.dispose]();\n }\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECReferenceTypesCache.d.ts","sourceRoot":"","sources":["../src/ECReferenceTypesCache.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAYtE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAO/C;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,cAEC;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAChC,uGAAuG;IACvG,OAAO,CAAC,uBAAuB,CAG3B;IACJ,OAAO,CAAC,0BAA0B,CAG9B;IACJ,OAAO,CAAC,cAAc,CAAgC;IAEtD,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAWlC;YAEY,eAAe;YA2Bf,0BAA0B;IAaxC,8CAA8C;IACjC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnE;YAEa,kBAAkB;YAalB,UAAU;YAoEV,mBAAmB;IA4D1B,iBAAiB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,mBAAmB,CAOjC;IAEM,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,SAAS,GAAG,WAAW,CAMzB;CACF"}
|