@itwin/imodel-transformer 2.0.0-dev.5 → 2.0.0-dev.50

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.
Files changed (115) hide show
  1. package/README.md +13 -27
  2. package/lib/cjs/Algo.js.map +1 -1
  3. package/lib/cjs/BigMap.d.ts.map +1 -1
  4. package/lib/cjs/BigMap.js.map +1 -1
  5. package/lib/cjs/BranchProvenanceInitializer.d.ts.map +1 -1
  6. package/lib/cjs/BranchProvenanceInitializer.js +34 -36
  7. package/lib/cjs/BranchProvenanceInitializer.js.map +1 -1
  8. package/lib/cjs/ChangesetScanner.d.ts +60 -0
  9. package/lib/cjs/ChangesetScanner.d.ts.map +1 -0
  10. package/lib/cjs/ChangesetScanner.js +101 -0
  11. package/lib/cjs/ChangesetScanner.js.map +1 -0
  12. package/lib/cjs/ECReferenceTypesCache.d.ts +0 -3
  13. package/lib/cjs/ECReferenceTypesCache.d.ts.map +1 -1
  14. package/lib/cjs/ECReferenceTypesCache.js +61 -103
  15. package/lib/cjs/ECReferenceTypesCache.js.map +1 -1
  16. package/lib/cjs/ECSqlReaderAsyncIterableIteratorAdapter.d.ts.map +1 -1
  17. package/lib/cjs/ECSqlReaderAsyncIterableIteratorAdapter.js.map +1 -1
  18. package/lib/cjs/ElementAspectCleanup.d.ts +16 -0
  19. package/lib/cjs/ElementAspectCleanup.d.ts.map +1 -0
  20. package/lib/cjs/ElementAspectCleanup.js +83 -0
  21. package/lib/cjs/ElementAspectCleanup.js.map +1 -0
  22. package/lib/cjs/ElementAspectExportCoordinator.d.ts +44 -0
  23. package/lib/cjs/ElementAspectExportCoordinator.d.ts.map +1 -0
  24. package/lib/cjs/ElementAspectExportCoordinator.js +148 -0
  25. package/lib/cjs/ElementAspectExportCoordinator.js.map +1 -0
  26. package/lib/cjs/ElementAspectExportProcessor.d.ts +43 -0
  27. package/lib/cjs/ElementAspectExportProcessor.d.ts.map +1 -0
  28. package/lib/cjs/ElementAspectExportProcessor.js +167 -0
  29. package/lib/cjs/ElementAspectExportProcessor.js.map +1 -0
  30. package/lib/cjs/ElementCascadingDeleter.d.ts +3 -3
  31. package/lib/cjs/ElementCascadingDeleter.d.ts.map +1 -1
  32. package/lib/cjs/ElementCascadingDeleter.js +12 -12
  33. package/lib/cjs/ElementCascadingDeleter.js.map +1 -1
  34. package/lib/cjs/EntityExistenceCache.d.ts +43 -0
  35. package/lib/cjs/EntityExistenceCache.d.ts.map +1 -0
  36. package/lib/cjs/EntityExistenceCache.js +91 -0
  37. package/lib/cjs/EntityExistenceCache.js.map +1 -0
  38. package/lib/cjs/EntityMap.d.ts.map +1 -1
  39. package/lib/cjs/EntityMap.js.map +1 -1
  40. package/lib/cjs/EntityUnifier.d.ts +8 -8
  41. package/lib/cjs/EntityUnifier.d.ts.map +1 -1
  42. package/lib/cjs/EntityUnifier.js +55 -32
  43. package/lib/cjs/EntityUnifier.js.map +1 -1
  44. package/lib/cjs/IModelCloneContext.d.ts +11 -5
  45. package/lib/cjs/IModelCloneContext.d.ts.map +1 -1
  46. package/lib/cjs/IModelCloneContext.js +94 -58
  47. package/lib/cjs/IModelCloneContext.js.map +1 -1
  48. package/lib/cjs/IModelExporter.d.ts +108 -34
  49. package/lib/cjs/IModelExporter.d.ts.map +1 -1
  50. package/lib/cjs/IModelExporter.js +702 -208
  51. package/lib/cjs/IModelExporter.js.map +1 -1
  52. package/lib/cjs/IModelImporter.d.ts +50 -25
  53. package/lib/cjs/IModelImporter.d.ts.map +1 -1
  54. package/lib/cjs/IModelImporter.js +231 -130
  55. package/lib/cjs/IModelImporter.js.map +1 -1
  56. package/lib/cjs/IModelTransformContext.d.ts +54 -0
  57. package/lib/cjs/IModelTransformContext.d.ts.map +1 -0
  58. package/lib/cjs/IModelTransformContext.js +3 -0
  59. package/lib/cjs/IModelTransformContext.js.map +1 -0
  60. package/lib/cjs/IModelTransformer.d.ts +125 -203
  61. package/lib/cjs/IModelTransformer.d.ts.map +1 -1
  62. package/lib/cjs/IModelTransformer.js +646 -1190
  63. package/lib/cjs/IModelTransformer.js.map +1 -1
  64. package/lib/cjs/IModelTransformerError.d.ts +82 -0
  65. package/lib/cjs/IModelTransformerError.d.ts.map +1 -0
  66. package/lib/cjs/IModelTransformerError.js +91 -0
  67. package/lib/cjs/IModelTransformerError.js.map +1 -0
  68. package/lib/cjs/ProvenanceManager.d.ts +182 -0
  69. package/lib/cjs/ProvenanceManager.d.ts.map +1 -0
  70. package/lib/cjs/ProvenanceManager.js +743 -0
  71. package/lib/cjs/ProvenanceManager.js.map +1 -0
  72. package/lib/cjs/SyncTypeResolver.d.ts +34 -0
  73. package/lib/cjs/SyncTypeResolver.d.ts.map +1 -0
  74. package/lib/cjs/SyncTypeResolver.js +98 -0
  75. package/lib/cjs/SyncTypeResolver.js.map +1 -0
  76. package/lib/cjs/TransformerLoggerCategory.d.ts +1 -1
  77. package/lib/cjs/TransformerLoggerCategory.js +1 -1
  78. package/lib/cjs/TransformerLoggerCategory.js.map +1 -1
  79. package/lib/cjs/TransformerPackageMetadata.d.ts +8 -0
  80. package/lib/cjs/TransformerPackageMetadata.d.ts.map +1 -0
  81. package/lib/cjs/TransformerPackageMetadata.js +47 -0
  82. package/lib/cjs/TransformerPackageMetadata.js.map +1 -0
  83. package/lib/cjs/imodel-transformer.d.ts +19 -0
  84. package/lib/cjs/imodel-transformer.d.ts.map +1 -1
  85. package/lib/cjs/imodel-transformer.js +53 -34
  86. package/lib/cjs/imodel-transformer.js.map +1 -1
  87. package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.d.ts +29 -0
  88. package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.d.ts.map +1 -0
  89. package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.js +212 -0
  90. package/lib/cjs/schema-processing/DynamicSchemaUnionStrategy.js.map +1 -0
  91. package/lib/cjs/schema-processing/SchemaProcessingCoordinator.d.ts +25 -0
  92. package/lib/cjs/schema-processing/SchemaProcessingCoordinator.d.ts.map +1 -0
  93. package/lib/cjs/schema-processing/SchemaProcessingCoordinator.js +196 -0
  94. package/lib/cjs/schema-processing/SchemaProcessingCoordinator.js.map +1 -0
  95. package/lib/cjs/schema-processing/SchemaProcessingStrategy.d.ts +59 -0
  96. package/lib/cjs/schema-processing/SchemaProcessingStrategy.d.ts.map +1 -0
  97. package/lib/cjs/schema-processing/SchemaProcessingStrategy.js +28 -0
  98. package/lib/cjs/schema-processing/SchemaProcessingStrategy.js.map +1 -0
  99. package/lib/cjs/schema-processing.d.ts +7 -0
  100. package/lib/cjs/schema-processing.d.ts.map +1 -0
  101. package/lib/cjs/schema-processing.js +27 -0
  102. package/lib/cjs/schema-processing.js.map +1 -0
  103. package/package.json +65 -43
  104. package/lib/cjs/DetachedExportElementAspectsStrategy.d.ts +0 -16
  105. package/lib/cjs/DetachedExportElementAspectsStrategy.d.ts.map +0 -1
  106. package/lib/cjs/DetachedExportElementAspectsStrategy.js +0 -106
  107. package/lib/cjs/DetachedExportElementAspectsStrategy.js.map +0 -1
  108. package/lib/cjs/ExportElementAspectsStrategy.d.ts +0 -35
  109. package/lib/cjs/ExportElementAspectsStrategy.d.ts.map +0 -1
  110. package/lib/cjs/ExportElementAspectsStrategy.js +0 -52
  111. package/lib/cjs/ExportElementAspectsStrategy.js.map +0 -1
  112. package/lib/cjs/ExportElementAspectsWithElementsStrategy.d.ts +0 -12
  113. package/lib/cjs/ExportElementAspectsWithElementsStrategy.d.ts.map +0 -1
  114. package/lib/cjs/ExportElementAspectsWithElementsStrategy.js +0 -47
  115. package/lib/cjs/ExportElementAspectsWithElementsStrategy.js.map +0 -1
