@budibase/server 2.3.17 → 2.3.18-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/__mocks__/aws-sdk.ts +1 -1
  2. package/builder/assets/{index.06e34d35.js → index.7089444f.js} +361 -361
  3. package/builder/assets/{index.4488f38d.css → index.7e76c039.css} +1 -1
  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/row/staticFormula.js +5 -1
  9. package/dist/api/controllers/table/external.js +8 -8
  10. package/dist/api/index.js +1 -21
  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 +12 -8
  19. package/dist/sdk/app/backups/exports.js +8 -2
  20. package/dist/sdk/app/datasources/datasources.js +3 -0
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/dist/utilities/redis.js +2 -0
  23. package/dist/utilities/retry.js +30 -0
  24. package/jest-testcontainers-config.js +8 -0
  25. package/jest.config.ts +34 -22
  26. package/package.json +13 -9
  27. package/scripts/load/create-many-apps.js +24 -0
  28. package/scripts/load/create-many-rows.js +30 -0
  29. package/scripts/load/utils.js +66 -0
  30. package/specs/openapi.json +6 -6
  31. package/specs/openapi.yaml +3 -3
  32. package/specs/resources/query.js +1 -1
  33. package/specs/resources/table.js +1 -1
  34. package/src/api/controllers/query/import/tests/index.spec.js +1 -1
  35. package/src/api/controllers/query/index.ts +2 -0
  36. package/src/api/controllers/row/ExternalRequest.ts +6 -2
  37. package/src/api/controllers/row/external.ts +13 -1
  38. package/src/api/controllers/row/staticFormula.ts +7 -1
  39. package/src/api/controllers/table/external.ts +3 -2
  40. package/src/api/index.ts +3 -22
  41. package/src/api/routes/public/applications.ts +0 -1
  42. package/src/api/routes/public/tests/compare.spec.js +1 -1
  43. package/src/api/routes/public/tests/users.spec.js +1 -1
  44. package/src/api/routes/public/tests/utils.ts +25 -8
  45. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +1 -1
  46. package/src/api/routes/tests/analytics.spec.js +4 -1
  47. package/src/api/routes/tests/apikeys.spec.js +1 -1
  48. package/src/api/routes/tests/application.spec.ts +20 -6
  49. package/src/api/routes/tests/auth.spec.js +2 -2
  50. package/src/api/routes/tests/automation.spec.js +6 -2
  51. package/src/api/routes/tests/backup.spec.ts +4 -14
  52. package/src/api/routes/tests/{cloud.spec.ts → cloud.seq.spec.ts} +11 -15
  53. package/src/api/routes/tests/component.spec.js +1 -1
  54. package/src/api/routes/tests/datasource.spec.ts +20 -3
  55. package/src/api/routes/tests/dev.spec.js +1 -1
  56. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  57. package/src/api/routes/tests/integration.spec.js +1 -1
  58. package/src/api/routes/tests/layout.spec.js +1 -1
  59. package/src/api/routes/tests/metadata.spec.js +1 -1
  60. package/src/api/routes/tests/misc.spec.js +1 -1
  61. package/src/api/routes/tests/permissions.spec.js +4 -1
  62. package/src/api/routes/tests/{query.spec.js → query.seq.spec.js} +22 -1
  63. package/src/api/routes/tests/role.spec.js +6 -1
  64. package/src/api/routes/tests/routing.spec.js +1 -1
  65. package/src/api/routes/tests/row.spec.js +11 -3
  66. package/src/api/routes/tests/screen.spec.js +1 -1
  67. package/src/api/routes/tests/static.spec.js +2 -13
  68. package/src/api/routes/tests/table.spec.js +1 -1
  69. package/src/api/routes/tests/templates.spec.js +1 -1
  70. package/src/api/routes/tests/user.spec.js +11 -12
  71. package/src/api/routes/tests/utilities/TestFunctions.ts +25 -2
  72. package/src/api/routes/tests/utilities/index.ts +5 -3
  73. package/src/api/routes/tests/view.spec.js +4 -1
  74. package/src/api/routes/tests/webhook.spec.js +11 -2
  75. package/src/app.ts +10 -1
  76. package/src/automations/tests/automation.spec.js +4 -4
  77. package/src/automations/tests/bash.spec.js +1 -1
  78. package/src/automations/tests/discord.spec.js +1 -1
  79. package/src/automations/tests/executeQuery.spec.js +2 -3
  80. package/src/automations/tests/executeScript.spec.js +1 -1
  81. package/src/automations/tests/outgoingWebhook.spec.js +1 -1
  82. package/src/automations/tests/sendSmtpEmail.spec.js +1 -1
  83. package/src/automations/tests/serverLog.spec.js +1 -1
  84. package/src/automations/tests/updateRow.spec.js +1 -1
  85. package/src/automations/tests/zapier.spec.js +1 -1
  86. package/src/constants/index.ts +1 -23
  87. package/src/db/defaultData/datasource_bb_default.ts +6 -10
  88. package/src/db/linkedRows/LinkController.ts +2 -1
  89. package/src/db/tests/linkController.spec.js +4 -1
  90. package/src/db/tests/linkTests.spec.js +1 -1
  91. package/src/ddApm.ts +7 -0
  92. package/src/elasticApm.ts +10 -0
  93. package/src/integration-test/postgres.spec.ts +762 -0
  94. package/src/integrations/base/sql.ts +15 -5
  95. package/src/integrations/oracle.ts +1 -1
  96. package/src/integrations/tests/couchdb.spec.ts +0 -2
  97. package/src/migrations/functions/tests/appUrls.spec.js +1 -1
  98. package/src/migrations/functions/tests/syncQuotas.spec.js +1 -1
  99. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +1 -1
  100. package/src/migrations/tests/index.spec.ts +13 -20
  101. package/src/sdk/app/backups/exports.ts +8 -2
  102. package/src/sdk/app/datasources/datasources.ts +3 -0
  103. package/src/tests/jestEnv.ts +8 -11
  104. package/src/tests/jestSetup.ts +9 -7
  105. package/src/tests/logging.ts +34 -0
  106. package/src/tests/utilities/TestConfiguration.ts +166 -92
  107. package/src/tests/utilities/structures.ts +16 -2
  108. package/src/utilities/redis.ts +2 -0
  109. package/src/utilities/retry.ts +18 -0
  110. package/tsconfig.build.json +1 -0
  111. package/coverage/clover.xml +0 -11771
  112. package/coverage/coverage-final.json +0 -284
  113. package/coverage/lcov-report/base.css +0 -224
  114. package/coverage/lcov-report/block-navigation.js +0 -87
  115. package/coverage/lcov-report/favicon.png +0 -0
  116. package/coverage/lcov-report/index.html +0 -1031
  117. package/coverage/lcov-report/prettify.css +0 -1
  118. package/coverage/lcov-report/prettify.js +0 -2
  119. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  120. package/coverage/lcov-report/sorter.js +0 -196
  121. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +0 -190
  122. package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +0 -247
  123. package/coverage/lcov-report/src/api/controllers/application.ts.html +0 -1987
  124. package/coverage/lcov-report/src/api/controllers/auth.ts.html +0 -301
  125. package/coverage/lcov-report/src/api/controllers/automation.ts.html +0 -940
  126. package/coverage/lcov-report/src/api/controllers/backup.ts.html +0 -148
  127. package/coverage/lcov-report/src/api/controllers/cloud.ts.html +0 -442
  128. package/coverage/lcov-report/src/api/controllers/component.ts.html +0 -259
  129. package/coverage/lcov-report/src/api/controllers/datasource.ts.html +0 -1135
  130. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +0 -262
  131. package/coverage/lcov-report/src/api/controllers/deploy/index.html +0 -131
  132. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +0 -694
  133. package/coverage/lcov-report/src/api/controllers/dev.ts.html +0 -472
  134. package/coverage/lcov-report/src/api/controllers/index.html +0 -431
  135. package/coverage/lcov-report/src/api/controllers/integration.ts.html +0 -124
  136. package/coverage/lcov-report/src/api/controllers/layout.ts.html +0 -226
  137. package/coverage/lcov-report/src/api/controllers/metadata.ts.html +0 -211
  138. package/coverage/lcov-report/src/api/controllers/migrations.ts.html +0 -127
  139. package/coverage/lcov-report/src/api/controllers/permission.ts.html +0 -619
  140. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +0 -130
  141. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +0 -310
  142. package/coverage/lcov-report/src/api/controllers/plugin/index.html +0 -206
  143. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +0 -499
  144. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +0 -253
  145. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +0 -97
  146. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +0 -121
  147. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +0 -136
  148. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +0 -385
  149. package/coverage/lcov-report/src/api/controllers/public/index.html +0 -191
  150. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +0 -181
  151. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +0 -191
  152. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +0 -124
  153. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +0 -202
  154. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +0 -178
  155. package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +0 -163
  156. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +0 -181
  157. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +0 -145
  158. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +0 -328
  159. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +0 -253
  160. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +0 -325
  161. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +0 -220
  162. package/coverage/lcov-report/src/api/controllers/query/import/index.html +0 -116
  163. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +0 -373
  164. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +0 -131
  165. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +0 -379
  166. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +0 -157
  167. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +0 -403
  168. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +0 -146
  169. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +0 -586
  170. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +0 -712
  171. package/coverage/lcov-report/src/api/controllers/query/index.html +0 -131
  172. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +0 -1000
  173. package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +0 -235
  174. package/coverage/lcov-report/src/api/controllers/role.ts.html +0 -397
  175. package/coverage/lcov-report/src/api/controllers/routing.ts.html +0 -370
  176. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +0 -2305
  177. package/coverage/lcov-report/src/api/controllers/row/external.ts.html +0 -931
  178. package/coverage/lcov-report/src/api/controllers/row/index.html +0 -206
  179. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +0 -541
  180. package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +0 -1609
  181. package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +0 -1678
  182. package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +0 -577
  183. package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +0 -556
  184. package/coverage/lcov-report/src/api/controllers/screen.ts.html +0 -463
  185. package/coverage/lcov-report/src/api/controllers/script.ts.html +0 -121
  186. package/coverage/lcov-report/src/api/controllers/static/index.html +0 -116
  187. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +0 -679
  188. package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +0 -649
  189. package/coverage/lcov-report/src/api/controllers/table/external.ts.html +0 -1153
  190. package/coverage/lcov-report/src/api/controllers/table/index.html +0 -176
  191. package/coverage/lcov-report/src/api/controllers/table/index.ts.html +0 -514
  192. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +0 -658
  193. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +0 -1273
  194. package/coverage/lcov-report/src/api/controllers/templates.ts.html +0 -214
  195. package/coverage/lcov-report/src/api/controllers/user.ts.html +0 -634
  196. package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +0 -214
  197. package/coverage/lcov-report/src/api/controllers/view/index.html +0 -161
  198. package/coverage/lcov-report/src/api/controllers/view/index.ts.html +0 -661
  199. package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +0 -580
  200. package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +0 -694
  201. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +0 -385
  202. package/coverage/lcov-report/src/api/index.html +0 -116
  203. package/coverage/lcov-report/src/api/index.ts.html +0 -352
  204. package/coverage/lcov-report/src/api/routes/analytics.ts.html +0 -112
  205. package/coverage/lcov-report/src/api/routes/apikeys.ts.html +0 -121
  206. package/coverage/lcov-report/src/api/routes/application.ts.html +0 -256
  207. package/coverage/lcov-report/src/api/routes/auth.ts.html +0 -109
  208. package/coverage/lcov-report/src/api/routes/automation.ts.html +0 -346
  209. package/coverage/lcov-report/src/api/routes/backup.ts.html +0 -127
  210. package/coverage/lcov-report/src/api/routes/cloud.ts.html +0 -139
  211. package/coverage/lcov-report/src/api/routes/component.ts.html +0 -127
  212. package/coverage/lcov-report/src/api/routes/datasource.ts.html +0 -265
  213. package/coverage/lcov-report/src/api/routes/deploy.ts.html +0 -145
  214. package/coverage/lcov-report/src/api/routes/dev.ts.html +0 -199
  215. package/coverage/lcov-report/src/api/routes/index.html +0 -551
  216. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -298
  217. package/coverage/lcov-report/src/api/routes/integration.ts.html +0 -133
  218. package/coverage/lcov-report/src/api/routes/layout.ts.html +0 -133
  219. package/coverage/lcov-report/src/api/routes/metadata.ts.html +0 -199
  220. package/coverage/lcov-report/src/api/routes/migrations.ts.html +0 -127
  221. package/coverage/lcov-report/src/api/routes/permission.ts.html +0 -208
  222. package/coverage/lcov-report/src/api/routes/plugin.ts.html +0 -151
  223. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +0 -673
  224. package/coverage/lcov-report/src/api/routes/public/index.html +0 -191
  225. package/coverage/lcov-report/src/api/routes/public/index.ts.html +0 -493
  226. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +0 -116
  227. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +0 -340
  228. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +0 -313
  229. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +0 -598
  230. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +0 -586
  231. package/coverage/lcov-report/src/api/routes/public/tests/index.html +0 -116
  232. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +0 -169
  233. package/coverage/lcov-report/src/api/routes/public/users.ts.html +0 -511
  234. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +0 -238
  235. package/coverage/lcov-report/src/api/routes/public/utils/index.html +0 -116
  236. package/coverage/lcov-report/src/api/routes/query.ts.html +0 -268
  237. package/coverage/lcov-report/src/api/routes/role.ts.html +0 -157
  238. package/coverage/lcov-report/src/api/routes/routing.ts.html +0 -127
  239. package/coverage/lcov-report/src/api/routes/row.ts.html +0 -883
  240. package/coverage/lcov-report/src/api/routes/screen.ts.html +0 -154
  241. package/coverage/lcov-report/src/api/routes/script.ts.html +0 -115
  242. package/coverage/lcov-report/src/api/routes/static.ts.html +0 -280
  243. package/coverage/lcov-report/src/api/routes/table.ts.html +0 -595
  244. package/coverage/lcov-report/src/api/routes/templates.ts.html +0 -133
  245. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +0 -550
  246. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +0 -131
  247. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +0 -367
  248. package/coverage/lcov-report/src/api/routes/user.ts.html +0 -238
  249. package/coverage/lcov-report/src/api/routes/utils/index.html +0 -116
  250. package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +0 -805
  251. package/coverage/lcov-report/src/api/routes/view.ts.html +0 -187
  252. package/coverage/lcov-report/src/api/routes/webhook.ts.html +0 -166
  253. package/coverage/lcov-report/src/app.ts.html +0 -424
  254. package/coverage/lcov-report/src/automations/actions.ts.html +0 -316
  255. package/coverage/lcov-report/src/automations/automationUtils.ts.html +0 -562
  256. package/coverage/lcov-report/src/automations/bullboard.ts.html +0 -199
  257. package/coverage/lcov-report/src/automations/index.html +0 -191
  258. package/coverage/lcov-report/src/automations/index.ts.html +0 -163
  259. package/coverage/lcov-report/src/automations/logging/index.html +0 -116
  260. package/coverage/lcov-report/src/automations/logging/index.ts.html +0 -199
  261. package/coverage/lcov-report/src/automations/steps/bash.ts.html +0 -319
  262. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +0 -382
  263. package/coverage/lcov-report/src/automations/steps/delay.ts.html +0 -217
  264. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +0 -349
  265. package/coverage/lcov-report/src/automations/steps/discord.ts.html +0 -397
  266. package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +0 -370
  267. package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +0 -325
  268. package/coverage/lcov-report/src/automations/steps/filter.ts.html +0 -394
  269. package/coverage/lcov-report/src/automations/steps/index.html +0 -371
  270. package/coverage/lcov-report/src/automations/steps/integromat.ts.html +0 -409
  271. package/coverage/lcov-report/src/automations/steps/loop.ts.html +0 -241
  272. package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +0 -499
  273. package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +0 -664
  274. package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +0 -355
  275. package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +0 -256
  276. package/coverage/lcov-report/src/automations/steps/slack.ts.html +0 -340
  277. package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +0 -439
  278. package/coverage/lcov-report/src/automations/steps/utils.ts.html +0 -223
  279. package/coverage/lcov-report/src/automations/steps/zapier.ts.html +0 -403
  280. package/coverage/lcov-report/src/automations/tests/utilities/index.html +0 -116
  281. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +0 -265
  282. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +0 -196
  283. package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +0 -193
  284. package/coverage/lcov-report/src/automations/triggerInfo/index.html +0 -206
  285. package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +0 -130
  286. package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +0 -196
  287. package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +0 -220
  288. package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +0 -220
  289. package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +0 -208
  290. package/coverage/lcov-report/src/automations/triggers.ts.html +0 -553
  291. package/coverage/lcov-report/src/automations/utils.ts.html +0 -886
  292. package/coverage/lcov-report/src/constants/index.html +0 -146
  293. package/coverage/lcov-report/src/constants/index.ts.html +0 -697
  294. package/coverage/lcov-report/src/constants/layouts.ts.html +0 -526
  295. package/coverage/lcov-report/src/constants/screens.ts.html +0 -229
  296. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +0 -2059
  297. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +0 -541
  298. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +0 -427
  299. package/coverage/lcov-report/src/db/defaultData/index.html +0 -176
  300. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +0 -403
  301. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +0 -559
  302. package/coverage/lcov-report/src/db/dynamoClient.ts.html +0 -526
  303. package/coverage/lcov-report/src/db/inMemoryView.ts.html +0 -250
  304. package/coverage/lcov-report/src/db/index.html +0 -176
  305. package/coverage/lcov-report/src/db/index.ts.html +0 -133
  306. package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +0 -1417
  307. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +0 -265
  308. package/coverage/lcov-report/src/db/linkedRows/index.html +0 -161
  309. package/coverage/lcov-report/src/db/linkedRows/index.ts.html +0 -736
  310. package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +0 -460
  311. package/coverage/lcov-report/src/db/newid.ts.html +0 -100
  312. package/coverage/lcov-report/src/db/utils.ts.html +0 -913
  313. package/coverage/lcov-report/src/definitions/automations.ts.html +0 -184
  314. package/coverage/lcov-report/src/definitions/index.html +0 -116
  315. package/coverage/lcov-report/src/environment.ts.html +0 -472
  316. package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +0 -259
  317. package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +0 -172
  318. package/coverage/lcov-report/src/events/index.html +0 -161
  319. package/coverage/lcov-report/src/events/index.ts.html +0 -100
  320. package/coverage/lcov-report/src/events/utils.ts.html +0 -319
  321. package/coverage/lcov-report/src/index.html +0 -191
  322. package/coverage/lcov-report/src/index.ts.html +0 -133
  323. package/coverage/lcov-report/src/integrations/airtable.ts.html +0 -529
  324. package/coverage/lcov-report/src/integrations/arangodb.ts.html +0 -415
  325. package/coverage/lcov-report/src/integrations/base/index.html +0 -161
  326. package/coverage/lcov-report/src/integrations/base/query.ts.html +0 -139
  327. package/coverage/lcov-report/src/integrations/base/sql.ts.html +0 -2017
  328. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +0 -691
  329. package/coverage/lcov-report/src/integrations/base/utils.ts.html +0 -121
  330. package/coverage/lcov-report/src/integrations/couchdb.ts.html +0 -484
  331. package/coverage/lcov-report/src/integrations/dynamodb.ts.html +0 -745
  332. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +0 -646
  333. package/coverage/lcov-report/src/integrations/firebase.ts.html +0 -646
  334. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +0 -1315
  335. package/coverage/lcov-report/src/integrations/index.html +0 -371
  336. package/coverage/lcov-report/src/integrations/index.ts.html +0 -460
  337. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +0 -1012
  338. package/coverage/lcov-report/src/integrations/mongodb.ts.html +0 -1999
  339. package/coverage/lcov-report/src/integrations/mysql.ts.html +0 -979
  340. package/coverage/lcov-report/src/integrations/oracle.ts.html +0 -1387
  341. package/coverage/lcov-report/src/integrations/postgres.ts.html +0 -1087
  342. package/coverage/lcov-report/src/integrations/queries/index.html +0 -116
  343. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +0 -328
  344. package/coverage/lcov-report/src/integrations/redis.ts.html +0 -550
  345. package/coverage/lcov-report/src/integrations/rest.ts.html +0 -1372
  346. package/coverage/lcov-report/src/integrations/s3.ts.html +0 -862
  347. package/coverage/lcov-report/src/integrations/snowflake.ts.html +0 -376
  348. package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +0 -85
  349. package/coverage/lcov-report/src/integrations/tests/index.html +0 -116
  350. package/coverage/lcov-report/src/integrations/utils.ts.html +0 -1036
  351. package/coverage/lcov-report/src/middleware/appInfo.ts.html +0 -145
  352. package/coverage/lcov-report/src/middleware/authorized.ts.html +0 -472
  353. package/coverage/lcov-report/src/middleware/builder.ts.html +0 -361
  354. package/coverage/lcov-report/src/middleware/currentapp.ts.html +0 -508
  355. package/coverage/lcov-report/src/middleware/index.html +0 -236
  356. package/coverage/lcov-report/src/middleware/joi-validator.ts.html +0 -205
  357. package/coverage/lcov-report/src/middleware/publicApi.ts.html +0 -148
  358. package/coverage/lcov-report/src/middleware/resourceId.ts.html +0 -283
  359. package/coverage/lcov-report/src/middleware/selfhost.ts.html +0 -121
  360. package/coverage/lcov-report/src/middleware/utils.ts.html +0 -112
  361. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +0 -166
  362. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +0 -163
  363. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +0 -151
  364. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +0 -206
  365. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +0 -172
  366. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +0 -226
  367. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +0 -151
  368. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +0 -151
  369. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +0 -166
  370. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +0 -532
  371. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +0 -286
  372. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +0 -146
  373. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +0 -265
  374. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +0 -232
  375. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +0 -724
  376. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +0 -161
  377. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +0 -106
  378. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +0 -235
  379. package/coverage/lcov-report/src/migrations/functions/index.html +0 -161
  380. package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +0 -130
  381. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +0 -520
  382. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +0 -161
  383. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +0 -94
  384. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +0 -127
  385. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +0 -115
  386. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +0 -169
  387. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +0 -124
  388. package/coverage/lcov-report/src/migrations/index.html +0 -116
  389. package/coverage/lcov-report/src/migrations/index.ts.html +0 -430
  390. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +0 -205
  391. package/coverage/lcov-report/src/migrations/tests/index.html +0 -131
  392. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +0 -283
  393. package/coverage/lcov-report/src/sdk/app/applications/index.html +0 -146
  394. package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +0 -106
  395. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +0 -268
  396. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +0 -136
  397. package/coverage/lcov-report/src/sdk/app/automations/index.html +0 -131
  398. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +0 -100
  399. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +0 -214
  400. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +0 -91
  401. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +0 -604
  402. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +0 -640
  403. package/coverage/lcov-report/src/sdk/app/backups/index.html +0 -176
  404. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +0 -112
  405. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +0 -292
  406. package/coverage/lcov-report/src/sdk/app/datasources/datasources.ts.html +0 -562
  407. package/coverage/lcov-report/src/sdk/app/datasources/index.html +0 -131
  408. package/coverage/lcov-report/src/sdk/app/datasources/index.ts.html +0 -100
  409. package/coverage/lcov-report/src/sdk/app/queries/index.html +0 -131
  410. package/coverage/lcov-report/src/sdk/app/queries/index.ts.html +0 -100
  411. package/coverage/lcov-report/src/sdk/app/queries/queries.ts.html +0 -235
  412. package/coverage/lcov-report/src/sdk/app/rows/attachments.ts.html +0 -265
  413. package/coverage/lcov-report/src/sdk/app/rows/index.html +0 -146
  414. package/coverage/lcov-report/src/sdk/app/rows/index.ts.html +0 -106
  415. package/coverage/lcov-report/src/sdk/app/rows/rows.ts.html +0 -139
  416. package/coverage/lcov-report/src/sdk/app/tables/index.html +0 -116
  417. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +0 -274
  418. package/coverage/lcov-report/src/sdk/index.html +0 -116
  419. package/coverage/lcov-report/src/sdk/index.ts.html +0 -151
  420. package/coverage/lcov-report/src/sdk/users/index.html +0 -131
  421. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -100
  422. package/coverage/lcov-report/src/sdk/users/utils.ts.html +0 -277
  423. package/coverage/lcov-report/src/sdk/utils/index.html +0 -116
  424. package/coverage/lcov-report/src/sdk/utils/index.ts.html +0 -133
  425. package/coverage/lcov-report/src/startup.ts.html +0 -484
  426. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +0 -2032
  427. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +0 -127
  428. package/coverage/lcov-report/src/tests/utilities/index.html +0 -161
  429. package/coverage/lcov-report/src/tests/utilities/index.ts.html +0 -118
  430. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +0 -856
  431. package/coverage/lcov-report/src/threads/automation.ts.html +0 -1555
  432. package/coverage/lcov-report/src/threads/index.html +0 -161
  433. package/coverage/lcov-report/src/threads/index.ts.html +0 -418
  434. package/coverage/lcov-report/src/threads/query.ts.html +0 -1000
  435. package/coverage/lcov-report/src/threads/utils.ts.html +0 -373
  436. package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +0 -94
  437. package/coverage/lcov-report/src/utilities/centralPath.ts.html +0 -151
  438. package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +0 -343
  439. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +0 -547
  440. package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +0 -601
  441. package/coverage/lcov-report/src/utilities/fileSystem/index.html +0 -206
  442. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +0 -100
  443. package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +0 -277
  444. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +0 -142
  445. package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +0 -193
  446. package/coverage/lcov-report/src/utilities/global.ts.html +0 -499
  447. package/coverage/lcov-report/src/utilities/index.html +0 -251
  448. package/coverage/lcov-report/src/utilities/index.ts.html +0 -487
  449. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -343
  450. package/coverage/lcov-report/src/utilities/routing/index.html +0 -116
  451. package/coverage/lcov-report/src/utilities/routing/index.ts.html +0 -181
  452. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +0 -146
  453. package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +0 -922
  454. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +0 -373
  455. package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +0 -373
  456. package/coverage/lcov-report/src/utilities/schema.ts.html +0 -508
  457. package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +0 -169
  458. package/coverage/lcov-report/src/utilities/security.ts.html +0 -280
  459. package/coverage/lcov-report/src/utilities/usageQuota/index.html +0 -131
  460. package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +0 -325
  461. package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +0 -139
  462. package/coverage/lcov-report/src/utilities/users.ts.html +0 -232
  463. package/coverage/lcov-report/src/utilities/workerRequests.ts.html +0 -646
  464. package/coverage/lcov-report/src/watch.ts.html +0 -196
  465. package/coverage/lcov-report/src/websocket.ts.html +0 -163
  466. package/coverage/lcov.info +0 -21770
  467. package/dist/api/routes/public/tests/utils.js +0 -33
@@ -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 Thu Feb 16 2023 16:35:51 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
-