@itwin/ecschema-metadata 3.6.0-dev.8 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CHANGELOG.md +41 -1
  2. package/LICENSE.md +1 -1
  3. package/lib/cjs/Constants.d.ts +23 -23
  4. package/lib/cjs/Constants.js +33 -33
  5. package/lib/cjs/Constants.js.map +1 -1
  6. package/lib/cjs/Context.d.ts +139 -139
  7. package/lib/cjs/Context.js +204 -204
  8. package/lib/cjs/DelayedPromise.d.ts +88 -88
  9. package/lib/cjs/DelayedPromise.js +91 -91
  10. package/lib/cjs/DelayedPromise.js.map +1 -1
  11. package/lib/cjs/Deserialization/AbstractParser.d.ts +45 -45
  12. package/lib/cjs/Deserialization/AbstractParser.js +11 -11
  13. package/lib/cjs/Deserialization/AbstractParser.js.map +1 -1
  14. package/lib/cjs/Deserialization/Helper.d.ts +251 -251
  15. package/lib/cjs/Deserialization/Helper.js +843 -843
  16. package/lib/cjs/Deserialization/Helper.js.map +1 -1
  17. package/lib/cjs/Deserialization/JsonParser.d.ts +165 -165
  18. package/lib/cjs/Deserialization/JsonParser.js +680 -680
  19. package/lib/cjs/Deserialization/JsonParser.js.map +1 -1
  20. package/lib/cjs/Deserialization/JsonProps.d.ts +282 -282
  21. package/lib/cjs/Deserialization/JsonProps.js +9 -9
  22. package/lib/cjs/Deserialization/JsonProps.js.map +1 -1
  23. package/lib/cjs/Deserialization/SchemaGraphUtil.d.ts +34 -34
  24. package/lib/cjs/Deserialization/SchemaGraphUtil.js +77 -77
  25. package/lib/cjs/Deserialization/SchemaGraphUtil.js.map +1 -1
  26. package/lib/cjs/Deserialization/XmlParser.d.ts +85 -85
  27. package/lib/cjs/Deserialization/XmlParser.js +973 -973
  28. package/lib/cjs/Deserialization/XmlParser.js.map +1 -1
  29. package/lib/cjs/Deserialization/XmlSerializationUtils.d.ts +54 -54
  30. package/lib/cjs/Deserialization/XmlSerializationUtils.js +174 -174
  31. package/lib/cjs/Deserialization/XmlSerializationUtils.js.map +1 -1
  32. package/lib/cjs/ECName.d.ts +30 -30
  33. package/lib/cjs/ECName.js +85 -85
  34. package/lib/cjs/ECName.js.map +1 -1
  35. package/lib/cjs/ECObjects.d.ts +162 -162
  36. package/lib/cjs/ECObjects.js +453 -453
  37. package/lib/cjs/ECObjects.js.map +1 -1
  38. package/lib/cjs/Exception.d.ts +43 -43
  39. package/lib/cjs/Exception.js +86 -86
  40. package/lib/cjs/Exception.js.map +1 -1
  41. package/lib/cjs/Interfaces.d.ts +66 -66
  42. package/lib/cjs/Interfaces.js +9 -9
  43. package/lib/cjs/Interfaces.js.map +1 -1
  44. package/lib/cjs/Metadata/Class.d.ts +243 -243
  45. package/lib/cjs/Metadata/Class.js +558 -558
  46. package/lib/cjs/Metadata/Class.js.map +1 -1
  47. package/lib/cjs/Metadata/Constant.d.ts +64 -64
  48. package/lib/cjs/Metadata/Constant.js +123 -123
  49. package/lib/cjs/Metadata/Constant.js.map +1 -1
  50. package/lib/cjs/Metadata/CustomAttribute.d.ts +23 -23
  51. package/lib/cjs/Metadata/CustomAttribute.js +27 -27
  52. package/lib/cjs/Metadata/CustomAttribute.js.map +1 -1
  53. package/lib/cjs/Metadata/CustomAttributeClass.d.ts +39 -39
  54. package/lib/cjs/Metadata/CustomAttributeClass.js +68 -68
  55. package/lib/cjs/Metadata/CustomAttributeClass.js.map +1 -1
  56. package/lib/cjs/Metadata/EntityClass.d.ts +77 -77
  57. package/lib/cjs/Metadata/EntityClass.js +230 -230
  58. package/lib/cjs/Metadata/EntityClass.js.map +1 -1
  59. package/lib/cjs/Metadata/Enumeration.d.ts +86 -86
  60. package/lib/cjs/Metadata/Enumeration.js +159 -159
  61. package/lib/cjs/Metadata/Enumeration.js.map +1 -1
  62. package/lib/cjs/Metadata/Format.d.ts +98 -98
  63. package/lib/cjs/Metadata/Format.js +242 -242
  64. package/lib/cjs/Metadata/Format.js.map +1 -1
  65. package/lib/cjs/Metadata/InvertedUnit.d.ts +49 -49
  66. package/lib/cjs/Metadata/InvertedUnit.js +97 -97
  67. package/lib/cjs/Metadata/InvertedUnit.js.map +1 -1
  68. package/lib/cjs/Metadata/KindOfQuantity.d.ts +65 -65
  69. package/lib/cjs/Metadata/KindOfQuantity.js +225 -225
  70. package/lib/cjs/Metadata/KindOfQuantity.js.map +1 -1
  71. package/lib/cjs/Metadata/Mixin.d.ts +54 -54
  72. package/lib/cjs/Metadata/Mixin.js +113 -113
  73. package/lib/cjs/Metadata/Mixin.js.map +1 -1
  74. package/lib/cjs/Metadata/OverrideFormat.d.ts +55 -55
  75. package/lib/cjs/Metadata/OverrideFormat.js +88 -88
  76. package/lib/cjs/Metadata/OverrideFormat.js.map +1 -1
  77. package/lib/cjs/Metadata/Phenomenon.d.ts +33 -33
  78. package/lib/cjs/Metadata/Phenomenon.js +59 -59
  79. package/lib/cjs/Metadata/Phenomenon.js.map +1 -1
  80. package/lib/cjs/Metadata/Property.d.ts +197 -197
  81. package/lib/cjs/Metadata/Property.js +491 -491
  82. package/lib/cjs/Metadata/Property.js.map +1 -1
  83. package/lib/cjs/Metadata/PropertyCategory.d.ts +39 -39
  84. package/lib/cjs/Metadata/PropertyCategory.js +61 -61
  85. package/lib/cjs/Metadata/PropertyCategory.js.map +1 -1
  86. package/lib/cjs/Metadata/RelationshipClass.d.ts +152 -152
  87. package/lib/cjs/Metadata/RelationshipClass.js +349 -349
  88. package/lib/cjs/Metadata/RelationshipClass.js.map +1 -1
  89. package/lib/cjs/Metadata/Schema.d.ts +291 -291
  90. package/lib/cjs/Metadata/Schema.js +520 -520
  91. package/lib/cjs/Metadata/Schema.js.map +1 -1
  92. package/lib/cjs/Metadata/SchemaItem.d.ts +61 -61
  93. package/lib/cjs/Metadata/SchemaItem.js +136 -136
  94. package/lib/cjs/Metadata/SchemaItem.js.map +1 -1
  95. package/lib/cjs/Metadata/Unit.d.ts +76 -76
  96. package/lib/cjs/Metadata/Unit.js +162 -162
  97. package/lib/cjs/Metadata/UnitSystem.d.ts +20 -20
  98. package/lib/cjs/Metadata/UnitSystem.js +29 -29
  99. package/lib/cjs/Metadata/UnitSystem.js.map +1 -1
  100. package/lib/cjs/PropertyTypes.d.ts +49 -49
  101. package/lib/cjs/PropertyTypes.js +91 -91
  102. package/lib/cjs/PropertyTypes.js.map +1 -1
  103. package/lib/cjs/SchemaJsonLocater.d.ts +34 -34
  104. package/lib/cjs/SchemaJsonLocater.js +42 -42
  105. package/lib/cjs/SchemaJsonLocater.js.map +1 -1
  106. package/lib/cjs/SchemaKey.d.ts +110 -110
  107. package/lib/cjs/SchemaKey.js +219 -219
  108. package/lib/cjs/SchemaKey.js.map +1 -1
  109. package/lib/cjs/SchemaLoader.d.ts +23 -23
  110. package/lib/cjs/SchemaLoader.js +47 -47
  111. package/lib/cjs/SchemaLoader.js.map +1 -1
  112. package/lib/cjs/SchemaPartVisitorDelegate.d.ts +274 -274
  113. package/lib/cjs/SchemaPartVisitorDelegate.js +212 -212
  114. package/lib/cjs/SchemaPartVisitorDelegate.js.map +1 -1
  115. package/lib/cjs/UnitConversion/Graph.d.ts +34 -34
  116. package/lib/cjs/UnitConversion/Graph.js +83 -83
  117. package/lib/cjs/UnitConversion/Graph.js.map +1 -1
  118. package/lib/cjs/UnitConversion/Parser.d.ts +8 -8
  119. package/lib/cjs/UnitConversion/Parser.js +42 -42
  120. package/lib/cjs/UnitConversion/Parser.js.map +1 -1
  121. package/lib/cjs/UnitConversion/UnitConversion.d.ts +45 -45
  122. package/lib/cjs/UnitConversion/UnitConversion.js +77 -77
  123. package/lib/cjs/UnitConversion/UnitConversion.js.map +1 -1
  124. package/lib/cjs/UnitConversion/UnitConverter.d.ts +39 -39
  125. package/lib/cjs/UnitConversion/UnitConverter.js +116 -116
  126. package/lib/cjs/UnitConversion/UnitConverter.js.map +1 -1
  127. package/lib/cjs/UnitConversion/UnitTree.d.ts +43 -43
  128. package/lib/cjs/UnitConversion/UnitTree.js +169 -169
  129. package/lib/cjs/UnitConversion/UnitTree.js.map +1 -1
  130. package/lib/cjs/UnitProvider/SchemaUnitProvider.d.ts +77 -77
  131. package/lib/cjs/UnitProvider/SchemaUnitProvider.js +236 -236
  132. package/lib/cjs/UnitProvider/SchemaUnitProvider.js.map +1 -1
  133. package/lib/cjs/Validation/SchemaWalker.d.ts +23 -23
  134. package/lib/cjs/Validation/SchemaWalker.js +53 -53
  135. package/lib/cjs/Validation/SchemaWalker.js.map +1 -1
  136. package/lib/cjs/ecschema-metadata.d.ts +51 -51
  137. package/lib/cjs/ecschema-metadata.js +96 -96
  138. package/lib/cjs/ecschema-metadata.js.map +1 -1
  139. package/lib/cjs/utils/SchemaGraph.d.ts +25 -25
  140. package/lib/cjs/utils/SchemaGraph.js +65 -65
  141. package/lib/cjs/utils/SchemaGraph.js.map +1 -1
  142. package/package.json +7 -7
