@itwin/core-backend 5.13.0-dev.9 → 5.14.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/lib/cjs/Category.d.ts +4 -4
  3. package/lib/cjs/Category.js.map +1 -1
  4. package/lib/cjs/ChangesetECAdaptor.d.ts +5 -0
  5. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  6. package/lib/cjs/ChangesetECAdaptor.js +13 -3
  7. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  8. package/lib/cjs/CodeSpecs.d.ts +3 -3
  9. package/lib/cjs/CodeSpecs.js.map +1 -1
  10. package/lib/cjs/DisplayStyle.d.ts +2 -2
  11. package/lib/cjs/DisplayStyle.js.map +1 -1
  12. package/lib/cjs/EditTxn.d.ts.map +1 -1
  13. package/lib/cjs/EditTxn.js +1 -0
  14. package/lib/cjs/EditTxn.js.map +1 -1
  15. package/lib/cjs/Element.d.ts +48 -12
  16. package/lib/cjs/Element.d.ts.map +1 -1
  17. package/lib/cjs/Element.js +120 -24
  18. package/lib/cjs/Element.js.map +1 -1
  19. package/lib/cjs/IModelDb.d.ts +30 -15
  20. package/lib/cjs/IModelDb.d.ts.map +1 -1
  21. package/lib/cjs/IModelDb.js +51 -15
  22. package/lib/cjs/IModelDb.js.map +1 -1
  23. package/lib/cjs/Model.d.ts +5 -5
  24. package/lib/cjs/Model.d.ts.map +1 -1
  25. package/lib/cjs/Model.js.map +1 -1
  26. package/lib/cjs/PropertyStore.js +1 -1
  27. package/lib/cjs/PropertyStore.js.map +1 -1
  28. package/lib/cjs/SchemaSync.d.ts +37 -9
  29. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  30. package/lib/cjs/SchemaSync.js +125 -6
  31. package/lib/cjs/SchemaSync.js.map +1 -1
  32. package/lib/cjs/SynchronousChannel.d.ts +62 -0
  33. package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
  34. package/lib/cjs/SynchronousChannel.js +11 -0
  35. package/lib/cjs/SynchronousChannel.js.map +1 -0
  36. package/lib/cjs/Texture.d.ts +1 -1
  37. package/lib/cjs/Texture.js.map +1 -1
  38. package/lib/cjs/TxnManager.d.ts +44 -4
  39. package/lib/cjs/TxnManager.d.ts.map +1 -1
  40. package/lib/cjs/TxnManager.js +72 -14
  41. package/lib/cjs/TxnManager.js.map +1 -1
  42. package/lib/cjs/ViewDefinition.d.ts +6 -6
  43. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  44. package/lib/cjs/ViewDefinition.js.map +1 -1
  45. package/lib/cjs/annotations/LeaderGeometry.d.ts +22 -7
  46. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  47. package/lib/cjs/annotations/LeaderGeometry.js +104 -36
  48. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  49. package/lib/cjs/annotations/TextAnnotationElement.d.ts +1 -1
  50. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  51. package/lib/cjs/annotations/TextAnnotationElement.js +25 -10
  52. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  53. package/lib/cjs/core-backend.d.ts +1 -0
  54. package/lib/cjs/core-backend.d.ts.map +1 -1
  55. package/lib/cjs/core-backend.js +1 -0
  56. package/lib/cjs/core-backend.js.map +1 -1
  57. package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
  58. package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
  59. package/lib/cjs/internal/IntegrityCheck.js +13 -0
  60. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  61. package/lib/cjs/internal/NoReservations.d.ts +6 -0
  62. package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
  63. package/lib/cjs/internal/NoReservations.js +21 -0
  64. package/lib/cjs/internal/NoReservations.js.map +1 -0
  65. package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
  66. package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
  67. package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
  68. package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
  69. package/lib/cjs/internal/Symbols.d.ts +1 -0
  70. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  71. package/lib/cjs/internal/Symbols.js +2 -1
  72. package/lib/cjs/internal/Symbols.js.map +1 -1
  73. package/lib/esm/Category.d.ts +4 -4
  74. package/lib/esm/Category.js.map +1 -1
  75. package/lib/esm/ChangesetECAdaptor.d.ts +5 -0
  76. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  77. package/lib/esm/ChangesetECAdaptor.js +13 -3
  78. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  79. package/lib/esm/CodeSpecs.d.ts +3 -3
  80. package/lib/esm/CodeSpecs.js.map +1 -1
  81. package/lib/esm/DisplayStyle.d.ts +2 -2
  82. package/lib/esm/DisplayStyle.js.map +1 -1
  83. package/lib/esm/EditTxn.d.ts.map +1 -1
  84. package/lib/esm/EditTxn.js +1 -0
  85. package/lib/esm/EditTxn.js.map +1 -1
  86. package/lib/esm/Element.d.ts +48 -12
  87. package/lib/esm/Element.d.ts.map +1 -1
  88. package/lib/esm/Element.js +121 -25
  89. package/lib/esm/Element.js.map +1 -1
  90. package/lib/esm/IModelDb.d.ts +30 -15
  91. package/lib/esm/IModelDb.d.ts.map +1 -1
  92. package/lib/esm/IModelDb.js +52 -16
  93. package/lib/esm/IModelDb.js.map +1 -1
  94. package/lib/esm/Model.d.ts +5 -5
  95. package/lib/esm/Model.d.ts.map +1 -1
  96. package/lib/esm/Model.js.map +1 -1
  97. package/lib/esm/PropertyStore.js +1 -1
  98. package/lib/esm/PropertyStore.js.map +1 -1
  99. package/lib/esm/SchemaSync.d.ts +37 -9
  100. package/lib/esm/SchemaSync.d.ts.map +1 -1
  101. package/lib/esm/SchemaSync.js +127 -8
  102. package/lib/esm/SchemaSync.js.map +1 -1
  103. package/lib/esm/SynchronousChannel.d.ts +62 -0
  104. package/lib/esm/SynchronousChannel.d.ts.map +1 -0
  105. package/lib/esm/SynchronousChannel.js +9 -0
  106. package/lib/esm/SynchronousChannel.js.map +1 -0
  107. package/lib/esm/Texture.d.ts +1 -1
  108. package/lib/esm/Texture.js.map +1 -1
  109. package/lib/esm/TxnManager.d.ts +44 -4
  110. package/lib/esm/TxnManager.d.ts.map +1 -1
  111. package/lib/esm/TxnManager.js +72 -14
  112. package/lib/esm/TxnManager.js.map +1 -1
  113. package/lib/esm/ViewDefinition.d.ts +6 -6
  114. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  115. package/lib/esm/ViewDefinition.js.map +1 -1
  116. package/lib/esm/annotations/LeaderGeometry.d.ts +22 -7
  117. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  118. package/lib/esm/annotations/LeaderGeometry.js +104 -36
  119. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  120. package/lib/esm/annotations/TextAnnotationElement.d.ts +1 -1
  121. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  122. package/lib/esm/annotations/TextAnnotationElement.js +25 -10
  123. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  124. package/lib/esm/core-backend.d.ts +1 -0
  125. package/lib/esm/core-backend.d.ts.map +1 -1
  126. package/lib/esm/core-backend.js +1 -0
  127. package/lib/esm/core-backend.js.map +1 -1
  128. package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
  129. package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
  130. package/lib/esm/internal/IntegrityCheck.js +13 -0
  131. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  132. package/lib/esm/internal/NoReservations.d.ts +6 -0
  133. package/lib/esm/internal/NoReservations.d.ts.map +1 -0
  134. package/lib/esm/internal/NoReservations.js +18 -0
  135. package/lib/esm/internal/NoReservations.js.map +1 -0
  136. package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
  137. package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
  138. package/lib/esm/internal/SchemaSyncReservations.js +115 -0
  139. package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
  140. package/lib/esm/internal/Symbols.d.ts +1 -0
  141. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  142. package/lib/esm/internal/Symbols.js +1 -0
  143. package/lib/esm/internal/Symbols.js.map +1 -1
  144. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  145. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  146. package/lib/esm/test/IModelTestUtils.js +8 -3
  147. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  148. package/lib/esm/test/annotations/LeaderGeometry.test.js +178 -2
  149. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  150. package/lib/esm/test/annotations/TextAnnotation.test.js +48 -18
  151. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  152. package/lib/esm/test/ecdb/ECSqlStatement.test.js +177 -0
  153. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  154. package/lib/esm/test/ecdb/QueryReaders.test.js +2 -16
  155. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  156. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +2 -2
  157. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  158. package/lib/esm/test/element/ElementRoundTrip.test.js +80 -2
  159. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  160. package/lib/esm/test/imodel/IModelECSql.test.d.ts +2 -0
  161. package/lib/esm/test/imodel/IModelECSql.test.d.ts.map +1 -0
  162. package/lib/esm/test/imodel/IModelECSql.test.js +367 -0
  163. package/lib/esm/test/imodel/IModelECSql.test.js.map +1 -0
  164. package/lib/esm/test/imodel/IModelElements.test.d.ts +2 -0
  165. package/lib/esm/test/imodel/IModelElements.test.d.ts.map +1 -0
  166. package/lib/esm/test/imodel/IModelElements.test.js +969 -0
  167. package/lib/esm/test/imodel/IModelElements.test.js.map +1 -0
  168. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts +2 -0
  169. package/lib/esm/test/imodel/IModelGeolocation.test.d.ts.map +1 -0
  170. package/lib/esm/test/imodel/IModelGeolocation.test.js +539 -0
  171. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -0
  172. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts +2 -0
  173. package/lib/esm/test/imodel/IModelLifecycle.test.d.ts.map +1 -0
  174. package/lib/esm/test/imodel/IModelLifecycle.test.js +499 -0
  175. package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -0
  176. package/lib/esm/test/imodel/IModelMetadata.test.d.ts +2 -0
  177. package/lib/esm/test/imodel/IModelMetadata.test.d.ts.map +1 -0
  178. package/lib/esm/test/imodel/IModelMetadata.test.js +274 -0
  179. package/lib/esm/test/imodel/IModelMetadata.test.js.map +1 -0
  180. package/lib/esm/test/imodel/IModelModels.test.d.ts +2 -0
  181. package/lib/esm/test/imodel/IModelModels.test.d.ts.map +1 -0
  182. package/lib/esm/test/imodel/IModelModels.test.js +357 -0
  183. package/lib/esm/test/imodel/IModelModels.test.js.map +1 -0
  184. package/lib/esm/test/imodel/IModelRelationships.test.d.ts +2 -0
  185. package/lib/esm/test/imodel/IModelRelationships.test.d.ts.map +1 -0
  186. package/lib/esm/test/imodel/IModelRelationships.test.js +407 -0
  187. package/lib/esm/test/imodel/IModelRelationships.test.js.map +1 -0
  188. package/lib/esm/test/imodel/IModelTestFixtures.d.ts +53 -0
  189. package/lib/esm/test/imodel/IModelTestFixtures.d.ts.map +1 -0
  190. package/lib/esm/test/imodel/IModelTestFixtures.js +107 -0
  191. package/lib/esm/test/imodel/IModelTestFixtures.js.map +1 -0
  192. package/lib/esm/test/imodel/IModelViews.test.d.ts +2 -0
  193. package/lib/esm/test/imodel/IModelViews.test.d.ts.map +1 -0
  194. package/lib/esm/test/imodel/IModelViews.test.js +199 -0
  195. package/lib/esm/test/imodel/IModelViews.test.js.map +1 -0
  196. package/lib/esm/test/index.d.ts +0 -1
  197. package/lib/esm/test/index.d.ts.map +1 -1
  198. package/lib/esm/test/index.js +0 -1
  199. package/lib/esm/test/index.js.map +1 -1
  200. package/lib/esm/test/standalone/ChangesetReader.test.js +8 -26
  201. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  202. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts +2 -0
  203. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.d.ts.map +1 -0
  204. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js +263 -0
  205. package/lib/esm/test/standalone/DgnDomainMergeConflict.test.js.map +1 -0
  206. package/lib/esm/test/standalone/GeometryStream.test.js +1 -3
  207. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  208. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  209. package/lib/esm/test/standalone/IModelWrite.test.js +78 -1
  210. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  211. package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
  212. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  213. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +23 -0
  214. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  215. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
  216. package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
  217. package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
  218. package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
  219. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
  220. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
  221. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
  222. package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
  223. package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
  224. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  225. package/lib/esm/test/standalone/TxnManager.test.js +108 -8
  226. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  227. package/package.json +14 -17
  228. package/lib/esm/test/RevisionUtility.d.ts +0 -33
  229. package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
  230. package/lib/esm/test/RevisionUtility.js +0 -52
  231. package/lib/esm/test/RevisionUtility.js.map +0 -1
  232. package/lib/esm/test/imodel/IModel.test.d.ts +0 -2
  233. package/lib/esm/test/imodel/IModel.test.d.ts.map +0 -1
  234. package/lib/esm/test/imodel/IModel.test.js +0 -3277
  235. package/lib/esm/test/imodel/IModel.test.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IModelECSql.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IModelElements.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IModelElements.test.d.ts","sourceRoot":"","sources":["../../../../src/test/imodel/IModelElements.test.ts"],"names":[],"mappings":""}