@itwin/core-backend 5.5.0-dev.11 → 5.5.0-dev.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js +2 -2
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +6 -3
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/package.json +13 -13
|
@@ -660,7 +660,7 @@ describe("ECSql Query", () => {
|
|
|
660
660
|
pendingRowCount.push(row[0]);
|
|
661
661
|
}
|
|
662
662
|
}
|
|
663
|
-
const rowCounts =
|
|
663
|
+
const rowCounts = pendingRowCount;
|
|
664
664
|
const expected = [46, 62, 7, 7, 28];
|
|
665
665
|
assert.equal(rowCounts.length, expected.length);
|
|
666
666
|
for (let i = 0; i < expected.length; i++) {
|
|
@@ -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 { assert } from \"chai\";\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 { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { _nativeDb, ECSqlStatement, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\nimport * as path from \"path\";\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 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 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 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\", () => { }), \"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\", () => { }), \"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 it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\r\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\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, 1);\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, 1);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", 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 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 = await Promise.all(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 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 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"]}
|
|
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 { assert } from \"chai\";\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 { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { _nativeDb, ECSqlStatement, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\nimport * as path from \"path\";\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 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 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 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\", () => { }), \"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\", () => { }), \"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 it(\"concurrent query bind idset with invalid values in IdSet virtual table\", async () => {\r\n const ids: string[] = [\"0x1\", \"ABC\", \"YZ\"];\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, 1);\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, 1);\r\n assert.isTrue(reader.stats.backendCpuTime > 0);\r\n });\r\n it(\"concurrent query bind idset with invalid values in IdSet virtual table\", 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 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 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 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"]}
|
|
@@ -86,7 +86,7 @@ describe("DgnDbWorker", () => {
|
|
|
86
86
|
const workers = first.concat(next);
|
|
87
87
|
for (const worker of workers)
|
|
88
88
|
worker.setReady();
|
|
89
|
-
await Promise.all(workers.map((x) => x.promise)); // eslint-disable-line @typescript-eslint/promise-function-async
|
|
89
|
+
await Promise.all(workers.map((x) => x.promise).filter((p) => p !== undefined)); // eslint-disable-line @typescript-eslint/promise-function-async
|
|
90
90
|
expect(workers.every((x) => x.isOk)).to.be.true;
|
|
91
91
|
});
|
|
92
92
|
it("skips execution if canceled before execution begins", async () => {
|
|
@@ -152,7 +152,7 @@ describe("DgnDbWorker", () => {
|
|
|
152
152
|
imodel.cancelSnap(sessionId);
|
|
153
153
|
// Clear the worker thread pool so the snap request (now canceled) can be processed.
|
|
154
154
|
blockers.forEach((w) => w.setReady());
|
|
155
|
-
await Promise.all(blockers.map(async (w) => w.promise));
|
|
155
|
+
await Promise.all(blockers.map(async (w) => w.promise).filter((p) => p !== undefined));
|
|
156
156
|
await toBeRejected;
|
|
157
157
|
});
|
|
158
158
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DgnDbWorker.test.js","sourceRoot":"","sources":["../../../../src/test/native/DgnDbWorker.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\n\r\nimport { assert, expect } from \"chai\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { Matrix4d } from \"@itwin/core-geometry\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\nimport { StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\n\r\ndescribe(\"DgnDbWorker\", () => {\r\n let imodel: StandaloneDb;\r\n\r\n function openIModel(): void {\r\n const rootSubject = { name: \"DgnDbWorker tests\", description: \"DgnDbWorker tests\" };\r\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"DgnDbWorker\", \"DgnDbWorker.bim\"), { rootSubject });\r\n }\r\n\r\n before(() => {\r\n openIModel();\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n class Worker {\r\n public promise: Promise<void> | undefined;\r\n private readonly _worker: IModelJsNative.TestWorker;\r\n\r\n public constructor() {\r\n this._worker = new IModelNative.platform.TestWorker(imodel[_nativeDb]);\r\n }\r\n\r\n public queue() { this.promise = this._worker.queue(); }\r\n public cancel() { this._worker.cancel(); }\r\n public setReady() { this._worker.setReady(); }\r\n public setThrow() { this._worker.setThrow(); }\r\n\r\n public get isCanceled(): boolean { return this._worker.isCanceled(); }\r\n public get wasExecuted(): boolean { return this._worker.wasExecuted(); }\r\n public get state(): IModelJsNative.TestWorkerState { return this._worker.getState(); }\r\n\r\n public get wasQueued() { return IModelJsNative.TestWorkerState.NotQueued !== this.state; }\r\n public get isQueued() { return IModelJsNative.TestWorkerState.Queued === this.state; }\r\n public get isRunning() { return IModelJsNative.TestWorkerState.Running === this.state; }\r\n public get isError() { return IModelJsNative.TestWorkerState.Error === this.state; }\r\n public get isOk() { return IModelJsNative.TestWorkerState.Ok === this.state; }\r\n public get isSkipped() { return IModelJsNative.TestWorkerState.Skipped === this.state; }\r\n public get isAborted() { return IModelJsNative.TestWorkerState.Aborted === this.state; }\r\n }\r\n\r\n async function waitUntil(condition: () => boolean): Promise<void> {\r\n if (condition())\r\n return;\r\n\r\n await new Promise<void>((resolve: any) => setTimeout(resolve, 100));\r\n return waitUntil(condition);\r\n }\r\n\r\n it(\"executes asynchronously\", async () => {\r\n const worker = new Worker();\r\n await BeDuration.wait(1000);\r\n expect(worker.wasQueued).to.be.false;\r\n expect(worker.isCanceled).to.be.false;\r\n\r\n worker.queue();\r\n expect(worker.isQueued || worker.isRunning).to.be.true;\r\n\r\n worker.setReady();\r\n await worker.promise;\r\n\r\n expect(worker.wasExecuted).to.be.true;\r\n expect(worker.isCanceled).to.be.false;\r\n expect(worker.isOk).to.be.true;\r\n });\r\n\r\n it(\"executes a maximum of 4 simultaneously\", async () => {\r\n // Create 4 workers. They should all start executing.\r\n const first = [new Worker(), new Worker(), new Worker(), new Worker()];\r\n for (const worker of first)\r\n worker.queue();\r\n\r\n await waitUntil(() => first.every((x) => x.isRunning));\r\n\r\n // Queue up 2 more workers. They should not start executing until at least one of the first 4 resolves.\r\n const next = [new Worker(), new Worker()];\r\n for (const worker of next)\r\n worker.queue();\r\n\r\n await BeDuration.wait(1000);\r\n expect(first.every((x) => x.isRunning)).to.be.true;\r\n expect(next.every((x) => x.isQueued)).to.be.true;\r\n\r\n // Let the first worker resolve.\r\n first[0].setReady();\r\n await first[0].promise;\r\n expect(first[0].isOk).to.be.true;\r\n\r\n // Exactly one of the 2 workers remaining in the queue should start executing.\r\n await waitUntil(() => next.some((x) => x.isRunning));\r\n await BeDuration.wait(1000);\r\n expect(next.every((x) => x.isRunning)).to.be.false;\r\n\r\n // Clear the queue.\r\n const workers = first.concat(next);\r\n for (const worker of workers)\r\n worker.setReady();\r\n\r\n await Promise.all(workers.map((x) => x.promise)); // eslint-disable-line @typescript-eslint/promise-function-async\r\n expect(workers.every((x) => x.isOk)).to.be.true;\r\n });\r\n\r\n it(\"skips execution if canceled before execution begins\", async () => {\r\n const worker = new Worker();\r\n worker.cancel();\r\n expect(worker.isCanceled).to.be.true;\r\n worker.queue();\r\n await assert.isRejected(worker.promise!, \"canceled\");\r\n expect(worker.isSkipped).to.be.true;\r\n expect(worker.wasExecuted).to.be.false;\r\n });\r\n\r\n it(\"executes if canceled after execution begins\", async () => {\r\n const worker = new Worker();\r\n worker.queue();\r\n await waitUntil(() => worker.isRunning);\r\n worker.cancel();\r\n worker.setReady();\r\n await worker.promise;\r\n expect(worker.isCanceled).to.be.true;\r\n expect(worker.isSkipped).to.be.false;\r\n expect(worker.wasExecuted).to.be.true;\r\n });\r\n\r\n it(\"throws\", async () => {\r\n const worker = new Worker();\r\n worker.setThrow();\r\n worker.queue();\r\n await assert.isRejected(worker.promise!, \"throw\");\r\n expect(worker.isCanceled).to.be.false;\r\n expect(worker.isError).to.be.true;\r\n });\r\n\r\n it(\"cancels all workers before iModel is closed\", async () => {\r\n const resolve = new Worker();\r\n resolve.setReady();\r\n const reject = new Worker();\r\n reject.setThrow();\r\n\r\n // These 6 workers will never resolve nor reject explicitly.\r\n const cancel = [new Worker(), new Worker(), new Worker(), new Worker(), new Worker(), new Worker()];\r\n\r\n // Queue up all the workers.\r\n const workers = cancel.concat([resolve, reject]);\r\n for (const worker of workers)\r\n worker.queue();\r\n\r\n // Closing the iModel cancels all extant workers.\r\n imodel.close();\r\n openIModel();\r\n\r\n await expect(Promise.all(workers.map(async (x) => x.promise))).rejectedWith(\"canceled\");\r\n\r\n expect(cancel.every((x) => x.isCanceled)).to.be.true;\r\n expect(cancel.every((x) => x.isAborted || x.isSkipped)).to.be.true;\r\n expect(resolve.isOk || resolve.isSkipped || resolve.isAborted).to.be.true;\r\n expect(reject.isError || reject.isSkipped).to.be.true;\r\n });\r\n\r\n it(\"cancels a snap request\", async () => {\r\n // Block the worker thread pool with 4 workers so that our snap cannot complete before they complete.\r\n const blockers = [new Worker(), new Worker(), new Worker(), new Worker()];\r\n blockers.forEach((w) => w.queue());\r\n\r\n const sessionId = \"0x222\";\r\n const snap = imodel.requestSnap(sessionId, {\r\n testPoint: { x: 1, y: 2, z: 3 },\r\n closePoint: { x: 1, y: 2, z: 3 },\r\n id: \"0x111\",\r\n worldToView: Matrix4d.createIdentity().toJSON(),\r\n });\r\n\r\n const toBeRejected = expect(snap).to.be.rejectedWith(\"aborted\");\r\n imodel.cancelSnap(sessionId);\r\n\r\n // Clear the worker thread pool so the snap request (now canceled) can be processed.\r\n blockers.forEach((w) => w.setReady());\r\n await Promise.all(blockers.map(async (w) => w.promise));\r\n\r\n await toBeRejected;\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"DgnDbWorker.test.js","sourceRoot":"","sources":["../../../../src/test/native/DgnDbWorker.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\n\r\nimport { assert, expect } from \"chai\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { Matrix4d } from \"@itwin/core-geometry\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\nimport { StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\n\r\ndescribe(\"DgnDbWorker\", () => {\r\n let imodel: StandaloneDb;\r\n\r\n function openIModel(): void {\r\n const rootSubject = { name: \"DgnDbWorker tests\", description: \"DgnDbWorker tests\" };\r\n imodel = StandaloneDb.createEmpty(IModelTestUtils.prepareOutputFile(\"DgnDbWorker\", \"DgnDbWorker.bim\"), { rootSubject });\r\n }\r\n\r\n before(() => {\r\n openIModel();\r\n });\r\n\r\n after(() => {\r\n imodel.close();\r\n });\r\n\r\n class Worker {\r\n public promise: Promise<void> | undefined;\r\n private readonly _worker: IModelJsNative.TestWorker;\r\n\r\n public constructor() {\r\n this._worker = new IModelNative.platform.TestWorker(imodel[_nativeDb]);\r\n }\r\n\r\n public queue() { this.promise = this._worker.queue(); }\r\n public cancel() { this._worker.cancel(); }\r\n public setReady() { this._worker.setReady(); }\r\n public setThrow() { this._worker.setThrow(); }\r\n\r\n public get isCanceled(): boolean { return this._worker.isCanceled(); }\r\n public get wasExecuted(): boolean { return this._worker.wasExecuted(); }\r\n public get state(): IModelJsNative.TestWorkerState { return this._worker.getState(); }\r\n\r\n public get wasQueued() { return IModelJsNative.TestWorkerState.NotQueued !== this.state; }\r\n public get isQueued() { return IModelJsNative.TestWorkerState.Queued === this.state; }\r\n public get isRunning() { return IModelJsNative.TestWorkerState.Running === this.state; }\r\n public get isError() { return IModelJsNative.TestWorkerState.Error === this.state; }\r\n public get isOk() { return IModelJsNative.TestWorkerState.Ok === this.state; }\r\n public get isSkipped() { return IModelJsNative.TestWorkerState.Skipped === this.state; }\r\n public get isAborted() { return IModelJsNative.TestWorkerState.Aborted === this.state; }\r\n }\r\n\r\n async function waitUntil(condition: () => boolean): Promise<void> {\r\n if (condition())\r\n return;\r\n\r\n await new Promise<void>((resolve: any) => setTimeout(resolve, 100));\r\n return waitUntil(condition);\r\n }\r\n\r\n it(\"executes asynchronously\", async () => {\r\n const worker = new Worker();\r\n await BeDuration.wait(1000);\r\n expect(worker.wasQueued).to.be.false;\r\n expect(worker.isCanceled).to.be.false;\r\n\r\n worker.queue();\r\n expect(worker.isQueued || worker.isRunning).to.be.true;\r\n\r\n worker.setReady();\r\n await worker.promise;\r\n\r\n expect(worker.wasExecuted).to.be.true;\r\n expect(worker.isCanceled).to.be.false;\r\n expect(worker.isOk).to.be.true;\r\n });\r\n\r\n it(\"executes a maximum of 4 simultaneously\", async () => {\r\n // Create 4 workers. They should all start executing.\r\n const first = [new Worker(), new Worker(), new Worker(), new Worker()];\r\n for (const worker of first)\r\n worker.queue();\r\n\r\n await waitUntil(() => first.every((x) => x.isRunning));\r\n\r\n // Queue up 2 more workers. They should not start executing until at least one of the first 4 resolves.\r\n const next = [new Worker(), new Worker()];\r\n for (const worker of next)\r\n worker.queue();\r\n\r\n await BeDuration.wait(1000);\r\n expect(first.every((x) => x.isRunning)).to.be.true;\r\n expect(next.every((x) => x.isQueued)).to.be.true;\r\n\r\n // Let the first worker resolve.\r\n first[0].setReady();\r\n await first[0].promise;\r\n expect(first[0].isOk).to.be.true;\r\n\r\n // Exactly one of the 2 workers remaining in the queue should start executing.\r\n await waitUntil(() => next.some((x) => x.isRunning));\r\n await BeDuration.wait(1000);\r\n expect(next.every((x) => x.isRunning)).to.be.false;\r\n\r\n // Clear the queue.\r\n const workers = first.concat(next);\r\n for (const worker of workers)\r\n worker.setReady();\r\n\r\n await Promise.all(workers.map((x) => x.promise).filter((p): p is Promise<void> => p !== undefined)); // eslint-disable-line @typescript-eslint/promise-function-async\r\n expect(workers.every((x) => x.isOk)).to.be.true;\r\n });\r\n\r\n it(\"skips execution if canceled before execution begins\", async () => {\r\n const worker = new Worker();\r\n worker.cancel();\r\n expect(worker.isCanceled).to.be.true;\r\n worker.queue();\r\n await assert.isRejected(worker.promise!, \"canceled\");\r\n expect(worker.isSkipped).to.be.true;\r\n expect(worker.wasExecuted).to.be.false;\r\n });\r\n\r\n it(\"executes if canceled after execution begins\", async () => {\r\n const worker = new Worker();\r\n worker.queue();\r\n await waitUntil(() => worker.isRunning);\r\n worker.cancel();\r\n worker.setReady();\r\n await worker.promise;\r\n expect(worker.isCanceled).to.be.true;\r\n expect(worker.isSkipped).to.be.false;\r\n expect(worker.wasExecuted).to.be.true;\r\n });\r\n\r\n it(\"throws\", async () => {\r\n const worker = new Worker();\r\n worker.setThrow();\r\n worker.queue();\r\n await assert.isRejected(worker.promise!, \"throw\");\r\n expect(worker.isCanceled).to.be.false;\r\n expect(worker.isError).to.be.true;\r\n });\r\n\r\n it(\"cancels all workers before iModel is closed\", async () => {\r\n const resolve = new Worker();\r\n resolve.setReady();\r\n const reject = new Worker();\r\n reject.setThrow();\r\n\r\n // These 6 workers will never resolve nor reject explicitly.\r\n const cancel = [new Worker(), new Worker(), new Worker(), new Worker(), new Worker(), new Worker()];\r\n\r\n // Queue up all the workers.\r\n const workers = cancel.concat([resolve, reject]);\r\n for (const worker of workers)\r\n worker.queue();\r\n\r\n // Closing the iModel cancels all extant workers.\r\n imodel.close();\r\n openIModel();\r\n\r\n await expect(Promise.all(workers.map(async (x) => x.promise))).rejectedWith(\"canceled\");\r\n\r\n expect(cancel.every((x) => x.isCanceled)).to.be.true;\r\n expect(cancel.every((x) => x.isAborted || x.isSkipped)).to.be.true;\r\n expect(resolve.isOk || resolve.isSkipped || resolve.isAborted).to.be.true;\r\n expect(reject.isError || reject.isSkipped).to.be.true;\r\n });\r\n\r\n it(\"cancels a snap request\", async () => {\r\n // Block the worker thread pool with 4 workers so that our snap cannot complete before they complete.\r\n const blockers = [new Worker(), new Worker(), new Worker(), new Worker()];\r\n blockers.forEach((w) => w.queue());\r\n\r\n const sessionId = \"0x222\";\r\n const snap = imodel.requestSnap(sessionId, {\r\n testPoint: { x: 1, y: 2, z: 3 },\r\n closePoint: { x: 1, y: 2, z: 3 },\r\n id: \"0x111\",\r\n worldToView: Matrix4d.createIdentity().toJSON(),\r\n });\r\n\r\n const toBeRejected = expect(snap).to.be.rejectedWith(\"aborted\");\r\n imodel.cancelSnap(sessionId);\r\n\r\n // Clear the worker thread pool so the snap request (now canceled) can be processed.\r\n blockers.forEach((w) => w.setReady());\r\n await Promise.all(blockers.map(async (w) => w.promise).filter((p): p is Promise<void> => p !== undefined));\r\n\r\n await toBeRejected;\r\n });\r\n});\r\n"]}
|
|
@@ -1114,7 +1114,8 @@ describe("Changeset Reader API", async () => {
|
|
|
1114
1114
|
}
|
|
1115
1115
|
checkClass(firstBriefCase, false, secondBriefCase, false);
|
|
1116
1116
|
// Cleanup
|
|
1117
|
-
|
|
1117
|
+
secondBriefCase.close();
|
|
1118
|
+
firstBriefCase.close();
|
|
1118
1119
|
});
|
|
1119
1120
|
it("Delete class FK constraint violation in cache table through a revert", async () => {
|
|
1120
1121
|
// Helper to check if TestClass exists in schema and cache table for both briefcases
|
|
@@ -1202,7 +1203,8 @@ describe("Changeset Reader API", async () => {
|
|
|
1202
1203
|
checkClass("TestClass", firstBriefCase, true, secondBriefCase, true);
|
|
1203
1204
|
checkClass("AnotherTestClass", firstBriefCase, false, secondBriefCase, false);
|
|
1204
1205
|
// Cleanup
|
|
1205
|
-
|
|
1206
|
+
secondBriefCase.close();
|
|
1207
|
+
firstBriefCase.close();
|
|
1206
1208
|
});
|
|
1207
1209
|
it("Track changeset health stats", async () => {
|
|
1208
1210
|
const adminToken = "super manager token";
|
|
@@ -1301,7 +1303,8 @@ describe("Changeset Reader API", async () => {
|
|
|
1301
1303
|
expect(secondBriefcaseChangeset2.totalFullTableScans).to.be.eql(0);
|
|
1302
1304
|
expect(secondBriefcaseChangeset2.perStatementStats.length).to.be.eql(11);
|
|
1303
1305
|
// Cleanup
|
|
1304
|
-
|
|
1306
|
+
secondBriefcase.close();
|
|
1307
|
+
firstBriefcase.close();
|
|
1305
1308
|
});
|
|
1306
1309
|
it("openInMemory() & step()", async () => {
|
|
1307
1310
|
const adminToken = "super manager token";
|