@budibase/server 2.3.15 → 2.3.17-alpha.0

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 (458) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/builder/assets/{index.4488f38d.css → index.7e76c039.css} +1 -1
  3. package/builder/assets/{index.e88df740.js → index.e8838b62.js} +364 -364
  4. package/builder/index.html +2 -2
  5. package/dist/api/controllers/query/index.js +2 -0
  6. package/dist/api/controllers/row/ExternalRequest.js +4 -2
  7. package/dist/api/controllers/row/external.js +12 -1
  8. package/dist/api/controllers/table/external.js +8 -8
  9. package/dist/api/routes/public/tests/utils.js +29 -2
  10. package/dist/api/routes/tests/utilities/index.js +131 -0
  11. package/dist/app.js +7 -1
  12. package/dist/constants/index.js +4 -24
  13. package/dist/db/defaultData/datasource_bb_default.js +6 -5
  14. package/dist/db/linkedRows/LinkController.js +9 -8
  15. package/dist/ddApm.js +11 -0
  16. package/dist/elasticApm.js +14 -0
  17. package/dist/integrations/base/sql.js +10 -3
  18. package/dist/package.json +9 -6
  19. package/dist/sdk/app/backups/exports.js +8 -2
  20. package/dist/sdk/app/datasources/datasources.js +3 -0
  21. package/dist/tests/utilities/TestConfiguration.js +626 -0
  22. package/dist/tests/utilities/controllers.js +40 -0
  23. package/dist/tests/utilities/structures.js +234 -0
  24. package/dist/tsconfig.build.tsbuildinfo +1 -1
  25. package/dist/utilities/retry.js +30 -0
  26. package/jest-testcontainers-config.js +8 -0
  27. package/jest.config.ts +28 -11
  28. package/package.json +10 -7
  29. package/scripts/load/create-many-apps.js +24 -0
  30. package/scripts/load/create-many-rows.js +30 -0
  31. package/scripts/load/utils.js +66 -0
  32. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  33. package/src/api/controllers/query/index.ts +2 -0
  34. package/src/api/controllers/row/ExternalRequest.ts +6 -2
  35. package/src/api/controllers/row/external.ts +13 -1
  36. package/src/api/controllers/table/external.ts +3 -2
  37. package/src/api/routes/public/applications.ts +0 -1
  38. package/src/api/routes/public/tests/compare.spec.js +1 -1
  39. package/src/api/routes/public/tests/users.spec.js +1 -1
  40. package/src/api/routes/public/tests/utils.ts +25 -8
  41. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  42. package/src/api/routes/tests/analytics.spec.js +4 -1
  43. package/src/api/routes/tests/apikeys.spec.js +1 -1
  44. package/src/api/routes/tests/application.spec.ts +20 -6
  45. package/src/api/routes/tests/auth.spec.js +2 -2
  46. package/src/api/routes/tests/automation.spec.js +6 -2
  47. package/src/api/routes/tests/backup.spec.ts +4 -13
  48. package/src/api/routes/tests/{cloud.spec.ts → cloud.seq.spec.ts} +11 -15
  49. package/src/api/routes/tests/component.spec.js +1 -1
  50. package/src/api/routes/tests/datasource.spec.ts +20 -3
  51. package/src/api/routes/tests/dev.spec.js +1 -1
  52. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  53. package/src/api/routes/tests/integration.spec.js +1 -1
  54. package/src/api/routes/tests/layout.spec.js +1 -1
  55. package/src/api/routes/tests/metadata.spec.js +1 -1
  56. package/src/api/routes/tests/misc.spec.js +1 -1
  57. package/src/api/routes/tests/permissions.spec.js +4 -1
  58. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  59. package/src/api/routes/tests/role.spec.js +6 -1
  60. package/src/api/routes/tests/routing.spec.js +1 -1
  61. package/src/api/routes/tests/row.spec.js +11 -3
  62. package/src/api/routes/tests/screen.spec.js +1 -1
  63. package/src/api/routes/tests/static.spec.js +2 -1
  64. package/src/api/routes/tests/table.spec.js +1 -1
  65. package/src/api/routes/tests/templates.spec.js +1 -1
  66. package/src/api/routes/tests/user.spec.js +12 -12
  67. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -2
  68. package/src/api/routes/tests/utilities/index.ts +5 -3
  69. package/src/api/routes/tests/view.spec.js +4 -1
  70. package/src/api/routes/tests/webhook.spec.js +11 -2
  71. package/src/app.ts +10 -1
  72. package/src/automations/tests/automation.spec.js +4 -4
  73. package/src/automations/tests/bash.spec.js +1 -1
  74. package/src/automations/tests/discord.spec.js +1 -1
  75. package/src/automations/tests/executeQuery.spec.js +2 -3
  76. package/src/automations/tests/executeScript.spec.js +1 -1
  77. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  78. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  79. package/src/automations/tests/serverLog.spec.js +1 -1
  80. package/src/automations/tests/updateRow.spec.js +1 -1
  81. package/src/automations/tests/zapier.spec.js +1 -1
  82. package/src/constants/index.ts +1 -23
  83. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  84. package/src/db/linkedRows/LinkController.ts +2 -1
  85. package/src/db/tests/linkController.spec.js +4 -1
  86. package/src/db/tests/linkTests.spec.js +1 -1
  87. package/src/ddApm.ts +7 -0
  88. package/src/elasticApm.ts +10 -0
  89. package/src/integration-test/postgres.spec.ts +752 -0
  90. package/src/integrations/base/sql.ts +15 -5
  91. package/src/integrations/oracle.ts +1 -1
  92. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  93. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  94. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +1 -1
  95. package/src/migrations/tests/index.spec.ts +13 -20
  96. package/src/sdk/app/backups/exports.ts +8 -2
  97. package/src/sdk/app/datasources/datasources.ts +3 -0
  98. package/src/tests/jestEnv.ts +2 -6
  99. package/src/tests/jestSetup.ts +8 -7
  100. package/src/tests/utilities/TestConfiguration.ts +126 -50
  101. package/src/tests/utilities/structures.ts +16 -2
  102. package/src/utilities/retry.ts +18 -0
  103. package/coverage/clover.xml +0 -11755
  104. package/coverage/coverage-final.json +0 -284
  105. package/coverage/lcov-report/base.css +0 -224
  106. package/coverage/lcov-report/block-navigation.js +0 -87
  107. package/coverage/lcov-report/favicon.png +0 -0
  108. package/coverage/lcov-report/index.html +0 -1031
  109. package/coverage/lcov-report/prettify.css +0 -1
  110. package/coverage/lcov-report/prettify.js +0 -2
  111. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  112. package/coverage/lcov-report/sorter.js +0 -196
  113. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
  114. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
  115. package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
  116. package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
  117. package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
  118. package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
  119. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
  120. package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
  121. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
  122. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
  123. package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
  124. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
  125. package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
  126. package/coverage/lcov-report/src/api/controllers/index.html +0 -431
  127. package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
  128. package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
  129. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
  130. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
  131. package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
  132. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
  133. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
  134. package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
  135. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
  136. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
  137. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
  138. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
  139. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
  140. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
  141. package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
  142. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
  143. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
  144. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
  145. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
  146. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
  147. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
  148. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
  149. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
  150. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
  151. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
  152. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
  153. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
  154. package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
  155. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
  156. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
  157. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
  158. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
  159. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
  160. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
  161. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
  162. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
  163. package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
  164. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
  165. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
  166. package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
  167. package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
  168. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
  169. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
  170. package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
  171. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
  172. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
  173. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
  174. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -577
  175. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
  176. package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
  177. package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
  178. package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
  179. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
  180. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
  181. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
  182. package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
  183. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
  184. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
  185. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
  186. package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
  187. package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
  188. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
  189. package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
  190. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
  191. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
  192. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
  193. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
  194. package/coverage/lcov-report/src/api/index.html +0 -116
  195. package/coverage/lcov-report/src/api/index.ts.html +0 -352
  196. package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
  197. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
  198. package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
  199. package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
  200. package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
  201. package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
  202. package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
  203. package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
  204. package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
  205. package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
  206. package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
  207. package/coverage/lcov-report/src/api/routes/index.html +0 -551
  208. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
  209. package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
  210. package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
  211. package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
  212. package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
  213. package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
  214. package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
  215. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
  216. package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
  217. package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
  218. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
  219. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
  220. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
  221. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
  222. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
  223. package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
  224. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
  225. package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
  226. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
  227. package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
  228. package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
  229. package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
  230. package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
  231. package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
  232. package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
  233. package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
  234. package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
  235. package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
  236. package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
  237. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
  238. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
  239. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
  240. package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
  241. package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
  242. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
  243. package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
  244. package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
  245. package/coverage/lcov-report/src/app.ts.html +0 -424
  246. package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
  247. package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
  248. package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
  249. package/coverage/lcov-report/src/automations/index.html +0 -191
  250. package/coverage/lcov-report/src/automations/index.ts.html +0 -163
  251. package/coverage/lcov-report/src/automations/logging/index.html +0 -116
  252. package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
  253. package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
  254. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
  255. package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
  256. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
  257. package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -349
  258. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
  259. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
  260. package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
  261. package/coverage/lcov-report/src/automations/steps/index.html +0 -371
  262. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -361
  263. package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
  264. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
  265. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
  266. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
  267. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
  268. package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -292
  269. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
  270. package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
  271. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -355
  272. package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
  273. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
  274. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
  275. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
  276. package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
  277. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
  278. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
  279. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
  280. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
  281. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
  282. package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
  283. package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
  284. package/coverage/lcov-report/src/constants/index.html +0 -146
  285. package/coverage/lcov-report/src/constants/index.ts.html +0 -697
  286. package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
  287. package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
  288. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
  289. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
  290. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
  291. package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
  292. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
  293. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
  294. package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
  295. package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
  296. package/coverage/lcov-report/src/db/index.html +0 -176
  297. package/coverage/lcov-report/src/db/index.ts.html +0 -133
  298. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
  299. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
  300. package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
  301. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
  302. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
  303. package/coverage/lcov-report/src/db/newid.ts.html +0 -100
  304. package/coverage/lcov-report/src/db/utils.ts.html +0 -913
  305. package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
  306. package/coverage/lcov-report/src/definitions/index.html +0 -116
  307. package/coverage/lcov-report/src/environment.ts.html +0 -472
  308. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
  309. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
  310. package/coverage/lcov-report/src/events/index.html +0 -161
  311. package/coverage/lcov-report/src/events/index.ts.html +0 -100
  312. package/coverage/lcov-report/src/events/utils.ts.html +0 -319
  313. package/coverage/lcov-report/src/index.html +0 -191
  314. package/coverage/lcov-report/src/index.ts.html +0 -133
  315. package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
  316. package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
  317. package/coverage/lcov-report/src/integrations/base/index.html +0 -161
  318. package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
  319. package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
  320. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
  321. package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
  322. package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
  323. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
  324. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
  325. package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
  326. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
  327. package/coverage/lcov-report/src/integrations/index.html +0 -371
  328. package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
  329. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
  330. package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
  331. package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
  332. package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
  333. package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
  334. package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
  335. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
  336. package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
  337. package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
  338. package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
  339. package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
  340. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
  341. package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
  342. package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
  343. package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
  344. package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
  345. package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
  346. package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
  347. package/coverage/lcov-report/src/middleware/index.html +0 -236
  348. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
  349. package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
  350. package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
  351. package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
  352. package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
  353. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
  354. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
  355. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
  356. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
  357. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
  358. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
  359. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
  360. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
  361. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
  362. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
  363. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
  364. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
  365. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
  366. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
  367. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
  368. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
  369. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
  370. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
  371. package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
  372. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
  373. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
  374. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
  375. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
  376. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
  377. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
  378. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
  379. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
  380. package/coverage/lcov-report/src/migrations/index.html +0 -116
  381. package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
  382. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
  383. package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
  384. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
  385. package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
  386. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
  387. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
  388. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
  389. package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
  390. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
  391. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
  392. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
  393. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
  394. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
  395. package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
  396. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
  397. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
  398. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
  399. package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
  400. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
  401. package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
  402. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
  403. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
  404. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
  405. package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
  406. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
  407. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
  408. package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
  409. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
  410. package/coverage/lcov-report/src/sdk/index.html +0 -116
  411. package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
  412. package/coverage/lcov-report/src/sdk/users/index.html +0 -131
  413. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
  414. package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
  415. package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
  416. package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
  417. package/coverage/lcov-report/src/startup.ts.html +0 -484
  418. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
  419. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
  420. package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
  421. package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
  422. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
  423. package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
  424. package/coverage/lcov-report/src/threads/index.html +0 -161
  425. package/coverage/lcov-report/src/threads/index.ts.html +0 -418
  426. package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
  427. package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
  428. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
  429. package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
  430. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
  431. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
  432. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
  433. package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
  434. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
  435. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
  436. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
  437. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
  438. package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
  439. package/coverage/lcov-report/src/utilities/index.html +0 -251
  440. package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
  441. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
  442. package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
  443. package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
  444. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
  445. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
  446. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
  447. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
  448. package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
  449. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
  450. package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
  451. package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
  452. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
  453. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
  454. package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
  455. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
  456. package/coverage/lcov-report/src/watch.ts.html +0 -196
  457. package/coverage/lcov-report/src/websocket.ts.html +0 -163
  458. package/coverage/lcov.info +0 -21750
