@itwin/ecschema-editing 4.2.0-dev.8 → 4.3.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -1
- package/lib/cjs/Merging/CAClassMerger.d.ts +7 -0
- package/lib/cjs/Merging/CAClassMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/CAClassMerger.js +28 -0
- package/lib/cjs/Merging/CAClassMerger.js.map +1 -0
- package/lib/cjs/Merging/ClassMerger.d.ts +7 -0
- package/lib/cjs/Merging/ClassMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/ClassMerger.js +59 -0
- package/lib/cjs/Merging/ClassMerger.js.map +1 -0
- package/lib/cjs/Merging/ConstantMerger.d.ts +12 -0
- package/lib/cjs/Merging/ConstantMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/ConstantMerger.js +56 -0
- package/lib/cjs/Merging/ConstantMerger.js.map +1 -0
- package/lib/cjs/Merging/EnumerationMerger.d.ts +12 -0
- package/lib/cjs/Merging/EnumerationMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/EnumerationMerger.js +83 -0
- package/lib/cjs/Merging/EnumerationMerger.js.map +1 -0
- package/lib/cjs/Merging/PhenomenonMerger.d.ts +7 -0
- package/lib/cjs/Merging/PhenomenonMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/PhenomenonMerger.js +16 -0
- package/lib/cjs/Merging/PhenomenonMerger.js.map +1 -0
- package/lib/cjs/Merging/PropertyCategoryMerger.d.ts +7 -0
- package/lib/cjs/Merging/PropertyCategoryMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/PropertyCategoryMerger.js +16 -0
- package/lib/cjs/Merging/PropertyCategoryMerger.js.map +1 -0
- package/lib/cjs/Merging/SchemaItemFactory.d.ts +8 -0
- package/lib/cjs/Merging/SchemaItemFactory.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaItemFactory.js +38 -0
- package/lib/cjs/Merging/SchemaItemFactory.js.map +1 -0
- package/lib/cjs/Merging/SchemaItemMerger.d.ts +31 -0
- package/lib/cjs/Merging/SchemaItemMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaItemMerger.js +90 -0
- package/lib/cjs/Merging/SchemaItemMerger.js.map +1 -0
- package/lib/cjs/Merging/SchemaMerger.d.ts +36 -0
- package/lib/cjs/Merging/SchemaMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaMerger.js +94 -0
- package/lib/cjs/Merging/SchemaMerger.js.map +1 -0
- package/lib/cjs/Merging/SchemaReferenceMerger.d.ts +10 -0
- package/lib/cjs/Merging/SchemaReferenceMerger.d.ts.map +1 -0
- package/lib/cjs/Merging/SchemaReferenceMerger.js +55 -0
- package/lib/cjs/Merging/SchemaReferenceMerger.js.map +1 -0
- package/lib/cjs/Validation/SchemaCompareVisitor.d.ts +4 -2
- package/lib/cjs/Validation/SchemaCompareVisitor.d.ts.map +1 -1
- package/lib/cjs/Validation/SchemaCompareVisitor.js +23 -19
- package/lib/cjs/Validation/SchemaCompareVisitor.js.map +1 -1
- package/lib/cjs/Validation/SchemaComparer.d.ts +9 -1
- package/lib/cjs/Validation/SchemaComparer.d.ts.map +1 -1
- package/lib/cjs/Validation/SchemaComparer.js +4 -3
- package/lib/cjs/Validation/SchemaComparer.js.map +1 -1
- package/lib/cjs/ecschema-editing.d.ts +5 -0
- package/lib/cjs/ecschema-editing.d.ts.map +1 -1
- package/lib/cjs/ecschema-editing.js +7 -1
- package/lib/cjs/ecschema-editing.js.map +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getItemNameAndSchemaRef = exports.mergeSchemaItemProperties = void 0;
|
|
4
|
+
/*---------------------------------------------------------------------------------------------
|
|
5
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
6
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
7
|
+
*--------------------------------------------------------------------------------------------*/
|
|
8
|
+
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
9
|
+
const SchemaChanges_1 = require("../Validation/SchemaChanges");
|
|
10
|
+
const SchemaItemFactory_1 = require("./SchemaItemFactory");
|
|
11
|
+
class MutableSchemaItem extends ecschema_metadata_1.SchemaItem {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Merges schema items from the source in the target schema. This method applies for all schema items
|
|
15
|
+
* and handles the basic processing such as create-if-not-exists or name collisions or base property setting.
|
|
16
|
+
* @param context The current merge context
|
|
17
|
+
* @param schemaItemChanges The schema items to be merged
|
|
18
|
+
* @param mergeFn Merge function for complex merging.
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
async function mergeSchemaItems(context, schemaItemChanges, mergeFn) {
|
|
22
|
+
for (const change of schemaItemChanges) {
|
|
23
|
+
// Gets the source and the target item. The target item could be undefined at that point.
|
|
24
|
+
const sourceItem = (await context.sourceSchema.getItem(change.ecTypeName));
|
|
25
|
+
let targetItem = await context.targetSchema.getItem(change.ecTypeName);
|
|
26
|
+
// In case the schema item does not exists in the target schema, an instance for
|
|
27
|
+
// this schema item is created. It's properties get set by the merger then.
|
|
28
|
+
if (change.schemaItemMissing?.changeType === SchemaChanges_1.ChangeType.Missing) {
|
|
29
|
+
// Check for name to make sure there is no collision for items with the same name
|
|
30
|
+
// but different type.
|
|
31
|
+
if (targetItem !== undefined) {
|
|
32
|
+
throw new Error(`Schema ${context.targetSchema.name} already contains a Schema Item ${change.ecTypeName}.`);
|
|
33
|
+
}
|
|
34
|
+
// TODO: Think about renaming the Schema Item. This could be controlled though a flag.
|
|
35
|
+
const createdItem = await SchemaItemFactory_1.SchemaItemFactory.create(context.targetSchema, sourceItem);
|
|
36
|
+
context.targetSchema.addItem(targetItem = createdItem);
|
|
37
|
+
}
|
|
38
|
+
if (targetItem === undefined) {
|
|
39
|
+
throw new Error("Invalid state, targetItem must not be undefined at that point.");
|
|
40
|
+
}
|
|
41
|
+
// Sets the Schema items base properties...
|
|
42
|
+
await mergeSchemaItemProperties(targetItem, change.propertyValueChanges, (item, propertyName, propertyValue) => {
|
|
43
|
+
const mutableSchemaItem = item;
|
|
44
|
+
switch (propertyName) {
|
|
45
|
+
case "label":
|
|
46
|
+
mutableSchemaItem.setDisplayLabel(propertyValue);
|
|
47
|
+
return true;
|
|
48
|
+
case "description":
|
|
49
|
+
mutableSchemaItem.setDescription(propertyValue);
|
|
50
|
+
return true;
|
|
51
|
+
case "schemaItemType":
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
});
|
|
56
|
+
if (mergeFn)
|
|
57
|
+
await mergeFn(targetItem, sourceItem, change, context);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.default = mergeSchemaItems;
|
|
61
|
+
/**
|
|
62
|
+
* Performs the specified action for each property in the given PropertyValueChange array.
|
|
63
|
+
* @param targetItem The target item
|
|
64
|
+
* @param changes The array with PropertyValueChanges
|
|
65
|
+
* @param handler The callback that gets invoked vor every change.
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
async function mergeSchemaItemProperties(targetItem, changes, handler) {
|
|
69
|
+
for (let index = 0, increment = true; index < changes.length; increment && index++, increment = true) {
|
|
70
|
+
const [propertyName, propertyValue] = changes[index].diagnostic.messageArgs;
|
|
71
|
+
if (handler(targetItem, propertyName, propertyValue) === true) {
|
|
72
|
+
changes.splice(index, 1);
|
|
73
|
+
increment = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.mergeSchemaItemProperties = mergeSchemaItemProperties;
|
|
78
|
+
/**
|
|
79
|
+
* @param source The schema item the reference gets copied from
|
|
80
|
+
* @param itemFullName Parsing through item full name give us the schema reference name and the item name, these values are needed to create a new schema item key.
|
|
81
|
+
* @returns Item referenced schema and item name.
|
|
82
|
+
* @internal
|
|
83
|
+
*/
|
|
84
|
+
async function getItemNameAndSchemaRef(source, itemFullName) {
|
|
85
|
+
const [schemaName, itemName] = ecschema_metadata_1.SchemaItem.parseFullName(itemFullName);
|
|
86
|
+
const refSchema = await source.schema.getReference(schemaName);
|
|
87
|
+
return [refSchema, itemName];
|
|
88
|
+
}
|
|
89
|
+
exports.getItemNameAndSchemaRef = getItemNameAndSchemaRef;
|
|
90
|
+
//# sourceMappingURL=SchemaItemMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaItemMerger.js","sourceRoot":"","sources":["../../../src/Merging/SchemaItemMerger.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { Schema, SchemaItem } from \"@itwin/ecschema-metadata\";\r\nimport { ChangeType, PropertyValueChange, SchemaItemChanges } from \"../Validation/SchemaChanges\";\r\nimport { MutableSchema } from \"../Editing/Mutable/MutableSchema\";\r\nimport { SchemaItemFactory } from \"./SchemaItemFactory\";\r\nimport { SchemaMergeContext } from \"./SchemaMerger\";\r\n\r\ntype SchemaItemMergeFn<TChange extends SchemaItemChanges, TItem extends SchemaItem> = (target: TItem, source: TItem, change: TChange, context: SchemaMergeContext) => Promise<void>;\r\ntype PropertyChangedFn<TItem extends SchemaItem> = (item: TItem, propertyName: string, propertyValue: any) => void | boolean;\r\n\r\nabstract class MutableSchemaItem extends SchemaItem{\r\n public abstract override setDisplayLabel(displayLabel: string): void;\r\n public abstract override setDescription(description: string): void;\r\n}\r\n\r\n/**\r\n * Merges schema items from the source in the target schema. This method applies for all schema items\r\n * and handles the basic processing such as create-if-not-exists or name collisions or base property setting.\r\n * @param context The current merge context\r\n * @param schemaItemChanges The schema items to be merged\r\n * @param mergeFn Merge function for complex merging.\r\n * @internal\r\n */\r\nexport default async function mergeSchemaItems<TChange extends SchemaItemChanges, TItem extends SchemaItem>(context: SchemaMergeContext, schemaItemChanges: Iterable<TChange>, mergeFn?: SchemaItemMergeFn<TChange, TItem>) {\r\n for(const change of schemaItemChanges) {\r\n\r\n // Gets the source and the target item. The target item could be undefined at that point.\r\n const sourceItem = (await context.sourceSchema.getItem<TItem>(change.ecTypeName))!;\r\n let targetItem = await context.targetSchema.getItem<TItem>(change.ecTypeName);\r\n\r\n // In case the schema item does not exists in the target schema, an instance for\r\n // this schema item is created. It's properties get set by the merger then.\r\n if(change.schemaItemMissing?.changeType === ChangeType.Missing) {\r\n // Check for name to make sure there is no collision for items with the same name\r\n // but different type.\r\n if(targetItem !== undefined) {\r\n throw new Error(`Schema ${context.targetSchema.name} already contains a Schema Item ${change.ecTypeName}.`);\r\n }\r\n\r\n // TODO: Think about renaming the Schema Item. This could be controlled though a flag.\r\n\r\n const createdItem = await SchemaItemFactory.create(context.targetSchema, sourceItem) as TItem;\r\n (context.targetSchema as MutableSchema).addItem(targetItem = createdItem);\r\n }\r\n\r\n if(targetItem === undefined) {\r\n throw new Error(\"Invalid state, targetItem must not be undefined at that point.\");\r\n }\r\n\r\n // Sets the Schema items base properties...\r\n await mergeSchemaItemProperties(targetItem, change.propertyValueChanges, (item, propertyName, propertyValue) => {\r\n const mutableSchemaItem = item as unknown as MutableSchemaItem;\r\n switch(propertyName) {\r\n case \"label\":\r\n mutableSchemaItem.setDisplayLabel(propertyValue);\r\n return true;\r\n case \"description\":\r\n mutableSchemaItem.setDescription(propertyValue);\r\n return true;\r\n case \"schemaItemType\":\r\n return true;\r\n }\r\n return;\r\n });\r\n\r\n if (mergeFn)\r\n await mergeFn(targetItem, sourceItem, change, context);\r\n }\r\n}\r\n\r\n/**\r\n * Performs the specified action for each property in the given PropertyValueChange array.\r\n * @param targetItem The target item\r\n * @param changes The array with PropertyValueChanges\r\n * @param handler The callback that gets invoked vor every change.\r\n * @internal\r\n */\r\nexport async function mergeSchemaItemProperties<T extends SchemaItem>(targetItem: T, changes: PropertyValueChange[], handler: PropertyChangedFn<T>) {\r\n for(let index = 0, increment = true; index < changes.length; increment && index++, increment = true) {\r\n const [propertyName, propertyValue] = changes[index].diagnostic.messageArgs!;\r\n if(handler(targetItem, propertyName, propertyValue) === true) {\r\n changes.splice(index, 1);\r\n increment = false;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @param source The schema item the reference gets copied from\r\n * @param itemFullName Parsing through item full name give us the schema reference name and the item name, these values are needed to create a new schema item key.\r\n * @returns Item referenced schema and item name.\r\n * @internal\r\n */\r\nexport async function getItemNameAndSchemaRef(source: SchemaItem, itemFullName: string): Promise<[Schema | undefined, string]> {\r\n const [schemaName, itemName] = SchemaItem.parseFullName(itemFullName);\r\n const refSchema = await source.schema.getReference(schemaName);\r\n return [refSchema, itemName];\r\n}\r\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module Merging
|
|
3
|
+
*/
|
|
4
|
+
import { Schema } from "@itwin/ecschema-metadata";
|
|
5
|
+
/**
|
|
6
|
+
* Defines the context of a Schema merging run.
|
|
7
|
+
* @beta
|
|
8
|
+
*/
|
|
9
|
+
export interface SchemaMergeContext {
|
|
10
|
+
readonly targetSchema: Schema;
|
|
11
|
+
readonly sourceSchema: Schema;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Class to merge two schemas together.
|
|
15
|
+
* @see [[merge]] to merge the schemas.
|
|
16
|
+
* @beta
|
|
17
|
+
*/
|
|
18
|
+
export declare class SchemaMerger {
|
|
19
|
+
/**
|
|
20
|
+
* Gets the @see SchemaChanges between the two given Schemas from perspective of the source
|
|
21
|
+
* to the target schema. For example if source contains a class which does not exists in the
|
|
22
|
+
* target one, it would be listed as missing.
|
|
23
|
+
* @param targetSchema The schema the differences gets merged into.
|
|
24
|
+
* @param sourceSchema The schema to compare.
|
|
25
|
+
* @returns An instance of @see SchemaChanges between the two schemas.
|
|
26
|
+
*/
|
|
27
|
+
private getSchemaChanges;
|
|
28
|
+
/**
|
|
29
|
+
* Copy the SchemaItems of the source schemas to the target schema.
|
|
30
|
+
* @param targetSchema The schema the SchemaItems gets merged to.
|
|
31
|
+
* @param sourceSchema The schema the SchemaItems gets copied from.
|
|
32
|
+
* @returns The merged target schema.
|
|
33
|
+
*/
|
|
34
|
+
merge(targetSchema: Schema, sourceSchema: Schema): Promise<Schema>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=SchemaMerger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/SchemaMerger.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAkB,MAAM,0BAA0B,CAAC;AAalE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB;;;;;;;OAOG;YACW,gBAAgB;IAa9B;;;;;OAKG;IACU,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAmChF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
/** @packageDocumentation
|
|
7
|
+
* @module Merging
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SchemaMerger = void 0;
|
|
11
|
+
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
12
|
+
const SchemaComparer_1 = require("../Validation/SchemaComparer");
|
|
13
|
+
const ClassMerger_1 = require("./ClassMerger");
|
|
14
|
+
const EnumerationMerger_1 = require("./EnumerationMerger");
|
|
15
|
+
const PropertyCategoryMerger_1 = require("./PropertyCategoryMerger");
|
|
16
|
+
const SchemaItemMerger_1 = require("./SchemaItemMerger");
|
|
17
|
+
const SchemaReferenceMerger_1 = require("./SchemaReferenceMerger");
|
|
18
|
+
const CAClassMerger_1 = require("./CAClassMerger");
|
|
19
|
+
const PhenomenonMerger_1 = require("./PhenomenonMerger");
|
|
20
|
+
const ConstantMerger_1 = require("./ConstantMerger");
|
|
21
|
+
/**
|
|
22
|
+
* Class to merge two schemas together.
|
|
23
|
+
* @see [[merge]] to merge the schemas.
|
|
24
|
+
* @beta
|
|
25
|
+
*/
|
|
26
|
+
class SchemaMerger {
|
|
27
|
+
/**
|
|
28
|
+
* Gets the @see SchemaChanges between the two given Schemas from perspective of the source
|
|
29
|
+
* to the target schema. For example if source contains a class which does not exists in the
|
|
30
|
+
* target one, it would be listed as missing.
|
|
31
|
+
* @param targetSchema The schema the differences gets merged into.
|
|
32
|
+
* @param sourceSchema The schema to compare.
|
|
33
|
+
* @returns An instance of @see SchemaChanges between the two schemas.
|
|
34
|
+
*/
|
|
35
|
+
async getSchemaChanges(targetSchema, sourceSchema) {
|
|
36
|
+
const changesList = [];
|
|
37
|
+
const schemaComparer = new SchemaComparer_1.SchemaComparer({ report: changesList.push.bind(changesList) });
|
|
38
|
+
// It is important to compare the schema items by name, not full name as otherwise
|
|
39
|
+
// we'd often see differences when comparing two different schemas.
|
|
40
|
+
await schemaComparer.compareSchemas(sourceSchema, targetSchema, {
|
|
41
|
+
compareItemFullName: false,
|
|
42
|
+
});
|
|
43
|
+
return changesList[0];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Copy the SchemaItems of the source schemas to the target schema.
|
|
47
|
+
* @param targetSchema The schema the SchemaItems gets merged to.
|
|
48
|
+
* @param sourceSchema The schema the SchemaItems gets copied from.
|
|
49
|
+
* @returns The merged target schema.
|
|
50
|
+
*/
|
|
51
|
+
async merge(targetSchema, sourceSchema) {
|
|
52
|
+
const schemaChanges = await this.getSchemaChanges(targetSchema, sourceSchema);
|
|
53
|
+
const mergeContext = {
|
|
54
|
+
targetSchema,
|
|
55
|
+
sourceSchema,
|
|
56
|
+
};
|
|
57
|
+
await (0, SchemaReferenceMerger_1.default)(mergeContext, schemaChanges);
|
|
58
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, schemaChanges.enumerationChanges.values(), EnumerationMerger_1.default);
|
|
59
|
+
const propertyCategoryChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, ecschema_metadata_1.SchemaItemType.PropertyCategory);
|
|
60
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, propertyCategoryChanges, PropertyCategoryMerger_1.default);
|
|
61
|
+
const unitSystemChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, ecschema_metadata_1.SchemaItemType.UnitSystem);
|
|
62
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, unitSystemChanges);
|
|
63
|
+
const phenomenonChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, ecschema_metadata_1.SchemaItemType.Phenomenon);
|
|
64
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, phenomenonChanges, PhenomenonMerger_1.default);
|
|
65
|
+
const constantChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, ecschema_metadata_1.SchemaItemType.Constant);
|
|
66
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, constantChanges, ConstantMerger_1.default);
|
|
67
|
+
// TODO: For now we just do simple copy and merging of properties and classes. For more complex types
|
|
68
|
+
// with bases classes or relationships, this might need to get extended.
|
|
69
|
+
const caClassChanges = filterChangesByItemType(schemaChanges.classChanges, ecschema_metadata_1.SchemaItemType.CustomAttributeClass);
|
|
70
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, caClassChanges, CAClassMerger_1.default);
|
|
71
|
+
const classChanges = filterChangesByItemType(schemaChanges.classChanges, ecschema_metadata_1.SchemaItemType.EntityClass, ecschema_metadata_1.SchemaItemType.StructClass);
|
|
72
|
+
await (0, SchemaItemMerger_1.default)(mergeContext, classChanges, ClassMerger_1.default);
|
|
73
|
+
// TODO: For now we directly manipulate the target schema. For error handing purposes, we should first
|
|
74
|
+
// merge into a temporary schema and eventually swap that with the given instance.
|
|
75
|
+
return targetSchema;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.SchemaMerger = SchemaMerger;
|
|
79
|
+
/**
|
|
80
|
+
* Filters and returns the changed items by its schema item type.
|
|
81
|
+
* @param changes A map of changed schema items.
|
|
82
|
+
* @param types A list of schema item types to filter.
|
|
83
|
+
* @returns An Iterable with the filtered schema items.
|
|
84
|
+
*/
|
|
85
|
+
function filterChangesByItemType(changes, ...types) {
|
|
86
|
+
const result = [];
|
|
87
|
+
for (const change of changes.values()) {
|
|
88
|
+
if (types.includes(change.schemaItemType)) {
|
|
89
|
+
result.push(change);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=SchemaMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaMerger.js","sourceRoot":"","sources":["../../../src/Merging/SchemaMerger.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Merging\r\n */\r\n\r\nimport { Schema, SchemaItemType } from \"@itwin/ecschema-metadata\";\r\nimport { SchemaChanges, SchemaItemChanges } from \"../Validation/SchemaChanges\";\r\nimport { SchemaComparer } from \"../Validation/SchemaComparer\";\r\n\r\nimport mergeClasses from \"./ClassMerger\";\r\nimport mergeEnumeration from \"./EnumerationMerger\";\r\nimport mergePropertyCategory from \"./PropertyCategoryMerger\";\r\nimport mergeSchemaItems from \"./SchemaItemMerger\";\r\nimport mergeSchemaReferences from \"./SchemaReferenceMerger\";\r\nimport mergeCAClasses from \"./CAClassMerger\";\r\nimport mergePhenomenon from \"./PhenomenonMerger\";\r\nimport mergeConstant from \"./ConstantMerger\";\r\n\r\n/**\r\n * Defines the context of a Schema merging run.\r\n * @beta\r\n */\r\nexport interface SchemaMergeContext {\r\n readonly targetSchema: Schema;\r\n readonly sourceSchema: Schema;\r\n}\r\n\r\n/**\r\n * Class to merge two schemas together.\r\n * @see [[merge]] to merge the schemas.\r\n * @beta\r\n */\r\nexport class SchemaMerger {\r\n /**\r\n * Gets the @see SchemaChanges between the two given Schemas from perspective of the source\r\n * to the target schema. For example if source contains a class which does not exists in the\r\n * target one, it would be listed as missing.\r\n * @param targetSchema The schema the differences gets merged into.\r\n * @param sourceSchema The schema to compare.\r\n * @returns An instance of @see SchemaChanges between the two schemas.\r\n */\r\n private async getSchemaChanges(targetSchema: Schema, sourceSchema: Schema): Promise<SchemaChanges> {\r\n const changesList: SchemaChanges[] = [];\r\n const schemaComparer = new SchemaComparer({ report: changesList.push.bind(changesList) });\r\n\r\n // It is important to compare the schema items by name, not full name as otherwise\r\n // we'd often see differences when comparing two different schemas.\r\n await schemaComparer.compareSchemas(sourceSchema, targetSchema, {\r\n compareItemFullName: false,\r\n });\r\n\r\n return changesList[0];\r\n }\r\n\r\n /**\r\n * Copy the SchemaItems of the source schemas to the target schema.\r\n * @param targetSchema The schema the SchemaItems gets merged to.\r\n * @param sourceSchema The schema the SchemaItems gets copied from.\r\n * @returns The merged target schema.\r\n */\r\n public async merge(targetSchema: Schema, sourceSchema: Schema): Promise<Schema> {\r\n const schemaChanges = await this.getSchemaChanges(targetSchema, sourceSchema);\r\n const mergeContext: SchemaMergeContext = {\r\n targetSchema,\r\n sourceSchema,\r\n };\r\n\r\n await mergeSchemaReferences(mergeContext, schemaChanges);\r\n\r\n await mergeSchemaItems(mergeContext, schemaChanges.enumerationChanges.values(), mergeEnumeration);\r\n\r\n const propertyCategoryChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, SchemaItemType.PropertyCategory);\r\n await mergeSchemaItems(mergeContext, propertyCategoryChanges, mergePropertyCategory);\r\n\r\n const unitSystemChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, SchemaItemType.UnitSystem);\r\n await mergeSchemaItems(mergeContext, unitSystemChanges);\r\n\r\n const phenomenonChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, SchemaItemType.Phenomenon);\r\n await mergeSchemaItems(mergeContext, phenomenonChanges, mergePhenomenon);\r\n\r\n const constantChanges = filterChangesByItemType(schemaChanges.schemaItemChanges, SchemaItemType.Constant);\r\n await mergeSchemaItems(mergeContext, constantChanges, mergeConstant);\r\n\r\n // TODO: For now we just do simple copy and merging of properties and classes. For more complex types\r\n // with bases classes or relationships, this might need to get extended.\r\n const caClassChanges = filterChangesByItemType(schemaChanges.classChanges, SchemaItemType.CustomAttributeClass);\r\n await mergeSchemaItems(mergeContext, caClassChanges, mergeCAClasses);\r\n\r\n const classChanges = filterChangesByItemType(schemaChanges.classChanges, SchemaItemType.EntityClass, SchemaItemType.StructClass);\r\n await mergeSchemaItems(mergeContext, classChanges, mergeClasses);\r\n\r\n // TODO: For now we directly manipulate the target schema. For error handing purposes, we should first\r\n // merge into a temporary schema and eventually swap that with the given instance.\r\n return targetSchema;\r\n }\r\n}\r\n\r\n/**\r\n * Filters and returns the changed items by its schema item type.\r\n * @param changes A map of changed schema items.\r\n * @param types A list of schema item types to filter.\r\n * @returns An Iterable with the filtered schema items.\r\n */\r\nfunction filterChangesByItemType<TChange extends SchemaItemChanges>(changes: Map<string, TChange>, ...types: SchemaItemType[]): Iterable<TChange> {\r\n const result: TChange[] = [];\r\n for(const change of changes.values()) {\r\n if (types.includes(change.schemaItemType)) {\r\n result.push(change);\r\n }\r\n }\r\n return result;\r\n}\r\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SchemaChanges } from "../Validation/SchemaChanges";
|
|
2
|
+
import { SchemaMergeContext } from "./SchemaMerger";
|
|
3
|
+
/**
|
|
4
|
+
* Merges the schema references of two schemas.
|
|
5
|
+
* @param mergeContext current merge context
|
|
6
|
+
* @param changes schema changes.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export default function mergeSchemaReferences(mergeContext: SchemaMergeContext, changes: SchemaChanges): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=SchemaReferenceMerger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaReferenceMerger.d.ts","sourceRoot":"","sources":["../../../src/Merging/SchemaReferenceMerger.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;GAKG;AACH,wBAA8B,qBAAqB,CAAC,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,iBA+B3G"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/*---------------------------------------------------------------------------------------------
|
|
4
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
5
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
6
|
+
*--------------------------------------------------------------------------------------------*/
|
|
7
|
+
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
8
|
+
/**
|
|
9
|
+
* Merges the schema references of two schemas.
|
|
10
|
+
* @param mergeContext current merge context
|
|
11
|
+
* @param changes schema changes.
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
async function mergeSchemaReferences(mergeContext, changes) {
|
|
15
|
+
const targetSchema = mergeContext.targetSchema;
|
|
16
|
+
// If the target schema does not have a reference to a schema yet, it can be added
|
|
17
|
+
// but should be checked if it's schema references have collisions with existing references.
|
|
18
|
+
for (const missingSchemaReference of changes.missingSchemaReferences) {
|
|
19
|
+
const [referencedSchema] = missingSchemaReference.diagnostic.messageArgs;
|
|
20
|
+
await addSchemaReference(targetSchema, referencedSchema);
|
|
21
|
+
}
|
|
22
|
+
// If the source schema referenced a schema that is also referenced by the target
|
|
23
|
+
// schema but in a different version, it is marked as delta. Here we need to check if
|
|
24
|
+
// the source schema is compatible to the existing one. This is not be checked by the
|
|
25
|
+
// schema instance when added.
|
|
26
|
+
for (const differentSchemaReference of changes.schemaReferenceDeltas) {
|
|
27
|
+
const [referencedSchema] = differentSchemaReference.diagnostic.messageArgs;
|
|
28
|
+
const existingSchema = (await targetSchema.getReference(referencedSchema.name));
|
|
29
|
+
const [older, latest] = compareSchemas(existingSchema, referencedSchema);
|
|
30
|
+
if (!latest.schemaKey.matches(older.schemaKey, ecschema_metadata_1.SchemaMatchType.LatestWriteCompatible)) {
|
|
31
|
+
throw new Error(`Schemas references of ${referencedSchema.name} have incompatible versions: ${older.schemaKey.version} and ${latest.schemaKey.version}`);
|
|
32
|
+
}
|
|
33
|
+
if (latest === existingSchema) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const index = targetSchema.references.findIndex((reference) => reference === existingSchema);
|
|
37
|
+
targetSchema.references.splice(index, 1);
|
|
38
|
+
await addSchemaReference(targetSchema, referencedSchema);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.default = mergeSchemaReferences;
|
|
42
|
+
async function addSchemaReference(targetSchema, referencedSchema) {
|
|
43
|
+
const mutableSchema = targetSchema;
|
|
44
|
+
// TODO: Collision Check
|
|
45
|
+
await mutableSchema.addReference(referencedSchema);
|
|
46
|
+
if (!await targetSchema.context.getSchema(referencedSchema.schemaKey)) {
|
|
47
|
+
await targetSchema.context.addSchema(referencedSchema);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function compareSchemas(left, right) {
|
|
51
|
+
return left.schemaKey.compareByVersion(right.schemaKey) < 0
|
|
52
|
+
? [left, right]
|
|
53
|
+
: [right, left];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=SchemaReferenceMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaReferenceMerger.js","sourceRoot":"","sources":["../../../src/Merging/SchemaReferenceMerger.ts"],"names":[],"mappings":";;AAAA;;;+FAG+F;AAC/F,gEAAmE;AAKnE;;;;;GAKG;AACY,KAAK,UAAU,qBAAqB,CAAC,YAAgC,EAAE,OAAsB;IAC1G,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC;IAE/C,kFAAkF;IAClF,4FAA4F;IAC5F,KAAI,MAAM,sBAAsB,IAAI,OAAO,CAAC,uBAAuB,EAAE;QACnE,MAAM,CAAC,gBAAgB,CAAC,GAAG,sBAAsB,CAAC,UAAU,CAAC,WAAwB,CAAC;QACtF,MAAM,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;KAC1D;IAED,iFAAiF;IACjF,qFAAqF;IACrF,qFAAqF;IACrF,8BAA8B;IAC9B,KAAI,MAAM,wBAAwB,IAAI,OAAO,CAAC,qBAAqB,EAAE;QACnE,MAAM,CAAC,gBAAgB,CAAC,GAAG,wBAAwB,CAAC,UAAU,CAAC,WAAwB,CAAC;QACxF,MAAM,cAAc,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAE,CAAC;QAEjF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACzE,IAAG,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,mCAAe,CAAC,qBAAqB,CAAC,EAAE;YACpF,MAAM,IAAI,KAAK,CAAC,yBAAyB,gBAAgB,CAAC,IAAI,gCAAgC,KAAK,CAAC,SAAS,CAAC,OAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;SAC1J;QACD,IAAG,MAAM,KAAK,cAAc,EAAE;YAC5B,SAAS;SACV;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,cAAc,CAAC,CAAC;QAC7F,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEzC,MAAM,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;KAC1D;AACH,CAAC;AA/BD,wCA+BC;AAED,KAAK,UAAU,kBAAkB,CAAC,YAAoB,EAAE,gBAAwB;IAC9E,MAAM,aAAa,GAAG,YAA6B,CAAC;IAEpD,wBAAwB;IAExB,MAAM,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IACnD,IAAG,CAAE,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE;QACrE,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;KACxD;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;QACzD,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;QACf,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { Schema, SchemaMatchType } from \"@itwin/ecschema-metadata\";\r\nimport { MutableSchema } from \"../Editing/Mutable/MutableSchema\";\r\nimport { SchemaChanges } from \"../Validation/SchemaChanges\";\r\nimport { SchemaMergeContext } from \"./SchemaMerger\";\r\n\r\n/**\r\n * Merges the schema references of two schemas.\r\n * @param mergeContext current merge context\r\n * @param changes schema changes.\r\n * @internal\r\n */\r\nexport default async function mergeSchemaReferences(mergeContext: SchemaMergeContext, changes: SchemaChanges) {\r\n const targetSchema = mergeContext.targetSchema;\r\n\r\n // If the target schema does not have a reference to a schema yet, it can be added\r\n // but should be checked if it's schema references have collisions with existing references.\r\n for(const missingSchemaReference of changes.missingSchemaReferences) {\r\n const [referencedSchema] = missingSchemaReference.diagnostic.messageArgs! as [Schema];\r\n await addSchemaReference(targetSchema, referencedSchema);\r\n }\r\n\r\n // If the source schema referenced a schema that is also referenced by the target\r\n // schema but in a different version, it is marked as delta. Here we need to check if\r\n // the source schema is compatible to the existing one. This is not be checked by the\r\n // schema instance when added.\r\n for(const differentSchemaReference of changes.schemaReferenceDeltas) {\r\n const [referencedSchema] = differentSchemaReference.diagnostic.messageArgs! as [Schema];\r\n const existingSchema = (await targetSchema.getReference(referencedSchema.name))!;\r\n\r\n const [older, latest] = compareSchemas(existingSchema, referencedSchema);\r\n if(!latest.schemaKey.matches(older.schemaKey, SchemaMatchType.LatestWriteCompatible)) {\r\n throw new Error(`Schemas references of ${referencedSchema.name} have incompatible versions: ${older.schemaKey.version} and ${latest.schemaKey.version}`);\r\n }\r\n if(latest === existingSchema) {\r\n continue;\r\n }\r\n\r\n const index = targetSchema.references.findIndex((reference) => reference === existingSchema);\r\n targetSchema.references.splice(index, 1);\r\n\r\n await addSchemaReference(targetSchema, referencedSchema);\r\n }\r\n}\r\n\r\nasync function addSchemaReference(targetSchema: Schema, referencedSchema: Schema) {\r\n const mutableSchema = targetSchema as MutableSchema;\r\n\r\n // TODO: Collision Check\r\n\r\n await mutableSchema.addReference(referencedSchema);\r\n if(! await targetSchema.context.getSchema(referencedSchema.schemaKey)) {\r\n await targetSchema.context.addSchema(referencedSchema);\r\n }\r\n}\r\n\r\nfunction compareSchemas(left: Schema, right: Schema): [Schema, Schema] {\r\n return left.schemaKey.compareByVersion(right.schemaKey) < 0\r\n ? [left, right]\r\n : [right, left];\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module Comparison
|
|
3
3
|
*/
|
|
4
4
|
import { AnyClass, AnyProperty, Constant, CustomAttributeClass, CustomAttributeContainerProps, EntityClass, Enumeration, Format, InvertedUnit, ISchemaPartVisitor, KindOfQuantity, Mixin, Phenomenon, PropertyCategory, RelationshipClass, RelationshipConstraint, Schema, SchemaItem, StructClass, Unit, UnitSystem } from "@itwin/ecschema-metadata";
|
|
5
|
-
import { ISchemaComparer } from "./SchemaComparer";
|
|
5
|
+
import { ISchemaComparer, SchemaComparerOptions } from "./SchemaComparer";
|
|
6
6
|
/**
|
|
7
7
|
* An ISchemaPartVisitor interface implementation that is used to compare to Schemas.
|
|
8
8
|
* @internal
|
|
@@ -10,12 +10,14 @@ import { ISchemaComparer } from "./SchemaComparer";
|
|
|
10
10
|
export declare class SchemaCompareVisitor implements ISchemaPartVisitor {
|
|
11
11
|
private _schemaB;
|
|
12
12
|
private _schemaComparer;
|
|
13
|
+
private _lookupFullName;
|
|
13
14
|
/**
|
|
14
15
|
* Initializes a new SchemaCompareVisitor instance.
|
|
15
16
|
* @param schemaComparer The [[SchemaComparer]] to use to compare each item of the schema.
|
|
16
17
|
* @param schemaToCompare The second or 'B' schema to compare against the schema being traversed (Schema A).
|
|
17
18
|
*/
|
|
18
|
-
constructor(schemaComparer: ISchemaComparer, schemaToCompare: Schema);
|
|
19
|
+
constructor(schemaComparer: ISchemaComparer, schemaToCompare: Schema, options?: SchemaComparerOptions);
|
|
20
|
+
private lookupItem;
|
|
19
21
|
/**
|
|
20
22
|
* Called before schema traversal.
|
|
21
23
|
* @param schema a Schema object.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaCompareVisitor.d.ts","sourceRoot":"","sources":["../../../src/Validation/SchemaCompareVisitor.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,6BAA6B,EAClF,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,EAClG,UAAU,EAAY,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,EACrG,WAAW,EAAE,IAAI,EAAE,UAAU,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"SchemaCompareVisitor.d.ts","sourceRoot":"","sources":["../../../src/Validation/SchemaCompareVisitor.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,oBAAoB,EAAE,6BAA6B,EAClF,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,EAClG,UAAU,EAAY,gBAAgB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,EACrG,WAAW,EAAE,IAAI,EAAE,UAAU,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAU;IAEjC;;;;OAIG;gBACS,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;YAMvF,UAAU;IAIxB;;;OAGG;IACU,eAAe,CAAC,OAAO,EAAE,MAAM;IAI5C;;;OAGG;IACU,eAAe,CAAC,WAAW,EAAE,UAAU;IAKpD;;;OAGG;IACU,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;;OAGG;IACU,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;;OAGG;IACU,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE;;;OAGG;IACU,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE;;;OAGG;IACU,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD;;;OAGG;IACU,sBAAsB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpF;;;OAGG;IACU,2BAA2B,CAAC,WAAW,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5F;;;OAGG;IACU,yBAAyB,CAAC,gBAAgB,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7F;;;OAGG;IACU,6BAA6B,CAAC,UAAU,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpG;;;OAGG;IACU,gBAAgB,CAAC,KAAK,EAAE,WAAW;IAKhD;;;OAGG;IACU,mBAAmB,CAAC,IAAI,EAAE,cAAc;IAKrD;;;OAGG;IACU,qBAAqB,CAAC,SAAS,EAAE,gBAAgB;IAK9D;;;OAGG;IACU,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;;OAGG;IACU,SAAS,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD;;;OAGG;IACU,iBAAiB,CAAC,aAAa,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1E;;;OAGG;IACU,eAAe,CAAC,YAAY,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE;;;OAGG;IACU,eAAe,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;;OAGG;IACU,aAAa,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAI/D"}
|
|
@@ -19,9 +19,13 @@ class SchemaCompareVisitor {
|
|
|
19
19
|
* @param schemaComparer The [[SchemaComparer]] to use to compare each item of the schema.
|
|
20
20
|
* @param schemaToCompare The second or 'B' schema to compare against the schema being traversed (Schema A).
|
|
21
21
|
*/
|
|
22
|
-
constructor(schemaComparer, schemaToCompare) {
|
|
22
|
+
constructor(schemaComparer, schemaToCompare, options) {
|
|
23
23
|
this._schemaComparer = schemaComparer;
|
|
24
24
|
this._schemaB = schemaToCompare;
|
|
25
|
+
this._lookupFullName = options?.compareItemFullName ?? true;
|
|
26
|
+
}
|
|
27
|
+
async lookupItem(item) {
|
|
28
|
+
return this._schemaB.lookupItem(this._lookupFullName ? item.key : item.name);
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
27
31
|
* Called before schema traversal.
|
|
@@ -35,7 +39,7 @@ class SchemaCompareVisitor {
|
|
|
35
39
|
* @param schemaItem a SchemaItem object.
|
|
36
40
|
*/
|
|
37
41
|
async visitSchemaItem(schemaItemA) {
|
|
38
|
-
const schemaItemB = await this.
|
|
42
|
+
const schemaItemB = await this.lookupItem(schemaItemA);
|
|
39
43
|
this._schemaComparer.compareSchemaItems(schemaItemA, schemaItemB);
|
|
40
44
|
}
|
|
41
45
|
/**
|
|
@@ -43,7 +47,7 @@ class SchemaCompareVisitor {
|
|
|
43
47
|
* @param ecClass an ECClass object.
|
|
44
48
|
*/
|
|
45
49
|
async visitClass(classA) {
|
|
46
|
-
const classB = await this.
|
|
50
|
+
const classB = await this.lookupItem(classA);
|
|
47
51
|
this._schemaComparer.compareClasses(classA, classB);
|
|
48
52
|
}
|
|
49
53
|
/**
|
|
@@ -52,7 +56,7 @@ class SchemaCompareVisitor {
|
|
|
52
56
|
*/
|
|
53
57
|
async visitProperty(propertyA) {
|
|
54
58
|
let propertyB;
|
|
55
|
-
const classB = await this.
|
|
59
|
+
const classB = await this.lookupItem(propertyA.class);
|
|
56
60
|
if (classB)
|
|
57
61
|
propertyB = await classB.getProperty(propertyA.name);
|
|
58
62
|
this._schemaComparer.compareProperties(propertyA, propertyB);
|
|
@@ -62,7 +66,7 @@ class SchemaCompareVisitor {
|
|
|
62
66
|
* @param entityClass an EntityClass object.
|
|
63
67
|
*/
|
|
64
68
|
async visitEntityClass(entityA) {
|
|
65
|
-
const entityB = await this.
|
|
69
|
+
const entityB = await this.lookupItem(entityA);
|
|
66
70
|
this._schemaComparer.compareEntityClasses(entityA, entityB);
|
|
67
71
|
}
|
|
68
72
|
/**
|
|
@@ -77,7 +81,7 @@ class SchemaCompareVisitor {
|
|
|
77
81
|
* @param mixin a Mixin object.
|
|
78
82
|
*/
|
|
79
83
|
async visitMixin(mixinA) {
|
|
80
|
-
const mixinB = await this.
|
|
84
|
+
const mixinB = await this.lookupItem(mixinA);
|
|
81
85
|
this._schemaComparer.compareMixins(mixinA, mixinB);
|
|
82
86
|
}
|
|
83
87
|
/**
|
|
@@ -85,7 +89,7 @@ class SchemaCompareVisitor {
|
|
|
85
89
|
* @param relationshipClass a RelationshipClass object.
|
|
86
90
|
*/
|
|
87
91
|
async visitRelationshipClass(relationshipA) {
|
|
88
|
-
const relationshipB = await this.
|
|
92
|
+
const relationshipB = await this.lookupItem(relationshipA);
|
|
89
93
|
this._schemaComparer.compareRelationshipClasses(relationshipA, relationshipB);
|
|
90
94
|
}
|
|
91
95
|
/**
|
|
@@ -94,7 +98,7 @@ class SchemaCompareVisitor {
|
|
|
94
98
|
*/
|
|
95
99
|
async visitRelationshipConstraint(constraintA) {
|
|
96
100
|
let constraintB;
|
|
97
|
-
const relationshipB = await this.
|
|
101
|
+
const relationshipB = await this.lookupItem(constraintA.relationshipClass);
|
|
98
102
|
if (relationshipB)
|
|
99
103
|
constraintB = constraintA.isSource ? relationshipB.source : relationshipB.target;
|
|
100
104
|
this._schemaComparer.compareRelationshipConstraints(constraintA, constraintB);
|
|
@@ -104,7 +108,7 @@ class SchemaCompareVisitor {
|
|
|
104
108
|
* @param customAttributeClass a CustomAttributeClass object.
|
|
105
109
|
*/
|
|
106
110
|
async visitCustomAttributeClass(customAttributeA) {
|
|
107
|
-
const customAttributeB = await this.
|
|
111
|
+
const customAttributeB = await this.lookupItem(customAttributeA);
|
|
108
112
|
this._schemaComparer.compareCustomAttributeClasses(customAttributeA, customAttributeB);
|
|
109
113
|
}
|
|
110
114
|
/**
|
|
@@ -122,11 +126,11 @@ class SchemaCompareVisitor {
|
|
|
122
126
|
containerB = await this._schemaB.lookupItem(shortName);
|
|
123
127
|
}
|
|
124
128
|
else if (ecschema_metadata_1.Property.isProperty(containerA)) {
|
|
125
|
-
const parent = await this.
|
|
129
|
+
const parent = await this.lookupItem(containerA.class);
|
|
126
130
|
containerB = parent ? await parent.getProperty(shortName) : undefined;
|
|
127
131
|
}
|
|
128
132
|
else if (ecschema_metadata_1.RelationshipConstraint.isRelationshipConstraint(containerA)) {
|
|
129
|
-
const parent = await this.
|
|
133
|
+
const parent = await this.lookupItem(containerA.relationshipClass);
|
|
130
134
|
containerB = parent ? await parent.getProperty(shortName) : undefined;
|
|
131
135
|
}
|
|
132
136
|
this._schemaComparer.compareCustomAttributeContainers(containerA, containerB);
|
|
@@ -136,7 +140,7 @@ class SchemaCompareVisitor {
|
|
|
136
140
|
* @param enumeration an Enumeration object.
|
|
137
141
|
*/
|
|
138
142
|
async visitEnumeration(enumA) {
|
|
139
|
-
const enumB = await this.
|
|
143
|
+
const enumB = await this.lookupItem(enumA);
|
|
140
144
|
this._schemaComparer.compareEnumerations(enumA, enumB);
|
|
141
145
|
}
|
|
142
146
|
/**
|
|
@@ -144,7 +148,7 @@ class SchemaCompareVisitor {
|
|
|
144
148
|
* @param koq a KindOfQuantity object.
|
|
145
149
|
*/
|
|
146
150
|
async visitKindOfQuantity(koqA) {
|
|
147
|
-
const koqB = await this.
|
|
151
|
+
const koqB = await this.lookupItem(koqA);
|
|
148
152
|
this._schemaComparer.compareKindOfQuantities(koqA, koqB);
|
|
149
153
|
}
|
|
150
154
|
/**
|
|
@@ -152,7 +156,7 @@ class SchemaCompareVisitor {
|
|
|
152
156
|
* @param category a PropertyCategory object.
|
|
153
157
|
*/
|
|
154
158
|
async visitPropertyCategory(categoryA) {
|
|
155
|
-
const categoryB = await this.
|
|
159
|
+
const categoryB = await this.lookupItem(categoryA);
|
|
156
160
|
this._schemaComparer.comparePropertyCategories(categoryA, categoryB);
|
|
157
161
|
}
|
|
158
162
|
/**
|
|
@@ -160,7 +164,7 @@ class SchemaCompareVisitor {
|
|
|
160
164
|
* @param format a Format object.
|
|
161
165
|
*/
|
|
162
166
|
async visitFormat(formatA) {
|
|
163
|
-
const formatB = await this.
|
|
167
|
+
const formatB = await this.lookupItem(formatA);
|
|
164
168
|
this._schemaComparer.compareFormats(formatA, formatB);
|
|
165
169
|
}
|
|
166
170
|
/**
|
|
@@ -168,7 +172,7 @@ class SchemaCompareVisitor {
|
|
|
168
172
|
* @param unit a Unit object.
|
|
169
173
|
*/
|
|
170
174
|
async visitUnit(unitA) {
|
|
171
|
-
const unitB = await this.
|
|
175
|
+
const unitB = await this.lookupItem(unitA);
|
|
172
176
|
this._schemaComparer.compareUnits(unitA, unitB);
|
|
173
177
|
}
|
|
174
178
|
/**
|
|
@@ -176,7 +180,7 @@ class SchemaCompareVisitor {
|
|
|
176
180
|
* @param invertedUnit an InvertedUnit object.
|
|
177
181
|
*/
|
|
178
182
|
async visitInvertedUnit(invertedUnitA) {
|
|
179
|
-
const invertedUnitB = await this.
|
|
183
|
+
const invertedUnitB = await this.lookupItem(invertedUnitA);
|
|
180
184
|
this._schemaComparer.compareInvertedUnits(invertedUnitA, invertedUnitB);
|
|
181
185
|
}
|
|
182
186
|
/**
|
|
@@ -191,7 +195,7 @@ class SchemaCompareVisitor {
|
|
|
191
195
|
* @param phenomena a Phenomenon object.
|
|
192
196
|
*/
|
|
193
197
|
async visitPhenomenon(phenomenonA) {
|
|
194
|
-
const phenomenonB = await this.
|
|
198
|
+
const phenomenonB = await this.lookupItem(phenomenonA);
|
|
195
199
|
this._schemaComparer.comparePhenomenons(phenomenonA, phenomenonB);
|
|
196
200
|
}
|
|
197
201
|
/**
|
|
@@ -199,7 +203,7 @@ class SchemaCompareVisitor {
|
|
|
199
203
|
* @param constant a Constant object.
|
|
200
204
|
*/
|
|
201
205
|
async visitConstant(constantA) {
|
|
202
|
-
const constantB = await this.
|
|
206
|
+
const constantB = await this.lookupItem(constantA);
|
|
203
207
|
this._schemaComparer.compareConstants(constantA, constantB);
|
|
204
208
|
}
|
|
205
209
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaCompareVisitor.js","sourceRoot":"","sources":["../../../src/Validation/SchemaCompareVisitor.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,gEAIkC;AAGlC;;;GAGG;AACH,MAAa,oBAAoB;IAI/B;;;;OAIG;IACH,YAAY,cAA+B,EAAE,eAAuB;QAClE,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,OAAe;QAC1C,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,WAAuB;QAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,UAAU,CAAC,MAAgB;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAW,MAAM,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,aAAa,CAAC,SAAsB;QAC/C,IAAI,SAAkC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAU,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5E,IAAI,MAAM;YACR,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;QAEtE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,OAAoB;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAc,OAAO,CAAC,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,QAAqB;QACjD,sDAAsD;IACxD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,UAAU,CAAC,MAAa;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAQ,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,sBAAsB,CAAC,aAAgC;QAClE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAoB,aAAa,CAAC,GAAG,CAAC,CAAC;QAC3F,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,2BAA2B,CAAC,WAAmC;QAC1E,IAAI,WAA+C,CAAC;QACpD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAoB,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC3G,IAAI,aAAa;YACf,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;QACnF,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,yBAAyB,CAAC,gBAAsC;QAC3E,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAuB,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACpG,IAAI,CAAC,eAAe,CAAC,6BAA6B,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,6BAA6B,CAAC,UAAyC;QAClF,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,UAAqD,CAAC;QAE1D,IAAI,0BAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAC/B,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;SAC5B;aAAM,IAAI,2BAAO,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;YACxC,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SACxD;aAAM,IAAI,4BAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAU,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7E,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACvE;aAAM,IAAI,0CAAsB,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAE;YACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAoB,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACnG,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACvE;QAED,IAAI,CAAC,eAAe,CAAC,gCAAgC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,KAAkB;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAc,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,mBAAmB,CAAC,IAAoB;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAiB,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,qBAAqB,CAAC,SAA2B;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAmB,SAAS,CAAC,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,WAAW,CAAC,OAAe;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAS,OAAO,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAS,CAAC,KAAW;QAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,iBAAiB,CAAC,aAA2B;QACxD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAe,aAAa,CAAC,GAAG,CAAC,CAAC;QACtF,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,YAAwB;QACnD,mDAAmD;IACrD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,WAAuB;QAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAa,WAAW,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,aAAa,CAAC,SAAmB;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAW,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;CACF;AArND,oDAqNC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Comparison\r\n */\r\n\r\nimport { AnyClass, AnyProperty, Constant, CustomAttributeClass, CustomAttributeContainerProps,\r\n ECClass, EntityClass, Enumeration, Format, InvertedUnit, ISchemaPartVisitor, KindOfQuantity, Mixin,\r\n Phenomenon, Property, PropertyCategory, RelationshipClass, RelationshipConstraint, Schema, SchemaItem,\r\n StructClass, Unit, UnitSystem,\r\n} from \"@itwin/ecschema-metadata\";\r\nimport { ISchemaComparer } from \"./SchemaComparer\";\r\n\r\n/**\r\n * An ISchemaPartVisitor interface implementation that is used to compare to Schemas.\r\n * @internal\r\n */\r\nexport class SchemaCompareVisitor implements ISchemaPartVisitor {\r\n private _schemaB: Schema;\r\n private _schemaComparer: ISchemaComparer;\r\n\r\n /**\r\n * Initializes a new SchemaCompareVisitor instance.\r\n * @param schemaComparer The [[SchemaComparer]] to use to compare each item of the schema.\r\n * @param schemaToCompare The second or 'B' schema to compare against the schema being traversed (Schema A).\r\n */\r\n constructor(schemaComparer: ISchemaComparer, schemaToCompare: Schema) {\r\n this._schemaComparer = schemaComparer;\r\n this._schemaB = schemaToCompare;\r\n }\r\n\r\n /**\r\n * Called before schema traversal.\r\n * @param schema a Schema object.\r\n */\r\n public async visitFullSchema(schemaA: Schema) {\r\n this._schemaComparer.compareSchemaProps(schemaA, this._schemaB);\r\n }\r\n\r\n /**\r\n * Called for each [[SchemaItem]] instance found during schema traversal.\r\n * @param schemaItem a SchemaItem object.\r\n */\r\n public async visitSchemaItem(schemaItemA: SchemaItem) {\r\n const schemaItemB = await this._schemaB.lookupItem(schemaItemA.key);\r\n this._schemaComparer.compareSchemaItems(schemaItemA, schemaItemB);\r\n }\r\n\r\n /**\r\n * Called for each [[AnyClass]] instance found during schema traversal.\r\n * @param ecClass an ECClass object.\r\n */\r\n public async visitClass(classA: AnyClass): Promise<void> {\r\n const classB = await this._schemaB.lookupItem<AnyClass>(classA.key);\r\n this._schemaComparer.compareClasses(classA, classB);\r\n }\r\n\r\n /**\r\n * Called for each [[AnyProperty]] instance of an ECClass.\r\n * @param property an AnyProperty object.\r\n */\r\n public async visitProperty(propertyA: AnyProperty): Promise<void> {\r\n let propertyB: AnyProperty | undefined;\r\n\r\n const classB = await this._schemaB.lookupItem<ECClass>(propertyA.class.key);\r\n if (classB)\r\n propertyB = await classB.getProperty(propertyA.name) as AnyProperty;\r\n\r\n this._schemaComparer.compareProperties(propertyA, propertyB);\r\n }\r\n\r\n /**\r\n * Called for each [[EntityClass]] instance found during schema traversal.\r\n * @param entityClass an EntityClass object.\r\n */\r\n public async visitEntityClass(entityA: EntityClass): Promise<void> {\r\n const entityB = await this._schemaB.lookupItem<EntityClass>(entityA.key);\r\n this._schemaComparer.compareEntityClasses(entityA, entityB);\r\n }\r\n\r\n /**\r\n * Called for each [[StructClass]] instance found during schema traversal.\r\n * @param structClass a StructClass object.\r\n */\r\n public async visitStructClass(_structA: StructClass): Promise<void> {\r\n // No comparison to make specifically on StructClasses\r\n }\r\n\r\n /**\r\n * Called for each [[Mixin]] instance found during schema traversal.\r\n * @param mixin a Mixin object.\r\n */\r\n public async visitMixin(mixinA: Mixin): Promise<void> {\r\n const mixinB = await this._schemaB.lookupItem<Mixin>(mixinA.key);\r\n this._schemaComparer.compareMixins(mixinA, mixinB);\r\n }\r\n\r\n /**\r\n * Called for each [[RelationshipClass]] instance found during schema traversal.\r\n * @param relationshipClass a RelationshipClass object.\r\n */\r\n public async visitRelationshipClass(relationshipA: RelationshipClass): Promise<void> {\r\n const relationshipB = await this._schemaB.lookupItem<RelationshipClass>(relationshipA.key);\r\n this._schemaComparer.compareRelationshipClasses(relationshipA, relationshipB);\r\n }\r\n\r\n /**\r\n * Called for each [[RelationshipConstraint]] of each RelationshipClass found during schema traversal.\r\n * @param relationshipConstraint a RelationshipConstraint object.\r\n */\r\n public async visitRelationshipConstraint(constraintA: RelationshipConstraint): Promise<void> {\r\n let constraintB: RelationshipConstraint | undefined;\r\n const relationshipB = await this._schemaB.lookupItem<RelationshipClass>(constraintA.relationshipClass.key);\r\n if (relationshipB)\r\n constraintB = constraintA.isSource ? relationshipB.source : relationshipB.target;\r\n this._schemaComparer.compareRelationshipConstraints(constraintA, constraintB);\r\n }\r\n\r\n /**\r\n * Called for each [[CustomAttributeClass]] instance found during schema traversal.\r\n * @param customAttributeClass a CustomAttributeClass object.\r\n */\r\n public async visitCustomAttributeClass(customAttributeA: CustomAttributeClass): Promise<void> {\r\n const customAttributeB = await this._schemaB.lookupItem<CustomAttributeClass>(customAttributeA.key);\r\n this._schemaComparer.compareCustomAttributeClasses(customAttributeA, customAttributeB);\r\n }\r\n\r\n /**\r\n * Called for each [[CustomAttribute]] container in the schema.\r\n * @param customAttributeContainer a [[CustomAttributeContainerProps]] object.\r\n */\r\n public async visitCustomAttributeContainer(containerA: CustomAttributeContainerProps): Promise<void> {\r\n const nameParts = containerA.fullName.split(\".\");\r\n const shortName = nameParts.length === 1 ? nameParts[0] : nameParts[1];\r\n let containerB: CustomAttributeContainerProps | undefined;\r\n\r\n if (Schema.isSchema(containerA)) {\r\n containerB = this._schemaB;\r\n } else if (ECClass.isECClass(containerA)) {\r\n containerB = await this._schemaB.lookupItem(shortName);\r\n } else if (Property.isProperty(containerA)) {\r\n const parent = await this._schemaB.lookupItem<ECClass>(containerA.class.key);\r\n containerB = parent ? await parent.getProperty(shortName) : undefined;\r\n } else if (RelationshipConstraint.isRelationshipConstraint(containerA)) {\r\n const parent = await this._schemaB.lookupItem<RelationshipClass>(containerA.relationshipClass.key);\r\n containerB = parent ? await parent.getProperty(shortName) : undefined;\r\n }\r\n\r\n this._schemaComparer.compareCustomAttributeContainers(containerA, containerB);\r\n }\r\n\r\n /**\r\n * Called for each [[Enumeration]] instance found during schema traversal.\r\n * @param enumeration an Enumeration object.\r\n */\r\n public async visitEnumeration(enumA: Enumeration) {\r\n const enumB = await this._schemaB.lookupItem<Enumeration>(enumA.key);\r\n this._schemaComparer.compareEnumerations(enumA, enumB);\r\n }\r\n\r\n /**\r\n * Called for each [[KindOfQuantity]] instance found during schema traversal.\r\n * @param koq a KindOfQuantity object.\r\n */\r\n public async visitKindOfQuantity(koqA: KindOfQuantity) {\r\n const koqB = await this._schemaB.lookupItem<KindOfQuantity>(koqA.key);\r\n this._schemaComparer.compareKindOfQuantities(koqA, koqB);\r\n }\r\n\r\n /**\r\n * Called for each [[PropertyCategory]] instance found during schema traversal.\r\n * @param category a PropertyCategory object.\r\n */\r\n public async visitPropertyCategory(categoryA: PropertyCategory) {\r\n const categoryB = await this._schemaB.lookupItem<PropertyCategory>(categoryA.key);\r\n this._schemaComparer.comparePropertyCategories(categoryA, categoryB);\r\n }\r\n\r\n /**\r\n * Called for each [[Format]] instance found during schema traversal.\r\n * @param format a Format object.\r\n */\r\n public async visitFormat(formatA: Format): Promise<void> {\r\n const formatB = await this._schemaB.lookupItem<Format>(formatA.key);\r\n this._schemaComparer.compareFormats(formatA, formatB);\r\n }\r\n\r\n /**\r\n * Called for each [[Unit]] instance found during schema traversal.\r\n * @param unit a Unit object.\r\n */\r\n public async visitUnit(unitA: Unit): Promise<void> {\r\n const unitB = await this._schemaB.lookupItem<Unit>(unitA.key);\r\n this._schemaComparer.compareUnits(unitA, unitB);\r\n }\r\n\r\n /**\r\n * Called for each [[InvertedUnit]] instance found during schema traversal.\r\n * @param invertedUnit an InvertedUnit object.\r\n */\r\n public async visitInvertedUnit(invertedUnitA: InvertedUnit): Promise<void> {\r\n const invertedUnitB = await this._schemaB.lookupItem<InvertedUnit>(invertedUnitA.key);\r\n this._schemaComparer.compareInvertedUnits(invertedUnitA, invertedUnitB);\r\n }\r\n\r\n /**\r\n * Called for each [[UnitSystem]] instance found during schema traversal.\r\n * @param unitSystem a UnitSystem object.\r\n */\r\n public async visitUnitSystem(_unitSystemA: UnitSystem): Promise<void> {\r\n // No comparison to make specifically on unitSystem\r\n }\r\n\r\n /**\r\n * Called for each [[Phenomenon]] instance found during schema traversal.\r\n * @param phenomena a Phenomenon object.\r\n */\r\n public async visitPhenomenon(phenomenonA: Phenomenon): Promise<void> {\r\n const phenomenonB = await this._schemaB.lookupItem<Phenomenon>(phenomenonA.key);\r\n this._schemaComparer.comparePhenomenons(phenomenonA, phenomenonB);\r\n }\r\n\r\n /**\r\n * Called for each [[Constant]] instance found during schema traversal.\r\n * @param constant a Constant object.\r\n */\r\n public async visitConstant(constantA: Constant): Promise<void> {\r\n const constantB = await this._schemaB.lookupItem<Constant>(constantA.key);\r\n this._schemaComparer.compareConstants(constantA, constantB);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SchemaCompareVisitor.js","sourceRoot":"","sources":["../../../src/Validation/SchemaCompareVisitor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Comparison\r\n */\r\n\r\nimport { AnyClass, AnyProperty, Constant, CustomAttributeClass, CustomAttributeContainerProps,\r\n ECClass, EntityClass, Enumeration, Format, InvertedUnit, ISchemaPartVisitor, KindOfQuantity, Mixin,\r\n Phenomenon, Property, PropertyCategory, RelationshipClass, RelationshipConstraint, Schema, SchemaItem,\r\n StructClass, Unit, UnitSystem,\r\n} from \"@itwin/ecschema-metadata\";\r\nimport { ISchemaComparer, SchemaComparerOptions } from \"./SchemaComparer\";\r\n\r\n/**\r\n * An ISchemaPartVisitor interface implementation that is used to compare to Schemas.\r\n * @internal\r\n */\r\nexport class SchemaCompareVisitor implements ISchemaPartVisitor {\r\n private _schemaB: Schema;\r\n private _schemaComparer: ISchemaComparer;\r\n private _lookupFullName: boolean;\r\n\r\n /**\r\n * Initializes a new SchemaCompareVisitor instance.\r\n * @param schemaComparer The [[SchemaComparer]] to use to compare each item of the schema.\r\n * @param schemaToCompare The second or 'B' schema to compare against the schema being traversed (Schema A).\r\n */\r\n constructor(schemaComparer: ISchemaComparer, schemaToCompare: Schema, options?: SchemaComparerOptions) {\r\n this._schemaComparer = schemaComparer;\r\n this._schemaB = schemaToCompare;\r\n this._lookupFullName = options?.compareItemFullName ?? true;\r\n }\r\n\r\n private async lookupItem<T extends SchemaItem = SchemaItem>(item: SchemaItem) {\r\n return this._schemaB.lookupItem<T>(this._lookupFullName ? item.key : item.name);\r\n }\r\n\r\n /**\r\n * Called before schema traversal.\r\n * @param schema a Schema object.\r\n */\r\n public async visitFullSchema(schemaA: Schema) {\r\n this._schemaComparer.compareSchemaProps(schemaA, this._schemaB);\r\n }\r\n\r\n /**\r\n * Called for each [[SchemaItem]] instance found during schema traversal.\r\n * @param schemaItem a SchemaItem object.\r\n */\r\n public async visitSchemaItem(schemaItemA: SchemaItem) {\r\n const schemaItemB = await this.lookupItem(schemaItemA);\r\n this._schemaComparer.compareSchemaItems(schemaItemA, schemaItemB);\r\n }\r\n\r\n /**\r\n * Called for each [[AnyClass]] instance found during schema traversal.\r\n * @param ecClass an ECClass object.\r\n */\r\n public async visitClass(classA: AnyClass): Promise<void> {\r\n const classB = await this.lookupItem<AnyClass>(classA);\r\n this._schemaComparer.compareClasses(classA, classB);\r\n }\r\n\r\n /**\r\n * Called for each [[AnyProperty]] instance of an ECClass.\r\n * @param property an AnyProperty object.\r\n */\r\n public async visitProperty(propertyA: AnyProperty): Promise<void> {\r\n let propertyB: AnyProperty | undefined;\r\n\r\n const classB = await this.lookupItem<ECClass>(propertyA.class);\r\n if (classB)\r\n propertyB = await classB.getProperty(propertyA.name) as AnyProperty;\r\n\r\n this._schemaComparer.compareProperties(propertyA, propertyB);\r\n }\r\n\r\n /**\r\n * Called for each [[EntityClass]] instance found during schema traversal.\r\n * @param entityClass an EntityClass object.\r\n */\r\n public async visitEntityClass(entityA: EntityClass): Promise<void> {\r\n const entityB = await this.lookupItem<EntityClass>(entityA);\r\n this._schemaComparer.compareEntityClasses(entityA, entityB);\r\n }\r\n\r\n /**\r\n * Called for each [[StructClass]] instance found during schema traversal.\r\n * @param structClass a StructClass object.\r\n */\r\n public async visitStructClass(_structA: StructClass): Promise<void> {\r\n // No comparison to make specifically on StructClasses\r\n }\r\n\r\n /**\r\n * Called for each [[Mixin]] instance found during schema traversal.\r\n * @param mixin a Mixin object.\r\n */\r\n public async visitMixin(mixinA: Mixin): Promise<void> {\r\n const mixinB = await this.lookupItem<Mixin>(mixinA);\r\n this._schemaComparer.compareMixins(mixinA, mixinB);\r\n }\r\n\r\n /**\r\n * Called for each [[RelationshipClass]] instance found during schema traversal.\r\n * @param relationshipClass a RelationshipClass object.\r\n */\r\n public async visitRelationshipClass(relationshipA: RelationshipClass): Promise<void> {\r\n const relationshipB = await this.lookupItem<RelationshipClass>(relationshipA);\r\n this._schemaComparer.compareRelationshipClasses(relationshipA, relationshipB);\r\n }\r\n\r\n /**\r\n * Called for each [[RelationshipConstraint]] of each RelationshipClass found during schema traversal.\r\n * @param relationshipConstraint a RelationshipConstraint object.\r\n */\r\n public async visitRelationshipConstraint(constraintA: RelationshipConstraint): Promise<void> {\r\n let constraintB: RelationshipConstraint | undefined;\r\n const relationshipB = await this.lookupItem<RelationshipClass>(constraintA.relationshipClass);\r\n if (relationshipB)\r\n constraintB = constraintA.isSource ? relationshipB.source : relationshipB.target;\r\n this._schemaComparer.compareRelationshipConstraints(constraintA, constraintB);\r\n }\r\n\r\n /**\r\n * Called for each [[CustomAttributeClass]] instance found during schema traversal.\r\n * @param customAttributeClass a CustomAttributeClass object.\r\n */\r\n public async visitCustomAttributeClass(customAttributeA: CustomAttributeClass): Promise<void> {\r\n const customAttributeB = await this.lookupItem<CustomAttributeClass>(customAttributeA);\r\n this._schemaComparer.compareCustomAttributeClasses(customAttributeA, customAttributeB);\r\n }\r\n\r\n /**\r\n * Called for each [[CustomAttribute]] container in the schema.\r\n * @param customAttributeContainer a [[CustomAttributeContainerProps]] object.\r\n */\r\n public async visitCustomAttributeContainer(containerA: CustomAttributeContainerProps): Promise<void> {\r\n const nameParts = containerA.fullName.split(\".\");\r\n const shortName = nameParts.length === 1 ? nameParts[0] : nameParts[1];\r\n let containerB: CustomAttributeContainerProps | undefined;\r\n\r\n if (Schema.isSchema(containerA)) {\r\n containerB = this._schemaB;\r\n } else if (ECClass.isECClass(containerA)) {\r\n containerB = await this._schemaB.lookupItem(shortName);\r\n } else if (Property.isProperty(containerA)) {\r\n const parent = await this.lookupItem<ECClass>(containerA.class);\r\n containerB = parent ? await parent.getProperty(shortName) : undefined;\r\n } else if (RelationshipConstraint.isRelationshipConstraint(containerA)) {\r\n const parent = await this.lookupItem<RelationshipClass>(containerA.relationshipClass);\r\n containerB = parent ? await parent.getProperty(shortName) : undefined;\r\n }\r\n\r\n this._schemaComparer.compareCustomAttributeContainers(containerA, containerB);\r\n }\r\n\r\n /**\r\n * Called for each [[Enumeration]] instance found during schema traversal.\r\n * @param enumeration an Enumeration object.\r\n */\r\n public async visitEnumeration(enumA: Enumeration) {\r\n const enumB = await this.lookupItem<Enumeration>(enumA);\r\n this._schemaComparer.compareEnumerations(enumA, enumB);\r\n }\r\n\r\n /**\r\n * Called for each [[KindOfQuantity]] instance found during schema traversal.\r\n * @param koq a KindOfQuantity object.\r\n */\r\n public async visitKindOfQuantity(koqA: KindOfQuantity) {\r\n const koqB = await this.lookupItem<KindOfQuantity>(koqA);\r\n this._schemaComparer.compareKindOfQuantities(koqA, koqB);\r\n }\r\n\r\n /**\r\n * Called for each [[PropertyCategory]] instance found during schema traversal.\r\n * @param category a PropertyCategory object.\r\n */\r\n public async visitPropertyCategory(categoryA: PropertyCategory) {\r\n const categoryB = await this.lookupItem<PropertyCategory>(categoryA);\r\n this._schemaComparer.comparePropertyCategories(categoryA, categoryB);\r\n }\r\n\r\n /**\r\n * Called for each [[Format]] instance found during schema traversal.\r\n * @param format a Format object.\r\n */\r\n public async visitFormat(formatA: Format): Promise<void> {\r\n const formatB = await this.lookupItem<Format>(formatA);\r\n this._schemaComparer.compareFormats(formatA, formatB);\r\n }\r\n\r\n /**\r\n * Called for each [[Unit]] instance found during schema traversal.\r\n * @param unit a Unit object.\r\n */\r\n public async visitUnit(unitA: Unit): Promise<void> {\r\n const unitB = await this.lookupItem<Unit>(unitA);\r\n this._schemaComparer.compareUnits(unitA, unitB);\r\n }\r\n\r\n /**\r\n * Called for each [[InvertedUnit]] instance found during schema traversal.\r\n * @param invertedUnit an InvertedUnit object.\r\n */\r\n public async visitInvertedUnit(invertedUnitA: InvertedUnit): Promise<void> {\r\n const invertedUnitB = await this.lookupItem<InvertedUnit>(invertedUnitA);\r\n this._schemaComparer.compareInvertedUnits(invertedUnitA, invertedUnitB);\r\n }\r\n\r\n /**\r\n * Called for each [[UnitSystem]] instance found during schema traversal.\r\n * @param unitSystem a UnitSystem object.\r\n */\r\n public async visitUnitSystem(_unitSystemA: UnitSystem): Promise<void> {\r\n // No comparison to make specifically on unitSystem\r\n }\r\n\r\n /**\r\n * Called for each [[Phenomenon]] instance found during schema traversal.\r\n * @param phenomena a Phenomenon object.\r\n */\r\n public async visitPhenomenon(phenomenonA: Phenomenon): Promise<void> {\r\n const phenomenonB = await this.lookupItem<Phenomenon>(phenomenonA);\r\n this._schemaComparer.comparePhenomenons(phenomenonA, phenomenonB);\r\n }\r\n\r\n /**\r\n * Called for each [[Constant]] instance found during schema traversal.\r\n * @param constant a Constant object.\r\n */\r\n public async visitConstant(constantA: Constant): Promise<void> {\r\n const constantB = await this.lookupItem<Constant>(constantA);\r\n this._schemaComparer.compareConstants(constantA, constantB);\r\n }\r\n}\r\n"]}
|