@itwin/core-backend 5.14.0-dev.9 → 5.15.0-dev.2

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 (140) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/lib/cjs/ChangesetReader.d.ts +1 -1
  3. package/lib/cjs/ChangesetReader.js +2 -2
  4. package/lib/cjs/ChangesetReader.js.map +1 -1
  5. package/lib/cjs/ChangesetReaderTypes.d.ts +4 -1
  6. package/lib/cjs/ChangesetReaderTypes.d.ts.map +1 -1
  7. package/lib/cjs/ChangesetReaderTypes.js +3 -0
  8. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  9. package/lib/cjs/ECDb.d.ts +63 -6
  10. package/lib/cjs/ECDb.d.ts.map +1 -1
  11. package/lib/cjs/ECDb.js +62 -6
  12. package/lib/cjs/ECDb.js.map +1 -1
  13. package/lib/cjs/ECSqlStatement.d.ts +2 -2
  14. package/lib/cjs/ECSqlStatement.js +2 -2
  15. package/lib/cjs/ECSqlStatement.js.map +1 -1
  16. package/lib/cjs/Element.d.ts.map +1 -1
  17. package/lib/cjs/Element.js +6 -3
  18. package/lib/cjs/Element.js.map +1 -1
  19. package/lib/cjs/IModelDb.d.ts +12 -10
  20. package/lib/cjs/IModelDb.d.ts.map +1 -1
  21. package/lib/cjs/IModelDb.js +26 -12
  22. package/lib/cjs/IModelDb.js.map +1 -1
  23. package/lib/cjs/SchemaSync.d.ts +2 -2
  24. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  25. package/lib/cjs/SchemaSync.js +2 -2
  26. package/lib/cjs/SchemaSync.js.map +1 -1
  27. package/lib/cjs/SqliteChangesetReader.d.ts +16 -8
  28. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  29. package/lib/cjs/SqliteChangesetReader.js +11 -1
  30. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  31. package/lib/cjs/TxnManager.d.ts.map +1 -1
  32. package/lib/cjs/TxnManager.js +4 -0
  33. package/lib/cjs/TxnManager.js.map +1 -1
  34. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +90 -5
  35. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  36. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +59 -1
  37. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  38. package/lib/cjs/internal/annotations/fieldSpecs.d.ts +82 -0
  39. package/lib/cjs/internal/annotations/fieldSpecs.d.ts.map +1 -0
  40. package/lib/cjs/internal/annotations/fieldSpecs.js +187 -0
  41. package/lib/cjs/internal/annotations/fieldSpecs.js.map +1 -0
  42. package/lib/cjs/internal/annotations/fields.d.ts +39 -2
  43. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  44. package/lib/cjs/internal/annotations/fields.js +140 -13
  45. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  46. package/lib/esm/ChangesetReader.d.ts +1 -1
  47. package/lib/esm/ChangesetReader.js +2 -2
  48. package/lib/esm/ChangesetReader.js.map +1 -1
  49. package/lib/esm/ChangesetReaderTypes.d.ts +4 -1
  50. package/lib/esm/ChangesetReaderTypes.d.ts.map +1 -1
  51. package/lib/esm/ChangesetReaderTypes.js +3 -0
  52. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  53. package/lib/esm/ECDb.d.ts +63 -6
  54. package/lib/esm/ECDb.d.ts.map +1 -1
  55. package/lib/esm/ECDb.js +62 -6
  56. package/lib/esm/ECDb.js.map +1 -1
  57. package/lib/esm/ECSqlStatement.d.ts +2 -2
  58. package/lib/esm/ECSqlStatement.js +2 -2
  59. package/lib/esm/ECSqlStatement.js.map +1 -1
  60. package/lib/esm/Element.d.ts.map +1 -1
  61. package/lib/esm/Element.js +6 -3
  62. package/lib/esm/Element.js.map +1 -1
  63. package/lib/esm/IModelDb.d.ts +12 -10
  64. package/lib/esm/IModelDb.d.ts.map +1 -1
  65. package/lib/esm/IModelDb.js +26 -12
  66. package/lib/esm/IModelDb.js.map +1 -1
  67. package/lib/esm/SchemaSync.d.ts +2 -2
  68. package/lib/esm/SchemaSync.d.ts.map +1 -1
  69. package/lib/esm/SchemaSync.js +2 -2
  70. package/lib/esm/SchemaSync.js.map +1 -1
  71. package/lib/esm/SqliteChangesetReader.d.ts +16 -8
  72. package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
  73. package/lib/esm/SqliteChangesetReader.js +11 -1
  74. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  75. package/lib/esm/TxnManager.d.ts.map +1 -1
  76. package/lib/esm/TxnManager.js +4 -0
  77. package/lib/esm/TxnManager.js.map +1 -1
  78. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +90 -5
  79. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  80. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +60 -2
  81. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  82. package/lib/esm/internal/annotations/fieldSpecs.d.ts +82 -0
  83. package/lib/esm/internal/annotations/fieldSpecs.d.ts.map +1 -0
  84. package/lib/esm/internal/annotations/fieldSpecs.js +179 -0
  85. package/lib/esm/internal/annotations/fieldSpecs.js.map +1 -0
  86. package/lib/esm/internal/annotations/fields.d.ts +39 -2
  87. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  88. package/lib/esm/internal/annotations/fields.js +140 -13
  89. package/lib/esm/internal/annotations/fields.js.map +1 -1
  90. package/lib/esm/test/AnnotationTestUtils.d.ts +9 -0
  91. package/lib/esm/test/AnnotationTestUtils.d.ts.map +1 -1
  92. package/lib/esm/test/AnnotationTestUtils.js +17 -0
  93. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  94. package/lib/esm/test/annotations/FieldFormat.test.d.ts +2 -0
  95. package/lib/esm/test/annotations/FieldFormat.test.d.ts.map +1 -0
  96. package/lib/esm/test/annotations/FieldFormat.test.js +738 -0
  97. package/lib/esm/test/annotations/FieldFormat.test.js.map +1 -0
  98. package/lib/esm/test/annotations/FieldFormattingLifecycle.test.d.ts +2 -0
  99. package/lib/esm/test/annotations/FieldFormattingLifecycle.test.d.ts.map +1 -0
  100. package/lib/esm/test/annotations/FieldFormattingLifecycle.test.js +323 -0
  101. package/lib/esm/test/annotations/FieldFormattingLifecycle.test.js.map +1 -0
  102. package/lib/esm/test/annotations/FieldSpecs.test.d.ts +2 -0
  103. package/lib/esm/test/annotations/FieldSpecs.test.d.ts.map +1 -0
  104. package/lib/esm/test/annotations/FieldSpecs.test.js +54 -0
  105. package/lib/esm/test/annotations/FieldSpecs.test.js.map +1 -0
  106. package/lib/esm/test/annotations/Fields.test.js +221 -27
  107. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  108. package/lib/esm/test/ecdb/CSVImport.test.d.ts +2 -0
  109. package/lib/esm/test/ecdb/CSVImport.test.d.ts.map +1 -0
  110. package/lib/esm/test/ecdb/CSVImport.test.js +186 -0
  111. package/lib/esm/test/ecdb/CSVImport.test.js.map +1 -0
  112. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -2
  113. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  114. package/lib/esm/test/ecdb/ECDb.test.js +207 -95
  115. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  116. package/lib/esm/test/ecdb/ECSqlAst.test.js +2 -2
  117. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  118. package/lib/esm/test/ecdb/ECSqlQuery.test.js +17 -11
  119. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  120. package/lib/esm/test/ecdb/QueryReaders.test.js +105 -30
  121. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  122. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  123. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +7 -0
  124. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  125. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +86 -7
  126. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  127. package/lib/esm/test/hubaccess/CodeSwap.test.js +78 -0
  128. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  129. package/lib/esm/test/imodel/IModelElements.test.js +5 -0
  130. package/lib/esm/test/imodel/IModelElements.test.js.map +1 -1
  131. package/lib/esm/test/standalone/ChangesetReader.test.js +116 -7
  132. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  133. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +61 -0
  134. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -1
  135. package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
  136. package/lib/esm/test/standalone/SQLiteDb.test.js +116 -0
  137. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  138. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +2 -2
  139. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  140. package/package.json +16 -14
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlQuery.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlQuery.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { DbResult, Id64 } from \"@itwin/core-bentley\";\r\nimport { DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, ECSqlReader, QueryBinder, QueryOptionsBuilder, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { assert, expect, use } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport * as path from \"path\";\r\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { _nativeDb, ECSqlStatement, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\nuse(chaiAsPromised);\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\ndescribe(\"ECSql Query\", () => {\r\n let imodel1: SnapshotDb;\r\n let imodel2: SnapshotDb;\r\n let imodel3: SnapshotDb;\r\n let imodel4: SnapshotDb;\r\n let imodel5: SnapshotDb;\r\n let imodel6: SnapshotDb;\r\n\r\n before(async () => {\r\n\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n imodel2 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\r\n imodel4 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\r\n imodel5 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\r\n imodel6 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test_ec_4003.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n imodel2.close();\r\n imodel3.close();\r\n imodel4.close();\r\n imodel5.close();\r\n imodel6.close();\r\n });\r\n\r\n const megaBytes = (n: number) => n * 1024 * 1024;\r\n\r\n it(\"v8 max string length test\", async () => {\r\n const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(500)}))`);\r\n await expect(reader.step()).to.be.rejectedWith(\"result size exceeded maximum allowed size\");\r\n });\r\n\r\n it(\"step fail with large blob\", async () => {\r\n const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(5000)}))`);\r\n await expect(reader.step()).to.be.rejectedWith(\"concurrent query step() failed: string or blob too big (BE_SQLITE_TOOBIG)\");\r\n });\r\n\r\n it(\"verify 4.8.x format for ECClassId\", async () => {\r\n const queries = [\r\n \"SELECT ECClassId FROM Bis.Element LIMIT 1\",\r\n \"SELECT ECClassId aClassId FROM Bis.Element LIMIT 1\",\r\n \"SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\r\n \"SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n \"SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\r\n \"SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t\",\r\n \"SELECT * FROM (SELECT ECClassId FROM Bis.Element LIMIT 1)\",\r\n \"SELECT * FROM (SELECT ECClassId aClassId, ECClassId FROM Bis.Element LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t)\",\r\n ];\r\n assert.equal(queries.length, 18);\r\n const results = [\r\n { className: \"BisCore.DrawingCategory\" },\r\n { aClassId: \"0x4c\" },\r\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\r\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { aRelClassId: \"0xcf\" },\r\n { aClassId: \"0x4c\" },\r\n { aClassId: \"0x4c\" },\r\n { bClassId: \"0x4c\" },\r\n { className: \"BisCore.DrawingCategory\" },\r\n { aClassId: \"0x4c\", className: \"BisCore.DrawingCategory\" },\r\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\r\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { aRelClassId: \"0xcf\" },\r\n { aClassId: \"0x4c\" },\r\n { aClassId: \"0x4c\" },\r\n { bClassId: \"0x4c\" },\r\n ];\r\n assert.equal(results.length, 18);\r\n const builder = new QueryOptionsBuilder();\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\r\n let expectedRows = 0;\r\n for (let i = 0; i < queries.length; i++) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(queries[i], (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), results[i], `(ECSqlStatement) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n ++expectedRows;\r\n });\r\n for await (const row of imodel1.createQueryReader(queries[i], undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), results[i], `(ECSqlReader) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n ++expectedRows;\r\n }\r\n }\r\n assert.equal(expectedRows, 36);\r\n });\r\n it(\"verify return values for system properties\", async () => {\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const testQueries = [\r\n //\r\n {\r\n query: \"SELECT a.ECInstanceId, b.ECInstanceId, a.ECClassId, b.ECClassId FROM BisCore.Element a, BisCore.Element b LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n id_1: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n className_1: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT Parent.Id,Parent.RelECClassId, Parent.Id myParentId, Parent.RelECClassId myParentRelClassId FROM BisCore.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n result: {\r\n \"myParentId\": \"0x1\",\r\n \"myParentRelClassId\": \"0xcf\",\r\n \"parent.id\": \"0x1\",\r\n \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId, ECClassId FROM Bis.Element LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n id: \"0x1\",\r\n className: \"BisCore.PartitionOriginatesFromRepository\",\r\n sourceId: \"0x1c\",\r\n sourceClassName: \"BisCore.PhysicalPartition\",\r\n targetId: \"0x12\",\r\n targetClassName: \"BisCore.RepositoryLink\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n id: \"0x1\",\r\n className: \"BisCore.PartitionOriginatesFromRepository\",\r\n sourceId: \"0x1c\",\r\n sourceClassName: \"BisCore.PhysicalPartition\",\r\n targetId: \"0x12\",\r\n targetClassName: \"BisCore.RepositoryLink\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId a, ECClassId b FROM Bis.Element LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId A, ECClassId B FROM Bis.Element LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT Model, Model.Id, Model.RelECClassId from Bis.Element limit 1\",\r\n result: {\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT Model, Model.Id, Model.RelECClassId from Bis.Element) LIMIT 1\",\r\n result: {\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n \"id\": \"0x1\",\r\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\r\n \"sourceId\": \"0x1c\",\r\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\r\n \"targetId\": \"0x12\",\r\n \"targetClassName\": \"BisCore.RepositoryLink\",\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n \"id\": \"0x1\",\r\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\r\n \"sourceId\": \"0x1c\",\r\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\r\n \"targetId\": \"0x12\",\r\n \"targetClassName\": \"BisCore.RepositoryLink\",\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n ];\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n const builder = new QueryOptionsBuilder();\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setConvertClassIdsToNames(true);\r\n // With ECDb Profile 4002\r\n for (const testQuery of testQueries) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n });\r\n\r\n let hasRow = false;\r\n for await (const row of imodel1.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n hasRow = true;\r\n }\r\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\r\n }\r\n // With ECDb Profile 4003\r\n for (const testQuery of testQueries) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel6.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n });\r\n let hasRow = false;\r\n for await (const row of imodel6.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n hasRow = true;\r\n }\r\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\r\n }\r\n });\r\n it(\"check prepare logErrors flag\", () => {\r\n const ecdb = imodel1;\r\n // expect log message when statement fails\r\n let slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\r\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ true), \"no such table: def (BE_SQLITE_ERROR)\");\r\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\r\n\r\n // now pass suppress log error which mean we should not get the error\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\r\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ false), \"no such table: def (BE_SQLITE_ERROR)\");\r\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\r\n\r\n // expect log message when statement fails\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ true), \"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\r\n\r\n // now pass suppress log error which mean we should not get the error\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ false), \"\");\r\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\r\n });\r\n it(\"restart query\", async () => {\r\n let cancelled = 0;\r\n let successful = 0;\r\n let rowCount = 0;\r\n try {\r\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\r\n\r\n const scheduleQuery = async (delay: number) => {\r\n return new Promise<void>(async (resolve, reject) => {\r\n try {\r\n const options = new QueryOptionsBuilder();\r\n options.setDelay(delay);\r\n options.setRestartToken(\"tag\");\r\n const reader = imodel1.createQueryReader(\"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\", undefined, options.getOptions());\r\n while (await reader.step()) {\r\n rowCount++;\r\n }\r\n successful++;\r\n resolve();\r\n } catch (err: any) {\r\n // we expect query to be cancelled\r\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\r\n cancelled++;\r\n resolve();\r\n } else {\r\n reject(new Error(\"rejected\"));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const queries = [];\r\n queries.push(scheduleQuery(5000));\r\n queries.push(scheduleQuery(0));\r\n\r\n await Promise.all(queries);\r\n // We expect at least one query to be cancelled\r\n assert.isAtLeast(cancelled, 1, \"cancelled should be at least 1\");\r\n assert.isAtLeast(successful, 1, \"successful should be at least 1\");\r\n assert.isAtLeast(rowCount, 1, \"rowCount should be at least 1\");\r\n } finally {\r\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\r\n }\r\n });\r\n it(\"concurrent query should retry on timeout\", async () => {\r\n class MockECSqlReader extends ECSqlReader {\r\n public constructor(_executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, query: string) {\r\n super(_executor, query);\r\n }\r\n public async mockReadRows(queryRequest: DbQueryRequest): Promise<DbQueryResponse> {\r\n return super.runWithRetry(queryRequest);\r\n }\r\n }\r\n\r\n // Set time to 1 sec to simulate a timeout scenario\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\r\n const executor = {\r\n execute: async (req: DbQueryRequest) => {\r\n return ConcurrentQuery.executeQueryRequest(imodel1[_nativeDb], req);\r\n },\r\n };\r\n const request: DbQueryRequest = {\r\n kind: DbRequestKind.ECSql,\r\n query: \"SELECT * FROM BisCore.element\",\r\n delay: 5000, // Set delay to a value > timeout\r\n };\r\n try {\r\n await new MockECSqlReader(executor, request.query).mockReadRows(request);\r\n assert(false); // We expect this scenario to always throw\r\n } catch (error: any) {\r\n // Query should give up after max retry count has been reached\r\n assert(error.message === \"query too long to execute or server is too busy\");\r\n }\r\n });\r\n it(\"concurrent query use primary connection\", async () => {\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { usePrimaryConn: true });\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 46);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 46);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 1000);\r\n assert.isTrue(reader.stats.totalTime > 0);\r\n });\r\n it(\"concurrent query use idset\", async () => {\r\n const ids: string[] = [];\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids.push(row[0]);\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element WHERE InVirtualSet(?, ECInstanceId)\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 23);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 23);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 100);\r\n });\r\n it(\"concurrent query bind idset in IdSet virtual table\", async () => {\r\n const ids: string[] = [];\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids.push(row[0]);\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 23);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 23);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 100);\r\n });\r\n it(\"concurrent query bind single id in IdSet virtual table\", async () => {\r\n let ids: string = \"\";\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids = row[0]; // getting only the first id\r\n break;\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n let rows = 0; // backend will fail to bind so no rows will be returned\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 0);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 0);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table should fail\", async () => {\r\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\r\n\r\n try {\r\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n } catch (err: any) {\r\n assert.equal(err.message, \"unsupported type\");\r\n }\r\n });\r\n\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table should fail\", async () => {\r\n const ids: string[] = [\"ABC\", \"0x1\", \"YZ\"]; // as first value is not an Id so QueryBinder.from will throw error of \"unsupported type\"\r\n\r\n try {\r\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n } catch (err: any) {\r\n assert.equal(err.message, \"unsupported type\");\r\n }\r\n });\r\n\r\n it(\"concurrent query bind multiple ids in idset virtual table\", async () => {\r\n const ids: string[] = [\"0x1\", \"0xe\", \"0x10\"];\r\n\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\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\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 3);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 3);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n\r\n it(\"concurrent query get meta data\", async () => {\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\");\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 46);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 46);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 1000);\r\n });\r\n it(\"concurrent query access string meta data\", async () => {\r\n let reader = imodel1.createQueryReader(\"SELECT e.ECClassId FROM bis.Element e\");\r\n let props: QueryPropertyMetaData[] = await reader.getMetaData();\r\n assert.equal(props.length, 1);\r\n assert.equal(props[0].accessString, \"ECClassId\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT Model.Id, e.Model.Id, Model.RelECClassId, e.Model.RelECClassId FROM bis.Element e\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 4);\r\n assert.equal(props[0].accessString, \"Model.Id\");\r\n assert.equal(props[1].accessString, \"Model.Id\");\r\n assert.equal(props[2].accessString, \"Model.RelECClassId\");\r\n assert.equal(props[3].accessString, \"Model.RelECClassId\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT Origin.X, Origin.Y, TypeDefinition FROM bis.GeometricElement2d ge\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 3);\r\n assert.equal(props[0].accessString, \"Origin.X\");\r\n assert.equal(props[1].accessString, \"Origin.Y\");\r\n assert.equal(props[2].accessString, \"TypeDefinition\");\r\n assert.equal(props[2].typeName, \"navigation\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT 1, 1 + 6, * FROM (VALUES(1,2), (2,3))\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 4);\r\n assert.equal(props[0].accessString, \"1\");\r\n assert.equal(props[0].jsonName, \"1\");\r\n assert.equal(props[1].accessString, \"1 + 6\");\r\n assert.equal(props[1].typeName, \"double\");\r\n assert.equal(props[2].accessString, \"1_1\");\r\n assert.equal(props[2].jsonName, \"1_1\");\r\n assert.equal(props[3].accessString, \"2\");\r\n });\r\n it(\"concurrent query quota\", async () => {\r\n let reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { count: 4 } });\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 4);\r\n reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { offset: 4, count: 4 } });\r\n rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 4);\r\n });\r\n it(\"paging results\", async () => {\r\n const getRowPerPage = (nPageSize: number, nRowCount: number) => {\r\n const nRowPerPage = nRowCount / nPageSize;\r\n const nPages = Math.ceil(nRowPerPage);\r\n const nRowOnLastPage = nRowCount - (Math.floor(nRowPerPage) * pageSize);\r\n const pages = new Array(nPages).fill(pageSize);\r\n if (nRowPerPage) {\r\n pages[nPages - 1] = nRowOnLastPage;\r\n }\r\n return pages;\r\n };\r\n\r\n const pageSize = 5;\r\n const query = \"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\";\r\n const dbs = [imodel1, imodel2, imodel3, imodel4, imodel5];\r\n const pendingRowCount = [];\r\n for (const db of dbs) {\r\n for await (const row of db.createQueryReader(`SELECT count(*) FROM (${query})`)) {\r\n pendingRowCount.push(row[0] as number);\r\n }\r\n }\r\n\r\n const rowCounts = pendingRowCount;\r\n const expected = [46, 62, 7, 7, 28];\r\n assert.equal(rowCounts.length, expected.length);\r\n for (let i = 0; i < expected.length; i++) {\r\n assert.equal(rowCounts[i], expected[i]);\r\n }\r\n // verify row per page\r\n for (const db of dbs) {\r\n const i = dbs.indexOf(db);\r\n const rowPerPage = getRowPerPage(pageSize, expected[i]);\r\n for (let k = 0; k < rowPerPage.length; k++) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const rs = await db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames, limit: { count: pageSize, offset: k * pageSize } }).toArray();\r\n assert.equal(rs.length, rowPerPage[k]);\r\n }\r\n }\r\n\r\n // verify async iterator\r\n for (const db of dbs) {\r\n const resultSet = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\r\n const row = queryRow.toRow();\r\n resultSet.push(row);\r\n assert.isTrue(Reflect.has(row, \"id\"));\r\n if (Reflect.ownKeys(row).length > 1) {\r\n assert.isTrue(Reflect.has(row, \"parentId\"));\r\n const parentId: string = row.parentId as string;\r\n assert.isTrue(Id64.isValidId64(parentId));\r\n }\r\n const id: string = row.id as string;\r\n assert.isTrue(Id64.isValidId64(id));\r\n }\r\n const entry = dbs.indexOf(db);\r\n assert.equal(rowCounts[entry], resultSet.length);\r\n }\r\n });\r\n\r\n describe(\"supports_instance_query\", () => {\r\n it(\"returns 1 for entity classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Entity class BisCore.Element should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 1 for link table relationship classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.CategorySelectorRefersToCategories')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Link table relationship should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 1 for link table relationship with external class ids\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.ModelSelectorRefersToModels')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"ModelSelectorRefersToModels (link table with external class ids) should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 0 for non-existent classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.DoesNotExist')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 0, \"Non-existent class should not support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 0 for NULL input\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query(NULL)\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 0, \"NULL input should return 0\");\r\n }\r\n });\r\n\r\n it(\"works with schema alias:class format\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('bis:Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Should work with alias:class format\");\r\n }\r\n });\r\n\r\n it(\"works with integer class id\", async () => {\r\n // First get the class id for BisCore.Element\r\n let classId: number | undefined;\r\n for await (const row of imodel1.createQueryReader(\"SELECT ec_classid('BisCore', 'Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n classId = row[0] as number;\r\n }\r\n assert.isDefined(classId, \"Should be able to resolve BisCore.Element class id\");\r\n\r\n for await (const row of imodel1.createQueryReader(`SELECT supports_instance_query(${classId})`, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Should work with integer class id\");\r\n }\r\n });\r\n\r\n it(\"can be used to filter classes that support instance queries\", async () => {\r\n // Example: find all classes in a schema that support SELECT $\r\n const rows: any[] = [];\r\n for await (const row of imodel1.createQueryReader(\r\n `SELECT c.Name, supports_instance_query(c.ECInstanceId) as supported\r\n FROM meta.ECClassDef c\r\n JOIN meta.ECSchemaDef s ON c.Schema.Id = s.ECInstanceId\r\n WHERE s.Name = 'BisCore' AND supports_instance_query(c.ECInstanceId) = 1\r\n LIMIT 5`,\r\n undefined,\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n )) {\r\n rows.push(row.toRow());\r\n }\r\n assert.isAbove(rows.length, 0, \"Should find at least one BisCore class that supports instance queries\");\r\n for (const row of rows) {\r\n assert.equal(row.supported, 1);\r\n }\r\n });\r\n });\r\n\r\n describe(\"instance query on link table relationships\", () => {\r\n it(\"SELECT $ works for link table relationship with external class ids\", async () => {\r\n // ModelSelectorRefersToModels is a link table relationship where SourceECClassId\r\n // and TargetECClassId may be stored in external tables. This was previously failing\r\n // with a SQLite syntax error due to bugs in CreateLinkTableView.\r\n let rowCount = 0;\r\n for await (const row of imodel1.createQueryReader(\r\n \"SELECT $ FROM BisCore.ModelSelectorRefersToModels\",\r\n undefined,\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n )) {\r\n const instance = row.toRow();\r\n const json = instance.$;\r\n assert.isDefined(json, \"$ column should be defined\");\r\n const parsed = typeof json === \"string\" ? JSON.parse(json) : json;\r\n assert.isDefined(parsed.ECInstanceId, \"Instance must have ECInstanceId\");\r\n assert.isDefined(parsed.ECClassId, \"Instance must have ECClassId\");\r\n assert.isDefined(parsed.SourceECInstanceId, \"Instance must have SourceECInstanceId\");\r\n assert.isDefined(parsed.TargetECInstanceId, \"Instance must have TargetECInstanceId\");\r\n rowCount++;\r\n }\r\n // The query should at least not crash — whether there are rows depends on the test file\r\n assert.isAtLeast(rowCount, 0, \"Query should execute without error\");\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ECSqlQuery.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlQuery.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { DbResult, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { DbQueryRequest, DbQueryResponse, DbRequestExecutor, DbRequestKind, ECSqlReader, QueryBinder, QueryOptionsBuilder, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { assert, expect, use } from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport * as path from \"path\";\r\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { _nativeDb, ECSqlStatement, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\nuse(chaiAsPromised);\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\ndescribe(\"ECSql Query\", () => {\r\n let imodel1: SnapshotDb;\r\n let imodel2: SnapshotDb;\r\n let imodel3: SnapshotDb;\r\n let imodel4: SnapshotDb;\r\n let imodel5: SnapshotDb;\r\n let imodel6: SnapshotDb;\r\n let drawingCategoryClassId: Id64String;\r\n let parentRelationshipClassId: Id64String;\r\n\r\n before(async () => {\r\n\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n drawingCategoryClassId = imodel1[_nativeDb].classNameToId(\"BisCore:DrawingCategory\");\r\n parentRelationshipClassId = imodel1[_nativeDb].classNameToId(\"BisCore:SubjectOwnsPartitionElements\");\r\n assert.isTrue(Id64.isValid(drawingCategoryClassId));\r\n assert.isTrue(Id64.isValid(parentRelationshipClassId));\r\n imodel2 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\"));\r\n imodel3 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\"));\r\n imodel4 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledArrayProperties.bim\"));\r\n imodel5 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\"));\r\n imodel6 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test_ec_4003.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n imodel2.close();\r\n imodel3.close();\r\n imodel4.close();\r\n imodel5.close();\r\n imodel6.close();\r\n });\r\n\r\n const megaBytes = (n: number) => n * 1024 * 1024;\r\n\r\n it(\"v8 max string length test\", async () => {\r\n const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(500)}))`);\r\n await expect(reader.step()).to.be.rejectedWith(\"result size exceeded maximum allowed size\");\r\n });\r\n\r\n it(\"step fail with large blob\", async () => {\r\n const reader = imodel1.createQueryReader(`SELECT hex(zeroblob(${megaBytes(5000)}))`);\r\n await expect(reader.step()).to.be.rejectedWith(\"concurrent query step() failed: string or blob too big (BE_SQLITE_TOOBIG)\");\r\n });\r\n\r\n it(\"verify 4.8.x format for ECClassId\", async () => {\r\n const queries = [\r\n \"SELECT ECClassId FROM Bis.Element LIMIT 1\",\r\n \"SELECT ECClassId aClassId FROM Bis.Element LIMIT 1\",\r\n \"SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\r\n \"SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n \"SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1 \",\r\n \"SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t\",\r\n \"WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t\",\r\n \"SELECT * FROM (SELECT ECClassId FROM Bis.Element LIMIT 1)\",\r\n \"SELECT * FROM (SELECT ECClassId aClassId, ECClassId FROM Bis.Element LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent.RelECClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent aParent FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (SELECT Parent.RelECClassId aRelClassId FROM Bis.Element WHERE Parent.Id IS NOT NULL LIMIT 1)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId Foo FROM Bis.Element LIMIT 1) SELECT aClassId FROM t)\",\r\n \"SELECT * FROM (WITH t(aClassId) AS (SELECT ECClassId FROM Bis.Element LIMIT 1) SELECT aClassId bClassId FROM t)\",\r\n ];\r\n assert.equal(queries.length, 18);\r\n const results = [\r\n { className: \"BisCore.DrawingCategory\" },\r\n { aClassId: drawingCategoryClassId },\r\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\r\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { aRelClassId: parentRelationshipClassId },\r\n { aClassId: drawingCategoryClassId },\r\n { aClassId: drawingCategoryClassId },\r\n { bClassId: drawingCategoryClassId },\r\n { className: \"BisCore.DrawingCategory\" },\r\n { aClassId: drawingCategoryClassId, className: \"BisCore.DrawingCategory\" },\r\n { parent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\" },\r\n { aParent: { id: \"0x1\", relClassName: \"BisCore.SubjectOwnsPartitionElements\" } },\r\n { aRelClassId: parentRelationshipClassId },\r\n { aClassId: drawingCategoryClassId },\r\n { aClassId: drawingCategoryClassId },\r\n { bClassId: drawingCategoryClassId },\r\n ];\r\n assert.equal(results.length, 18);\r\n const builder = new QueryOptionsBuilder();\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\r\n let expectedRows = 0;\r\n for (let i = 0; i < queries.length; i++) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(queries[i], (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), results[i], `(ECSqlStatement) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n ++expectedRows;\r\n });\r\n for await (const row of imodel1.createQueryReader(queries[i], undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), results[i], `(ECSqlReader) \"${queries[i]}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n ++expectedRows;\r\n }\r\n }\r\n assert.equal(expectedRows, 36);\r\n });\r\n it(\"verify return values for system properties\", async () => {\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const testQueries = [\r\n //\r\n {\r\n query: \"SELECT a.ECInstanceId, b.ECInstanceId, a.ECClassId, b.ECClassId FROM BisCore.Element a, BisCore.Element b LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n id_1: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n className_1: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT Parent.Id,Parent.RelECClassId, Parent.Id myParentId, Parent.RelECClassId myParentRelClassId FROM BisCore.Element WHERE Parent.Id IS NOT NULL LIMIT 1\",\r\n result: {\r\n \"myParentId\": \"0x1\",\r\n \"myParentRelClassId\": parentRelationshipClassId,\r\n \"parent.id\": \"0x1\",\r\n \"parent.relClassName\": \"BisCore.SubjectOwnsPartitionElements\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId, ECClassId FROM Bis.Element LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n id: \"0x19\",\r\n className: \"BisCore.DrawingCategory\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n id: \"0x1\",\r\n className: \"BisCore.PartitionOriginatesFromRepository\",\r\n sourceId: \"0x1c\",\r\n sourceClassName: \"BisCore.PhysicalPartition\",\r\n targetId: \"0x12\",\r\n targetClassName: \"BisCore.RepositoryLink\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId, ECClassId, SourceECInstanceId, SourceECClassId, TargetECInstanceid, TargetECClassId FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n id: \"0x1\",\r\n className: \"BisCore.PartitionOriginatesFromRepository\",\r\n sourceId: \"0x1c\",\r\n sourceClassName: \"BisCore.PhysicalPartition\",\r\n targetId: \"0x12\",\r\n targetClassName: \"BisCore.RepositoryLink\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId a, ECClassId b FROM Bis.Element LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId A, ECClassId B FROM Bis.Element LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B FROM Bis.Element) LIMIT 1\",\r\n result: {\r\n a: \"0x19\",\r\n b: \"0x4c\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId a, ECClassId b, SourceECInstanceId c, SourceECClassId d, TargetECInstanceid e, TargetECClassId f FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT ECInstanceId A, ECClassId B, SourceECInstanceId C, SourceECClassId D, TargetECInstanceid E, TargetECClassId F FROM Bis.ElementRefersToElements) LIMIT 1\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n },\r\n },\r\n {\r\n query: \"SELECT Model, Model.Id, Model.RelECClassId from Bis.Element limit 1\",\r\n result: {\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\n query: \"SELECT * FROM (SELECT Model, Model.Id, Model.RelECClassId from Bis.Element) LIMIT 1\",\r\n result: {\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n \"id\": \"0x1\",\r\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\r\n \"sourceId\": \"0x1c\",\r\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\r\n \"targetId\": \"0x12\",\r\n \"targetClassName\": \"BisCore.RepositoryLink\",\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n \"id\": \"0x1\",\r\n \"className\": \"BisCore.PartitionOriginatesFromRepository\",\r\n \"sourceId\": \"0x1c\",\r\n \"sourceClassName\": \"BisCore.PhysicalPartition\",\r\n \"targetId\": \"0x12\",\r\n \"targetClassName\": \"BisCore.RepositoryLink\",\r\n \"model\": {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n \"model.id\": \"0x1\",\r\n \"model.relClassName\": \"BisCore.ModelContainsElements\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n {\r\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\",\r\n result: {\r\n a: \"0x1\",\r\n b: \"0xa8\",\r\n c: \"0x1c\",\r\n d: \"0xb4\",\r\n e: \"0x12\",\r\n f: \"0xa9\",\r\n g: {\r\n id: \"0x1\",\r\n relClassName: \"BisCore.ModelContainsElements\",\r\n },\r\n h: \"0x1\",\r\n i: \"0x40\",\r\n },\r\n },\r\n ];\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n const builder = new QueryOptionsBuilder();\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setRowFormat(QueryRowFormat.UseJsPropertyNames);\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n builder.setConvertClassIdsToNames(true);\r\n // With ECDb Profile 4002\r\n for (const testQuery of testQueries) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel1.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n });\r\n\r\n let hasRow = false;\r\n for await (const row of imodel1.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n hasRow = true;\r\n }\r\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\r\n }\r\n // With ECDb Profile 4003\r\n for (const testQuery of testQueries) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel6.withPreparedStatement(testQuery.query, (stmt: ECSqlStatement) => {\r\n assert.equal(DbResult.BE_SQLITE_ROW, stmt.step(), \"expected DbResult.BE_SQLITE_ROW\");\r\n assert.deepEqual(stmt.getRow(), testQuery.result, `(ECSqlStatement) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n });\r\n let hasRow = false;\r\n for await (const row of imodel6.createQueryReader(testQuery.query, undefined, builder.getOptions())) {\r\n assert.deepEqual(row.toRow(), testQuery.result, `(ECSqlReader) \"${testQuery.query}\" does not match expected result (${path.basename(imodel1[_nativeDb].getFilePath())})`);\r\n hasRow = true;\r\n }\r\n assert.isTrue(hasRow, \"imodel1.query() must return latest one row\");\r\n }\r\n });\r\n it(\"check prepare logErrors flag\", () => {\r\n const ecdb = imodel1;\r\n // expect log message when statement fails\r\n let slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\r\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ true), \"no such table: def (BE_SQLITE_ERROR)\");\r\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\r\n\r\n // now pass suppress log error which mean we should not get the error\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"BeSQLite\").message(\"Error \\\"no such table: def (BE_SQLITE_ERROR)\\\" preparing SQL: SELECT abc FROM def\");\r\n assert.throw(() => ecdb.withSqliteStatement(\"SELECT abc FROM def\", () => { }, /* logErrors = */ false), \"no such table: def (BE_SQLITE_ERROR)\");\r\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\r\n\r\n // expect log message when statement fails\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ true), \"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n assert.isTrue(slm.finishAndDispose(), \"logMatcher should detect log\");\r\n\r\n // now pass suppress log error which mean we should not get the error\r\n slm = new SequentialLogMatcher();\r\n slm.append().error().category(\"ECDb\").message(\"ECClass 'abc.def' does not exist or could not be loaded.\");\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throw(() => ecdb.withPreparedStatement(\"SELECT abc FROM abc.def\", () => { }, /* logErrors = */ false), \"\");\r\n assert.isFalse(slm.finishAndDispose(), \"logMatcher should not detect log\");\r\n });\r\n it(\"restart query\", async () => {\r\n let cancelled = 0;\r\n let successful = 0;\r\n let rowCount = 0;\r\n try {\r\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\r\n\r\n const scheduleQuery = async (delay: number) => {\r\n return new Promise<void>(async (resolve, reject) => {\r\n try {\r\n const options = new QueryOptionsBuilder();\r\n options.setDelay(delay);\r\n options.setRestartToken(\"tag\");\r\n const reader = imodel1.createQueryReader(\"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\", undefined, options.getOptions());\r\n while (await reader.step()) {\r\n rowCount++;\r\n }\r\n successful++;\r\n resolve();\r\n } catch (err: any) {\r\n // we expect query to be cancelled\r\n if (err.errorNumber === DbResult.BE_SQLITE_INTERRUPT) {\r\n cancelled++;\r\n resolve();\r\n } else {\r\n reject(new Error(\"rejected\"));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const queries = [];\r\n queries.push(scheduleQuery(5000));\r\n queries.push(scheduleQuery(0));\r\n\r\n await Promise.all(queries);\r\n // We expect at least one query to be cancelled\r\n assert.isAtLeast(cancelled, 1, \"cancelled should be at least 1\");\r\n assert.isAtLeast(successful, 1, \"successful should be at least 1\");\r\n assert.isAtLeast(rowCount, 1, \"rowCount should be at least 1\");\r\n } finally {\r\n ConcurrentQuery.shutdown(imodel1[_nativeDb]);\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb]);\r\n }\r\n });\r\n it(\"concurrent query should retry on timeout\", async () => {\r\n class MockECSqlReader extends ECSqlReader {\r\n public constructor(_executor: DbRequestExecutor<DbQueryRequest, DbQueryResponse>, query: string) {\r\n super(_executor, query);\r\n }\r\n public async mockReadRows(queryRequest: DbQueryRequest): Promise<DbQueryResponse> {\r\n return super.runWithRetry(queryRequest);\r\n }\r\n }\r\n\r\n // Set time to 1 sec to simulate a timeout scenario\r\n ConcurrentQuery.resetConfig(imodel1[_nativeDb], { globalQuota: { time: 1 }, ignoreDelay: false });\r\n const executor = {\r\n execute: async (req: DbQueryRequest) => {\r\n return ConcurrentQuery.executeQueryRequest(imodel1[_nativeDb], req);\r\n },\r\n };\r\n const request: DbQueryRequest = {\r\n kind: DbRequestKind.ECSql,\r\n query: \"SELECT * FROM BisCore.element\",\r\n delay: 5000, // Set delay to a value > timeout\r\n };\r\n try {\r\n await new MockECSqlReader(executor, request.query).mockReadRows(request);\r\n assert(false); // We expect this scenario to always throw\r\n } catch (error: any) {\r\n // Query should give up after max retry count has been reached\r\n assert(error.message === \"query too long to execute or server is too busy\");\r\n }\r\n });\r\n it(\"concurrent query use primary connection\", async () => {\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { usePrimaryConn: true });\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 46);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 46);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 1000);\r\n assert.isTrue(reader.stats.totalTime > 0);\r\n });\r\n it(\"concurrent query use idset\", async () => {\r\n const ids: string[] = [];\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids.push(row[0]);\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element WHERE InVirtualSet(?, ECInstanceId)\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 23);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 23);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 100);\r\n });\r\n it(\"concurrent query bind idset in IdSet virtual table\", async () => {\r\n const ids: string[] = [];\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids.push(row[0]);\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 23);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 23);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 100);\r\n });\r\n it(\"concurrent query bind single id in IdSet virtual table\", async () => {\r\n let ids: string = \"\";\r\n for await (const row of imodel1.createQueryReader(\"SELECT ECInstanceId FROM BisCore.Element LIMIT 23\")) {\r\n ids = row[0]; // getting only the first id\r\n break;\r\n }\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n let rows = 0; // backend will fail to bind so no rows will be returned\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 0);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 0);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table should fail\", async () => {\r\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\r\n\r\n try {\r\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n } catch (err: any) {\r\n assert.equal(err.message, \"unsupported type\");\r\n }\r\n });\r\n\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table should fail\", async () => {\r\n const ids: string[] = [\"ABC\", \"0x1\", \"YZ\"]; // as first value is not an Id so QueryBinder.from will throw error of \"unsupported type\"\r\n\r\n try {\r\n imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n } catch (err: any) {\r\n assert.equal(err.message, \"unsupported type\");\r\n }\r\n });\r\n\r\n it(\"concurrent query bind multiple ids in idset virtual table\", async () => {\r\n const ids: string[] = [\"0x1\", \"0xe\", \"0x10\"];\r\n\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\", QueryBinder.from([ids]));\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\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\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 3);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet\r\n assert.equal(reader.stats.backendRowsReturned, 3);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n\r\n it(\"concurrent query get meta data\", async () => {\r\n const reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\");\r\n let props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 46);\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 11);\r\n assert.equal(reader.stats.backendRowsReturned, 46);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n assert.isTrue(reader.stats.backendMemUsed > 1000);\r\n });\r\n it(\"concurrent query access string meta data\", async () => {\r\n let reader = imodel1.createQueryReader(\"SELECT e.ECClassId FROM bis.Element e\");\r\n let props: QueryPropertyMetaData[] = await reader.getMetaData();\r\n assert.equal(props.length, 1);\r\n assert.equal(props[0].accessString, \"ECClassId\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT Model.Id, e.Model.Id, Model.RelECClassId, e.Model.RelECClassId FROM bis.Element e\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 4);\r\n assert.equal(props[0].accessString, \"Model.Id\");\r\n assert.equal(props[1].accessString, \"Model.Id\");\r\n assert.equal(props[2].accessString, \"Model.RelECClassId\");\r\n assert.equal(props[3].accessString, \"Model.RelECClassId\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT Origin.X, Origin.Y, TypeDefinition FROM bis.GeometricElement2d ge\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 3);\r\n assert.equal(props[0].accessString, \"Origin.X\");\r\n assert.equal(props[1].accessString, \"Origin.Y\");\r\n assert.equal(props[2].accessString, \"TypeDefinition\");\r\n assert.equal(props[2].typeName, \"navigation\");\r\n\r\n reader = imodel1.createQueryReader(\"SELECT 1, 1 + 6, * FROM (VALUES(1,2), (2,3))\");\r\n props = await reader.getMetaData();\r\n assert.equal(props.length, 4);\r\n assert.equal(props[0].accessString, \"1\");\r\n assert.equal(props[0].jsonName, \"1\");\r\n assert.equal(props[1].accessString, \"1 + 6\");\r\n assert.equal(props[1].typeName, \"double\");\r\n assert.equal(props[2].accessString, \"1_1\");\r\n assert.equal(props[2].jsonName, \"1_1\");\r\n assert.equal(props[3].accessString, \"2\");\r\n });\r\n it(\"concurrent query quota\", async () => {\r\n let reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { count: 4 } });\r\n let rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 4);\r\n reader = imodel1.createQueryReader(\"SELECT * FROM BisCore.element\", undefined, { limit: { offset: 4, count: 4 } });\r\n rows = 0;\r\n while (await reader.step()) {\r\n rows++;\r\n }\r\n assert.equal(rows, 4);\r\n });\r\n it(\"paging results\", async () => {\r\n const getRowPerPage = (nPageSize: number, nRowCount: number) => {\r\n const nRowPerPage = nRowCount / nPageSize;\r\n const nPages = Math.ceil(nRowPerPage);\r\n const nRowOnLastPage = nRowCount - (Math.floor(nRowPerPage) * pageSize);\r\n const pages = new Array(nPages).fill(pageSize);\r\n if (nRowPerPage) {\r\n pages[nPages - 1] = nRowOnLastPage;\r\n }\r\n return pages;\r\n };\r\n\r\n const pageSize = 5;\r\n const query = \"SELECT ECInstanceId as Id, Parent.Id as ParentId FROM BisCore.element\";\r\n const dbs = [imodel1, imodel2, imodel3, imodel4, imodel5];\r\n const pendingRowCount = [];\r\n for (const db of dbs) {\r\n for await (const row of db.createQueryReader(`SELECT count(*) FROM (${query})`)) {\r\n pendingRowCount.push(row[0] as number);\r\n }\r\n }\r\n\r\n const rowCounts = pendingRowCount;\r\n const expected = [46, 62, 7, 7, 28];\r\n assert.equal(rowCounts.length, expected.length);\r\n for (let i = 0; i < expected.length; i++) {\r\n assert.equal(rowCounts[i], expected[i]);\r\n }\r\n // verify row per page\r\n for (const db of dbs) {\r\n const i = dbs.indexOf(db);\r\n const rowPerPage = getRowPerPage(pageSize, expected[i]);\r\n for (let k = 0; k < rowPerPage.length; k++) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const rs = await db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames, limit: { count: pageSize, offset: k * pageSize } }).toArray();\r\n assert.equal(rs.length, rowPerPage[k]);\r\n }\r\n }\r\n\r\n // verify async iterator\r\n for (const db of dbs) {\r\n const resultSet = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of db.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\r\n const row = queryRow.toRow();\r\n resultSet.push(row);\r\n assert.isTrue(Reflect.has(row, \"id\"));\r\n if (Reflect.ownKeys(row).length > 1) {\r\n assert.isTrue(Reflect.has(row, \"parentId\"));\r\n const parentId: string = row.parentId as string;\r\n assert.isTrue(Id64.isValidId64(parentId));\r\n }\r\n const id: string = row.id as string;\r\n assert.isTrue(Id64.isValidId64(id));\r\n }\r\n const entry = dbs.indexOf(db);\r\n assert.equal(rowCounts[entry], resultSet.length);\r\n }\r\n });\r\n\r\n describe(\"supports_instance_query\", () => {\r\n it(\"returns 1 for entity classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Entity class BisCore.Element should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 1 for link table relationship classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.CategorySelectorRefersToCategories')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Link table relationship should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 1 for link table relationship with external class ids\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.ModelSelectorRefersToModels')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"ModelSelectorRefersToModels (link table with external class ids) should support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 0 for non-existent classes\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('BisCore.DoesNotExist')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 0, \"Non-existent class should not support instance queries\");\r\n }\r\n });\r\n\r\n it(\"returns 0 for NULL input\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query(NULL)\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 0, \"NULL input should return 0\");\r\n }\r\n });\r\n\r\n it(\"works with schema alias:class format\", async () => {\r\n for await (const row of imodel1.createQueryReader(\"SELECT supports_instance_query('bis:Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Should work with alias:class format\");\r\n }\r\n });\r\n\r\n it(\"works with integer class id\", async () => {\r\n // First get the class id for BisCore.Element\r\n let classId: number | undefined;\r\n for await (const row of imodel1.createQueryReader(\"SELECT ec_classid('BisCore', 'Element')\", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n classId = row[0] as number;\r\n }\r\n assert.isDefined(classId, \"Should be able to resolve BisCore.Element class id\");\r\n\r\n for await (const row of imodel1.createQueryReader(`SELECT supports_instance_query(${classId})`, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {\r\n assert.equal(row[0], 1, \"Should work with integer class id\");\r\n }\r\n });\r\n\r\n it(\"can be used to filter classes that support instance queries\", async () => {\r\n // Example: find all classes in a schema that support SELECT $\r\n const rows: any[] = [];\r\n for await (const row of imodel1.createQueryReader(\r\n `SELECT c.Name, supports_instance_query(c.ECInstanceId) as supported\r\n FROM meta.ECClassDef c\r\n JOIN meta.ECSchemaDef s ON c.Schema.Id = s.ECInstanceId\r\n WHERE s.Name = 'BisCore' AND supports_instance_query(c.ECInstanceId) = 1\r\n LIMIT 5`,\r\n undefined,\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n )) {\r\n rows.push(row.toRow());\r\n }\r\n assert.isAbove(rows.length, 0, \"Should find at least one BisCore class that supports instance queries\");\r\n for (const row of rows) {\r\n assert.equal(row.supported, 1);\r\n }\r\n });\r\n });\r\n\r\n describe(\"instance query on link table relationships\", () => {\r\n it(\"SELECT $ works for link table relationship with external class ids\", async () => {\r\n // ModelSelectorRefersToModels is a link table relationship where SourceECClassId\r\n // and TargetECClassId may be stored in external tables. This was previously failing\r\n // with a SQLite syntax error due to bugs in CreateLinkTableView.\r\n let rowCount = 0;\r\n for await (const row of imodel1.createQueryReader(\r\n \"SELECT $ FROM BisCore.ModelSelectorRefersToModels\",\r\n undefined,\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n { rowFormat: QueryRowFormat.UseJsPropertyNames },\r\n )) {\r\n const instance = row.toRow();\r\n const json = instance.$;\r\n assert.isDefined(json, \"$ column should be defined\");\r\n const parsed = typeof json === \"string\" ? JSON.parse(json) : json;\r\n assert.isDefined(parsed.ECInstanceId, \"Instance must have ECInstanceId\");\r\n assert.isDefined(parsed.ECClassId, \"Instance must have ECClassId\");\r\n assert.isDefined(parsed.SourceECInstanceId, \"Instance must have SourceECInstanceId\");\r\n assert.isDefined(parsed.TargetECInstanceId, \"Instance must have TargetECInstanceId\");\r\n rowCount++;\r\n }\r\n // The query should at least not crash — whether there are rows depends on the test file\r\n assert.isAtLeast(rowCount, 0, \"Query should execute without error\");\r\n });\r\n });\r\n});\r\n"]}
@@ -75,12 +75,87 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
75
75
  after(async () => {
76
76
  iModel.close();
77
77
  });
