@itwin/ecschema-metadata 4.8.0-dev.9 → 4.9.0-dev.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.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/Constants.js.map +1 -1
- package/lib/cjs/DelayedPromise.js.map +1 -1
- package/lib/cjs/Deserialization/AbstractParser.js.map +1 -1
- package/lib/cjs/Deserialization/Helper.js.map +1 -1
- package/lib/cjs/Deserialization/JsonParser.js.map +1 -1
- package/lib/cjs/Deserialization/JsonProps.d.ts +4 -0
- package/lib/cjs/Deserialization/JsonProps.d.ts.map +1 -1
- package/lib/cjs/Deserialization/JsonProps.js.map +1 -1
- package/lib/cjs/Deserialization/SchemaGraphUtil.js.map +1 -1
- package/lib/cjs/Deserialization/XmlParser.js.map +1 -1
- package/lib/cjs/Deserialization/XmlSerializationUtils.js.map +1 -1
- package/lib/cjs/ECName.js.map +1 -1
- package/lib/cjs/ECObjects.js.map +1 -1
- package/lib/cjs/Exception.js.map +1 -1
- package/lib/cjs/Interfaces.js.map +1 -1
- package/lib/cjs/Metadata/Class.d.ts +0 -6
- package/lib/cjs/Metadata/Class.d.ts.map +1 -1
- package/lib/cjs/Metadata/Class.js +0 -8
- package/lib/cjs/Metadata/Class.js.map +1 -1
- package/lib/cjs/Metadata/Constant.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttribute.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.d.ts +7 -3
- package/lib/cjs/Metadata/CustomAttributeClass.d.ts.map +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.js +16 -10
- package/lib/cjs/Metadata/CustomAttributeClass.js.map +1 -1
- package/lib/cjs/Metadata/EntityClass.js.map +1 -1
- package/lib/cjs/Metadata/Enumeration.js.map +1 -1
- package/lib/cjs/Metadata/Format.js.map +1 -1
- package/lib/cjs/Metadata/InvertedUnit.js.map +1 -1
- package/lib/cjs/Metadata/KindOfQuantity.js.map +1 -1
- package/lib/cjs/Metadata/Mixin.js.map +1 -1
- package/lib/cjs/Metadata/OverrideFormat.d.ts.map +1 -1
- package/lib/cjs/Metadata/OverrideFormat.js +3 -1
- package/lib/cjs/Metadata/OverrideFormat.js.map +1 -1
- package/lib/cjs/Metadata/Phenomenon.js.map +1 -1
- package/lib/cjs/Metadata/Property.js.map +1 -1
- package/lib/cjs/Metadata/PropertyCategory.js.map +1 -1
- package/lib/cjs/Metadata/RelationshipClass.js.map +1 -1
- package/lib/cjs/Metadata/Schema.d.ts +14 -0
- package/lib/cjs/Metadata/Schema.d.ts.map +1 -1
- package/lib/cjs/Metadata/Schema.js +21 -0
- package/lib/cjs/Metadata/Schema.js.map +1 -1
- package/lib/cjs/Metadata/SchemaItem.d.ts +5 -0
- package/lib/cjs/Metadata/SchemaItem.d.ts.map +1 -1
- package/lib/cjs/Metadata/SchemaItem.js +7 -0
- package/lib/cjs/Metadata/SchemaItem.js.map +1 -1
- package/lib/cjs/Metadata/UnitSystem.js.map +1 -1
- package/lib/cjs/PropertyTypes.js.map +1 -1
- package/lib/cjs/SchemaJsonLocater.js.map +1 -1
- package/lib/cjs/SchemaKey.js.map +1 -1
- package/lib/cjs/SchemaLoader.js.map +1 -1
- package/lib/cjs/SchemaPartVisitorDelegate.js.map +1 -1
- package/lib/cjs/UnitConversion/Graph.js.map +1 -1
- package/lib/cjs/UnitConversion/Parser.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitConversion.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitConverter.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitTree.js.map +1 -1
- package/lib/cjs/UnitProvider/SchemaUnitProvider.js.map +1 -1
- package/lib/cjs/Validation/SchemaWalker.js.map +1 -1
- package/lib/cjs/ecschema-metadata.js.map +1 -1
- package/lib/cjs/utils/SchemaGraph.js.map +1 -1
- package/lib/esm/Constants.d.ts +24 -0
- package/lib/esm/Constants.d.ts.map +1 -0
- package/lib/esm/Constants.js +30 -0
- package/lib/esm/Constants.js.map +1 -0
- package/lib/esm/Context.d.ts +219 -0
- package/lib/esm/Context.d.ts.map +1 -0
- package/lib/esm/Context.js +321 -0
- package/lib/esm/Context.js.map +1 -0
- package/lib/esm/DelayedPromise.d.ts +89 -0
- package/lib/esm/DelayedPromise.d.ts.map +1 -0
- package/lib/esm/DelayedPromise.js +88 -0
- package/lib/esm/DelayedPromise.js.map +1 -0
- package/lib/esm/Deserialization/AbstractParser.d.ts +46 -0
- package/lib/esm/Deserialization/AbstractParser.d.ts.map +1 -0
- package/lib/esm/Deserialization/AbstractParser.js +8 -0
- package/lib/esm/Deserialization/AbstractParser.js.map +1 -0
- package/lib/esm/Deserialization/Helper.d.ts +263 -0
- package/lib/esm/Deserialization/Helper.d.ts.map +1 -0
- package/lib/esm/Deserialization/Helper.js +871 -0
- package/lib/esm/Deserialization/Helper.js.map +1 -0
- package/lib/esm/Deserialization/JsonParser.d.ts +166 -0
- package/lib/esm/Deserialization/JsonParser.d.ts.map +1 -0
- package/lib/esm/Deserialization/JsonParser.js +677 -0
- package/lib/esm/Deserialization/JsonParser.js.map +1 -0
- package/lib/esm/Deserialization/JsonProps.d.ts +273 -0
- package/lib/esm/Deserialization/JsonProps.d.ts.map +1 -0
- package/lib/esm/Deserialization/JsonProps.js +9 -0
- package/lib/esm/Deserialization/JsonProps.js.map +1 -0
- package/lib/esm/Deserialization/SchemaGraphUtil.d.ts +35 -0
- package/lib/esm/Deserialization/SchemaGraphUtil.d.ts.map +1 -0
- package/lib/esm/Deserialization/SchemaGraphUtil.js +74 -0
- package/lib/esm/Deserialization/SchemaGraphUtil.js.map +1 -0
- package/lib/esm/Deserialization/XmlParser.d.ts +86 -0
- package/lib/esm/Deserialization/XmlParser.d.ts.map +1 -0
- package/lib/esm/Deserialization/XmlParser.js +970 -0
- package/lib/esm/Deserialization/XmlParser.js.map +1 -0
- package/lib/esm/Deserialization/XmlSerializationUtils.d.ts +55 -0
- package/lib/esm/Deserialization/XmlSerializationUtils.d.ts.map +1 -0
- package/lib/esm/Deserialization/XmlSerializationUtils.js +172 -0
- package/lib/esm/Deserialization/XmlSerializationUtils.js.map +1 -0
- package/lib/esm/ECName.d.ts +31 -0
- package/lib/esm/ECName.d.ts.map +1 -0
- package/lib/esm/ECName.js +82 -0
- package/lib/esm/ECName.js.map +1 -0
- package/lib/esm/ECObjects.d.ts +166 -0
- package/lib/esm/ECObjects.d.ts.map +1 -0
- package/lib/esm/ECObjects.js +422 -0
- package/lib/esm/ECObjects.js.map +1 -0
- package/lib/esm/Exception.d.ts +45 -0
- package/lib/esm/Exception.d.ts.map +1 -0
- package/lib/esm/Exception.js +82 -0
- package/lib/esm/Exception.js.map +1 -0
- package/lib/esm/Interfaces.d.ts +79 -0
- package/lib/esm/Interfaces.d.ts.map +1 -0
- package/lib/esm/Interfaces.js +9 -0
- package/lib/esm/Interfaces.js.map +1 -0
- package/lib/esm/Metadata/Class.d.ts +245 -0
- package/lib/esm/Metadata/Class.d.ts.map +1 -0
- package/lib/esm/Metadata/Class.js +552 -0
- package/lib/esm/Metadata/Class.js.map +1 -0
- package/lib/esm/Metadata/Constant.d.ts +65 -0
- package/lib/esm/Metadata/Constant.d.ts.map +1 -0
- package/lib/esm/Metadata/Constant.js +119 -0
- package/lib/esm/Metadata/Constant.js.map +1 -0
- package/lib/esm/Metadata/CustomAttribute.d.ts +24 -0
- package/lib/esm/Metadata/CustomAttribute.d.ts.map +1 -0
- package/lib/esm/Metadata/CustomAttribute.js +24 -0
- package/lib/esm/Metadata/CustomAttribute.js.map +1 -0
- package/lib/esm/Metadata/CustomAttributeClass.d.ts +44 -0
- package/lib/esm/Metadata/CustomAttributeClass.d.ts.map +1 -0
- package/lib/esm/Metadata/CustomAttributeClass.js +70 -0
- package/lib/esm/Metadata/CustomAttributeClass.js.map +1 -0
- package/lib/esm/Metadata/EntityClass.d.ts +78 -0
- package/lib/esm/Metadata/EntityClass.d.ts.map +1 -0
- package/lib/esm/Metadata/EntityClass.js +224 -0
- package/lib/esm/Metadata/EntityClass.js.map +1 -0
- package/lib/esm/Metadata/Enumeration.d.ts +87 -0
- package/lib/esm/Metadata/Enumeration.d.ts.map +1 -0
- package/lib/esm/Metadata/Enumeration.js +155 -0
- package/lib/esm/Metadata/Enumeration.js.map +1 -0
- package/lib/esm/Metadata/Format.d.ts +99 -0
- package/lib/esm/Metadata/Format.d.ts.map +1 -0
- package/lib/esm/Metadata/Format.js +238 -0
- package/lib/esm/Metadata/Format.js.map +1 -0
- package/lib/esm/Metadata/InvertedUnit.d.ts +50 -0
- package/lib/esm/Metadata/InvertedUnit.d.ts.map +1 -0
- package/lib/esm/Metadata/InvertedUnit.js +93 -0
- package/lib/esm/Metadata/InvertedUnit.js.map +1 -0
- package/lib/esm/Metadata/KindOfQuantity.d.ts +72 -0
- package/lib/esm/Metadata/KindOfQuantity.d.ts.map +1 -0
- package/lib/esm/Metadata/KindOfQuantity.js +229 -0
- package/lib/esm/Metadata/KindOfQuantity.js.map +1 -0
- package/lib/esm/Metadata/Mixin.d.ts +55 -0
- package/lib/esm/Metadata/Mixin.d.ts.map +1 -0
- package/lib/esm/Metadata/Mixin.js +109 -0
- package/lib/esm/Metadata/Mixin.js.map +1 -0
- package/lib/esm/Metadata/OverrideFormat.d.ts +68 -0
- package/lib/esm/Metadata/OverrideFormat.d.ts.map +1 -0
- package/lib/esm/Metadata/OverrideFormat.js +124 -0
- package/lib/esm/Metadata/OverrideFormat.js.map +1 -0
- package/lib/esm/Metadata/Phenomenon.d.ts +34 -0
- package/lib/esm/Metadata/Phenomenon.d.ts.map +1 -0
- package/lib/esm/Metadata/Phenomenon.js +55 -0
- package/lib/esm/Metadata/Phenomenon.js.map +1 -0
- package/lib/esm/Metadata/Property.d.ts +247 -0
- package/lib/esm/Metadata/Property.d.ts.map +1 -0
- package/lib/esm/Metadata/Property.js +565 -0
- package/lib/esm/Metadata/Property.js.map +1 -0
- package/lib/esm/Metadata/PropertyCategory.d.ts +40 -0
- package/lib/esm/Metadata/PropertyCategory.d.ts.map +1 -0
- package/lib/esm/Metadata/PropertyCategory.js +57 -0
- package/lib/esm/Metadata/PropertyCategory.js.map +1 -0
- package/lib/esm/Metadata/RelationshipClass.d.ts +170 -0
- package/lib/esm/Metadata/RelationshipClass.d.ts.map +1 -0
- package/lib/esm/Metadata/RelationshipClass.js +380 -0
- package/lib/esm/Metadata/RelationshipClass.js.map +1 -0
- package/lib/esm/Metadata/Schema.d.ts +330 -0
- package/lib/esm/Metadata/Schema.d.ts.map +1 -0
- package/lib/esm/Metadata/Schema.js +570 -0
- package/lib/esm/Metadata/Schema.js.map +1 -0
- package/lib/esm/Metadata/SchemaItem.d.ts +67 -0
- package/lib/esm/Metadata/SchemaItem.d.ts.map +1 -0
- package/lib/esm/Metadata/SchemaItem.js +140 -0
- package/lib/esm/Metadata/SchemaItem.js.map +1 -0
- package/lib/esm/Metadata/Unit.d.ts +77 -0
- package/lib/esm/Metadata/Unit.d.ts.map +1 -0
- package/lib/esm/Metadata/Unit.js +158 -0
- package/lib/esm/Metadata/Unit.js.map +1 -0
- package/lib/esm/Metadata/UnitSystem.d.ts +21 -0
- package/lib/esm/Metadata/UnitSystem.d.ts.map +1 -0
- package/lib/esm/Metadata/UnitSystem.js +25 -0
- package/lib/esm/Metadata/UnitSystem.js.map +1 -0
- package/lib/esm/PropertyTypes.d.ts +50 -0
- package/lib/esm/PropertyTypes.d.ts.map +1 -0
- package/lib/esm/PropertyTypes.js +88 -0
- package/lib/esm/PropertyTypes.js.map +1 -0
- package/lib/esm/SchemaJsonLocater.d.ts +42 -0
- package/lib/esm/SchemaJsonLocater.d.ts.map +1 -0
- package/lib/esm/SchemaJsonLocater.js +54 -0
- package/lib/esm/SchemaJsonLocater.js.map +1 -0
- package/lib/esm/SchemaKey.d.ts +111 -0
- package/lib/esm/SchemaKey.d.ts.map +1 -0
- package/lib/esm/SchemaKey.js +214 -0
- package/lib/esm/SchemaKey.js.map +1 -0
- package/lib/esm/SchemaLoader.d.ts +32 -0
- package/lib/esm/SchemaLoader.d.ts.map +1 -0
- package/lib/esm/SchemaLoader.js +53 -0
- package/lib/esm/SchemaLoader.js.map +1 -0
- package/lib/esm/SchemaPartVisitorDelegate.d.ts +275 -0
- package/lib/esm/SchemaPartVisitorDelegate.d.ts.map +1 -0
- package/lib/esm/SchemaPartVisitorDelegate.js +209 -0
- package/lib/esm/SchemaPartVisitorDelegate.js.map +1 -0
- package/lib/esm/UnitConversion/Graph.d.ts +35 -0
- package/lib/esm/UnitConversion/Graph.d.ts.map +1 -0
- package/lib/esm/UnitConversion/Graph.js +80 -0
- package/lib/esm/UnitConversion/Graph.js.map +1 -0
- package/lib/esm/UnitConversion/Parser.d.ts +9 -0
- package/lib/esm/UnitConversion/Parser.d.ts.map +1 -0
- package/lib/esm/UnitConversion/Parser.js +39 -0
- package/lib/esm/UnitConversion/Parser.js.map +1 -0
- package/lib/esm/UnitConversion/UnitConversion.d.ts +46 -0
- package/lib/esm/UnitConversion/UnitConversion.d.ts.map +1 -0
- package/lib/esm/UnitConversion/UnitConversion.js +74 -0
- package/lib/esm/UnitConversion/UnitConversion.js.map +1 -0
- package/lib/esm/UnitConversion/UnitConverter.d.ts +40 -0
- package/lib/esm/UnitConversion/UnitConverter.d.ts.map +1 -0
- package/lib/esm/UnitConversion/UnitConverter.js +113 -0
- package/lib/esm/UnitConversion/UnitConverter.js.map +1 -0
- package/lib/esm/UnitConversion/UnitTree.d.ts +44 -0
- package/lib/esm/UnitConversion/UnitTree.d.ts.map +1 -0
- package/lib/esm/UnitConversion/UnitTree.js +165 -0
- package/lib/esm/UnitConversion/UnitTree.js.map +1 -0
- package/lib/esm/UnitProvider/SchemaUnitProvider.d.ts +78 -0
- package/lib/esm/UnitProvider/SchemaUnitProvider.d.ts.map +1 -0
- package/lib/esm/UnitProvider/SchemaUnitProvider.js +231 -0
- package/lib/esm/UnitProvider/SchemaUnitProvider.js.map +1 -0
- package/lib/esm/Validation/SchemaWalker.d.ts +24 -0
- package/lib/esm/Validation/SchemaWalker.d.ts.map +1 -0
- package/lib/esm/Validation/SchemaWalker.js +50 -0
- package/lib/esm/Validation/SchemaWalker.js.map +1 -0
- package/lib/esm/ecschema-metadata.d.ts +52 -0
- package/lib/esm/ecschema-metadata.d.ts.map +1 -0
- package/lib/esm/ecschema-metadata.js +55 -0
- package/lib/esm/ecschema-metadata.js.map +1 -0
- package/lib/esm/utils/SchemaGraph.d.ts +44 -0
- package/lib/esm/utils/SchemaGraph.d.ts.map +1 -0
- package/lib/esm/utils/SchemaGraph.js +111 -0
- package/lib/esm/utils/SchemaGraph.js.map +1 -0
- package/package.json +9 -7
|
@@ -0,0 +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
|
+
}
|
|
40
|
+
//# sourceMappingURL=UnitConverter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnitConverter.d.ts","sourceRoot":"","sources":["../../../src/UnitConversion/UnitConverter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;GAGG;AACH,qBAAa,aAAa;IAOZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;IANrC,OAAO,CAAC,OAAO,CAAY;IAE3B;;;OAGG;gBAC0B,QAAQ,EAAE,aAAa;IAIpD;;;;;;;;;OASG;IACU,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAqB3F;;;;OAIG;YACW,YAAY;IAiC1B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CA4B5B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { BentleyError, BentleyStatus } from "@itwin/core-bentley";
|
|
6
|
+
import { SchemaItem } from "../Metadata/SchemaItem";
|
|
7
|
+
import { Unit } from "../Metadata/Unit";
|
|
8
|
+
import { SchemaKey } from "../SchemaKey";
|
|
9
|
+
import { UnitConversion } from "./UnitConversion";
|
|
10
|
+
import { UnitGraph } from "./UnitTree";
|
|
11
|
+
/**
|
|
12
|
+
* Class constructed with SchemaContext and used to calculate [[UnitConversion]] between Units
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export class UnitConverter {
|
|
16
|
+
/**
|
|
17
|
+
* Create Converter context
|
|
18
|
+
* @param _context SchemaContext with contexts added to it.
|
|
19
|
+
*/
|
|
20
|
+
constructor(_context) {
|
|
21
|
+
this._context = _context;
|
|
22
|
+
this._uGraph = new UnitGraph(this._context);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find conversion between from and to units, formatted {schemaName}.{schemaItemName} or {schemaName}:{schemaItemName}
|
|
26
|
+
* @param fromUnit SchemaItem full name of source unit
|
|
27
|
+
* @param toUnit SchemaItem full name of target unit
|
|
28
|
+
* @returns [[UnitConversion]] converting fromUnit -> toUnit with a factor and an offset
|
|
29
|
+
* @throws Error if from and to Units' SchemaItem is not found in Schema or Schema prefix is not found in SchemaContext
|
|
30
|
+
* @throws Error if from and to Units do not belong to the same phenomenon
|
|
31
|
+
* @throws Error if definitions' SchemaItems cannot be found in its own or referenced Schemas
|
|
32
|
+
* @throws Error if base units of source and target unit do not match
|
|
33
|
+
*/
|
|
34
|
+
async calculateConversion(fromUnit, toUnit) {
|
|
35
|
+
const [fromSchemaName, fromSchemaItemName] = SchemaItem.parseFullName(fromUnit);
|
|
36
|
+
const [toSchemaName, toSchemaItemName] = SchemaItem.parseFullName(toUnit);
|
|
37
|
+
const fromSchemaKey = new SchemaKey(fromSchemaName);
|
|
38
|
+
const toSchemaKey = new SchemaKey(toSchemaName);
|
|
39
|
+
const fromSchema = await this._context.getSchema(fromSchemaKey);
|
|
40
|
+
const toSchema = await this._context.getSchema(toSchemaKey);
|
|
41
|
+
if (!fromSchema || !toSchema) {
|
|
42
|
+
throw new BentleyError(BentleyStatus.ERROR, "Cannot find from's and/or to's schema", () => {
|
|
43
|
+
return { from: fromUnit, fromSchema: fromSchemaName, to: toUnit, toSchema: toSchemaName };
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const from = await this._uGraph.resolveUnit(fromSchemaItemName, fromSchema);
|
|
47
|
+
const to = await this._uGraph.resolveUnit(toSchemaItemName, toSchema);
|
|
48
|
+
return this.processUnits(from, to);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @param from Source unit converted from
|
|
52
|
+
* @param to Target unit converted to
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
async processUnits(from, to) {
|
|
56
|
+
if (from.key.matches(to.key))
|
|
57
|
+
return UnitConversion.identity;
|
|
58
|
+
const areCompatible = await Unit.areCompatible(from, to);
|
|
59
|
+
if (!areCompatible)
|
|
60
|
+
throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not belong to same phenomenon`, () => {
|
|
61
|
+
return { from, to };
|
|
62
|
+
});
|
|
63
|
+
// Add nodes and subsequent children to graph
|
|
64
|
+
await this._uGraph.addUnit(from);
|
|
65
|
+
await this._uGraph.addUnit(to);
|
|
66
|
+
const fromBaseUnits = new Map();
|
|
67
|
+
const toBaseUnits = new Map();
|
|
68
|
+
// Calculate map of UnitConversions to get between from -> base
|
|
69
|
+
const fromMapStore = this._uGraph.reduce(from, fromBaseUnits);
|
|
70
|
+
// Calculate map of UnitConversions to get between base -> to
|
|
71
|
+
const toMapStore = this._uGraph.reduce(to, toBaseUnits);
|
|
72
|
+
if (!this.checkBaseUnitsMatch(fromBaseUnits, toBaseUnits))
|
|
73
|
+
throw new BentleyError(BentleyStatus.ERROR, `Source and target units do not have matching base units`, () => {
|
|
74
|
+
return { from, to };
|
|
75
|
+
});
|
|
76
|
+
// Final calculations to get singular UnitConversion between from -> to
|
|
77
|
+
const fromMap = fromMapStore.get(from.key.fullName) || UnitConversion.identity;
|
|
78
|
+
const toMap = toMapStore.get(to.key.fullName) || UnitConversion.identity;
|
|
79
|
+
const fromInverse = fromMap.inverse();
|
|
80
|
+
return fromInverse.compose(toMap);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if fromBaseUnits's base units and exponents matches toBaseUnits's
|
|
84
|
+
* @param fromBaseUnits Map of base units for source unit
|
|
85
|
+
* @param toBaseUnits Map of base units for target unit
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
checkBaseUnitsMatch(fromBaseUnits, toBaseUnits) {
|
|
89
|
+
// Trim maps of "One" and value that equal zero as they do not affect the base units and calculations
|
|
90
|
+
for (const [key, value] of fromBaseUnits.entries()) {
|
|
91
|
+
const [, schemaItemName] = SchemaItem.parseFullName(key);
|
|
92
|
+
if (schemaItemName === "ONE" || value === 0) {
|
|
93
|
+
fromBaseUnits.delete(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const [key, value] of toBaseUnits.entries()) {
|
|
97
|
+
const [, schemaItemName] = SchemaItem.parseFullName(key);
|
|
98
|
+
if (schemaItemName === "ONE" || value === 0) {
|
|
99
|
+
toBaseUnits.delete(key);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (fromBaseUnits.size !== toBaseUnits.size)
|
|
103
|
+
return false;
|
|
104
|
+
for (const key of fromBaseUnits.keys()) {
|
|
105
|
+
if (!toBaseUnits.has(key) || fromBaseUnits.get(key) !== toBaseUnits.get(key)) {
|
|
106
|
+
// Mismatching key or value
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=UnitConverter.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +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
|
+
}
|
|
44
|
+
//# sourceMappingURL=UnitTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnitTree.d.ts","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,gBAAgB;AAChB,qBAAa,UAAU;IACrB;;;;;;;OAOG;WACW,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,mBAAmB,EAAE,MAAM,GAAG,CAAC;CAuBhM;AAED,gBAAgB;AAChB,qBAAa,SAAS;IAGR,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,MAAM,CAAgC;gBAE1B,QAAQ,EAAE,aAAa;IAI3C;;;;OAIG;IACU,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;IAqDvF;;;OAGG;IACU,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B1D,OAAO,CAAC,UAAU;IAIlB;;;;OAIG;IACI,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAOpG,OAAO,CAAC,gBAAgB;CAmBzB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { BentleyError, BentleyStatus } from "@itwin/core-bentley";
|
|
6
|
+
import { SchemaItem } from "../Metadata/SchemaItem";
|
|
7
|
+
import { SchemaItemKey, SchemaKey } from "../SchemaKey";
|
|
8
|
+
import { SchemaItemType } from "../ECObjects";
|
|
9
|
+
import { UnitConversion } from "./UnitConversion";
|
|
10
|
+
import { parseDefinition } from "./Parser";
|
|
11
|
+
import { Graph } from "./Graph";
|
|
12
|
+
/** @internal */
|
|
13
|
+
export class GraphUtils {
|
|
14
|
+
/**
|
|
15
|
+
* DFS traversal - Post order
|
|
16
|
+
* @param _graph Graph to traverse
|
|
17
|
+
* @param start Starting node
|
|
18
|
+
* @param keyFrom Get key from label
|
|
19
|
+
* @param op Reducing function
|
|
20
|
+
* @param initial Initial label
|
|
21
|
+
*/
|
|
22
|
+
static dfsReduce(_graph, key, op, initial, baseUnitsMap, accumulatedExponent) {
|
|
23
|
+
const outEdges = _graph.outEdges(key);
|
|
24
|
+
let t = initial;
|
|
25
|
+
if (outEdges.length > 0) {
|
|
26
|
+
t = outEdges.reduce((p, edge) => {
|
|
27
|
+
const { v, w } = edge;
|
|
28
|
+
const edgeExponent = _graph.edge(v, w).exponent;
|
|
29
|
+
return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);
|
|
30
|
+
}, t);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if (baseUnitsMap.has(key)) {
|
|
34
|
+
const oldExponent = baseUnitsMap.get(key);
|
|
35
|
+
baseUnitsMap.set(key, oldExponent + accumulatedExponent);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
baseUnitsMap.set(key, accumulatedExponent);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return op(t, key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** @internal */
|
|
45
|
+
export class UnitGraph {
|
|
46
|
+
constructor(_context) {
|
|
47
|
+
this._context = _context;
|
|
48
|
+
this._graph = new Graph();
|
|
49
|
+
this._graph.setGraph("Unit tree processor");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Tries to find the unit/constant given by name in currentSchema
|
|
53
|
+
* @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}
|
|
54
|
+
* @param currentSchema schema to find name in; name could also be in a referenced schema of current schema
|
|
55
|
+
*/
|
|
56
|
+
async resolveUnit(name, currentSchema) {
|
|
57
|
+
let [schemaName] = SchemaItem.parseFullName(name);
|
|
58
|
+
const [, schemaItemName] = SchemaItem.parseFullName(name);
|
|
59
|
+
if (schemaName !== "") {
|
|
60
|
+
// Check if schemaName is schemaName or alias
|
|
61
|
+
const ref = currentSchema.getReferenceSync(schemaName);
|
|
62
|
+
const refName = currentSchema.getReferenceNameByAlias(schemaName);
|
|
63
|
+
if (ref) {
|
|
64
|
+
// Got schema by schemaName
|
|
65
|
+
schemaName = ref.name;
|
|
66
|
+
}
|
|
67
|
+
else if (refName) {
|
|
68
|
+
// Got schema by alias
|
|
69
|
+
schemaName = refName;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Didn't match any referenced schema, check if it is current schemaName or alias
|
|
73
|
+
if (schemaName === currentSchema.name || schemaName === currentSchema.alias)
|
|
74
|
+
schemaName = currentSchema.name;
|
|
75
|
+
}
|
|
76
|
+
// Create schema key with schema name
|
|
77
|
+
const schemaKey = new SchemaKey(schemaName);
|
|
78
|
+
// Get schema with schema key
|
|
79
|
+
const schema = await this._context.getSchema(schemaKey);
|
|
80
|
+
if (!schema) {
|
|
81
|
+
throw new BentleyError(BentleyStatus.ERROR, "Cannot find schema", () => {
|
|
82
|
+
return { schema: schemaName };
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Set currentSchema to look up schemaItem to be whatever is prefixed in name
|
|
87
|
+
currentSchema = schema;
|
|
88
|
+
}
|
|
89
|
+
// Update name to not have prefix
|
|
90
|
+
name = schemaItemName;
|
|
91
|
+
}
|
|
92
|
+
// Create schema item key with name and schema
|
|
93
|
+
const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);
|
|
94
|
+
// Get schema item with schema item key
|
|
95
|
+
const item = await this._context.getSchemaItem(itemKey);
|
|
96
|
+
if (!item)
|
|
97
|
+
throw new BentleyError(BentleyStatus.ERROR, "Cannot find schema item", () => {
|
|
98
|
+
return { item: name };
|
|
99
|
+
});
|
|
100
|
+
if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)
|
|
101
|
+
return item;
|
|
102
|
+
throw new BentleyError(BentleyStatus.ERROR, "Item is neither a unit or a constant", () => {
|
|
103
|
+
return { itemType: item.key.fullName };
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Adds unit and corresponding children to graph as well as edges between units
|
|
108
|
+
* @param unit Current unit to be added to graph
|
|
109
|
+
*/
|
|
110
|
+
async addUnit(unit) {
|
|
111
|
+
if (this._graph.hasNode(unit.key.fullName))
|
|
112
|
+
return;
|
|
113
|
+
this._graph.setNode(unit.key.fullName, unit);
|
|
114
|
+
if (this.isIdentity(unit))
|
|
115
|
+
return;
|
|
116
|
+
const umap = parseDefinition(unit.definition);
|
|
117
|
+
const promiseArray = [];
|
|
118
|
+
for (const [key, value] of umap) {
|
|
119
|
+
promiseArray.push(this.resolveUnit(key, unit.schema).then((u) => [u, value]));
|
|
120
|
+
}
|
|
121
|
+
const resolved = await Promise.all(promiseArray);
|
|
122
|
+
const children = resolved.map(async ([u, def]) => {
|
|
123
|
+
await this.addUnit(u);
|
|
124
|
+
this._graph.setEdge(unit.key.fullName, u.key.fullName, {
|
|
125
|
+
exponent: def.exponent,
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
await Promise.all(children);
|
|
129
|
+
}
|
|
130
|
+
isIdentity(unit) {
|
|
131
|
+
return unit.definition === unit.name;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Reduce the tree to produce a single map
|
|
135
|
+
* @param unit Unit to be processed
|
|
136
|
+
* @param stopNodes The tree exploration should stop here
|
|
137
|
+
*/
|
|
138
|
+
reduce(unit, baseUnitsMap) {
|
|
139
|
+
const unitFullName = unit.key.fullName;
|
|
140
|
+
const innerMapStore = new Map();
|
|
141
|
+
const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);
|
|
142
|
+
return outerMapStore;
|
|
143
|
+
}
|
|
144
|
+
reducingFunction(innermapStore, unitFullName) {
|
|
145
|
+
const outEdges = this._graph.outEdges(unitFullName);
|
|
146
|
+
if (outEdges) {
|
|
147
|
+
const cmap = outEdges.reduce((pm, e) => {
|
|
148
|
+
const { exponent } = this._graph.edge(e.v, e.w);
|
|
149
|
+
const stored = innermapStore.get(e.w);
|
|
150
|
+
const map = stored ? stored : UnitConversion.identity;
|
|
151
|
+
const emap = map.raise(exponent);
|
|
152
|
+
return pm ? pm.multiply(emap) : emap;
|
|
153
|
+
}, undefined);
|
|
154
|
+
const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;
|
|
155
|
+
const other = cmap || UnitConversion.identity;
|
|
156
|
+
const result = other.compose(thisMap);
|
|
157
|
+
innermapStore.set(unitFullName, result);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
innermapStore.set(unitFullName, UnitConversion.identity);
|
|
161
|
+
}
|
|
162
|
+
return innermapStore;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=UnitTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { Unit } from \"../Metadata/Unit\";\r\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\nimport { UnitConversion } from \"./UnitConversion\";\r\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\r\nimport { Graph } from \"./Graph\";\r\n\r\n/** @internal */\r\nexport class GraphUtils {\r\n /**\r\n * DFS traversal - Post order\r\n * @param _graph Graph to traverse\r\n * @param start Starting node\r\n * @param keyFrom Get key from label\r\n * @param op Reducing function\r\n * @param initial Initial label\r\n */\r\n public static dfsReduce<T>(_graph: Graph<Unit | Constant>, key: string, op: (previous: T, current: string) => T, initial: T, baseUnitsMap: Map<string, number>, accumulatedExponent: number): T {\r\n const outEdges = _graph.outEdges(key);\r\n let t = initial;\r\n if (outEdges.length > 0) {\r\n t = outEdges.reduce<T>(\r\n (p, edge) => {\r\n const { v, w } = edge;\r\n const edgeExponent = _graph.edge(v, w).exponent;\r\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\r\n },\r\n t,\r\n );\r\n } else {\r\n if (baseUnitsMap.has(key)) {\r\n const oldExponent = baseUnitsMap.get(key)!;\r\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\r\n } else {\r\n baseUnitsMap.set(key, accumulatedExponent);\r\n }\r\n }\r\n\r\n return op(t, key);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class UnitGraph {\r\n private _graph = new Graph<Unit | Constant>();\r\n\r\n constructor(private _context: SchemaContext) {\r\n this._graph.setGraph(\"Unit tree processor\");\r\n }\r\n\r\n /**\r\n * Tries to find the unit/constant given by name in currentSchema\r\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\r\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\r\n */\r\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\r\n let [schemaName] = SchemaItem.parseFullName(name);\r\n const [, schemaItemName] = SchemaItem.parseFullName(name);\r\n\r\n if (schemaName !== \"\") {\r\n // Check if schemaName is schemaName or alias\r\n const ref = currentSchema.getReferenceSync(schemaName);\r\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\r\n if (ref) {\r\n // Got schema by schemaName\r\n schemaName = ref.name;\r\n } else if (refName) {\r\n // Got schema by alias\r\n schemaName = refName;\r\n } else {\r\n // Didn't match any referenced schema, check if it is current schemaName or alias\r\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\r\n schemaName = currentSchema.name;\r\n }\r\n\r\n // Create schema key with schema name\r\n const schemaKey = new SchemaKey(schemaName);\r\n // Get schema with schema key\r\n const schema = await this._context.getSchema(schemaKey);\r\n if (!schema) {\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\r\n return { schema: schemaName };\r\n });\r\n } else {\r\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\r\n currentSchema = schema;\r\n }\r\n // Update name to not have prefix\r\n name = schemaItemName;\r\n }\r\n\r\n // Create schema item key with name and schema\r\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\r\n // Get schema item with schema item key\r\n const item = await this._context.getSchemaItem(itemKey);\r\n if (!item)\r\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\r\n return { item: name };\r\n });\r\n\r\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\r\n return item as Unit | Constant;\r\n\r\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\r\n return { itemType: item.key.fullName };\r\n });\r\n }\r\n\r\n /**\r\n * Adds unit and corresponding children to graph as well as edges between units\r\n * @param unit Current unit to be added to graph\r\n */\r\n public async addUnit(unit: Unit | Constant): Promise<void> {\r\n if (this._graph.hasNode(unit.key.fullName))\r\n return;\r\n\r\n this._graph.setNode(unit.key.fullName, unit);\r\n if (this.isIdentity(unit))\r\n return;\r\n\r\n const umap = parseDefinition(unit.definition);\r\n\r\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\r\n for (const [key, value] of umap) {\r\n promiseArray.push(\r\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\r\n );\r\n }\r\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\r\n promiseArray,\r\n );\r\n\r\n const children = resolved.map(async ([u, def]) => {\r\n await this.addUnit(u);\r\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\r\n exponent: def.exponent,\r\n });\r\n });\r\n\r\n await Promise.all(children);\r\n }\r\n\r\n private isIdentity(unit: Unit | Constant) {\r\n return unit.definition === unit.name;\r\n }\r\n\r\n /**\r\n * Reduce the tree to produce a single map\r\n * @param unit Unit to be processed\r\n * @param stopNodes The tree exploration should stop here\r\n */\r\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\r\n const unitFullName = unit.key.fullName;\r\n const innerMapStore = new Map<string, UnitConversion>();\r\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\r\n return outerMapStore;\r\n }\r\n\r\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\r\n const outEdges = this._graph.outEdges(unitFullName);\r\n if (outEdges) {\r\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\r\n const { exponent } = this._graph.edge(e.v, e.w);\r\n const stored = innermapStore.get(e.w);\r\n const map = stored ? stored : UnitConversion.identity;\r\n const emap = map.raise(exponent);\r\n return pm ? pm.multiply(emap) : emap;\r\n }, undefined);\r\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\r\n const other = cmap || UnitConversion.identity;\r\n const result = other.compose(thisMap);\r\n innermapStore.set(unitFullName, result);\r\n } else {\r\n innermapStore.set(unitFullName, UnitConversion.identity);\r\n }\r\n return innermapStore;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { UnitConversionProps, UnitExtraData, UnitProps, UnitsProvider } from "@itwin/core-quantity";
|
|
2
|
+
import { ISchemaLocater } from "../Context";
|
|
3
|
+
/**
|
|
4
|
+
* Class used to find Units in SchemaContext by attributes such as Phenomenon and DisplayLabel.
|
|
5
|
+
* @beta
|
|
6
|
+
*/
|
|
7
|
+
export declare class SchemaUnitProvider implements UnitsProvider {
|
|
8
|
+
private _unitExtraData;
|
|
9
|
+
private _unitConverter;
|
|
10
|
+
private _context;
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param contextOrLocater The SchemaContext or a different ISchemaLocater implementation used to retrieve the schema. The SchemaContext
|
|
14
|
+
* class implements the ISchemaLocater interface. If the provided locater is not a SchemaContext instance a new SchemaContext will be
|
|
15
|
+
* created and the locater will be added.
|
|
16
|
+
* @param _unitExtraData Additional data like alternate display label not found in Units Schema to match with Units; Defaults to empty array.
|
|
17
|
+
*/
|
|
18
|
+
constructor(contextOrLocater: ISchemaLocater, _unitExtraData?: UnitExtraData[]);
|
|
19
|
+
/**
|
|
20
|
+
* Find unit in a schema that has unitName.
|
|
21
|
+
* @param unitName Full name of unit.
|
|
22
|
+
* @returns UnitProps interface from @itwin/core-quantity whose name matches unitName.
|
|
23
|
+
*/
|
|
24
|
+
findUnitByName(unitName: string): Promise<UnitProps>;
|
|
25
|
+
/**
|
|
26
|
+
* Find all units in context that belongs to given phenomenon.
|
|
27
|
+
* @param phenomenon Full name of phenomenon.
|
|
28
|
+
* @returns Array of UnitProps (from @itwin/core-quantity) interface objects whose name matches phenomenon param.
|
|
29
|
+
*/
|
|
30
|
+
getUnitsByFamily(phenomenon: string): Promise<Array<UnitProps>>;
|
|
31
|
+
/**
|
|
32
|
+
* Find alternate display labels associated with unitName, if any.
|
|
33
|
+
* @param unitName Full name of Unit.
|
|
34
|
+
*/
|
|
35
|
+
getAlternateDisplayLabels(unitName: string): Array<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Finds Unit by unitLabel, which could be a display label in the schema or alternate an display label defined in
|
|
38
|
+
* this._unitExtraData. If there are duplicates of the same display label in the context or teh same alternate display
|
|
39
|
+
* labels, specify schemaName, phenomenon, or unitSystem to get a specific unit.
|
|
40
|
+
*
|
|
41
|
+
* @param unitLabel Display label or alternate display label to query unit by.
|
|
42
|
+
* @param schemaName Ensure Unit with unitLabel belongs to Schema with schemaName.
|
|
43
|
+
* @param phenomenon Full name of phenomenon that Unit belongs to.
|
|
44
|
+
* @param unitSystem Full name of unitSystem that Unit belongs to.
|
|
45
|
+
* @returns The UnitProps interface from the @itwin/core-quantity package.
|
|
46
|
+
*/
|
|
47
|
+
findUnit(unitLabel: string, schemaName?: string, phenomenon?: string, unitSystem?: string): Promise<UnitProps>;
|
|
48
|
+
/**
|
|
49
|
+
* Gets the @itwin/core-quantity UnitConversionProps for the given fromUnit and toUnit.
|
|
50
|
+
* @param fromUnit The UnitProps of the 'from' unit.
|
|
51
|
+
* @param toUnit The UnitProps of the 'to' unit.
|
|
52
|
+
* @returns The UnitConversionProps interface from the @itwin/core-quantity package.
|
|
53
|
+
*/
|
|
54
|
+
getConversion(fromUnit: UnitProps, toUnit: UnitProps): Promise<UnitConversionProps>;
|
|
55
|
+
/**
|
|
56
|
+
* Find unit in a schema that has unitName.
|
|
57
|
+
* @param unitName Full name of unit.
|
|
58
|
+
* @returns Unit whose full name matches unitName.
|
|
59
|
+
*/
|
|
60
|
+
private findECUnitByName;
|
|
61
|
+
/**
|
|
62
|
+
* Gets the @itwin/core UnitProps for the given Unit.
|
|
63
|
+
* @param unit The Unit to convert.
|
|
64
|
+
* @returns UnitProps interface from @itwin/core.
|
|
65
|
+
*/
|
|
66
|
+
private getUnitsProps;
|
|
67
|
+
/**
|
|
68
|
+
* Finds Unit by displayLabel and that it belongs to schemaName, phenomenon, and unitSystem if defined.
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
private findUnitByDisplayLabel;
|
|
72
|
+
/**
|
|
73
|
+
* Finds Unit by altDisplayLabel and that it belongs to schemaName, phenomenon, and unitSystem if defined.
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
private findUnitByAltDisplayLabel;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=SchemaUnitProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaUnitProvider.d.ts","sourceRoot":"","sources":["../../../src/UnitProvider/SchemaUnitProvider.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAO3D;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IAWR,OAAO,CAAC,cAAc;IAVpE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAgB;IAEhC;;;;;;OAMG;gBACS,gBAAgB,EAAE,cAAc,EAAU,cAAc,GAAE,aAAa,EAAO;IAU1F;;;;OAIG;IACU,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAKjE;;;;OAIG;IACU,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IA0C5E;;;OAGG;IACI,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAWjE;;;;;;;;;;OAUG;IACU,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAuB3H;;;;;OAKG;IACU,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQhG;;;;OAIG;YACW,gBAAgB;IA2B9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAUrB;;;OAGG;YACW,sBAAsB;IAoBpC;;;OAGG;YACW,yBAAyB;CAoBxC"}
|