@itwin/core-backend 5.13.0-dev.9 → 5.14.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +13 -3
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +1 -0
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +48 -12
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +120 -24
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +30 -15
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +51 -15
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/Model.d.ts +5 -5
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/PropertyStore.js +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts +37 -9
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +125 -6
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SynchronousChannel.d.ts +62 -0
- package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
- package/lib/cjs/SynchronousChannel.js +11 -0
- package/lib/cjs/SynchronousChannel.js.map +1 -0
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +44 -4
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +72 -14
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +104 -36
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js +13 -0
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NoReservations.d.ts +6 -0
- package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
- package/lib/cjs/internal/NoReservations.js +21 -0
- package/lib/cjs/internal/NoReservations.js.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
- package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +13 -3
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +1 -0
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +48 -12
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +121 -25
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +30 -15
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +52 -16
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/Model.d.ts +5 -5
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/PropertyStore.js +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts +37 -9
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +127 -8
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SynchronousChannel.d.ts +62 -0
- package/lib/esm/SynchronousChannel.d.ts.map +1 -0
- package/lib/esm/SynchronousChannel.js +9 -0
- package/lib/esm/SynchronousChannel.js.map +1 -0
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +44 -4
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +72 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +6 -6
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +104 -36
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +25 -10
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js +13 -0
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NoReservations.d.ts +6 -0
- package/lib/esm/internal/NoReservations.d.ts.map +1 -0
- package/lib/esm/internal/NoReservations.js +18 -0
- package/lib/esm/internal/NoReservations.js.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.js +115 -0
- package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +8 -3
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
- package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelElements.test.js +969 -0
- package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
- package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelModels.test.js +357 -0
- package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
- package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
- package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
- package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelViews.test.js +199 -0
- package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
- package/lib/esm/test/index.d.ts +0 -1
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +0 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
- package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
- package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +108 -8
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +14 -17
- package/lib/esm/test/RevisionUtility.d.ts +0 -33
- package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
- package/lib/esm/test/RevisionUtility.js +0 -52
- package/lib/esm/test/RevisionUtility.js.map +0 -1
- package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
- package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
- package/lib/esm/test/imodel/IModel.test.js +0 -3277
- package/lib/esm/test/imodel/IModel.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelECSql.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelECSql.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
53
|
+
/*---------------------------------------------------------------------------------------------
|
|
54
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
55
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
56
|
+
*--------------------------------------------------------------------------------------------*/
|
|
57
|
+
import { assert } from "chai";
|
|
58
|
+
import { DbResult, Id64 } from "@itwin/core-bentley";
|
|
59
|
+
import { withEditTxn } from "../../EditTxn";
|
|
60
|
+
import { Category, Element, SnapshotDb, SqliteValueType } from "../../core-backend";
|
|
61
|
+
import { IModelTestUtils } from "../IModelTestUtils";
|
|
62
|
+
import { TestUtils } from "../TestUtils";
|
|
63
|
+
import { closeIfOpen, createIModelFromSeed, importTestBim, openReadonlySeedCopy } from "./IModelTestFixtures";
|
|
64
|
+
describe("iModel ECSQL and SQL", () => {
|
|
65
|
+
let testBimReadonly;
|
|
66
|
+
let compatibilityReadonly;
|
|
67
|
+
before(async () => {
|
|
68
|
+
await TestUtils.startBackend();
|
|
69
|
+
IModelTestUtils.registerTestBimSchema();
|
|
70
|
+
testBimReadonly = await openReadonlySeedCopy("ecsql-test.bim", "test.bim", { importTestBim: true });
|
|
71
|
+
compatibilityReadonly = await openReadonlySeedCopy("ecsql-CompatibilityTestSeed.bim", "CompatibilityTestSeed.bim");
|
|
72
|
+
});
|
|
73
|
+
after(() => {
|
|
74
|
+
closeIfOpen(testBimReadonly, compatibilityReadonly);
|
|
75
|
+
});
|
|
76
|
+
// NOTE: this test can be removed when the deprecated executeQuery method is removed
|
|
77
|
+
it("should produce an array of rows", () => {
|
|
78
|
+
const imodel1 = testBimReadonly;
|
|
79
|
+
const rows = IModelTestUtils.executeQuery(imodel1, `SELECT * FROM ${Category.classFullName}`);
|
|
80
|
+
assert.exists(rows);
|
|
81
|
+
assert.isArray(rows);
|
|
82
|
+
assert.isAtLeast(rows.length, 1);
|
|
83
|
+
assert.exists(rows[0].id);
|
|
84
|
+
assert.notEqual(rows[0].id.value, "");
|
|
85
|
+
});
|
|
86
|
+
it("queryEntityIds should skip undefined and null bindings", () => {
|
|
87
|
+
const imodel2 = compatibilityReadonly;
|
|
88
|
+
// Callers commonly build the WHERE clause conditionally but pass the bindings object
|
|
89
|
+
// unconditionally, relying on undefined entries being skipped (legacy bindValues semantics).
|
|
90
|
+
const baseline = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null" });
|
|
91
|
+
assert.isAtLeast(baseline.size, 1);
|
|
92
|
+
const parent = undefined;
|
|
93
|
+
const where = "codevalue is null";
|
|
94
|
+
const withUnusedUndefined = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where, bindings: { parent } });
|
|
95
|
+
assert.deepEqual(withUnusedUndefined, baseline);
|
|
96
|
+
const withUnusedNull = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null", bindings: { parent: null } });
|
|
97
|
+
assert.deepEqual(withUnusedNull, baseline);
|
|
98
|
+
const someId = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue IS NOT NULL", limit: 1 }).values().next().value;
|
|
99
|
+
assert.isDefined(someId);
|
|
100
|
+
const codeValue = imodel2.elements.getElement(someId).code.value;
|
|
101
|
+
const mixed = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue=:cv", bindings: { cv: codeValue, parent: undefined } });
|
|
102
|
+
assert.isTrue(mixed.has(someId));
|
|
103
|
+
// positional form: trailing undefined beyond the parameter count must be skipped, not bound
|
|
104
|
+
const positional = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue=?", bindings: [codeValue, undefined] });
|
|
105
|
+
assert.isTrue(positional.has(someId));
|
|
106
|
+
});
|
|
107
|
+
it("should exercise ECSqlStatement (backend only)", () => {
|
|
108
|
+
const imodel2 = compatibilityReadonly;
|
|
109
|
+
// Reject an invalid statement
|
|
110
|
+
try {
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
112
|
+
imodel2.prepareStatement("select no_such_property, codeValue from bis.element", false);
|
|
113
|
+
assert.fail("prepare should have failed with an exception");
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
assert.isTrue(err.constructor.name === "IModelError");
|
|
117
|
+
assert.notEqual(err.status, DbResult.BE_SQLITE_OK);
|
|
118
|
+
}
|
|
119
|
+
let lastId = "";
|
|
120
|
+
let firstCodeValue = "";
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
122
|
+
imodel2.withPreparedStatement("select ecinstanceid, codeValue from bis.element", (stmt) => {
|
|
123
|
+
assert.isNotNull(stmt);
|
|
124
|
+
// Reject an attempt to bind when there are no placeholders in the statement
|
|
125
|
+
try {
|
|
126
|
+
stmt.bindStruct(1, { foo: 1 });
|
|
127
|
+
assert.fail("bindStruct should have failed with an exception");
|
|
128
|
+
}
|
|
129
|
+
catch (err2) {
|
|
130
|
+
assert.isTrue(err2.constructor.name === "IModelError");
|
|
131
|
+
assert.notEqual(err2.status, DbResult.BE_SQLITE_OK);
|
|
132
|
+
}
|
|
133
|
+
// Verify that we get a bunch of rows with the expected shape
|
|
134
|
+
let count = 0;
|
|
135
|
+
while (DbResult.BE_SQLITE_ROW === stmt.step()) {
|
|
136
|
+
const row = stmt.getRow();
|
|
137
|
+
assert.isNotNull(row);
|
|
138
|
+
assert.isObject(row);
|
|
139
|
+
assert.isTrue(row.id !== undefined);
|
|
140
|
+
assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));
|
|
141
|
+
lastId = row.id;
|
|
142
|
+
if (row.codeValue !== undefined)
|
|
143
|
+
firstCodeValue = row.codeValue;
|
|
144
|
+
count = count + 1;
|
|
145
|
+
}
|
|
146
|
+
assert.isTrue(count > 1);
|
|
147
|
+
assert.notEqual(lastId, "");
|
|
148
|
+
assert.notEqual(firstCodeValue, "");
|
|
149
|
+
// Try iterator style
|
|
150
|
+
let firstCodeValueIter = "";
|
|
151
|
+
let iteratorCount = 0;
|
|
152
|
+
let lastIterId = "";
|
|
153
|
+
stmt.reset();
|
|
154
|
+
for (const row of stmt) {
|
|
155
|
+
assert.isNotNull(row);
|
|
156
|
+
assert.isObject(row);
|
|
157
|
+
assert.isTrue(row.id !== undefined);
|
|
158
|
+
assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));
|
|
159
|
+
lastIterId = row.id;
|
|
160
|
+
iteratorCount = iteratorCount + 1;
|
|
161
|
+
if (row.codeValue !== undefined)
|
|
162
|
+
firstCodeValueIter = row.codeValue;
|
|
163
|
+
}
|
|
164
|
+
assert.equal(iteratorCount, count, "iterator loop should find the same number of rows as the step loop");
|
|
165
|
+
assert.equal(lastIterId, lastId, "iterator loop should see the same last row as the step loop");
|
|
166
|
+
assert.equal(firstCodeValueIter, firstCodeValue, "iterator loop should find the first non-null code value as the step loop");
|
|
167
|
+
});
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
169
|
+
imodel2.withPreparedStatement("select ecinstanceid, codeValue from bis.element WHERE (ecinstanceid=?)", (stmt3) => {
|
|
170
|
+
// Now try a statement with a placeholder
|
|
171
|
+
const idToFind = Id64.fromJSON(lastId);
|
|
172
|
+
stmt3.bindId(1, idToFind);
|
|
173
|
+
let count = 0;
|
|
174
|
+
while (DbResult.BE_SQLITE_ROW === stmt3.step()) {
|
|
175
|
+
count = count + 1;
|
|
176
|
+
const row = stmt3.getRow();
|
|
177
|
+
// Verify that we got the row that we asked for
|
|
178
|
+
assert.isTrue(idToFind === Id64.fromJSON(row.id));
|
|
179
|
+
}
|
|
180
|
+
// Verify that we got the row that we asked for
|
|
181
|
+
assert.equal(count, 1);
|
|
182
|
+
});
|
|
183
|
+
let firstCodeValueId;
|
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
185
|
+
imodel2.withPreparedStatement("select ecinstanceid, codeValue from bis.element WHERE (codeValue = :codevalue)", (stmt4) => {
|
|
186
|
+
// Try a named placeholder
|
|
187
|
+
const codeValueToFind = firstCodeValue;
|
|
188
|
+
stmt4.bindString("codeValue", codeValueToFind);
|
|
189
|
+
let count = 0;
|
|
190
|
+
while (DbResult.BE_SQLITE_ROW === stmt4.step()) {
|
|
191
|
+
count = count + 1;
|
|
192
|
+
const row = stmt4.getRow();
|
|
193
|
+
// Verify that we got the row that we asked for
|
|
194
|
+
assert.equal(row.codeValue, codeValueToFind);
|
|
195
|
+
firstCodeValueId = row.id;
|
|
196
|
+
}
|
|
197
|
+
// Verify that we got the row that we asked for
|
|
198
|
+
assert.equal(count, 1);
|
|
199
|
+
});
|
|
200
|
+
// make sure we can use parameterized values for queryEnityId (test on parameterized codevalue)
|
|
201
|
+
const ids = imodel2.queryEntityIds({ from: "bis.element", where: "codevalue=:cv", bindings: { cv: firstCodeValue } });
|
|
202
|
+
assert.equal(ids.values().next().value, firstCodeValueId);
|
|
203
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
204
|
+
imodel2.withPreparedStatement("select ecinstanceid as id, codevalue from bis.element", (stmt5) => {
|
|
205
|
+
while (DbResult.BE_SQLITE_ROW === stmt5.step()) {
|
|
206
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
207
|
+
imodel2.withPreparedStatement("select codevalue from bis.element where ecinstanceid=?", (stmt6) => {
|
|
208
|
+
stmt6.bindId(1, stmt5.getRow().id);
|
|
209
|
+
while (DbResult.BE_SQLITE_ROW === stmt6.step()) {
|
|
210
|
+
assert.equal(stmt6.getRow().codevalue, stmt5.getRow().codevalue);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
// make sure queryEnityIds works fine when all params are specified
|
|
216
|
+
const physicalObjectIds = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null", limit: 1, offset: 1, only: true, orderBy: "ecinstanceid desc" });
|
|
217
|
+
assert.equal(physicalObjectIds.size, 1);
|
|
218
|
+
});
|
|
219
|
+
describe("with a writable test.bim seed", () => {
|
|
220
|
+
let imodel1;
|
|
221
|
+
beforeEach(async () => {
|
|
222
|
+
imodel1 = await importTestBim(createIModelFromSeed("ecsql-plain-sql.bim", "test.bim"));
|
|
223
|
+
});
|
|
224
|
+
afterEach(() => {
|
|
225
|
+
if (imodel1 !== undefined && imodel1.isOpen)
|
|
226
|
+
imodel1.close();
|
|
227
|
+
});
|
|
228
|
+
it("Run plain SQL", () => {
|
|
229
|
+
withEditTxn(imodel1, () => {
|
|
230
|
+
imodel1.withPreparedSqliteStatement("CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)", (stmt) => {
|
|
231
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
232
|
+
});
|
|
233
|
+
imodel1.withPreparedSqliteStatement("INSERT INTO Test(Name,Code) VALUES(?,?)", (stmt) => {
|
|
234
|
+
stmt.bindValue(1, "Dummy 1");
|
|
235
|
+
stmt.bindValue(2, 100);
|
|
236
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
237
|
+
});
|
|
238
|
+
imodel1.withPreparedSqliteStatement("INSERT INTO Test(Name,Code) VALUES(?,?)", (stmt) => {
|
|
239
|
+
stmt.bindValues(["Dummy 2", 200]);
|
|
240
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
241
|
+
});
|
|
242
|
+
imodel1.withPreparedSqliteStatement("INSERT INTO Test(Name,Code) VALUES(:p1,:p2)", (stmt) => {
|
|
243
|
+
stmt.bindValue(":p1", "Dummy 3");
|
|
244
|
+
stmt.bindValue(":p2", 300);
|
|
245
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
246
|
+
});
|
|
247
|
+
imodel1.withPreparedSqliteStatement("INSERT INTO Test(Name,Code) VALUES(:p1,:p2)", (stmt) => {
|
|
248
|
+
stmt.bindValues({ ":p1": "Dummy 4", ":p2": 400 });
|
|
249
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
imodel1.withPreparedSqliteStatement("SELECT Id,Name,Code FROM Test ORDER BY Id", (stmt) => {
|
|
253
|
+
for (let i = 1; i <= 4; i++) {
|
|
254
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);
|
|
255
|
+
assert.equal(stmt.getColumnCount(), 3);
|
|
256
|
+
const val0 = stmt.getValue(0);
|
|
257
|
+
assert.equal(val0.columnName, "Id");
|
|
258
|
+
assert.equal(val0.type, SqliteValueType.Integer);
|
|
259
|
+
assert.isFalse(val0.isNull);
|
|
260
|
+
assert.equal(val0.getInteger(), i);
|
|
261
|
+
const val1 = stmt.getValue(1);
|
|
262
|
+
assert.equal(val1.columnName, "Name");
|
|
263
|
+
assert.equal(val1.type, SqliteValueType.String);
|
|
264
|
+
assert.isFalse(val1.isNull);
|
|
265
|
+
assert.equal(val1.getString(), `Dummy ${i}`);
|
|
266
|
+
const val2 = stmt.getValue(2);
|
|
267
|
+
assert.equal(val2.columnName, "Code");
|
|
268
|
+
assert.equal(val2.type, SqliteValueType.Integer);
|
|
269
|
+
assert.isFalse(val2.isNull);
|
|
270
|
+
assert.equal(val2.getInteger(), i * 100);
|
|
271
|
+
const row = stmt.getRow();
|
|
272
|
+
assert.equal(row.id, i);
|
|
273
|
+
assert.equal(row.name, `Dummy ${i}`);
|
|
274
|
+
assert.equal(row.code, i * 100);
|
|
275
|
+
}
|
|
276
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
277
|
+
});
|
|
278
|
+
imodel1.withPreparedSqliteStatement("SELECT 1 FROM ec_CustomAttribute WHERE ContainerId=? AND Instance LIKE '<IsMixin%' COLLATE NOCASE", (stmt) => {
|
|
279
|
+
stmt.bindValue(1, "0x1f");
|
|
280
|
+
assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
it("Run plain SQL against readonly connection", () => {
|
|
285
|
+
let iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile("IModel", "sqlitesqlreadonlyconnection.bim"), { rootSubject: { name: "test" } });
|
|
286
|
+
const iModelPath = iModel.pathName;
|
|
287
|
+
iModel.close();
|
|
288
|
+
iModel = SnapshotDb.openFile(iModelPath);
|
|
289
|
+
try {
|
|
290
|
+
iModel.withPreparedSqliteStatement("SELECT Name,StrData FROM be_Prop WHERE Namespace='ec_Db'", (stmt) => {
|
|
291
|
+
let rowCount = 0;
|
|
292
|
+
while (stmt.step() === DbResult.BE_SQLITE_ROW) {
|
|
293
|
+
rowCount++;
|
|
294
|
+
assert.equal(stmt.getColumnCount(), 2);
|
|
295
|
+
const nameVal = stmt.getValue(0);
|
|
296
|
+
assert.equal(nameVal.columnName, "Name");
|
|
297
|
+
assert.equal(nameVal.type, SqliteValueType.String);
|
|
298
|
+
assert.isFalse(nameVal.isNull);
|
|
299
|
+
const name = nameVal.getString();
|
|
300
|
+
const versionVal = stmt.getValue(1);
|
|
301
|
+
assert.equal(versionVal.columnName, "StrData");
|
|
302
|
+
assert.equal(versionVal.type, SqliteValueType.String);
|
|
303
|
+
assert.isFalse(versionVal.isNull);
|
|
304
|
+
const profileVersion = JSON.parse(versionVal.getString());
|
|
305
|
+
assert.isTrue(name === "SchemaVersion" || name === "InitialSchemaVersion");
|
|
306
|
+
if (name === "SchemaVersion") {
|
|
307
|
+
assert.equal(profileVersion.major, 4);
|
|
308
|
+
assert.equal(profileVersion.minor, 0);
|
|
309
|
+
assert.equal(profileVersion.sub1, 0);
|
|
310
|
+
assert.isAtLeast(profileVersion.sub2, 1);
|
|
311
|
+
}
|
|
312
|
+
else if (name === "InitialSchemaVersion") {
|
|
313
|
+
assert.equal(profileVersion.major, 4);
|
|
314
|
+
assert.equal(profileVersion.minor, 0);
|
|
315
|
+
assert.equal(profileVersion.sub1, 0);
|
|
316
|
+
assert.isAtLeast(profileVersion.sub2, 1);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
assert.equal(rowCount, 2);
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
finally {
|
|
323
|
+
iModel.close();
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
it("tryPrepareStatement", () => {
|
|
327
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
328
|
+
try {
|
|
329
|
+
const imodel1 = testBimReadonly;
|
|
330
|
+
const sql = `SELECT * FROM ${Element.classFullName} LIMIT 1`;
|
|
331
|
+
const invalidSql = "SELECT * FROM InvalidSchemaName:InvalidClassName LIMIT 1";
|
|
332
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
333
|
+
assert.throws(() => imodel1.prepareStatement(invalidSql, false));
|
|
334
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
335
|
+
assert.isUndefined(imodel1.tryPrepareStatement(invalidSql));
|
|
336
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
337
|
+
const statement = __addDisposableResource(env_1, imodel1.tryPrepareStatement(sql), false);
|
|
338
|
+
assert.isDefined(statement);
|
|
339
|
+
assert.isTrue(statement?.isPrepared);
|
|
340
|
+
}
|
|
341
|
+
catch (e_1) {
|
|
342
|
+
env_1.error = e_1;
|
|
343
|
+
env_1.hasError = true;
|
|
344
|
+
}
|
|
345
|
+
finally {
|
|
346
|
+
__disposeResources(env_1);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
it("containsClass", () => {
|
|
350
|
+
const imodel1 = testBimReadonly;
|
|
351
|
+
assert.isTrue(imodel1.containsClass(Element.classFullName));
|
|
352
|
+
assert.isTrue(imodel1.containsClass("BisCore:Element"));
|
|
353
|
+
assert.isTrue(imodel1.containsClass("BisCore.Element"));
|
|
354
|
+
assert.isTrue(imodel1.containsClass("biscore:element"));
|
|
355
|
+
assert.isTrue(imodel1.containsClass("biscore.element"));
|
|
356
|
+
assert.isTrue(imodel1.containsClass("bis:Element"));
|
|
357
|
+
assert.isTrue(imodel1.containsClass("bis.Element"));
|
|
358
|
+
assert.isTrue(imodel1.containsClass("bis:element"));
|
|
359
|
+
assert.isTrue(imodel1.containsClass("bis.element"));
|
|
360
|
+
assert.isFalse(imodel1.containsClass("BisCore:Element:InvalidExtra"));
|
|
361
|
+
assert.isFalse(imodel1.containsClass("BisCore"));
|
|
362
|
+
assert.isFalse(imodel1.containsClass(":Element"));
|
|
363
|
+
assert.isFalse(imodel1.containsClass("BisCore:InvalidClassName"));
|
|
364
|
+
assert.isFalse(imodel1.containsClass("InvalidSchemaName:Element"));
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
//# sourceMappingURL=IModelECSql.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelECSql.test.js","sourceRoot":"","sources":["../../../../src/test/imodel/IModelECSql.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, Id64String } from \"@itwin/core-bentley\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { Category, ECSqlStatement, Element, SnapshotDb, SqliteStatement, SqliteValue, SqliteValueType } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { closeIfOpen, createIModelFromSeed, importTestBim, openReadonlySeedCopy } from \"./IModelTestFixtures\";\r\n\r\n\r\ndescribe(\"iModel ECSQL and SQL\", () => {\r\n let testBimReadonly: SnapshotDb;\r\n let compatibilityReadonly: SnapshotDb;\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n IModelTestUtils.registerTestBimSchema();\r\n\r\n testBimReadonly = await openReadonlySeedCopy(\"ecsql-test.bim\", \"test.bim\", { importTestBim: true });\r\n compatibilityReadonly = await openReadonlySeedCopy(\"ecsql-CompatibilityTestSeed.bim\", \"CompatibilityTestSeed.bim\");\r\n });\r\n\r\n after(() => {\r\n closeIfOpen(testBimReadonly, compatibilityReadonly);\r\n });\r\n\r\n // NOTE: this test can be removed when the deprecated executeQuery method is removed\r\n it(\"should produce an array of rows\", () => {\r\n const imodel1 = testBimReadonly;\r\n const rows: any[] = IModelTestUtils.executeQuery(imodel1, `SELECT * FROM ${Category.classFullName}`);\r\n assert.exists(rows);\r\n assert.isArray(rows);\r\n assert.isAtLeast(rows.length, 1);\r\n assert.exists(rows[0].id);\r\n assert.notEqual(rows[0].id.value, \"\");\r\n });\r\n\r\n it(\"queryEntityIds should skip undefined and null bindings\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n // Callers commonly build the WHERE clause conditionally but pass the bindings object\r\n // unconditionally, relying on undefined entries being skipped (legacy bindValues semantics).\r\n const baseline = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where: \"codevalue is null\" });\r\n assert.isAtLeast(baseline.size, 1);\r\n\r\n const parent: string | undefined = undefined;\r\n const where = \"codevalue is null\";\r\n const withUnusedUndefined = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where, bindings: { parent } });\r\n assert.deepEqual(withUnusedUndefined, baseline);\r\n\r\n const withUnusedNull = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where: \"codevalue is null\", bindings: { parent: null } });\r\n assert.deepEqual(withUnusedNull, baseline);\r\n\r\n const someId = imodel2.queryEntityIds({ from: \"bis.element\", where: \"CodeValue IS NOT NULL\", limit: 1 }).values().next().value as string;\r\n assert.isDefined(someId);\r\n const codeValue = imodel2.elements.getElement(someId).code.value;\r\n const mixed = imodel2.queryEntityIds({ from: \"bis.element\", where: \"CodeValue=:cv\", bindings: { cv: codeValue, parent: undefined } });\r\n assert.isTrue(mixed.has(someId));\r\n\r\n // positional form: trailing undefined beyond the parameter count must be skipped, not bound\r\n const positional = imodel2.queryEntityIds({ from: \"bis.element\", where: \"CodeValue=?\", bindings: [codeValue, undefined] });\r\n assert.isTrue(positional.has(someId));\r\n });\r\n\r\n it(\"should exercise ECSqlStatement (backend only)\", () => {\r\n const imodel2 = compatibilityReadonly;\r\n // Reject an invalid statement\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.prepareStatement(\"select no_such_property, codeValue from bis.element\", false);\r\n assert.fail(\"prepare should have failed with an exception\");\r\n } catch (err: any) {\r\n assert.isTrue(err.constructor.name === \"IModelError\");\r\n assert.notEqual(err.status, DbResult.BE_SQLITE_OK);\r\n }\r\n let lastId: string = \"\";\r\n let firstCodeValue: string = \"\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element\", (stmt: ECSqlStatement) => {\r\n assert.isNotNull(stmt);\r\n // Reject an attempt to bind when there are no placeholders in the statement\r\n try {\r\n stmt.bindStruct(1, { foo: 1 });\r\n assert.fail(\"bindStruct should have failed with an exception\");\r\n } catch (err2: any) {\r\n assert.isTrue(err2.constructor.name === \"IModelError\");\r\n assert.notEqual(err2.status, DbResult.BE_SQLITE_OK);\r\n }\r\n\r\n // Verify that we get a bunch of rows with the expected shape\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const row = stmt.getRow();\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastId = row.id;\r\n if (row.codeValue !== undefined)\r\n firstCodeValue = row.codeValue;\r\n count = count + 1;\r\n }\r\n assert.isTrue(count > 1);\r\n assert.notEqual(lastId, \"\");\r\n assert.notEqual(firstCodeValue, \"\");\r\n\r\n // Try iterator style\r\n let firstCodeValueIter: string = \"\";\r\n let iteratorCount = 0;\r\n let lastIterId: string = \"\";\r\n stmt.reset();\r\n for (const row of stmt) {\r\n assert.isNotNull(row);\r\n assert.isObject(row);\r\n assert.isTrue(row.id !== undefined);\r\n assert.isTrue(Id64.isValid(Id64.fromJSON(row.id)));\r\n lastIterId = row.id;\r\n iteratorCount = iteratorCount + 1;\r\n if (row.codeValue !== undefined)\r\n firstCodeValueIter = row.codeValue;\r\n }\r\n assert.equal(iteratorCount, count, \"iterator loop should find the same number of rows as the step loop\");\r\n assert.equal(lastIterId, lastId, \"iterator loop should see the same last row as the step loop\");\r\n assert.equal(firstCodeValueIter, firstCodeValue, \"iterator loop should find the first non-null code value as the step loop\");\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (ecinstanceid=?)\", (stmt3: ECSqlStatement) => {\r\n // Now try a statement with a placeholder\r\n const idToFind = Id64.fromJSON(lastId);\r\n stmt3.bindId(1, idToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt3.step()) {\r\n count = count + 1;\r\n const row = stmt3.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.isTrue(idToFind === Id64.fromJSON(row.id));\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n let firstCodeValueId: Id64String | undefined;\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid, codeValue from bis.element WHERE (codeValue = :codevalue)\", (stmt4: ECSqlStatement) => {\r\n // Try a named placeholder\r\n const codeValueToFind = firstCodeValue;\r\n stmt4.bindString(\"codeValue\", codeValueToFind);\r\n let count = 0;\r\n while (DbResult.BE_SQLITE_ROW === stmt4.step()) {\r\n count = count + 1;\r\n const row = stmt4.getRow();\r\n // Verify that we got the row that we asked for\r\n assert.equal(row.codeValue, codeValueToFind);\r\n firstCodeValueId = row.id;\r\n }\r\n // Verify that we got the row that we asked for\r\n assert.equal(count, 1);\r\n });\r\n\r\n // make sure we can use parameterized values for queryEnityId (test on parameterized codevalue)\r\n const ids = imodel2.queryEntityIds({ from: \"bis.element\", where: \"codevalue=:cv\", bindings: { cv: firstCodeValue } });\r\n assert.equal(ids.values().next().value, firstCodeValueId);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select ecinstanceid as id, codevalue from bis.element\", (stmt5: ECSqlStatement) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt5.step()) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n imodel2.withPreparedStatement(\"select codevalue from bis.element where ecinstanceid=?\", (stmt6: ECSqlStatement) => {\r\n stmt6.bindId(1, stmt5.getRow().id);\r\n while (DbResult.BE_SQLITE_ROW === stmt6.step()) {\r\n assert.equal(stmt6.getRow().codevalue, stmt5.getRow().codevalue);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // make sure queryEnityIds works fine when all params are specified\r\n const physicalObjectIds = imodel2.queryEntityIds({ from: \"generic.PhysicalObject\", where: \"codevalue is null\", limit: 1, offset: 1, only: true, orderBy: \"ecinstanceid desc\" });\r\n assert.equal(physicalObjectIds.size, 1);\r\n });\r\n\r\n describe(\"with a writable test.bim seed\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n beforeEach(async () => {\r\n imodel1 = await importTestBim(createIModelFromSeed(\"ecsql-plain-sql.bim\", \"test.bim\"));\r\n });\r\n\r\n afterEach(() => {\r\n if (imodel1 !== undefined && imodel1.isOpen)\r\n imodel1.close();\r\n });\r\n\r\n it(\"Run plain SQL\", () => {\r\n withEditTxn(imodel1, () => {\r\n imodel1.withPreparedSqliteStatement(\"CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)\", (stmt: SqliteStatement) => {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"Dummy 1\");\r\n stmt.bindValue(2, 100);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues([\"Dummy 2\", 200]);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(\":p1\", \"Dummy 3\");\r\n stmt.bindValue(\":p2\", 300);\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\r\n stmt.bindValues({ \":p1\": \"Dummy 4\", \":p2\": 400 });\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT Id,Name,Code FROM Test ORDER BY Id\", (stmt: SqliteStatement) => {\r\n for (let i: number = 1; i <= 4; i++) {\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\r\n assert.equal(stmt.getColumnCount(), 3);\r\n const val0: SqliteValue = stmt.getValue(0);\r\n assert.equal(val0.columnName, \"Id\");\r\n assert.equal(val0.type, SqliteValueType.Integer);\r\n assert.isFalse(val0.isNull);\r\n assert.equal(val0.getInteger(), i);\r\n\r\n const val1: SqliteValue = stmt.getValue(1);\r\n assert.equal(val1.columnName, \"Name\");\r\n assert.equal(val1.type, SqliteValueType.String);\r\n assert.isFalse(val1.isNull);\r\n assert.equal(val1.getString(), `Dummy ${i}`);\r\n\r\n const val2: SqliteValue = stmt.getValue(2);\r\n assert.equal(val2.columnName, \"Code\");\r\n assert.equal(val2.type, SqliteValueType.Integer);\r\n assert.isFalse(val2.isNull);\r\n assert.equal(val2.getInteger(), i * 100);\r\n\r\n const row: any = stmt.getRow();\r\n assert.equal(row.id, i);\r\n assert.equal(row.name, `Dummy ${i}`);\r\n assert.equal(row.code, i * 100);\r\n }\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n\r\n imodel1.withPreparedSqliteStatement(\"SELECT 1 FROM ec_CustomAttribute WHERE ContainerId=? AND Instance LIKE '<IsMixin%' COLLATE NOCASE\", (stmt: SqliteStatement) => {\r\n stmt.bindValue(1, \"0x1f\");\r\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\r\n });\r\n });\r\n });\r\n\r\n it(\"Run plain SQL against readonly connection\", () => {\r\n let iModel = SnapshotDb.createEmpty(IModelTestUtils.prepareOutputFile(\"IModel\", \"sqlitesqlreadonlyconnection.bim\"), { rootSubject: { name: \"test\" } });\r\n const iModelPath = iModel.pathName;\r\n iModel.close();\r\n iModel = SnapshotDb.openFile(iModelPath);\r\n\r\n try {\r\n iModel.withPreparedSqliteStatement(\"SELECT Name,StrData FROM be_Prop WHERE Namespace='ec_Db'\", (stmt: SqliteStatement) => {\r\n let rowCount: number = 0;\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n rowCount++;\r\n assert.equal(stmt.getColumnCount(), 2);\r\n const nameVal: SqliteValue = stmt.getValue(0);\r\n assert.equal(nameVal.columnName, \"Name\");\r\n assert.equal(nameVal.type, SqliteValueType.String);\r\n assert.isFalse(nameVal.isNull);\r\n const name: string = nameVal.getString();\r\n\r\n const versionVal: SqliteValue = stmt.getValue(1);\r\n assert.equal(versionVal.columnName, \"StrData\");\r\n assert.equal(versionVal.type, SqliteValueType.String);\r\n assert.isFalse(versionVal.isNull);\r\n const profileVersion: any = JSON.parse(versionVal.getString());\r\n\r\n assert.isTrue(name === \"SchemaVersion\" || name === \"InitialSchemaVersion\");\r\n if (name === \"SchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n } else if (name === \"InitialSchemaVersion\") {\r\n assert.equal(profileVersion.major, 4);\r\n assert.equal(profileVersion.minor, 0);\r\n assert.equal(profileVersion.sub1, 0);\r\n assert.isAtLeast(profileVersion.sub2, 1);\r\n }\r\n }\r\n assert.equal(rowCount, 2);\r\n });\r\n } finally {\r\n iModel.close();\r\n }\r\n });\r\n\r\n it(\"tryPrepareStatement\", () => {\r\n const imodel1 = testBimReadonly;\r\n const sql = `SELECT * FROM ${Element.classFullName} LIMIT 1`;\r\n const invalidSql = \"SELECT * FROM InvalidSchemaName:InvalidClassName LIMIT 1\";\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.throws(() => imodel1.prepareStatement(invalidSql, false));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n assert.isUndefined(imodel1.tryPrepareStatement(invalidSql));\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n using statement: ECSqlStatement | undefined = imodel1.tryPrepareStatement(sql);\r\n assert.isDefined(statement);\r\n assert.isTrue(statement?.isPrepared);\r\n });\r\n\r\n it(\"containsClass\", () => {\r\n const imodel1 = testBimReadonly;\r\n assert.isTrue(imodel1.containsClass(Element.classFullName));\r\n assert.isTrue(imodel1.containsClass(\"BisCore:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"BisCore.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore:element\"));\r\n assert.isTrue(imodel1.containsClass(\"biscore.element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.Element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis:element\"));\r\n assert.isTrue(imodel1.containsClass(\"bis.element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:Element:InvalidExtra\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore\"));\r\n assert.isFalse(imodel1.containsClass(\":Element\"));\r\n assert.isFalse(imodel1.containsClass(\"BisCore:InvalidClassName\"));\r\n assert.isFalse(imodel1.containsClass(\"InvalidSchemaName:Element\"));\r\n });\r\n});\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelElements.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelElements.test.ts"],"names":[],"mappings":""}
|