78
+ it("formats blob results", async () => {
79
+ const env_1 = { stack: [], error: void 0, hasError: false };
80
+ try {
81
+ const ecdb = __addDisposableResource(env_1, ECDbTestHelper.createECDb(KnownTestLocations.outputDir, "ecsql-reader-blobs.ecdb", `<?xml version="1.0" encoding="utf-8"?>
82
+ <ECSchema schemaName="MySchema" alias="myschema" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
83
+ <ECEntityClass typeName="BlobExample">
84
+ <ECProperty propertyName="Data" typeName="binary" />
85
+ </ECEntityClass>
86
+ </ECSchema>`), false);
87
+ const blob = new Uint8Array([1, 2, 3]);
88
+ const insertStatus = ecdb.withWriteStatement("INSERT INTO myschema.BlobExample(Data) VALUES(?)", (stmt) => {
89
+ stmt.bindBlob(1, blob);
90
+ return stmt.step();
91
+ });
92
+ assert.equal(insertStatus, DbResult.BE_SQLITE_DONE);
93
+ ecdb.saveChanges();
94
+ for (const abbreviateBlobs of [undefined, false, true]) {
95
+ const query = "SELECT Data FROM myschema.BlobExample";
96
+ const expected = abbreviateBlobs ? '{"bytes":3}' : blob;
97
+ const asyncRows = await ecdb.createQueryReader(query, undefined, { abbreviateBlobs }).toArray();
98
+ const syncRows = ecdb.withQueryReader(query, (reader) => reader.toArray(), undefined, { abbreviateBlobs });
99
+ assert.deepEqual(asyncRows, [[expected]]);
100
+ assert.deepEqual(syncRows, [[expected]]);
101
+ }
102
+ }
103
+ catch (e_1) {
104
+ env_1.error = e_1;
105
+ env_1.hasError = true;
106
+ }
107
+ finally {
108
+ __disposeResources(env_1);
109
+ }
110
+ });
111
+ it("preserves row formats and bindings", async () => {
112
+ const rootSelect = "SELECT ECInstanceId, ECClassId FROM bis.Element WHERE ECInstanceId=?";
113
+ const asyncIndexRows = await iModel.createQueryReader(rootSelect, new QueryBinder().bindId(1, "0x1")).toArray();
114
+ assert.isArray(asyncIndexRows[0]);
115
+ assert.equal(asyncIndexRows[0][0], "0x1");
116
+ assert.isTrue(Id64.isValidId64(asyncIndexRows[0][1]));
117
+ const asyncECSqlNameRows = await iModel.createQueryReader(rootSelect, new QueryBinder().bindId(1, "0x1"), { rowFormat: QueryRowFormat.UseECSqlPropertyNames }).toArray();
118
+ assert.equal(asyncECSqlNameRows[0].ECInstanceId, "0x1");
119
+ assert.isTrue(Id64.isValidId64(asyncECSqlNameRows[0].ECClassId));
120
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
121
+ const asyncJsNameRows = await iModel.createQueryReader(rootSelect, new QueryBinder().bindId(1, "0x1"), { rowFormat: QueryRowFormat.UseJsPropertyNames }).toArray();
122
+ assert.equal(asyncJsNameRows[0].id, "0x1");
123
+ assert.equal(asyncJsNameRows[0].className, "BisCore.Subject");
124
+ const syncIndexRows = iModel.withQueryReader(rootSelect, (reader) => reader.toArray(), new QueryBinder().bindId(1, "0x1"));
125
+ assert.isArray(syncIndexRows[0]);
126
+ assert.equal(syncIndexRows[0][0], "0x1");
127
+ assert.isTrue(Id64.isValidId64(syncIndexRows[0][1]));
128
+ const syncECSqlNameRows = iModel.withQueryReader(rootSelect, (reader) => reader.toArray(), new QueryBinder().bindId(1, "0x1"), { rowFormat: QueryRowFormat.UseECSqlPropertyNames });
129
+ assert.equal(syncECSqlNameRows[0].ECInstanceId, "0x1");
130
+ assert.isTrue(Id64.isValidId64(syncECSqlNameRows[0].ECClassId));
131
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
132
+ const syncJsNameRows = iModel.withQueryReader(rootSelect, (reader) => reader.toArray(), new QueryBinder().bindId(1, "0x1"), { rowFormat: QueryRowFormat.UseJsPropertyNames });
133
+ assert.equal(syncJsNameRows[0].id, "0x1");
134
+ assert.equal(syncJsNameRows[0].className, "BisCore.Subject");
135
+ const asyncReader = iModel.createQueryReader(rootSelect, new QueryBinder().bindId(1, "0x1"));
136
+ assert.isTrue(await asyncReader.step());
137
+ const asyncObjectRow = asyncReader.current.toRow();
138
+ assert.isFalse(Array.isArray(asyncObjectRow));
139
+ assert.equal(asyncObjectRow.ECInstanceId, "0x1");
140
+ const objectRow = iModel.withQueryReader(rootSelect, (reader) => {
141
+ assert.isTrue(reader.step());
142
+ return reader.current.toRow();
143
+ }, new QueryBinder().bindId(1, "0x1"));
144
+ assert.isObject(objectRow);
145
+ assert.equal(objectRow.ECInstanceId, "0x1");
146
+ const arrayRows = iModel.withQueryReader(rootSelect, (reader) => reader.toArray(), new QueryBinder().bindId(1, "0x1"));
147
+ assert.isArray(arrayRows[0]);
148
+ const idSetRows = await iModel.createQueryReader("SELECT ECInstanceId FROM bis.Element WHERE InVirtualSet(?, ECInstanceId)", new QueryBinder().bindIdSet(1, ["0x1", "0x2"])).toArray();
149
+ assert.isTrue(idSetRows.some((row) => row[0] === "0x1"));
150
+ const syncIdSetRows = iModel.withQueryReader("SELECT ECInstanceId FROM bis.Element WHERE InVirtualSet(?, ECInstanceId)", (reader) => reader.toArray(), new QueryBinder().bindIdSet(1, ["0x1", "0x2"]));
151
+ assert.sameDeepMembers(syncIdSetRows, idSetRows);
152
+ });
78
153
  describe("bind Id64 enumerable", async () => {
79
154
  const outDir = KnownTestLocations.outputDir;
80
155
  it("ecsql reader simple", async () => {
81
- const env_1 = { stack: [], error: void 0, hasError: false };
156
+ const env_2 = { stack: [], error: void 0, hasError: false };
82
157
  try {
83
- const ecdb = __addDisposableResource(env_1, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
158
+ const ecdb = __addDisposableResource(env_2, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
84
159
  <ECEntityClass typeName="Foo" modifier="Sealed">
85
160
  <ECProperty propertyName="n" typeName="int"/>
86
161
  </ECEntityClass>
@@ -106,18 +181,18 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
106
181
  const reader = ecdb.createQueryReader("SELECT ECInstanceId, Name FROM meta.ECClassDef WHERE InVirtualSet(?, ECInstanceId)", params, optionBuilder.getOptions());
107
182
  await readerCallback(reader);
108
183
  }
109
- catch (e_1) {
110
- env_1.error = e_1;
111
- env_1.hasError = true;
184
+ catch (e_2) {
185
+ env_2.error = e_2;
186
+ env_2.hasError = true;
112
187
  }
113
188
  finally {
114
- __disposeResources(env_1);
189
+ __disposeResources(env_2);
115
190
  }
116
191
  });
117
192
  it("ecsql reader simple for IdSet", async () => {
118
- const env_2 = { stack: [], error: void 0, hasError: false };
193
+ const env_3 = { stack: [], error: void 0, hasError: false };
119
194
  try {
120
- const ecdb = __addDisposableResource(env_2, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
195
+ const ecdb = __addDisposableResource(env_3, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
121
196
  <ECEntityClass typeName="Foo" modifier="Sealed">
122
197
  <ECProperty propertyName="n" typeName="int"/>
123
198
  </ECEntityClass>
@@ -143,18 +218,18 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
143
218
  const reader = ecdb.createQueryReader("SELECT ECInstanceId, Name FROM meta.ECClassDef, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", params, optionBuilder.getOptions());
144
219
  await readerCallback(reader);
145
220
  }
146
- catch (e_2) {
147
- env_2.error = e_2;
148
- env_2.hasError = true;
221
+ catch (e_3) {
222
+ env_3.error = e_3;
223
+ env_3.hasError = true;
149
224
  }
150
225
  finally {
151
- __disposeResources(env_2);
226
+ __disposeResources(env_3);
152
227
  }
153
228
  });
154
229
  it("bindIdSet throws on invalid integer Ids", () => {
155
- const env_3 = { stack: [], error: void 0, hasError: false };
230
+ const env_4 = { stack: [], error: void 0, hasError: false };
156
231
  try {
157
- const ecdb = __addDisposableResource(env_3, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
232
+ const ecdb = __addDisposableResource(env_4, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
158
233
  <ECEntityClass typeName="Foo" modifier="Sealed">
159
234
  <ECProperty propertyName="n" typeName="int"/>
160
235
  </ECEntityClass>
@@ -164,18 +239,18 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
164
239
  const params = new QueryBinder();
165
240
  expect(() => params.bindIdSet(1, ["50"])).to.throw(/is not a valid Id64String/);
166
241
  }
167
- catch (e_3) {
168
- env_3.error = e_3;
169
- env_3.hasError = true;
242
+ catch (e_4) {
243
+ env_4.error = e_4;
244
+ env_4.hasError = true;
170
245
  }
171
246
  finally {
172
- __disposeResources(env_3);
247
+ __disposeResources(env_4);
173
248
  }
174
249
  });
175
250
  it("ecsql reader simple using query reader", async () => {
176
- const env_4 = { stack: [], error: void 0, hasError: false };
251
+ const env_5 = { stack: [], error: void 0, hasError: false };
177
252
  try {
178
- const ecdb = __addDisposableResource(env_4, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
253
+ const ecdb = __addDisposableResource(env_5, ECDbTestHelper.createECDb(outDir, "test.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
179
254
  <ECEntityClass typeName="Foo" modifier="Sealed">
180
255
  <ECProperty propertyName="n" typeName="int"/>
181
256
  </ECEntityClass>
@@ -215,12 +290,12 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
215
290
  const reader = ecdb.createQueryReader("SELECT ECInstanceId, n FROM ts.Foo WHERE ECInstanceId=:firstId", params, { limit: { count: 1 } });
216
291
  await readerCallback(reader);
217
292
  }
218
- catch (e_4) {
219
- env_4.error = e_4;
220
- env_4.hasError = true;
293
+ catch (e_5) {
294
+ env_5.error = e_5;
295
+ env_5.hasError = true;
221
296
  }
222
297
  finally {
223
- __disposeResources(env_4);
298
+ __disposeResources(env_5);
224
299
  }
225
300
  });
226
301
  it("ecsql reader simple using query row reader", async () => {
@@ -255,10 +330,10 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
255
330
  await readerCallback(reader);
256
331
  });
257
332
  it("should bind Range3d", async () => {
258
- const env_5 = { stack: [], error: void 0, hasError: false };
333
+ const env_6 = { stack: [], error: void 0, hasError: false };
259
334
  try {
260
335
  const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);
261
- const ecdb = __addDisposableResource(env_5, ECDbTestHelper.createECDb(outDir, "bindrange3d.ecdb", `<ECSchema schemaName="Test" alias="test" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
336
+ const ecdb = __addDisposableResource(env_6, ECDbTestHelper.createECDb(outDir, "bindrange3d.ecdb", `<ECSchema schemaName="Test" alias="test" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
262
337
  <ECEntityClass typeName="Foo" modifier="Sealed">
263
338
  <ECProperty propertyName="Range3d" typeName="binary"/>
264
339
  </ECEntityClass>
@@ -280,12 +355,12 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
280
355
  const actualRange = new Range3d(...rangeFloatArray);
281
356
  assert.isTrue(actualRange.isAlmostEqual(testRange));
282
357
  }
283
- catch (e_5) {
284
- env_5.error = e_5;
285
- env_5.hasError = true;
358
+ catch (e_6) {
359
+ env_6.error = e_6;
360
+ env_6.hasError = true;
286
361
  }
287
362
  finally {
288
- __disposeResources(env_5);
363
+ __disposeResources(env_6);
289
364
  }
290
365
  });
291
366
  });