@@ -1,2017 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/integrations/base/sql.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/integrations/base</a> sql.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">70.6% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>221/313</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">54.64% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>100/183</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">73.8% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>31/42</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">70.64% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>219/310</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input oninput="onInput()" type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line medium'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a>
506
- <a name='L441'></a><a href='#L441'>441</a>
507
- <a name='L442'></a><a href='#L442'>442</a>
508
- <a name='L443'></a><a href='#L443'>443</a>
509
- <a name='L444'></a><a href='#L444'>444</a>
510
- <a name='L445'></a><a href='#L445'>445</a>
511
- <a name='L446'></a><a href='#L446'>446</a>
512
- <a name='L447'></a><a href='#L447'>447</a>
513
- <a name='L448'></a><a href='#L448'>448</a>
514
- <a name='L449'></a><a href='#L449'>449</a>
515
- <a name='L450'></a><a href='#L450'>450</a>
516
- <a name='L451'></a><a href='#L451'>451</a>
517
- <a name='L452'></a><a href='#L452'>452</a>
518
- <a name='L453'></a><a href='#L453'>453</a>
519
- <a name='L454'></a><a href='#L454'>454</a>
520
- <a name='L455'></a><a href='#L455'>455</a>
521
- <a name='L456'></a><a href='#L456'>456</a>
522
- <a name='L457'></a><a href='#L457'>457</a>
523
- <a name='L458'></a><a href='#L458'>458</a>
524
- <a name='L459'></a><a href='#L459'>459</a>
525
- <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a>
527
- <a name='L462'></a><a href='#L462'>462</a>
528
- <a name='L463'></a><a href='#L463'>463</a>
529
- <a name='L464'></a><a href='#L464'>464</a>
530
- <a name='L465'></a><a href='#L465'>465</a>
531
- <a name='L466'></a><a href='#L466'>466</a>
532
- <a name='L467'></a><a href='#L467'>467</a>
533
- <a name='L468'></a><a href='#L468'>468</a>
534
- <a name='L469'></a><a href='#L469'>469</a>
535
- <a name='L470'></a><a href='#L470'>470</a>
536
- <a name='L471'></a><a href='#L471'>471</a>
537
- <a name='L472'></a><a href='#L472'>472</a>
538
- <a name='L473'></a><a href='#L473'>473</a>
539
- <a name='L474'></a><a href='#L474'>474</a>
540
- <a name='L475'></a><a href='#L475'>475</a>
541
- <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a>
550
- <a name='L485'></a><a href='#L485'>485</a>
551
- <a name='L486'></a><a href='#L486'>486</a>
552
- <a name='L487'></a><a href='#L487'>487</a>
553
- <a name='L488'></a><a href='#L488'>488</a>
554
- <a name='L489'></a><a href='#L489'>489</a>
555
- <a name='L490'></a><a href='#L490'>490</a>
556
- <a name='L491'></a><a href='#L491'>491</a>
557
- <a name='L492'></a><a href='#L492'>492</a>
558
- <a name='L493'></a><a href='#L493'>493</a>
559
- <a name='L494'></a><a href='#L494'>494</a>
560
- <a name='L495'></a><a href='#L495'>495</a>
561
- <a name='L496'></a><a href='#L496'>496</a>
562
- <a name='L497'></a><a href='#L497'>497</a>
563
- <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a>
565
- <a name='L500'></a><a href='#L500'>500</a>
566
- <a name='L501'></a><a href='#L501'>501</a>
567
- <a name='L502'></a><a href='#L502'>502</a>
568
- <a name='L503'></a><a href='#L503'>503</a>
569
- <a name='L504'></a><a href='#L504'>504</a>
570
- <a name='L505'></a><a href='#L505'>505</a>
571
- <a name='L506'></a><a href='#L506'>506</a>
572
- <a name='L507'></a><a href='#L507'>507</a>
573
- <a name='L508'></a><a href='#L508'>508</a>
574
- <a name='L509'></a><a href='#L509'>509</a>
575
- <a name='L510'></a><a href='#L510'>510</a>
576
- <a name='L511'></a><a href='#L511'>511</a>
577
- <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a>
579
- <a name='L514'></a><a href='#L514'>514</a>
580
- <a name='L515'></a><a href='#L515'>515</a>
581
- <a name='L516'></a><a href='#L516'>516</a>
582
- <a name='L517'></a><a href='#L517'>517</a>
583
- <a name='L518'></a><a href='#L518'>518</a>
584
- <a name='L519'></a><a href='#L519'>519</a>
585
- <a name='L520'></a><a href='#L520'>520</a>
586
- <a name='L521'></a><a href='#L521'>521</a>
587
- <a name='L522'></a><a href='#L522'>522</a>
588
- <a name='L523'></a><a href='#L523'>523</a>
589
- <a name='L524'></a><a href='#L524'>524</a>
590
- <a name='L525'></a><a href='#L525'>525</a>
591
- <a name='L526'></a><a href='#L526'>526</a>
592
- <a name='L527'></a><a href='#L527'>527</a>
593
- <a name='L528'></a><a href='#L528'>528</a>
594
- <a name='L529'></a><a href='#L529'>529</a>
595
- <a name='L530'></a><a href='#L530'>530</a>
596
- <a name='L531'></a><a href='#L531'>531</a>
597
- <a name='L532'></a><a href='#L532'>532</a>
598
- <a name='L533'></a><a href='#L533'>533</a>
599
- <a name='L534'></a><a href='#L534'>534</a>
600
- <a name='L535'></a><a href='#L535'>535</a>
601
- <a name='L536'></a><a href='#L536'>536</a>
602
- <a name='L537'></a><a href='#L537'>537</a>
603
- <a name='L538'></a><a href='#L538'>538</a>
604
- <a name='L539'></a><a href='#L539'>539</a>
605
- <a name='L540'></a><a href='#L540'>540</a>
606
- <a name='L541'></a><a href='#L541'>541</a>
607
- <a name='L542'></a><a href='#L542'>542</a>
608
- <a name='L543'></a><a href='#L543'>543</a>
609
- <a name='L544'></a><a href='#L544'>544</a>
610
- <a name='L545'></a><a href='#L545'>545</a>
611
- <a name='L546'></a><a href='#L546'>546</a>
612
- <a name='L547'></a><a href='#L547'>547</a>
613
- <a name='L548'></a><a href='#L548'>548</a>
614
- <a name='L549'></a><a href='#L549'>549</a>
615
- <a name='L550'></a><a href='#L550'>550</a>
616
- <a name='L551'></a><a href='#L551'>551</a>
617
- <a name='L552'></a><a href='#L552'>552</a>
618
- <a name='L553'></a><a href='#L553'>553</a>
619
- <a name='L554'></a><a href='#L554'>554</a>
620
- <a name='L555'></a><a href='#L555'>555</a>
621
- <a name='L556'></a><a href='#L556'>556</a>
622
- <a name='L557'></a><a href='#L557'>557</a>
623
- <a name='L558'></a><a href='#L558'>558</a>
624
- <a name='L559'></a><a href='#L559'>559</a>
625
- <a name='L560'></a><a href='#L560'>560</a>
626
- <a name='L561'></a><a href='#L561'>561</a>
627
- <a name='L562'></a><a href='#L562'>562</a>
628
- <a name='L563'></a><a href='#L563'>563</a>
629
- <a name='L564'></a><a href='#L564'>564</a>
630
- <a name='L565'></a><a href='#L565'>565</a>
631
- <a name='L566'></a><a href='#L566'>566</a>
632
- <a name='L567'></a><a href='#L567'>567</a>
633
- <a name='L568'></a><a href='#L568'>568</a>
634
- <a name='L569'></a><a href='#L569'>569</a>
635
- <a name='L570'></a><a href='#L570'>570</a>
636
- <a name='L571'></a><a href='#L571'>571</a>
637
- <a name='L572'></a><a href='#L572'>572</a>
638
- <a name='L573'></a><a href='#L573'>573</a>
639
- <a name='L574'></a><a href='#L574'>574</a>
640
- <a name='L575'></a><a href='#L575'>575</a>
641
- <a name='L576'></a><a href='#L576'>576</a>
642
- <a name='L577'></a><a href='#L577'>577</a>
643
- <a name='L578'></a><a href='#L578'>578</a>
644
- <a name='L579'></a><a href='#L579'>579</a>
645
- <a name='L580'></a><a href='#L580'>580</a>
646
- <a name='L581'></a><a href='#L581'>581</a>
647
- <a name='L582'></a><a href='#L582'>582</a>
648
- <a name='L583'></a><a href='#L583'>583</a>
649
- <a name='L584'></a><a href='#L584'>584</a>
650
- <a name='L585'></a><a href='#L585'>585</a>
651
- <a name='L586'></a><a href='#L586'>586</a>
652
- <a name='L587'></a><a href='#L587'>587</a>
653
- <a name='L588'></a><a href='#L588'>588</a>
654
- <a name='L589'></a><a href='#L589'>589</a>
655
- <a name='L590'></a><a href='#L590'>590</a>
656
- <a name='L591'></a><a href='#L591'>591</a>
657
- <a name='L592'></a><a href='#L592'>592</a>
658
- <a name='L593'></a><a href='#L593'>593</a>
659
- <a name='L594'></a><a href='#L594'>594</a>
660
- <a name='L595'></a><a href='#L595'>595</a>
661
- <a name='L596'></a><a href='#L596'>596</a>
662
- <a name='L597'></a><a href='#L597'>597</a>
663
- <a name='L598'></a><a href='#L598'>598</a>
664
- <a name='L599'></a><a href='#L599'>599</a>
665
- <a name='L600'></a><a href='#L600'>600</a>
666
- <a name='L601'></a><a href='#L601'>601</a>
667
- <a name='L602'></a><a href='#L602'>602</a>
668
- <a name='L603'></a><a href='#L603'>603</a>
669
- <a name='L604'></a><a href='#L604'>604</a>
670
- <a name='L605'></a><a href='#L605'>605</a>
671
- <a name='L606'></a><a href='#L606'>606</a>
672
- <a name='L607'></a><a href='#L607'>607</a>
673
- <a name='L608'></a><a href='#L608'>608</a>
674
- <a name='L609'></a><a href='#L609'>609</a>
675
- <a name='L610'></a><a href='#L610'>610</a>
676
- <a name='L611'></a><a href='#L611'>611</a>
677
- <a name='L612'></a><a href='#L612'>612</a>
678
- <a name='L613'></a><a href='#L613'>613</a>
679
- <a name='L614'></a><a href='#L614'>614</a>
680
- <a name='L615'></a><a href='#L615'>615</a>
681
- <a name='L616'></a><a href='#L616'>616</a>
682
- <a name='L617'></a><a href='#L617'>617</a>
683
- <a name='L618'></a><a href='#L618'>618</a>
684
- <a name='L619'></a><a href='#L619'>619</a>
685
- <a name='L620'></a><a href='#L620'>620</a>
686
- <a name='L621'></a><a href='#L621'>621</a>
687
- <a name='L622'></a><a href='#L622'>622</a>
688
- <a name='L623'></a><a href='#L623'>623</a>
689
- <a name='L624'></a><a href='#L624'>624</a>
690
- <a name='L625'></a><a href='#L625'>625</a>
691
- <a name='L626'></a><a href='#L626'>626</a>
692
- <a name='L627'></a><a href='#L627'>627</a>
693
- <a name='L628'></a><a href='#L628'>628</a>
694
- <a name='L629'></a><a href='#L629'>629</a>
695
- <a name='L630'></a><a href='#L630'>630</a>
696
- <a name='L631'></a><a href='#L631'>631</a>
697
- <a name='L632'></a><a href='#L632'>632</a>
698
- <a name='L633'></a><a href='#L633'>633</a>
699
- <a name='L634'></a><a href='#L634'>634</a>
700
- <a name='L635'></a><a href='#L635'>635</a>
701
- <a name='L636'></a><a href='#L636'>636</a>
702
- <a name='L637'></a><a href='#L637'>637</a>
703
- <a name='L638'></a><a href='#L638'>638</a>
704
- <a name='L639'></a><a href='#L639'>639</a>
705
- <a name='L640'></a><a href='#L640'>640</a>
706
- <a name='L641'></a><a href='#L641'>641</a>
707
- <a name='L642'></a><a href='#L642'>642</a>
708
- <a name='L643'></a><a href='#L643'>643</a>
709
- <a name='L644'></a><a href='#L644'>644</a>
710
- <a name='L645'></a><a href='#L645'>645</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">64x</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-neutral">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-yes">64x</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-yes">64x</span>
720
- <span class="cline-any cline-yes">64x</span>
721
- <span class="cline-any cline-yes">64x</span>
722
- <span class="cline-any cline-yes">64x</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">64x</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-yes">64x</span>
728
- <span class="cline-any cline-neutral">&nbsp;</span>
729
- <span class="cline-any cline-neutral">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-yes">64x</span>
732
- <span class="cline-any cline-yes">64x</span>
733
- <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">12x</span>
737
- <span class="cline-any cline-neutral">&nbsp;</span>
738
- <span class="cline-any cline-yes">1x</span>
739
- <span class="cline-any cline-yes">1x</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-yes">11x</span>
746
- <span class="cline-any cline-yes">11x</span>
747
- <span class="cline-any cline-yes">11x</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-yes">12x</span>
752
- <span class="cline-any cline-yes">24x</span>
753
- <span class="cline-any cline-yes">12x</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-yes">85x</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-yes">85x</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-yes">85x</span>
764
- <span class="cline-any cline-yes">34x</span>
765
- <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-yes">51x</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-yes">51x</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-yes">51x</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-neutral">&nbsp;</span>
775
- <span class="cline-any cline-neutral">&nbsp;</span>
776
- <span class="cline-any cline-yes">2x</span>
777
- <span class="cline-any cline-yes">3x</span>
778
- <span class="cline-any cline-neutral">&nbsp;</span>
779
- <span class="cline-any cline-yes">2x</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-neutral">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-yes">158x</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-yes">158x</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-yes">182x</span>
789
- <span class="cline-any cline-yes">100x</span>
790
- <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-yes">82x</span>
792
- <span class="cline-any cline-neutral">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-yes">182x</span>
795
- <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-yes">158x</span>
797
- <span class="cline-any cline-neutral">&nbsp;</span>
798
- <span class="cline-any cline-neutral">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-neutral">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-yes">5x</span>
804
- <span class="cline-any cline-yes">5x</span>
805
- <span class="cline-any cline-yes">5x</span>
806
- <span class="cline-any cline-yes">18x</span>
807
- <span class="cline-any cline-yes">18x</span>
808
- <span class="cline-any cline-yes">18x</span>
809
- <span class="cline-any cline-yes">18x</span>
810
- <span class="cline-any cline-neutral">&nbsp;</span>
811
- <span class="cline-any cline-neutral">&nbsp;</span>
812
- <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-yes">18x</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-neutral">&nbsp;</span>
829
- <span class="cline-any cline-yes">31x</span>
830
- <span class="cline-any cline-neutral">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-neutral">&nbsp;</span>
840
- <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-neutral">&nbsp;</span>
842
- <span class="cline-any cline-yes">44x</span>
843
- <span class="cline-any cline-yes">66x</span>
844
- <span class="cline-any cline-yes">66x</span>
845
- <span class="cline-any cline-yes">66x</span>
846
- <span class="cline-any cline-yes">33x</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-yes">66x</span>
849
- <span class="cline-any cline-yes">1x</span>
850
- <span class="cline-any cline-neutral">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-neutral">&nbsp;</span>
854
- <span class="cline-any cline-yes">58x</span>
855
- <span class="cline-any cline-no">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-no">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-neutral">&nbsp;</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-yes">58x</span>
869
- <span class="cline-any cline-yes">18x</span>
870
- <span class="cline-any cline-yes">18x</span>
871
- <span class="cline-any cline-yes">18x</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-yes">12x</span>
874
- <span class="cline-any cline-yes">16x</span>
875
- <span class="cline-any cline-yes">8x</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-yes">12x</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-yes">18x</span>
881
- <span class="cline-any cline-yes">6x</span>
882
- <span class="cline-any cline-yes">6x</span>
883
- <span class="cline-any cline-yes">6x</span>
884
- <span class="cline-any cline-yes">6x</span>
885
- <span class="cline-any cline-yes">6x</span>
886
- <span class="cline-any cline-yes">6x</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-yes">6x</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-yes">12x</span>
896
- <span class="cline-any cline-yes">6x</span>
897
- <span class="cline-any cline-yes">6x</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-yes">6x</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-yes">6x</span>
905
- <span class="cline-any cline-yes">6x</span>
906
- <span class="cline-any cline-yes">6x</span>
907
- <span class="cline-any cline-yes">6x</span>
908
- <span class="cline-any cline-yes">10x</span>
909
- <span class="cline-any cline-yes">5x</span>
910
- <span class="cline-any cline-neutral">&nbsp;</span>
911
- <span class="cline-any cline-yes">5x</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-yes">10x</span>
914
- <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-neutral">&nbsp;</span>
916
- <span class="cline-any cline-neutral">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-yes">6x</span>
919
- <span class="cline-any cline-neutral">&nbsp;</span>
920
- <span class="cline-any cline-neutral">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-yes">58x</span>
924
- <span class="cline-any cline-no">&nbsp;</span>
925
- <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-yes">58x</span>
927
- <span class="cline-any cline-neutral">&nbsp;</span>
928
- <span class="cline-any cline-yes">58x</span>
929
- <span class="cline-any cline-yes">58x</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-neutral">&nbsp;</span>
934
- <span class="cline-any cline-neutral">&nbsp;</span>
935
- <span class="cline-any cline-yes">58x</span>
936
- <span class="cline-any cline-yes">8x</span>
937
- <span class="cline-any cline-yes">4x</span>
938
- <span class="cline-any cline-neutral">&nbsp;</span>
939
- <span class="cline-any cline-yes">4x</span>
940
- <span class="cline-any cline-yes">2x</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-yes">2x</span>
943
- <span class="cline-any cline-neutral">&nbsp;</span>
944
- <span class="cline-any cline-yes">2x</span>
945
- <span class="cline-any cline-neutral">&nbsp;</span>
946
- <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-neutral">&nbsp;</span>
948
- <span class="cline-any cline-neutral">&nbsp;</span>
949
- <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-yes">58x</span>
951
- <span class="cline-any cline-no">&nbsp;</span>
952
- <span class="cline-any cline-neutral">&nbsp;</span>
953
- <span class="cline-any cline-yes">58x</span>
954
- <span class="cline-any cline-yes">12x</span>
955
- <span class="cline-any cline-yes">6x</span>
956
- <span class="cline-any cline-yes">12x</span>
957
- <span class="cline-any cline-neutral">&nbsp;</span>
958
- <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-neutral">&nbsp;</span>
960
- <span class="cline-any cline-neutral">&nbsp;</span>
961
- <span class="cline-any cline-neutral">&nbsp;</span>
962
- <span class="cline-any cline-yes">6x</span>
963
- <span class="cline-any cline-yes">1x</span>
964
- <span class="cline-any cline-neutral">&nbsp;</span>
965
- <span class="cline-any cline-yes">6x</span>
966
- <span class="cline-any cline-yes">1x</span>
967
- <span class="cline-any cline-neutral">&nbsp;</span>
968
- <span class="cline-any cline-yes">6x</span>
969
- <span class="cline-any cline-neutral">&nbsp;</span>
970
- <span class="cline-any cline-yes">1x</span>
971
- <span class="cline-any cline-yes">1x</span>
972
- <span class="cline-any cline-yes">5x</span>
973
- <span class="cline-any cline-neutral">&nbsp;</span>
974
- <span class="cline-any cline-yes">3x</span>
975
- <span class="cline-any cline-yes">3x</span>
976
- <span class="cline-any cline-yes">2x</span>
977
- <span class="cline-any cline-neutral">&nbsp;</span>
978
- <span class="cline-any cline-yes">2x</span>
979
- <span class="cline-any cline-yes">2x</span>
980
- <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-neutral">&nbsp;</span>
982
- <span class="cline-any cline-neutral">&nbsp;</span>
983
- <span class="cline-any cline-yes">58x</span>
984
- <span class="cline-any cline-yes">6x</span>
985
- <span class="cline-any cline-yes">6x</span>
986
- <span class="cline-any cline-yes">6x</span>
987
- <span class="cline-any cline-neutral">&nbsp;</span>
988
- <span class="cline-any cline-neutral">&nbsp;</span>
989
- <span class="cline-any cline-yes">58x</span>
990
- <span class="cline-any cline-no">&nbsp;</span>
991
- <span class="cline-any cline-no">&nbsp;</span>
992
- <span class="cline-any cline-no">&nbsp;</span>
993
- <span class="cline-any cline-neutral">&nbsp;</span>
994
- <span class="cline-any cline-neutral">&nbsp;</span>
995
- <span class="cline-any cline-yes">58x</span>
996
- <span class="cline-any cline-no">&nbsp;</span>
997
- <span class="cline-any cline-no">&nbsp;</span>
998
- <span class="cline-any cline-no">&nbsp;</span>
999
- <span class="cline-any cline-neutral">&nbsp;</span>
1000
- <span class="cline-any cline-neutral">&nbsp;</span>
1001
- <span class="cline-any cline-yes">58x</span>
1002
- <span class="cline-any cline-no">&nbsp;</span>
1003
- <span class="cline-any cline-no">&nbsp;</span>
1004
- <span class="cline-any cline-no">&nbsp;</span>
1005
- <span class="cline-any cline-neutral">&nbsp;</span>
1006
- <span class="cline-any cline-neutral">&nbsp;</span>
1007
- <span class="cline-any cline-yes">58x</span>
1008
- <span class="cline-any cline-yes">6x</span>
1009
- <span class="cline-any cline-neutral">&nbsp;</span>
1010
- <span class="cline-any cline-yes">58x</span>
1011
- <span class="cline-any cline-yes">6x</span>
1012
- <span class="cline-any cline-neutral">&nbsp;</span>
1013
- <span class="cline-any cline-yes">58x</span>
1014
- <span class="cline-any cline-yes">6x</span>
1015
- <span class="cline-any cline-neutral">&nbsp;</span>
1016
- <span class="cline-any cline-yes">58x</span>
1017
- <span class="cline-any cline-neutral">&nbsp;</span>
1018
- <span class="cline-any cline-neutral">&nbsp;</span>
1019
- <span class="cline-any cline-neutral">&nbsp;</span>
1020
- <span class="cline-any cline-yes">51x</span>
1021
- <span class="cline-any cline-yes">51x</span>
1022
- <span class="cline-any cline-yes">51x</span>
1023
- <span class="cline-any cline-yes">49x</span>
1024
- <span class="cline-any cline-no">&nbsp;</span>
1025
- <span class="cline-any cline-no">&nbsp;</span>
1026
- <span class="cline-any cline-neutral">&nbsp;</span>
1027
- <span class="cline-any cline-yes">2x</span>
1028
- <span class="cline-any cline-neutral">&nbsp;</span>
1029
- <span class="cline-any cline-no">&nbsp;</span>
1030
- <span class="cline-any cline-neutral">&nbsp;</span>
1031
- <span class="cline-any cline-yes">51x</span>
1032
- <span class="cline-any cline-neutral">&nbsp;</span>
1033
- <span class="cline-any cline-neutral">&nbsp;</span>
1034
- <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-neutral">&nbsp;</span>
1036
- <span class="cline-any cline-neutral">&nbsp;</span>
1037
- <span class="cline-any cline-neutral">&nbsp;</span>
1038
- <span class="cline-any cline-neutral">&nbsp;</span>
1039
- <span class="cline-any cline-neutral">&nbsp;</span>
1040
- <span class="cline-any cline-yes">28x</span>
1041
- <span class="cline-any cline-yes">25x</span>
1042
- <span class="cline-any cline-neutral">&nbsp;</span>
1043
- <span class="cline-any cline-yes">3x</span>
1044
- <span class="cline-any cline-neutral">&nbsp;</span>
1045
- <span class="cline-any cline-yes">3x</span>
1046
- <span class="cline-any cline-yes">3x</span>
1047
- <span class="cline-any cline-neutral">&nbsp;</span>
1048
- <span class="cline-any cline-neutral">&nbsp;</span>
1049
- <span class="cline-any cline-neutral">&nbsp;</span>
1050
- <span class="cline-any cline-yes">3x</span>
1051
- <span class="cline-any cline-yes">1x</span>
1052
- <span class="cline-any cline-neutral">&nbsp;</span>
1053
- <span class="cline-any cline-yes">3x</span>
1054
- <span class="cline-any cline-yes">3x</span>
1055
- <span class="cline-any cline-no">&nbsp;</span>
1056
- <span class="cline-any cline-neutral">&nbsp;</span>
1057
- <span class="cline-any cline-yes">3x</span>
1058
- <span class="cline-any cline-neutral">&nbsp;</span>
1059
- <span class="cline-any cline-neutral">&nbsp;</span>
1060
- <span class="cline-any cline-yes">3x</span>
1061
- <span class="cline-any cline-yes">3x</span>
1062
- <span class="cline-any cline-yes">3x</span>
1063
- <span class="cline-any cline-yes">3x</span>
1064
- <span class="cline-any cline-neutral">&nbsp;</span>
1065
- <span class="cline-any cline-neutral">&nbsp;</span>
1066
- <span class="cline-any cline-yes">3x</span>
1067
- <span class="cline-any cline-neutral">&nbsp;</span>
1068
- <span class="cline-any cline-yes">2x</span>
1069
- <span class="cline-any cline-yes">2x</span>
1070
- <span class="cline-any cline-yes">2x</span>
1071
- <span class="cline-any cline-yes">2x</span>
1072
- <span class="cline-any cline-neutral">&nbsp;</span>
1073
- <span class="cline-any cline-yes">2x</span>
1074
- <span class="cline-any cline-neutral">&nbsp;</span>
1075
- <span class="cline-any cline-neutral">&nbsp;</span>
1076
- <span class="cline-any cline-neutral">&nbsp;</span>
1077
- <span class="cline-any cline-yes">1x</span>
1078
- <span class="cline-any cline-neutral">&nbsp;</span>
1079
- <span class="cline-any cline-neutral">&nbsp;</span>
1080
- <span class="cline-any cline-yes">1x</span>
1081
- <span class="cline-any cline-yes">1x</span>
1082
- <span class="cline-any cline-yes">1x</span>
1083
- <span class="cline-any cline-neutral">&nbsp;</span>
1084
- <span class="cline-any cline-yes">1x</span>
1085
- <span class="cline-any cline-neutral">&nbsp;</span>
1086
- <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-neutral">&nbsp;</span>
1088
- <span class="cline-any cline-neutral">&nbsp;</span>
1089
- <span class="cline-any cline-neutral">&nbsp;</span>
1090
- <span class="cline-any cline-neutral">&nbsp;</span>
1091
- <span class="cline-any cline-neutral">&nbsp;</span>
1092
- <span class="cline-any cline-yes">1x</span>
1093
- <span class="cline-any cline-yes">1x</span>
1094
- <span class="cline-any cline-yes">1x</span>
1095
- <span class="cline-any cline-neutral">&nbsp;</span>
1096
- <span class="cline-any cline-yes">1x</span>
1097
- <span class="cline-any cline-neutral">&nbsp;</span>
1098
- <span class="cline-any cline-neutral">&nbsp;</span>
1099
- <span class="cline-any cline-neutral">&nbsp;</span>
1100
- <span class="cline-any cline-neutral">&nbsp;</span>
1101
- <span class="cline-any cline-yes">3x</span>
1102
- <span class="cline-any cline-neutral">&nbsp;</span>
1103
- <span class="cline-any cline-neutral">&nbsp;</span>
1104
- <span class="cline-any cline-neutral">&nbsp;</span>
1105
- <span class="cline-any cline-yes">1x</span>
1106
- <span class="cline-any cline-yes">1x</span>
1107
- <span class="cline-any cline-yes">1x</span>
1108
- <span class="cline-any cline-no">&nbsp;</span>
1109
- <span class="cline-any cline-neutral">&nbsp;</span>
1110
- <span class="cline-any cline-yes">1x</span>
1111
- <span class="cline-any cline-neutral">&nbsp;</span>
1112
- <span class="cline-any cline-yes">1x</span>
1113
- <span class="cline-any cline-yes">2x</span>
1114
- <span class="cline-any cline-no">&nbsp;</span>
1115
- <span class="cline-any cline-neutral">&nbsp;</span>
1116
- <span class="cline-any cline-neutral">&nbsp;</span>
1117
- <span class="cline-any cline-neutral">&nbsp;</span>
1118
- <span class="cline-any cline-yes">1x</span>
1119
- <span class="cline-any cline-no">&nbsp;</span>
1120
- <span class="cline-any cline-neutral">&nbsp;</span>
1121
- <span class="cline-any cline-yes">1x</span>
1122
- <span class="cline-any cline-neutral">&nbsp;</span>
1123
- <span class="cline-any cline-neutral">&nbsp;</span>
1124
- <span class="cline-any cline-neutral">&nbsp;</span>
1125
- <span class="cline-any cline-neutral">&nbsp;</span>
1126
- <span class="cline-any cline-no">&nbsp;</span>
1127
- <span class="cline-any cline-no">&nbsp;</span>
1128
- <span class="cline-any cline-no">&nbsp;</span>
1129
- <span class="cline-any cline-no">&nbsp;</span>
1130
- <span class="cline-any cline-neutral">&nbsp;</span>
1131
- <span class="cline-any cline-no">&nbsp;</span>
1132
- <span class="cline-any cline-no">&nbsp;</span>
1133
- <span class="cline-any cline-neutral">&nbsp;</span>
1134
- <span class="cline-any cline-no">&nbsp;</span>
1135
- <span class="cline-any cline-no">&nbsp;</span>
1136
- <span class="cline-any cline-neutral">&nbsp;</span>
1137
- <span class="cline-any cline-neutral">&nbsp;</span>
1138
- <span class="cline-any cline-neutral">&nbsp;</span>
1139
- <span class="cline-any cline-yes">28x</span>
1140
- <span class="cline-any cline-yes">28x</span>
1141
- <span class="cline-any cline-neutral">&nbsp;</span>
1142
- <span class="cline-any cline-yes">28x</span>
1143
- <span class="cline-any cline-no">&nbsp;</span>
1144
- <span class="cline-any cline-neutral">&nbsp;</span>
1145
- <span class="cline-any cline-yes">28x</span>
1146
- <span class="cline-any cline-neutral">&nbsp;</span>
1147
- <span class="cline-any cline-yes">28x</span>
1148
- <span class="cline-any cline-neutral">&nbsp;</span>
1149
- <span class="cline-any cline-neutral">&nbsp;</span>
1150
- <span class="cline-any cline-yes">5x</span>
1151
- <span class="cline-any cline-neutral">&nbsp;</span>
1152
- <span class="cline-any cline-yes">28x</span>
1153
- <span class="cline-any cline-neutral">&nbsp;</span>
1154
- <span class="cline-any cline-yes">28x</span>
1155
- <span class="cline-any cline-yes">28x</span>
1156
- <span class="cline-any cline-neutral">&nbsp;</span>
1157
- <span class="cline-any cline-no">&nbsp;</span>
1158
- <span class="cline-any cline-no">&nbsp;</span>
1159
- <span class="cline-any cline-no">&nbsp;</span>
1160
- <span class="cline-any cline-no">&nbsp;</span>
1161
- <span class="cline-any cline-yes">28x</span>
1162
- <span class="cline-any cline-no">&nbsp;</span>
1163
- <span class="cline-any cline-neutral">&nbsp;</span>
1164
- <span class="cline-any cline-neutral">&nbsp;</span>
1165
- <span class="cline-any cline-yes">28x</span>
1166
- <span class="cline-any cline-yes">28x</span>
1167
- <span class="cline-any cline-yes">2x</span>
1168
- <span class="cline-any cline-neutral">&nbsp;</span>
1169
- <span class="cline-any cline-yes">28x</span>
1170
- <span class="cline-any cline-no">&nbsp;</span>
1171
- <span class="cline-any cline-neutral">&nbsp;</span>
1172
- <span class="cline-any cline-yes">28x</span>
1173
- <span class="cline-any cline-neutral">&nbsp;</span>
1174
- <span class="cline-any cline-yes">28x</span>
1175
- <span class="cline-any cline-neutral">&nbsp;</span>
1176
- <span class="cline-any cline-yes">28x</span>
1177
- <span class="cline-any cline-neutral">&nbsp;</span>
1178
- <span class="cline-any cline-neutral">&nbsp;</span>
1179
- <span class="cline-any cline-neutral">&nbsp;</span>
1180
- <span class="cline-any cline-neutral">&nbsp;</span>
1181
- <span class="cline-any cline-yes">28x</span>
1182
- <span class="cline-any cline-yes">23x</span>
1183
- <span class="cline-any cline-neutral">&nbsp;</span>
1184
- <span class="cline-any cline-neutral">&nbsp;</span>
1185
- <span class="cline-any cline-yes">28x</span>
1186
- <span class="cline-any cline-neutral">&nbsp;</span>
1187
- <span class="cline-any cline-neutral">&nbsp;</span>
1188
- <span class="cline-any cline-neutral">&nbsp;</span>
1189
- <span class="cline-any cline-neutral">&nbsp;</span>
1190
- <span class="cline-any cline-neutral">&nbsp;</span>
1191
- <span class="cline-any cline-yes">28x</span>
1192
- <span class="cline-any cline-neutral">&nbsp;</span>
1193
- <span class="cline-any cline-neutral">&nbsp;</span>
1194
- <span class="cline-any cline-neutral">&nbsp;</span>
1195
- <span class="cline-any cline-yes">1x</span>
1196
- <span class="cline-any cline-yes">1x</span>
1197
- <span class="cline-any cline-yes">1x</span>
1198
- <span class="cline-any cline-no">&nbsp;</span>
1199
- <span class="cline-any cline-neutral">&nbsp;</span>
1200
- <span class="cline-any cline-yes">1x</span>
1201
- <span class="cline-any cline-yes">1x</span>
1202
- <span class="cline-any cline-neutral">&nbsp;</span>
1203
- <span class="cline-any cline-yes">1x</span>
1204
- <span class="cline-any cline-no">&nbsp;</span>
1205
- <span class="cline-any cline-neutral">&nbsp;</span>
1206
- <span class="cline-any cline-yes">1x</span>
1207
- <span class="cline-any cline-neutral">&nbsp;</span>
1208
- <span class="cline-any cline-neutral">&nbsp;</span>
1209
- <span class="cline-any cline-neutral">&nbsp;</span>
1210
- <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-yes">1x</span>
1212
- <span class="cline-any cline-yes">1x</span>
1213
- <span class="cline-any cline-yes">1x</span>
1214
- <span class="cline-any cline-no">&nbsp;</span>
1215
- <span class="cline-any cline-neutral">&nbsp;</span>
1216
- <span class="cline-any cline-yes">1x</span>
1217
- <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-yes">1x</span>
1219
- <span class="cline-any cline-no">&nbsp;</span>
1220
- <span class="cline-any cline-neutral">&nbsp;</span>
1221
- <span class="cline-any cline-yes">1x</span>
1222
- <span class="cline-any cline-neutral">&nbsp;</span>
1223
- <span class="cline-any cline-neutral">&nbsp;</span>
1224
- <span class="cline-any cline-neutral">&nbsp;</span>
1225
- <span class="cline-any cline-neutral">&nbsp;</span>
1226
- <span class="cline-any cline-neutral">&nbsp;</span>
1227
- <span class="cline-any cline-neutral">&nbsp;</span>
1228
- <span class="cline-any cline-neutral">&nbsp;</span>
1229
- <span class="cline-any cline-neutral">&nbsp;</span>
1230
- <span class="cline-any cline-yes">75x</span>
1231
- <span class="cline-any cline-yes">75x</span>
1232
- <span class="cline-any cline-neutral">&nbsp;</span>
1233
- <span class="cline-any cline-neutral">&nbsp;</span>
1234
- <span class="cline-any cline-neutral">&nbsp;</span>
1235
- <span class="cline-any cline-neutral">&nbsp;</span>
1236
- <span class="cline-any cline-neutral">&nbsp;</span>
1237
- <span class="cline-any cline-neutral">&nbsp;</span>
1238
- <span class="cline-any cline-neutral">&nbsp;</span>
1239
- <span class="cline-any cline-neutral">&nbsp;</span>
1240
- <span class="cline-any cline-neutral">&nbsp;</span>
1241
- <span class="cline-any cline-yes">31x</span>
1242
- <span class="cline-any cline-yes">31x</span>
1243
- <span class="cline-any cline-neutral">&nbsp;</span>
1244
- <span class="cline-any cline-yes">31x</span>
1245
- <span class="cline-any cline-yes">31x</span>
1246
- <span class="cline-any cline-neutral">&nbsp;</span>
1247
- <span class="cline-any cline-yes">1x</span>
1248
- <span class="cline-any cline-yes">1x</span>
1249
- <span class="cline-any cline-neutral">&nbsp;</span>
1250
- <span class="cline-any cline-yes">28x</span>
1251
- <span class="cline-any cline-yes">28x</span>
1252
- <span class="cline-any cline-neutral">&nbsp;</span>
1253
- <span class="cline-any cline-yes">1x</span>
1254
- <span class="cline-any cline-yes">1x</span>
1255
- <span class="cline-any cline-neutral">&nbsp;</span>
1256
- <span class="cline-any cline-yes">1x</span>
1257
- <span class="cline-any cline-yes">1x</span>
1258
- <span class="cline-any cline-neutral">&nbsp;</span>
1259
- <span class="cline-any cline-no">&nbsp;</span>
1260
- <span class="cline-any cline-no">&nbsp;</span>
1261
- <span class="cline-any cline-neutral">&nbsp;</span>
1262
- <span class="cline-any cline-neutral">&nbsp;</span>
1263
- <span class="cline-any cline-neutral">&nbsp;</span>
1264
- <span class="cline-any cline-no">&nbsp;</span>
1265
- <span class="cline-any cline-neutral">&nbsp;</span>
1266
- <span class="cline-any cline-no">&nbsp;</span>
1267
- <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-neutral">&nbsp;</span>
1269
- <span class="cline-any cline-neutral">&nbsp;</span>
1270
- <span class="cline-any cline-yes">31x</span>
1271
- <span class="cline-any cline-neutral">&nbsp;</span>
1272
- <span class="cline-any cline-neutral">&nbsp;</span>
1273
- <span class="cline-any cline-neutral">&nbsp;</span>
1274
- <span class="cline-any cline-no">&nbsp;</span>
1275
- <span class="cline-any cline-no">&nbsp;</span>
1276
- <span class="cline-any cline-neutral">&nbsp;</span>
1277
- <span class="cline-any cline-no">&nbsp;</span>
1278
- <span class="cline-any cline-neutral">&nbsp;</span>
1279
- <span class="cline-any cline-neutral">&nbsp;</span>
1280
- <span class="cline-any cline-neutral">&nbsp;</span>
1281
- <span class="cline-any cline-neutral">&nbsp;</span>
1282
- <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-neutral">&nbsp;</span>
1284
- <span class="cline-any cline-neutral">&nbsp;</span>
1285
- <span class="cline-any cline-neutral">&nbsp;</span>
1286
- <span class="cline-any cline-neutral">&nbsp;</span>
1287
- <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-neutral">&nbsp;</span>
1289
- <span class="cline-any cline-neutral">&nbsp;</span>
1290
- <span class="cline-any cline-neutral">&nbsp;</span>
1291
- <span class="cline-any cline-no">&nbsp;</span>
1292
- <span class="cline-any cline-neutral">&nbsp;</span>
1293
- <span class="cline-any cline-neutral">&nbsp;</span>
1294
- <span class="cline-any cline-neutral">&nbsp;</span>
1295
- <span class="cline-any cline-neutral">&nbsp;</span>
1296
- <span class="cline-any cline-neutral">&nbsp;</span>
1297
- <span class="cline-any cline-no">&nbsp;</span>
1298
- <span class="cline-any cline-no">&nbsp;</span>
1299
- <span class="cline-any cline-neutral">&nbsp;</span>
1300
- <span class="cline-any cline-no">&nbsp;</span>
1301
- <span class="cline-any cline-no">&nbsp;</span>
1302
- <span class="cline-any cline-neutral">&nbsp;</span>
1303
- <span class="cline-any cline-neutral">&nbsp;</span>
1304
- <span class="cline-any cline-neutral">&nbsp;</span>
1305
- <span class="cline-any cline-neutral">&nbsp;</span>
1306
- <span class="cline-any cline-neutral">&nbsp;</span>
1307
- <span class="cline-any cline-neutral">&nbsp;</span>
1308
- <span class="cline-any cline-no">&nbsp;</span>
1309
- <span class="cline-any cline-neutral">&nbsp;</span>
1310
- <span class="cline-any cline-neutral">&nbsp;</span>
1311
- <span class="cline-any cline-neutral">&nbsp;</span>
1312
- <span class="cline-any cline-neutral">&nbsp;</span>
1313
- <span class="cline-any cline-neutral">&nbsp;</span>
1314
- <span class="cline-any cline-neutral">&nbsp;</span>
1315
- <span class="cline-any cline-no">&nbsp;</span>
1316
- <span class="cline-any cline-neutral">&nbsp;</span>
1317
- <span class="cline-any cline-no">&nbsp;</span>
1318
- <span class="cline-any cline-no">&nbsp;</span>
1319
- <span class="cline-any cline-no">&nbsp;</span>
1320
- <span class="cline-any cline-no">&nbsp;</span>
1321
- <span class="cline-any cline-no">&nbsp;</span>
1322
- <span class="cline-any cline-no">&nbsp;</span>
1323
- <span class="cline-any cline-no">&nbsp;</span>
1324
- <span class="cline-any cline-neutral">&nbsp;</span>
1325
- <span class="cline-any cline-no">&nbsp;</span>
1326
- <span class="cline-any cline-neutral">&nbsp;</span>
1327
- <span class="cline-any cline-neutral">&nbsp;</span>
1328
- <span class="cline-any cline-neutral">&nbsp;</span>
1329
- <span class="cline-any cline-no">&nbsp;</span>
1330
- <span class="cline-any cline-no">&nbsp;</span>
1331
- <span class="cline-any cline-neutral">&nbsp;</span>
1332
- <span class="cline-any cline-no">&nbsp;</span>
1333
- <span class="cline-any cline-no">&nbsp;</span>
1334
- <span class="cline-any cline-neutral">&nbsp;</span>
1335
- <span class="cline-any cline-no">&nbsp;</span>
1336
- <span class="cline-any cline-neutral">&nbsp;</span>
1337
- <span class="cline-any cline-no">&nbsp;</span>
1338
- <span class="cline-any cline-no">&nbsp;</span>
1339
- <span class="cline-any cline-no">&nbsp;</span>
1340
- <span class="cline-any cline-no">&nbsp;</span>
1341
- <span class="cline-any cline-neutral">&nbsp;</span>
1342
- <span class="cline-any cline-no">&nbsp;</span>
1343
- <span class="cline-any cline-neutral">&nbsp;</span>
1344
- <span class="cline-any cline-neutral">&nbsp;</span>
1345
- <span class="cline-any cline-neutral">&nbsp;</span>
1346
- <span class="cline-any cline-no">&nbsp;</span>
1347
- <span class="cline-any cline-no">&nbsp;</span>
1348
- <span class="cline-any cline-neutral">&nbsp;</span>
1349
- <span class="cline-any cline-no">&nbsp;</span>
1350
- <span class="cline-any cline-neutral">&nbsp;</span>
1351
- <span class="cline-any cline-neutral">&nbsp;</span>
1352
- <span class="cline-any cline-neutral">&nbsp;</span>
1353
- <span class="cline-any cline-yes">241x</span>
1354
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Knex, knex } from "knex"
1355
- import {
1356
- Operation,
1357
- QueryJson,
1358
- RelationshipsJson,
1359
- SearchFilters,
1360
- SortDirection,
1361
- } from "@budibase/types"
1362
- import { QueryOptions } from "../../definitions/datasource"
1363
- import { isIsoDateString, SqlClient } from "../utils"
1364
- import SqlTableQueryBuilder from "./sqlTable"
1365
- import environment from "../../environment"
1366
- import { removeKeyNumbering } from "./utils"
1367
- &nbsp;
1368
- const envLimit = environment.SQL_MAX_ROWS
1369
- ? <span class="branch-0 cbranch-no" title="branch not covered" >parseInt(environment.SQL_MAX_ROWS)</span>
1370
- : null
1371
- const BASE_LIMIT = envLimit || 5000
1372
- &nbsp;
1373
- type KnexQuery = Knex.QueryBuilder | Knex
1374
- // these are invalid dates sent by the client, need to convert them to a real max date
1375
- const MIN_ISO_DATE = "0000-00-00T00:00:00.000Z"
1376
- const MAX_ISO_DATE = "9999-00-00T00:00:00.000Z"
1377
- &nbsp;
1378
- function likeKey(client: string, key: string): string {
1379
- let start: string, end: string
1380
- switch (client) {
1381
- case SqlClient.MY_SQL:
1382
- start = end = "`"
1383
- break
1384
- <span class="branch-1 cbranch-no" title="branch not covered" > case SqlClient.ORACLE:</span>
1385
- <span class="branch-2 cbranch-no" title="branch not covered" > case SqlClient.POSTGRES:</span>
1386
- <span class="cstat-no" title="statement not covered" > start = end = '"'</span>
1387
- <span class="cstat-no" title="statement not covered" > break</span>
1388
- case SqlClient.MS_SQL:
1389
- start = "["
1390
- end = "]"
1391
- break
1392
- <span class="branch-4 cbranch-no" title="branch not covered" > default:</span>
1393
- <span class="cstat-no" title="statement not covered" > throw "Unknown client"</span>
1394
- }
1395
- const parts = key.split(".")
1396
- key = parts.map(part =&gt; `${start}${part}${end}`).join(".")
1397
- return key
1398
- }
1399
- &nbsp;
1400
- function parse(input: any) {
1401
- <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(input)) {
1402
- <span class="cstat-no" title="statement not covered" > return JSON.stringify(input)</span>
1403
- }
1404
- <span class="missing-if-branch" title="if path not taken" >I</span>if (input == undefined) {
1405
- <span class="cstat-no" title="statement not covered" > return null</span>
1406
- }
1407
- if (typeof input !== "string") {
1408
- return input
1409
- }
1410
- <span class="missing-if-branch" title="if path not taken" >I</span>if (input === MAX_ISO_DATE || input === MIN_ISO_DATE) {
1411
- <span class="cstat-no" title="statement not covered" > return null</span>
1412
- }
1413
- <span class="missing-if-branch" title="if path not taken" >I</span>if (isIsoDateString(input)) {
1414
- <span class="cstat-no" title="statement not covered" > return new Date(input)</span>
1415
- }
1416
- return input
1417
- }
1418
- &nbsp;
1419
- function parseBody(body: any) {
1420
- for (let [key, value] of Object.entries(body)) {
1421
- body[key] = parse(value)
1422
- }
1423
- return body
1424
- }
1425
- &nbsp;
1426
- function parseFilters(filters: SearchFilters | undefined): SearchFilters {
1427
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!filters) {
1428
- <span class="cstat-no" title="statement not covered" > return {}</span>
1429
- }
1430
- for (let [key, value] of Object.entries(filters)) {
1431
- let parsed
1432
- if (typeof value === "object") {
1433
- parsed = parseFilters(value)
1434
- } else {
1435
- parsed = parse(value)
1436
- }
1437
- // @ts-ignore
1438
- filters[key] = parsed
1439
- }
1440
- return filters
1441
- }
1442
- &nbsp;
1443
- function generateSelectStatement(
1444
- json: QueryJson,
1445
- knex: Knex
1446
- ): (string | Knex.Raw)[] {
1447
- const { resource, meta } = json
1448
- const schema = meta?.table?.schema
1449
- return resource!.fields.map(field =&gt; {
1450
- const fieldNames = field.split(/\./g)
1451
- const tableName = fieldNames[0]
1452
- const columnName = fieldNames[1]
1453
- <span class="missing-if-branch" title="if path not taken" >I</span>if (
1454
- columnName &amp;&amp;
1455
- schema?.[columnName] &amp;&amp;
1456
- <span class="branch-2 cbranch-no" title="branch not covered" > knex.client.config.client === SqlClient.POSTGRES</span>
1457
- ) {
1458
- const externalType = <span class="cstat-no" title="statement not covered" >schema[columnName].externalType</span>
1459
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (externalType?.includes("money")) {</span>
1460
- <span class="cstat-no" title="statement not covered" > return knex.raw(</span>
1461
- `"${tableName}"."${columnName}"::money::numeric as "${field}"`
1462
- )
1463
- }
1464
- }
1465
- return `${field} as ${field}`
1466
- })
1467
- }
1468
- &nbsp;
1469
- class InternalBuilder {
1470
- private readonly client: string
1471
- &nbsp;
1472
- constructor(client: string) {
1473
- this.client = client
1474
- }
1475
- &nbsp;
1476
- // right now we only do filters on the specific table being queried
1477
- addFilters(
1478
- query: KnexQuery,
1479
- filters: SearchFilters | undefined,
1480
- opts: { relationship?: boolean; tableName?: string }
1481
- ): KnexQuery {
1482
- function iterate(
1483
- structure: { [key: string]: any },
1484
- fn: (key: string, value: any) =&gt; void
1485
- ) {
1486
- for (let [key, value] of Object.entries(structure)) {
1487
- const updatedKey = removeKeyNumbering(key)
1488
- const isRelationshipField = updatedKey.includes(".")
1489
- if (!opts.relationship &amp;&amp; !isRelationshipField) {
1490
- fn(`${opts.tableName}.${updatedKey}`, value)
1491
- }
1492
- if (opts.relationship &amp;&amp; isRelationshipField) {
1493
- fn(updatedKey, value)
1494
- }
1495
- }
1496
- }
1497
- &nbsp;
1498
- const like = <span class="fstat-no" title="function not covered" >(k</span>ey: string, value: any) =&gt; {
1499
- const fnc = <span class="cstat-no" title="statement not covered" >allOr ? "orWhere" : "where"</span>
1500
- // postgres supports ilike, nothing else does
1501
- <span class="cstat-no" title="statement not covered" > if (this.client === SqlClient.POSTGRES) {</span>
1502
- <span class="cstat-no" title="statement not covered" > query = query[fnc](key, "ilike", `%${value}%`)</span>
1503
- } else {
1504
- const rawFnc = <span class="cstat-no" title="statement not covered" >`${fnc}Raw`</span>
1505
- // @ts-ignore
1506
- <span class="cstat-no" title="statement not covered" > query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [</span>
1507
- `%${value}%`,
1508
- ])
1509
- }
1510
- }
1511
- &nbsp;
1512
- const contains = (mode: object, any: boolean = false) =&gt; {
1513
- const fnc = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"orWhere" : "</span>where"
1514
- const rawFnc = `${fnc}Raw`
1515
- const not = mode === filters?.notContains ? "NOT " : ""
1516
- function stringifyArray(value: Array&lt;any&gt;, quoteStyle = '"'): string {
1517
- for (let i in value) {
1518
- if (typeof value[i] === "string") {
1519
- value[i] = `${quoteStyle}${value[i]}${quoteStyle}`
1520
- }
1521
- }
1522
- return `[${value.join(",")}]`
1523
- }
1524
- if (this.client === SqlClient.POSTGRES) {
1525
- iterate(mode, (key: string, value: Array&lt;any&gt;) =&gt; {
1526
- const wrap = any ? "" : "'"
1527
- const containsOp = any ? "\\?| array" : "@&gt;"
1528
- const fieldNames = key.split(/\./g)
1529
- const tableName = fieldNames[0]
1530
- const columnName = fieldNames[1]
1531
- // @ts-ignore
1532
- query = query[rawFnc](
1533
- `${not}"${tableName}"."${columnName}"::jsonb ${containsOp} ${wrap}${stringifyArray(
1534
- value,
1535
- any ? "'" : '"'
1536
- )}${wrap}`
1537
- )
1538
- })
1539
- } else if (this.client === SqlClient.MY_SQL) {
1540
- const jsonFnc = any ? "JSON_OVERLAPS" : "JSON_CONTAINS"
1541
- iterate(mode, (key: string, value: Array&lt;any&gt;) =&gt; {
1542
- // @ts-ignore
1543
- query = query[rawFnc](
1544
- `${not}${jsonFnc}(${key}, '${stringifyArray(value)}')`
1545
- )
1546
- })
1547
- } else {
1548
- const andOr = mode === filters?.containsAny ? " OR " : " AND "
1549
- iterate(mode, (key: string, value: Array&lt;any&gt;) =&gt; {
1550
- let statement = ""
1551
- for (let i in value) {
1552
- if (typeof value[i] === "string") {
1553
- value[i] = `%"${value[i]}"%`
1554
- } else {
1555
- value[i] = `%${value[i]}%`
1556
- }
1557
- statement +=
1558
- (statement ? andOr : "") +
1559
- `LOWER(${likeKey(this.client, key)}) LIKE ?`
1560
- }
1561
- // @ts-ignore
1562
- query = query[rawFnc](`${not}(${statement})`, value)
1563
- })
1564
- }
1565
- }
1566
- &nbsp;
1567
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!filters) {
1568
- <span class="cstat-no" title="statement not covered" > return query</span>
1569
- }
1570
- filters = parseFilters(filters)
1571
- // if all or specified in filters, then everything is an or
1572
- const allOr = filters.allOr
1573
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filters.oneOf) {
1574
- <span class="cstat-no" title="statement not covered" > iterate(filters.oneOf, <span class="fstat-no" title="function not covered" >(k</span>ey, array) =&gt; {</span>
1575
- const fnc = <span class="cstat-no" title="statement not covered" >allOr ? "orWhereIn" : "whereIn"</span>
1576
- <span class="cstat-no" title="statement not covered" > query = query[fnc](key, Array.isArray(array) ? array : [array])</span>
1577
- })
1578
- }
1579
- if (filters.string) {
1580
- iterate(filters.string, (key, value) =&gt; {
1581
- const fnc = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"orWhere" : "</span>where"
1582
- // postgres supports ilike, nothing else does
1583
- if (this.client === SqlClient.POSTGRES) {
1584
- query = query[fnc](key, "ilike", `${value}%`)
1585
- } else {
1586
- const rawFnc = `${fnc}Raw`
1587
- // @ts-ignore
1588
- query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
1589
- `${value}%`,
1590
- ])
1591
- }
1592
- })
1593
- }
1594
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filters.fuzzy) {
1595
- <span class="cstat-no" title="statement not covered" > iterate(filters.fuzzy, like)</span>
1596
- }
1597
- if (filters.range) {
1598
- iterate(filters.range, (key, value) =&gt; {
1599
- const isEmptyObject = (val: any) =&gt; {
1600
- return (
1601
- val &amp;&amp;
1602
- Object.keys(val).length === 0 &amp;&amp;
1603
- Object.getPrototypeOf(val) === Object.prototype
1604
- )
1605
- }
1606
- if (isEmptyObject(value.low)) {
1607
- value.low = ""
1608
- }
1609
- if (isEmptyObject(value.high)) {
1610
- value.high = ""
1611
- }
1612
- if (value.low &amp;&amp; value.high) {
1613
- // Use a between operator if we have 2 valid range values
1614
- const fnc = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"orWhereBetween" : "</span>whereBetween"
1615
- query = query[fnc](key, [value.low, value.high])
1616
- } else if (value.low) {
1617
- // Use just a single greater than operator if we only have a low
1618
- const fnc = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"orWhere" : "</span>where"
1619
- query = query[fnc](key, "&gt;", value.low)
1620
- } else if (value.high) {
1621
- // Use just a single less than operator if we only have a high
1622
- const fnc = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"orWhere" : "</span>where"
1623
- query = query[fnc](key, "&lt;", value.high)
1624
- }
1625
- })
1626
- }
1627
- if (filters.equal) {
1628
- iterate(filters.equal, (key, value) =&gt; {
1629
- const fnc = allOr ? "orWhere" : "where"
1630
- query = query[fnc]({ [key]: value })
1631
- })
1632
- }
1633
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filters.notEqual) {
1634
- <span class="cstat-no" title="statement not covered" > iterate(filters.notEqual, <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {</span>
1635
- const fnc = <span class="cstat-no" title="statement not covered" >allOr ? "orWhereNot" : "whereNot"</span>
1636
- <span class="cstat-no" title="statement not covered" > query = query[fnc]({ [key]: value })</span>
1637
- })
1638
- }
1639
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filters.empty) {
1640
- <span class="cstat-no" title="statement not covered" > iterate(filters.empty, <span class="fstat-no" title="function not covered" >key =&gt; {</span></span>
1641
- const fnc = <span class="cstat-no" title="statement not covered" >allOr ? "orWhereNull" : "whereNull"</span>
1642
- <span class="cstat-no" title="statement not covered" > query = query[fnc](key)</span>
1643
- })
1644
- }
1645
- <span class="missing-if-branch" title="if path not taken" >I</span>if (filters.notEmpty) {
1646
- <span class="cstat-no" title="statement not covered" > iterate(filters.notEmpty, <span class="fstat-no" title="function not covered" >key =&gt; {</span></span>
1647
- const fnc = <span class="cstat-no" title="statement not covered" >allOr ? "orWhereNotNull" : "whereNotNull"</span>
1648
- <span class="cstat-no" title="statement not covered" > query = query[fnc](key)</span>
1649
- })
1650
- }
1651
- if (filters.contains) {
1652
- contains(filters.contains)
1653
- }
1654
- if (filters.notContains) {
1655
- contains(filters.notContains)
1656
- }
1657
- if (filters.containsAny) {
1658
- contains(filters.containsAny, true)
1659
- }
1660
- return query
1661
- }
1662
- &nbsp;
1663
- addSorting(query: KnexQuery, json: QueryJson): KnexQuery {
1664
- let { sort, paginate } = json
1665
- const table = json.meta?.table
1666
- if (sort) {
1667
- for (let [key, value] of Object.entries(sort)) {
1668
- const direction = <span class="cstat-no" title="statement not covered" >value === SortDirection.ASCENDING ? "asc" : "desc"</span>
1669
- <span class="cstat-no" title="statement not covered" > query = query.orderBy(`${table?.name}.${key}`, direction)</span>
1670
- }
1671
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (this.client === SqlClient.MS_SQL &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >paginate?.limit) {</span>
1672
- // @ts-ignore
1673
- <span class="cstat-no" title="statement not covered" > query = query.orderBy(`${table?.name}.${table?.primary[0]}`)</span>
1674
- }
1675
- return query
1676
- }
1677
- &nbsp;
1678
- addRelationships(
1679
- query: KnexQuery,
1680
- fromTable: string,
1681
- relationships: RelationshipsJson[] | undefined,
1682
- schema: string | undefined
1683
- ): KnexQuery {
1684
- if (!relationships) {
1685
- return query
1686
- }
1687
- const tableSets: Record&lt;string, [any]&gt; = {}
1688
- // aggregate into table sets (all the same to tables)
1689
- for (let relationship of relationships) {
1690
- const keyObj: { toTable: string; throughTable: string | undefined } = {
1691
- toTable: relationship.tableName,
1692
- throughTable: undefined,
1693
- }
1694
- if (relationship.through) {
1695
- keyObj.throughTable = relationship.through
1696
- }
1697
- const key = JSON.stringify(keyObj)
1698
- <span class="missing-if-branch" title="if path not taken" >I</span>if (tableSets[key]) {
1699
- <span class="cstat-no" title="statement not covered" > tableSets[key].push(relationship)</span>
1700
- } else {
1701
- tableSets[key] = [relationship]
1702
- }
1703
- }
1704
- for (let [key, relationships] of Object.entries(tableSets)) {
1705
- const { toTable, throughTable } = JSON.parse(key)
1706
- const toTableWithSchema = schema ? `${schema}.${toTable}` : toTable
1707
- const throughTableWithSchema = schema
1708
- ? `${schema}.${throughTable}`
1709
- : throughTable
1710
- if (!throughTable) {
1711
- // @ts-ignore
1712
- query = query.leftJoin(toTableWithSchema, function () {
1713
- for (let relationship of relationships) {
1714
- const from = relationship.from,
1715
- to = relationship.to
1716
- // @ts-ignore
1717
- this.orOn(`${fromTable}.${from}`, "=", `${toTable}.${to}`)
1718
- }
1719
- })
1720
- } else {
1721
- query = query
1722
- // @ts-ignore
1723
- .leftJoin(throughTableWithSchema, function () {
1724
- for (let relationship of relationships) {
1725
- const fromPrimary = relationship.fromPrimary
1726
- const from = relationship.from
1727
- // @ts-ignore
1728
- this.orOn(
1729
- `${fromTable}.${fromPrimary}`,
1730
- "=",
1731
- `${throughTable}.${from}`
1732
- )
1733
- }
1734
- })
1735
- .leftJoin(toTableWithSchema, function () {
1736
- for (let relationship of relationships) {
1737
- const toPrimary = relationship.toPrimary
1738
- const to = relationship.to
1739
- // @ts-ignore
1740
- this.orOn(`${toTable}.${toPrimary}`, `${throughTable}.${to}`)
1741
- }
1742
- })
1743
- }
1744
- }
1745
- return query.limit(BASE_LIMIT)
1746
- }
1747
- &nbsp;
1748
- create(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
1749
- const { endpoint, body } = json
1750
- let query: KnexQuery = knex(endpoint.entityId)
1751
- <span class="missing-if-branch" title="if path not taken" >I</span>if (endpoint.schema) {
1752
- <span class="cstat-no" title="statement not covered" > query = query.withSchema(endpoint.schema)</span>
1753
- }
1754
- const parsedBody = parseBody(body)
1755
- // make sure no null values in body for creation
1756
- for (let [key, value] of Object.entries(parsedBody)) {
1757
- <span class="missing-if-branch" title="if path not taken" >I</span>if (value == null) {
1758
- <span class="cstat-no" title="statement not covered" > delete parsedBody[key]</span>
1759
- }
1760
- }
1761
- // mysql can't use returning
1762
- <span class="missing-if-branch" title="if path not taken" >I</span>if (opts.disableReturning) {
1763
- <span class="cstat-no" title="statement not covered" > return query.insert(parsedBody)</span>
1764
- } else {
1765
- return query.insert(parsedBody).returning("*")
1766
- }
1767
- }
1768
- &nbsp;
1769
- <span class="fstat-no" title="function not covered" > bulkCreate(k</span>nex: Knex, json: QueryJson): KnexQuery {
1770
- const { endpoint, body } = <span class="cstat-no" title="statement not covered" >json</span>
1771
- let query: KnexQuery = <span class="cstat-no" title="statement not covered" >knex(endpoint.entityId)</span>
1772
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (endpoint.schema) {</span>
1773
- <span class="cstat-no" title="statement not covered" > query = query.withSchema(endpoint.schema)</span>
1774
- }
1775
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(body)) {</span>
1776
- <span class="cstat-no" title="statement not covered" > return query</span>
1777
- }
1778
- const parsedBody = <span class="cstat-no" title="statement not covered" >body.map(<span class="fstat-no" title="function not covered" >row =&gt; <span class="cstat-no" title="statement not covered" >p</span>arseBody(row))</span></span>
1779
- <span class="cstat-no" title="statement not covered" > return query.insert(parsedBody)</span>
1780
- }
1781
- &nbsp;
1782
- read(knex: Knex, json: QueryJson, limit: number): KnexQuery {
1783
- let { endpoint, resource, filters, paginate, relationships } = json
1784
- const tableName = endpoint.entityId
1785
- // select all if not specified
1786
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!resource) {
1787
- <span class="cstat-no" title="statement not covered" > resource = { fields: [] }</span>
1788
- }
1789
- let selectStatement: string | (string | Knex.Raw)[] = "*"
1790
- // handle select
1791
- if (resource.fields &amp;&amp; resource.fields.length &gt; 0) {
1792
- // select the resources as the format "table.columnName" - this is what is provided
1793
- // by the resource builder further up
1794
- selectStatement = generateSelectStatement(json, knex)
1795
- }
1796
- let foundLimit = limit || <span class="branch-1 cbranch-no" title="branch not covered" >BASE_LIMIT</span>
1797
- // handle pagination
1798
- let foundOffset: number | null = null
1799
- <span class="missing-if-branch" title="if path not taken" >I</span>if (paginate &amp;&amp; paginate.page &amp;&amp; <span class="branch-2 cbranch-no" title="branch not covered" >paginate.limit)</span> {
1800
- // @ts-ignore
1801
- const page = <span class="cstat-no" title="statement not covered" >paginate.page &lt;= 1 ? 0 : paginate.page - 1</span>
1802
- const offset = <span class="cstat-no" title="statement not covered" >page * paginate.limit</span>
1803
- <span class="cstat-no" title="statement not covered" > foundLimit = paginate.limit</span>
1804
- <span class="cstat-no" title="statement not covered" > foundOffset = offset</span>
1805
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (paginate &amp;&amp; paginate.limit) {
1806
- <span class="cstat-no" title="statement not covered" > foundLimit = paginate.limit</span>
1807
- }
1808
- // start building the query
1809
- let query: KnexQuery = knex(tableName).limit(foundLimit)
1810
- if (endpoint.schema) {
1811
- query = query.withSchema(endpoint.schema)
1812
- }
1813
- <span class="missing-if-branch" title="if path not taken" >I</span>if (foundOffset) {
1814
- <span class="cstat-no" title="statement not covered" > query = query.offset(foundOffset)</span>
1815
- }
1816
- query = this.addFilters(query, filters, { tableName })
1817
- // add sorting to pre-query
1818
- query = this.addSorting(query, json)
1819
- // @ts-ignore
1820
- let preQuery: KnexQuery = knex({
1821
- // @ts-ignore
1822
- [tableName]: query,
1823
- }).select(selectStatement)
1824
- // have to add after as well (this breaks MS-SQL)
1825
- if (this.client !== SqlClient.MS_SQL) {
1826
- preQuery = this.addSorting(preQuery, json)
1827
- }
1828
- // handle joins
1829
- query = this.addRelationships(
1830
- preQuery,
1831
- tableName,
1832
- relationships,
1833
- endpoint.schema
1834
- )
1835
- return this.addFilters(query, filters, { relationship: true })
1836
- }
1837
- &nbsp;
1838
- update(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
1839
- const { endpoint, body, filters } = json
1840
- let query: KnexQuery = knex(endpoint.entityId)
1841
- <span class="missing-if-branch" title="if path not taken" >I</span>if (endpoint.schema) {
1842
- <span class="cstat-no" title="statement not covered" > query = query.withSchema(endpoint.schema)</span>
1843
- }
1844
- const parsedBody = parseBody(body)
1845
- query = this.addFilters(query, filters, { tableName: endpoint.entityId })
1846
- // mysql can't use returning
1847
- <span class="missing-if-branch" title="if path not taken" >I</span>if (opts.disableReturning) {
1848
- <span class="cstat-no" title="statement not covered" > return query.update(parsedBody)</span>
1849
- } else {
1850
- return query.update(parsedBody).returning("*")
1851
- }
1852
- }
1853
- &nbsp;
1854
- delete(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
1855
- const { endpoint, filters } = json
1856
- let query: KnexQuery = knex(endpoint.entityId)
1857
- <span class="missing-if-branch" title="if path not taken" >I</span>if (endpoint.schema) {
1858
- <span class="cstat-no" title="statement not covered" > query = query.withSchema(endpoint.schema)</span>
1859
- }
1860
- query = this.addFilters(query, filters, { tableName: endpoint.entityId })
1861
- // mysql can't use returning
1862
- <span class="missing-if-branch" title="if path not taken" >I</span>if (opts.disableReturning) {
1863
- <span class="cstat-no" title="statement not covered" > return query.delete()</span>
1864
- } else {
1865
- return query.delete().returning("*")
1866
- }
1867
- }
1868
- }
1869
- &nbsp;
1870
- class SqlQueryBuilder extends SqlTableQueryBuilder {
1871
- private readonly limit: number
1872
- // pass through client to get flavour of SQL
1873
- constructor(client: string, limit: number = BASE_LIMIT) {
1874
- super(client)
1875
- this.limit = limit
1876
- }
1877
- &nbsp;
1878
- /**
1879
- * @param json The JSON query DSL which is to be converted to SQL.
1880
- * @param opts extra options which are to be passed into the query builder, e.g. disableReturning
1881
- * which for the sake of mySQL stops adding the returning statement to inserts, updates and deletes.
1882
- * @return {{ sql: string, bindings: object }} the query ready to be passed to the driver.
1883
- */
1884
- _query(json: QueryJson, opts: QueryOptions = {}) {
1885
- const sqlClient = this.getSqlClient()
1886
- const client = knex({ client: sqlClient })
1887
- let query
1888
- const builder = new InternalBuilder(sqlClient)
1889
- switch (this._operation(json)) {
1890
- case Operation.CREATE:
1891
- query = builder.create(client, json, opts)
1892
- break
1893
- case Operation.READ:
1894
- query = builder.read(client, json, this.limit)
1895
- break
1896
- case Operation.UPDATE:
1897
- query = builder.update(client, json, opts)
1898
- break
1899
- case Operation.DELETE:
1900
- query = builder.delete(client, json, opts)
1901
- break
1902
- <span class="branch-4 cbranch-no" title="branch not covered" > case Operation.BULK_CREATE:</span>
1903
- <span class="cstat-no" title="statement not covered" > query = builder.bulkCreate(client, json)</span>
1904
- <span class="cstat-no" title="statement not covered" > break</span>
1905
- <span class="branch-5 cbranch-no" title="branch not covered" > case Operation.CREATE_TABLE:</span>
1906
- <span class="branch-6 cbranch-no" title="branch not covered" > case Operation.UPDATE_TABLE:</span>
1907
- <span class="branch-7 cbranch-no" title="branch not covered" > case Operation.DELETE_TABLE:</span>
1908
- <span class="cstat-no" title="statement not covered" > return this._tableQuery(json)</span>
1909
- <span class="branch-8 cbranch-no" title="branch not covered" > default:</span>
1910
- <span class="cstat-no" title="statement not covered" > throw `Operation type is not supported by SQL query builder`</span>
1911
- }
1912
- &nbsp;
1913
- // @ts-ignore
1914
- return query.toSQL().toNative()
1915
- }
1916
- &nbsp;
1917
- <span class="fstat-no" title="function not covered" > async g</span>etReturningRow(queryFn: Function, json: QueryJson) {
1918
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!json.extra || !json.extra.idFilter) {</span>
1919
- <span class="cstat-no" title="statement not covered" > return {}</span>
1920
- }
1921
- const input = <span class="cstat-no" title="statement not covered" >this._query({</span>
1922
- endpoint: {
1923
- ...json.endpoint,
1924
- operation: Operation.READ,
1925
- },
1926
- resource: {
1927
- fields: [],
1928
- },
1929
- filters: json.extra.idFilter,
1930
- paginate: {
1931
- limit: 1,
1932
- },
1933
- meta: json.meta,
1934
- })
1935
- <span class="cstat-no" title="statement not covered" > return queryFn(input, Operation.READ)</span>
1936
- }
1937
- &nbsp;
1938
- // when creating if an ID has been inserted need to make sure
1939
- // the id filter is enriched with it before trying to retrieve the row
1940
- <span class="fstat-no" title="function not covered" > checkLookupKeys(i</span>d: any, json: QueryJson) {
1941
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!id || !json.meta?.table || !json.meta.table.primary) {</span>
1942
- <span class="cstat-no" title="statement not covered" > return json</span>
1943
- }
1944
- const primaryKey = <span class="cstat-no" title="statement not covered" >json.meta.table.primary?.[0]</span>
1945
- <span class="cstat-no" title="statement not covered" > json.extra = {</span>
1946
- idFilter: {
1947
- equal: {
1948
- [primaryKey]: id,
1949
- },
1950
- },
1951
- }
1952
- <span class="cstat-no" title="statement not covered" > return json</span>
1953
- }
1954
- &nbsp;
1955
- // this function recreates the returning functionality of postgres
1956
- <span class="fstat-no" title="function not covered" > async q</span>ueryWithReturning(
1957
- json: QueryJson,
1958
- queryFn: Function,
1959
- processFn: Function = <span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >(r</span>esult: any) =&gt; <span class="cstat-no" title="statement not covered" >result</span></span>
1960
- ) {
1961
- const sqlClient = <span class="cstat-no" title="statement not covered" >this.getSqlClient()</span>
1962
- const operation = <span class="cstat-no" title="statement not covered" >this._operation(json)</span>
1963
- const input = <span class="cstat-no" title="statement not covered" >this._query(json, { disableReturning: true })</span>
1964
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(input)) {</span>
1965
- const responses = <span class="cstat-no" title="statement not covered" >[]</span>
1966
- <span class="cstat-no" title="statement not covered" > for (let query of input) {</span>
1967
- <span class="cstat-no" title="statement not covered" > responses.push(await queryFn(query, operation))</span>
1968
- }
1969
- <span class="cstat-no" title="statement not covered" > return responses</span>
1970
- }
1971
- let row
1972
- // need to manage returning, a feature mySQL can't do
1973
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (operation === Operation.DELETE) {</span>
1974
- <span class="cstat-no" title="statement not covered" > row = processFn(await this.getReturningRow(queryFn, json))</span>
1975
- }
1976
- const response = <span class="cstat-no" title="statement not covered" >await queryFn(input, operation)</span>
1977
- const results = <span class="cstat-no" title="statement not covered" >processFn(response)</span>
1978
- // same as delete, manage returning
1979
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (operation === Operation.CREATE || operation === Operation.UPDATE) {</span>
1980
- let id
1981
- <span class="cstat-no" title="statement not covered" > if (sqlClient === SqlClient.MS_SQL) {</span>
1982
- <span class="cstat-no" title="statement not covered" > id = results?.[0].id</span>
1983
- } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>if (sqlClient === SqlClient.MY_SQL) {</span>
1984
- <span class="cstat-no" title="statement not covered" > id = results?.insertId</span>
1985
- }
1986
- <span class="cstat-no" title="statement not covered" > row = processFn(</span>
1987
- await this.getReturningRow(queryFn, this.checkLookupKeys(id, json))
1988
- )
1989
- }
1990
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (operation !== Operation.READ) {</span>
1991
- <span class="cstat-no" title="statement not covered" > return row</span>
1992
- }
1993
- <span class="cstat-no" title="statement not covered" > return results.length ? results : [{ [operation.toLowerCase()]: true }]</span>
1994
- }
1995
- }
1996
- &nbsp;
1997
- export default SqlQueryBuilder
1998
- &nbsp;</pre></td></tr></table></pre>
1999
-
2000
- <div class='push'></div><!-- for sticky footer -->
2001
- </div><!-- /wrapper -->
2002
- <div class='footer quiet pad2 space-top1 center small'>
2003
- Code coverage generated by
2004
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2005
- at Wed Feb 15 2023 12:56:20 GMT+0000 (Coordinated Universal Time)
2006
- </div>
2007
- <script src="../../../prettify.js"></script>
2008
- <script>
2009
- window.onload = function () {
2010
- prettyPrint();
2011
- };
2012
- </script>
2013
- <script src="../../../sorter.js"></script>
2014
- <script src="../../../block-navigation.js"></script>
2015
- </body>
2016
- </html>
2017
-