@itwin/ecschema-metadata 5.0.0-dev.52 → 5.0.0-dev.54

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.
@@ -20,6 +20,7 @@ export declare class GraphUtils {
20
20
  export declare class UnitGraph {
21
21
  private _context;
22
22
  private _graph;
23
+ private _unitsInProgress;
23
24
  constructor(_context: SchemaContext);
24
25
  /**
25
26
  * Tries to find the unit/constant given by name in currentSchema
@@ -32,6 +33,7 @@ export declare class UnitGraph {
32
33
  * @param unit Current unit to be added to graph
33
34
  */
34
35
  addUnit(unit: Unit | Constant): Promise<void>;
36
+ private addUnitToGraph;
35
37
  private isIdentity;
36
38
  /**
37
39
  * Reduce the tree to produce a single map
@@ -1 +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"}
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;IAIR,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,gBAAgB,CAAoC;gBAExC,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;YAkB5C,cAAc;IAuB5B,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"}
@@ -50,6 +50,7 @@ class UnitGraph {
50
50
  constructor(_context) {
51
51
  this._context = _context;
52
52
  this._graph = new Graph_1.Graph();
53
+ this._unitsInProgress = new Map();
53
54
  this._graph.setGraph("Unit tree processor");
54
55
  }
55
56
  /**
@@ -112,11 +113,19 @@ class UnitGraph {
112
113
  * @param unit Current unit to be added to graph
113
114
  */
114
115
  async addUnit(unit) {
116
+ if (this._unitsInProgress.has(unit.key.fullName))
117
+ return this._unitsInProgress.get(unit.key.fullName);
115
118
  if (this._graph.hasNode(unit.key.fullName))
116
119
  return;
117
120
  this._graph.setNode(unit.key.fullName, unit);
118
121
  if (this.isIdentity(unit))
119
122
  return;
123
+ const promise = this.addUnitToGraph(unit);
124
+ this._unitsInProgress.set(unit.key.fullName, promise);
125
+ await promise
126
+ .finally(() => this._unitsInProgress.delete(unit.key.fullName));
127
+ }
128
+ async addUnitToGraph(unit) {
120
129
  const umap = (0, Parser_1.parseDefinition)(unit.definition);
121
130
  const promiseArray = [];
122
131
  for (const [key, value] of umap) {
@@ -1 +1 @@
1
- {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\nimport { SchemaItemType } from \"../ECObjects\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\nimport { Graph } from \"./Graph\";\n\n/** @internal */\nexport class GraphUtils {\n /**\n * DFS traversal - Post order\n * @param _graph Graph to traverse\n * @param start Starting node\n * @param keyFrom Get key from label\n * @param op Reducing function\n * @param initial Initial label\n */\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 {\n const outEdges = _graph.outEdges(key);\n let t = initial;\n if (outEdges.length > 0) {\n t = outEdges.reduce<T>(\n (p, edge) => {\n const { v, w } = edge;\n const edgeExponent = _graph.edge(v, w).exponent;\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\n },\n t,\n );\n } else {\n if (baseUnitsMap.has(key)) {\n const oldExponent = baseUnitsMap.get(key)!;\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\n } else {\n baseUnitsMap.set(key, accumulatedExponent);\n }\n }\n\n return op(t, key);\n }\n}\n\n/** @internal */\nexport class UnitGraph {\n private _graph = new Graph<Unit | Constant>();\n\n constructor(private _context: SchemaContext) {\n this._graph.setGraph(\"Unit tree processor\");\n }\n\n /**\n * Tries to find the unit/constant given by name in currentSchema\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\n */\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\n let [schemaName] = SchemaItem.parseFullName(name);\n const [, schemaItemName] = SchemaItem.parseFullName(name);\n\n if (schemaName !== \"\") {\n // Check if schemaName is schemaName or alias\n const ref = currentSchema.getReferenceSync(schemaName);\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\n if (ref) {\n // Got schema by schemaName\n schemaName = ref.name;\n } else if (refName) {\n // Got schema by alias\n schemaName = refName;\n } else {\n // Didn't match any referenced schema, check if it is current schemaName or alias\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\n schemaName = currentSchema.name;\n }\n\n // Create schema key with schema name\n const schemaKey = new SchemaKey(schemaName);\n // Get schema with schema key\n const schema = await this._context.getSchema(schemaKey);\n if (!schema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\n return { schema: schemaName };\n });\n } else {\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\n currentSchema = schema;\n }\n // Update name to not have prefix\n name = schemaItemName;\n }\n\n // Create schema item key with name and schema\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\n // Get schema item with schema item key\n const item = await this._context.getSchemaItem(itemKey);\n if (!item)\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\n return { item: name };\n });\n\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\n return item as Unit | Constant;\n\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\n return { itemType: item.key.fullName };\n });\n }\n\n /**\n * Adds unit and corresponding children to graph as well as edges between units\n * @param unit Current unit to be added to graph\n */\n public async addUnit(unit: Unit | Constant): Promise<void> {\n if (this._graph.hasNode(unit.key.fullName))\n return;\n\n this._graph.setNode(unit.key.fullName, unit);\n if (this.isIdentity(unit))\n return;\n\n const umap = parseDefinition(unit.definition);\n\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\n for (const [key, value] of umap) {\n promiseArray.push(\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\n );\n }\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\n promiseArray,\n );\n\n const children = resolved.map(async ([u, def]) => {\n await this.addUnit(u);\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\n exponent: def.exponent,\n });\n });\n\n await Promise.all(children);\n }\n\n private isIdentity(unit: Unit | Constant) {\n return unit.definition === unit.name;\n }\n\n /**\n * Reduce the tree to produce a single map\n * @param unit Unit to be processed\n * @param stopNodes The tree exploration should stop here\n */\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\n const unitFullName = unit.key.fullName;\n const innerMapStore = new Map<string, UnitConversion>();\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\n return outerMapStore;\n }\n\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\n const outEdges = this._graph.outEdges(unitFullName);\n if (outEdges) {\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\n const { exponent } = this._graph.edge(e.v, e.w);\n const stored = innermapStore.get(e.w);\n const map = stored ? stored : UnitConversion.identity;\n const emap = map.raise(exponent);\n return pm ? pm.multiply(emap) : emap;\n }, undefined);\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\n const other = cmap || UnitConversion.identity;\n const result = other.compose(thisMap);\n innermapStore.set(unitFullName, result);\n } else {\n innermapStore.set(unitFullName, UnitConversion.identity);\n }\n return innermapStore;\n }\n}\n"]}
1
+ {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\nimport { SchemaItemType } from \"../ECObjects\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\nimport { Graph } from \"./Graph\";\n\n/** @internal */\nexport class GraphUtils {\n /**\n * DFS traversal - Post order\n * @param _graph Graph to traverse\n * @param start Starting node\n * @param keyFrom Get key from label\n * @param op Reducing function\n * @param initial Initial label\n */\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 {\n const outEdges = _graph.outEdges(key);\n let t = initial;\n if (outEdges.length > 0) {\n t = outEdges.reduce<T>(\n (p, edge) => {\n const { v, w } = edge;\n const edgeExponent = _graph.edge(v, w).exponent;\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\n },\n t,\n );\n } else {\n if (baseUnitsMap.has(key)) {\n const oldExponent = baseUnitsMap.get(key)!;\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\n } else {\n baseUnitsMap.set(key, accumulatedExponent);\n }\n }\n\n return op(t, key);\n }\n}\n\n/** @internal */\nexport class UnitGraph {\n private _graph = new Graph<Unit | Constant>();\n private _unitsInProgress = new Map<string, Promise<void>>();\n\n constructor(private _context: SchemaContext) {\n this._graph.setGraph(\"Unit tree processor\");\n }\n\n /**\n * Tries to find the unit/constant given by name in currentSchema\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\n */\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\n let [schemaName] = SchemaItem.parseFullName(name);\n const [, schemaItemName] = SchemaItem.parseFullName(name);\n\n if (schemaName !== \"\") {\n // Check if schemaName is schemaName or alias\n const ref = currentSchema.getReferenceSync(schemaName);\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\n if (ref) {\n // Got schema by schemaName\n schemaName = ref.name;\n } else if (refName) {\n // Got schema by alias\n schemaName = refName;\n } else {\n // Didn't match any referenced schema, check if it is current schemaName or alias\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\n schemaName = currentSchema.name;\n }\n\n // Create schema key with schema name\n const schemaKey = new SchemaKey(schemaName);\n // Get schema with schema key\n const schema = await this._context.getSchema(schemaKey);\n if (!schema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\n return { schema: schemaName };\n });\n } else {\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\n currentSchema = schema;\n }\n // Update name to not have prefix\n name = schemaItemName;\n }\n\n // Create schema item key with name and schema\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\n // Get schema item with schema item key\n const item = await this._context.getSchemaItem(itemKey);\n if (!item)\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\n return { item: name };\n });\n\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\n return item as Unit | Constant;\n\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\n return { itemType: item.key.fullName };\n });\n }\n\n /**\n * Adds unit and corresponding children to graph as well as edges between units\n * @param unit Current unit to be added to graph\n */\n public async addUnit(unit: Unit | Constant): Promise<void> {\n if(this._unitsInProgress.has(unit.key.fullName))\n return this._unitsInProgress.get(unit.key.fullName);\n\n if (this._graph.hasNode(unit.key.fullName))\n return;\n\n this._graph.setNode(unit.key.fullName, unit);\n if (this.isIdentity(unit))\n return;\n\n const promise = this.addUnitToGraph(unit);\n this._unitsInProgress.set(unit.key.fullName, promise);\n\n await promise\n .finally(() => this._unitsInProgress.delete(unit.key.fullName));\n }\n\n private async addUnitToGraph(unit: Unit | Constant) {\n const umap = parseDefinition(unit.definition);\n\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\n for (const [key, value] of umap) {\n promiseArray.push(\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\n );\n }\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\n promiseArray,\n );\n\n const children = resolved.map(async ([u, def]) => {\n await this.addUnit(u);\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\n exponent: def.exponent,\n });\n });\n\n await Promise.all(children);\n }\n\n private isIdentity(unit: Unit | Constant) {\n return unit.definition === unit.name;\n }\n\n /**\n * Reduce the tree to produce a single map\n * @param unit Unit to be processed\n * @param stopNodes The tree exploration should stop here\n */\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\n const unitFullName = unit.key.fullName;\n const innerMapStore = new Map<string, UnitConversion>();\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\n return outerMapStore;\n }\n\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\n const outEdges = this._graph.outEdges(unitFullName);\n if (outEdges) {\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\n const { exponent } = this._graph.edge(e.v, e.w);\n const stored = innermapStore.get(e.w);\n const map = stored ? stored : UnitConversion.identity;\n const emap = map.raise(exponent);\n return pm ? pm.multiply(emap) : emap;\n }, undefined);\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\n const other = cmap || UnitConversion.identity;\n const result = other.compose(thisMap);\n innermapStore.set(unitFullName, result);\n } else {\n innermapStore.set(unitFullName, UnitConversion.identity);\n }\n return innermapStore;\n }\n}\n"]}
@@ -20,6 +20,7 @@ export declare class GraphUtils {
20
20
  export declare class UnitGraph {
21
21
  private _context;
22
22
  private _graph;
23
+ private _unitsInProgress;
23
24
  constructor(_context: SchemaContext);
24
25
  /**
25
26
  * Tries to find the unit/constant given by name in currentSchema
@@ -32,6 +33,7 @@ export declare class UnitGraph {
32
33
  * @param unit Current unit to be added to graph
33
34
  */
34
35
  addUnit(unit: Unit | Constant): Promise<void>;
36
+ private addUnitToGraph;
35
37
  private isIdentity;
36
38
  /**
37
39
  * Reduce the tree to produce a single map
@@ -1 +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"}
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;IAIR,OAAO,CAAC,QAAQ;IAH5B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,gBAAgB,CAAoC;gBAExC,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;YAkB5C,cAAc;IAuB5B,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"}
@@ -46,6 +46,7 @@ export class UnitGraph {
46
46
  constructor(_context) {
47
47
  this._context = _context;
48
48
  this._graph = new Graph();
49
+ this._unitsInProgress = new Map();
49
50
  this._graph.setGraph("Unit tree processor");
50
51
  }
51
52
  /**
@@ -108,11 +109,19 @@ export class UnitGraph {
108
109
  * @param unit Current unit to be added to graph
109
110
  */
110
111
  async addUnit(unit) {
112
+ if (this._unitsInProgress.has(unit.key.fullName))
113
+ return this._unitsInProgress.get(unit.key.fullName);
111
114
  if (this._graph.hasNode(unit.key.fullName))
112
115
  return;
113
116
  this._graph.setNode(unit.key.fullName, unit);
114
117
  if (this.isIdentity(unit))
115
118
  return;
119
+ const promise = this.addUnitToGraph(unit);
120
+ this._unitsInProgress.set(unit.key.fullName, promise);
121
+ await promise
122
+ .finally(() => this._unitsInProgress.delete(unit.key.fullName));
123
+ }
124
+ async addUnitToGraph(unit) {
116
125
  const umap = parseDefinition(unit.definition);
117
126
  const promiseArray = [];
118
127
  for (const [key, value] of umap) {
@@ -1 +1 @@
1
- {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\nimport { SchemaItemType } from \"../ECObjects\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\nimport { Graph } from \"./Graph\";\n\n/** @internal */\nexport class GraphUtils {\n /**\n * DFS traversal - Post order\n * @param _graph Graph to traverse\n * @param start Starting node\n * @param keyFrom Get key from label\n * @param op Reducing function\n * @param initial Initial label\n */\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 {\n const outEdges = _graph.outEdges(key);\n let t = initial;\n if (outEdges.length > 0) {\n t = outEdges.reduce<T>(\n (p, edge) => {\n const { v, w } = edge;\n const edgeExponent = _graph.edge(v, w).exponent;\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\n },\n t,\n );\n } else {\n if (baseUnitsMap.has(key)) {\n const oldExponent = baseUnitsMap.get(key)!;\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\n } else {\n baseUnitsMap.set(key, accumulatedExponent);\n }\n }\n\n return op(t, key);\n }\n}\n\n/** @internal */\nexport class UnitGraph {\n private _graph = new Graph<Unit | Constant>();\n\n constructor(private _context: SchemaContext) {\n this._graph.setGraph(\"Unit tree processor\");\n }\n\n /**\n * Tries to find the unit/constant given by name in currentSchema\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\n */\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\n let [schemaName] = SchemaItem.parseFullName(name);\n const [, schemaItemName] = SchemaItem.parseFullName(name);\n\n if (schemaName !== \"\") {\n // Check if schemaName is schemaName or alias\n const ref = currentSchema.getReferenceSync(schemaName);\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\n if (ref) {\n // Got schema by schemaName\n schemaName = ref.name;\n } else if (refName) {\n // Got schema by alias\n schemaName = refName;\n } else {\n // Didn't match any referenced schema, check if it is current schemaName or alias\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\n schemaName = currentSchema.name;\n }\n\n // Create schema key with schema name\n const schemaKey = new SchemaKey(schemaName);\n // Get schema with schema key\n const schema = await this._context.getSchema(schemaKey);\n if (!schema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\n return { schema: schemaName };\n });\n } else {\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\n currentSchema = schema;\n }\n // Update name to not have prefix\n name = schemaItemName;\n }\n\n // Create schema item key with name and schema\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\n // Get schema item with schema item key\n const item = await this._context.getSchemaItem(itemKey);\n if (!item)\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\n return { item: name };\n });\n\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\n return item as Unit | Constant;\n\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\n return { itemType: item.key.fullName };\n });\n }\n\n /**\n * Adds unit and corresponding children to graph as well as edges between units\n * @param unit Current unit to be added to graph\n */\n public async addUnit(unit: Unit | Constant): Promise<void> {\n if (this._graph.hasNode(unit.key.fullName))\n return;\n\n this._graph.setNode(unit.key.fullName, unit);\n if (this.isIdentity(unit))\n return;\n\n const umap = parseDefinition(unit.definition);\n\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\n for (const [key, value] of umap) {\n promiseArray.push(\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\n );\n }\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\n promiseArray,\n );\n\n const children = resolved.map(async ([u, def]) => {\n await this.addUnit(u);\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\n exponent: def.exponent,\n });\n });\n\n await Promise.all(children);\n }\n\n private isIdentity(unit: Unit | Constant) {\n return unit.definition === unit.name;\n }\n\n /**\n * Reduce the tree to produce a single map\n * @param unit Unit to be processed\n * @param stopNodes The tree exploration should stop here\n */\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\n const unitFullName = unit.key.fullName;\n const innerMapStore = new Map<string, UnitConversion>();\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\n return outerMapStore;\n }\n\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\n const outEdges = this._graph.outEdges(unitFullName);\n if (outEdges) {\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\n const { exponent } = this._graph.edge(e.v, e.w);\n const stored = innermapStore.get(e.w);\n const map = stored ? stored : UnitConversion.identity;\n const emap = map.raise(exponent);\n return pm ? pm.multiply(emap) : emap;\n }, undefined);\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\n const other = cmap || UnitConversion.identity;\n const result = other.compose(thisMap);\n innermapStore.set(unitFullName, result);\n } else {\n innermapStore.set(unitFullName, UnitConversion.identity);\n }\n return innermapStore;\n }\n}\n"]}
1
+ {"version":3,"file":"UnitTree.js","sourceRoot":"","sources":["../../../src/UnitConversion/UnitTree.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 { Schema } from \"../Metadata/Schema\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { Unit } from \"../Metadata/Unit\";\nimport { SchemaItemKey, SchemaKey } from \"../SchemaKey\";\nimport { SchemaItemType } from \"../ECObjects\";\nimport { UnitConversion } from \"./UnitConversion\";\nimport { DefinitionFragment, parseDefinition } from \"./Parser\";\nimport { Graph } from \"./Graph\";\n\n/** @internal */\nexport class GraphUtils {\n /**\n * DFS traversal - Post order\n * @param _graph Graph to traverse\n * @param start Starting node\n * @param keyFrom Get key from label\n * @param op Reducing function\n * @param initial Initial label\n */\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 {\n const outEdges = _graph.outEdges(key);\n let t = initial;\n if (outEdges.length > 0) {\n t = outEdges.reduce<T>(\n (p, edge) => {\n const { v, w } = edge;\n const edgeExponent = _graph.edge(v, w).exponent;\n return GraphUtils.dfsReduce(_graph, edge.w, op, p, baseUnitsMap, accumulatedExponent * edgeExponent);\n },\n t,\n );\n } else {\n if (baseUnitsMap.has(key)) {\n const oldExponent = baseUnitsMap.get(key)!;\n baseUnitsMap.set(key, oldExponent + accumulatedExponent);\n } else {\n baseUnitsMap.set(key, accumulatedExponent);\n }\n }\n\n return op(t, key);\n }\n}\n\n/** @internal */\nexport class UnitGraph {\n private _graph = new Graph<Unit | Constant>();\n private _unitsInProgress = new Map<string, Promise<void>>();\n\n constructor(private _context: SchemaContext) {\n this._graph.setGraph(\"Unit tree processor\");\n }\n\n /**\n * Tries to find the unit/constant given by name in currentSchema\n * @param name SchemaItem name or parsed definition to find unit of; Could be {schemaName}:{schemaItemName} or {alias}:{schemaItemName} or {schemaItemName}\n * @param currentSchema schema to find name in; name could also be in a referenced schema of current schema\n */\n public async resolveUnit(name: string, currentSchema: Schema): Promise<Unit | Constant> {\n let [schemaName] = SchemaItem.parseFullName(name);\n const [, schemaItemName] = SchemaItem.parseFullName(name);\n\n if (schemaName !== \"\") {\n // Check if schemaName is schemaName or alias\n const ref = currentSchema.getReferenceSync(schemaName);\n const refName = currentSchema.getReferenceNameByAlias(schemaName);\n if (ref) {\n // Got schema by schemaName\n schemaName = ref.name;\n } else if (refName) {\n // Got schema by alias\n schemaName = refName;\n } else {\n // Didn't match any referenced schema, check if it is current schemaName or alias\n if (schemaName === currentSchema.name || schemaName === currentSchema.alias)\n schemaName = currentSchema.name;\n }\n\n // Create schema key with schema name\n const schemaKey = new SchemaKey(schemaName);\n // Get schema with schema key\n const schema = await this._context.getSchema(schemaKey);\n if (!schema) {\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema\", () => {\n return { schema: schemaName };\n });\n } else {\n // Set currentSchema to look up schemaItem to be whatever is prefixed in name\n currentSchema = schema;\n }\n // Update name to not have prefix\n name = schemaItemName;\n }\n\n // Create schema item key with name and schema\n const itemKey = new SchemaItemKey(name, currentSchema.schemaKey);\n // Get schema item with schema item key\n const item = await this._context.getSchemaItem(itemKey);\n if (!item)\n throw new BentleyError(BentleyStatus.ERROR, \"Cannot find schema item\", () => {\n return { item: name };\n });\n\n if (item.schemaItemType === SchemaItemType.Unit || item.schemaItemType === SchemaItemType.Constant)\n return item as Unit | Constant;\n\n throw new BentleyError(BentleyStatus.ERROR, \"Item is neither a unit or a constant\", () => {\n return { itemType: item.key.fullName };\n });\n }\n\n /**\n * Adds unit and corresponding children to graph as well as edges between units\n * @param unit Current unit to be added to graph\n */\n public async addUnit(unit: Unit | Constant): Promise<void> {\n if(this._unitsInProgress.has(unit.key.fullName))\n return this._unitsInProgress.get(unit.key.fullName);\n\n if (this._graph.hasNode(unit.key.fullName))\n return;\n\n this._graph.setNode(unit.key.fullName, unit);\n if (this.isIdentity(unit))\n return;\n\n const promise = this.addUnitToGraph(unit);\n this._unitsInProgress.set(unit.key.fullName, promise);\n\n await promise\n .finally(() => this._unitsInProgress.delete(unit.key.fullName));\n }\n\n private async addUnitToGraph(unit: Unit | Constant) {\n const umap = parseDefinition(unit.definition);\n\n const promiseArray: Promise<[Unit | Constant, DefinitionFragment]>[] = [];\n for (const [key, value] of umap) {\n promiseArray.push(\n this.resolveUnit(key, unit.schema).then((u) => [u, value]),\n );\n }\n const resolved = await Promise.all<[Unit | Constant, DefinitionFragment]>(\n promiseArray,\n );\n\n const children = resolved.map(async ([u, def]) => {\n await this.addUnit(u);\n this._graph.setEdge(unit.key.fullName, u.key.fullName, {\n exponent: def.exponent,\n });\n });\n\n await Promise.all(children);\n }\n\n private isIdentity(unit: Unit | Constant) {\n return unit.definition === unit.name;\n }\n\n /**\n * Reduce the tree to produce a single map\n * @param unit Unit to be processed\n * @param stopNodes The tree exploration should stop here\n */\n public reduce(unit: Unit | Constant, baseUnitsMap: Map<string, number>): Map<string, UnitConversion> {\n const unitFullName = unit.key.fullName;\n const innerMapStore = new Map<string, UnitConversion>();\n const outerMapStore = GraphUtils.dfsReduce(this._graph, unitFullName, (p, c) => this.reducingFunction(p, c), innerMapStore, baseUnitsMap, 1);\n return outerMapStore;\n }\n\n private reducingFunction(innermapStore: Map<string, UnitConversion>, unitFullName: string) {\n const outEdges = this._graph.outEdges(unitFullName);\n if (outEdges) {\n const cmap = outEdges.reduce<UnitConversion | undefined>((pm, e) => {\n const { exponent } = this._graph.edge(e.v, e.w);\n const stored = innermapStore.get(e.w);\n const map = stored ? stored : UnitConversion.identity;\n const emap = map.raise(exponent);\n return pm ? pm.multiply(emap) : emap;\n }, undefined);\n const thisMap = this._graph.node(unitFullName) ? UnitConversion.from(this._graph.node(unitFullName)) : UnitConversion.identity;\n const other = cmap || UnitConversion.identity;\n const result = other.compose(thisMap);\n innermapStore.set(unitFullName, result);\n } else {\n innermapStore.set(unitFullName, UnitConversion.identity);\n }\n return innermapStore;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/ecschema-metadata",
3
- "version": "5.0.0-dev.52",
3
+ "version": "5.0.0-dev.54",
4
4
  "description": "ECObjects core concepts in typescript",
5
5
  "license": "MIT",
6
6
  "main": "lib/cjs/ecschema-metadata.js",
@@ -42,13 +42,13 @@
42
42
  "rimraf": "^3.0.2",
43
43
  "sinon": "^17.0.2",
44
44
  "typescript": "~5.6.2",
45
- "@itwin/build-tools": "5.0.0-dev.52",
46
- "@itwin/core-bentley": "5.0.0-dev.52",
47
- "@itwin/core-quantity": "5.0.0-dev.52"
45
+ "@itwin/build-tools": "5.0.0-dev.54",
46
+ "@itwin/core-bentley": "5.0.0-dev.54",
47
+ "@itwin/core-quantity": "5.0.0-dev.54"
48
48
  },
49
49
  "peerDependencies": {
50
- "@itwin/core-quantity": "5.0.0-dev.52",
51
- "@itwin/core-bentley": "5.0.0-dev.52"
50
+ "@itwin/core-bentley": "5.0.0-dev.54",
51
+ "@itwin/core-quantity": "5.0.0-dev.54"
52
52
  },
53
53
  "nyc": {
54
54
  "extends": "./node_modules/@itwin/build-tools/.nycrc"