@@ -1,40 +1,40 @@
1
- import { SchemaContext } from "../Context";
2
- import { UnitConversion } from "./UnitConversion";
3
- /**
4
- * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
5
- * @internal
6
- */
7
- export declare class UnitConverter {
8
- private readonly _context;
9
- private _uGraph;
10
- /**
11
- * Create Converter context
12
- * @param _context SchemaContext with contexts added to it.
13
- */
14
- constructor(_context: SchemaContext);
15
- /**
16
- * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
17
- * @param fromUnit SchemaItem full name of source unit
18
- * @param toUnit SchemaItem full name of target unit
19
- * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
20
- * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
21
- * @throws Error if from and to Units do not belong to the same phenomenon
22
- * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
23
- * @throws Error if base units of source and target unit do not match
24
- */
25
- calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion>;
26
- /**
27
- * @param from Source unit converted from
28
- * @param to Target unit converted to
29
- * @internal
30
- */
31
- private processUnits;
32
- /**
33
- * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
34
- * @param fromBaseUnits Map of base units for source unit
35
- * @param toBaseUnits Map of base units for target unit
36
- * @internal
37
- */
38
- private checkBaseUnitsMatch;
39
- }
1
+ import { SchemaContext } from "../Context";
2
+ import { UnitConversion } from "./UnitConversion";
3
+ /**
4
+ * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
5
+ * @internal
6
+ */
7
+ export declare class UnitConverter {
8
+ private readonly _context;
9
+ private _uGraph;
10
+ /**
11
+ * Create Converter context
12
+ * @param _context SchemaContext with contexts added to it.
13
+ */
14
+ constructor(_context: SchemaContext);
15
+ /**
16
+ * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
17
+ * @param fromUnit SchemaItem full name of source unit
18
+ * @param toUnit SchemaItem full name of target unit
19
+ * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
20
+ * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
21
+ * @throws Error if from and to Units do not belong to the same phenomenon
22
+ * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
23
+ * @throws Error if base units of source and target unit do not match
24
+ */
25
+ calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion>;
26
+ /**
27
+ * @param from Source unit converted from
28
+ * @param to Target unit converted to
29
+ * @internal
30
+ */
31
+ private processUnits;
32
+ /**
33
+ * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
34
+ * @param fromBaseUnits Map of base units for source unit
35
+ * @param toBaseUnits Map of base units for target unit
36
+ * @internal
37
+ */
38
+ private checkBaseUnitsMatch;
39
+ }
40
40
  //# sourceMappingURL=UnitConverter.d.ts.map
