Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added tests cases for IdSet VirtualTable #7260

Merged
merged 39 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
d6329a7
Tests added for IdSet Virtual Table
soham-bentley Oct 7, 2024
fdea7a8
only removed
soham-bentley Oct 8, 2024
a6a6cd1
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Oct 8, 2024
4a6ffd8
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Oct 14, 2024
ffcf851
More tests added
soham-bentley Oct 14, 2024
67419dc
changeset and lint errors solved
soham-bentley Oct 14, 2024
abe508f
".only" removed
soham-bentley Oct 18, 2024
e483bf8
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Oct 18, 2024
8f66c13
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Oct 24, 2024
2d27e0d
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Oct 25, 2024
4db10da
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 15, 2025
3024b0f
More tests added
soham-bentley Jan 16, 2025
d72679b
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 16, 2025
988ad1b
Documentation added
soham-bentley Jan 16, 2025
63f8771
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 16, 2025
0f0e28d
More tests added
soham-bentley Jan 17, 2025
9197274
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 17, 2025
97d88f2
More tests added and documentation updated
soham-bentley Jan 17, 2025
898dd59
More tests added
soham-bentley Jan 17, 2025
b49d57c
only removed
soham-bentley Jan 17, 2025
c052724
More JOIN tests added
soham-bentley Jan 20, 2025
9b86c14
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 20, 2025
2bc51f0
More tests added
soham-bentley Jan 20, 2025
60397d9
Added more tests and modified the learning resource
soham-bentley Jan 21, 2025
49cbbb6
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 21, 2025
b680360
Merge branch 'master' into Soham/AddingTestsForIdSetVT
khanaffan Jan 21, 2025
d97611c
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 23, 2025
27114ab
Merge remote-tracking branch 'origin/Soham/AddingTestsForIdSetVT' int…
soham-bentley Jan 23, 2025
dfa9e41
Test name modified
soham-bentley Jan 23, 2025
22e6abd
Update in test file
soham-bentley Jan 23, 2025
0237554
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 23, 2025
5da74b9
Removing runtime columns as their value might change
soham-bentley Jan 23, 2025
eb9e7d7
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 24, 2025
937dfa7
Tests updated for IdSet being experimental
soham-bentley Jan 27, 2025
be579ba
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 27, 2025
598dade
Updating tests
soham-bentley Jan 27, 2025
a56ae6d
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 27, 2025
e5de703
Merge remote-tracking branch 'origin/master' into Soham/AddingTestsFo…
soham-bentley Jan 28, 2025
ee6a692
@bentley/imodeljs-native 5.0.42
imodeljs-admin Jan 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"changes": [
{
"packageName": "@itwin/core-backend",
"comment": "",
rschili marked this conversation as resolved.
Show resolved Hide resolved
"type": "none"
}
],
"packageName": "@itwin/core-backend"
}
63 changes: 63 additions & 0 deletions core/backend/src/test/ecdb/ECSqlQuery.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,69 @@ describe("ECSql Query", () => {
assert.isTrue(reader.stats.backendCpuTime > 0);
assert.isTrue(reader.stats.backendMemUsed > 100);
});
it("concurrent query bind idset in IdSet virtual table", async () => {
const ids: string[] = [];
for await (const row of imodel1.createQueryReader("SELECT ECInstanceId FROM BisCore.Element LIMIT 23")) {
ids.push(row[0]);
}
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element, ECVLib.IdSet(?) WHERE id = ECInstanceId", QueryBinder.from([ids]));
let props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
let rows = 0;
while (await reader.step()) {
rows++;
}
assert.equal(rows, 23);
props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
assert.equal(reader.stats.backendRowsReturned, 23);
assert.isTrue(reader.stats.backendCpuTime > 0);
assert.isTrue(reader.stats.backendMemUsed > 100);
});
it("concurrent query bind single id in IdSet virtual table", async () => {
let ids: string = "";
for await (const row of imodel1.createQueryReader("SELECT ECInstanceId FROM BisCore.Element LIMIT 23")) {
ids = row[0]; // getting only the first id
break;
}
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element, ECVLib.IdSet(?) WHERE id = ECInstanceId", QueryBinder.from([ids]));
let props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
let rows = 0; // backend will fail to bind so no rows will be returned
while (await reader.step()) {
rows++;
}
assert.equal(rows, 0);
props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
assert.equal(reader.stats.backendRowsReturned, 0);
assert.isTrue(reader.stats.backendCpuTime > 0);
});
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
const ids: string[] = ["0x1","ABC","YZ"];

