@itwin/core-backend 5.1.0-dev.5 → 5.1.0-dev.51

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 (556) hide show
  1. package/CHANGELOG.md +122 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +1 -1
  3. package/lib/cjs/BackendHubAccess.js +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  6. package/lib/cjs/BisCoreSchema.js +1 -1
  7. package/lib/cjs/BisCoreSchema.js.map +1 -1
  8. package/lib/cjs/BlobContainerService.js.map +1 -1
  9. package/lib/cjs/BriefcaseManager.d.ts +10 -2
  10. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  11. package/lib/cjs/BriefcaseManager.js +16 -0
  12. package/lib/cjs/BriefcaseManager.js.map +1 -1
  13. package/lib/cjs/CatalogDb.js.map +1 -1
  14. package/lib/cjs/Category.d.ts +4 -4
  15. package/lib/cjs/Category.js +4 -4
  16. package/lib/cjs/Category.js.map +1 -1
  17. package/lib/cjs/ChangeSummaryManager.js +2 -2
  18. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  19. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  20. package/lib/cjs/ChangesetECAdaptor.d.ts +67 -8
  21. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  22. package/lib/cjs/ChangesetECAdaptor.js +490 -275
  23. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  24. package/lib/cjs/ChannelControl.js.map +1 -1
  25. package/lib/cjs/CheckpointManager.js.map +1 -1
  26. package/lib/cjs/ClassRegistry.d.ts +1 -1
  27. package/lib/cjs/ClassRegistry.js +6 -6
  28. package/lib/cjs/ClassRegistry.js.map +1 -1
  29. package/lib/cjs/CloudSqlite.js +1 -1
  30. package/lib/cjs/CloudSqlite.js.map +1 -1
  31. package/lib/cjs/CodeService.js.map +1 -1
  32. package/lib/cjs/CodeSpecs.d.ts +1 -1
  33. package/lib/cjs/CodeSpecs.js +1 -1
  34. package/lib/cjs/CodeSpecs.js.map +1 -1
  35. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  36. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  37. package/lib/cjs/DevTools.js.map +1 -1
  38. package/lib/cjs/DisplayStyle.d.ts +4 -4
  39. package/lib/cjs/DisplayStyle.js +3 -3
  40. package/lib/cjs/DisplayStyle.js.map +1 -1
  41. package/lib/cjs/ECDb.d.ts +4 -4
  42. package/lib/cjs/ECDb.d.ts.map +1 -1
  43. package/lib/cjs/ECDb.js +4 -4
  44. package/lib/cjs/ECDb.js.map +1 -1
  45. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  46. package/lib/cjs/ECSqlStatement.d.ts +15 -6
  47. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  48. package/lib/cjs/ECSqlStatement.js +18 -4
  49. package/lib/cjs/ECSqlStatement.js.map +1 -1
  50. package/lib/cjs/Element.d.ts +51 -51
  51. package/lib/cjs/Element.js +52 -52
  52. package/lib/cjs/Element.js.map +1 -1
  53. package/lib/cjs/ElementAspect.d.ts +8 -8
  54. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  55. package/lib/cjs/ElementAspect.js +8 -8
  56. package/lib/cjs/ElementAspect.js.map +1 -1
  57. package/lib/cjs/ElementGraphics.js.map +1 -1
  58. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  59. package/lib/cjs/Entity.d.ts +3 -3
  60. package/lib/cjs/Entity.js +2 -2
  61. package/lib/cjs/Entity.js.map +1 -1
  62. package/lib/cjs/EntityReferences.js.map +1 -1
  63. package/lib/cjs/ExportGraphics.d.ts +54 -8
  64. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  65. package/lib/cjs/ExportGraphics.js +158 -59
  66. package/lib/cjs/ExportGraphics.js.map +1 -1
  67. package/lib/cjs/ExternalSource.js.map +1 -1
  68. package/lib/cjs/FontFile.js.map +1 -1
  69. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  70. package/lib/cjs/GeographicCRSServices.d.ts +6 -2
  71. package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
  72. package/lib/cjs/GeographicCRSServices.js +1 -1
  73. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  74. package/lib/cjs/GeometrySummary.js +47 -47
  75. package/lib/cjs/GeometrySummary.js.map +1 -1
  76. package/lib/cjs/IModelDb.d.ts +29 -23
  77. package/lib/cjs/IModelDb.d.ts.map +1 -1
  78. package/lib/cjs/IModelDb.js +102 -49
  79. package/lib/cjs/IModelDb.js.map +1 -1
  80. package/lib/cjs/IModelDbFonts.js.map +1 -1
  81. package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
  82. package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
  83. package/lib/cjs/IModelElementCloneContext.js +1 -1
  84. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  85. package/lib/cjs/IModelHost.d.ts +2 -3
  86. package/lib/cjs/IModelHost.d.ts.map +1 -1
  87. package/lib/cjs/IModelHost.js +2 -3
  88. package/lib/cjs/IModelHost.js.map +1 -1
  89. package/lib/cjs/IModelJsFs.js.map +1 -1
  90. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  91. package/lib/cjs/IpcHost.js.map +1 -1
  92. package/lib/cjs/LineStyle.js.map +1 -1
  93. package/lib/cjs/LocalHub.js +1 -1
  94. package/lib/cjs/LocalHub.js.map +1 -1
  95. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  96. package/lib/cjs/LockControl.js.map +1 -1
  97. package/lib/cjs/Material.d.ts +1 -1
  98. package/lib/cjs/Material.js +1 -1
  99. package/lib/cjs/Material.js.map +1 -1
  100. package/lib/cjs/Model.d.ts +22 -22
  101. package/lib/cjs/Model.js +22 -22
  102. package/lib/cjs/Model.js.map +1 -1
  103. package/lib/cjs/NativeAppStorage.js.map +1 -1
  104. package/lib/cjs/NativeHost.js.map +1 -1
  105. package/lib/cjs/NavigationRelationship.js.map +1 -1
  106. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  107. package/lib/cjs/PropertyStore.js.map +1 -1
  108. package/lib/cjs/Relationship.js.map +1 -1
  109. package/lib/cjs/RpcBackend.js.map +1 -1
  110. package/lib/cjs/SQLiteDb.d.ts +1 -1
  111. package/lib/cjs/SQLiteDb.js +1 -1
  112. package/lib/cjs/SQLiteDb.js.map +1 -1
  113. package/lib/cjs/Schema.js.map +1 -1
  114. package/lib/cjs/SchemaSync.js.map +1 -1
  115. package/lib/cjs/SchemaUtils.js.map +1 -1
  116. package/lib/cjs/SheetIndex.js.map +1 -1
  117. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  118. package/lib/cjs/SqliteStatement.d.ts +1 -1
  119. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  120. package/lib/cjs/SqliteStatement.js +1 -1
  121. package/lib/cjs/SqliteStatement.js.map +1 -1
  122. package/lib/cjs/Texture.d.ts +1 -1
  123. package/lib/cjs/Texture.js +1 -1
  124. package/lib/cjs/Texture.js.map +1 -1
  125. package/lib/cjs/TileStorage.js.map +1 -1
  126. package/lib/cjs/TxnManager.d.ts +4 -4
  127. package/lib/cjs/TxnManager.js +1 -1
  128. package/lib/cjs/TxnManager.js.map +1 -1
  129. package/lib/cjs/ViewDefinition.d.ts +40 -14
  130. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  131. package/lib/cjs/ViewDefinition.js +42 -14
  132. package/lib/cjs/ViewDefinition.js.map +1 -1
  133. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  134. package/lib/cjs/ViewStore.js.map +1 -1
  135. package/lib/cjs/annotations/FrameGeometry.d.ts +52 -0
  136. package/lib/cjs/annotations/FrameGeometry.d.ts.map +1 -0
  137. package/lib/cjs/annotations/FrameGeometry.js +250 -0
  138. package/lib/cjs/annotations/FrameGeometry.js.map +1 -0
  139. package/lib/cjs/{TextAnnotationElement.d.ts → annotations/TextAnnotationElement.d.ts} +6 -11
  140. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -0
  141. package/lib/cjs/{TextAnnotationElement.js → annotations/TextAnnotationElement.js} +20 -26
  142. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -0
  143. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts +31 -0
  144. package/lib/cjs/annotations/TextAnnotationGeometry.d.ts.map +1 -0
  145. package/lib/cjs/annotations/TextAnnotationGeometry.js +132 -0
  146. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -0
  147. package/lib/cjs/annotations/TextBlockGeometry.d.ts +16 -0
  148. package/lib/cjs/annotations/TextBlockGeometry.d.ts.map +1 -0
  149. package/lib/cjs/{TextAnnotationGeometry.js → annotations/TextBlockGeometry.js} +13 -69
  150. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -0
  151. package/lib/cjs/{TextAnnotationLayout.d.ts → annotations/TextBlockLayout.d.ts} +22 -8
  152. package/lib/cjs/annotations/TextBlockLayout.d.ts.map +1 -0
  153. package/lib/cjs/{TextAnnotationLayout.js → annotations/TextBlockLayout.js} +51 -9
  154. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -0
  155. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  156. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  157. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  158. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  159. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  160. package/lib/cjs/core-backend.d.ts +5 -3
  161. package/lib/cjs/core-backend.d.ts.map +1 -1
  162. package/lib/cjs/core-backend.js +25 -6
  163. package/lib/cjs/core-backend.js.map +1 -1
  164. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  165. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  166. package/lib/cjs/domains/GenericElements.js.map +1 -1
  167. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  168. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  169. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  170. package/lib/cjs/internal/ElementLRUCache.d.ts +23 -0
  171. package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -1
  172. package/lib/cjs/internal/ElementLRUCache.js +167 -3
  173. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  174. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  175. package/lib/cjs/internal/HubMock.js.map +1 -1
  176. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  177. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  178. package/lib/cjs/internal/NoLocks.js.map +1 -1
  179. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  180. package/lib/cjs/internal/Symbols.d.ts +1 -0
  181. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  182. package/lib/cjs/internal/Symbols.js +2 -1
  183. package/lib/cjs/internal/Symbols.js.map +1 -1
  184. package/lib/cjs/internal/cross-package.js.map +1 -1
  185. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  186. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  187. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  188. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  189. package/lib/cjs/rpc/multipart.js.map +1 -1
  190. package/lib/cjs/rpc/tracing.js.map +1 -1
  191. package/lib/cjs/rpc/web/logging.js.map +1 -1
  192. package/lib/cjs/rpc/web/request.js.map +1 -1
  193. package/lib/cjs/rpc/web/response.js.map +1 -1
  194. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  195. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +1 -1
  196. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +1 -1
  197. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  198. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  199. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  200. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  201. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  202. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  203. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  204. package/lib/cjs/workspace/Settings.js.map +1 -1
  205. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  206. package/lib/cjs/workspace/Workspace.js.map +1 -1
  207. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  208. package/lib/esm/BackendHubAccess.d.ts +1 -1
  209. package/lib/esm/BackendHubAccess.js +1 -1
  210. package/lib/esm/BackendHubAccess.js.map +1 -1
  211. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  212. package/lib/esm/BisCoreSchema.js +1 -1
  213. package/lib/esm/BisCoreSchema.js.map +1 -1
  214. package/lib/esm/BlobContainerService.js.map +1 -1
  215. package/lib/esm/BriefcaseManager.d.ts +10 -2
  216. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  217. package/lib/esm/BriefcaseManager.js +17 -1
  218. package/lib/esm/BriefcaseManager.js.map +1 -1
  219. package/lib/esm/CatalogDb.js.map +1 -1
  220. package/lib/esm/Category.d.ts +4 -4
  221. package/lib/esm/Category.js +4 -4
  222. package/lib/esm/Category.js.map +1 -1
  223. package/lib/esm/ChangeSummaryManager.js +2 -2
  224. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  225. package/lib/esm/ChangedElementsDb.js.map +1 -1
  226. package/lib/esm/ChangesetECAdaptor.d.ts +67 -8
  227. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  228. package/lib/esm/ChangesetECAdaptor.js +490 -275
  229. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  230. package/lib/esm/ChannelControl.js.map +1 -1
  231. package/lib/esm/CheckpointManager.js.map +1 -1
  232. package/lib/esm/ClassRegistry.d.ts +1 -1
  233. package/lib/esm/ClassRegistry.js +6 -6
  234. package/lib/esm/ClassRegistry.js.map +1 -1
  235. package/lib/esm/CloudSqlite.js +1 -1
  236. package/lib/esm/CloudSqlite.js.map +1 -1
  237. package/lib/esm/CodeService.js.map +1 -1
  238. package/lib/esm/CodeSpecs.d.ts +1 -1
  239. package/lib/esm/CodeSpecs.js +1 -1
  240. package/lib/esm/CodeSpecs.js.map +1 -1
  241. package/lib/esm/ConcurrentQuery.js.map +1 -1
  242. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  243. package/lib/esm/DevTools.js.map +1 -1
  244. package/lib/esm/DisplayStyle.d.ts +4 -4
  245. package/lib/esm/DisplayStyle.js +3 -3
  246. package/lib/esm/DisplayStyle.js.map +1 -1
  247. package/lib/esm/ECDb.d.ts +4 -4
  248. package/lib/esm/ECDb.d.ts.map +1 -1
  249. package/lib/esm/ECDb.js +4 -4
  250. package/lib/esm/ECDb.js.map +1 -1
  251. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  252. package/lib/esm/ECSqlStatement.d.ts +15 -6
  253. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  254. package/lib/esm/ECSqlStatement.js +18 -4
  255. package/lib/esm/ECSqlStatement.js.map +1 -1
  256. package/lib/esm/Element.d.ts +51 -51
  257. package/lib/esm/Element.js +52 -52
  258. package/lib/esm/Element.js.map +1 -1
  259. package/lib/esm/ElementAspect.d.ts +8 -8
  260. package/lib/esm/ElementAspect.d.ts.map +1 -1
  261. package/lib/esm/ElementAspect.js +8 -8
  262. package/lib/esm/ElementAspect.js.map +1 -1
  263. package/lib/esm/ElementGraphics.js.map +1 -1
  264. package/lib/esm/ElementTreeWalker.js.map +1 -1
  265. package/lib/esm/Entity.d.ts +3 -3
  266. package/lib/esm/Entity.js +2 -2
  267. package/lib/esm/Entity.js.map +1 -1
  268. package/lib/esm/EntityReferences.js.map +1 -1
  269. package/lib/esm/ExportGraphics.d.ts +54 -8
  270. package/lib/esm/ExportGraphics.d.ts.map +1 -1
  271. package/lib/esm/ExportGraphics.js +156 -58
  272. package/lib/esm/ExportGraphics.js.map +1 -1
  273. package/lib/esm/ExternalSource.js.map +1 -1
  274. package/lib/esm/FontFile.js.map +1 -1
  275. package/lib/esm/GeoCoordConfig.js.map +1 -1
  276. package/lib/esm/GeographicCRSServices.d.ts +6 -2
  277. package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
  278. package/lib/esm/GeographicCRSServices.js +1 -1
  279. package/lib/esm/GeographicCRSServices.js.map +1 -1
  280. package/lib/esm/GeometrySummary.js +47 -47
  281. package/lib/esm/GeometrySummary.js.map +1 -1
  282. package/lib/esm/IModelDb.d.ts +29 -23
  283. package/lib/esm/IModelDb.d.ts.map +1 -1
  284. package/lib/esm/IModelDb.js +105 -52
  285. package/lib/esm/IModelDb.js.map +1 -1
  286. package/lib/esm/IModelDbFonts.js.map +1 -1
  287. package/lib/esm/IModelElementCloneContext.d.ts +1 -1
  288. package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
  289. package/lib/esm/IModelElementCloneContext.js +1 -1
  290. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  291. package/lib/esm/IModelHost.d.ts +2 -3
  292. package/lib/esm/IModelHost.d.ts.map +1 -1
  293. package/lib/esm/IModelHost.js +2 -3
  294. package/lib/esm/IModelHost.js.map +1 -1
  295. package/lib/esm/IModelJsFs.js.map +1 -1
  296. package/lib/esm/ImageSourceConversion.js.map +1 -1
  297. package/lib/esm/IpcHost.js.map +1 -1
  298. package/lib/esm/LineStyle.js.map +1 -1
  299. package/lib/esm/LocalHub.js +1 -1
  300. package/lib/esm/LocalHub.js.map +1 -1
  301. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  302. package/lib/esm/LockControl.js.map +1 -1
  303. package/lib/esm/Material.d.ts +1 -1
  304. package/lib/esm/Material.js +1 -1
  305. package/lib/esm/Material.js.map +1 -1
  306. package/lib/esm/Model.d.ts +22 -22
  307. package/lib/esm/Model.js +22 -22
  308. package/lib/esm/Model.js.map +1 -1
  309. package/lib/esm/NativeAppStorage.js.map +1 -1
  310. package/lib/esm/NativeHost.js.map +1 -1
  311. package/lib/esm/NavigationRelationship.js.map +1 -1
  312. package/lib/esm/PromiseMemoizer.js.map +1 -1
  313. package/lib/esm/PropertyStore.js.map +1 -1
  314. package/lib/esm/Relationship.js.map +1 -1
  315. package/lib/esm/RpcBackend.js.map +1 -1
  316. package/lib/esm/SQLiteDb.d.ts +1 -1
  317. package/lib/esm/SQLiteDb.js +1 -1
  318. package/lib/esm/SQLiteDb.js.map +1 -1
  319. package/lib/esm/Schema.js.map +1 -1
  320. package/lib/esm/SchemaSync.js.map +1 -1
  321. package/lib/esm/SchemaUtils.js.map +1 -1
  322. package/lib/esm/SheetIndex.js.map +1 -1
  323. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  324. package/lib/esm/SqliteStatement.d.ts +1 -1
  325. package/lib/esm/SqliteStatement.d.ts.map +1 -1
  326. package/lib/esm/SqliteStatement.js +1 -1
  327. package/lib/esm/SqliteStatement.js.map +1 -1
  328. package/lib/esm/Texture.d.ts +1 -1
  329. package/lib/esm/Texture.js +1 -1
  330. package/lib/esm/Texture.js.map +1 -1
  331. package/lib/esm/TileStorage.js.map +1 -1
  332. package/lib/esm/TxnManager.d.ts +4 -4
  333. package/lib/esm/TxnManager.js +1 -1
  334. package/lib/esm/TxnManager.js.map +1 -1
  335. package/lib/esm/ViewDefinition.d.ts +40 -14
  336. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  337. package/lib/esm/ViewDefinition.js +42 -14
  338. package/lib/esm/ViewDefinition.js.map +1 -1
  339. package/lib/esm/ViewStateHydrator.js.map +1 -1
  340. package/lib/esm/ViewStore.js.map +1 -1
  341. package/lib/esm/annotations/FrameGeometry.d.ts +52 -0
  342. package/lib/esm/annotations/FrameGeometry.d.ts.map +1 -0
  343. package/lib/esm/annotations/FrameGeometry.js +245 -0
  344. package/lib/esm/annotations/FrameGeometry.js.map +1 -0
  345. package/lib/esm/{TextAnnotationElement.d.ts → annotations/TextAnnotationElement.d.ts} +6 -11
  346. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -0
  347. package/lib/esm/{TextAnnotationElement.js → annotations/TextAnnotationElement.js} +22 -28
  348. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -0
  349. package/lib/esm/annotations/TextAnnotationGeometry.d.ts +31 -0
  350. package/lib/esm/annotations/TextAnnotationGeometry.d.ts.map +1 -0
  351. package/lib/esm/annotations/TextAnnotationGeometry.js +129 -0
  352. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -0
  353. package/lib/esm/annotations/TextBlockGeometry.d.ts +16 -0
  354. package/lib/esm/annotations/TextBlockGeometry.d.ts.map +1 -0
  355. package/lib/esm/{TextAnnotationGeometry.js → annotations/TextBlockGeometry.js} +13 -69
  356. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -0
  357. package/lib/esm/{TextAnnotationLayout.d.ts → annotations/TextBlockLayout.d.ts} +22 -8
  358. package/lib/esm/annotations/TextBlockLayout.d.ts.map +1 -0
  359. package/lib/esm/{TextAnnotationLayout.js → annotations/TextBlockLayout.js} +51 -9
  360. package/lib/esm/annotations/TextBlockLayout.js.map +1 -0
  361. package/lib/esm/core-backend.d.ts +5 -3
  362. package/lib/esm/core-backend.d.ts.map +1 -1
  363. package/lib/esm/core-backend.js +25 -3
  364. package/lib/esm/core-backend.js.map +1 -1
  365. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  366. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  367. package/lib/esm/domains/GenericElements.js.map +1 -1
  368. package/lib/esm/domains/GenericSchema.js.map +1 -1
  369. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  370. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  371. package/lib/esm/internal/ElementLRUCache.d.ts +23 -0
  372. package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -1
  373. package/lib/esm/internal/ElementLRUCache.js +165 -2
  374. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  375. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  376. package/lib/esm/internal/HubMock.js.map +1 -1
  377. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  378. package/lib/esm/internal/NativePlatform.js.map +1 -1
  379. package/lib/esm/internal/NoLocks.js.map +1 -1
  380. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  381. package/lib/esm/internal/Symbols.d.ts +1 -0
  382. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  383. package/lib/esm/internal/Symbols.js +1 -0
  384. package/lib/esm/internal/Symbols.js.map +1 -1
  385. package/lib/esm/internal/cross-package.js.map +1 -1
  386. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  387. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  388. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  389. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  390. package/lib/esm/rpc/multipart.js.map +1 -1
  391. package/lib/esm/rpc/tracing.js.map +1 -1
  392. package/lib/esm/rpc/web/logging.js.map +1 -1
  393. package/lib/esm/rpc/web/request.js.map +1 -1
  394. package/lib/esm/rpc/web/response.js.map +1 -1
  395. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  396. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts +1 -1
  397. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +1 -1
  398. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  399. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  400. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  401. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  402. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  403. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  404. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  405. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  406. package/lib/esm/test/AttachDb.test.js +11 -11
  407. package/lib/esm/test/AttachDb.test.js.map +1 -1
  408. package/lib/esm/test/ElementLRUCache.test.js +224 -1
  409. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  410. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  411. package/lib/esm/test/IModelHost.test.js.map +1 -1
  412. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  413. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  414. package/lib/esm/test/IpcHost.test.js.map +1 -1
  415. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  416. package/lib/esm/test/PrintElementTree.js.map +1 -1
  417. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  418. package/lib/esm/test/RevisionUtility.js.map +1 -1
  419. package/lib/esm/test/SchemaUtils.test.js +25 -25
  420. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  421. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  422. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  423. package/lib/esm/test/TestUtils.d.ts +1 -1
  424. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  425. package/lib/esm/test/TestUtils.js +1 -1
  426. package/lib/esm/test/TestUtils.js.map +1 -1
  427. package/lib/esm/test/annotations/TextAnnotation.test.js +190 -1025
  428. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  429. package/lib/esm/test/annotations/TextBlock.test.d.ts +2 -0
  430. package/lib/esm/test/annotations/TextBlock.test.d.ts.map +1 -0
  431. package/lib/esm/test/annotations/TextBlock.test.js +1105 -0
  432. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -0
  433. package/lib/esm/test/categories/Category.test.js.map +1 -1
  434. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  435. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  436. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  437. package/lib/esm/test/ecdb/ConcurrentQuery.test.d.ts +2 -0
  438. package/lib/esm/test/ecdb/ConcurrentQuery.test.d.ts.map +1 -0
  439. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +164 -0
  440. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -0
  441. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +35 -45
  442. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  443. package/lib/esm/test/ecdb/ECDb.test.js +86 -65
  444. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  445. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  446. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  447. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  448. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  449. package/lib/esm/test/ecdb/ECSqlQuery.test.js +0 -55
  450. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  451. package/lib/esm/test/ecdb/ECSqlReader.test.js +16 -16
  452. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  453. package/lib/esm/test/ecdb/ECSqlStatement.test.js +484 -292
  454. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  455. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  456. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  457. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  458. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  459. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  460. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  461. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  462. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  463. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  464. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  465. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  466. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  467. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  468. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  469. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  470. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  471. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  472. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  473. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  474. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  475. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  476. package/lib/esm/test/imageData.js.map +1 -1
  477. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  478. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  479. package/lib/esm/test/imodel/IModel.test.js +228 -5
  480. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  481. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  482. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  483. package/lib/esm/test/index.js.map +1 -1
  484. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  485. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  486. package/lib/esm/test/misc/GeoServices.test.js +23 -9
  487. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  488. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  489. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  490. package/lib/esm/test/rpc/response.test.js.map +1 -1
  491. package/lib/esm/test/schema/ClassRegistry.test.js +71 -71
  492. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  493. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  494. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  495. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  496. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  497. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  498. package/lib/esm/test/standalone/ChangesetReader.test.js +479 -164
  499. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  500. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  501. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  502. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  503. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  504. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  505. package/lib/esm/test/standalone/ExportGraphics.test.js +67 -15
  506. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  507. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  508. package/lib/esm/test/standalone/GeometryStream.test.js +49 -1
  509. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  510. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  511. package/lib/esm/test/standalone/IModelLimits.test.d.ts +2 -0
  512. package/lib/esm/test/standalone/IModelLimits.test.d.ts.map +1 -0
  513. package/lib/esm/test/standalone/IModelLimits.test.js +103 -0
  514. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -0
  515. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  516. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  517. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  518. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  519. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  520. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  521. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  522. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  523. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  524. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  525. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  526. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  527. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  528. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  529. package/lib/esm/test/standalone/SnapshotDb.test.js +19 -1
  530. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  531. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  532. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  533. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  534. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  535. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  536. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  537. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  538. package/lib/esm/workspace/Settings.js.map +1 -1
  539. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  540. package/lib/esm/workspace/Workspace.js.map +1 -1
  541. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  542. package/package.json +12 -12
  543. package/lib/cjs/TextAnnotationElement.d.ts.map +0 -1
  544. package/lib/cjs/TextAnnotationElement.js.map +0 -1
  545. package/lib/cjs/TextAnnotationGeometry.d.ts +0 -32
  546. package/lib/cjs/TextAnnotationGeometry.d.ts.map +0 -1
  547. package/lib/cjs/TextAnnotationGeometry.js.map +0 -1
  548. package/lib/cjs/TextAnnotationLayout.d.ts.map +0 -1
  549. package/lib/cjs/TextAnnotationLayout.js.map +0 -1
  550. package/lib/esm/TextAnnotationElement.d.ts.map +0 -1
  551. package/lib/esm/TextAnnotationElement.js.map +0 -1
  552. package/lib/esm/TextAnnotationGeometry.d.ts +0 -32
  553. package/lib/esm/TextAnnotationGeometry.d.ts.map +0 -1
  554. package/lib/esm/TextAnnotationGeometry.js.map +0 -1
  555. package/lib/esm/TextAnnotationLayout.d.ts.map +0 -1
  556. package/lib/esm/TextAnnotationLayout.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { assert } from \"chai\";\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\n\n// cspell:ignore mirukuru ibim\n\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\n const rows: any[] = [];\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\n rows.push(queryRow.toRow());\n }\n return rows;\n}\n\ndescribe(\"Common table expression support in ECSQL\", () => {\n let imodel1: SnapshotDb;\n\n before(async () => {\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n });\n\n after(async () => {\n imodel1.close();\n });\n it(\"collect base properties recursively\", async () => {\n const query = `\n WITH RECURSIVE\n base_classes (aId, aParentId, aPath, aDepth) AS (\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\n UNION ALL\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\n FROM meta.ECClassDef c\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\n JOIN base_classes ON aId = cbc.TargetECInstanceId\n ORDER BY 1\n )\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\n const actual = rows.map((r) => r.prop);\n assert.sameOrderedMembers(actual, expected);\n });\n\n it(\"generate mandelbrot set\", async () => {\n const rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n [xaxis]([x]) AS(\n VALUES (- 2.0)\n UNION ALL\n SELECT [x] + 0.05\n FROM [xaxis]\n WHERE [x] < 1.2\n ),\n [yaxis]([y]) AS(\n VALUES (- 1.0)\n UNION ALL\n SELECT [y] + 0.1\n FROM [yaxis]\n WHERE [y] < 1.0\n ),\n [m]([iter], [cx], [cy], [x], [y]) AS(\n SELECT\n 0,\n [x],\n [y],\n 0.0,\n 0.0\n FROM [xaxis],\n [yaxis]\n UNION ALL\n SELECT\n [iter] + 1,\n [cx],\n [cy],\n [x] * [x] - [y] * [y] + [cx],\n 2.0 * [x] * [y] + [cy]\n FROM [m]\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\n ),\n [m2]([iter], [cx], [cy]) AS(\n SELECT\n MAX ([iter]),\n [cx],\n [cy]\n FROM [m]\n GROUP BY\n [cx],\n [cy]\n ),\n [a]([t]) AS(\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\n FROM [m2]\n GROUP BY [cy]\n )\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\n FROM [a];\n `);\n\n const expected =\n \" ....#\\n\" +\n \" ..#*..\\n\" +\n \" ..+####+.\\n\" +\n \" .......+####.... +\\n\" +\n \" ..##+*##########+.++++\\n\" +\n \" .+.##################+.\\n\" +\n \" .............+###################+.+\\n\" +\n \" ..++..#.....*#####################+.\\n\" +\n \" ...+#######++#######################.\\n\" +\n \" ....+*################################.\\n\" +\n \" #############################################...\\n\" +\n \" ....+*################################.\\n\" +\n \" ...+#######++#######################.\\n\" +\n \" ..++..#.....*#####################+.\\n\" +\n \" .............+###################+.+\\n\" +\n \" .+.##################+.\\n\" +\n \" ..##+*##########+.++++\\n\" +\n \" .......+####.... +\\n\" +\n \" ..+####+.\\n\" +\n \" ..#*..\\n\" +\n \" ....#\\n\" +\n \" +.\";\n assert(rows[0].mandelbrot_set === expected);\n });\n\n it(\"basic cte test\", async () => {\n let rows = [];\n rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n cnt (x,y) AS (\n SELECT 100, 200\n UNION ALL\n SELECT x+1, 200 FROM cnt WHERE x<210\n )\n SELECT * from cnt`);\n assert(rows.length === 111);\n\n rows = await executeQuery(imodel1, `\n WITH RECURSIVE\n cnt (x,y) AS (\n SELECT 100, 200\n )\n SELECT * from cnt`);\n\n let slm = new SequentialLogMatcher();\n // these two are generated by sqlite\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\n assert(rows.length === 1);\n try {\n rows = await executeQuery(imodel1, `\n WITH\n cte_1 (a,b,c) AS (\n SELECT 100, 400, 300\n ),\n cte_1 (a,b,c) AS (\n SELECT 100, 400, 300\n )\n SELECT * from cte_1`);\n assert(false);\n } catch {\n assert(true); // should fail as cte_1 is used for two ct expression.\n }\n assert.isTrue(slm.finishAndDispose());\n slm = new SequentialLogMatcher();\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\n try {\n rows = await executeQuery(imodel1, `\n WITH\n cte_1 (a,b,c) AS (\n SELECT 100, 400\n )\n SELECT * from cte_1`);\n assert(false);\n } catch {\n assert(true); // number are to ct expression does not match select\n }\n assert.isTrue(slm.finishAndDispose());\n });\n});\n"]}
