@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
|
@@ -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,23 +5,20 @@
|
|
|
6
5
|
/** @packageDocumentation
|
|
7
6
|
* @module iModels
|
|
8
7
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const TransformerLoggerCategory_1 = require("./TransformerLoggerCategory");
|
|
16
|
-
const IModelTransformerError_1 = require("./IModelTransformerError");
|
|
8
|
+
import { ITwinError, Logger, TupleKeyedMap } from "@itwin/core-bentley";
|
|
9
|
+
import { ConcreteEntityTypes } from "@itwin/core-common";
|
|
10
|
+
import { ECClass, Mixin, RelationshipClass, SchemaKey, StrengthDirection, } from "@itwin/ecschema-metadata";
|
|
11
|
+
import { strict as assert } from "node:assert";
|
|
12
|
+
import { TransformerLoggerCategory } from "./TransformerLoggerCategory.js";
|
|
13
|
+
import { IModelTransformerError, IModelTransformerErrorScope, } from "./IModelTransformerError.js";
|
|
17
14
|
/** The context for transforming a *source* Element to a *target* Element and remapping internal identifiers to the target iModel.
|
|
18
15
|
* @internal
|
|
19
16
|
*/
|
|
20
|
-
class SchemaNotInCacheErr extends Error {
|
|
17
|
+
export class SchemaNotInCacheErr extends Error {
|
|
21
18
|
constructor() {
|
|
22
19
|
super("Schema was not in cache, initialize that schema");
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
exports.SchemaNotInCacheErr = SchemaNotInCacheErr;
|
|
26
22
|
/**
|
|
27
23
|
* A cache of the entity types referenced by navprops in ecchemas, as well as the source and target entity types of
|
|
28
24
|
* The transformer needs the referenced type to determine how to resolve references.
|
|
@@ -31,17 +27,17 @@ exports.SchemaNotInCacheErr = SchemaNotInCacheErr;
|
|
|
31
27
|
* would be to seed the computation from a global cache of non-dynamic schemas, but dynamic schemas can collide willy-nilly
|
|
32
28
|
* @internal
|
|
33
29
|
*/
|
|
34
|
-
class ECReferenceTypesCache {
|
|
30
|
+
export class ECReferenceTypesCache {
|
|
35
31
|
/** nesting based tuple map keyed by qualified property path tuple [schemaName, className, propName] */
|
|
36
|
-
_propQualifierToRefType = new
|
|
37
|
-
_relClassNameEndToRefTypes = new
|
|
32
|
+
_propQualifierToRefType = new TupleKeyedMap();
|
|
33
|
+
_relClassNameEndToRefTypes = new TupleKeyedMap();
|
|
38
34
|
_initedSchemas = new Map();
|
|
39
35
|
static bisRootClassToRefType = {
|
|
40
|
-
Element:
|
|
41
|
-
Model:
|
|
42
|
-
ElementAspect:
|
|
43
|
-
ElementRefersToElements:
|
|
44
|
-
ElementDrivesElement:
|
|
36
|
+
Element: ConcreteEntityTypes.Element,
|
|
37
|
+
Model: ConcreteEntityTypes.Model,
|
|
38
|
+
ElementAspect: ConcreteEntityTypes.ElementAspect,
|
|
39
|
+
ElementRefersToElements: ConcreteEntityTypes.Relationship,
|
|
40
|
+
ElementDrivesElement: ConcreteEntityTypes.Relationship,
|
|
45
41
|
// code spec is technically a potential root class but it is ignored currently
|
|
46
42
|
// see [ConcreteEntityTypes]($common)
|
|
47
43
|
};
|
|
@@ -60,8 +56,8 @@ class ECReferenceTypesCache {
|
|
|
60
56
|
return false;
|
|
61
57
|
});
|
|
62
58
|
// if the root class of the constraint was a mixin, use its AppliesToEntityClass
|
|
63
|
-
if (bisRootForConstraint instanceof
|
|
64
|
-
(
|
|
59
|
+
if (bisRootForConstraint instanceof Mixin) {
|
|
60
|
+
assert(bisRootForConstraint.appliesTo !== undefined, "The referenced AppliesToEntityClass could not be found, how did it pass schema validation?");
|
|
65
61
|
bisRootForConstraint = await this.getRootBisClass(await bisRootForConstraint.appliesTo);
|
|
66
62
|
}
|
|
67
63
|
return bisRootForConstraint;
|
|
@@ -70,7 +66,7 @@ class ECReferenceTypesCache {
|
|
|
70
66
|
// constraint classes must share a base so we can get the root from any of them, just use the first
|
|
71
67
|
const ecclass = await (constraint.constraintClasses?.[0] ||
|
|
72
68
|
constraint.abstractConstraint);
|
|
73
|
-
(
|
|
69
|
+
assert(ecclass !== undefined, "At least one constraint class or an abstract constraint must have been defined, the constraint is not valid");
|
|
74
70
|
return ecclass;
|
|
75
71
|
}
|
|
76
72
|
/** initialize from an imodel with metadata */
|
|
@@ -91,13 +87,13 @@ class ECReferenceTypesCache {
|
|
|
91
87
|
usePrimaryConn: true,
|
|
92
88
|
})) {
|
|
93
89
|
const schemaName = row.name;
|
|
94
|
-
const schemaItemKey = new
|
|
90
|
+
const schemaItemKey = new SchemaKey(schemaName);
|
|
95
91
|
const schema = await imodel.schemaContext.getSchema(schemaItemKey);
|
|
96
92
|
if (!schema) {
|
|
97
|
-
|
|
93
|
+
ITwinError.throwError({
|
|
98
94
|
iTwinErrorId: {
|
|
99
|
-
scope:
|
|
100
|
-
key:
|
|
95
|
+
scope: IModelTransformerErrorScope,
|
|
96
|
+
key: IModelTransformerError.SchemaLoadFailed,
|
|
101
97
|
},
|
|
102
98
|
message: `Failed to load schema: ${schemaName}`,
|
|
103
99
|
});
|
|
@@ -108,7 +104,7 @@ class ECReferenceTypesCache {
|
|
|
108
104
|
async considerInitSchema(schema) {
|
|
109
105
|
if (this._initedSchemas.has(schema.name)) {
|
|
110
106
|
const cachedSchemaKey = this._initedSchemas.get(schema.name);
|
|
111
|
-
(
|
|
107
|
+
assert(cachedSchemaKey !== undefined);
|
|
112
108
|
const incomingSchemaIsEqualOrOlder = schema.schemaKey.compareByVersion(cachedSchemaKey) <= 0;
|
|
113
109
|
if (incomingSchemaIsEqualOrOlder) {
|
|
114
110
|
return;
|
|
@@ -117,7 +113,7 @@ class ECReferenceTypesCache {
|
|
|
117
113
|
return this.initSchema(schema);
|
|
118
114
|
}
|
|
119
115
|
async initSchema(schema) {
|
|
120
|
-
|
|
116
|
+
Logger.logTrace(TransformerLoggerCategory.ECReferenceTypesCache, `initSchema started for ${schema.name}`);
|
|
121
117
|
const schemaNameLower = schema.name.toLowerCase();
|
|
122
118
|
// Local dedup map — scoped to this single initSchema call, not persisted
|
|
123
119
|
const localRelInfoMap = new Map();
|
|
@@ -131,10 +127,10 @@ class ECReferenceTypesCache {
|
|
|
131
127
|
};
|
|
132
128
|
// Process all classes concurrently
|
|
133
129
|
const classPromises = Array.from(schema.getItems())
|
|
134
|
-
.filter((item) =>
|
|
130
|
+
.filter((item) => ECClass.isECClass(item))
|
|
135
131
|
.map(async (ecclass) => {
|
|
136
132
|
// Handle relationship end types
|
|
137
|
-
if (ecclass instanceof
|
|
133
|
+
if (ecclass instanceof RelationshipClass) {
|
|
138
134
|
const relInfo = await getRelInfo(ecclass);
|
|
139
135
|
if (relInfo) {
|
|
140
136
|
this._relClassNameEndToRefTypes.set([schemaNameLower, ecclass.name.toLowerCase()], relInfo);
|
|
@@ -152,7 +148,7 @@ class ECReferenceTypesCache {
|
|
|
152
148
|
const relInfo = await getRelInfo(relClass);
|
|
153
149
|
if (relInfo === undefined)
|
|
154
150
|
return;
|
|
155
|
-
const navPropRefType = prop.direction ===
|
|
151
|
+
const navPropRefType = prop.direction === StrengthDirection.Forward
|
|
156
152
|
? relInfo.target
|
|
157
153
|
: relInfo.source;
|
|
158
154
|
this._propQualifierToRefType.set([schemaNameLower, classNameLower, prop.name.toLowerCase()], navPropRefType);
|
|
@@ -161,11 +157,11 @@ class ECReferenceTypesCache {
|
|
|
161
157
|
});
|
|
162
158
|
await Promise.all(classPromises);
|
|
163
159
|
this._initedSchemas.set(schema.name, schema.schemaKey);
|
|
164
|
-
|
|
160
|
+
Logger.logTrace(TransformerLoggerCategory.ECReferenceTypesCache, `initSchema completed for ${schema.name}`);
|
|
165
161
|
}
|
|
166
162
|
async relInfoFromRelClass(ecclass) {
|
|
167
|
-
(
|
|
168
|
-
(
|
|
163
|
+
assert(ecclass.source.constraintClasses !== undefined);
|
|
164
|
+
assert(ecclass.target.constraintClasses !== undefined);
|
|
169
165
|
const [[sourceClass, sourceRootBisClass], [targetClass, targetRootBisClass],] = await Promise.all([
|
|
170
166
|
this.getAbstractConstraintClass(ecclass.source).then(async (constraintClass) => [
|
|
171
167
|
constraintClass,
|
|
@@ -194,8 +190,8 @@ class ECReferenceTypesCache {
|
|
|
194
190
|
`the nav prop reference type cache for ${cls.fullName}.`,
|
|
195
191
|
"This is a bug.",
|
|
196
192
|
].join("\n");
|
|
197
|
-
(
|
|
198
|
-
(
|
|
193
|
+
assert(sourceType !== undefined, makeAssertMsg(sourceRootBisClass, sourceClass));
|
|
194
|
+
assert(targetType !== undefined, makeAssertMsg(targetRootBisClass, targetClass));
|
|
199
195
|
return { source: sourceType, target: targetType };
|
|
200
196
|
}
|
|
201
197
|
getNavPropRefType(schemaName, className, propName) {
|
|
@@ -216,5 +212,4 @@ class ECReferenceTypesCache {
|
|
|
216
212
|
]);
|
|
217
213
|
}
|
|
218
214
|
}
|
|
219
|
-
exports.ECReferenceTypesCache = ECReferenceTypesCache;
|
|
220
215
|
//# sourceMappingURL=ECReferenceTypesCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECReferenceTypesCache.js","sourceRoot":"","sources":["../src/ECReferenceTypesCache.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 { ITwinError, Logger, TupleKeyedMap } from \"@itwin/core-bentley\";\nimport { ConcreteEntityTypes, RelTypeInfo } from \"@itwin/core-common\";\nimport {\n ECClass,\n Mixin,\n Property,\n RelationshipClass,\n RelationshipConstraint,\n Schema,\n SchemaKey,\n StrengthDirection,\n} from \"@itwin/ecschema-metadata\";\nimport { strict as assert } from \"node:assert\";\nimport { IModelDb } from \"@itwin/core-backend\";\nimport { TransformerLoggerCategory } from \"./TransformerLoggerCategory.js\";\nimport {\n IModelTransformerError,\n IModelTransformerErrorScope,\n} from \"./IModelTransformerError.js\";\n\n/** The context for transforming a *source* Element to a *target* Element and remapping internal identifiers to the target iModel.\n * @internal\n */\nexport class SchemaNotInCacheErr extends Error {\n public constructor() {\n super(\"Schema was not in cache, initialize that schema\");\n }\n}\n\n/**\n * A cache of the entity types referenced by navprops in ecchemas, as well as the source and target entity types of\n * The transformer needs the referenced type to determine how to resolve references.\n *\n * Using multiple of these usually performs redundant computation, for static schemas at least. A possible future optimization\n * would be to seed the computation from a global cache of non-dynamic schemas, but dynamic schemas can collide willy-nilly\n * @internal\n */\nexport class ECReferenceTypesCache {\n /** nesting based tuple map keyed by qualified property path tuple [schemaName, className, propName] */\n private _propQualifierToRefType = new TupleKeyedMap<\n [string, string, string],\n ConcreteEntityTypes\n >();\n private _relClassNameEndToRefTypes = new TupleKeyedMap<\n [string, string],\n RelTypeInfo\n >();\n private _initedSchemas = new Map<string, SchemaKey>();\n\n private static bisRootClassToRefType: Record<\n string,\n ConcreteEntityTypes | undefined\n > = {\n Element: ConcreteEntityTypes.Element,\n Model: ConcreteEntityTypes.Model,\n ElementAspect: ConcreteEntityTypes.ElementAspect,\n ElementRefersToElements: ConcreteEntityTypes.Relationship,\n ElementDrivesElement: ConcreteEntityTypes.Relationship,\n // code spec is technically a potential root class but it is ignored currently\n // see [ConcreteEntityTypes]($common)\n };\n\n private async getRootBisClass(ecclass: ECClass) {\n let bisRootForConstraint: ECClass = ecclass;\n await ecclass.traverseBaseClasses((baseClass) => {\n // The depth first traversal will descend all the way to the root class before making any lateral traversal\n // of mixin hierarchies, (or if the constraint is a mixin, it will traverse to the root of the mixin hierarchy)\n // Once we see that we've moved laterally, we can terminate early\n const isFirstTest = bisRootForConstraint === ecclass;\n const traversalSwitchedRootPath =\n baseClass.name !== bisRootForConstraint.baseClass?.name;\n const stillTraversingRootPath = isFirstTest || !traversalSwitchedRootPath;\n if (!stillTraversingRootPath) return true; // stop traversal early\n bisRootForConstraint = baseClass;\n return false;\n });\n // if the root class of the constraint was a mixin, use its AppliesToEntityClass\n if (bisRootForConstraint instanceof Mixin) {\n assert(\n bisRootForConstraint.appliesTo !== undefined,\n \"The referenced AppliesToEntityClass could not be found, how did it pass schema validation?\"\n );\n bisRootForConstraint = await this.getRootBisClass(\n await bisRootForConstraint.appliesTo\n );\n }\n return bisRootForConstraint;\n }\n\n private async getAbstractConstraintClass(\n constraint: RelationshipConstraint\n ): Promise<ECClass> {\n // constraint classes must share a base so we can get the root from any of them, just use the first\n const ecclass = await (constraint.constraintClasses?.[0] ||\n constraint.abstractConstraint);\n assert(\n ecclass !== undefined,\n \"At least one constraint class or an abstract constraint must have been defined, the constraint is not valid\"\n );\n return ecclass;\n }\n\n /** initialize from an imodel with metadata */\n public async initAllSchemasInIModel(imodel: IModelDb): Promise<void> {\n const query = `\n WITH RECURSIVE refs(SchemaId) AS (\n SELECT ECInstanceId FROM ECDbMeta.ECSchemaDef WHERE Name='BisCore'\n UNION\n SELECT sr.SourceECInstanceId\n FROM ECDbMeta.SchemaHasSchemaReferences sr\n JOIN refs ON sr.TargetECInstanceId = refs.SchemaId\n )\n SELECT s.Name as name\n FROM refs\n JOIN ECDbMeta.ECSchemaDef s ON refs.SchemaId=s.ECInstanceId\n `;\n\n for await (const row of imodel.createQueryReader(query, undefined, {\n usePrimaryConn: true,\n })) {\n const schemaName = row.name;\n const schemaItemKey = new SchemaKey(schemaName);\n const schema = await imodel.schemaContext.getSchema(schemaItemKey);\n if (!schema) {\n ITwinError.throwError({\n iTwinErrorId: {\n scope: IModelTransformerErrorScope,\n key: IModelTransformerError.SchemaLoadFailed,\n },\n message: `Failed to load schema: ${schemaName}`,\n });\n }\n await this.considerInitSchema(schema);\n }\n }\n\n private async considerInitSchema(schema: Schema): Promise<void> {\n if (this._initedSchemas.has(schema.name)) {\n const cachedSchemaKey = this._initedSchemas.get(schema.name);\n assert(cachedSchemaKey !== undefined);\n const incomingSchemaIsEqualOrOlder =\n schema.schemaKey.compareByVersion(cachedSchemaKey) <= 0;\n if (incomingSchemaIsEqualOrOlder) {\n return;\n }\n }\n return this.initSchema(schema);\n }\n\n private async initSchema(schema: Schema): Promise<void> {\n Logger.logTrace(\n TransformerLoggerCategory.ECReferenceTypesCache,\n `initSchema started for ${schema.name}`\n );\n const schemaNameLower = schema.name.toLowerCase();\n\n // Local dedup map — scoped to this single initSchema call, not persisted\n const localRelInfoMap = new Map<string, Promise<RelTypeInfo | undefined>>();\n\n const getRelInfo = async (relClass: RelationshipClass) => {\n let promise = localRelInfoMap.get(relClass.fullName);\n if (!promise) {\n promise = this.relInfoFromRelClass(relClass);\n localRelInfoMap.set(relClass.fullName, promise);\n }\n return promise;\n };\n\n // Process all classes concurrently\n const classPromises = Array.from(schema.getItems())\n .filter((item): item is ECClass => ECClass.isECClass(item))\n .map(async (ecclass) => {\n // Handle relationship end types\n if (ecclass instanceof RelationshipClass) {\n const relInfo = await getRelInfo(ecclass);\n if (relInfo) {\n this._relClassNameEndToRefTypes.set(\n [schemaNameLower, ecclass.name.toLowerCase()],\n relInfo\n );\n }\n }\n\n // Handle nav props\n const properties = await ecclass.getProperties();\n const classNameLower = ecclass.name.toLowerCase();\n\n const navPropPromises = Array.from(properties)\n .filter((prop: Property) => prop.isNavigation())\n .map(async (prop: Property) => {\n if (!prop.isNavigation()) return;\n const relClass = await prop.relationshipClass;\n const relInfo = await getRelInfo(relClass);\n if (relInfo === undefined) return;\n\n const navPropRefType =\n prop.direction === StrengthDirection.Forward\n ? relInfo.target\n : relInfo.source;\n\n this._propQualifierToRefType.set(\n [schemaNameLower, classNameLower, prop.name.toLowerCase()],\n navPropRefType\n );\n });\n\n await Promise.all(navPropPromises);\n });\n\n await Promise.all(classPromises);\n this._initedSchemas.set(schema.name, schema.schemaKey);\n Logger.logTrace(\n TransformerLoggerCategory.ECReferenceTypesCache,\n `initSchema completed for ${schema.name}`\n );\n }\n\n private async relInfoFromRelClass(\n ecclass: RelationshipClass\n ): Promise<RelTypeInfo | undefined> {\n assert(ecclass.source.constraintClasses !== undefined);\n assert(ecclass.target.constraintClasses !== undefined);\n const [\n [sourceClass, sourceRootBisClass],\n [targetClass, targetRootBisClass],\n ] = await Promise.all([\n this.getAbstractConstraintClass(ecclass.source).then(\n async (constraintClass) => [\n constraintClass,\n await this.getRootBisClass(constraintClass),\n ]\n ),\n this.getAbstractConstraintClass(ecclass.target).then(\n async (constraintClass) => [\n constraintClass,\n await this.getRootBisClass(constraintClass),\n ]\n ),\n ]);\n\n if (\n sourceRootBisClass.name === \"CodeSpec\" ||\n targetRootBisClass.name === \"CodeSpec\"\n )\n return undefined;\n const sourceType =\n ECReferenceTypesCache.bisRootClassToRefType[sourceRootBisClass.name];\n const targetType =\n ECReferenceTypesCache.bisRootClassToRefType[targetRootBisClass.name];\n if (\n (!sourceType &&\n sourceRootBisClass.customAttributes?.has(\"ECDbMap.QueryView\")) ||\n (!targetType &&\n targetRootBisClass.customAttributes?.has(\"ECDbMap.QueryView\"))\n ) {\n // ECView elements are not \"real\" data and transformer does not need to process them.\n // Relationships that point to ECView elements can only be used in ECViews so the mapping is not needed.\n return undefined;\n }\n\n const makeAssertMsg = (root: ECClass, cls: ECClass) =>\n [\n `An unknown root class '${root.fullName}' was encountered while populating`,\n `the nav prop reference type cache for ${cls.fullName}.`,\n \"This is a bug.\",\n ].join(\"\\n\");\n assert(\n sourceType !== undefined,\n makeAssertMsg(sourceRootBisClass, sourceClass)\n );\n assert(\n targetType !== undefined,\n makeAssertMsg(targetRootBisClass, targetClass)\n );\n return { source: sourceType, target: targetType };\n }\n\n public getNavPropRefType(\n schemaName: string,\n className: string,\n propName: string\n ): undefined | ConcreteEntityTypes {\n if (!this._initedSchemas.has(schemaName)) throw new SchemaNotInCacheErr();\n return this._propQualifierToRefType.get([\n schemaName.toLowerCase(),\n className.toLowerCase(),\n propName.toLowerCase(),\n ]);\n }\n\n public getRelationshipEndType(\n schemaName: string,\n className: string\n ): undefined | RelTypeInfo {\n if (!this._initedSchemas.has(schemaName)) throw new SchemaNotInCacheErr();\n return this._relClassNameEndToRefTypes.get([\n schemaName.toLowerCase(),\n className.toLowerCase(),\n ]);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSqlReaderAsyncIterableIteratorAdapter.d.ts","sourceRoot":"","sources":["../src/ECSqlReaderAsyncIterableIteratorAdapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;GAIG;AACH,qBAAa,uCAAwC,YAAW,qBAAqB,CAAC,aAAa,CAAC;IAC/E,OAAO,CAAC,YAAY;IAAvC,YAA2B,YAAY,EAAE,WAAW,EAAI;IAEjD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAEpE;IAEY,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAM/D;CACF;AAED;;;;GAIG;AACH,wBAAgB,wCAAwC,CACtD,WAAW,EACP,CAAC,WAAW,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC,GACpD,IAAI,CAAC,WAAW,EAAE,MAAM,qBAAqB,CAAC,aAAa,CAAC,CAAC,GAChE,qBAAqB,CAAC,aAAa,CAAC,CAUtC"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*---------------------------------------------------------------------------------------------
|
|
3
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
4
|
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ECSqlReaderAsyncIterableIteratorAdapter = void 0;
|
|
8
|
-
exports.ensureECSqlReaderIsAsyncIterableIterator = ensureECSqlReaderIsAsyncIterableIterator;
|
|
9
5
|
/**
|
|
10
6
|
* Adapter class for ECSqlReader for AsyncIterableIterator interface.
|
|
11
7
|
* It allows to iterate through query results in itwin 3.x using for await() syntax like using itwin 4.x version.
|
|
12
8
|
* @internal
|
|
13
9
|
*/
|
|
14
|
-
class ECSqlReaderAsyncIterableIteratorAdapter {
|
|
10
|
+
export class ECSqlReaderAsyncIterableIteratorAdapter {
|
|
15
11
|
_ecSqlReader;
|
|
16
12
|
constructor(_ecSqlReader) {
|
|
17
13
|
this._ecSqlReader = _ecSqlReader;
|
|
@@ -27,13 +23,12 @@ class ECSqlReaderAsyncIterableIteratorAdapter {
|
|
|
27
23
|
};
|
|
28
24
|
}
|
|
29
25
|
}
|
|
30
|
-
exports.ECSqlReaderAsyncIterableIteratorAdapter = ECSqlReaderAsyncIterableIteratorAdapter;
|
|
31
26
|
/**
|
|
32
27
|
* Wraps ECSqlReader with ECSqlReaderAsyncIterableIteratorAdapter if it's needed.
|
|
33
28
|
* @param ecSqlReader ECSqlReader isntance from itwin 3.x or 4.x version
|
|
34
29
|
* @internal
|
|
35
30
|
*/
|
|
36
|
-
function ensureECSqlReaderIsAsyncIterableIterator(ecSqlReader) {
|
|
31
|
+
export function ensureECSqlReaderIsAsyncIterableIterator(ecSqlReader) {
|
|
37
32
|
if (Symbol.asyncIterator in ecSqlReader) {
|
|
38
33
|
// using itwin 4.x
|
|
39
34
|
return ecSqlReader;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ECSqlReaderAsyncIterableIteratorAdapter.js","sourceRoot":"","sources":["../src/ECSqlReaderAsyncIterableIteratorAdapter.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAIhG;;;;GAIG;AACH,MAAM,OAAO,uCAAuC;IACvB,YAAY;IAAvC,YAA2B,YAAyB;4BAAzB,YAAY;IAAgB,CAAC;IAEjD,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO;SACjC,CAAC;IACJ,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,wCAAwC,CACtD,WAEiE;IAEjE,IAAI,MAAM,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;QACxC,kBAAkB;QAClB,OAAO,WAAW,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,kBAAkB;QAClB,OAAO,IAAI,uCAAuC,CAChD,WAA0B,CAC3B,CAAC;IACJ,CAAC;AACH,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\nimport { ECSqlReader, QueryRowProxy } from \"@itwin/core-common\";\n\n/**\n * Adapter class for ECSqlReader for AsyncIterableIterator interface.\n * It allows to iterate through query results in itwin 3.x using for await() syntax like using itwin 4.x version.\n * @internal\n */\nexport class ECSqlReaderAsyncIterableIteratorAdapter implements AsyncIterableIterator<QueryRowProxy> {\n public constructor(private _ecSqlReader: ECSqlReader) {}\n\n public [Symbol.asyncIterator](): AsyncIterableIterator<QueryRowProxy> {\n return this;\n }\n\n public async next(): Promise<IteratorResult<QueryRowProxy, any>> {\n const done = !(await this._ecSqlReader.step());\n return {\n done,\n value: this._ecSqlReader.current,\n };\n }\n}\n\n/**\n * Wraps ECSqlReader with ECSqlReaderAsyncIterableIteratorAdapter if it's needed.\n * @param ecSqlReader ECSqlReader isntance from itwin 3.x or 4.x version\n * @internal\n */\nexport function ensureECSqlReaderIsAsyncIterableIterator(\n ecSqlReader:\n | (ECSqlReader & AsyncIterableIterator<QueryRowProxy>)\n | Omit<ECSqlReader, keyof AsyncIterableIterator<QueryRowProxy>>\n): AsyncIterableIterator<QueryRowProxy> {\n if (Symbol.asyncIterator in ecSqlReader) {\n // using itwin 4.x\n return ecSqlReader;\n } else {\n // using itwin 3.x\n return new ECSqlReaderAsyncIterableIteratorAdapter(\n ecSqlReader as ECSqlReader\n );\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectCleanup.d.ts","sourceRoot":"","sources":["../src/ElementAspectCleanup.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,OAAO,EACP,aAAa,EAIb,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;GAEG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,YACmB,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,OAAO,EACjB,aAAa,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,EACtE;IAEJ;;OAEG;IACU,MAAM,CACjB,gBAAgB,EAAE,WAAW,CAAC,UAAU,CAAC,EACzC,mCAAmC,EAAE,WAAW,CAAC,MAAM,CAAC,EACxD,iBAAiB,CAAC,EAAE,UAAU,EAC9B,QAAQ,SAAwB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA8Cf;CACF"}
|
|
@@ -1,16 +1,13 @@
|
|
|
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
|
-
const core_backend_1 = require("@itwin/core-backend");
|
|
9
|
-
const core_common_1 = require("@itwin/core-common");
|
|
5
|
+
import { ElementMultiAspect, ElementUniqueAspect, ExternalSourceAspect, IModelDb, } from "@itwin/core-backend";
|
|
6
|
+
import { QueryBinder } from "@itwin/core-common";
|
|
10
7
|
/** Deletes replaceable ElementAspects for target owners while preserving excluded classes and transformer provenance aspects.
|
|
11
8
|
* @internal
|
|
12
9
|
*/
|
|
13
|
-
class ElementAspectCleanup {
|
|
10
|
+
export class ElementAspectCleanup {
|
|
14
11
|
_targetDb;
|
|
15
12
|
_editTxn;
|
|
16
13
|
_deleteAspect;
|
|
@@ -22,7 +19,7 @@ class ElementAspectCleanup {
|
|
|
22
19
|
/** Deletes replaceable unique and multi-aspects owned by the supplied target elements.
|
|
23
20
|
* Excluded classes and transformer provenance aspects for `provenanceScopeId` are preserved. Each deletion is performed through the configured callback and requires the target `EditTxn` to be active.
|
|
24
21
|
*/
|
|
25
|
-
async delete(targetElementIds, excludedElementAspectClassFullNames, provenanceScopeId, pageSize =
|
|
22
|
+
async delete(targetElementIds, excludedElementAspectClassFullNames, provenanceScopeId, pageSize = IModelDb.maxLimit - 1) {
|
|
26
23
|
if (!this._editTxn.isActive) {
|
|
27
24
|
throw new Error("The target EditTxn must be active when deleting ElementAspects.");
|
|
28
25
|
}
|
|
@@ -35,8 +32,8 @@ class ElementAspectCleanup {
|
|
|
35
32
|
...excludedElementAspectClassFullNames,
|
|
36
33
|
].filter((classFullName) => this._targetDb.containsClass(classFullName));
|
|
37
34
|
for (const aspectClassFullName of [
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
ElementUniqueAspect.classFullName,
|
|
36
|
+
ElementMultiAspect.classFullName,
|
|
40
37
|
]) {
|
|
41
38
|
const { ecsql, params } = replaceableAspectQuery(aspectClassFullName, targetElementIds, targetExcludedElementAspectClassFullNames, provenanceScopeId, pageSize);
|
|
42
39
|
while (true) {
|
|
@@ -56,10 +53,9 @@ class ElementAspectCleanup {
|
|
|
56
53
|
}
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
|
-
exports.ElementAspectCleanup = ElementAspectCleanup;
|
|
60
56
|
/** Builds the page query for aspects of `aspectClassFullName` owned by `elementIds`, skipping excluded classes and provenance aspects for `provenanceScopeId`. */
|
|
61
57
|
function replaceableAspectQuery(aspectClassFullName, elementIds, excludedClassFullNames, provenanceScopeId, pageSize) {
|
|
62
|
-
const params = new
|
|
58
|
+
const params = new QueryBinder().bindIdSet("elementIds", elementIds);
|
|
63
59
|
const conditions = [];
|
|
64
60
|
if (excludedClassFullNames.length > 0) {
|
|
65
61
|
conditions.push(`aspect.ECClassId IS NOT (${excludedClassFullNames.join(", ")})`);
|
|
@@ -68,10 +64,10 @@ function replaceableAspectQuery(aspectClassFullName, elementIds, excludedClassFu
|
|
|
68
64
|
// when querying ElementMultiAspect. For each candidate, check whether it is a
|
|
69
65
|
// provenance aspect rather than listing every provenance aspect on each page.
|
|
70
66
|
if (provenanceScopeId !== undefined &&
|
|
71
|
-
aspectClassFullName ===
|
|
67
|
+
aspectClassFullName === ElementMultiAspect.classFullName) {
|
|
72
68
|
params.bindId("provenanceScopeId", provenanceScopeId);
|
|
73
69
|
conditions.push(`NOT EXISTS (
|
|
74
|
-
SELECT 1 FROM ${
|
|
70
|
+
SELECT 1 FROM ${ExternalSourceAspect.classFullName} esa
|
|
75
71
|
WHERE esa.ECInstanceId = aspect.ECInstanceId
|
|
76
72
|
AND (esa.Element.Id = :provenanceScopeId OR esa.Scope.Id = :provenanceScopeId)
|
|
77
73
|
)`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectCleanup.js","sourceRoot":"","sources":["../src/ElementAspectCleanup.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 EditTxn,\n ElementAspect,\n ElementMultiAspect,\n ElementUniqueAspect,\n ExternalSourceAspect,\n IModelDb,\n} from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { QueryBinder } from \"@itwin/core-common\";\n\n/** Deletes replaceable ElementAspects for target owners while preserving excluded classes and transformer provenance aspects.\n * @internal\n */\nexport class ElementAspectCleanup {\n public constructor(\n private readonly _targetDb: IModelDb,\n private readonly _editTxn: EditTxn,\n private readonly _deleteAspect: (aspect: ElementAspect) => Promise<void>\n ) {}\n\n /** Deletes replaceable unique and multi-aspects owned by the supplied target elements.\n * Excluded classes and transformer provenance aspects for `provenanceScopeId` are preserved. Each deletion is performed through the configured callback and requires the target `EditTxn` to be active.\n */\n public async delete(\n targetElementIds: ReadonlySet<Id64String>,\n excludedElementAspectClassFullNames: ReadonlySet<string>,\n provenanceScopeId?: Id64String,\n pageSize = IModelDb.maxLimit - 1\n ): Promise<void> {\n if (!this._editTxn.isActive) {\n throw new Error(\n \"The target EditTxn must be active when deleting ElementAspects.\"\n );\n }\n if (pageSize <= 0 || !Number.isSafeInteger(pageSize)) {\n throw new Error(\n \"ElementAspect deletion pageSize must be a positive integer.\"\n );\n }\n if (targetElementIds.size === 0) return;\n\n const targetExcludedElementAspectClassFullNames = [\n ...excludedElementAspectClassFullNames,\n ].filter((classFullName) => this._targetDb.containsClass(classFullName));\n for (const aspectClassFullName of [\n ElementUniqueAspect.classFullName,\n ElementMultiAspect.classFullName,\n ]) {\n const { ecsql, params } = replaceableAspectQuery(\n aspectClassFullName,\n targetElementIds,\n targetExcludedElementAspectClassFullNames,\n provenanceScopeId,\n pageSize\n );\n while (true) {\n // Drain the full page before deleting: mutating a table while a reader is still\n // scanning it is unsafe.\n const candidateIds: Id64String[] = [];\n for await (const row of this._targetDb.createQueryReader(\n ecsql,\n params,\n { usePrimaryConn: true }\n )) {\n candidateIds.push(row.id);\n }\n if (candidateIds.length === 0) break;\n\n for (const aspectId of candidateIds) {\n const aspect = this._targetDb.elements.getAspect(aspectId);\n await this._deleteAspect(aspect);\n }\n }\n }\n }\n}\n\n/** Builds the page query for aspects of `aspectClassFullName` owned by `elementIds`, skipping excluded classes and provenance aspects for `provenanceScopeId`. */\nfunction replaceableAspectQuery(\n aspectClassFullName: string,\n elementIds: ReadonlySet<Id64String>,\n excludedClassFullNames: readonly string[],\n provenanceScopeId: Id64String | undefined,\n pageSize: number\n): { ecsql: string; params: QueryBinder } {\n const params = new QueryBinder().bindIdSet(\"elementIds\", elementIds);\n const conditions: string[] = [];\n if (excludedClassFullNames.length > 0) {\n conditions.push(\n `aspect.ECClassId IS NOT (${excludedClassFullNames.join(\", \")})`\n );\n }\n // ExternalSourceAspect is a multi-aspect, so provenance aspects are only found\n // when querying ElementMultiAspect. For each candidate, check whether it is a\n // provenance aspect rather than listing every provenance aspect on each page.\n if (\n provenanceScopeId !== undefined &&\n aspectClassFullName === ElementMultiAspect.classFullName\n ) {\n params.bindId(\"provenanceScopeId\", provenanceScopeId);\n conditions.push(`NOT EXISTS (\n SELECT 1 FROM ${ExternalSourceAspect.classFullName} esa\n WHERE esa.ECInstanceId = aspect.ECInstanceId\n AND (esa.Element.Id = :provenanceScopeId OR esa.Scope.Id = :provenanceScopeId)\n )`);\n }\n const whereClause =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n const ecsql = `SELECT aspect.ECInstanceId as id\n FROM ${aspectClassFullName} aspect\n INNER JOIN IdSet(:elementIds) ids ON ids.id = aspect.Element.Id\n ${whereClause}\n LIMIT ${pageSize}`;\n return { ecsql, params };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectExportCoordinator.d.ts","sourceRoot":"","sources":["../src/ElementAspectExportCoordinator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,MAAM,8BAA8B,GAAG,CAC3C,mCAAmC,EAAE,WAAW,CAAC,MAAM,CAAC,EACxD,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,qBAAa,8BAA8B;IAQvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAG/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAZ/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyB;IAC3D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAyB;IAC5D,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAElD,YACmB,iBAAiB,EAAE,MAAM,EACzB,uBAAuB,EAAE,MAAM,WAAW,CAAC,MAAM,CAAC,EAClD,cAAc,EAAE,CAC/B,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,KACrC,OAAO,CAAC,IAAI,CAAC,EACD,YAAY,GAAE,MAAM,IAAe,EAGrD;IAED,4DAA4D;IAC5D,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,iGAAiG;IAC1F,cAAc,CAAC,OAAO,EAAE,8BAA8B,GAAG,IAAI,CAEnE;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,SAAyB,GAAG,IAAI,CAOrD;IAED;;OAEG;IACU,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAehC;IAED,kFAAkF;IAC3E,KAAK,IAAI,IAAI,CAEnB;IAED;;OAEG;IACU,GAAG,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnE;IAED,0HAA0H;IAC7G,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE;IAED,sFAAsF;IACzE,YAAY,CACvB,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CA8Bf;YAEa,gBAAgB;YAOhB,KAAK;IAMnB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,KAAK;CAKd"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*---------------------------------------------------------------------------------------------
|
|
3
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
4
|
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ElementAspectExportCoordinator = void 0;
|
|
8
5
|
/** Coordinates scoped batches of accepted ElementAspect owners, including preparation before aspect export.
|
|
9
6
|
* @internal
|
|
10
7
|
*/
|
|
11
|
-
class ElementAspectExportCoordinator {
|
|
8
|
+
export class ElementAspectExportCoordinator {
|
|
12
9
|
_defaultBatchSize;
|
|
13
10
|
_excludedClassFullNames;
|
|
14
11
|
_exportAspects;
|
|
@@ -144,5 +141,4 @@ class ElementAspectExportCoordinator {
|
|
|
144
141
|
this._batchSize = this._defaultBatchSize;
|
|
145
142
|
}
|
|
146
143
|
}
|
|
147
|
-
exports.ElementAspectExportCoordinator = ElementAspectExportCoordinator;
|
|
148
144
|
//# sourceMappingURL=ElementAspectExportCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectExportCoordinator.js","sourceRoot":"","sources":["../src/ElementAspectExportCoordinator.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 { Id64String } from \"@itwin/core-bentley\";\n\nexport type ElementAspectExportPreparation = (\n excludedElementAspectClassFullNames: ReadonlySet<string>,\n ownerElementIds: ReadonlySet<Id64String>\n) => Promise<void>;\n\n/** Coordinates scoped batches of accepted ElementAspect owners, including preparation before aspect export.\n * @internal\n */\nexport class ElementAspectExportCoordinator {\n private readonly _acceptedOwnerIds = new Set<Id64String>();\n private readonly _processedOwnerIds = new Set<Id64String>();\n private _batchSize: number;\n private _depth = 0;\n private _prepare?: ElementAspectExportPreparation;\n\n public constructor(\n private readonly _defaultBatchSize: number,\n private readonly _excludedClassFullNames: () => ReadonlySet<string>,\n private readonly _exportAspects: (\n ownerElementIds: ReadonlySet<Id64String>\n ) => Promise<void>,\n private readonly _resetCaches: () => void = () => {}\n ) {\n this._batchSize = _defaultBatchSize;\n }\n\n /** Whether an accepted-owner collection scope is active. */\n public get isActive(): boolean {\n return this._depth > 0;\n }\n\n /** Sets the callback that prepares each accepted-owner group before its aspects are exported. */\n public setPreparation(prepare: ElementAspectExportPreparation): void {\n this._prepare = prepare;\n }\n\n /** Begins an accepted-owner collection scope.\n * Nested scopes share the outer scope's state and batch size.\n */\n public begin(batchSize = this._defaultBatchSize): void {\n if (this._depth === 0) {\n this.resetScopeState();\n this._resetCaches();\n this._batchSize = batchSize;\n }\n this._depth++;\n }\n\n /** Ends an accepted-owner collection scope.\n * Ending the outermost scope exports pending owners and resets all scope state.\n */\n public async end(): Promise<void> {\n if (this._depth === 0) {\n throw new Error(\"No scoped element export is active.\");\n }\n\n this._depth--;\n if (this._depth > 0) return;\n\n try {\n if (this._acceptedOwnerIds.size > 0) {\n await this.flush();\n }\n } finally {\n this.reset();\n }\n }\n\n /** Discards the active scope and its pending owner state without exporting it. */\n public abort(): void {\n this.reset();\n }\n\n /** Runs element export within an accepted-owner collection scope.\n * A scope created by this call is aborted if element export fails; an existing outer scope remains responsible for its own failure handling.\n */\n public async run(exportElements: () => Promise<void>): Promise<void> {\n if (this.isActive) {\n await exportElements();\n return;\n }\n\n this.begin();\n try {\n await exportElements();\n } catch (error) {\n this.abort();\n throw error;\n }\n await this.end();\n }\n\n /** Adds an accepted source owner to the current group and exports the group when it reaches the configured batch size. */\n public async addAcceptedOwner(elementId: Id64String): Promise<void> {\n if (!this.isActive || this._processedOwnerIds.has(elementId)) return;\n\n this._acceptedOwnerIds.add(elementId);\n if (this._acceptedOwnerIds.size >= this._batchSize) {\n await this.flush();\n }\n }\n\n /** Runs preparation and aspect export for an explicit owner set in bounded groups. */\n public async exportOwners(\n ownerElementIds: ReadonlySet<Id64String>\n ): Promise<void> {\n let ownerIds = ownerElementIds;\n if (this.isActive && ownerElementIds.size > 0) {\n const unprocessedOwnerIds = new Set<Id64String>();\n for (const elementId of ownerElementIds) {\n if (!this._processedOwnerIds.has(elementId)) {\n unprocessedOwnerIds.add(elementId);\n this._processedOwnerIds.add(elementId);\n }\n }\n if (unprocessedOwnerIds.size === 0) return;\n ownerIds = unprocessedOwnerIds;\n }\n\n if (ownerIds.size <= this._defaultBatchSize) {\n await this.exportOwnerBatch(ownerIds);\n return;\n }\n\n let ownerBatch = new Set<Id64String>();\n for (const elementId of ownerIds) {\n ownerBatch.add(elementId);\n if (ownerBatch.size === this._defaultBatchSize) {\n await this.exportOwnerBatch(ownerBatch);\n ownerBatch = new Set<Id64String>();\n }\n }\n if (ownerBatch.size > 0) {\n await this.exportOwnerBatch(ownerBatch);\n }\n }\n\n private async exportOwnerBatch(\n ownerElementIds: ReadonlySet<Id64String>\n ): Promise<void> {\n await this._prepare?.(this._excludedClassFullNames(), ownerElementIds);\n await this._exportAspects(ownerElementIds);\n }\n\n private async flush(): Promise<void> {\n const ownerElementIds = new Set(this._acceptedOwnerIds);\n this._acceptedOwnerIds.clear();\n await this.exportOwners(ownerElementIds);\n }\n\n private resetScopeState(): void {\n this._acceptedOwnerIds.clear();\n this._processedOwnerIds.clear();\n }\n\n private reset(): void {\n this._depth = 0;\n this.resetScopeState();\n this._batchSize = this._defaultBatchSize;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectExportProcessor.d.ts","sourceRoot":"","sources":["../src/ElementAspectExportProcessor.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,UAAU,aAAa;IACrB,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAmC;IAClD,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,2BAA2B,CACzB,YAAY,EAAE,mBAAmB,EACjC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,2BAA2B,CACzB,YAAY,EAAE,kBAAkB,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,4BAA4B;IACvC,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,oCAAoC,CAAqB;IAC1E,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,4CAA4C,CACT;IAC3C,OAAO,CAAC,cAAc,CAA4B;IAElD,8DAA8D;IAC9D,IAAW,mCAAmC,IAAI,WAAW,CAAC,MAAM,CAAC,CAEpE;IACD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsC;IAE/D,YACE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mCAAmC,EAI7C;IAED;;OAEG;IACU,uBAAuB,CAClC,eAAe,EAAE,WAAW,CAAC,UAAU,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAkDf;IAED,4GAA4G;IACrG,gBAAgB,CAAC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAE3D;IAED,iFAAiF;IAC1E,WAAW,IAAI,IAAI,CAGzB;IAED,oFAAoF;IAC7E,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAM5D;IAED,OAAO,CAAC,sBAAsB;YAkBhB,uBAAuB;YAKvB,yBAAyB;YAuBzB,8CAA8C;YAQ9C,gDAAgD;CAmB/D"}
|
|
@@ -1,17 +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
|
-
const ECSqlReaderAsyncIterableIteratorAdapter_1 = require("./ECSqlReaderAsyncIterableIteratorAdapter");
|
|
10
|
-
const core_common_1 = require("@itwin/core-common");
|
|
5
|
+
import { ElementMultiAspect, ElementUniqueAspect, } from "@itwin/core-backend";
|
|
6
|
+
import { ensureECSqlReaderIsAsyncIterableIterator } from "./ECSqlReaderAsyncIterableIteratorAdapter.js";
|
|
7
|
+
import { QueryBinder } from "@itwin/core-common";
|
|
11
8
|
/** Queries and exports ElementAspects for accepted source owners, applying class and handler filters and grouping multi-aspects by owner.
|
|
12
9
|
* @internal
|
|
13
10
|
*/
|
|
14
|
-
class ElementAspectExportProcessor {
|
|
11
|
+
export class ElementAspectExportProcessor {
|
|
15
12
|
/** ElementAspect classes excluded from source queries. */
|
|
16
13
|
_excludedElementAspectClassFullNames = new Set();
|
|
17
14
|
_hasExportableAspects;
|
|
@@ -56,7 +53,7 @@ class ElementAspectExportProcessor {
|
|
|
56
53
|
multiAspectOwnerId !== aspect.element.id) {
|
|
57
54
|
await exportMultiAspects();
|
|
58
55
|
}
|
|
59
|
-
if (aspect instanceof
|
|
56
|
+
if (aspect instanceof ElementUniqueAspect) {
|
|
60
57
|
const isUpdate = this._aspectChanges?.updateIds.has(aspect.id)
|
|
61
58
|
? true
|
|
62
59
|
: this._aspectChanges?.insertIds.has(aspect.id)
|
|
@@ -65,7 +62,7 @@ class ElementAspectExportProcessor {
|
|
|
65
62
|
await this._handler.onExportElementUniqueAspect(aspect, isUpdate);
|
|
66
63
|
await this._handler.trackProgress();
|
|
67
64
|
}
|
|
68
|
-
else if (aspect instanceof
|
|
65
|
+
else if (aspect instanceof ElementMultiAspect) {
|
|
69
66
|
multiAspectOwnerId = aspect.element.id;
|
|
70
67
|
multiAspects.push(aspect);
|
|
71
68
|
}
|
|
@@ -113,7 +110,7 @@ class ElementAspectExportProcessor {
|
|
|
113
110
|
return this._hasExportableAspects;
|
|
114
111
|
}
|
|
115
112
|
async queryHasExportableAspects() {
|
|
116
|
-
const queryParams = new
|
|
113
|
+
const queryParams = new QueryBinder();
|
|
117
114
|
const excludedClassFilter = this.getExcludedClassFilter(queryParams);
|
|
118
115
|
const reader = this._sourceDb.createQueryReader(`SELECT ECInstanceId FROM (
|
|
119
116
|
SELECT aspect.ECInstanceId
|
|
@@ -125,7 +122,7 @@ class ElementAspectExportProcessor {
|
|
|
125
122
|
WHERE TRUE ${excludedClassFilter}
|
|
126
123
|
)
|
|
127
124
|
LIMIT 1`, queryParams, { usePrimaryConn: true });
|
|
128
|
-
for await (const _row of
|
|
125
|
+
for await (const _row of ensureECSqlReaderIsAsyncIterableIterator(reader))
|
|
129
126
|
return true;
|
|
130
127
|
return false;
|
|
131
128
|
}
|
|
@@ -141,12 +138,11 @@ class ElementAspectExportProcessor {
|
|
|
141
138
|
FROM meta.ClassHasAllBaseClasses inheritance
|
|
142
139
|
JOIN meta.ECClassDef classes
|
|
143
140
|
ON classes.ECInstanceId = inheritance.SourceECInstanceId
|
|
144
|
-
WHERE inheritance.TargetECInstanceId = ec_classid(:excludedClassName)`, new
|
|
145
|
-
for await (const row of
|
|
141
|
+
WHERE inheritance.TargetECInstanceId = ec_classid(:excludedClassName)`, new QueryBinder().bindString("excludedClassName", classFullName), { usePrimaryConn: true });
|
|
142
|
+
for await (const row of ensureECSqlReaderIsAsyncIterableIterator(reader))
|
|
146
143
|
excludedClassFullNames.add(row.classFullName);
|
|
147
144
|
}
|
|
148
145
|
return excludedClassFullNames;
|
|
149
146
|
}
|
|
150
147
|
}
|
|
151
|
-
exports.ElementAspectExportProcessor = ElementAspectExportProcessor;
|
|
152
148
|
//# sourceMappingURL=ElementAspectExportProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementAspectExportProcessor.js","sourceRoot":"","sources":["../src/ElementAspectExportProcessor.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 ElementAspect,\n ElementMultiAspect,\n ElementUniqueAspect,\n IModelDb,\n} from \"@itwin/core-backend\";\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { ensureECSqlReaderIsAsyncIterableIterator } from \"./ECSqlReaderAsyncIterableIteratorAdapter.js\";\nimport { QueryBinder } from \"@itwin/core-common\";\n\ninterface AspectChanges {\n readonly insertIds: ReadonlySet<Id64String>;\n readonly updateIds: ReadonlySet<Id64String>;\n}\n\nexport interface ElementAspectExportProcessorHandler {\n shouldExportElementAspect(aspect: ElementAspect): Promise<boolean>;\n onExportElementUniqueAspect(\n uniqueAspect: ElementUniqueAspect,\n isUpdate?: boolean | undefined\n ): Promise<void>;\n onExportElementMultiAspects(\n multiAspects: ElementMultiAspect[]\n ): Promise<void>;\n trackProgress: () => Promise<void>;\n}\n\n/** Queries and exports ElementAspects for accepted source owners, applying class and handler filters and grouping multi-aspects by owner.\n * @internal\n */\nexport class ElementAspectExportProcessor {\n /** ElementAspect classes excluded from source queries. */\n private readonly _excludedElementAspectClassFullNames = new Set<string>();\n private _hasExportableAspects: Promise<boolean> | undefined;\n private _expandedExcludedElementAspectClassFullNames:\n Promise<ReadonlySet<string>> | undefined;\n private _aspectChanges: AspectChanges | undefined;\n\n /** ElementAspect class names excluded from source queries. */\n public get excludedElementAspectClassFullNames(): ReadonlySet<string> {\n return this._excludedElementAspectClassFullNames;\n }\n private readonly _sourceDb: IModelDb;\n private readonly _handler: ElementAspectExportProcessorHandler;\n\n public constructor(\n sourceDb: IModelDb,\n handler: ElementAspectExportProcessorHandler\n ) {\n this._sourceDb = sourceDb;\n this._handler = handler;\n }\n\n /** Exports ElementAspects owned by the supplied elements.\n * Multi-aspects are emitted in one callback group per owner.\n */\n public async exportAllElementAspects(\n ownerElementIds: ReadonlySet<Id64String>\n ): Promise<void> {\n if (ownerElementIds.size === 0 || !(await this.getHasExportableAspects()))\n return;\n\n let multiAspectOwnerId: Id64String | undefined;\n let multiAspects: ElementMultiAspect[] = [];\n const exportMultiAspects = async () => {\n if (multiAspects.length === 0) return;\n await this._handler.onExportElementMultiAspects(multiAspects);\n await this._handler.trackProgress();\n multiAspects = [];\n multiAspectOwnerId = undefined;\n };\n\n const excludedAspectClassFullNames =\n await this.getExpandedExcludedElementAspectClassFullNames();\n for await (const aspect of this._sourceDb.elements.queryAspects({\n elementIds: new Set(ownerElementIds),\n excludedAspectClassFullNames,\n groupByOwner: true,\n usePrimaryConn: true,\n })) {\n if (!(await this._handler.shouldExportElementAspect(aspect))) continue;\n\n if (\n multiAspectOwnerId !== undefined &&\n multiAspectOwnerId !== aspect.element.id\n ) {\n await exportMultiAspects();\n }\n\n if (aspect instanceof ElementUniqueAspect) {\n const isUpdate = this._aspectChanges?.updateIds.has(aspect.id)\n ? true\n : this._aspectChanges?.insertIds.has(aspect.id)\n ? false\n : undefined;\n await this._handler.onExportElementUniqueAspect(aspect, isUpdate);\n await this._handler.trackProgress();\n } else if (aspect instanceof ElementMultiAspect) {\n multiAspectOwnerId = aspect.element.id;\n multiAspects.push(aspect);\n } else {\n throw new Error(\n `Unexpected ElementAspect type ${aspect.classFullName}`\n );\n }\n }\n\n await exportMultiAspects();\n }\n\n /** Sets the aspect changes used to distinguish inserted and updated unique aspects during change export. */\n public setAspectChanges(aspectChanges?: AspectChanges): void {\n this._aspectChanges = aspectChanges;\n }\n\n /** Clears source schema and content caches at an outer export-scope boundary. */\n public resetCaches(): void {\n this._hasExportableAspects = undefined;\n this._expandedExcludedElementAspectClassFullNames = undefined;\n }\n\n /** Excludes an ElementAspect class from subsequent queries and export callbacks. */\n public excludeElementAspectClass(classFullName: string): void {\n const normalizedClassFullName = classFullName.replace(\".\", \":\");\n if (this._excludedElementAspectClassFullNames.has(normalizedClassFullName))\n return;\n this._excludedElementAspectClassFullNames.add(normalizedClassFullName);\n this.resetCaches();\n }\n\n private getExcludedClassFilter(queryParams: QueryBinder): string {\n const excludedClassParameters: string[] = [];\n let excludedClassIndex = 0;\n for (const classFullName of this._excludedElementAspectClassFullNames) {\n const parameterName = `excludedAspectClass${excludedClassIndex++}`;\n excludedClassParameters.push(`ec_classid(:${parameterName})`);\n queryParams.bindString(parameterName, classFullName);\n }\n\n return excludedClassParameters.length === 0\n ? \"\"\n : `AND NOT EXISTS (\n SELECT 1 FROM meta.ClassHasAllBaseClasses excluded\n WHERE excluded.SourceECInstanceId = aspect.ECClassId\n AND excluded.TargetECInstanceId IN (${excludedClassParameters.join(\",\")})\n )`;\n }\n\n private async getHasExportableAspects(): Promise<boolean> {\n this._hasExportableAspects ??= this.queryHasExportableAspects();\n return this._hasExportableAspects;\n }\n\n private async queryHasExportableAspects(): Promise<boolean> {\n const queryParams = new QueryBinder();\n const excludedClassFilter = this.getExcludedClassFilter(queryParams);\n const reader = this._sourceDb.createQueryReader(\n `SELECT ECInstanceId FROM (\n SELECT aspect.ECInstanceId\n FROM Bis.ElementMultiAspect aspect\n WHERE TRUE ${excludedClassFilter}\n UNION ALL\n SELECT aspect.ECInstanceId\n FROM Bis.ElementUniqueAspect aspect\n WHERE TRUE ${excludedClassFilter}\n )\n LIMIT 1`,\n queryParams,\n { usePrimaryConn: true }\n );\n\n for await (const _row of ensureECSqlReaderIsAsyncIterableIterator(reader))\n return true;\n return false;\n }\n\n private async getExpandedExcludedElementAspectClassFullNames(): Promise<\n ReadonlySet<string>\n > {\n this._expandedExcludedElementAspectClassFullNames ??=\n this.queryExpandedExcludedElementAspectClassFullNames();\n return this._expandedExcludedElementAspectClassFullNames;\n }\n\n private async queryExpandedExcludedElementAspectClassFullNames(): Promise<\n ReadonlySet<string>\n > {\n const excludedClassFullNames = new Set<string>();\n for (const classFullName of this._excludedElementAspectClassFullNames) {\n const reader = this._sourceDb.createQueryReader(\n `SELECT ec_classname(classes.ECInstanceId, 's:c') AS classFullName\n FROM meta.ClassHasAllBaseClasses inheritance\n JOIN meta.ECClassDef classes\n ON classes.ECInstanceId = inheritance.SourceECInstanceId\n WHERE inheritance.TargetECInstanceId = ec_classid(:excludedClassName)`,\n new QueryBinder().bindString(\"excludedClassName\", classFullName),\n { usePrimaryConn: true }\n );\n for await (const row of ensureECSqlReaderIsAsyncIterableIterator(reader))\n excludedClassFullNames.add(row.classFullName);\n }\n return excludedClassFullNames;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElementBulkDelete.d.ts","sourceRoot":"","sources":["../src/ElementBulkDelete.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,SAAS,EAAW,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kGAAkG;IAClG,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;CAC9D;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,GAClC,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
|
|
@@ -1,12 +1,9 @@
|
|
|
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
|
-
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
|
-
const core_common_1 = require("@itwin/core-common");
|
|
5
|
+
import { assert } from "@itwin/core-bentley";
|
|
6
|
+
import { QueryBinder } from "@itwin/core-common";
|
|
10
7
|
/** Plans native bulk deletion of the specified element trees.
|
|
11
8
|
*
|
|
12
9
|
* An element that something outside the deleted trees still references is kept, together with what it
|
|
@@ -21,7 +18,7 @@ const core_common_1 = require("@itwin/core-common");
|
|
|
21
18
|
* geometry part: only native code can read geometry, so those uses are not checked in advance.
|
|
22
19
|
* @internal
|
|
23
20
|
*/
|
|
24
|
-
async function planBulkDelete(targetDb, elementIds) {
|
|
21
|
+
export async function planBulkDelete(targetDb, elementIds) {
|
|
25
22
|
const requestedIds = new Set(elementIds);
|
|
26
23
|
const keptReferences = new Map();
|
|
27
24
|
for (;;) {
|
|
@@ -47,7 +44,7 @@ async function planBulkDelete(targetDb, elementIds) {
|
|
|
47
44
|
const requestedCount = requestedIds.size;
|
|
48
45
|
for (const id of await queryKeptElements(targetDb, blockedIds))
|
|
49
46
|
requestedIds.delete(id);
|
|
50
|
-
|
|
47
|
+
assert(requestedIds.size < requestedCount, "Keeping referenced elements must remove a requested element");
|
|
51
48
|
}
|
|
52
49
|
}
|
|
53
50
|
/** Orders the roots of deletion trees that nothing outside them references into native calls. */
|
|
@@ -158,7 +155,7 @@ async function queryDeletionTrees(targetDb, elementIds, includeParentedCodeDepen
|
|
|
158
155
|
)
|
|
159
156
|
SELECT Id AS id, DeleteRootId AS rootId FROM CascadeIds
|
|
160
157
|
`;
|
|
161
|
-
const params = new
|
|
158
|
+
const params = new QueryBinder().bindIdSet("elementIds", elementIds);
|
|
162
159
|
for await (const row of targetDb.createQueryReader(query, params, {
|
|
163
160
|
usePrimaryConn: true,
|
|
164
161
|
})) {
|
|
@@ -209,7 +206,7 @@ async function queryKeptElements(targetDb, blockedIds) {
|
|
|
209
206
|
SELECT Id FROM Below
|
|
210
207
|
`;
|
|
211
208
|
const keptIds = new Set();
|
|
212
|
-
const params = new
|
|
209
|
+
const params = new QueryBinder().bindIdSet("blockedIds", blockedIds);
|
|
213
210
|
for await (const row of targetDb.createQueryReader(query, params, {
|
|
214
211
|
usePrimaryConn: true,
|
|
215
212
|
}))
|
|
@@ -235,7 +232,7 @@ async function queryReferences(targetDb, elementIds) {
|
|
|
235
232
|
FROM bis.DefinitionElement definition
|
|
236
233
|
INNER JOIN IdSet(:elementIds) ids ON ids.id = definition.ECInstanceId
|
|
237
234
|
`;
|
|
238
|
-
for await (const row of targetDb.createQueryReader(firstQuery, new
|
|
235
|
+
for await (const row of targetDb.createQueryReader(firstQuery, new QueryBinder().bindIdSet("elementIds", elementIds), { usePrimaryConn: true })) {
|
|
239
236
|
if (row.isDefinition === 1)
|
|
240
237
|
definitionIds.push(row.referencedId);
|
|
241
238
|
else
|
|
@@ -302,7 +299,7 @@ async function queryReferences(targetDb, elementIds) {
|
|
|
302
299
|
INNER JOIN IdSet(:elementIds) ids ON ids.id = element.ECInstanceId`)
|
|
303
300
|
.join("")}
|
|
304
301
|
`;
|
|
305
|
-
for await (const row of targetDb.createQueryReader(definitionQuery, new
|
|
302
|
+
for await (const row of targetDb.createQueryReader(definitionQuery, new QueryBinder().bindIdSet("elementIds", definitionIds), { usePrimaryConn: true })) {
|
|
306
303
|
if (row.kind === 2)
|
|
307
304
|
geometryDefinitionIds.push(row.referencedId);
|
|
308
305
|
else
|
|
@@ -348,7 +345,7 @@ async function queryGeometricElements(targetDb, elementIds) {
|
|
|
348
345
|
INNER JOIN IdSet(:elementIds) ids ON ids.id = element.ECInstanceId
|
|
349
346
|
`;
|
|
350
347
|
const ids = [];
|
|
351
|
-
const params = new
|
|
348
|
+
const params = new QueryBinder().bindIdSet("elementIds", elementIds);
|
|
352
349
|
for await (const row of targetDb.createQueryReader(query, params, {
|
|
353
350
|
usePrimaryConn: true,
|
|
354
351
|
}))
|