package/README.md CHANGED
@@ -4,47 +4,33 @@ Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md
4
4
 
5
5
  ## Description
6
6
 
7
- The __@itwin/imodel-transformer__ package contains classes that handle traversing iModels for exporting and importing their parts.
7
+ The **@itwin/imodel-transformer** package contains classes that handle traversing iModels for exporting and importing their parts.
8
8
 
9
9
  ## Documentation
10
10
 
11
11
  See the [iTwin.js](https://www.itwinjs.org) documentation for more information.
12
12
 
13
+ ### Transformation context
14
+
15
+ Retrieve the supported transformation context from an `IModelTransformer`. Depend on `IModelTransformContext` when passing the context to helpers or creating test doubles; `IModelCloneContext` is an implementation detail.
16
+
17
+ ```ts
18
+ import type { IModelTransformContext } from "@itwin/imodel-transformer";
19
+
20
+ const context: IModelTransformContext = transformer.context;
21
+ ```
22
+
13
23
  ## Versioning
14
24
 
15
25
  This package, for the time being, relies on @internal APIs in iTwin.js, and therefore has very strict peerDependencies versions.
16
26
  We perform a version check at runtime to ensure this. Every new iTwin.js version must be validated, and fixes are rarely ported
17
27
  to old versions currently, you must request this in an issue. Removing Dependencies on internal APIs is ongoing.
18
- You can find the latest @itwin/imodel-transformer version for your iTwin.js version by copy and pasting this into a bash shell
19
-
20
- (use git bash on windows).
21
-
22
- ```sh
23
- MY_ITWINJS_VERSION="3.6.0" # edit me
24
- pnpm -s --package=semver -c dlx node <<EOF
25
- json=""
26
- require("https").get("https://registry.npmjs.org/@itwin/imodel-transformer", r=>r.setEncoding("utf8").on("data", d=>json+=d).on("end", ()=>{
27
- semver=require(process.env.PATH.split(":").find(x=>x.includes(".bin"))+"/../semver")
28
- console.log(Object.entries(JSON.parse(json).versions)
29
- .filter(([,v])=>semver.satisfies("$MY_ITWINJS_VERSION", v.peerDependencies["@itwin/core-backend"]))
30
- .map(([k,v])=>k).reverse())
31
- }))
32
- EOF
33
- ```
34
-
35
28
  ## Environment Variables
36
29
 
37
30
  ### TRANSFORMER_NO_STRICT_DEP_CHECK
38
31
 
39
- Set this variable to `1` to disable strict dependency checks in `packages/transformer/src/transformer.ts`. The strict dependency check validates that the version of @itwinjs/core-backend provided falls in the range defined by the peerDependencies of the transformer package.
40
-
41
- ### SUGGEST_TRANSFORMER_VERSIONS
42
-
43
- Set this variable to `1` to enable `packages/transformer/src/transformer.ts` to suggest compatible versions if dependencies are not in the specified peer dependency range of this package.
32
+ Set this variable to `1` to disable strict dependency checks in `packages/transformer/src/imodel-transformer.ts`. The strict dependency check validates that the version of `@itwin/core-backend` provided falls in the range defined by the peer dependencies of the transformer package.
44
33
 
45
34
  ```dotenv
46
- # Disable strict dependency checks in transformer.ts
47
35
  TRANSFORMER_NO_STRICT_DEP_CHECK=1
48
-
49
- # Enable version suggestions in transformer.ts
50
- SUGGEST_TRANSFORMER_VERSIONS=1
36
+ ```
@@ -1 +1 @@
1
- {"version":3,"file":"Algo.js","sourceRoot":"","sources":["../../src/Algo.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 */\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\n/**\n * @internal\n */\nexport function renderRanges(ranges: [number, number][]): number[] {\n const result = [];\n for (const range of ranges)\n for (let i = range[0]; i <= range[1]; ++i) result.push(i);\n return result;\n}\n"]}
1
+ {"version":3,"file":"Algo.js","sourceRoot":"","sources":["../../src/Algo.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 */\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\n/**\n * @internal\n */\nexport function renderRanges(ranges: [number, number][]): number[] {\n const result = [];\n for (const range of ranges)\n for (let i = range[0]; i <= range[1]; ++i) result.push(i);\n return result;\n}\n"]}
@@ -1 +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;;IAwBM,KAAK,IAAI,IAAI;IAKb,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAShC,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;IAMA,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS;IAInC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAI7B,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAWpC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAIxD,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC,WAE9B;IAEO,OAAO,IAAI,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAOvC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC;IAO/B,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC;CAMjC"}
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 +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"]}
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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BranchProvenanceInitializer.d.ts","sourceRoot":"","sources":["../../src/BranchProvenanceInitializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,QAAQ,EAGT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAY,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AAS7E;;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,CAsJ/B"}
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"}
@@ -8,50 +8,45 @@ exports.initializeBranchProvenance = initializeBranchProvenance;
8
8
  const core_backend_1 = require("@itwin/core-backend");
9
9
  const core_bentley_1 = require("@itwin/core-bentley");
10
10
  const core_common_1 = require("@itwin/core-common");
11
- const assert = require("assert");
12
- const IModelTransformer_1 = require("./IModelTransformer");
13
- const url_1 = require("url");
11
+ const node_assert_1 = require("node:assert");
12
+ const ProvenanceManager_1 = require("./ProvenanceManager");
13
+ const node_url_1 = require("node:url");
14
+ const TransformerPackageMetadata_1 = require("./TransformerPackageMetadata");
14
15
  /**
15
16
  * @alpha
16
17
  */
17
18
  async function initializeBranchProvenance(args) {
19
+ let editTxn = new core_backend_1.EditTxn(args.branch, "initializeBranchProvenance");
20
+ editTxn.start();
18
21
  if (args.createFedGuidsForMaster) {
19
22
  // FIXME<LOW>: Consider enforcing that the master and branch dbs passed as part of ProvenanceInitArgs to this function
20
23
  // are identical. https://github.com/iTwin/imodel-transformer/issues/138
21
- /* eslint-disable @typescript-eslint/no-deprecated */
22
24
  args.master.withSqliteStatement(`
23
25
  UPDATE bis_Element
24
26
  SET FederationGuid=randomblob(16)
25
27
  WHERE FederationGuid IS NULL
26
- `,
27
- // eslint-disable-next-line @itwin/no-internal
28
- (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
28
+ `, (s) => (0, node_assert_1.strict)(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.master.getLastError()));
29
29
  const masterPath = args.master.pathName;
30
30
  const reopenMaster = makeDbReopener(args.master);
31
31
  args.master.close(); // prevent busy
32
- args.branch.withSqliteStatement(`ATTACH DATABASE '${(0, url_1.pathToFileURL)(`${masterPath}`)}?mode=ro' AS master`,
33
- // eslint-disable-next-line @itwin/no-internal
34
- (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
32
+ args.branch.withSqliteStatement(`ATTACH DATABASE '${(0, node_url_1.pathToFileURL)(`${masterPath}`)}?mode=ro' AS master`, (s) => (0, node_assert_1.strict)(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
35
33
  args.branch.withSqliteStatement(`
36
34
  UPDATE main.bis_Element
37
35
  SET FederationGuid = (
38
36
  SELECT m.FederationGuid
39
37
  FROM master.bis_Element m
40
38
  WHERE m.Id=main.bis_Element.Id
41
- )`,
42
- // eslint-disable-next-line @itwin/no-internal
43
- (s) => assert(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
39
+ )`, (s) => (0, node_assert_1.strict)(s.step() === core_bentley_1.DbResult.BE_SQLITE_DONE, args.branch.getLastError()));
44
40
  args.branch.clearCaches(); // statements write lock attached db (clearing statement cache does not fix this)
45
- args.branch.saveChanges();
41
+ editTxn.saveChanges();
42
+ editTxn.end();
46
43
  args.branch.withSqliteStatement("DETACH DATABASE master", (s) => {
47
44
  const res = s.step();
48
45
  if (res !== core_bentley_1.DbResult.BE_SQLITE_DONE)
49
46
  core_bentley_1.Logger.logTrace("initializeBranchProvenance", `Error detaching db (we will close anyway): ${args.branch.getLastError()}`);
50
47
  // this is the case until native side changes
51
- // eslint-disable-next-line @itwin/no-internal
52
- assert(res === core_bentley_1.DbResult.BE_SQLITE_ERROR, args.branch.getLastError());
48
+ (0, node_assert_1.strict)(res === core_bentley_1.DbResult.BE_SQLITE_ERROR, args.branch.getLastError());
53
49
  });
54
- /* eslint-enable @typescript-eslint/no-deprecated */
55
50
  args.branch.performCheckpoint();
56
51
  const reopenBranch = makeDbReopener(args.branch);
57
52
  // close dbs because element cache could be invalid
@@ -60,9 +55,12 @@ async function initializeBranchProvenance(args) {
60
55
  reopenMaster(),
61
56
  reopenBranch(),
62
57
  ]);
58
+ // Recreate editTxn on the reopened branch db
59
+ editTxn = new core_backend_1.EditTxn(args.branch, "initializeBranchProvenance");
60
+ editTxn.start();
63
61
  }
64
62
  // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations
65
- const masterRepoLinkId = args.branch.elements.insertElement({
63
+ const masterRepoLinkId = editTxn.insertElement({
66
64
  classFullName: core_backend_1.RepositoryLink.classFullName,
67
65
  code: core_backend_1.RepositoryLink.createCode(args.branch, core_backend_1.IModelDb.repositoryModelId, "example-code-value"),
68
66
  model: core_backend_1.IModelDb.repositoryModelId,
@@ -71,34 +69,32 @@ async function initializeBranchProvenance(args) {
71
69
  repositoryGuid: args.master.iModelId,
72
70
  description: args.masterDescription,
73
71
  });
74
- const masterExternalSourceId = args.branch.elements.insertElement({
72
+ const masterExternalSourceId = editTxn.insertElement({
75
73
  classFullName: core_backend_1.ExternalSource.classFullName,
76
74
  model: core_backend_1.IModelDb.rootSubjectId,
77
75
  code: core_common_1.Code.createEmpty(),
78
76
  repository: new core_backend_1.ExternalSourceIsInRepository(masterRepoLinkId),
79
- /* eslint-disable @typescript-eslint/no-require-imports */
80
- connectorName: require("../../package.json").name,
81
- connectorVersion: require("../../package.json").version,
82
- /* eslint-enable @typescript-eslint/no-require-imports */
77
+ connectorName: TransformerPackageMetadata_1.transformerPackageMetadata.name,
78
+ connectorVersion: TransformerPackageMetadata_1.transformerPackageMetadata.version,
83
79
  });
84
- const fedGuidLessElemsSql = `
80
+ const fedGuidlessElemsSql = `
85
81
  SELECT ECInstanceId AS id
86
82
  FROM Bis.Element
87
83
  WHERE FederationGuid IS NULL
88
84
  AND ECInstanceId NOT IN (0x1, 0xe, 0x10) /* ignore special elems */
89
85
  `;
90
- const elemReader = args.branch.createQueryReader(fedGuidLessElemsSql, undefined, { usePrimaryConn: true });
91
- while (await elemReader.step()) {
92
- const id = elemReader.current.toRow().id;
93
- const aspectProps = IModelTransformer_1.IModelTransformer.initElementProvenanceOptions(id, id, {
86
+ const elemReader = args.branch.createQueryReader(fedGuidlessElemsSql, undefined, { usePrimaryConn: true });
87
+ for await (const row of elemReader) {
88
+ const id = row.id;
89
+ const aspectProps = ProvenanceManager_1.ProvenanceManager.initElementProvenanceOptions(id, id, {
94
90
  isReverseSynchronization: false,
95
91
  targetScopeElementId: masterExternalSourceId,
96
92
  sourceDb: args.master,
97
93
  targetDb: args.branch,
98
94
  });
99
- args.branch.elements.insertAspect(aspectProps);
95
+ editTxn.insertAspect(aspectProps);
100
96
  }
101
- const fedGuidLessRelsSql = `
97
+ const fedGuidlessRelsSql = `
102
98
  SELECT erte.ECInstanceId as id
103
99
  FROM Bis.ElementRefersToElements erte
104
100
  JOIN bis.Element se
@@ -107,18 +103,20 @@ async function initializeBranchProvenance(args) {
107
103
  ON te.ECInstanceId=erte.TargetECInstanceId
108
104
  WHERE se.FederationGuid IS NULL
109
105
  OR te.FederationGuid IS NULL`;
110
- const relReader = args.branch.createQueryReader(fedGuidLessRelsSql, undefined, { usePrimaryConn: true });
111
- while (await relReader.step()) {
112
- const id = relReader.current.toRow().id;
113
- const aspectProps = IModelTransformer_1.IModelTransformer.initRelationshipProvenanceOptions(id, id, {
106
+ const relReader = args.branch.createQueryReader(fedGuidlessRelsSql, undefined, { usePrimaryConn: true });
107
+ for await (const row of relReader) {
108
+ const id = row.id;
109
+ const aspectProps = await ProvenanceManager_1.ProvenanceManager.initRelationshipProvenanceOptions(id, id, {
114
110
  isReverseSynchronization: false,
115
111
  targetScopeElementId: masterExternalSourceId,
116
112
  sourceDb: args.master,
117
113
  targetDb: args.branch,
118
114
  forceOldRelationshipProvenanceMethod: false,
119
115
  });
120
- args.branch.elements.insertAspect(aspectProps);
116
+ editTxn.insertAspect(aspectProps);
121
117
  }
118
+ editTxn.saveChanges();
119
+ editTxn.end();
122
120
  if (args.createFedGuidsForMaster === true) {
123
121
  args.master.close();
124
122
  args.branch.close();
@@ -141,7 +139,7 @@ function makeDbReopener(db) {
141
139
  else if (db instanceof core_backend_1.StandaloneDb)
142
140
  reopenDb = (mode = originalMode) => core_backend_1.StandaloneDb.openFile(dbPath, mode);
143
141
  else
144
- assert(false, `db type '${db.constructor.name}' not supported`);
142
+ (0, node_assert_1.strict)(false, `db type '${db.constructor.name}' not supported`);
145
143
  return reopenDb;
146
144
  }
147
145
  //# sourceMappingURL=BranchProvenanceInitializer.js.map
@@ -1 +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 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 * as assert from \"assert\";\nimport { IModelTransformer } from \"./IModelTransformer\";\nimport { pathToFileURL } from \"url\";\n/**\n * @alpha\n */\nexport interface ProvenanceInitArgs {\n /** the master iModel which is the source of the provenance */\n master: IModelDb;\n /** the canonical url of the master iModel */\n masterUrl?: string;\n /** the description of the master iModel */\n masterDescription?: string;\n /**\n * @param {IModelDb} branchDb - the branch iModel which is the container of the provenance\n * Must be opened Read/Write\n */\n branch: IModelDb;\n /**\n * insert Federation Guids in all lacking elements in the master database, which will prevent\n * needing to insert External Source Aspects for provenance tracking\n * @note requires a read/write master\n * @note closes both the master and branch iModels to reset caches, so you must reopen them.\n * If you pass `\"keep-reopened-db\"`, this object's `master` and `branch` properties will\n * be set to new, open databases.\n */\n createFedGuidsForMaster?: true | false | \"keep-reopened-db\";\n}\n\n/**\n * @alpha\n */\nexport interface ProvenanceInitResult {\n targetScopeElementId: Id64String;\n masterExternalSourceId: Id64String;\n masterRepositoryLinkId: Id64String;\n}\n\n/**\n * @alpha\n */\nexport async function initializeBranchProvenance(\n args: ProvenanceInitArgs\n): Promise<ProvenanceInitResult> {\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 /* eslint-disable @typescript-eslint/no-deprecated */\n args.master.withSqliteStatement(\n `\n UPDATE bis_Element\n SET FederationGuid=randomblob(16)\n WHERE FederationGuid IS NULL\n `,\n // eslint-disable-next-line @itwin/no-internal\n (s) =>\n assert(s.step() === DbResult.BE_SQLITE_DONE, args.branch.getLastError())\n );\n const masterPath = args.master.pathName;\n const reopenMaster = makeDbReopener(args.master);\n args.master.close(); // prevent busy\n args.branch.withSqliteStatement(\n `ATTACH DATABASE '${pathToFileURL(`${masterPath}`)}?mode=ro' AS master`,\n // eslint-disable-next-line @itwin/no-internal\n (s) =>\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 // eslint-disable-next-line @itwin/no-internal\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 args.branch.saveChanges();\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 // eslint-disable-next-line @itwin/no-internal\n assert(res === DbResult.BE_SQLITE_ERROR, args.branch.getLastError());\n });\n /* eslint-enable @typescript-eslint/no-deprecated */\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 }\n\n // create an external source and owning repository link to use as our *Target Scope Element* for future synchronizations\n const masterRepoLinkId = args.branch.elements.insertElement({\n classFullName: RepositoryLink.classFullName,\n code: RepositoryLink.createCode(\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 = args.branch.elements.insertElement({\n classFullName: ExternalSource.classFullName,\n model: IModelDb.rootSubjectId,\n code: Code.createEmpty(),\n repository: new ExternalSourceIsInRepository(masterRepoLinkId),\n /* eslint-disable @typescript-eslint/no-require-imports */\n connectorName: require(\"../../package.json\").name,\n connectorVersion: require(\"../../package.json\").version,\n /* eslint-enable @typescript-eslint/no-require-imports */\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 while (await elemReader.step()) {\n const id: string = elemReader.current.toRow().id;\n const aspectProps = IModelTransformer.initElementProvenanceOptions(id, id, {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n });\n args.branch.elements.insertAspect(aspectProps);\n }\n\n const fedGuidLessRelsSql = `\n SELECT erte.ECInstanceId as id\n FROM Bis.ElementRefersToElements erte\n JOIN bis.Element se\n ON se.ECInstanceId=erte.SourceECInstanceId\n JOIN bis.Element te\n ON te.ECInstanceId=erte.TargetECInstanceId\n WHERE se.FederationGuid IS NULL\n OR te.FederationGuid IS NULL`;\n const relReader = args.branch.createQueryReader(\n fedGuidLessRelsSql,\n undefined,\n { usePrimaryConn: true }\n );\n while (await relReader.step()) {\n const id: string = relReader.current.toRow().id;\n const aspectProps = IModelTransformer.initRelationshipProvenanceOptions(\n id,\n id,\n {\n isReverseSynchronization: false,\n targetScopeElementId: masterExternalSourceId,\n sourceDb: args.master,\n targetDb: args.branch,\n forceOldRelationshipProvenanceMethod: false,\n }\n );\n args.branch.elements.insertAspect(aspectProps);\n }\n\n if (args.createFedGuidsForMaster === true) {\n args.master.close();\n args.branch.close();\n }\n\n return {\n targetScopeElementId: masterExternalSourceId,\n masterExternalSourceId,\n masterRepositoryLinkId: masterRepoLinkId,\n };\n}\n\nfunction makeDbReopener(db: IModelDb) {\n const originalMode = db.isReadonly ? OpenMode.Readonly : OpenMode.ReadWrite;\n const dbPath = db.pathName;\n let reopenDb: (mode?: OpenMode) => IModelDb | Promise<IModelDb>;\n if (db instanceof BriefcaseDb)\n reopenDb = async (mode = originalMode) =>\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"]}
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\";\nimport { pathToFileURL } from \"node:url\";\nimport { transformerPackageMetadata } from \"./TransformerPackageMetadata\";\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,60 @@
1
+ import { IModelDb } from "@itwin/core-backend";
2
+ import { Id64String } from "@itwin/core-bentley";
3
+ import { ChangesetFileProps } from "@itwin/core-common";
4
+ import type { ChangedInstanceIds } from "./IModelExporter";
5
+ /**
6
+ * Metadata retained from a deleted EC instance for later target remapping.
7
+ * Properties are optional when the deleted instance did not contain that value.
8
+ * @internal
9
+ */
10
+ export interface ChangesetDeletionRecord {
11
+ /** ID of the deleted source instance. */
12
+ ecInstanceId: Id64String;
13
+ /** EC class ID of the deleted source instance. */
14
+ ecClassId: Id64String;
15
+ /** Full EC class name resolved from [[ecClassId]]. */
16
+ classFullName?: string;
17
+ /** Federation GUID used to find the corresponding target element. */
18
+ federationGuid?: string;
19
+ /** Source endpoint of a deleted relationship. */
20
+ sourceECInstanceId?: Id64String;
21
+ /** Target endpoint of a deleted relationship. */
22
+ targetECInstanceId?: Id64String;
23
+ /** Scope of a deleted ExternalSourceAspect. */
24
+ scopeId?: Id64String;
25
+ /** Element owning a deleted ElementAspect. */
26
+ elementId?: Id64String;
27
+ /** Kind of a deleted ExternalSourceAspect. */
28
+ kind?: string;
29
+ /** Identifier of a deleted ExternalSourceAspect. */
30
+ identifier?: string;
31
+ }
32
+ /**
33
+ * Pre-delete properties grouped by changeset. [[ChangedInstanceIds]] retains
34
+ * operation sets but not the properties needed to remap deleted instances.
35
+ * Grouping keeps scoped ExternalSourceAspect metadata paired with deletions
36
+ * from the same changeset.
37
+ * @internal
38
+ */
39
+ export type ChangesetDeletionRecordsByChangeset = ChangesetDeletionRecord[][];
40
+ /**
41
+ * Reads each changeset once, unifies table changes into EC instance changes,
42
+ * normalizes overflow-only inserts and deletes to updates, writes all operations
43
+ * to [[ChangedInstanceIds]], and retains properties needed to process deletions.
44
+ * @internal
45
+ */
46
+ export declare class ChangesetScanner {
47
+ /**
48
+ * Scans each changeset file in order with one reader and unifier per file.
49
+ * @param iModel Database used to resolve EC class names.
50
+ * @param csFileProps Ordered changeset files to scan.
51
+ * @param changedInstanceIds Aggregate updated with the unified changes unless disabled by [[options]].
52
+ * @param options Controls whether the aggregate is populated while deletion records are collected.
53
+ * @returns Deleted-instance properties needed after the scan; changed IDs are written to [[changedInstanceIds]].
54
+ */
55
+ static scan(iModel: IModelDb, csFileProps: ChangesetFileProps[], changedInstanceIds: ChangedInstanceIds, options?: {
56
+ populateChangedInstanceIds?: boolean;
57
+ }): Promise<ChangesetDeletionRecordsByChangeset>;
58
+ private static toDeletionRecord;
59
+ }
60
+ //# sourceMappingURL=ChangesetScanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangesetScanner.d.ts","sourceRoot":"","sources":["../../src/ChangesetScanner.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,QAAQ,EAGT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3D;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,YAAY,EAAE,UAAU,CAAC;IACzB,kDAAkD;IAClD,SAAS,EAAE,UAAU,CAAC;IACtB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,+CAA+C;IAC/C,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mCAAmC,GAAG,uBAAuB,EAAE,EAAE,CAAC;AAE9E;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;OAOG;IACH,OAAoB,IAAI,CACtB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,kBAAkB,EAAE,EACjC,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,GAAE;QAAE,0BAA0B,CAAC,EAAE,OAAO,CAAA;KAAO,GACrD,OAAO,CAAC,mCAAmC,CAAC,CAiD9C;IAED,OAAO,CAAC,MAAM,CAAC,gBAAgB;CA4BhC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ChangesetScanner = void 0;
8
+ const core_backend_1 = require("@itwin/core-backend");
9
+ const core_bentley_1 = require("@itwin/core-bentley");
10
+ const IModelTransformerError_1 = require("./IModelTransformerError");
11
+ /**
12
+ * Reads each changeset once, unifies table changes into EC instance changes,
13
+ * normalizes overflow-only inserts and deletes to updates, writes all operations
14
+ * to [[ChangedInstanceIds]], and retains properties needed to process deletions.
15
+ * @internal
16
+ */
17
+ class ChangesetScanner {
18
+ /**
19
+ * Scans each changeset file in order with one reader and unifier per file.
20
+ * @param iModel Database used to resolve EC class names.
21
+ * @param csFileProps Ordered changeset files to scan.
22
+ * @param changedInstanceIds Aggregate updated with the unified changes unless disabled by [[options]].
23
+ * @param options Controls whether the aggregate is populated while deletion records are collected.
24
+ * @returns Deleted-instance properties needed after the scan; changed IDs are written to [[changedInstanceIds]].
25
+ */
26
+ static async scan(iModel, csFileProps, changedInstanceIds, options = {}) {
27
+ const deletionRecordsByChangeset = [];
28
+ for (const csFile of csFileProps) {
29
+ const csReader = core_backend_1.ChangesetReader.openFile({
30
+ fileName: csFile.pathname,
31
+ db: iModel,
32
+ propFilter: core_backend_1.PropertyFilter.BisCoreElement,
33
+ });
34
+ const changeUnifier = new core_backend_1.PartialChangeUnifier();
35
+ try {
36
+ while (csReader.step())
37
+ changeUnifier.appendFrom(csReader);
38
+ const deletionRecords = [];
39
+ for (const change of changeUnifier.instances) {
40
+ const ecClassId = change.ECClassId;
41
+ if (ecClassId === undefined)
42
+ core_bentley_1.ITwinError.throwError({
43
+ iTwinErrorId: {
44
+ scope: IModelTransformerError_1.IModelTransformerErrorScope,
45
+ key: IModelTransformerError_1.IModelTransformerError.ChangedInstanceMetadataMissing,
46
+ },
47
+ message: `ECClassId was not found for id: ${change.ECInstanceId}! Table is : ${change.$meta.tables}`,
48
+ });
49
+ // Change is recorded at table level, not EC entity level.
50
+ // This normalizes overflow-table expansion records so they do not
51
+ // appear as element inserts or deletes.
52
+ if ((change.$meta.op === "Inserted" || change.$meta.op === "Deleted") &&
53
+ change.$meta.tables.every((table) => table.endsWith("Overflow"))) {
54
+ change.$meta.op = "Updated";
55
+ }
56
+ if (options.populateChangedInstanceIds !== false)
57
+ await changedInstanceIds.addChange(change);
58
+ if (change.$meta.op === "Deleted") {
59
+ deletionRecords.push(this.toDeletionRecord(iModel, change));
60
+ }
61
+ }
62
+ deletionRecordsByChangeset.push(deletionRecords);
63
+ }
64
+ finally {
65
+ try {
66
+ changeUnifier[Symbol.dispose]();
67
+ }
68
+ finally {
69
+ csReader[Symbol.dispose]();
70
+ }
71
+ }
72
+ }
73
+ return deletionRecordsByChangeset;
74
+ }
75
+ static toDeletionRecord(iModel, change) {
76
+ const ecClassId = change.ECClassId;
77
+ if (ecClassId === undefined) {
78
+ core_bentley_1.ITwinError.throwError({
79
+ iTwinErrorId: {
80
+ scope: IModelTransformerError_1.IModelTransformerErrorScope,
81
+ key: IModelTransformerError_1.IModelTransformerError.ChangedInstanceMetadataMissing,
82
+ },
83
+ message: `ECClassId was not found for id: ${change.ECInstanceId}! Table is : ${change.$meta.tables}`,
84
+ });
85
+ }
86
+ return {
87
+ ecInstanceId: change.ECInstanceId,
88
+ ecClassId,
89
+ classFullName: iModel.getClassNameFromId(ecClassId),
90
+ federationGuid: change.FederationGuid,
91
+ sourceECInstanceId: change.SourceECInstanceId,
92
+ targetECInstanceId: change.TargetECInstanceId,
93
+ scopeId: change.Scope?.Id,
94
+ elementId: change.Element?.Id,
95
+ kind: change.Kind,
96
+ identifier: change.Identifier,
97
+ };
98
+ }
99
+ }
100
+ exports.ChangesetScanner = ChangesetScanner;
101
+ //# 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\nimport {\n ChangeInstance,\n ChangesetReader,\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\";\nimport {\n IModelTransformerError,\n IModelTransformerErrorScope,\n} from \"./IModelTransformerError\";\n\n/**\n * Metadata retained from a deleted EC instance for later target remapping.\n * Properties are optional when the deleted instance did not contain that value.\n * @internal\n */\nexport interface ChangesetDeletionRecord {\n /** ID of the deleted source instance. */\n ecInstanceId: Id64String;\n /** EC class ID of the deleted source instance. */\n ecClassId: Id64String;\n /** Full EC class name resolved from [[ecClassId]]. */\n classFullName?: string;\n /** Federation GUID used to find the corresponding target element. */\n federationGuid?: string;\n /** Source endpoint of a deleted relationship. */\n sourceECInstanceId?: Id64String;\n /** Target endpoint of a deleted relationship. */\n targetECInstanceId?: Id64String;\n /** Scope of a deleted ExternalSourceAspect. */\n scopeId?: Id64String;\n /** Element owning a deleted ElementAspect. */\n elementId?: Id64String;\n /** Kind of a deleted ExternalSourceAspect. */\n kind?: string;\n /** Identifier of a deleted ExternalSourceAspect. */\n identifier?: string;\n}\n\n/**\n * Pre-delete properties grouped by changeset. [[ChangedInstanceIds]] retains\n * operation sets but not the properties needed to remap deleted instances.\n * Grouping keeps scoped ExternalSourceAspect metadata paired with deletions\n * from the same changeset.\n * @internal\n */\nexport type ChangesetDeletionRecordsByChangeset = ChangesetDeletionRecord[][];\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 retains properties needed to process deletions.\n * @internal\n */\nexport class ChangesetScanner {\n /**\n * Scans each changeset file in order with one reader and unifier per file.\n * @param iModel Database used to resolve EC class names.\n * @param csFileProps Ordered changeset files to scan.\n * @param changedInstanceIds Aggregate updated with the unified changes unless disabled by [[options]].\n * @param options Controls whether the aggregate is populated while deletion records are collected.\n * @returns Deleted-instance properties needed after the scan; changed IDs are written to [[changedInstanceIds]].\n */\n public static async scan(\n iModel: IModelDb,\n csFileProps: ChangesetFileProps[],\n changedInstanceIds: ChangedInstanceIds,\n options: { populateChangedInstanceIds?: boolean } = {}\n ): Promise<ChangesetDeletionRecordsByChangeset> {\n const deletionRecordsByChangeset: ChangesetDeletionRecord[][] = [];\n for (const csFile of csFileProps) {\n const csReader = ChangesetReader.openFile({\n fileName: csFile.pathname,\n db: iModel,\n propFilter: PropertyFilter.BisCoreElement,\n });\n const changeUnifier = new PartialChangeUnifier();\n try {\n while (csReader.step()) changeUnifier.appendFrom(csReader);\n const deletionRecords: ChangesetDeletionRecord[] = [];\n for (const change of changeUnifier.instances) {\n const ecClassId = change.ECClassId;\n if (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\n if (options.populateChangedInstanceIds !== false)\n await changedInstanceIds.addChange(change);\n if (change.$meta.op === \"Deleted\") {\n deletionRecords.push(this.toDeletionRecord(iModel, change));\n }\n }\n deletionRecordsByChangeset.push(deletionRecords);\n } finally {\n try {\n changeUnifier[Symbol.dispose]();\n } finally {\n csReader[Symbol.dispose]();\n }\n }\n }\n\n return deletionRecordsByChangeset;\n }\n\n private static toDeletionRecord(\n iModel: IModelDb,\n change: ChangeInstance\n ): ChangesetDeletionRecord {\n const ecClassId = change.ECClassId;\n if (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 }\n\n return {\n ecInstanceId: change.ECInstanceId,\n ecClassId,\n classFullName: iModel.getClassNameFromId(ecClassId),\n federationGuid: change.FederationGuid,\n sourceECInstanceId: change.SourceECInstanceId,\n targetECInstanceId: change.TargetECInstanceId,\n scopeId: change.Scope?.Id,\n elementId: change.Element?.Id,\n kind: change.Kind,\n identifier: change.Identifier,\n };\n }\n}\n"]}
@@ -22,9 +22,6 @@ export declare class ECReferenceTypesCache {
22
22
  private _propQualifierToRefType;
23
23
  private _relClassNameEndToRefTypes;
24
24
  private _initedSchemas;
25
- private _rootBisClassCache;
26
- private _relationshipInfoCache;
27
- private _constraintClassCache;
28
25
  private static bisRootClassToRefType;
29
26
  private getRootBisClass;
30
27
  private getAbstractConstraintClass;
@@ -1 +1 @@
1
- {"version":3,"file":"ECReferenceTypesCache.d.ts","sourceRoot":"","sources":["../../src/ECReferenceTypesCache.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EACL,mBAAmB,EAEnB,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAY5B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;;CAI7C;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAChC,uGAAuG;IACvG,OAAO,CAAC,uBAAuB,CAG3B;IACJ,OAAO,CAAC,0BAA0B,CAG9B;IACJ,OAAO,CAAC,cAAc,CAAgC;IAGtD,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,sBAAsB,CAA8C;IAC5E,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAalC;YAEY,eAAe;YAmCf,0BAA0B;IAqBxC,8CAA8C;IACjC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAuDtD,kBAAkB;YAalB,UAAU;YAwFV,mBAAmB;IA4D1B,iBAAiB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,SAAS,GAAG,mBAAmB;IAS3B,sBAAsB,CAC3B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,SAAS,GAAG,WAAW;IAQnB,KAAK;CAQb"}
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,CAalC;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;IAEM,KAAK,SAIX;CACF"}