@@ -1,117 +1,117 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UnitConverter = 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 core_bentley_1 = require("@itwin/core-bentley");
9
- const SchemaItem_1 = require("../Metadata/SchemaItem");
10
- const Unit_1 = require("../Metadata/Unit");
11
- const SchemaKey_1 = require("../SchemaKey");
12
- const UnitConversion_1 = require("./UnitConversion");
13
- const UnitTree_1 = require("./UnitTree");
14
- /**
15
- * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
16
- * @internal
17
- */
18
- class UnitConverter {
19
- /**
20
- * Create Converter context
21
- * @param _context SchemaContext with contexts added to it.
22
- */
23
- constructor(_context) {
24
- this._context = _context;
25
- this._uGraph = new UnitTree_1.UnitGraph(this._context);
26
- }
27
- /**
28
- * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
29
- * @param fromUnit SchemaItem full name of source unit
30
- * @param toUnit SchemaItem full name of target unit
31
- * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
32
- * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
33
- * @throws Error if from and to Units do not belong to the same phenomenon
34
- * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
35
- * @throws Error if base units of source and target unit do not match
36
- */
37
- async calculateConversion(fromUnit, toUnit) {
38
- const [fromSchemaName, fromSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(fromUnit);
39
- const [toSchemaName, toSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(toUnit);
40
- const fromSchemaKey = new SchemaKey_1.SchemaKey(fromSchemaName);
41
- const toSchemaKey = new SchemaKey_1.SchemaKey(toSchemaName);
42
- const fromSchema = await this._context.getSchema(fromSchemaKey);
43
- const toSchema = await this._context.getSchema(toSchemaKey);
44
- if (!fromSchema || !toSchema) {
45
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, "Cannot find from's and/or to's schema", () => {
46
- return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };
47
- });
48
- }
49
- const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);
50
- const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);
51
- return this.processUnits(from, to);
52
- }
53
- /**
54
- * @param from Source unit converted from
55
- * @param to Target unit converted to
56
- * @internal
57
- */
58
- async processUnits(from, to) {
59
- if (from.key.matches(to.key))
60
- return UnitConversion_1.UnitConversion.identity;
61
- const areCompatible = await Unit_1.Unit.areCompatible(from, to);
62
- if (!areCompatible)
63
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {
64
- return { from, to };
65
- });
66
- // Add nodes and subsequent children to graph
67
- await this._uGraph.addUnit(from);
68
- await this._uGraph.addUnit(to);
69
- const fromBaseUnits = new Map();
70
- const toBaseUnits = new Map();
71
- // Calculate map of UnitConversions to get between from -> base
72
- const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);
73
- // Calculate map of UnitConversions to get between base -> to
74
- const toMapStore = this._uGraph.reduce(to, toBaseUnits);
75
- if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))
76
- throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {
77
- return { from, to };
78
- });
79
- // Final calculations to get singular UnitConversion between from -> to
80
- const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion_1.UnitConversion.identity;
81
- const toMap = toMapStore.get(to.key.fullName) || UnitConversion_1.UnitConversion.identity;
82
- const fromInverse = fromMap.inverse();
83
- return fromInverse.compose(toMap);
84
- }
85
- /**
86
- * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
87
- * @param fromBaseUnits Map of base units for source unit
88
- * @param toBaseUnits Map of base units for target unit
89
- * @internal
90
- */
91
- checkBaseUnitsMatch(fromBaseUnits, toBaseUnits) {
92
- // Trim maps of "One" and value that equal zero as they do not affect the base units and calculations
93
- for (const [key, value] of fromBaseUnits.entries()) {
94
- const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
95
- if (schemaItemName === "ONE" || value === 0) {
96
- fromBaseUnits.delete(key);
97
- }
98
- }
99
- for (const [key, value] of toBaseUnits.entries()) {
100
- const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
101
- if (schemaItemName === "ONE" || value === 0) {
102
- toBaseUnits.delete(key);
103
- }
104
- }
105
- if (fromBaseUnits.size !== toBaseUnits.size)
106
- return false;
107
- for (const key of fromBaseUnits.keys()) {
108
- if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {
109
- // Mismatching key or value
110
- return false;
111
- }
112
- }
113
- return true;
114
- }
115
- }
116
- exports.UnitConverter = UnitConverter;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnitConverter = 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 core_bentley_1 = require("@itwin/core-bentley");
9
+ const SchemaItem_1 = require("../Metadata/SchemaItem");
10
+ const Unit_1 = require("../Metadata/Unit");
11
+ const SchemaKey_1 = require("../SchemaKey");
12
+ const UnitConversion_1 = require("./UnitConversion");
13
+ const UnitTree_1 = require("./UnitTree");
14
+ /**
15
+ * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
16
+ * @internal
17
+ */
18
+ class UnitConverter {
19
+ /**
20
+ * Create Converter context
21
+ * @param _context SchemaContext with contexts added to it.
22
+ */
23
+ constructor(_context) {
24
+ this._context = _context;
25
+ this._uGraph = new UnitTree_1.UnitGraph(this._context);
26
+ }
27
+ /**
28
+ * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
29
+ * @param fromUnit SchemaItem full name of source unit
30
+ * @param toUnit SchemaItem full name of target unit
31
+ * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
32
+ * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
33
+ * @throws Error if from and to Units do not belong to the same phenomenon
34
+ * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
35
+ * @throws Error if base units of source and target unit do not match
36
+ */
37
+ async calculateConversion(fromUnit, toUnit) {
38
+ const [fromSchemaName, fromSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(fromUnit);
39
+ const [toSchemaName, toSchemaItemName] = SchemaItem_1.SchemaItem.parseFullName(toUnit);
40
+ const fromSchemaKey = new SchemaKey_1.SchemaKey(fromSchemaName);
41
+ const toSchemaKey = new SchemaKey_1.SchemaKey(toSchemaName);
42
+ const fromSchema = await this._context.getSchema(fromSchemaKey);
43
+ const toSchema = await this._context.getSchema(toSchemaKey);
44
+ if (!fromSchema || !toSchema) {
45
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, "Cannot find from's and/or to's schema", () => {
46
+ return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };
47
+ });
48
+ }
49
+ const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);
50
+ const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);
51
+ return this.processUnits(from, to);
52
+ }
53
+ /**
54
+ * @param from Source unit converted from
55
+ * @param to Target unit converted to
56
+ * @internal
57
+ */
58
+ async processUnits(from, to) {
59
+ if (from.key.matches(to.key))
60
+ return UnitConversion_1.UnitConversion.identity;
61
+ const areCompatible = await Unit_1.Unit.areCompatible(from, to);
62
+ if (!areCompatible)
63
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {
64
+ return { from, to };
65
+ });
66
+ // Add nodes and subsequent children to graph
67
+ await this._uGraph.addUnit(from);
68
+ await this._uGraph.addUnit(to);
69
+ const fromBaseUnits = new Map();
70
+ const toBaseUnits = new Map();
71
+ // Calculate map of UnitConversions to get between from -> base
72
+ const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);
73
+ // Calculate map of UnitConversions to get between base -> to
74
+ const toMapStore = this._uGraph.reduce(to, toBaseUnits);
75
+ if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))
76
+ throw new core_bentley_1.BentleyError(core_bentley_1.BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {
77
+ return { from, to };
78
+ });
79
+ // Final calculations to get singular UnitConversion between from -> to
80
+ const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion_1.UnitConversion.identity;
81
+ const toMap = toMapStore.get(to.key.fullName) || UnitConversion_1.UnitConversion.identity;
82
+ const fromInverse = fromMap.inverse();
83
+ return fromInverse.compose(toMap);
84
+ }
85
+ /**
86
+ * Check if fromBaseUnits's base units and exponents matches toBaseUnits's
87
+ * @param fromBaseUnits Map of base units for source unit
88
+ * @param toBaseUnits Map of base units for target unit
89
+ * @internal
90
+ */
91
+ checkBaseUnitsMatch(fromBaseUnits, toBaseUnits) {
92
+ // Trim maps of "One" and value that equal zero as they do not affect the base units and calculations
93
+ for (const [key, value] of fromBaseUnits.entries()) {
94
+ const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
95
+ if (schemaItemName === "ONE" || value === 0) {
96
+ fromBaseUnits.delete(key);
97
+ }
98
+ }
99
+ for (const [key, value] of toBaseUnits.entries()) {
100
+ const [, schemaItemName] = SchemaItem_1.SchemaItem.parseFullName(key);
101
+ if (schemaItemName === "ONE" || value === 0) {
102
+ toBaseUnits.delete(key);
103
+ }
104
+ }
105
+ if (fromBaseUnits.size !== toBaseUnits.size)
106
+ return false;
107
+ for (const key of fromBaseUnits.keys()) {
108
+ if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {
109
+ // Mismatching key or value
110
+ return false;
111
+ }
112
+ }
113
+ return true;
114
+ }
115
+ }
116
+ exports.UnitConverter = UnitConverter;
117
117
  //# sourceMappingURL=UnitConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnitConverter.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConverter.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 { BentleyError, BentleyStatus } from \"@itwin/core-bentley\";\r\nimport { SchemaContext } from \"../Context\";\r\nimport { Constant } from \"../Metadata/Constant\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaKey } from \"../SchemaKey\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { UnitGraph } from \"./UnitTree\";\r\n\r\n/**\r\n * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units\r\n * @internal\r\n */\r\nexport class UnitConverter {\r\n private _uGraph: UnitGraph;\r\n\r\n /**\r\n * Create Converter context\r\n * @param _context SchemaContext with contexts added to it.\r\n */\r\n constructor(private readonly _context: SchemaContext) {\r\n this._uGraph = new UnitGraph(this._context);\r\n }\r\n\r\n /**\r\n * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}\r\n * @param fromUnit SchemaItem full name of source unit\r\n * @param toUnit SchemaItem full name of target unit\r\n * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset\r\n * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext\r\n * @throws Error if from and to Units do not belong to the same phenomenon\r\n * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas\r\n * @throws Error if base units of source and target unit do not match\r\n */\r\n public async calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion> {\r\n const [fromSchemaName, fromSchemaItemName] = SchemaItem.parseFullName(fromUnit);\r\n const [toSchemaName, toSchemaItemName] = SchemaItem.parseFullName(toUnit);\r\n const fromSchemaKey = new SchemaKey(fromSchemaName);\r\n const toSchemaKey = new SchemaKey(toSchemaName);\r\n\r\n const fromSchema = await this._context.getSchema(fromSchemaKey);\r\n const toSchema = await this._context.getSchema(toSchemaKey);\r\n\r\n if (!fromSchema || !toSchema) {\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find from's and/or to's schema\", () => {\r\n return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };\r\n });\r\n }\r\n\r\n const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);\r\n const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);\r\n\r\n return this.processUnits(from, to);\r\n }\r\n\r\n /**\r\n * @param from Source unit converted from\r\n * @param to Target unit converted to\r\n * @internal\r\n */\r\n private async processUnits(from: Unit | Constant, to: Unit | Constant): Promise<UnitConversion> {\r\n if (from.key.matches(to.key))\r\n return UnitConversion.identity;\r\n\r\n const areCompatible = await Unit.areCompatible(from as Unit, to as Unit);\r\n if (!areCompatible)\r\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {\r\n return { from, to };\r\n });\r\n\r\n // Add nodes and subsequent children to graph\r\n await this._uGraph.addUnit(from);\r\n await this._uGraph.addUnit(to);\r\n\r\n const fromBaseUnits = new Map<string, number>();\r\n const toBaseUnits = new Map<string, number>();\r\n // Calculate map of UnitConversions to get between from -> base\r\n const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);\r\n // Calculate map of UnitConversions to get between base -> to\r\n const toMapStore = this._uGraph.reduce(to, toBaseUnits);\r\n\r\n if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))\r\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {\r\n return { from, to };\r\n });\r\n\r\n // Final calculations to get singular UnitConversion between from -> to\r\n const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion.identity;\r\n const toMap = toMapStore.get(to.key.fullName) || UnitConversion.identity;\r\n const fromInverse = fromMap.inverse();\r\n return fromInverse.compose(toMap);\r\n }\r\n\r\n /**\r\n * Check if fromBaseUnits's base units and exponents matches toBaseUnits's\r\n * @param fromBaseUnits Map of base units for source unit\r\n * @param toBaseUnits Map of base units for target unit\r\n * @internal\r\n */\r\n private checkBaseUnitsMatch(fromBaseUnits: Map<string, number>, toBaseUnits: Map<string, number>): boolean {\r\n // Trim maps of \"One\" and value that equal zero as they do not affect the base units and calculations\r\n for (const [key, value] of fromBaseUnits.entries()) {\r\n const [, schemaItemName] = SchemaItem.parseFullName(key);\r\n if (schemaItemName === \"ONE\" || value === 0) {\r\n fromBaseUnits.delete(key);\r\n }\r\n }\r\n\r\n for (const [key, value] of toBaseUnits.entries()) {\r\n const [, schemaItemName] = SchemaItem.parseFullName(key);\r\n if (schemaItemName === \"ONE\" || value === 0) {\r\n toBaseUnits.delete(key);\r\n }\r\n }\r\n\r\n if (fromBaseUnits.size !== toBaseUnits.size)\r\n return false;\r\n\r\n for (const key of fromBaseUnits.keys()) {\r\n if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {\r\n // Mismatching key or value\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"UnitConverter.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConverter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { BentleyError, BentleyStatus } from \"@itwin/core-bentley\";\nimport { SchemaContext } from \"../Context\";\nimport { Constant } from \"../Metadata/Constant\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaKey } from \"../SchemaKey\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { UnitGraph } from \"./UnitTree\";\n\n/**\n * Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units\n * @internal\n */\nexport class UnitConverter {\n private _uGraph: UnitGraph;\n\n /**\n * Create Converter context\n * @param _context SchemaContext with contexts added to it.\n */\n constructor(private readonly _context: SchemaContext) {\n this._uGraph = new UnitGraph(this._context);\n }\n\n /**\n * Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}\n * @param fromUnit SchemaItem full name of source unit\n * @param toUnit SchemaItem full name of target unit\n * @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset\n * @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext\n * @throws Error if from and to Units do not belong to the same phenomenon\n * @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas\n * @throws Error if base units of source and target unit do not match\n */\n public async calculateConversion(fromUnit: string, toUnit: string): Promise<UnitConversion> {\n const [fromSchemaName, fromSchemaItemName] = SchemaItem.parseFullName(fromUnit);\n const [toSchemaName, toSchemaItemName] = SchemaItem.parseFullName(toUnit);\n const fromSchemaKey = new SchemaKey(fromSchemaName);\n const toSchemaKey = new SchemaKey(toSchemaName);\n\n const fromSchema = await this._context.getSchema(fromSchemaKey);\n const toSchema = await this._context.getSchema(toSchemaKey);\n\n if (!fromSchema || !toSchema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find from's and/or to's schema\", () => {\n return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };\n });\n }\n\n const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);\n const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);\n\n return this.processUnits(from, to);\n }\n\n /**\n * @param from Source unit converted from\n * @param to Target unit converted to\n * @internal\n */\n private async processUnits(from: Unit | Constant, to: Unit | Constant): Promise<UnitConversion> {\n if (from.key.matches(to.key))\n return UnitConversion.identity;\n\n const areCompatible = await Unit.areCompatible(from as Unit, to as Unit);\n if (!areCompatible)\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {\n return { from, to };\n });\n\n // Add nodes and subsequent children to graph\n await this._uGraph.addUnit(from);\n await this._uGraph.addUnit(to);\n\n const fromBaseUnits = new Map<string, number>();\n const toBaseUnits = new Map<string, number>();\n // Calculate map of UnitConversions to get between from -> base\n const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);\n // Calculate map of UnitConversions to get between base -> to\n const toMapStore = this._uGraph.reduce(to, toBaseUnits);\n\n if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))\n throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {\n return { from, to };\n });\n\n // Final calculations to get singular UnitConversion between from -> to\n const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion.identity;\n const toMap = toMapStore.get(to.key.fullName) || UnitConversion.identity;\n const fromInverse = fromMap.inverse();\n return fromInverse.compose(toMap);\n }\n\n /**\n * Check if fromBaseUnits's base units and exponents matches toBaseUnits's\n * @param fromBaseUnits Map of base units for source unit\n * @param toBaseUnits Map of base units for target unit\n * @internal\n */\n private checkBaseUnitsMatch(fromBaseUnits: Map<string, number>, toBaseUnits: Map<string, number>): boolean {\n // Trim maps of \"One\" and value that equal zero as they do not affect the base units and calculations\n for (const [key, value] of fromBaseUnits.entries()) {\n const [, schemaItemName] = SchemaItem.parseFullName(key);\n if (schemaItemName === \"ONE\" || value === 0) {\n fromBaseUnits.delete(key);\n }\n }\n\n for (const [key, value] of toBaseUnits.entries()) {\n const [, schemaItemName] = SchemaItem.parseFullName(key);\n if (schemaItemName === \"ONE\" || value === 0) {\n toBaseUnits.delete(key);\n }\n }\n\n if (fromBaseUnits.size !== toBaseUnits.size)\n return false;\n\n for (const key of fromBaseUnits.keys()) {\n if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {\n // Mismatching key or value\n return false;\n }\n }\n\n return true;\n }\n}\n"]}
