@itwin/core-backend 5.1.0-dev.3 → 5.1.0-dev.5

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 (115) hide show
  1. package/lib/cjs/Category.d.ts +37 -0
  2. package/lib/cjs/Category.d.ts.map +1 -1
  3. package/lib/cjs/Category.js +73 -0
  4. package/lib/cjs/Category.js.map +1 -1
  5. package/lib/cjs/DisplayStyle.d.ts +5 -0
  6. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  7. package/lib/cjs/DisplayStyle.js +27 -0
  8. package/lib/cjs/DisplayStyle.js.map +1 -1
  9. package/lib/cjs/Element.d.ts +166 -10
  10. package/lib/cjs/Element.d.ts.map +1 -1
  11. package/lib/cjs/Element.js +510 -9
  12. package/lib/cjs/Element.js.map +1 -1
  13. package/lib/cjs/Entity.d.ts +41 -1
  14. package/lib/cjs/Entity.d.ts.map +1 -1
  15. package/lib/cjs/Entity.js +58 -0
  16. package/lib/cjs/Entity.js.map +1 -1
  17. package/lib/cjs/IModelDb.d.ts +19 -36
  18. package/lib/cjs/IModelDb.d.ts.map +1 -1
  19. package/lib/cjs/IModelDb.js +129 -69
  20. package/lib/cjs/IModelDb.js.map +1 -1
  21. package/lib/cjs/IModelHost.d.ts +13 -0
  22. package/lib/cjs/IModelHost.d.ts.map +1 -1
  23. package/lib/cjs/IModelHost.js +6 -0
  24. package/lib/cjs/IModelHost.js.map +1 -1
  25. package/lib/cjs/Material.d.ts +19 -0
  26. package/lib/cjs/Material.d.ts.map +1 -1
  27. package/lib/cjs/Material.js +29 -0
  28. package/lib/cjs/Material.js.map +1 -1
  29. package/lib/cjs/Model.d.ts +42 -6
  30. package/lib/cjs/Model.d.ts.map +1 -1
  31. package/lib/cjs/Model.js +93 -5
  32. package/lib/cjs/Model.js.map +1 -1
  33. package/lib/cjs/TxnManager.d.ts.map +1 -1
  34. package/lib/cjs/TxnManager.js +1 -0
  35. package/lib/cjs/TxnManager.js.map +1 -1
  36. package/lib/cjs/ViewDefinition.d.ts +100 -0
  37. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  38. package/lib/cjs/ViewDefinition.js +208 -0
  39. package/lib/cjs/ViewDefinition.js.map +1 -1
  40. package/lib/cjs/ViewStateHydrator.js +3 -3
  41. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  42. package/lib/cjs/internal/ElementLRUCache.d.ts +28 -0
  43. package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -0
  44. package/lib/cjs/internal/ElementLRUCache.js +120 -0
  45. package/lib/cjs/internal/ElementLRUCache.js.map +1 -0
  46. package/lib/cjs/internal/Symbols.d.ts +1 -0
  47. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  48. package/lib/cjs/internal/Symbols.js +2 -1
  49. package/lib/cjs/internal/Symbols.js.map +1 -1
  50. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +2 -2
  51. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  52. package/lib/esm/Category.d.ts +37 -0
  53. package/lib/esm/Category.d.ts.map +1 -1
  54. package/lib/esm/Category.js +73 -0
  55. package/lib/esm/Category.js.map +1 -1
  56. package/lib/esm/DisplayStyle.d.ts +5 -0
  57. package/lib/esm/DisplayStyle.d.ts.map +1 -1
  58. package/lib/esm/DisplayStyle.js +27 -0
  59. package/lib/esm/DisplayStyle.js.map +1 -1
  60. package/lib/esm/Element.d.ts +166 -10
  61. package/lib/esm/Element.d.ts.map +1 -1
  62. package/lib/esm/Element.js +513 -12
  63. package/lib/esm/Element.js.map +1 -1
  64. package/lib/esm/Entity.d.ts +41 -1
  65. package/lib/esm/Entity.d.ts.map +1 -1
  66. package/lib/esm/Entity.js +58 -0
  67. package/lib/esm/Entity.js.map +1 -1
  68. package/lib/esm/IModelDb.d.ts +19 -36
  69. package/lib/esm/IModelDb.d.ts.map +1 -1
  70. package/lib/esm/IModelDb.js +132 -72
  71. package/lib/esm/IModelDb.js.map +1 -1
  72. package/lib/esm/IModelHost.d.ts +13 -0
  73. package/lib/esm/IModelHost.d.ts.map +1 -1
  74. package/lib/esm/IModelHost.js +6 -0
  75. package/lib/esm/IModelHost.js.map +1 -1
  76. package/lib/esm/Material.d.ts +19 -0
  77. package/lib/esm/Material.d.ts.map +1 -1
  78. package/lib/esm/Material.js +30 -1
  79. package/lib/esm/Material.js.map +1 -1
  80. package/lib/esm/Model.d.ts +42 -6
  81. package/lib/esm/Model.d.ts.map +1 -1
  82. package/lib/esm/Model.js +94 -6
  83. package/lib/esm/Model.js.map +1 -1
  84. package/lib/esm/TxnManager.d.ts.map +1 -1
  85. package/lib/esm/TxnManager.js +1 -0
  86. package/lib/esm/TxnManager.js.map +1 -1
  87. package/lib/esm/ViewDefinition.d.ts +100 -0
  88. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  89. package/lib/esm/ViewDefinition.js +209 -1
  90. package/lib/esm/ViewDefinition.js.map +1 -1
  91. package/lib/esm/ViewStateHydrator.js +3 -3
  92. package/lib/esm/ViewStateHydrator.js.map +1 -1
  93. package/lib/esm/internal/ElementLRUCache.d.ts +28 -0
  94. package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -0
  95. package/lib/esm/internal/ElementLRUCache.js +116 -0
  96. package/lib/esm/internal/ElementLRUCache.js.map +1 -0
  97. package/lib/esm/internal/Symbols.d.ts +1 -0
  98. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  99. package/lib/esm/internal/Symbols.js +1 -0
  100. package/lib/esm/internal/Symbols.js.map +1 -1
  101. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +2 -2
  102. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  103. package/lib/esm/test/ElementLRUCache.test.d.ts +2 -0
  104. package/lib/esm/test/ElementLRUCache.test.d.ts.map +1 -0
  105. package/lib/esm/test/ElementLRUCache.test.js +212 -0
  106. package/lib/esm/test/ElementLRUCache.test.js.map +1 -0
  107. package/lib/esm/test/ecdb/ECSqlQuery.test.js +0 -23
  108. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  109. package/lib/esm/test/imodel/IModel.test.js +22 -11
  110. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  111. package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
  112. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  113. package/lib/esm/test/standalone/TxnManager.test.js +1 -1
  114. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  115. package/package.json +12 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementLRUCache.test.js","sourceRoot":"","sources":["../../../src/test/ElementLRUCache.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from \"chai\";\nimport { CachedElement, ElementLRUCache } from \"../internal/ElementLRUCache\";\n\ndescribe('ElementLruCache', () => {\n const testElem1: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\"\n },\n }\n\n const testElem2: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId2\",\n model: \"testModel2\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\",\n value: \"testValue2\"\n },\n classFullName: \"testName2\"\n },\n }\n\n const testElem3: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId3\",\n model: \"testModel3\",\n code: {\n spec: \"testSpec3\",\n scope: \"testScope3\"\n },\n classFullName: \"testName3\"\n },\n }\n\n const testElemFedGuid: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testIdFed\",\n model: \"testModel\",\n code: {\n spec: \"testSpec\",\n scope: \"testScope\"\n },\n classFullName: \"testName\",\n federationGuid: \"testFedGuid\"\n },\n }\n\n const testElemCode: CachedElement = {\n loadOptions: {},\n elProps: {\n id: \"testId5\",\n model: \"testModel5\",\n code: {\n spec: \"testSpec2:testValue2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n const testElemNoId: CachedElement = {\n loadOptions: {},\n elProps: {\n id: undefined,\n model: \"testModel5\",\n code: {\n spec: \"testSpec2\",\n scope: \"testScope2\"\n },\n classFullName: \"testName5\",\n federationGuid: \"testFedGuid5\"\n },\n }\n\n it('should store and retrieve a valid element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n });\n\n it('should overwrite existing valid element', () => {\n const cache = new ElementLRUCache(3);\n const testElemModel = testElem1;\n cache.set(testElemModel);\n const retrievedElem = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemModel);\n\n testElemModel.elProps.model = \"newModel\";\n cache.set(testElemModel);\n const retrievedElem2 = cache.get({ id: testElemModel.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElemModel);\n });\n\n it('should store and retrieve a valid element by fedGuid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElemFedGuid);\n const retrievedElem = cache.get({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElemFedGuid);\n });\n\n it('should store and retrieve a valid element by code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n const retrievedElem = cache.get({ code: testElem1.elProps.code });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem1);\n\n cache.set(testElem2);\n const retrievedElem2 = cache.get({ code: testElem2.elProps.code });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem2);\n });\n\n it('should fail to store an element without id', () => {\n const cache = new ElementLRUCache(3);\n expect(() => cache.set(testElemNoId)).to.throw(Error, \"Element must have an id\");\n });\n\n it('should delete least used element', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n cache.set(testElemFedGuid);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.not.be.undefined;\n expect(retrievedElem).to.equal(testElem2);\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.be.undefined;\n\n const retrievedElem3 = cache.get({ id: testElem3.elProps.id });\n expect(retrievedElem3).to.not.be.undefined;\n expect(retrievedElem3).to.equal(testElem3);\n });\n\n it('should delete with id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ id: testElem2.elProps.id });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with federation guid', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElemFedGuid);\n expect(cache.size).to.equal(3);\n cache.delete({ federationGuid: testElemFedGuid.elProps.federationGuid });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElemFedGuid.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with code', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.delete({ code: testElem2.elProps.code });\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should delete with model id', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n cache.deleteWithModel(testElem2.elProps.model);\n expect(cache.size).to.equal(2);\n\n const retrievedElem = cache.get({ id: testElem2.elProps.id });\n expect(retrievedElem).to.be.undefined;\n\n const retrievedElem2 = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem2).to.not.be.undefined;\n expect(retrievedElem2).to.equal(testElem1);\n });\n\n it('should clear the cache', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem1);\n cache.set(testElem2);\n cache.set(testElem3);\n expect(cache.size).to.equal(3);\n\n cache.clear();\n expect(cache.size).to.equal(0);\n\n const retrievedElem = cache.get({ id: testElem1.elProps.id });\n expect(retrievedElem).to.be.undefined;\n });\n\n it('should not return wrong element when passed a manipulated code value', () => {\n const cache = new ElementLRUCache(3);\n cache.set(testElem2);\n expect(cache.size).to.equal(1);\n\n const retrievedElem = cache.get({ code: testElemCode.elProps.code });\n expect(retrievedElem).to.be.undefined;\n });\n});"]}