const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element, ECVLib.IdSet(?) WHERE id = ECInstanceId", QueryBinder.from([ids]));
let props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
let rows = 0; // backend will bind successfully but some of the values are not valid for IdSet VT so those values will be ignored
while (await reader.step()) {
rows++;
}
assert.equal(rows, 1);
props = await reader.getMetaData();
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
assert.equal(reader.stats.backendRowsReturned, 1);
assert.isTrue(reader.stats.backendCpuTime > 0);
});
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
const ids: string[] = ["ABC", "0x1","YZ"]; // as first value is not an Id so QueryBinder.from will throw error of "unsupported type"

try{
imodel1.createQueryReader("SELECT * FROM BisCore.element, ECVLib.IdSet(?) WHERE id = ECInstanceId", QueryBinder.from([ids]));
}catch(err: any){
assert.equal(err.message, "unsupported type");
}
});
it("concurrent query get meta data", async () => {
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element");
let props = await reader.getMetaData();
Expand Down
39 changes: 39 additions & 0 deletions core/backend/src/test/ecdb/ECSqlReader.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,26 @@ describe("ECSqlReader", (() => {
describe("bind Id64 enumerable", async () => {
const outDir = KnownTestLocations.outputDir;

it("ecsql reader simple", async () => {
await using(ECDbTestHelper.createECDb(outDir, "test.ecdb",
`<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
<ECEntityClass typeName="Foo" modifier="Sealed">
<ECProperty propertyName="n" typeName="int"/>
</ECEntityClass>
</ECSchema>`), async (ecdb: ECDb) => {
assert.isTrue(ecdb.isOpen);
ecdb.saveChanges();
const params = new QueryBinder();
params.bindIdSet(1, ["0x32"]);
const optionBuilder = new QueryOptionsBuilder();
optionBuilder.setRowFormat(QueryRowFormat.UseJsPropertyNames);
reader = ecdb.createQueryReader("SELECT ECInstanceId, Name FROM meta.ECClassDef, ECVLib.IdSet(?) WHERE id = ECInstanceId", params, optionBuilder.getOptions());
const rows = await reader.toArray();
assert.equal(rows[0].id, "0x32");
assert.equal(rows.length, 1);
});
});

it("ecsql reader simple", async () => {
await using(ECDbTestHelper.createECDb(outDir, "test.ecdb",
`<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
Expand All @@ -47,6 +67,25 @@ describe("ECSqlReader", (() => {
});
});

it("bindIdSet not working with integer Ids", async () => {
await using(ECDbTestHelper.createECDb(outDir, "test.ecdb",
`<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
<ECEntityClass typeName="Foo" modifier="Sealed">
<ECProperty propertyName="n" typeName="int"/>
</ECEntityClass>
</ECSchema>`), async (ecdb: ECDb) => {
assert.isTrue(ecdb.isOpen);
ecdb.saveChanges();
const params = new QueryBinder();
params.bindIdSet(1, ["50"]);
const optionBuilder = new QueryOptionsBuilder();
optionBuilder.setRowFormat(QueryRowFormat.UseJsPropertyNames);
reader = ecdb.createQueryReader("SELECT ECInstanceId, Name FROM meta.ECClassDef WHERE InVirtualSet(?, ECInstanceId)", params, optionBuilder.getOptions());
const rows = await reader.toArray();
assert.equal(rows.length, 0);
});
});

it("ecsql reader simple using query reader", async () => {
await using(ECDbTestHelper.createECDb(outDir, "test.ecdb",
`<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
Expand Down
117 changes: 117 additions & 0 deletions core/backend/src/test/ecdb/ECSqlStatement.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1839,6 +1839,123 @@ describe("ECSqlStatement", () => {
});
});

it("should bind IdSets to IdSet Virtual Table", async () => {
await using(ECDbTestHelper.createECDb(outDir, "bindids.ecdb"), async (ecdb: ECDb) => {
assert.isTrue(ecdb.isOpen);

const idNumbers: number[] = [4444, 4545, 1234, 6758, 1312];
ecdb.withPreparedStatement("INSERT INTO ecdbf.ExternalFileInfo(ECInstanceId,Name) VALUES(?,?)", (stmt: ECSqlStatement) => {
idNumbers.forEach((idNum: number) => {
const expectedId = Id64.fromLocalAndBriefcaseIds(idNum, 0);
stmt.bindId(1, expectedId);
stmt.bindString(2, `${idNum}.txt`);
const r: ECSqlInsertResult = stmt.stepForInsert();
assert.equal(r.status, DbResult.BE_SQLITE_DONE);
assert.isDefined(r.id);
assert.equal(r.id!, expectedId);
ecdb.saveChanges();

ecdb.withStatement(`SELECT ECInstanceId, ECClassId, Name FROM ecdbf.ExternalFileInfo WHERE ECInstanceId=${expectedId}`, (confstmt: ECSqlStatement) => {
assert.equal(confstmt.step(), DbResult.BE_SQLITE_ROW);
const row = confstmt.getRow();
assert.equal(row.id, expectedId);
assert.equal(row.className, "ECDbFileInfo.ExternalFileInfo");
assert.equal(row.name, `${Id64.getLocalId(expectedId).toString()}.txt`);
});
stmt.reset();
stmt.clearBindings();
});
});

ecdb.withPreparedStatement("SELECT ECInstanceId, ECClassId, Name from ecdbf.ExternalFileInfo, ECVLib.IdSet(?) WHERE id = ECInstanceId", (stmt: ECSqlStatement) => {
let idSet: Id64String[] = [];
stmt.bindIdSet(1, idSet);
let result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_DONE);
stmt.reset();
stmt.clearBindings();

idSet = [Id64.fromLocalAndBriefcaseIds(idNumbers[2], 0)];
stmt.bindIdSet(1, idSet);
result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_ROW);
let row = stmt.getRow();
assert.equal(row.name, `${idNumbers[2]}.txt`);
stmt.reset();
stmt.clearBindings();

idSet.push(idNumbers[0].toString());
stmt.bindIdSet(1, idSet);
result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_ROW);
row = stmt.getRow();
assert.equal(row.name, `${idNumbers[2]}.txt`);
result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_ROW);
row = stmt.getRow();
assert.equal(row.name, `${idNumbers[0]}.txt`);
});
});
});

it("should bind IdSets to IdSet Virtual Table", async () => {
await using(ECDbTestHelper.createECDb(outDir, "bindids.ecdb"), async (ecdb: ECDb) => {
assert.isTrue(ecdb.isOpen);

const idNumbers: number[] = [4444, 4545, 1234, 6758, 1312];
ecdb.withPreparedStatement("INSERT INTO ecdbf.ExternalFileInfo(ECInstanceId,Name) VALUES(?,?)", (stmt: ECSqlStatement) => {
idNumbers.forEach((idNum: number) => {
const expectedId = Id64.fromLocalAndBriefcaseIds(idNum, 0);
stmt.bindId(1, expectedId);
stmt.bindString(2, `${idNum}.txt`);
const r: ECSqlInsertResult = stmt.stepForInsert();
assert.equal(r.status, DbResult.BE_SQLITE_DONE);
assert.isDefined(r.id);
assert.equal(r.id!, expectedId);
ecdb.saveChanges();

ecdb.withStatement(`SELECT ECInstanceId, ECClassId, Name FROM ecdbf.ExternalFileInfo WHERE ECInstanceId=${expectedId}`, (confstmt: ECSqlStatement) => {
assert.equal(confstmt.step(), DbResult.BE_SQLITE_ROW);
const row = confstmt.getRow();
assert.equal(row.id, expectedId);
assert.equal(row.className, "ECDbFileInfo.ExternalFileInfo");
assert.equal(row.name, `${Id64.getLocalId(expectedId).toString()}.txt`);
});
stmt.reset();
stmt.clearBindings();
});
});

ecdb.withPreparedStatement("SELECT ECInstanceId, ECClassId, Name from ecdbf.ExternalFileInfo, ECVLib.IdSet(?) WHERE id = ECInstanceId", (stmt: ECSqlStatement) => {
let idSet: Id64String[] = [];
stmt.bindIdSet(1, idSet);
let result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_DONE);
stmt.reset();
stmt.clearBindings();

idSet = ["0X1","ABC"];
try{
stmt.bindIdSet(1, idSet);
}catch(err: any){
assert.equal(err.message, "Error binding id set");
}
result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_DONE);
stmt.reset();
stmt.clearBindings();

try{
stmt.bindId(1, idNumbers[0].toString());
}catch(err: any){
assert.equal(err.message, "Error binding Id");
}
result = stmt.step();
assert.equal(result, DbResult.BE_SQLITE_DONE);
});
});
});

/* This test doesn't do anything specific with the binder life time but just runs a few scenarios
with and without statement cache to test that stuff works fine */
it("check ECSqlBinder life time", async () => {
Expand Down
Loading
Loading