@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.
Files changed (57) hide show
  1. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  2. package/lib/cjs/ECSqlStatement.js +4 -0
  3. package/lib/cjs/ECSqlStatement.js.map +1 -1
  4. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
  5. package/lib/cjs/ECSqlSyncReader.js +1 -0
  6. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  7. package/lib/cjs/IModelDb.d.ts.map +1 -1
  8. package/lib/cjs/IModelDb.js +2 -0
  9. package/lib/cjs/IModelDb.js.map +1 -1
  10. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  11. package/lib/cjs/internal/workspace/WorkspaceImpl.js +7 -11
  12. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  13. package/lib/cjs/workspace/Workspace.d.ts +3 -1
  14. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  15. package/lib/cjs/workspace/Workspace.js.map +1 -1
  16. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  17. package/lib/esm/ECSqlStatement.js +4 -0
  18. package/lib/esm/ECSqlStatement.js.map +1 -1
  19. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
  20. package/lib/esm/ECSqlSyncReader.js +1 -0
  21. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  22. package/lib/esm/IModelDb.d.ts.map +1 -1
  23. package/lib/esm/IModelDb.js +2 -0
  24. package/lib/esm/IModelDb.js.map +1 -1
  25. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  26. package/lib/esm/internal/workspace/WorkspaceImpl.js +7 -11
  27. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  28. package/lib/esm/test/ecdb/CTE.test.js +1 -0
  29. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  30. package/lib/esm/test/ecdb/ECSqlQuery.test.js +10 -2
  31. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  32. package/lib/esm/test/ecdb/ECSqlStatement.test.js +10 -0
  33. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  34. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +1 -0
  35. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  36. package/lib/esm/test/ecdb/QueryReaders.test.js +13 -0
  37. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  38. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +1 -0
  39. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  40. package/lib/esm/test/element/DeleteDefinitionElements.test.js +6 -2
  41. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  42. package/lib/esm/test/element/ElementRoundTrip.test.js +5 -0
  43. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  44. package/lib/esm/test/element/ExcludedElements.test.js +1 -0
  45. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  46. package/lib/esm/test/hubaccess/SemanticRebase.test.js +1 -0
  47. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  48. package/lib/esm/test/schema/SchemaViewKoQ.test.js +12 -3
  49. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
  50. package/lib/esm/test/standalone/IModelWrite.test.js +6 -0
  51. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  52. package/lib/esm/test/standalone/Workspace.test.js +23 -0
  53. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  54. package/lib/esm/workspace/Workspace.d.ts +3 -1
  55. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  56. package/lib/esm/workspace/Workspace.js.map +1 -1
  57. 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]), { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
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]), { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
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, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
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
  }