@@ -11,13 +11,6 @@ import { IModelTestUtils } from "../IModelTestUtils";
11
11
  import { SequentialLogMatcher } from "../SequentialLogMatcher";
12
12
  import * as path from "path";
13
13
  // cspell:ignore mirukuru ibim
14
- async function executeQuery(iModel, ecsql, bindings, abbreviateBlobs) {
15
- const rows = [];
16
- for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {
17
- rows.push(queryRow.toRow());
18
- }
19
- return rows;
20
- }
21
14
  describe("ECSql Query", () => {
22
15
  let imodel1;
23
16
  let imodel2;
@@ -445,22 +438,6 @@ describe("ECSql Query", () => {
445
438
  ConcurrentQuery.resetConfig(imodel1[_nativeDb]);
446
439
  }
447
440
  });
448
- // new new addon build
449
- it("ecsql with blob", async () => {
450
- let rows = await executeQuery(imodel1, "SELECT ECInstanceId,GeometryStream FROM bis.GeometricElement3d WHERE GeometryStream IS NOT NULL LIMIT 1");
451
- assert.equal(rows.length, 1);
452
- const row = rows[0];
453
- assert.isTrue(Id64.isValidId64(row.id));
454
- assert.isDefined(row.geometryStream);
455
- const geomStream = row.geometryStream;
456
- assert.isAtLeast(geomStream.byteLength, 1);
457
- rows = await executeQuery(imodel1, "SELECT 1 FROM bis.GeometricElement3d WHERE GeometryStream=?", [geomStream]);
458
- assert.equal(rows.length, 1);
459
- rows = await executeQuery(imodel1, "SELECT ECInstanceId,GeometryStream FROM bis.GeometricElement3d WHERE GeometryStream IS NOT NULL LIMIT 1", undefined, true);
460
- assert.equal(rows.length, 1);
461
- assert.isTrue(Id64.isValidId64(rows[0].id));
462
- assert.isDefined(rows[0].geometryStream);
463
- });
464
441
  it("check prepare logErrors flag", () => {
465
442
  const ecdb = imodel1;
466
443
  // expect log message when statement fails
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlQuery.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlQuery.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*--------------------------------------------------------------------------------------------*/\nimport { assert } from \"chai\";\nimport { DbResult, Id64 } from \"@itwin/core-bentley\";\nimport { DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, ECSqlReader, QueryBinder, QueryOptionsBuilder, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\nimport { _nativeDb, ECSqlStatement, IModelDb, SnapshotDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\nimport * as path from \"path\";\n\n// cspell:ignore mirukuru ibim\n\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\n const rows: any[] = [];\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\n rows.push(queryRow.toRow());\n }\n return rows;\n}\n\ndescribe(\"ECSql Query\", () => {\n let imodel1: SnapshotDb;\n let imodel2: SnapshotDb;\n let imodel3: SnapshotDb;\n let imodel4: SnapshotDb;\n let imodel5: SnapshotDb;\n let imodel6: SnapshotDb;\n\n before(async () => {\n\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n imodel2 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\n imodel4 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\n imodel5 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\n imodel6 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test_ec_4003.bim\"));\n });\n\n after(async () => {\n imodel1.close();\n imodel2.close();\n imodel3.close();\n imodel4.close();\n imodel5.close();\n imodel6.close();\n });\n it(\"verify 4.8.x format for ECClassId\", async () => {\n const queries = [\n \"SELECT ECClassId FROM Bis.Element LIMIT 1\",\n \"SELECT ECClassId aClassId FROM Bis.Element LIMIT 1\",\n \"SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\n \"SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n \"SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\n \"SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\n \"WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t\",\n \"SELECT * FROM (SELECT ECClassId FROM Bis.Element LIMIT 1)\",\n \"SELECT * FROM (SELECT ECClassId aClassId, ECClassId FROM Bis.Element LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t)\",\n ];\n assert.equal(queries.length, 18);\n const results = [\n { className: \"BisCore.DrawingCategory\" },\n { aClassId: \"0x4c\" },\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { aRelClassId: \"0xcf\" },\n { aClassId: \"0x4c\" },\n { aClassId: \"0x4c\" },\n { bClassId: \"0x4c\" },\n { className: \"BisCore.DrawingCategory\" },\n { aClassId: \"0x4c\", className: \"BisCore.DrawingCategory\" },\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { aRelClassId: \"0xcf\" },\n { aClassId: \"0x4c\" },\n { aClassId: \"0x4c\" },\n { bClassId: \"0x4c\" },\n ];\n assert.equal(results.length, 18);\n const builder = new QueryOptionsBuilder();\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\n let expectedRows = 0;\n for (let i = 0; i < queries.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel1.withPreparedStatement(queries[i], (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), results[i], `(ECSqlStatement) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n ++expectedRows;\n });\n for await (const row of imodel1.createQueryReader(queries[i], undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), results[i], `(ECSqlReader) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n ++expectedRows;\n }\n }\n assert.equal(expectedRows, 36);\n });\n it(\"verify return values for system properties\", async () => {\n /* eslint-disable @typescript-eslint/naming-convention */\n const testQueries = [\n //\n {\n query: \"SELECT a.ECInstanceId, b.ECInstanceId, a.ECClassId, b.ECClassId FROM BisCore.Element a, BisCore.Element b LIMIT 1\",\n result: {\n id: \"0x19\",\n id_1: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n className_1: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT Parent.Id,Parent.RelECClassId, Parent.Id myParentId, Parent.RelECClassId myParentRelClassId FROM BisCore.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n result: {\n \"myParentId\": \"0x1\",\n \"myParentRelClassId\": \"0xcf\",\n \"parent.id\": \"0x1\",\n \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\",\n },\n },\n {\n query: \"SELECT ECInstanceId, ECClassId FROM Bis.Element LIMIT 1\",\n result: {\n id: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId FROM Bis.Element) LIMIT 1\",\n result: {\n id: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n id: \"0x1\",\n className: \"BisCore.PartitionOriginatesFromRepository\",\n sourceId: \"0x1c\",\n sourceClassName: \"BisCore.PhysicalPartition\",\n targetId: \"0x12\",\n targetClassName: \"BisCore.RepositoryLink\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n id: \"0x1\",\n className: \"BisCore.PartitionOriginatesFromRepository\",\n sourceId: \"0x1c\",\n sourceClassName: \"BisCore.PhysicalPartition\",\n targetId: \"0x12\",\n targetClassName: \"BisCore.RepositoryLink\",\n },\n },\n {\n query: \"SELECT ECInstanceId a, ECClassId b FROM Bis.Element LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b FROM Bis.Element) LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT ECInstanceId A, ECClassId B FROM Bis.Element LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B FROM Bis.Element) LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT Model, Model.Id, Model.RelECClassId from Bis.Element limit 1\",\n result: {\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT Model, Model.Id, Model.RelECClassId from Bis.Element) LIMIT 1\",\n result: {\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId, r.ECClassId, r.SourceECInstanceId, r.SourceECClassId, r.TargetECInstanceid, r.TargetECClassId, ele.Model, ele.Model.Id, ele.Model.RelECClassId FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n \"id\": \"0x1\",\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\n \"sourceId\": \"0x1c\",\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\n \"targetId\": \"0x12\",\n \"targetClassName\": \"BisCore.RepositoryLink\",\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId, r.ECClassId, r.SourceECInstanceId, r.SourceECClassId, r.TargetECInstanceid, r.TargetECClassId, ele.Model, ele.Model.Id, ele.Model.RelECClassId FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n \"id\": \"0x1\",\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\n \"sourceId\": \"0x1c\",\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\n \"targetId\": \"0x12\",\n \"targetClassName\": \"BisCore.RepositoryLink\",\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId a, r.ECClassId b, r.SourceECInstanceId c, r.SourceECClassId d, r.TargetECInstanceid e, r.TargetECClassId f, ele.Model g, ele.Model.Id h, ele.Model.RelECClassId i FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId a, r.ECClassId b, r.SourceECInstanceId c, r.SourceECClassId d, r.TargetECInstanceid e, r.TargetECClassId f, ele.Model g, ele.Model.Id h, ele.Model.RelECClassId i FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId A, r.ECClassId B, r.SourceECInstanceId C, r.SourceECClassId D, r.TargetECInstanceid E, r.TargetECClassId F, ele.Model G, ele.Model.Id H, ele.Model.RelECClassId I FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId A, r.ECClassId B, r.SourceECInstanceId C, r.SourceECClassId D, r.TargetECInstanceid E, r.TargetECClassId F, ele.Model G, ele.Model.Id H, ele.Model.RelECClassId I FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n ];\n /* eslint-enable @typescript-eslint/naming-convention */\n const builder = new QueryOptionsBuilder();\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n builder.setConvertClassIdsToNames(true);\n // With ECDb Profile 4002\n for (const testQuery of testQueries) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel1.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n });\n\n let hasRow = false;\n for await (const row of imodel1.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n hasRow = true;\n }\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\n }\n // With ECDb Profile 4003\n for (const testQuery of testQueries) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel6.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n });\n let hasRow = false;\n for await (const row of imodel6.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n hasRow = true;\n }\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\n }\n });\n // new new addon build\n it(\"ecsql interrupt check\", async () => {\n let cancelled = 0;\n let successful = 0;\n let rowCount = 0;\n try {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { allowTestingArgs: true });\n const scheduleQuery = async () => {\n return new Promise<void>(async (resolve, reject) => {\n try {\n const options = new QueryOptionsBuilder();\n options.setTestingArgs({ interrupt: true });\n options.setDelay(1000);\n const reader = imodel1.createQueryReader(`\n WITH sequence(n) AS (\n SELECT 1\n UNION ALL\n SELECT n + 1 FROM sequence WHERE n < 10000\n )\n SELECT COUNT(*)\n FROM bis.SpatialIndex i, sequence s`, undefined, options.getOptions());\n while (await reader.step()) {\n rowCount++;\n }\n successful++;\n resolve();\n } catch (err: any) {\n // we expect query to be cancelled\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\n cancelled++;\n resolve();\n } else {\n reject(new Error(\"rejected\"));\n }\n }\n });\n };\n\n const queries = [];\n for (let i = 0; i < 100; i++) {\n queries.push(scheduleQuery());\n }\n\n await Promise.all(queries);\n // We expect at least one query to be cancelled\n assert.equal(successful, 100, \"success should be 100\");\n assert.equal(rowCount, 100, \"expect 100 rows\");\n assert.isAtLeast(cancelled, 0, \"should not have any cancelled query\");\n } finally {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\n }\n });\n // new new addon build\n it(\"ecsql with blob\", async () => {\n let rows = await executeQuery(imodel1, \"SELECT ECInstanceId,GeometryStream FROM bis.GeometricElement3d WHERE GeometryStream IS NOT NULL LIMIT 1\");\n assert.equal(rows.length, 1);\n const row: any = rows[0];\n\n assert.isTrue(Id64.isValidId64(row.id));\n\n assert.isDefined(row.geometryStream);\n const geomStream: Uint8Array = row.geometryStream;\n assert.isAtLeast(geomStream.byteLength, 1);\n\n rows = await executeQuery(imodel1, \"SELECT 1 FROM bis.GeometricElement3d WHERE GeometryStream=?\", [geomStream]);\n assert.equal(rows.length, 1);\n\n rows = await executeQuery(imodel1, \"SELECT ECInstanceId,GeometryStream FROM bis.GeometricElement3d WHERE GeometryStream IS NOT NULL LIMIT 1\", undefined, true);\n assert.equal(rows.length, 1);\n assert.isTrue(Id64.isValidId64(rows[0].id));\n assert.isDefined(rows[0].geometryStream);\n });\n it(\"check prepare logErrors flag\", () => {\n const ecdb = imodel1;\n // expect log message when statement fails\n let slm = new SequentialLogMatcher();\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }), \"no such table: def (BE_SQLITE_ERROR)\");\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\n\n // now pass suppress log error which mean we should not get the error\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ false), \"no such table: def (BE_SQLITE_ERROR)\");\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\n\n // expect log message when statement fails\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }), \"ECClass 'abc.def' does not exist or could not be loaded.\");\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\n\n // now pass suppress log error which mean we should not get the error\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ false), \"\");\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\n });\n it(\"restart query\", async () => {\n let cancelled = 0;\n let successful = 0;\n let rowCount = 0;\n try {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\n\n const scheduleQuery = async (delay: number) => {\n return new Promise<void>(async (resolve, reject) => {\n try {\n const options = new QueryOptionsBuilder();\n options.setDelay(delay);\n options.setRestartToken(\"tag\");\n const reader = imodel1.createQueryReader(\"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\", undefined, options.getOptions());\n while (await reader.step()) {\n rowCount++;\n }\n successful++;\n resolve();\n } catch (err: any) {\n // we expect query to be cancelled\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\n cancelled++;\n resolve();\n } else {\n reject(new Error(\"rejected\"));\n }\n }\n });\n };\n\n const queries = [];\n queries.push(scheduleQuery(5000));\n queries.push(scheduleQuery(0));\n\n await Promise.all(queries);\n // We expect at least one query to be cancelled\n assert.isAtLeast(cancelled, 1, \"cancelled should be at least 1\");\n assert.isAtLeast(successful, 1, \"successful should be at least 1\");\n assert.isAtLeast(rowCount, 1, \"rowCount should be at least 1\");\n } finally {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\n }\n });\n it(\"concurrent query should retry on timeout\", async () => {\n class MockECSqlReader extends ECSqlReader {\n public constructor(_executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, query: string) {\n super(_executor, query);\n }\n public async mockReadRows(queryRequest: DbQueryRequest): Promise<DbQueryResponse> {\n return super.runWithRetry(queryRequest);\n }\n }\n\n // Set time to 1 sec to simulate a timeout scenario\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\n const executor = {\n execute: async (req: DbQueryRequest) => {\n return ConcurrentQuery.executeQueryRequest(imodel1[_nativeDb], req);\n },\n };\n const request: DbQueryRequest = {\n kind: DbRequestKind.ECSql,\n query: \"SELECT * FROM BisCore.element\",\n delay: 5000, // Set delay to a value > timeout\n };\n try {\n await new MockECSqlReader(executor, request.query).mockReadRows(request);\n assert(false); // We expect this scenario to always throw\n } catch (error: any) {\n // Query should give up after max retry count has been reached\n assert(error.message === \"query too long to execute or server is too busy\");\n }\n });\n it(\"concurrent query use primary connection\", async () => {\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { usePrimaryConn: true });\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 46);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 46);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 1000);\n assert.isTrue(reader.stats.totalTime > 0);\n });\n it(\"concurrent query use idset\", async () => {\n const ids: string[] = [];\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids.push(row[0]);\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element WHERE InVirtualSet(?, ECInstanceId)\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 23);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 23);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 100);\n });\n it(\"concurrent query bind idset in IdSet virtual table\", async () => {\n const ids: string[] = [];\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids.push(row[0]);\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 23);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 23);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 100);\n });\n it(\"concurrent query bind single id in IdSet virtual table\", async () => {\n let ids: string = \"\";\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids = row[0]; // getting only the first id\n break;\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0; // backend will fail to bind so no rows will be returned\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 0);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 0);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n });\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\n\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0; // backend will bind successfully but some of the values are not valid for IdSet VT so those values will be ignored\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 1);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 1);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n });\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\n const ids: string[] = [\"ABC\", \"0x1\", \"YZ\"]; // as first value is not an Id so QueryBinder.from will throw error of \"unsupported type\"\n\n try {\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n } catch (err: any) {\n assert.equal(err.message, \"unsupported type\");\n }\n });\n it(\"concurrent query get meta data\", async () => {\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\");\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 46);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 46);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 1000);\n });\n it(\"concurrent query access string meta data\", async () => {\n let reader = imodel1.createQueryReader(\"SELECT e.ECClassId FROM bis.Element e\");\n let props: QueryPropertyMetaData[] = await reader.getMetaData();\n assert.equal(props.length, 1);\n assert.equal(props[0].accessString, \"ECClassId\");\n\n reader = imodel1.createQueryReader(\"SELECT Model.Id, e.Model.Id, Model.RelECClassId, e.Model.RelECClassId FROM bis.Element e\");\n props = await reader.getMetaData();\n assert.equal(props.length, 4);\n assert.equal(props[0].accessString, \"Model.Id\");\n assert.equal(props[1].accessString, \"Model.Id\");\n assert.equal(props[2].accessString, \"Model.RelECClassId\");\n assert.equal(props[3].accessString, \"Model.RelECClassId\");\n\n reader = imodel1.createQueryReader(\"SELECT Origin.X, Origin.Y, TypeDefinition FROM bis.GeometricElement2d ge\");\n props = await reader.getMetaData();\n assert.equal(props.length, 3);\n assert.equal(props[0].accessString, \"Origin.X\");\n assert.equal(props[1].accessString, \"Origin.Y\");\n assert.equal(props[2].accessString, \"TypeDefinition\");\n assert.equal(props[2].typeName, \"navigation\");\n\n reader = imodel1.createQueryReader(\"SELECT 1, 1 + 6, * FROM (VALUES(1,2), (2,3))\");\n props = await reader.getMetaData();\n assert.equal(props.length, 4);\n assert.equal(props[0].accessString, \"1\");\n assert.equal(props[0].jsonName, \"1\");\n assert.equal(props[1].accessString, \"1 + 6\");\n assert.equal(props[1].typeName, \"double\");\n assert.equal(props[2].accessString, \"1_1\");\n assert.equal(props[2].jsonName, \"1_1\");\n assert.equal(props[3].accessString, \"2\");\n });\n it(\"concurrent query quota\", async () => {\n let reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { count: 4 } });\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 4);\n reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { offset: 4, count: 4 } });\n rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 4);\n });\n it(\"paging results\", async () => {\n const getRowPerPage = (nPageSize: number, nRowCount: number) => {\n const nRowPerPage = nRowCount / nPageSize;\n const nPages = Math.ceil(nRowPerPage);\n const nRowOnLastPage = nRowCount - (Math.floor(nRowPerPage) * pageSize);\n const pages = new Array(nPages).fill(pageSize);\n if (nRowPerPage) {\n pages[nPages - 1] = nRowOnLastPage;\n }\n return pages;\n };\n\n const pageSize = 5;\n const query = \"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\";\n const dbs = [imodel1, imodel2, imodel3, imodel4, imodel5];\n const pendingRowCount = [];\n for (const db of dbs) {\n for await (const row of db.createQueryReader(`SELECT count(*) FROM (${query})`)) {\n pendingRowCount.push(row[0] as number);\n }\n }\n\n const rowCounts = await Promise.all(pendingRowCount);\n const expected = [46, 62, 7, 7, 28];\n assert.equal(rowCounts.length, expected.length);\n for (let i = 0; i < expected.length; i++) {\n assert.equal(rowCounts[i], expected[i]);\n }\n // verify row per page\n for (const db of dbs) {\n const i = dbs.indexOf(db);\n const rowPerPage = getRowPerPage(pageSize, expected[i]);\n for (let k = 0; k < rowPerPage.length; k++) {\n const rs = await db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames, limit: { count: pageSize, offset: k * pageSize } }).toArray();\n assert.equal(rs.length, rowPerPage[k]);\n }\n }\n\n // verify async iterator\n for (const db of dbs) {\n const resultSet = [];\n for await (const queryRow of db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n const row = queryRow.toRow();\n resultSet.push(row);\n assert.isTrue(Reflect.has(row, \"id\"));\n if (Reflect.ownKeys(row).length > 1) {\n assert.isTrue(Reflect.has(row, \"parentId\"));\n const parentId: string = row.parentId as string;\n assert.isTrue(Id64.isValidId64(parentId));\n }\n const id: string = row.id as string;\n assert.isTrue(Id64.isValidId64(id));\n }\n const entry = dbs.indexOf(db);\n assert.equal(rowCounts[entry], resultSet.length);\n }\n });\n});\n"]}
1
+ {"version":3,"file":"ECSqlQuery.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlQuery.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAsD,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAyB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7L,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAkB,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,8BAA8B;AAE9B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAmB,CAAC;IACxB,IAAI,OAAmB,CAAC;IACxB,IAAI,OAAmB,CAAC;IACxB,IAAI,OAAmB,CAAC;IACxB,IAAI,OAAmB,CAAC;IACxB,IAAI,OAAmB,CAAC;IAExB,MAAM,CAAC,KAAK,IAAI,EAAE;QAEhB,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5E,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC7F,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACzG,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACxG,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;QACjF,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG;YACd,2CAA2C;YAC3C,oDAAoD;YACpD,qEAAqE;YACrE,iFAAiF;YACjF,6EAA6E;YAC7E,6FAA6F;YAC7F,wFAAwF;YACxF,4FAA4F;YAC5F,iGAAiG;YACjG,2DAA2D;YAC3D,+EAA+E;YAC/E,oFAAoF;YACpF,iGAAiG;YACjG,4FAA4F;YAC5F,6GAA6G;YAC7G,wGAAwG;YACxG,4GAA4G;YAC5G,iHAAiH;SAClH,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG;YACd,EAAE,SAAS,EAAE,yBAAyB,EAAE;YACxC,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,sCAAsC,EAAE,EAAE;YAC/E,EAAE,qBAAqB,EAAE,sCAAsC,EAAE;YACjE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,sCAAsC,EAAE,EAAE;YAChF,EAAE,WAAW,EAAE,MAAM,EAAE;YACvB,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,SAAS,EAAE,yBAAyB,EAAE;YACxC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,yBAAyB,EAAE;YAC1D,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,sCAAsC,EAAE,EAAE;YAC/E,EAAE,qBAAqB,EAAE,sCAAsC,EAAE;YACjE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,sCAAsC,EAAE,EAAE;YAChF,EAAE,WAAW,EAAE,MAAM,EAAE;YACvB,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpB,EAAE,QAAQ,EAAE,MAAM,EAAE;SACrB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACxD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,4DAA4D;YAC5D,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAoB,EAAE,EAAE;gBACjE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;gBACrF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,qBAAqB,OAAO,CAAC,CAAC,CAAC,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;gBACpK,EAAE,YAAY,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;gBAC/F,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB,OAAO,CAAC,CAAC,CAAC,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC/J,EAAE,YAAY,CAAC;YACjB,CAAC;QACH,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,0DAA0D;QAC1D,MAAM,WAAW,GAAG;YAClB,EAAE;YACF;gBACE,KAAK,EAAE,mHAAmH;gBAC1H,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,MAAM;oBACZ,SAAS,EAAE,yBAAyB;oBACpC,WAAW,EAAE,yBAAyB;iBACvC;aACF;YACD;gBACE,KAAK,EAAE,6JAA6J;gBACpK,MAAM,EAAE;oBACN,YAAY,EAAE,KAAK;oBACnB,oBAAoB,EAAE,MAAM;oBAC5B,WAAW,EAAE,KAAK;oBAClB,qBAAqB,EAAE,sCAAsC;iBAC9D;aACF;YACD;gBACE,KAAK,EAAE,yDAAyD;gBAChE,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;oBACV,SAAS,EAAE,yBAAyB;iBACrC;aACF;YACD;gBACE,KAAK,EAAE,yEAAyE;gBAChF,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;oBACV,SAAS,EAAE,yBAAyB;iBACrC;aACF;YACD;gBACE,KAAK,EAAE,mJAAmJ;gBAC1J,MAAM,EAAE;oBACN,EAAE,EAAE,KAAK;oBACT,SAAS,EAAE,2CAA2C;oBACtD,QAAQ,EAAE,MAAM;oBAChB,eAAe,EAAE,2BAA2B;oBAC5C,QAAQ,EAAE,MAAM;oBAChB,eAAe,EAAE,wBAAwB;iBAC1C;aACF;YACD;gBACE,KAAK,EAAE,mKAAmK;gBAC1K,MAAM,EAAE;oBACN,EAAE,EAAE,KAAK;oBACT,SAAS,EAAE,2CAA2C;oBACtD,QAAQ,EAAE,MAAM;oBAChB,eAAe,EAAE,2BAA2B;oBAC5C,QAAQ,EAAE,MAAM;oBAChB,eAAe,EAAE,wBAAwB;iBAC1C;aACF;YACD;gBACE,KAAK,EAAE,6DAA6D;gBACpE,MAAM,EAAE;oBACN,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,6EAA6E;gBACpF,MAAM,EAAE;oBACN,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,6DAA6D;gBACpE,MAAM,EAAE;oBACN,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,6EAA6E;gBACpF,MAAM,EAAE;oBACN,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,+JAA+J;gBACtK,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,+KAA+K;gBACtL,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,+JAA+J;gBACtK,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,+KAA+K;gBACtL,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,qEAAqE;gBAC5E,MAAM,EAAE;oBACN,OAAO,EAAE;wBACP,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,UAAU,EAAE,KAAK;oBACjB,oBAAoB,EAAE,+BAA+B;iBACtD;aACF;YACD;gBACE,KAAK,EAAE,qFAAqF;gBAC5F,MAAM,EAAE;oBACN,OAAO,EAAE;wBACP,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,UAAU,EAAE,KAAK;oBACjB,oBAAoB,EAAE,+BAA+B;iBACtD;aACF;YACD;gBACE,KAAK,EAAE,kRAAkR;gBACzR,MAAM,EAAE;oBACN,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,2CAA2C;oBACxD,UAAU,EAAE,MAAM;oBAClB,iBAAiB,EAAE,2BAA2B;oBAC9C,UAAU,EAAE,MAAM;oBAClB,iBAAiB,EAAE,wBAAwB;oBAC3C,OAAO,EAAE;wBACP,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,UAAU,EAAE,KAAK;oBACjB,oBAAoB,EAAE,+BAA+B;iBACtD;aACF;YACD;gBACE,KAAK,EAAE,kSAAkS;gBACzS,MAAM,EAAE;oBACN,IAAI,EAAE,KAAK;oBACX,WAAW,EAAE,2CAA2C;oBACxD,UAAU,EAAE,MAAM;oBAClB,iBAAiB,EAAE,2BAA2B;oBAC9C,UAAU,EAAE,MAAM;oBAClB,iBAAiB,EAAE,wBAAwB;oBAC3C,OAAO,EAAE;wBACP,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,UAAU,EAAE,KAAK;oBACjB,oBAAoB,EAAE,+BAA+B;iBACtD;aACF;YACD;gBACE,KAAK,EAAE,oSAAoS;gBAC3S,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE;wBACD,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,oTAAoT;gBAC3T,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE;wBACD,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,oSAAoS;gBAC3S,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE;wBACD,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;iBACV;aACF;YACD;gBACE,KAAK,EAAE,oTAAoT;gBAC3T,MAAM,EAAE;oBACN,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE,MAAM;oBACT,CAAC,EAAE;wBACD,EAAE,EAAE,KAAK;wBACT,YAAY,EAAE,+BAA+B;qBAC9C;oBACD,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE,MAAM;iBACV;aACF;SACF,CAAC;QACF,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACxD,4DAA4D;QAC5D,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QACxC,yBAAyB;QACzB,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,4DAA4D;YAC5D,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAoB,EAAE,EAAE;gBACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;gBACrF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,qBAAqB,SAAS,CAAC,KAAK,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;YACjL,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;gBACpG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,kBAAkB,SAAS,CAAC,KAAK,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1K,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;QACtE,CAAC;QACD,yBAAyB;QACzB,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,4DAA4D;YAC5D,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAoB,EAAE,EAAE;gBACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,iCAAiC,CAAC,CAAC;gBACrF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,qBAAqB,SAAS,CAAC,KAAK,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;YACjL,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,GAAG,KAAK,CAAC;YACnB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;gBACpG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,kBAAkB,SAAS,CAAC,KAAK,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC1K,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,sBAAsB;IACtB,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;gBAC/B,OAAO,IAAI,OAAO,CAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;oBACjD,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;wBAC1C,OAAO,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;;;;;;;kDAOH,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;wBACzE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;4BAC3B,QAAQ,EAAE,CAAC;wBACb,CAAC;wBACD,UAAU,EAAE,CAAC;wBACb,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAClB,kCAAkC;wBAClC,IAAI,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,mBAAmB,EAAE,CAAC;4BACrD,SAAS,EAAE,CAAC;4BACZ,OAAO,EAAE,CAAC;wBACZ,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;YAChC,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,+CAA+C;YAC/C,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,uBAAuB,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,qCAAqC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC;QACrB,0CAA0C;QAC1C,IAAI,GAAG,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC;QACvI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;QACvH,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAEtE,qEAAqE;QACrE,GAAG,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC;QACvI,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,sCAAsC,CAAC,CAAC;QAChJ,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,kCAAkC,CAAC,CAAC;QAE3E,0CAA0C;QAC1C,GAAG,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;QAC1G,4DAA4D;QAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,0DAA0D,CAAC,CAAC;QACjJ,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAEtE,qEAAqE;QACrE,GAAG,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;QAC1G,4DAA4D;QAC5D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAClH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,kCAAkC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAElG,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;gBAC5C,OAAO,IAAI,OAAO,CAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;oBACjD,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;wBAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;wBACxB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;wBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,uEAAuE,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;wBACnJ,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;4BAC3B,QAAQ,EAAE,CAAC;wBACb,CAAC;wBACD,UAAU,EAAE,CAAC;wBACb,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAClB,kCAAkC;wBAClC,IAAI,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,mBAAmB,EAAE,CAAC;4BACrD,SAAS,EAAE,CAAC;4BACZ,OAAO,EAAE,CAAC;wBACZ,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;wBAChC,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/B,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,+CAA+C;YAC/C,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;YACjE,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;YACnE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;QACjE,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7C,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,eAAgB,SAAQ,WAAW;YACvC,YAAmB,SAA6D,EAAE,KAAa;gBAC7F,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1B,CAAC;YACM,KAAK,CAAC,YAAY,CAAC,YAA4B;gBACpD,OAAO,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC1C,CAAC;SACF;QAED,mDAAmD;QACnD,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAClG,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE,KAAK,EAAE,GAAmB,EAAE,EAAE;gBACrC,OAAO,eAAe,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC;SACF,CAAC;QACF,MAAM,OAAO,GAAmB;YAC9B,IAAI,EAAE,aAAa,CAAC,KAAK;YACzB,KAAK,EAAE,+BAA+B;YACtC,KAAK,EAAE,IAAI,EAAG,iCAAiC;SAChD,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,0CAA0C;QAC5D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,iDAAiD,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,+BAA+B,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/G,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,mDAAmD,CAAC,EAAE,CAAC;YACvG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,mEAAmE,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvI,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,mDAAmD,CAAC,EAAE,CAAC;YACvG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,2GAA2G,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/K,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,IAAI,GAAG,GAAW,EAAE,CAAC;QACrB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,mDAAmD,CAAC,EAAE,CAAC;YACvG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;YAC1C,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,2GAA2G,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/K,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,wDAAwD;QACtE,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,GAAG,GAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,2GAA2G,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/K,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,mHAAmH;QACjI,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yCAAyC;QACzE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,GAAG,GAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,yFAAyF;QAErI,IAAI,CAAC;YACH,OAAO,CAAC,iBAAiB,CAAC,2GAA2G,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClK,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;QAC1E,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,IAAI,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,uCAAuC,CAAC,CAAC;QAChF,IAAI,KAAK,GAA4B,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEjD,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,0FAA0F,CAAC,CAAC;QAC/H,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;QAE1D,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,0EAA0E,CAAC,CAAC;QAC/G,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,8CAA8C,CAAC,CAAC;QACnF,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,IAAI,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,+BAA+B,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5G,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,+BAA+B,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnH,IAAI,GAAG,CAAC,CAAC;QACT,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;YAC7D,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,cAAc,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC;YACrC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,uEAAuE,CAAC;QACtF,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,iBAAiB,CAAC,yBAAyB,KAAK,GAAG,CAAC,EAAE,CAAC;gBAChF,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAW,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,sBAAsB;QACtB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,kBAAkB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBACtK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC;gBACtH,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;gBACtC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAW,GAAG,CAAC,QAAkB,CAAC;oBAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,EAAE,GAAW,GAAG,CAAC,EAAY,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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 { assert } from \"chai\";\nimport { DbResult, Id64 } from \"@itwin/core-bentley\";\nimport { DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, ECSqlReader, QueryBinder, QueryOptionsBuilder, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\nimport { _nativeDb, ECSqlStatement, SnapshotDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\nimport * as path from \"path\";\n\n// cspell:ignore mirukuru ibim\n\ndescribe(\"ECSql Query\", () => {\n let imodel1: SnapshotDb;\n let imodel2: SnapshotDb;\n let imodel3: SnapshotDb;\n let imodel4: SnapshotDb;\n let imodel5: SnapshotDb;\n let imodel6: SnapshotDb;\n\n before(async () => {\n\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n imodel2 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\n imodel4 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\n imodel5 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\n imodel6 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test_ec_4003.bim\"));\n });\n\n after(async () => {\n imodel1.close();\n imodel2.close();\n imodel3.close();\n imodel4.close();\n imodel5.close();\n imodel6.close();\n });\n it(\"verify 4.8.x format for ECClassId\", async () => {\n const queries = [\n \"SELECT ECClassId FROM Bis.Element LIMIT 1\",\n \"SELECT ECClassId aClassId FROM Bis.Element LIMIT 1\",\n \"SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\n \"SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n \"SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\n \"SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\n \"WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t\",\n \"SELECT * FROM (SELECT ECClassId FROM Bis.Element LIMIT 1)\",\n \"SELECT * FROM (SELECT ECClassId aClassId, ECClassId FROM Bis.Element LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t)\",\n ];\n assert.equal(queries.length, 18);\n const results = [\n { className: \"BisCore.DrawingCategory\" },\n { aClassId: \"0x4c\" },\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { aRelClassId: \"0xcf\" },\n { aClassId: \"0x4c\" },\n { aClassId: \"0x4c\" },\n { bClassId: \"0x4c\" },\n { className: \"BisCore.DrawingCategory\" },\n { aClassId: \"0x4c\", className: \"BisCore.DrawingCategory\" },\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\n { aRelClassId: \"0xcf\" },\n { aClassId: \"0x4c\" },\n { aClassId: \"0x4c\" },\n { bClassId: \"0x4c\" },\n ];\n assert.equal(results.length, 18);\n const builder = new QueryOptionsBuilder();\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\n let expectedRows = 0;\n for (let i = 0; i < queries.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel1.withPreparedStatement(queries[i], (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), results[i], `(ECSqlStatement) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n ++expectedRows;\n });\n for await (const row of imodel1.createQueryReader(queries[i], undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), results[i], `(ECSqlReader) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n ++expectedRows;\n }\n }\n assert.equal(expectedRows, 36);\n });\n it(\"verify return values for system properties\", async () => {\n /* eslint-disable @typescript-eslint/naming-convention */\n const testQueries = [\n //\n {\n query: \"SELECT a.ECInstanceId, b.ECInstanceId, a.ECClassId, b.ECClassId FROM BisCore.Element a, BisCore.Element b LIMIT 1\",\n result: {\n id: \"0x19\",\n id_1: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n className_1: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT Parent.Id,Parent.RelECClassId, Parent.Id myParentId, Parent.RelECClassId myParentRelClassId FROM BisCore.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\n result: {\n \"myParentId\": \"0x1\",\n \"myParentRelClassId\": \"0xcf\",\n \"parent.id\": \"0x1\",\n \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\",\n },\n },\n {\n query: \"SELECT ECInstanceId, ECClassId FROM Bis.Element LIMIT 1\",\n result: {\n id: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId FROM Bis.Element) LIMIT 1\",\n result: {\n id: \"0x19\",\n className: \"BisCore.DrawingCategory\",\n },\n },\n {\n query: \"SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n id: \"0x1\",\n className: \"BisCore.PartitionOriginatesFromRepository\",\n sourceId: \"0x1c\",\n sourceClassName: \"BisCore.PhysicalPartition\",\n targetId: \"0x12\",\n targetClassName: \"BisCore.RepositoryLink\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n id: \"0x1\",\n className: \"BisCore.PartitionOriginatesFromRepository\",\n sourceId: \"0x1c\",\n sourceClassName: \"BisCore.PhysicalPartition\",\n targetId: \"0x12\",\n targetClassName: \"BisCore.RepositoryLink\",\n },\n },\n {\n query: \"SELECT ECInstanceId a, ECClassId b FROM Bis.Element LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b FROM Bis.Element) LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT ECInstanceId A, ECClassId B FROM Bis.Element LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B FROM Bis.Element) LIMIT 1\",\n result: {\n a: \"0x19\",\n b: \"0x4c\",\n },\n },\n {\n query: \"SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n },\n },\n {\n query: \"SELECT Model, Model.Id, Model.RelECClassId from Bis.Element limit 1\",\n result: {\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT Model, Model.Id, Model.RelECClassId from Bis.Element) LIMIT 1\",\n result: {\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId, r.ECClassId, r.SourceECInstanceId, r.SourceECClassId, r.TargetECInstanceid, r.TargetECClassId, ele.Model, ele.Model.Id, ele.Model.RelECClassId FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n \"id\": \"0x1\",\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\n \"sourceId\": \"0x1c\",\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\n \"targetId\": \"0x12\",\n \"targetClassName\": \"BisCore.RepositoryLink\",\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId, r.ECClassId, r.SourceECInstanceId, r.SourceECClassId, r.TargetECInstanceid, r.TargetECClassId, ele.Model, ele.Model.Id, ele.Model.RelECClassId FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n \"id\": \"0x1\",\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\n \"sourceId\": \"0x1c\",\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\n \"targetId\": \"0x12\",\n \"targetClassName\": \"BisCore.RepositoryLink\",\n \"model\": {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n \"model.id\": \"0x1\",\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId a, r.ECClassId b, r.SourceECInstanceId c, r.SourceECClassId d, r.TargetECInstanceid e, r.TargetECClassId f, ele.Model g, ele.Model.Id h, ele.Model.RelECClassId i FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId a, r.ECClassId b, r.SourceECInstanceId c, r.SourceECClassId d, r.TargetECInstanceid e, r.TargetECClassId f, ele.Model g, ele.Model.Id h, ele.Model.RelECClassId i FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT r.ECInstanceId A, r.ECClassId B, r.SourceECInstanceId C, r.SourceECClassId D, r.TargetECInstanceid E, r.TargetECClassId F, ele.Model G, ele.Model.Id H, ele.Model.RelECClassId I FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n {\n query: \"SELECT * FROM (SELECT r.ECInstanceId A, r.ECClassId B, r.SourceECInstanceId C, r.SourceECClassId D, r.TargetECInstanceid E, r.TargetECClassId F, ele.Model G, ele.Model.Id H, ele.Model.RelECClassId I FROM Bis.ElementRefersToElements r JOIN Bis.Element ele ON ele.ECInstanceId = r.SourceECInstanceId) LIMIT 1\",\n result: {\n a: \"0x1\",\n b: \"0xa8\",\n c: \"0x1c\",\n d: \"0xb4\",\n e: \"0x12\",\n f: \"0xa9\",\n g: {\n id: \"0x1\",\n relClassName: \"BisCore.ModelContainsElements\",\n },\n h: \"0x1\",\n i: \"0x40\",\n },\n },\n ];\n /* eslint-enable @typescript-eslint/naming-convention */\n const builder = new QueryOptionsBuilder();\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n builder.setConvertClassIdsToNames(true);\n // With ECDb Profile 4002\n for (const testQuery of testQueries) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel1.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n });\n\n let hasRow = false;\n for await (const row of imodel1.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n hasRow = true;\n }\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\n }\n // With ECDb Profile 4003\n for (const testQuery of testQueries) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n imodel6.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n });\n let hasRow = false;\n for await (const row of imodel6.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\n hasRow = true;\n }\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\n }\n });\n // new new addon build\n it(\"ecsql interrupt check\", async () => {\n let cancelled = 0;\n let successful = 0;\n let rowCount = 0;\n try {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { allowTestingArgs: true });\n const scheduleQuery = async () => {\n return new Promise<void>(async (resolve, reject) => {\n try {\n const options = new QueryOptionsBuilder();\n options.setTestingArgs({ interrupt: true });\n options.setDelay(1000);\n const reader = imodel1.createQueryReader(`\n WITH sequence(n) AS (\n SELECT 1\n UNION ALL\n SELECT n + 1 FROM sequence WHERE n < 10000\n )\n SELECT COUNT(*)\n FROM bis.SpatialIndex i, sequence s`, undefined, options.getOptions());\n while (await reader.step()) {\n rowCount++;\n }\n successful++;\n resolve();\n } catch (err: any) {\n // we expect query to be cancelled\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\n cancelled++;\n resolve();\n } else {\n reject(new Error(\"rejected\"));\n }\n }\n });\n };\n\n const queries = [];\n for (let i = 0; i < 100; i++) {\n queries.push(scheduleQuery());\n }\n\n await Promise.all(queries);\n // We expect at least one query to be cancelled\n assert.equal(successful, 100, \"success should be 100\");\n assert.equal(rowCount, 100, \"expect 100 rows\");\n assert.isAtLeast(cancelled, 0, \"should not have any cancelled query\");\n } finally {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\n }\n });\n it(\"check prepare logErrors flag\", () => {\n const ecdb = imodel1;\n // expect log message when statement fails\n let slm = new SequentialLogMatcher();\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }), \"no such table: def (BE_SQLITE_ERROR)\");\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\n\n // now pass suppress log error which mean we should not get the error\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ false), \"no such table: def (BE_SQLITE_ERROR)\");\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\n\n // expect log message when statement fails\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }), \"ECClass 'abc.def' does not exist or could not be loaded.\");\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\n\n // now pass suppress log error which mean we should not get the error\n slm = new SequentialLogMatcher();\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ false), \"\");\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\n });\n it(\"restart query\", async () => {\n let cancelled = 0;\n let successful = 0;\n let rowCount = 0;\n try {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\n\n const scheduleQuery = async (delay: number) => {\n return new Promise<void>(async (resolve, reject) => {\n try {\n const options = new QueryOptionsBuilder();\n options.setDelay(delay);\n options.setRestartToken(\"tag\");\n const reader = imodel1.createQueryReader(\"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\", undefined, options.getOptions());\n while (await reader.step()) {\n rowCount++;\n }\n successful++;\n resolve();\n } catch (err: any) {\n // we expect query to be cancelled\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\n cancelled++;\n resolve();\n } else {\n reject(new Error(\"rejected\"));\n }\n }\n });\n };\n\n const queries = [];\n queries.push(scheduleQuery(5000));\n queries.push(scheduleQuery(0));\n\n await Promise.all(queries);\n // We expect at least one query to be cancelled\n assert.isAtLeast(cancelled, 1, \"cancelled should be at least 1\");\n assert.isAtLeast(successful, 1, \"successful should be at least 1\");\n assert.isAtLeast(rowCount, 1, \"rowCount should be at least 1\");\n } finally {\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\n }\n });\n it(\"concurrent query should retry on timeout\", async () => {\n class MockECSqlReader extends ECSqlReader {\n public constructor(_executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, query: string) {\n super(_executor, query);\n }\n public async mockReadRows(queryRequest: DbQueryRequest): Promise<DbQueryResponse> {\n return super.runWithRetry(queryRequest);\n }\n }\n\n // Set time to 1 sec to simulate a timeout scenario\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\n const executor = {\n execute: async (req: DbQueryRequest) => {\n return ConcurrentQuery.executeQueryRequest(imodel1[_nativeDb], req);\n },\n };\n const request: DbQueryRequest = {\n kind: DbRequestKind.ECSql,\n query: \"SELECT * FROM BisCore.element\",\n delay: 5000, // Set delay to a value > timeout\n };\n try {\n await new MockECSqlReader(executor, request.query).mockReadRows(request);\n assert(false); // We expect this scenario to always throw\n } catch (error: any) {\n // Query should give up after max retry count has been reached\n assert(error.message === \"query too long to execute or server is too busy\");\n }\n });\n it(\"concurrent query use primary connection\", async () => {\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { usePrimaryConn: true });\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 46);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 46);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 1000);\n assert.isTrue(reader.stats.totalTime > 0);\n });\n it(\"concurrent query use idset\", async () => {\n const ids: string[] = [];\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids.push(row[0]);\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element WHERE InVirtualSet(?, ECInstanceId)\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 23);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 23);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 100);\n });\n it(\"concurrent query bind idset in IdSet virtual table\", async () => {\n const ids: string[] = [];\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids.push(row[0]);\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 23);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 23);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 100);\n });\n it(\"concurrent query bind single id in IdSet virtual table\", async () => {\n let ids: string = \"\";\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\n ids = row[0]; // getting only the first id\n break;\n }\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0; // backend will fail to bind so no rows will be returned\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 0);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 0);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n });\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\n\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n let props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n let rows = 0; // backend will bind successfully but some of the values are not valid for IdSet VT so those values will be ignored\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 1);\n props = await reader.getMetaData();\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\n assert.equal(reader.stats.backendRowsReturned, 1);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n });\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\n const ids: string[] = [\"ABC\", \"0x1\", \"YZ\"]; // as first value is not an Id so QueryBinder.from will throw error of \"unsupported type\"\n\n try {\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\n } catch (err: any) {\n assert.equal(err.message, \"unsupported type\");\n }\n });\n it(\"concurrent query get meta data\", async () => {\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\");\n let props = await reader.getMetaData();\n assert.equal(props.length, 11);\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 46);\n props = await reader.getMetaData();\n assert.equal(props.length, 11);\n assert.equal(reader.stats.backendRowsReturned, 46);\n assert.isTrue(reader.stats.backendCpuTime > 0);\n assert.isTrue(reader.stats.backendMemUsed > 1000);\n });\n it(\"concurrent query access string meta data\", async () => {\n let reader = imodel1.createQueryReader(\"SELECT e.ECClassId FROM bis.Element e\");\n let props: QueryPropertyMetaData[] = await reader.getMetaData();\n assert.equal(props.length, 1);\n assert.equal(props[0].accessString, \"ECClassId\");\n\n reader = imodel1.createQueryReader(\"SELECT Model.Id, e.Model.Id, Model.RelECClassId, e.Model.RelECClassId FROM bis.Element e\");\n props = await reader.getMetaData();\n assert.equal(props.length, 4);\n assert.equal(props[0].accessString, \"Model.Id\");\n assert.equal(props[1].accessString, \"Model.Id\");\n assert.equal(props[2].accessString, \"Model.RelECClassId\");\n assert.equal(props[3].accessString, \"Model.RelECClassId\");\n\n reader = imodel1.createQueryReader(\"SELECT Origin.X, Origin.Y, TypeDefinition FROM bis.GeometricElement2d ge\");\n props = await reader.getMetaData();\n assert.equal(props.length, 3);\n assert.equal(props[0].accessString, \"Origin.X\");\n assert.equal(props[1].accessString, \"Origin.Y\");\n assert.equal(props[2].accessString, \"TypeDefinition\");\n assert.equal(props[2].typeName, \"navigation\");\n\n reader = imodel1.createQueryReader(\"SELECT 1, 1 + 6, * FROM (VALUES(1,2), (2,3))\");\n props = await reader.getMetaData();\n assert.equal(props.length, 4);\n assert.equal(props[0].accessString, \"1\");\n assert.equal(props[0].jsonName, \"1\");\n assert.equal(props[1].accessString, \"1 + 6\");\n assert.equal(props[1].typeName, \"double\");\n assert.equal(props[2].accessString, \"1_1\");\n assert.equal(props[2].jsonName, \"1_1\");\n assert.equal(props[3].accessString, \"2\");\n });\n it(\"concurrent query quota\", async () => {\n let reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { count: 4 } });\n let rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 4);\n reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { offset: 4, count: 4 } });\n rows = 0;\n while (await reader.step()) {\n rows++;\n }\n assert.equal(rows, 4);\n });\n it(\"paging results\", async () => {\n const getRowPerPage = (nPageSize: number, nRowCount: number) => {\n const nRowPerPage = nRowCount / nPageSize;\n const nPages = Math.ceil(nRowPerPage);\n const nRowOnLastPage = nRowCount - (Math.floor(nRowPerPage) * pageSize);\n const pages = new Array(nPages).fill(pageSize);\n if (nRowPerPage) {\n pages[nPages - 1] = nRowOnLastPage;\n }\n return pages;\n };\n\n const pageSize = 5;\n const query = \"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\";\n const dbs = [imodel1, imodel2, imodel3, imodel4, imodel5];\n const pendingRowCount = [];\n for (const db of dbs) {\n for await (const row of db.createQueryReader(`SELECT count(*) FROM (${query})`)) {\n pendingRowCount.push(row[0] as number);\n }\n }\n\n const rowCounts = await Promise.all(pendingRowCount);\n const expected = [46, 62, 7, 7, 28];\n assert.equal(rowCounts.length, expected.length);\n for (let i = 0; i < expected.length; i++) {\n assert.equal(rowCounts[i], expected[i]);\n }\n // verify row per page\n for (const db of dbs) {\n const i = dbs.indexOf(db);\n const rowPerPage = getRowPerPage(pageSize, expected[i]);\n for (let k = 0; k < rowPerPage.length; k++) {\n const rs = await db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames, limit: { count: pageSize, offset: k * pageSize } }).toArray();\n assert.equal(rs.length, rowPerPage[k]);\n }\n }\n\n // verify async iterator\n for (const db of dbs) {\n const resultSet = [];\n for await (const queryRow of db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n const row = queryRow.toRow();\n resultSet.push(row);\n assert.isTrue(Reflect.has(row, \"id\"));\n if (Reflect.ownKeys(row).length > 1) {\n assert.isTrue(Reflect.has(row, \"parentId\"));\n const parentId: string = row.parentId as string;\n assert.isTrue(Id64.isValidId64(parentId));\n }\n const id: string = row.id as string;\n assert.isTrue(Id64.isValidId64(id));\n }\n const entry = dbs.indexOf(db);\n assert.equal(rowCounts[entry], resultSet.length);\n }\n });\n});\n"]}
@@ -87,7 +87,17 @@ function expectIModelError(expectedErrorNumber, error) {
87
87
  expect(error).instanceof(IModelError);
88
88
  expect(error.errorNumber).to.equal(expectedErrorNumber);
89
89
  }