1
+ {"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.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 { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ConcurrentQuery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentQuery.test.d.ts","sourceRoot":"","sources":["../../../../src/test/ecdb/ConcurrentQuery.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { DbResponseStatus } from "@itwin/core-common";
2
+ import { expect } from "chai";
3
+ import { ConcurrentQuery } from "../../ConcurrentQuery";
4
+ import { SnapshotDb } from "../../IModelDb";
5
+ import { _nativeDb } from "../../core-backend";
6
+ import { IModelTestUtils } from "../IModelTestUtils";
7
+ async function delay(ms) {
8
+ return new Promise(resolve => {
9
+ setTimeout(resolve, ms);
10
+ });
11
+ }
12
+ describe("ConcurrentQuery", () => {
13
+ it("default config", () => {
14
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
15
+ const db = SnapshotDb.openFile(testFile);
16
+ const defaultConfig = {
17
+ autoShutdownWhenIdleForSeconds: 1800,
18
+ doNotUsePrimaryConnToPrepare: false,
19
+ globalQuota: { time: 60, memory: 8388608 },
20
+ ignoreDelay: true,
21
+ ignorePriority: false,
22
+ memoryMapFileSize: 0,
23
+ monitorPollInterval: 5000,
24
+ progressOpCount: 5000,
25
+ requestQueueSize: 2000,
26
+ statementCacheSizePerWorker: 40,
27
+ workerThreads: 4,
28
+ };
29
+ const config = ConcurrentQuery.resetConfig(db[_nativeDb], {});
30
+ expect(config).deep.eq(defaultConfig);
31
+ db.close();
32
+ });
33
+ it("modify config", () => {
34
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
35
+ const db = SnapshotDb.openFile(testFile);
36
+ const modifiedConfig = {
37
+ autoShutdownWhenIdleForSeconds: 100,
38
+ doNotUsePrimaryConnToPrepare: true,
39
+ globalQuota: { time: 10, memory: 1000000 },
40
+ ignoreDelay: false,
41
+ ignorePriority: true,
42
+ memoryMapFileSize: 100,
43
+ monitorPollInterval: 2000,
44
+ progressOpCount: 6000,
45
+ requestQueueSize: 1000,
46
+ statementCacheSizePerWorker: 20,
47
+ workerThreads: 3,
48
+ };
49
+ const config = ConcurrentQuery.resetConfig(db[_nativeDb], modifiedConfig);
50
+ expect(config).deep.eq(modifiedConfig);
51
+ db.close();
52
+ });
53
+ it("time limit check", async () => {
54
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
55
+ const db = SnapshotDb.openFile(testFile);
56
+ ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 1, memory: 100000 }, progressOpCount: 1000 });
57
+ // await runSingleRequest(db, `SELECT 1`);
58
+ const req = {
59
+ query: `WITH sequence(n,k) AS (
60
+ SELECT 1,1 UNION ALL SELECT n + 1, random() FROM sequence WHERE n < 10000000
61
+ ) SELECT COUNT(*) FROM sequence s`
62
+ };
63
+ const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);
64
+ expect(resp.status).equals(DbResponseStatus.Partial);
65
+ expect(resp.stats.timeLimit).equals(1000);
66
+ expect(resp.stats.memLimit).equals(100000);
67
+ expect(resp.stats.cpuTime).to.be.closeTo(1000970, 500000);
68
+ expect(resp.stats.totalTime).to.be.closeTo(1001, 100);
69
+ expect(resp.stats.memUsed).to.be.closeTo(2, 3);
70
+ expect(resp.stats.prepareTime).to.be.closeTo(0, 2);
71
+ db.close();
72
+ });
73
+ it("memory limit check", async () => {
74
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
75
+ const db = SnapshotDb.openFile(testFile);
76
+ ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 60, memory: 1000 }, progressOpCount: 1000 });
77
+ // await runSingleRequest(db, `SELECT 1`);
78
+ const req = {
79
+ query: `WITH sequence(n) AS (
80
+ SELECT 1
81
+ UNION ALL
82
+ SELECT n + 1 FROM sequence WHERE n < 10000000
83
+ )
84
+ SELECT 'xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx' FROM sequence s`
85
+ };
86
+ const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);
87
+ expect(resp.status).equals(DbResponseStatus.Partial);
88
+ expect(resp.stats.timeLimit).equals(60000);
89
+ expect(resp.stats.memLimit).equals(1000);
90
+ expect(resp.stats.memUsed).to.be.closeTo(1037, 100);
91
+ db.close();
92
+ });
93
+ it("prepare error", async () => {
94
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
95
+ const db = SnapshotDb.openFile(testFile);
96
+ const req = {
97
+ query: `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
98
+ };
99
+ const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);
100
+ expect(resp.status).equals(DbResponseStatus.Error_ECSql_PreparedFailed);
101
+ db.close();
102
+ });
103
+ it("restart query", async () => {
104
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
105
+ const db = SnapshotDb.openFile(testFile);
106
+ ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 60, memory: 10000000 }, progressOpCount: 1000 });
107
+ const req0 = {
108
+ query: `WITH sequence(n) AS (
109
+ SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000
110
+ ) SELECT n FROM sequence s`,
111
+ restartToken: "Blah",
112
+ };
113
+ const req1 = {
114
+ query: `WITH sequence(n) AS (
115
+ SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 1000
116
+ ) SELECT n FROM sequence s`,
117
+ restartToken: "Blah",
118
+ };
119
+ const resp1 = ConcurrentQuery.executeQueryRequest(db[_nativeDb], req0);
120
+ await delay(1);
121
+ const resp2 = ConcurrentQuery.executeQueryRequest(db[_nativeDb], req1);
122
+ const resp = await Promise.all([resp1, resp2]);
123
+ expect(resp[0].status).equals(DbResponseStatus.Cancel);
124
+ expect(resp[1].status).equals(DbResponseStatus.Done);
125
+ db.close();
126
+ });
127
+ it("queue limit check", async () => {
128
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
129
+ const db = SnapshotDb.openFile(testFile);
130
+ ConcurrentQuery.resetConfig(db[_nativeDb], { requestQueueSize: 40, globalQuota: { time: 5, memory: 100000 } });
131
+ const req = {
132
+ query: `WITH sequence(n) AS (
133
+ SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000
134
+ ) SELECT n FROM sequence s`,
135
+ };
136
+ const responsePromises = [];
137
+ for (let i = 0; i < 60; ++i) {
138
+ responsePromises.push(ConcurrentQuery.executeQueryRequest(db[_nativeDb], req));
139
+ }
140
+ const responses = await Promise.all(responsePromises);
141
+ const queueResponses = Array.from(responses.filter((x) => x.status === DbResponseStatus.QueueFull));
142
+ expect(queueResponses.length).to.be.greaterThanOrEqual(10);
143
+ db.close();
144
+ });
145
+ it("timeout check", async () => {
146
+ const testFile = IModelTestUtils.resolveAssetFile("test.bim");
147
+ const db = SnapshotDb.openFile(testFile);
148
+ ConcurrentQuery.resetConfig(db[_nativeDb], { monitorPollInterval: 1, globalQuota: { time: 5, memory: 10000000 } });
149
+ const req = {
150
+ query: `WITH sequence(n) AS (
151
+ SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000
152
+ ) SELECT n FROM sequence s`,
153
+ };
154
+ const responsePromises = [];
155
+ for (let i = 0; i < 100; ++i) {
156
+ responsePromises.push(ConcurrentQuery.executeQueryRequest(db[_nativeDb], req));
157
+ }
158
+ const responses = await Promise.all(responsePromises);
159
+ const queueResponses = Array.from(responses.filter((x) => x.status === DbResponseStatus.Timeout));
160
+ expect(queueResponses.length).to.be.greaterThanOrEqual(10);
161
+ db.close();
162
+ });
163
+ });
164
+ //# sourceMappingURL=ConcurrentQuery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConcurrentQuery.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ConcurrentQuery.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { DbQueryRequest, DbQueryResponse, DbResponseStatus } from \"@itwin/core-common\";\r\nimport { expect } from \"chai\";\r\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { _nativeDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\nasync function delay(ms: number): Promise<void> {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\ndescribe(\"ConcurrentQuery\", () => {\r\n it(\"default config\", () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n const defaultConfig = {\r\n autoShutdownWhenIdleForSeconds: 1800,\r\n doNotUsePrimaryConnToPrepare: false,\r\n globalQuota: { time: 60, memory: 8388608 },\r\n ignoreDelay: true,\r\n ignorePriority: false,\r\n memoryMapFileSize: 0,\r\n monitorPollInterval: 5000,\r\n progressOpCount: 5000,\r\n requestQueueSize: 2000,\r\n statementCacheSizePerWorker: 40,\r\n workerThreads: 4,\r\n };\r\n const config = ConcurrentQuery.resetConfig(db[_nativeDb], {});\r\n expect(config).deep.eq(defaultConfig);\r\n db.close();\r\n });\r\n\r\n it(\"modify config\", () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n const modifiedConfig = {\r\n autoShutdownWhenIdleForSeconds: 100,\r\n doNotUsePrimaryConnToPrepare: true,\r\n globalQuota: { time: 10, memory: 1000000 },\r\n ignoreDelay: false,\r\n ignorePriority: true,\r\n memoryMapFileSize: 100,\r\n monitorPollInterval: 2000,\r\n progressOpCount: 6000,\r\n requestQueueSize: 1000,\r\n statementCacheSizePerWorker: 20,\r\n workerThreads: 3,\r\n };\r\n const config = ConcurrentQuery.resetConfig(db[_nativeDb], modifiedConfig);\r\n expect(config).deep.eq(modifiedConfig);\r\n db.close();\r\n });\r\n\r\n it(\"time limit check\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 1, memory: 100000 }, progressOpCount: 1000 });\r\n // await runSingleRequest(db, `SELECT 1`);\r\n const req: DbQueryRequest = {\r\n query: `WITH sequence(n,k) AS (\r\n SELECT 1,1 UNION ALL SELECT n + 1, random() FROM sequence WHERE n < 10000000\r\n ) SELECT COUNT(*) FROM sequence s`\r\n };\r\n\r\n const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);\r\n expect(resp.status).equals(DbResponseStatus.Partial);\r\n expect(resp.stats.timeLimit).equals(1000);\r\n expect(resp.stats.memLimit).equals(100000);\r\n expect(resp.stats.cpuTime).to.be.closeTo(1000970, 500000);\r\n expect(resp.stats.totalTime).to.be.closeTo(1001, 100);\r\n expect(resp.stats.memUsed).to.be.closeTo(2, 3);\r\n expect(resp.stats.prepareTime).to.be.closeTo(0, 2);\r\n db.close();\r\n });\r\n\r\n it(\"memory limit check\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 60, memory: 1000 }, progressOpCount: 1000 });\r\n // await runSingleRequest(db, `SELECT 1`);\r\n const req: DbQueryRequest = {\r\n query: `WITH sequence(n) AS (\r\n SELECT 1\r\n UNION ALL\r\n SELECT n + 1 FROM sequence WHERE n < 10000000\r\n )\r\n SELECT 'xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx' FROM sequence s`\r\n };\r\n\r\n const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);\r\n expect(resp.status).equals(DbResponseStatus.Partial);\r\n expect(resp.stats.timeLimit).equals(60000);\r\n expect(resp.stats.memLimit).equals(1000);\r\n expect(resp.stats.memUsed).to.be.closeTo(1037, 100);\r\n db.close();\r\n });\r\n\r\n it(\"prepare error\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n const req: DbQueryRequest = {\r\n query: `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`\r\n };\r\n\r\n const resp = await ConcurrentQuery.executeQueryRequest(db[_nativeDb], req);\r\n expect(resp.status).equals(DbResponseStatus.Error_ECSql_PreparedFailed);\r\n db.close();\r\n });\r\n\r\n it(\"restart query\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n ConcurrentQuery.resetConfig(db[_nativeDb], { globalQuota: { time: 60, memory: 10000000 }, progressOpCount: 1000 });\r\n const req0: DbQueryRequest = {\r\n query: `WITH sequence(n) AS (\r\n SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000\r\n ) SELECT n FROM sequence s`,\r\n restartToken: \"Blah\",\r\n };\r\n\r\n const req1: DbQueryRequest = {\r\n query: `WITH sequence(n) AS (\r\n SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 1000\r\n ) SELECT n FROM sequence s`,\r\n restartToken: \"Blah\",\r\n };\r\n\r\n const resp1 = ConcurrentQuery.executeQueryRequest(db[_nativeDb], req0);\r\n await delay(1);\r\n const resp2 = ConcurrentQuery.executeQueryRequest(db[_nativeDb], req1);\r\n const resp = await Promise.all([resp1, resp2]);\r\n expect(resp[0].status).equals(DbResponseStatus.Cancel);\r\n expect(resp[1].status).equals(DbResponseStatus.Done);\r\n db.close();\r\n });\r\n\r\n it(\"queue limit check\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n ConcurrentQuery.resetConfig(db[_nativeDb], { requestQueueSize: 40, globalQuota: { time: 5, memory: 100000 } });\r\n const req: DbQueryRequest = {\r\n query: `WITH sequence(n) AS (\r\n SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000\r\n ) SELECT n FROM sequence s`,\r\n };\r\n\r\n const responsePromises: Promise<DbQueryResponse>[] = [];\r\n for (let i = 0; i < 60; ++i) {\r\n responsePromises.push(ConcurrentQuery.executeQueryRequest(db[_nativeDb], req));\r\n }\r\n const responses = await Promise.all(responsePromises);\r\n const queueResponses = Array.from(responses.filter((x) => x.status === DbResponseStatus.QueueFull));\r\n expect(queueResponses.length).to.be.greaterThanOrEqual(10);\r\n db.close();\r\n });\r\n\r\n it(\"timeout check\", async () => {\r\n const testFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(testFile);\r\n ConcurrentQuery.resetConfig(db[_nativeDb], { monitorPollInterval: 1, globalQuota: { time: 5, memory: 10000000 } });\r\n const req: DbQueryRequest = {\r\n query: `WITH sequence(n) AS (\r\n SELECT 1 UNION ALL SELECT n + 1 FROM sequence WHERE n < 10000000\r\n ) SELECT n FROM sequence s`,\r\n };\r\n\r\n const responsePromises: Promise<DbQueryResponse>[] = [];\r\n for (let i = 0; i < 100; ++i) {\r\n responsePromises.push(ConcurrentQuery.executeQueryRequest(db[_nativeDb], req));\r\n }\r\n const responses = await Promise.all(responsePromises);\r\n const queueResponses = Array.from(responses.filter((x) => x.status === DbResponseStatus.Timeout));\r\n expect(queueResponses.length).to.be.greaterThanOrEqual(10);\r\n db.close();\r\n });\r\n});\r\n"]}
@@ -6,10 +6,10 @@ import { _nativeDb } from "../../core-backend";
6
6
  import { IModelTestUtils } from "../IModelTestUtils";
7
7
  class LoadSimulator {
8
8
  db;
9
- senario;
10
- constructor(db, senario) {
9
+ scenario;
10
+ constructor(db, scenario) {
11
11
  this.db = db;
12
- this.senario = senario;
12
+ this.scenario = scenario;
13
13
  }
14
14
  async runQueryTask(reader) {
15
15
  try {
@@ -22,23 +22,23 @@ class LoadSimulator {
22
22
  }
23
23
  async run() {
24
24
  ConcurrentQuery.shutdown(this.db[_nativeDb]);
25
- if (this.senario.config) {
26
- const config = ConcurrentQuery.resetConfig(this.db[_nativeDb], this.senario.config);
25
+ if (this.scenario.config) {
26
+ const config = ConcurrentQuery.resetConfig(this.db[_nativeDb], this.scenario.config);
27
27
  // eslint-disable-next-line no-console
28
28
  console.log(config);
29
29
  }
30
- const overalTime = new StopWatch();
31
- overalTime.start();
30
+ const overallTime = new StopWatch();
31
+ overallTime.start();
32
32
  const results = [];
33
- for (let i = 0; i < this.senario.totalBatches; ++i) {
33
+ for (let i = 0; i < this.scenario.totalBatches; ++i) {
34
34
  const promises = [];
35
- const readerTasks = Array(this.senario.taskPerBatch).fill(undefined).map(() => this.senario.createReader(this.db));
35
+ const readerTasks = Array(this.scenario.taskPerBatch).fill(undefined).map(() => this.scenario.createReader(this.db));
36
36
  readerTasks.forEach((reader) => {
37
37
  promises.push(this.runQueryTask(reader));
38
38
  });
39
39
  results.push(...await Promise.all(promises));
40
40
  }
41
- overalTime.stop();
41
+ overallTime.stop();
42
42
  const errors = results.filter((x) => x.error !== undefined);
43
43
  const errorsMap = new Map();
44
44
  errors.forEach((x) => {
@@ -94,7 +94,7 @@ class LoadSimulator {
94
94
  retryCount,
95
95
  prepareTime,
96
96
  },
97
- overalTimeInSec: overalTime.currentSeconds,
97
+ overallTimeInSec: overallTime.currentSeconds,
98
98
  errorCount,
99
99
  totalQueries: results.length,
100
100
  errorMap: errorsMap
@@ -105,58 +105,48 @@ describe.skip("ConcurrentQueryLoad", () => {
105
105
  it("should run", async () => {
106
106
  Logger.initializeToConsole();
107
107
  Logger.setLevel("ECDb.ConcurrentQuery", LogLevel.Trace);
108
- // {
109
- // workerThreads: 4,
110
- // requestQueueSize: 2000,
111
- // ignorePriority: false,
112
- // ignoreDelay: true,
113
- // doNotUsePrimaryConnToPrepare: false,
114
- // autoShutdowWhenIdlelForSeconds: 300,
115
- // statementCacheSizePerWorker: 40,
116
- // monitorPollInterval: 1000,
117
- // memoryMapFileSize: 0,
118
- // allowTestingArgs: false,
119
- // globalQuota: { time: 60, memory: 8388608 }
120
- // }
121
- const senario = {
108
+ const scenario = {
122
109
  name: "ConcurrentQueryLoad",
123
- config: {},
110
+ config: {
111
+ globalQuota: { time: 1, memory: 8388608 },
112
+ workerThreads: 1,
113
+ },
124
114
  totalBatches: 1,
125
115
  taskPerBatch: 1,
126
116
  createReader: (dbs) => {
127
- const quries = [
117
+ const queries = [
128
118
  {
129
- sql: `
130
- WITH sequence(n) AS (
131
- SELECT 1
132
- UNION ALL
133
- SELECT n + 1 FROM sequence WHERE n < 10000
134
- )
135
- SELECT COUNT(*)
136
- FROM bis.SpatialIndex i, sequence s
137
- WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(
119
+ sql: `
120
+ WITH sequence(n) AS (
121
+ SELECT 1
122
+ UNION ALL
123
+ SELECT n + 1 FROM sequence WHERE n < 10000000
124
+ )
125
+ SELECT COUNT(*)
126
+ FROM bis.SpatialIndex i, sequence s
127
+ WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(
138
128
  iModel_bbox(random(), random(), random(), random(),random(), random()))`
139
129
  },
140
130
  {
141
- sql: `
142
- WITH sequence(n) AS (
143
- SELECT 1
144
- UNION ALL
145
- SELECT n + 1 FROM sequence WHERE n < 1000000
146
- )
131
+ sql: `
132
+ WITH sequence(n) AS (
133
+ SELECT 1
134
+ UNION ALL
135
+ SELECT n + 1 FROM sequence WHERE n < 10000000
136
+ )
147
137
  SELECT COUNT(*) FROM sequence`
148
138
  },
149
139
  {
150
140
  sql: "SELECT $ FROM bis.Element LIMIT 10000"
151
141
  }
152
142
  ];
153
- const idx = Math.floor(Math.random() * quries.length);
154
- return dbs.createQueryReader(quries[idx].sql);
143
+ const idx = Math.floor(Math.random() * queries.length);
144
+ return dbs.createQueryReader(queries[idx].sql);
155
145
  }
156
146
  };
157
147
  const verySmallFile = IModelTestUtils.resolveAssetFile("test.bim");
158
148
  const db = SnapshotDb.openFile(verySmallFile);
159
- const simulator = new LoadSimulator(db, senario);
149
+ const simulator = new LoadSimulator(db, scenario);
160
150
  const result = await simulator.run();
161
151
  // eslint-disable-next-line no-console
162
152
  console.log(result);
@@ -1 +1 @@
1
- {"version":3,"file":"ConcurrentQueryLoad.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ConcurrentQueryLoad.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger, LogLevel, StopWatch } from \"@itwin/core-bentley\";\nimport { DbQueryConfig, ECSqlReader, QueryStats } from \"@itwin/core-common\";\nimport { expect } from \"chai\";\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\nimport { ECDb } from \"../../ECDb\";\nimport { IModelDb, SnapshotDb } from \"../../IModelDb\";\nimport { _nativeDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ninterface ITaskResult {\n stats: QueryStats;\n error?: any;\n}\n\ninterface ISenario {\n name: string;\n config?: DbQueryConfig;\n totalBatches: number;\n taskPerBatch: number;\n createReader: (db: ECDb | IModelDb) => ECSqlReader;\n}\n\n\nclass LoadSimulator {\n constructor(public db: ECDb | IModelDb, public senario: ISenario) { }\n private async runQueryTask(reader: ECSqlReader): Promise<ITaskResult> {\n try {\n while (await reader.step()) { }\n return { stats: reader.stats };\n } catch (err) {\n return { stats: reader.stats, error: err };\n }\n }\n\n public async run() {\n ConcurrentQuery.shutdown(this.db[_nativeDb]);\n if (this.senario.config) {\n const config = ConcurrentQuery.resetConfig(this.db[_nativeDb], this.senario.config);\n // eslint-disable-next-line no-console\n console.log(config);\n }\n const overalTime = new StopWatch();\n overalTime.start();\n const results: ITaskResult[] = [];\n for (let i = 0; i < this.senario.totalBatches; ++i) {\n const promises: Promise<ITaskResult>[] = [];\n const readerTasks = Array(this.senario.taskPerBatch).fill(undefined).map(() => this.senario.createReader(this.db));\n readerTasks.forEach((reader) => {\n promises.push(this.runQueryTask(reader));\n });\n results.push(... await Promise.all(promises));\n\n }\n overalTime.stop();\n const errors = results.filter((x) => x.error !== undefined);\n const errorsMap = new Map<string, number>();\n errors.forEach((x) => {\n if (x.error instanceof Error) {\n if (!errorsMap.has(x.error.message)) {\n errorsMap.set(x.error.message, 1);\n } else {\n errorsMap.set(x.error.message, errorsMap.get(x.error.message)! + 1);\n }\n } else {\n if (!errorsMap.has(\"error\")) {\n errorsMap.set(\"error\", 1);\n } else {\n errorsMap.set(\"error\", errorsMap.get(\"error\")! + 1);\n }\n }\n });\n const errorCount = errors.length;\n let backendCpuTime: bigint = BigInt(0);\n let backendTotalTime: bigint = BigInt(0);\n let backendMemUsed: bigint = BigInt(0);\n let backendRowsReturned: bigint = BigInt(0);\n let totalTime: bigint = BigInt(0);\n let retryCount: bigint = BigInt(0);\n let prepareTime: bigint = BigInt(0);\n\n // Calculate average\n results.forEach((r: ITaskResult) => {\n backendCpuTime += BigInt(r.stats.backendCpuTime);\n backendTotalTime += BigInt(r.stats.backendTotalTime);\n backendMemUsed += BigInt(r.stats.backendMemUsed);\n backendRowsReturned += BigInt(r.stats.backendRowsReturned);\n totalTime += BigInt(r.stats.totalTime);\n retryCount += BigInt(r.stats.retryCount);\n prepareTime += BigInt(r.stats.prepareTime);\n });\n\n backendCpuTime /= BigInt(results.length);\n backendTotalTime /= BigInt(results.length);\n backendMemUsed /= BigInt(results.length);\n backendRowsReturned /= BigInt(results.length);\n totalTime /= BigInt(results.length);\n retryCount /= BigInt(results.length);\n // prepareTime /= BigInt(results.length);\n\n return {\n result: {\n backendCpuTime,\n backendTotalTime,\n backendMemUsed,\n backendRowsReturned,\n totalTime,\n retryCount,\n prepareTime,\n },\n overalTimeInSec: overalTime.currentSeconds,\n errorCount,\n totalQueries: results.length,\n errorMap: errorsMap\n };\n\n }\n}\n\ndescribe.skip(\"ConcurrentQueryLoad\", () => {\n it(\"should run\", async () => {\n Logger.initializeToConsole();\n Logger.setLevel(\"ECDb.ConcurrentQuery\", LogLevel.Trace);\n // {\n // workerThreads: 4,\n // requestQueueSize: 2000,\n // ignorePriority: false,\n // ignoreDelay: true,\n // doNotUsePrimaryConnToPrepare: false,\n // autoShutdowWhenIdlelForSeconds: 300,\n // statementCacheSizePerWorker: 40,\n // monitorPollInterval: 1000,\n // memoryMapFileSize: 0,\n // allowTestingArgs: false,\n // globalQuota: { time: 60, memory: 8388608 }\n // }\n\n const senario: ISenario = {\n name: \"ConcurrentQueryLoad\",\n config: {\n\n },\n totalBatches: 1,\n taskPerBatch: 1,\n createReader: (dbs: ECDb | IModelDb) => {\n const quries = [\n {\n sql: `\n WITH sequence(n) AS (\n SELECT 1\n UNION ALL\n SELECT n + 1 FROM sequence WHERE n < 10000\n )\n SELECT COUNT(*)\n FROM bis.SpatialIndex i, sequence s\n WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(\n iModel_bbox(random(), random(), random(), random(),random(), random()))`\n },\n {\n sql: `\n WITH sequence(n) AS (\n SELECT 1\n UNION ALL\n SELECT n + 1 FROM sequence WHERE n < 1000000\n )\n SELECT COUNT(*) FROM sequence`\n },\n {\n sql: \"SELECT $ FROM bis.Element LIMIT 10000\"\n }\n ];\n const idx = Math.floor(Math.random() * quries.length);\n return dbs.createQueryReader(quries[idx].sql);\n }\n };\n\n const verySmallFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\n const db = SnapshotDb.openFile(verySmallFile);\n const simulator = new LoadSimulator(db, senario);\n const result = await simulator.run();\n // eslint-disable-next-line no-console\n console.log(result);\n db.close();\n expect(result.errorCount).to.be.equal(0);\n });\n\n});"]}
1
+ {"version":3,"file":"ConcurrentQueryLoad.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ConcurrentQueryLoad.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger, LogLevel, StopWatch } from \"@itwin/core-bentley\";\r\nimport { DbQueryConfig, ECSqlReader, QueryStats } from \"@itwin/core-common\";\r\nimport { expect } from \"chai\";\r\nimport { ConcurrentQuery } from \"../../ConcurrentQuery\";\r\nimport { ECDb } from \"../../ECDb\";\r\nimport { IModelDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { _nativeDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\ninterface ITaskResult {\r\n stats: QueryStats;\r\n error?: any;\r\n}\r\n\r\ninterface IScenario {\r\n name: string;\r\n config?: DbQueryConfig;\r\n totalBatches: number;\r\n taskPerBatch: number;\r\n createReader: (db: ECDb | IModelDb) => ECSqlReader;\r\n}\r\n\r\nclass LoadSimulator {\r\n constructor(public db: ECDb | IModelDb, public scenario: IScenario) { }\r\n private async runQueryTask(reader: ECSqlReader): Promise<ITaskResult> {\r\n try {\r\n while (await reader.step()) { }\r\n return { stats: reader.stats };\r\n } catch (err) {\r\n return { stats: reader.stats, error: err };\r\n }\r\n }\r\n\r\n public async run() {\r\n ConcurrentQuery.shutdown(this.db[_nativeDb]);\r\n if (this.scenario.config) {\r\n const config = ConcurrentQuery.resetConfig(this.db[_nativeDb], this.scenario.config);\r\n // eslint-disable-next-line no-console\r\n console.log(config);\r\n }\r\n const overallTime = new StopWatch();\r\n overallTime.start();\r\n const results: ITaskResult[] = [];\r\n for (let i = 0; i < this.scenario.totalBatches; ++i) {\r\n const promises: Promise<ITaskResult>[] = [];\r\n const readerTasks = Array(this.scenario.taskPerBatch).fill(undefined).map(() => this.scenario.createReader(this.db));\r\n readerTasks.forEach((reader) => {\r\n promises.push(this.runQueryTask(reader));\r\n });\r\n results.push(... await Promise.all(promises));\r\n\r\n }\r\n overallTime.stop();\r\n const errors = results.filter((x) => x.error !== undefined);\r\n const errorsMap = new Map<string, number>();\r\n errors.forEach((x) => {\r\n if (x.error instanceof Error) {\r\n if (!errorsMap.has(x.error.message)) {\r\n errorsMap.set(x.error.message, 1);\r\n } else {\r\n errorsMap.set(x.error.message, errorsMap.get(x.error.message)! + 1);\r\n }\r\n } else {\r\n if (!errorsMap.has(\"error\")) {\r\n errorsMap.set(\"error\", 1);\r\n } else {\r\n errorsMap.set(\"error\", errorsMap.get(\"error\")! + 1);\r\n }\r\n }\r\n });\r\n const errorCount = errors.length;\r\n let backendCpuTime: bigint = BigInt(0);\r\n let backendTotalTime: bigint = BigInt(0);\r\n let backendMemUsed: bigint = BigInt(0);\r\n let backendRowsReturned: bigint = BigInt(0);\r\n let totalTime: bigint = BigInt(0);\r\n let retryCount: bigint = BigInt(0);\r\n let prepareTime: bigint = BigInt(0);\r\n\r\n // Calculate average\r\n results.forEach((r: ITaskResult) => {\r\n backendCpuTime += BigInt(r.stats.backendCpuTime);\r\n backendTotalTime += BigInt(r.stats.backendTotalTime);\r\n backendMemUsed += BigInt(r.stats.backendMemUsed);\r\n backendRowsReturned += BigInt(r.stats.backendRowsReturned);\r\n totalTime += BigInt(r.stats.totalTime);\r\n retryCount += BigInt(r.stats.retryCount);\r\n prepareTime += BigInt(r.stats.prepareTime);\r\n });\r\n\r\n backendCpuTime /= BigInt(results.length);\r\n backendTotalTime /= BigInt(results.length);\r\n backendMemUsed /= BigInt(results.length);\r\n backendRowsReturned /= BigInt(results.length);\r\n totalTime /= BigInt(results.length);\r\n retryCount /= BigInt(results.length);\r\n // prepareTime /= BigInt(results.length);\r\n\r\n return {\r\n result: {\r\n backendCpuTime,\r\n backendTotalTime,\r\n backendMemUsed,\r\n backendRowsReturned,\r\n totalTime,\r\n retryCount,\r\n prepareTime,\r\n },\r\n overallTimeInSec: overallTime.currentSeconds,\r\n errorCount,\r\n totalQueries: results.length,\r\n errorMap: errorsMap\r\n };\r\n\r\n }\r\n}\r\ndescribe.skip(\"ConcurrentQueryLoad\", () => {\r\n it(\"should run\", async () => {\r\n Logger.initializeToConsole();\r\n Logger.setLevel(\"ECDb.ConcurrentQuery\", LogLevel.Trace);\r\n\r\n const scenario: IScenario = {\r\n name: \"ConcurrentQueryLoad\",\r\n config: {\r\n globalQuota: { time: 1, memory: 8388608 },\r\n workerThreads: 1,\r\n },\r\n totalBatches: 1,\r\n taskPerBatch: 1,\r\n createReader: (dbs: ECDb | IModelDb) => {\r\n const queries = [\r\n {\r\n sql: `\r\n WITH sequence(n) AS (\r\n SELECT 1\r\n UNION ALL\r\n SELECT n + 1 FROM sequence WHERE n < 10000000\r\n )\r\n SELECT COUNT(*)\r\n FROM bis.SpatialIndex i, sequence s\r\n WHERE i.ECInstanceId MATCH iModel_spatial_overlap_aabb(\r\n iModel_bbox(random(), random(), random(), random(),random(), random()))`\r\n },\r\n {\r\n sql: `\r\n WITH sequence(n) AS (\r\n SELECT 1\r\n UNION ALL\r\n SELECT n + 1 FROM sequence WHERE n < 10000000\r\n )\r\n SELECT COUNT(*) FROM sequence`\r\n },\r\n {\r\n sql: \"SELECT $ FROM bis.Element LIMIT 10000\"\r\n }\r\n ];\r\n const idx = Math.floor(Math.random() * queries.length);\r\n return dbs.createQueryReader(queries[idx].sql);\r\n }\r\n };\r\n\r\n const verySmallFile = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = SnapshotDb.openFile(verySmallFile);\r\n const simulator = new LoadSimulator(db, scenario);\r\n const result = await simulator.run();\r\n // eslint-disable-next-line no-console\r\n console.log(result);\r\n db.close();\r\n expect(result.errorCount).to.be.equal(0);\r\n });\r\n});\r\n"]}