@@ -1,44 +1,44 @@
1
- import { SchemaContext } from "../Context";
2
- import { Constant } from "../Metadata/Constant";
3
- import { Schema } from "../Metadata/Schema";
4
- import { Unit } from "../Metadata/Unit";
5
- import { UnitConversion } from "./UnitConversion";
6
- import { Graph } from "./Graph";
7
- /** @internal */
8
- export declare class GraphUtils {
9
- /**
10
- * DFS traversal - Post order
11
- * @param _graph Graph to traverse
12
- * @param start Starting node
13
- * @param keyFrom Get key from label
14
- * @param op Reducing function
15
- * @param initial Initial label
16
- */
17
- static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T;
18
- }
19
- /** @internal */
20
- export declare class UnitGraph {
21
- private _context;
22
- private _graph;
23
- constructor(_context: SchemaContext);
24
- /**
25
- * Tries to find the unit/constant given by name in currentSchema
26
- * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}
27
- * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema
28
- */
29
- resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant>;
30
- /**
31
- * Adds unit and corresponding children to graph as well as edges between units
32
- * @param unit Current unit to be added to graph
33
- */
34
- addUnit(unit: Unit | Constant): Promise<void>;
35
- private isIdentity;
36
- /**
37
- * Reduce the tree to produce a single map
38
- * @param unit Unit to be processed
39
- * @param stopNodes The tree exploration should stop here
40
- */
41
- reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion>;
42
- private reducingFunction;
43
- }
1
+ import { SchemaContext } from "../Context";
2
+ import { Constant } from "../Metadata/Constant";
3
+ import { Schema } from "../Metadata/Schema";
4
+ import { Unit } from "../Metadata/Unit";
5
+ import { UnitConversion } from "./UnitConversion";
6
+ import { Graph } from "./Graph";
7
+ /** @internal */
8
+ export declare class GraphUtils {
9
+ /**
10
+ * DFS traversal - Post order
11
+ * @param _graph Graph to traverse
12
+ * @param start Starting node
13
+ * @param keyFrom Get key from label
14
+ * @param op Reducing function
15
+ * @param initial Initial label
16
+ */
17
+ static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T;
18
+ }
19
+ /** @internal */
20
+ export declare class UnitGraph {
21
+ private _context;
22
+ private _graph;
23
+ constructor(_context: SchemaContext);
24
+ /**
25
+ * Tries to find the unit/constant given by name in currentSchema
26
+ * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}
27
+ * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema
28
+ */
29
+ resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant>;
30
+ /**
31
+ * Adds unit and corresponding children to graph as well as edges between units
32
+ * @param unit Current unit to be added to graph
33
+ */
34
+ addUnit(unit: Unit | Constant): Promise<void>;
35
+ private isIdentity;
36
+ /**
37
+ * Reduce the tree to produce a single map
38
+ * @param unit Unit to be processed
39
+ * @param stopNodes The tree exploration should stop here
40
+ */
41
+ reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion>;
42
+ private reducingFunction;
43
+ }
44
44
  //# sourceMappingURL=UnitTree.d.ts.map