90
+ async function generateTestSnapshot(targetFileName, seedAssetName) {
91
+ const seedFile = IModelTestUtils.resolveAssetFile(seedAssetName);
92
+ const snapshotFile = IModelTestUtils.prepareOutputFile("IModel", targetFileName);
93
+ const imodel = IModelTestUtils.createSnapshotFromSeed(snapshotFile, seedFile);
94
+ const schemaPathname = path.join(KnownTestLocations.assetsDir, "TestBim.ecschema.xml");
95
+ await imodel.importSchemas([schemaPathname]); // will throw an exception if import fails
96
+ imodel.saveChanges();
97
+ return imodel;
98
+ }
90
99
  describe("iModel", () => {
100
+ //TODO: These imodels are used and modified across multiple tests. This is not a good practice and should be refactored.
91
101
  let imodel1;
92
102
  let imodel2;
93
103
  let imodel3;
@@ -97,13 +107,11 @@ describe("iModel", () => {
97
107
  before(async () => {
98
108
  originalEnv = { ...process.env };
99
109
  IModelTestUtils.registerTestBimSchema();
100
- imodel1 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile("IModel", "test.bim"), IModelTestUtils.resolveAssetFile("test.bim"));
110
+ imodel1 = await generateTestSnapshot("test.bim", "test.bim");
101
111
  imodel2 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile("IModel", "CompatibilityTestSeed.bim"), IModelTestUtils.resolveAssetFile("CompatibilityTestSeed.bim"));
102
112
  imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile("GetSetAutoHandledStructProperties.bim"));
103
113
  imodel4 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile("IModel", "GetSetAutoHandledArrayProperties.bim"), IModelTestUtils.resolveAssetFile("GetSetAutoHandledArrayProperties.bim"));
104
114
  imodel5 = IModelTestUtils.createSnapshotFromSeed(IModelTestUtils.prepareOutputFile("IModel", "mirukuru.ibim"), IModelTestUtils.resolveAssetFile("mirukuru.ibim"));
105
- const schemaPathname = path.join(KnownTestLocations.assetsDir, "TestBim.ecschema.xml");
106
- await imodel1.importSchemas([schemaPathname]); // will throw an exception if import fails
107
115
  });
