@itwin/core-backend 5.10.0-dev.20 → 5.10.0-dev.22
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/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +4 -0
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js +1 -0
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +2 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +7 -11
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +3 -1
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +4 -0
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/esm/ECSqlSyncReader.js +1 -0
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +2 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +7 -11
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +1 -0
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +10 -2
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +10 -0
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +1 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +13 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +1 -0
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +6 -2
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +5 -0
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js +1 -0
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +1 -0
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaViewKoQ.test.js +12 -3
- package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +6 -0
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +23 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +3 -1
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/package.json +12 -12
|
@@ -120,7 +120,10 @@ describe("SchemaView KindOfQuantity presentation formats", () => {
|
|
|
120
120
|
for await (const row of iModel.createQueryReader(`SELECT f.NumericSpec, f.CompositeSpec
|
|
121
121
|
FROM meta.FormatDef f
|
|
122
122
|
JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats
|
|
123
|
-
WHERE f.Name = ? AND s.Name = 'Formats'`, QueryBinder.from([formatItemName]), {
|
|
123
|
+
WHERE f.Name = ? AND s.Name = 'Formats'`, QueryBinder.from([formatItemName]), {
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
125
|
+
rowFormat: QueryRowFormat.UseJsPropertyNames,
|
|
126
|
+
})) {
|
|
124
127
|
formatNumericSpec = row.toRow();
|
|
125
128
|
}
|
|
126
129
|
assert.isDefined(formatNumericSpec, `FormatDef '${formatItemName}' not found via ECSQL`);
|
|
@@ -139,7 +142,10 @@ describe("SchemaView KindOfQuantity presentation formats", () => {
|
|
|
139
142
|
FROM meta.UnitDef u
|
|
140
143
|
JOIN meta.ECSchemaDef s USING meta.SchemaOwnsUnits
|
|
141
144
|
JOIN meta.UnitSystemDef us USING meta.UnitSystemHasUnits
|
|
142
|
-
WHERE u.Name = ? AND s.Name = 'Units'`, QueryBinder.from([unitItemName]), {
|
|
145
|
+
WHERE u.Name = ? AND s.Name = 'Units'`, QueryBinder.from([unitItemName]), {
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
147
|
+
rowFormat: QueryRowFormat.UseJsPropertyNames,
|
|
148
|
+
})) {
|
|
143
149
|
unitRow = row.toRow();
|
|
144
150
|
}
|
|
145
151
|
assert.isDefined(unitRow, `UnitDef '${unitItemName}' not found via ECSQL`);
|
|
@@ -161,7 +167,10 @@ describe("SchemaView KindOfQuantity presentation formats", () => {
|
|
|
161
167
|
JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats
|
|
162
168
|
JOIN meta.UnitDef u USING meta.CompositeUnitRefersToUnit
|
|
163
169
|
WHERE f.Name = 'AngleDMS' AND s.Name = 'Formats'
|
|
164
|
-
ORDER BY cu.Ordinal`, undefined, {
|
|
170
|
+
ORDER BY cu.Ordinal`, undefined, {
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
172
|
+
rowFormat: QueryRowFormat.UseJsPropertyNames,
|
|
173
|
+
})) {
|
|
165
174
|
compositeUnits.push(row.toRow());
|
|
166
175
|
}
|
|
167
176
|
expect(compositeUnits.length).to.equal(3, "AngleDMS should have 3 composite units");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaViewKoQ.test.js","sourceRoot":"","sources":["../../../../src/test/schema/SchemaViewKoQ.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { IModelHost, SnapshotDb } from \"../../core-backend\";\nimport { Format, KindOfQuantity, SchemaUnitProvider, type SchemaView, Unit } from \"@itwin/ecschema-metadata\";\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { TestUtils } from \"../TestUtils\";\n\n/**\n * Example-style tests showing how to access KindOfQuantity presentation formats\n * through SchemaView and resolve the alias-qualified format/unit names\n * into full schema items via ecschema-metadata or ECSQL.\n *\n * Uses sim-master.bim which contains schemas with rich KoQ definitions\n * (AecUnits, RoadRailUnits, LinearReferencing, etc.).\n */\ndescribe(\"SchemaView KindOfQuantity presentation formats\", () => {\n let iModel: SnapshotDb;\n let schemaView: SchemaView;\n\n before(async () => {\n if (!IModelHost.isValid)\n await TestUtils.startBackend();\n iModel = SnapshotDb.openFile(path.join(KnownTestLocations.assetsDir, \"sim-master.bim\"));\n schemaView = await iModel.getSchemaView();\n });\n\n after(() => {\n iModel.close();\n });\n\n /**\n * Example: get a property's KoQ from SchemaView, then resolve the\n * alias-qualified format and unit names to full ecschema-metadata objects via\n * IModelDb.schemaContext.\n *\n * SchemaView uses alias-qualified names (e.g. \"f:DefaultRealU\", \"u:M\")\n * because the Units and Formats schemas are excluded from the SchemaView blob.\n * The alias (\"f\" -> \"Formats\", \"u\" -> \"Units\") is stored in ec_Schema, so we\n * can resolve it using the schema context that has the full schema set.\n */\n it(\"should resolve KoQ format and unit names via ecschema-metadata\", async () => {\n // --- Step 1: find a property with a KoQ via SchemaView ---\n const rClass = schemaView.findClass(\"LinearReferencing:DistanceExpression\");\n assert.isDefined(rClass, \"DistanceExpression class not found\");\n\n const rProp = rClass!.getProperty(\"DistanceAlongFromStart\");\n assert.isDefined(rProp, \"DistanceAlongFromStart property not found\");\n\n const prop = rProp!;\n if (!prop.isPrimitive())\n throw new Error(\"expected primitive\");\n const rKoq = prop.kindOfQuantity;\n assert.isDefined(rKoq, \"property should have a KoQ\");\n\n // --- Step 2: inspect parsed presentation formats ---\n const formats: readonly SchemaView.PresentationFormat[] = rKoq!.presentationFormats;\n expect(formats.length).to.be.greaterThan(0, \"KoQ should have presentation formats\");\n\n // LinearReferencing:LENGTH has: f:DefaultRealU(2)[u:M], f:DefaultRealU(2)[u:FT]\n const first = formats[0];\n expect(first.name).to.equal(\"f:DefaultRealU\");\n expect(first.precision).to.equal(2);\n expect(first.unitAndLabels).to.have.length(1);\n expect(first.unitAndLabels![0][0]).to.equal(\"u:M\");\n\n // --- Step 3: resolve alias names to full schema items via schemaContext ---\n // The Formats and Units schemas are excluded from SchemaView,\n // but IModelDb.schemaContext (ecschema-metadata) has the full set.\n // Alias \"f\" -> \"Formats\", alias \"u\" -> \"Units\" - these are standard BIS aliases.\n\n // Resolve the format: \"f:DefaultRealU\" -> \"Formats.DefaultRealU\"\n const formatFullName = `Formats.${first.name.split(\":\")[1]}`;\n const metaFormat = iModel.schemaContext.getSchemaItemSync(formatFullName, Format);\n assert.isDefined(metaFormat, `Format '${formatFullName}' not found in ecschema-metadata`);\n expect(metaFormat!.precision).to.be.a(\"number\");\n\n // Resolve the unit: \"u:M\" -> \"Units.M\"\n const unitFullName = `Units.${first.unitAndLabels![0][0].split(\":\")[1]}`;\n const metaUnit = iModel.schemaContext.getSchemaItemSync(unitFullName, Unit);\n assert.isDefined(metaUnit, `Unit '${unitFullName}' not found in ecschema-metadata`);\n expect(metaUnit!.fullName).to.equal(\"Units.M\");\n\n // Access unit details like label and unit system\n const unitSystem = await metaUnit!.unitSystem;\n assert.isDefined(unitSystem, \"unit should have a unit system\");\n expect(unitSystem!.name).to.equal(\"SI\");\n\n // --- Step 4: cross-validate against the KoQ in ecschema-metadata ---\n const metaKoq = iModel.schemaContext.getSchemaItemSync(\"LinearReferencing\", \"LENGTH\", KindOfQuantity);\n assert.isDefined(metaKoq, \"KoQ not found in ecschema-metadata\");\n expect(metaKoq!.relativeError).to.equal(rKoq!.relativeError);\n\n const metaFormats = metaKoq!.presentationFormats;\n expect(metaFormats.length).to.equal(formats.length);\n\n // ecschema-metadata resolves the formats fully - cross-check the format names.\n // OverrideFormat.fullName includes override syntax (e.g. \"Formats.DefaultRealU(2)[Units.M]\"),\n // so strip the override portion before extracting the base name.\n for (let i = 0; i < formats.length; i++) {\n const rtItemName = formats[i].name.split(\":\")[1];\n const metaBaseFullName = metaFormats[i].fullName.split(/[([]/)[0];\n const metaItemName = metaBaseFullName.split(\".\").pop();\n expect(rtItemName).to.equal(metaItemName, `format name mismatch at index ${i}`);\n }\n\n // The SchemaUnitProvider bridges ecschema-metadata units to the @itwin/core-quantity package.\n // Use it to build a FormatterSpec for quantity formatting:\n const unitsProvider = new SchemaUnitProvider(iModel.schemaContext);\n const persistenceUnitProps = await unitsProvider.findUnitByName(\"Units.M\");\n expect(persistenceUnitProps.name).to.equal(\"Units.M\");\n });\n\n /**\n * Example: get a KoQ from SchemaView, then query ECDbMeta via ECSQL\n * to resolve the referenced format and unit definitions.\n *\n * This approach avoids loading the full ecschema-metadata schema set and works\n * well for targeted lookups - e.g. \"I have a format name, give me its NumericSpec.\"\n */\n it(\"should resolve KoQ format and unit names via ECSQL\", async () => {\n // --- Step 1: find a KoQ via SchemaView ---\n const rKoq = schemaView.findKindOfQuantity(\"LinearReferencing:LENGTH\");\n assert.isDefined(rKoq, \"KoQ not found in SchemaView\");\n\n const formats = rKoq!.presentationFormats;\n expect(formats.length).to.be.greaterThan(0);\n\n // --- Step 2: resolve the format name via meta.FormatDef ---\n // \"f:DefaultRealU\" -> format name is \"DefaultRealU\" in the \"Formats\" schema\n const first = formats[0];\n const formatItemName = first.name.split(\":\")[1]; // \"DefaultRealU\"\n\n // Query FormatDef to get the format's NumericSpec (= FormatProps JSON)\n let formatNumericSpec: any;\n for await (const row of iModel.createQueryReader(\n `SELECT f.NumericSpec, f.CompositeSpec\n FROM meta.FormatDef f\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats\n WHERE f.Name = ? AND s.Name = 'Formats'`,\n QueryBinder.from([formatItemName]),\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\n )) {\n formatNumericSpec = row.toRow();\n }\n assert.isDefined(formatNumericSpec, `FormatDef '${formatItemName}' not found via ECSQL`);\n\n // NumericSpec is a JSON string with the format properties (type, precision, traits, etc.)\n const numericSpec = JSON.parse(formatNumericSpec.numericSpec);\n expect(numericSpec.type).to.equal(\"Decimal\");\n expect(numericSpec.precision).to.be.a(\"number\");\n\n // The presentation format can override precision - e.g. the override \"(2)\" means precision 2\n if (first.precision !== undefined)\n expect(first.precision).to.equal(2); // our override\n\n // --- Step 3: resolve the unit name via meta.UnitDef ---\n // \"u:M\" -> unit name is \"M\" in the \"Units\" schema\n const unitItemName = first.unitAndLabels![0][0].split(\":\")[1]; // \"M\"\n\n let unitRow: any;\n for await (const row of iModel.createQueryReader(\n `SELECT u.Name, u.DisplayLabel, us.Name AS unitSystemName\n FROM meta.UnitDef u\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsUnits\n JOIN meta.UnitSystemDef us USING meta.UnitSystemHasUnits\n WHERE u.Name = ? AND s.Name = 'Units'`,\n QueryBinder.from([unitItemName]),\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\n )) {\n unitRow = row.toRow();\n }\n assert.isDefined(unitRow, `UnitDef '${unitItemName}' not found via ECSQL`);\n expect(unitRow.name).to.equal(\"M\");\n expect(unitRow.unitSystemName).to.equal(\"SI\");\n\n // --- Step 4: query the format's composite units (base format units, before overrides) ---\n // DefaultRealU has no composite units (it's a single-unit format), but AngleDMS does.\n // Let's also check the second KoQ format which might have composite units.\n const angleKoq = schemaView.findKindOfQuantity(\"RoadRailUnits:ANGLE\");\n if (angleKoq) {\n const angleFormats = angleKoq.presentationFormats;\n // The AngleDMS format has composite units: ARC_DEG, ARC_MINUTE, ARC_SECOND\n const dmsFormat = angleFormats.find((f) => f.name.split(\":\")[1] === \"AngleDMS\");\n if (dmsFormat) {\n const compositeUnits: Array<{ ordinal: number; unitName: string; label: string }> = [];\n for await (const row of iModel.createQueryReader(\n `SELECT cu.Ordinal, u.Name AS unitName, cu.Label\n FROM meta.FormatCompositeUnitDef cu\n JOIN meta.FormatDef f USING meta.FormatOwnsCompositeUnits\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats\n JOIN meta.UnitDef u USING meta.CompositeUnitRefersToUnit\n WHERE f.Name = 'AngleDMS' AND s.Name = 'Formats'\n ORDER BY cu.Ordinal`,\n undefined,\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\n )) {\n compositeUnits.push(row.toRow());\n }\n expect(compositeUnits.length).to.equal(3, \"AngleDMS should have 3 composite units\");\n expect(compositeUnits[0].unitName).to.equal(\"ARC_DEG\");\n expect(compositeUnits[1].unitName).to.equal(\"ARC_MINUTE\");\n expect(compositeUnits[2].unitName).to.equal(\"ARC_SECOND\");\n }\n }\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"SchemaViewKoQ.test.js","sourceRoot":"","sources":["../../../../src/test/schema/SchemaViewKoQ.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { IModelHost, SnapshotDb } from \"../../core-backend\";\nimport { Format, KindOfQuantity, SchemaUnitProvider, type SchemaView, Unit } from \"@itwin/ecschema-metadata\";\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { TestUtils } from \"../TestUtils\";\n\n/**\n * Example-style tests showing how to access KindOfQuantity presentation formats\n * through SchemaView and resolve the alias-qualified format/unit names\n * into full schema items via ecschema-metadata or ECSQL.\n *\n * Uses sim-master.bim which contains schemas with rich KoQ definitions\n * (AecUnits, RoadRailUnits, LinearReferencing, etc.).\n */\ndescribe(\"SchemaView KindOfQuantity presentation formats\", () => {\n let iModel: SnapshotDb;\n let schemaView: SchemaView;\n\n before(async () => {\n if (!IModelHost.isValid)\n await TestUtils.startBackend();\n iModel = SnapshotDb.openFile(path.join(KnownTestLocations.assetsDir, \"sim-master.bim\"));\n schemaView = await iModel.getSchemaView();\n });\n\n after(() => {\n iModel.close();\n });\n\n /**\n * Example: get a property's KoQ from SchemaView, then resolve the\n * alias-qualified format and unit names to full ecschema-metadata objects via\n * IModelDb.schemaContext.\n *\n * SchemaView uses alias-qualified names (e.g. \"f:DefaultRealU\", \"u:M\")\n * because the Units and Formats schemas are excluded from the SchemaView blob.\n * The alias (\"f\" -> \"Formats\", \"u\" -> \"Units\") is stored in ec_Schema, so we\n * can resolve it using the schema context that has the full schema set.\n */\n it(\"should resolve KoQ format and unit names via ecschema-metadata\", async () => {\n // --- Step 1: find a property with a KoQ via SchemaView ---\n const rClass = schemaView.findClass(\"LinearReferencing:DistanceExpression\");\n assert.isDefined(rClass, \"DistanceExpression class not found\");\n\n const rProp = rClass!.getProperty(\"DistanceAlongFromStart\");\n assert.isDefined(rProp, \"DistanceAlongFromStart property not found\");\n\n const prop = rProp!;\n if (!prop.isPrimitive())\n throw new Error(\"expected primitive\");\n const rKoq = prop.kindOfQuantity;\n assert.isDefined(rKoq, \"property should have a KoQ\");\n\n // --- Step 2: inspect parsed presentation formats ---\n const formats: readonly SchemaView.PresentationFormat[] = rKoq!.presentationFormats;\n expect(formats.length).to.be.greaterThan(0, \"KoQ should have presentation formats\");\n\n // LinearReferencing:LENGTH has: f:DefaultRealU(2)[u:M], f:DefaultRealU(2)[u:FT]\n const first = formats[0];\n expect(first.name).to.equal(\"f:DefaultRealU\");\n expect(first.precision).to.equal(2);\n expect(first.unitAndLabels).to.have.length(1);\n expect(first.unitAndLabels![0][0]).to.equal(\"u:M\");\n\n // --- Step 3: resolve alias names to full schema items via schemaContext ---\n // The Formats and Units schemas are excluded from SchemaView,\n // but IModelDb.schemaContext (ecschema-metadata) has the full set.\n // Alias \"f\" -> \"Formats\", alias \"u\" -> \"Units\" - these are standard BIS aliases.\n\n // Resolve the format: \"f:DefaultRealU\" -> \"Formats.DefaultRealU\"\n const formatFullName = `Formats.${first.name.split(\":\")[1]}`;\n const metaFormat = iModel.schemaContext.getSchemaItemSync(formatFullName, Format);\n assert.isDefined(metaFormat, `Format '${formatFullName}' not found in ecschema-metadata`);\n expect(metaFormat!.precision).to.be.a(\"number\");\n\n // Resolve the unit: \"u:M\" -> \"Units.M\"\n const unitFullName = `Units.${first.unitAndLabels![0][0].split(\":\")[1]}`;\n const metaUnit = iModel.schemaContext.getSchemaItemSync(unitFullName, Unit);\n assert.isDefined(metaUnit, `Unit '${unitFullName}' not found in ecschema-metadata`);\n expect(metaUnit!.fullName).to.equal(\"Units.M\");\n\n // Access unit details like label and unit system\n const unitSystem = await metaUnit!.unitSystem;\n assert.isDefined(unitSystem, \"unit should have a unit system\");\n expect(unitSystem!.name).to.equal(\"SI\");\n\n // --- Step 4: cross-validate against the KoQ in ecschema-metadata ---\n const metaKoq = iModel.schemaContext.getSchemaItemSync(\"LinearReferencing\", \"LENGTH\", KindOfQuantity);\n assert.isDefined(metaKoq, \"KoQ not found in ecschema-metadata\");\n expect(metaKoq!.relativeError).to.equal(rKoq!.relativeError);\n\n const metaFormats = metaKoq!.presentationFormats;\n expect(metaFormats.length).to.equal(formats.length);\n\n // ecschema-metadata resolves the formats fully - cross-check the format names.\n // OverrideFormat.fullName includes override syntax (e.g. \"Formats.DefaultRealU(2)[Units.M]\"),\n // so strip the override portion before extracting the base name.\n for (let i = 0; i < formats.length; i++) {\n const rtItemName = formats[i].name.split(\":\")[1];\n const metaBaseFullName = metaFormats[i].fullName.split(/[([]/)[0];\n const metaItemName = metaBaseFullName.split(\".\").pop();\n expect(rtItemName).to.equal(metaItemName, `format name mismatch at index ${i}`);\n }\n\n // The SchemaUnitProvider bridges ecschema-metadata units to the @itwin/core-quantity package.\n // Use it to build a FormatterSpec for quantity formatting:\n const unitsProvider = new SchemaUnitProvider(iModel.schemaContext);\n const persistenceUnitProps = await unitsProvider.findUnitByName(\"Units.M\");\n expect(persistenceUnitProps.name).to.equal(\"Units.M\");\n });\n\n /**\n * Example: get a KoQ from SchemaView, then query ECDbMeta via ECSQL\n * to resolve the referenced format and unit definitions.\n *\n * This approach avoids loading the full ecschema-metadata schema set and works\n * well for targeted lookups - e.g. \"I have a format name, give me its NumericSpec.\"\n */\n it(\"should resolve KoQ format and unit names via ECSQL\", async () => {\n // --- Step 1: find a KoQ via SchemaView ---\n const rKoq = schemaView.findKindOfQuantity(\"LinearReferencing:LENGTH\");\n assert.isDefined(rKoq, \"KoQ not found in SchemaView\");\n\n const formats = rKoq!.presentationFormats;\n expect(formats.length).to.be.greaterThan(0);\n\n // --- Step 2: resolve the format name via meta.FormatDef ---\n // \"f:DefaultRealU\" -> format name is \"DefaultRealU\" in the \"Formats\" schema\n const first = formats[0];\n const formatItemName = first.name.split(\":\")[1]; // \"DefaultRealU\"\n\n // Query FormatDef to get the format's NumericSpec (= FormatProps JSON)\n let formatNumericSpec: any;\n for await (const row of iModel.createQueryReader(\n `SELECT f.NumericSpec, f.CompositeSpec\n FROM meta.FormatDef f\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats\n WHERE f.Name = ? AND s.Name = 'Formats'`,\n QueryBinder.from([formatItemName]),\n {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n },\n )) {\n formatNumericSpec = row.toRow();\n }\n assert.isDefined(formatNumericSpec, `FormatDef '${formatItemName}' not found via ECSQL`);\n\n // NumericSpec is a JSON string with the format properties (type, precision, traits, etc.)\n const numericSpec = JSON.parse(formatNumericSpec.numericSpec);\n expect(numericSpec.type).to.equal(\"Decimal\");\n expect(numericSpec.precision).to.be.a(\"number\");\n\n // The presentation format can override precision - e.g. the override \"(2)\" means precision 2\n if (first.precision !== undefined)\n expect(first.precision).to.equal(2); // our override\n\n // --- Step 3: resolve the unit name via meta.UnitDef ---\n // \"u:M\" -> unit name is \"M\" in the \"Units\" schema\n const unitItemName = first.unitAndLabels![0][0].split(\":\")[1]; // \"M\"\n\n let unitRow: any;\n for await (const row of iModel.createQueryReader(\n `SELECT u.Name, u.DisplayLabel, us.Name AS unitSystemName\n FROM meta.UnitDef u\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsUnits\n JOIN meta.UnitSystemDef us USING meta.UnitSystemHasUnits\n WHERE u.Name = ? AND s.Name = 'Units'`,\n QueryBinder.from([unitItemName]),\n {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n },\n )) {\n unitRow = row.toRow();\n }\n assert.isDefined(unitRow, `UnitDef '${unitItemName}' not found via ECSQL`);\n expect(unitRow.name).to.equal(\"M\");\n expect(unitRow.unitSystemName).to.equal(\"SI\");\n\n // --- Step 4: query the format's composite units (base format units, before overrides) ---\n // DefaultRealU has no composite units (it's a single-unit format), but AngleDMS does.\n // Let's also check the second KoQ format which might have composite units.\n const angleKoq = schemaView.findKindOfQuantity(\"RoadRailUnits:ANGLE\");\n if (angleKoq) {\n const angleFormats = angleKoq.presentationFormats;\n // The AngleDMS format has composite units: ARC_DEG, ARC_MINUTE, ARC_SECOND\n const dmsFormat = angleFormats.find((f) => f.name.split(\":\")[1] === \"AngleDMS\");\n if (dmsFormat) {\n const compositeUnits: Array<{ ordinal: number; unitName: string; label: string }> = [];\n for await (const row of iModel.createQueryReader(\n `SELECT cu.Ordinal, u.Name AS unitName, cu.Label\n FROM meta.FormatCompositeUnitDef cu\n JOIN meta.FormatDef f USING meta.FormatOwnsCompositeUnits\n JOIN meta.ECSchemaDef s USING meta.SchemaOwnsFormats\n JOIN meta.UnitDef u USING meta.CompositeUnitRefersToUnit\n WHERE f.Name = 'AngleDMS' AND s.Name = 'Formats'\n ORDER BY cu.Ordinal`,\n undefined,\n {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rowFormat: QueryRowFormat.UseJsPropertyNames,\n },\n )) {\n compositeUnits.push(row.toRow());\n }\n expect(compositeUnits.length).to.equal(3, \"AngleDMS should have 3 composite units\");\n expect(compositeUnits[0].unitName).to.equal(\"ARC_DEG\");\n expect(compositeUnits[1].unitName).to.equal(\"ARC_MINUTE\");\n expect(compositeUnits[2].unitName).to.equal(\"ARC_SECOND\");\n }\n }\n });\n});\n"]}
|
|
@@ -574,6 +574,7 @@ describe("IModelWriteTest", () => {
|
|
|
574
574
|
assert.equal(rows.length, 10);
|
|
575
575
|
assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);
|
|
576
576
|
rows = [];
|
|
577
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
577
578
|
for await (const queryRow of rwIModel.createQueryReader("SELECT * FROM TestDomain.Test2dElement", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
578
579
|
rows.push(queryRow.toRow());
|
|
579
580
|
}
|
|
@@ -592,6 +593,7 @@ describe("IModelWriteTest", () => {
|
|
|
592
593
|
assert.equal(rows.length, 10);
|
|
593
594
|
assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);
|
|
594
595
|
rows = [];
|
|
596
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
595
597
|
for await (const queryRow of rwIModel2.createQueryReader("SELECT * FROM TestDomain.Test2dElement", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
596
598
|
rows.push(queryRow.toRow());
|
|
597
599
|
}
|
|
@@ -679,6 +681,7 @@ describe("IModelWriteTest", () => {
|
|
|
679
681
|
assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);
|
|
680
682
|
assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);
|
|
681
683
|
rows = [];
|
|
684
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
682
685
|
for await (const queryRow of rwIModel.createQueryReader("SELECT * FROM TestDomain.Test2dElement", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
683
686
|
rows.push(queryRow.toRow());
|
|
684
687
|
}
|
|
@@ -696,6 +699,7 @@ describe("IModelWriteTest", () => {
|
|
|
696
699
|
assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);
|
|
697
700
|
assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);
|
|
698
701
|
rows = [];
|
|
702
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
699
703
|
for await (const queryRow of rwIModel.createQueryReader("SELECT * FROM TestDomain.Test2dElement2nd", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
700
704
|
rows.push(queryRow.toRow());
|
|
701
705
|
}
|
|
@@ -718,6 +722,7 @@ describe("IModelWriteTest", () => {
|
|
|
718
722
|
assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);
|
|
719
723
|
rows = [];
|
|
720
724
|
// Following fail without native side fix where we clear concurrent query cache on schema changeset apply
|
|
725
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
721
726
|
for await (const queryRow of rwIModel2.createQueryReader("SELECT * FROM TestDomain.Test2dElement", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
722
727
|
rows.push(queryRow.toRow());
|
|
723
728
|
}
|
|
@@ -767,6 +772,7 @@ describe("IModelWriteTest", () => {
|
|
|
767
772
|
}
|
|
768
773
|
}
|
|
769
774
|
rows = [];
|
|
775
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
770
776
|
for await (const queryRow of rwIModel2.createQueryReader("SELECT * FROM TestDomain.Test2dElement2nd", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
771
777
|
rows.push(queryRow.toRow());
|
|
772
778
|
}
|