108
116
  after(() => {
109
117
  process.env = originalEnv;
@@ -1984,6 +1992,7 @@ describe("iModel", () => {
1984
1992
  getCurrentChangeset: () => changeset,
1985
1993
  setIModelDb: () => { },
1986
1994
  closeFile: () => { },
1995
+ clearECDbCache: () => { },
1987
1996
  };
1988
1997
  const errorLogStub = sinon.stub(Logger, "logError").callsFake(() => { });
1989
1998
  const infoLogStub = sinon.stub(Logger, "logInfo").callsFake(() => { });
@@ -2104,14 +2113,15 @@ describe("iModel", () => {
2104
2113
  standaloneDb1.close();
2105
2114
  assert.isUndefined(StandaloneDb.tryFindByKey(standaloneDb1.key));
2106
2115
  });
2107
- it("Snapshot iModel properties", () => {
2116
+ it("Snapshot iModel properties", async () => {
2108
2117
  const snapshotRootSubjectName = "Snapshot";
2109
2118
  const snapshotFile1 = IModelTestUtils.prepareOutputFile("IModel", "Snapshot1.bim");
2110
2119
  const snapshotFile2 = IModelTestUtils.prepareOutputFile("IModel", "Snapshot2.bim");
2111
2120
  const snapshotFile3 = IModelTestUtils.prepareOutputFile("IModel", "Snapshot3.bim");
2121
+ const imodel = await generateTestSnapshot("test_for_snapshot.bim", "test.bim");
2112
2122
  let snapshotDb1 = SnapshotDb.createEmpty(snapshotFile1, { rootSubject: { name: snapshotRootSubjectName }, createClassViews: true });
2113
2123
  let snapshotDb2 = SnapshotDb.createFrom(snapshotDb1, snapshotFile2);
2114
- let snapshotDb3 = SnapshotDb.createFrom(imodel1, snapshotFile3, { createClassViews: true });
2124
+ let snapshotDb3 = SnapshotDb.createFrom(imodel, snapshotFile3, { createClassViews: true });
2115
2125
  assert.isTrue(snapshotDb1.isSnapshotDb());
2116
2126
  assert.isTrue(snapshotDb2.isSnapshotDb());
2117
2127
  assert.isTrue(snapshotDb3.isSnapshotDb());
@@ -2124,7 +2134,7 @@ describe("iModel", () => {
2124
2134
  assert.equal(snapshotDb1.getBriefcaseId(), BriefcaseIdValue.Unassigned);
2125
2135
  assert.equal(snapshotDb2.getBriefcaseId(), BriefcaseIdValue.Unassigned);
2126
2136
  assert.equal(snapshotDb3.getBriefcaseId(), BriefcaseIdValue.Unassigned);
2127
- assert.equal(imodel1.getBriefcaseId(), BriefcaseIdValue.Unassigned);
2137
+ assert.equal(imodel.getBriefcaseId(), BriefcaseIdValue.Unassigned);
2128
2138
  assert.equal(snapshotDb1.pathName, snapshotFile1);
2129
2139
  assert.equal(snapshotDb2.pathName, snapshotFile2);
2130
2140
  assert.equal(snapshotDb3.pathName, snapshotFile3);
@@ -2139,10 +2149,10 @@ describe("iModel", () => {
2139
2149
  const rootSubjectName1 = snapshotDb1.elements.getRootSubject().code.value;
2140
2150
  const rootSubjectName2 = snapshotDb2.elements.getRootSubject().code.value;
2141
2151
  const rootSubjectName3 = snapshotDb3.elements.getRootSubject().code.value;
2142
- const imodel1RootSubjectName = imodel1.elements.getRootSubject().code.value;
2152
+ const imodelRootSubjectName = imodel.elements.getRootSubject().code.value;
2143
2153
  assert.equal(rootSubjectName1, snapshotRootSubjectName);
2144
2154
  assert.equal(rootSubjectName1, rootSubjectName2, "Expect a snapshot to maintain the root Subject name from its seed");
2145
- assert.equal(rootSubjectName3, imodel1RootSubjectName, "Expect a snapshot to maintain the root Subject name from its seed");
2155
+ assert.equal(rootSubjectName3, imodelRootSubjectName, "Expect a snapshot to maintain the root Subject name from its seed");
2146
2156
  assert.isTrue(snapshotDb1.isOpen);
2147
2157
  assert.isTrue(snapshotDb2.isOpen);
2148
2158
  assert.isTrue(snapshotDb3.isOpen);
@@ -2177,6 +2187,7 @@ describe("iModel", () => {
2177
2187
  assert.isTrue(hasClassView(snapshotDb1, "bis.ElementRefersToElements"));
2178
2188
  assert.isFalse(hasClassView(snapshotDb2, "bis.Element"));
2179
2189
  assert.isTrue(hasClassView(snapshotDb3, "bis.Element"));
2190
+ imodel.close();
2180
2191
  snapshotDb1.close();
2181
2192
  snapshotDb2.close();
2182
2193
  snapshotDb3.close();
@@ -2384,7 +2395,7 @@ describe("iModel", () => {
2384
2395
  expect(elProps.code.scope).equal(element.code.scope);
2385
2396
  expect(elProps.code.spec).equal(element.code.spec);
2386
2397
  expect(elProps.federationGuid).equal(element.federationGuid);
2387
- expect(elProps.isPrivate).undefined;
2398
+ expect(elProps.isPrivate).to.be.oneOf([false, undefined]);
2388
2399
  expect(elProps.isInstanceOfEntity).undefined;
2389
2400
  // remove userlabel by setting it to the blank string
2390
2401
  element.userLabel = "";
@@ -2562,12 +2573,12 @@ describe("iModel", () => {
2562
2573
  expect(imodel.codeValueBehavior).to.equal("trim-unicode-whitespace");
2563
2574
  const code1 = getNumberedCodeValAndProps(1);
2564
2575
  const categ1Id = imodel.elements.insertElement(code1.props);
2565
- const categ1 = imodel.elements.getElementJson({ id: categ1Id });
2576
+ const categ1 = imodel.elements.getElementProps({ id: categ1Id });
2566
2577
  expect(categ1.code.value).to.equal(code1.trimmedCodeVal);
2567
2578
  imodel.codeValueBehavior = "exact";
2568
2579
  const code2 = getNumberedCodeValAndProps(2);
2569
2580
  const categ2Id = imodel.elements.insertElement(code2.props);
2570
- const categ2 = imodel.elements.getElementJson({ id: categ2Id });
2581
+ const categ2 = imodel.elements.getElementProps({ id: categ2Id });
2571
2582
  expect(categ2.code.value).to.equal(code2.untrimmedCodeVal);
2572
2583
  imodel.codeValueBehavior = "trim-unicode-whitespace";
2573
2584
  const code3 = getNumberedCodeValAndProps(3);