@strapi/database 5.12.1 → 5.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/dist/connection.js +43 -0
  2. package/dist/connection.js.map +1 -0
  3. package/dist/connection.mjs +41 -0
  4. package/dist/connection.mjs.map +1 -0
  5. package/dist/dialects/dialect.js +54 -0
  6. package/dist/dialects/dialect.js.map +1 -0
  7. package/dist/dialects/dialect.mjs +52 -0
  8. package/dist/dialects/dialect.mjs.map +1 -0
  9. package/dist/dialects/index.js +44 -0
  10. package/dist/dialects/index.js.map +1 -0
  11. package/dist/dialects/index.mjs +42 -0
  12. package/dist/dialects/index.mjs.map +1 -0
  13. package/dist/dialects/mysql/constants.js +8 -0
  14. package/dist/dialects/mysql/constants.js.map +1 -0
  15. package/dist/dialects/mysql/constants.mjs +5 -0
  16. package/dist/dialects/mysql/constants.mjs.map +1 -0
  17. package/dist/dialects/mysql/database-inspector.js +35 -0
  18. package/dist/dialects/mysql/database-inspector.js.map +1 -0
  19. package/dist/dialects/mysql/database-inspector.mjs +33 -0
  20. package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
  21. package/dist/dialects/mysql/index.js +75 -0
  22. package/dist/dialects/mysql/index.js.map +1 -0
  23. package/dist/dialects/mysql/index.mjs +73 -0
  24. package/dist/dialects/mysql/index.mjs.map +1 -0
  25. package/dist/dialects/mysql/schema-inspector.js +297 -0
  26. package/dist/dialects/mysql/schema-inspector.js.map +1 -0
  27. package/dist/dialects/mysql/schema-inspector.mjs +295 -0
  28. package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
  29. package/dist/dialects/postgresql/index.js +62 -0
  30. package/dist/dialects/postgresql/index.js.map +1 -0
  31. package/dist/dialects/postgresql/index.mjs +60 -0
  32. package/dist/dialects/postgresql/index.mjs.map +1 -0
  33. package/dist/dialects/postgresql/schema-inspector.js +316 -0
  34. package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
  35. package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
  36. package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
  37. package/dist/dialects/sqlite/index.js +82 -0
  38. package/dist/dialects/sqlite/index.js.map +1 -0
  39. package/dist/dialects/sqlite/index.mjs +80 -0
  40. package/dist/dialects/sqlite/index.mjs.map +1 -0
  41. package/dist/dialects/sqlite/schema-inspector.js +211 -0
  42. package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
  43. package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
  44. package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
  45. package/dist/entity-manager/entity-repository.js +139 -0
  46. package/dist/entity-manager/entity-repository.js.map +1 -0
  47. package/dist/entity-manager/entity-repository.mjs +137 -0
  48. package/dist/entity-manager/entity-repository.mjs.map +1 -0
  49. package/dist/entity-manager/index.js +1186 -0
  50. package/dist/entity-manager/index.js.map +1 -0
  51. package/dist/entity-manager/index.mjs +1184 -0
  52. package/dist/entity-manager/index.mjs.map +1 -0
  53. package/dist/entity-manager/morph-relations.js +73 -0
  54. package/dist/entity-manager/morph-relations.js.map +1 -0
  55. package/dist/entity-manager/morph-relations.mjs +69 -0
  56. package/dist/entity-manager/morph-relations.mjs.map +1 -0
  57. package/dist/entity-manager/regular-relations.js +247 -0
  58. package/dist/entity-manager/regular-relations.js.map +1 -0
  59. package/dist/entity-manager/regular-relations.mjs +242 -0
  60. package/dist/entity-manager/regular-relations.mjs.map +1 -0
  61. package/dist/entity-manager/relations-orderer.js +221 -0
  62. package/dist/entity-manager/relations-orderer.js.map +1 -0
  63. package/dist/entity-manager/relations-orderer.mjs +218 -0
  64. package/dist/entity-manager/relations-orderer.mjs.map +1 -0
  65. package/dist/errors/database.js +13 -0
  66. package/dist/errors/database.js.map +1 -0
  67. package/dist/errors/database.mjs +11 -0
  68. package/dist/errors/database.mjs.map +1 -0
  69. package/dist/errors/index.js +18 -0
  70. package/dist/errors/index.js.map +1 -0
  71. package/dist/errors/index.mjs +7 -0
  72. package/dist/errors/index.mjs.map +1 -0
  73. package/dist/errors/invalid-date.js +13 -0
  74. package/dist/errors/invalid-date.js.map +1 -0
  75. package/dist/errors/invalid-date.mjs +11 -0
  76. package/dist/errors/invalid-date.mjs.map +1 -0
  77. package/dist/errors/invalid-datetime.js +13 -0
  78. package/dist/errors/invalid-datetime.js.map +1 -0
  79. package/dist/errors/invalid-datetime.mjs +11 -0
  80. package/dist/errors/invalid-datetime.mjs.map +1 -0
  81. package/dist/errors/invalid-relation.js +13 -0
  82. package/dist/errors/invalid-relation.js.map +1 -0
  83. package/dist/errors/invalid-relation.mjs +11 -0
  84. package/dist/errors/invalid-relation.mjs.map +1 -0
  85. package/dist/errors/invalid-time.js +13 -0
  86. package/dist/errors/invalid-time.js.map +1 -0
  87. package/dist/errors/invalid-time.mjs +11 -0
  88. package/dist/errors/invalid-time.mjs.map +1 -0
  89. package/dist/errors/not-null.js +17 -0
  90. package/dist/errors/not-null.js.map +1 -0
  91. package/dist/errors/not-null.mjs +15 -0
  92. package/dist/errors/not-null.mjs.map +1 -0
  93. package/dist/fields/biginteger.js +9 -0
  94. package/dist/fields/biginteger.js.map +1 -0
  95. package/dist/fields/biginteger.mjs +7 -0
  96. package/dist/fields/biginteger.mjs.map +1 -0
  97. package/dist/fields/boolean.js +48 -0
  98. package/dist/fields/boolean.js.map +1 -0
  99. package/dist/fields/boolean.mjs +46 -0
  100. package/dist/fields/boolean.mjs.map +1 -0
  101. package/dist/fields/date.js +16 -0
  102. package/dist/fields/date.js.map +1 -0
  103. package/dist/fields/date.mjs +14 -0
  104. package/dist/fields/date.mjs.map +1 -0
  105. package/dist/fields/datetime.js +37 -0
  106. package/dist/fields/datetime.js.map +1 -0
  107. package/dist/fields/datetime.mjs +16 -0
  108. package/dist/fields/datetime.mjs.map +1 -0
  109. package/dist/fields/field.js +16 -0
  110. package/dist/fields/field.js.map +1 -0
  111. package/dist/fields/field.mjs +14 -0
  112. package/dist/fields/field.mjs.map +1 -0
  113. package/dist/fields/index.js +45 -0
  114. package/dist/fields/index.js.map +1 -0
  115. package/dist/fields/index.mjs +43 -0
  116. package/dist/fields/index.mjs.map +1 -0
  117. package/dist/fields/json.js +36 -0
  118. package/dist/fields/json.js.map +1 -0
  119. package/dist/fields/json.mjs +34 -0
  120. package/dist/fields/json.mjs.map +1 -0
  121. package/dist/fields/number.js +20 -0
  122. package/dist/fields/number.js.map +1 -0
  123. package/dist/fields/number.mjs +18 -0
  124. package/dist/fields/number.mjs.map +1 -0
  125. package/dist/fields/shared/parsers.js +91 -0
  126. package/dist/fields/shared/parsers.js.map +1 -0
  127. package/dist/fields/shared/parsers.mjs +68 -0
  128. package/dist/fields/shared/parsers.mjs.map +1 -0
  129. package/dist/fields/string.js +16 -0
  130. package/dist/fields/string.js.map +1 -0
  131. package/dist/fields/string.mjs +14 -0
  132. package/dist/fields/string.mjs.map +1 -0
  133. package/dist/fields/time.js +17 -0
  134. package/dist/fields/time.js.map +1 -0
  135. package/dist/fields/time.mjs +15 -0
  136. package/dist/fields/time.mjs.map +1 -0
  137. package/dist/fields/timestamp.js +37 -0
  138. package/dist/fields/timestamp.js.map +1 -0
  139. package/dist/fields/timestamp.mjs +16 -0
  140. package/dist/fields/timestamp.mjs.map +1 -0
  141. package/dist/index.js +33 -8569
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +16 -8532
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/lifecycles/index.js +73 -0
  146. package/dist/lifecycles/index.js.map +1 -0
  147. package/dist/lifecycles/index.mjs +71 -0
  148. package/dist/lifecycles/index.mjs.map +1 -0
  149. package/dist/lifecycles/subscribers/index.js +10 -0
  150. package/dist/lifecycles/subscribers/index.js.map +1 -0
  151. package/dist/lifecycles/subscribers/index.mjs +8 -0
  152. package/dist/lifecycles/subscribers/index.mjs.map +1 -0
  153. package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
  154. package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
  155. package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
  156. package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
  157. package/dist/lifecycles/subscribers/timestamps.js +55 -0
  158. package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
  159. package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
  160. package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
  161. package/dist/metadata/index.js +24 -0
  162. package/dist/metadata/index.js.map +1 -0
  163. package/dist/metadata/index.mjs +16 -0
  164. package/dist/metadata/index.mjs.map +1 -0
  165. package/dist/metadata/metadata.js +100 -0
  166. package/dist/metadata/metadata.js.map +1 -0
  167. package/dist/metadata/metadata.mjs +98 -0
  168. package/dist/metadata/metadata.mjs.map +1 -0
  169. package/dist/metadata/relations.js +545 -0
  170. package/dist/metadata/relations.js.map +1 -0
  171. package/dist/metadata/relations.mjs +536 -0
  172. package/dist/metadata/relations.mjs.map +1 -0
  173. package/dist/migrations/common.js +8 -0
  174. package/dist/migrations/common.js.map +1 -0
  175. package/dist/migrations/common.mjs +6 -0
  176. package/dist/migrations/common.mjs.map +1 -0
  177. package/dist/migrations/index.js +39 -0
  178. package/dist/migrations/index.js.map +1 -0
  179. package/dist/migrations/index.mjs +37 -0
  180. package/dist/migrations/index.mjs.map +1 -0
  181. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
  182. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
  183. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
  184. package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
  185. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
  186. package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
  187. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
  188. package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
  189. package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
  190. package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
  191. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
  192. package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
  193. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
  194. package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
  195. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
  196. package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
  197. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
  198. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
  199. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
  200. package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
  201. package/dist/migrations/internal-migrations/index.js +26 -0
  202. package/dist/migrations/internal-migrations/index.js.map +1 -0
  203. package/dist/migrations/internal-migrations/index.mjs +24 -0
  204. package/dist/migrations/internal-migrations/index.mjs.map +1 -0
  205. package/dist/migrations/internal.js +63 -0
  206. package/dist/migrations/internal.js.map +1 -0
  207. package/dist/migrations/internal.mjs +61 -0
  208. package/dist/migrations/internal.mjs.map +1 -0
  209. package/dist/migrations/logger.js +24 -0
  210. package/dist/migrations/logger.js.map +1 -0
  211. package/dist/migrations/logger.mjs +22 -0
  212. package/dist/migrations/logger.mjs.map +1 -0
  213. package/dist/migrations/storage.js +39 -0
  214. package/dist/migrations/storage.js.map +1 -0
  215. package/dist/migrations/storage.mjs +37 -0
  216. package/dist/migrations/storage.mjs.map +1 -0
  217. package/dist/migrations/users.js +87 -0
  218. package/dist/migrations/users.js.map +1 -0
  219. package/dist/migrations/users.mjs +85 -0
  220. package/dist/migrations/users.mjs.map +1 -0
  221. package/dist/query/helpers/join.js +127 -0
  222. package/dist/query/helpers/join.js.map +1 -0
  223. package/dist/query/helpers/join.mjs +122 -0
  224. package/dist/query/helpers/join.mjs.map +1 -0
  225. package/dist/query/helpers/order-by.js +167 -0
  226. package/dist/query/helpers/order-by.js.map +1 -0
  227. package/dist/query/helpers/order-by.mjs +163 -0
  228. package/dist/query/helpers/order-by.mjs.map +1 -0
  229. package/dist/query/helpers/populate/apply.js +592 -0
  230. package/dist/query/helpers/populate/apply.js.map +1 -0
  231. package/dist/query/helpers/populate/apply.mjs +590 -0
  232. package/dist/query/helpers/populate/apply.mjs.map +1 -0
  233. package/dist/query/helpers/populate/process.js +92 -0
  234. package/dist/query/helpers/populate/process.js.map +1 -0
  235. package/dist/query/helpers/populate/process.mjs +90 -0
  236. package/dist/query/helpers/populate/process.mjs.map +1 -0
  237. package/dist/query/helpers/search.js +67 -0
  238. package/dist/query/helpers/search.js.map +1 -0
  239. package/dist/query/helpers/search.mjs +65 -0
  240. package/dist/query/helpers/search.mjs.map +1 -0
  241. package/dist/query/helpers/streams/readable.js +131 -0
  242. package/dist/query/helpers/streams/readable.js.map +1 -0
  243. package/dist/query/helpers/streams/readable.mjs +129 -0
  244. package/dist/query/helpers/streams/readable.mjs.map +1 -0
  245. package/dist/query/helpers/transform.js +77 -0
  246. package/dist/query/helpers/transform.js.map +1 -0
  247. package/dist/query/helpers/transform.mjs +73 -0
  248. package/dist/query/helpers/transform.mjs.map +1 -0
  249. package/dist/query/helpers/where.js +372 -0
  250. package/dist/query/helpers/where.js.map +1 -0
  251. package/dist/query/helpers/where.mjs +369 -0
  252. package/dist/query/helpers/where.mjs.map +1 -0
  253. package/dist/query/query-builder.js +507 -0
  254. package/dist/query/query-builder.js.map +1 -0
  255. package/dist/query/query-builder.mjs +505 -0
  256. package/dist/query/query-builder.mjs.map +1 -0
  257. package/dist/repairs/index.js +13 -0
  258. package/dist/repairs/index.js.map +1 -0
  259. package/dist/repairs/index.mjs +11 -0
  260. package/dist/repairs/index.mjs.map +1 -0
  261. package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
  262. package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
  263. package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
  264. package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
  265. package/dist/schema/builder.js +354 -0
  266. package/dist/schema/builder.js.map +1 -0
  267. package/dist/schema/builder.mjs +352 -0
  268. package/dist/schema/builder.mjs.map +1 -0
  269. package/dist/schema/diff.js +379 -0
  270. package/dist/schema/diff.js.map +1 -0
  271. package/dist/schema/diff.mjs +377 -0
  272. package/dist/schema/diff.mjs.map +1 -0
  273. package/dist/schema/index.js +93 -0
  274. package/dist/schema/index.js.map +1 -0
  275. package/dist/schema/index.mjs +91 -0
  276. package/dist/schema/index.mjs.map +1 -0
  277. package/dist/schema/schema.js +266 -0
  278. package/dist/schema/schema.js.map +1 -0
  279. package/dist/schema/schema.mjs +264 -0
  280. package/dist/schema/schema.mjs.map +1 -0
  281. package/dist/schema/storage.js +58 -0
  282. package/dist/schema/storage.js.map +1 -0
  283. package/dist/schema/storage.mjs +56 -0
  284. package/dist/schema/storage.mjs.map +1 -0
  285. package/dist/transaction-context.js +65 -0
  286. package/dist/transaction-context.js.map +1 -0
  287. package/dist/transaction-context.mjs +63 -0
  288. package/dist/transaction-context.mjs.map +1 -0
  289. package/dist/utils/async-curry.js +19 -0
  290. package/dist/utils/async-curry.js.map +1 -0
  291. package/dist/utils/async-curry.mjs +17 -0
  292. package/dist/utils/async-curry.mjs.map +1 -0
  293. package/dist/utils/identifiers/hash.js +30 -0
  294. package/dist/utils/identifiers/hash.js.map +1 -0
  295. package/dist/utils/identifiers/hash.mjs +28 -0
  296. package/dist/utils/identifiers/hash.mjs.map +1 -0
  297. package/dist/utils/identifiers/index.js +414 -0
  298. package/dist/utils/identifiers/index.js.map +1 -0
  299. package/dist/utils/identifiers/index.mjs +411 -0
  300. package/dist/utils/identifiers/index.mjs.map +1 -0
  301. package/dist/utils/knex.js +21 -0
  302. package/dist/utils/knex.js.map +1 -0
  303. package/dist/utils/knex.mjs +18 -0
  304. package/dist/utils/knex.mjs.map +1 -0
  305. package/dist/utils/types.js +51 -0
  306. package/dist/utils/types.js.map +1 -0
  307. package/dist/utils/types.mjs +44 -0
  308. package/dist/utils/types.mjs.map +1 -0
  309. package/dist/validations/index.js +12 -0
  310. package/dist/validations/index.js.map +1 -0
  311. package/dist/validations/index.mjs +10 -0
  312. package/dist/validations/index.mjs.map +1 -0
  313. package/dist/validations/relations/bidirectional.js +64 -0
  314. package/dist/validations/relations/bidirectional.js.map +1 -0
  315. package/dist/validations/relations/bidirectional.mjs +62 -0
  316. package/dist/validations/relations/bidirectional.mjs.map +1 -0
  317. package/dist/validations/relations/index.js +13 -0
  318. package/dist/validations/relations/index.js.map +1 -0
  319. package/dist/validations/relations/index.mjs +11 -0
  320. package/dist/validations/relations/index.mjs.map +1 -0
  321. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.mjs","sources":["../../../../src/query/helpers/populate/apply.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport { fromRow } from '../transform';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\nimport type { Meta } from '../../../metadata';\nimport { ID, RelationalAttribute, Relation } from '../../../types';\n\n// We must select the join column id, however whatever it is named will overwrite an attribute of the same name\n// Therefore, we will prefix with something unlikely to conflict with a user attribute\n// TODO: ...and completely restrict the strapi_ prefix for an attribute name in the future\nconst joinColPrefix = '__strapi' as const;\n\ntype Context = {\n db: Database;\n qb: QueryBuilder;\n uid: string;\n};\n\ntype Input<TRelationAttribute extends RelationalAttribute = RelationalAttribute> = {\n attribute: TRelationAttribute;\n attributeName: string;\n results: Row[];\n populateValue: {\n on?: Record<string, Record<string, unknown>>;\n } & Record<string, unknown>;\n\n isCount: boolean;\n};\n\ntype InputWithTarget<TRelationAttribute extends RelationalAttribute = RelationalAttribute> =\n Input<TRelationAttribute> & {\n targetMeta: Meta;\n };\n\ntype MorphIdMap = Record<string, Record<ID, Row[]>>;\n\ntype Row = Record<string, unknown>;\n\n/**\n * Populate oneToOne and manyToOne relation\n * @param {*} input\n * @param {*} ctx\n * @returns\n */\nconst XtoOne = async (\n input: InputWithTarget<Relation.OneToOne | Relation.ManyToOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const { name: joinColumnName, referencedColumn: referencedColumnName } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({ [referencedColumnName]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row[]>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[joinColumnName] as string]));\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: joinTable.orderBy,\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(_.first(map[result[referencedColumnName] as string]));\n });\n }\n};\n\nconst oneToMany = async (input: InputWithTarget<Relation.OneToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db, qb } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n if ('joinColumn' in attribute && attribute.joinColumn) {\n const {\n name: joinColumnName,\n referencedColumn: referencedColumnName,\n on,\n } = attribute.joinColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(targetMeta.uid)\n .init(populateValue)\n .addSelect(`${qb.alias}.${referencedColumnName}`)\n .where({\n [referencedColumnName]: referencedValues,\n ...(on && typeof on === 'function' ? on({ populateValue, results }) : {}),\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(referencedColumnName)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[joinColumnName] as string] || []);\n });\n\n return;\n }\n\n if ('joinTable' in attribute && attribute.joinTable) {\n const { joinTable } = attribute;\n\n const qb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = qb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n })\n .select([joinColSelect, qb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColRenameAs]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: qb.alias,\n on: joinTable.on,\n orderBy: _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((r) => {\n r[attributeName] = fromTargetRow(map[r[referencedColumnName] as string] || []);\n });\n }\n};\n\nconst manyToMany = async (input: InputWithTarget<Relation.ManyToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue, targetMeta, isCount } = input;\n const { db } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { joinTable } = attribute;\n\n const populateQb = db.entityManager.createQueryBuilder(targetMeta.uid);\n\n const { name: joinColumnName, referencedColumn: referencedColumnName } = joinTable.joinColumn;\n\n const alias = populateQb.getAlias();\n const joinColAlias = `${alias}.${joinColumnName}`;\n const joinColRenameAs = `${joinColPrefix}${joinColumnName}`;\n const joinColSelect = `${joinColAlias} as ${joinColRenameAs}`;\n\n const referencedValues = _.uniq(\n results.map((r) => r[referencedColumnName]).filter((value) => !_.isNil(value))\n );\n\n if (isCount) {\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = { count: 0 };\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n })\n .select([joinColAlias, populateQb.raw('count(*) AS count')])\n .where({ [joinColAlias]: referencedValues })\n .groupBy(joinColAlias)\n .execute<Array<{ count: number } & { [key: string]: string }>>({ mapResults: false });\n\n const map = rows.reduce(\n (map, row) => {\n map[row[joinColumnName]] = { count: Number(row.count) };\n return map;\n },\n {} as Record<string, { count: number }>\n );\n\n results.forEach((result) => {\n result[attributeName] = map[result[referencedColumnName] as string] || { count: 0 };\n });\n\n return;\n }\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = [];\n });\n return;\n }\n\n const rows = await populateQb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.inverseJoinColumn.name,\n rootColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootTable: populateQb.alias,\n on: joinTable.on,\n orderBy: _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy),\n })\n .addSelect(joinColSelect)\n .where({ [joinColAlias]: referencedValues })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(joinColRenameAs)(rows);\n\n results.forEach((result) => {\n result[attributeName] = fromTargetRow(map[result[referencedColumnName] as string] || []);\n });\n};\n\nconst morphX = async (\n input: InputWithTarget<Relation.MorphMany | Relation.MorphOne>,\n ctx: Context\n) => {\n const { attribute, attributeName, results, populateValue, targetMeta } = input;\n const { db, uid } = ctx;\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n const { target, morphBy } = attribute;\n\n const targetAttribute = db.metadata.get(target).attributes[morphBy];\n\n if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToOne') {\n const { idColumn, typeColumn } = targetAttribute.morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = null;\n });\n\n return;\n }\n\n const rows = await db.entityManager\n .createQueryBuilder(target)\n .init(populateValue)\n // .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.name]: referencedValues, [typeColumn.name]: uid })\n .execute<Row>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n } else if (targetAttribute.type === 'relation' && targetAttribute.relation === 'morphToMany') {\n const { joinTable } = targetAttribute;\n\n const { joinColumn, morphColumn } = joinTable;\n\n const { idColumn, typeColumn } = morphColumn;\n\n const referencedValues = _.uniq(\n results.map((r) => r[idColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n if (_.isEmpty(referencedValues)) {\n results.forEach((result) => {\n result[attributeName] = attribute.relation === 'morphOne' ? null : [];\n });\n\n return;\n }\n\n // find with join table\n const qb = db.entityManager.createQueryBuilder(target);\n\n const alias = qb.getAlias();\n\n const rows = await qb\n .init(populateValue)\n .join({\n alias,\n referencedTable: joinTable.name,\n referencedColumn: joinColumn.name,\n rootColumn: joinColumn.referencedColumn,\n rootTable: qb.alias,\n on: {\n ...(joinTable.on || {}),\n field: attributeName,\n },\n orderBy: _.mapValues((v) => populateValue.ordering || v, joinTable.orderBy),\n })\n .addSelect([`${alias}.${idColumn.name}`, `${alias}.${typeColumn.name}`])\n .where({\n [`${alias}.${idColumn.name}`]: referencedValues,\n [`${alias}.${typeColumn.name}`]: uid,\n })\n .execute<Row[]>({ mapResults: false });\n\n const map = _.groupBy<Row>(idColumn.name)(rows);\n\n results.forEach((result) => {\n const matchingRows = map[result[idColumn.referencedColumn] as string];\n\n const matchingValue =\n attribute.relation === 'morphOne' ? _.first(matchingRows) : matchingRows;\n\n result[attributeName] = fromTargetRow(matchingValue);\n });\n }\n};\n\nconst morphToMany = async (input: Input<Relation.MorphToMany>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n // find with join table\n const { joinTable } = attribute;\n\n const { joinColumn, morphColumn } = joinTable;\n const { idColumn, typeColumn, typeField = '__type' } = morphColumn;\n\n // fetch join table to create the ids map then do the same as morphToOne without the first\n\n const referencedValues = _.uniq(\n results.map((r) => r[joinColumn.referencedColumn]).filter((value) => !_.isNil(value))\n );\n\n const qb = db.entityManager.createQueryBuilder(joinTable.name);\n\n const joinRows = await qb\n .where({\n [joinColumn.name]: referencedValues,\n ...(joinTable.on || {}),\n // If the populateValue contains an \"on\" property,\n // only populate the types defined in it\n ...('on' in populateValue\n ? { [morphColumn.typeColumn.name]: Object.keys(populateValue.on ?? {}) }\n : {}),\n })\n .orderBy([joinColumn.name, 'order'])\n .execute<Row[]>({ mapResults: false });\n\n const joinMap = _.groupBy(joinColumn.name, joinRows);\n\n const idsByType = joinRows.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!_.has(typeValue, acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n\n continue;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const joinResults = joinMap[result[joinColumn.referencedColumn] as string] || [];\n\n const matchingRows = joinResults.flatMap((joinResult) => {\n const id = joinResult[idColumn.name] as ID;\n const type = joinResult[typeColumn.name] as string;\n\n const targetMeta = db.metadata.get(type);\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) => fromRow(targetMeta, rowOrRows);\n\n return (map[type][id] || []).map((row) => {\n return {\n [typeField]: type,\n ...fromTargetRow(row),\n };\n });\n });\n\n result[attributeName] = matchingRows;\n });\n};\n\nconst morphToOne = async (input: Input<Relation.MorphToOne>, ctx: Context) => {\n const { attribute, attributeName, results, populateValue } = input;\n const { db } = ctx;\n\n const { morphColumn } = attribute;\n const { idColumn, typeColumn } = morphColumn;\n\n // make a map for each type what ids to return\n // make a nested map per id\n\n const idsByType = results.reduce<Record<string, ID[]>>((acc, result) => {\n const idValue = result[morphColumn.idColumn.name] as ID;\n const typeValue = result[morphColumn.typeColumn.name] as string;\n\n if (!idValue || !typeValue) {\n return acc;\n }\n\n if (!(typeValue in acc)) {\n acc[typeValue] = [];\n }\n\n acc[typeValue].push(idValue);\n\n return acc;\n }, {});\n\n const map: MorphIdMap = {};\n const { on, ...typePopulate } = populateValue;\n\n for (const type of Object.keys(idsByType)) {\n const ids = idsByType[type];\n\n // type was removed but still in morph relation\n if (!db.metadata.get(type)) {\n map[type] = {};\n return;\n }\n\n const qb = db.entityManager.createQueryBuilder(type);\n\n const rows = await qb\n .init(on?.[type] ?? typePopulate)\n .addSelect(`${qb.alias}.${idColumn.referencedColumn}`)\n .where({ [idColumn.referencedColumn]: ids })\n .execute<Row[]>({ mapResults: false });\n\n map[type] = _.groupBy<Row>(idColumn.referencedColumn)(rows);\n }\n\n results.forEach((result) => {\n const id = result[idColumn.name] as ID;\n const type = result[typeColumn.name] as string;\n\n if (!type || !id) {\n result[attributeName] = null;\n return;\n }\n\n const matchingRows = map[type][id];\n\n const fromTargetRow = (rowOrRows: Row | Row[] | undefined) =>\n fromRow(db.metadata.get(type), rowOrRows);\n\n result[attributeName] = fromTargetRow(_.first(matchingRows));\n });\n};\n\n// TODO: Omit limit & offset to avoid needing a query per result to avoid making too many queries\nconst pickPopulateParams = (populate: Record<string, unknown>) => {\n const fieldsToPick = [\n 'select',\n 'count',\n 'where',\n 'populate',\n 'orderBy',\n 'filters',\n 'ordering',\n 'on',\n ];\n\n if (populate.count !== true) {\n fieldsToPick.push('limit', 'offset');\n }\n\n return _.pick(fieldsToPick, populate);\n};\n\nconst applyPopulate = async (results: Row[], populate: Record<string, any>, ctx: Context) => {\n const { db, uid, qb } = ctx;\n const meta = db.metadata.get(uid);\n\n if (_.isEmpty(results)) {\n return results;\n }\n\n for (const attributeName of Object.keys(populate)) {\n const attribute = meta.attributes[attributeName];\n\n if (attribute.type !== 'relation') {\n throw new Error(`Invalid populate attribute ${attributeName}`);\n }\n\n const populateValue = {\n filters: qb.state.filters,\n ...pickPopulateParams(populate[attributeName]),\n };\n\n const isCount = 'count' in populateValue && populateValue.count === true;\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'manyToOne': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await XtoOne(input, ctx);\n break;\n }\n case 'oneToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await oneToMany(input, ctx);\n break;\n }\n case 'manyToMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await manyToMany(input, ctx);\n break;\n }\n case 'morphOne':\n case 'morphMany': {\n const targetMeta = db.metadata.get(attribute.target);\n const input = { attribute, attributeName, results, populateValue, targetMeta, isCount };\n await morphX(input, ctx);\n break;\n }\n case 'morphToMany': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToMany(input, ctx);\n break;\n }\n case 'morphToOne': {\n const input = { attribute, attributeName, results, populateValue, isCount };\n await morphToOne(input, ctx);\n break;\n }\n default: {\n break;\n }\n }\n }\n};\n\nexport default applyPopulate;\n"],"names":["joinColPrefix","XtoOne","input","ctx","attribute","attributeName","results","populateValue","targetMeta","isCount","db","qb","fromTargetRow","rowOrRows","fromRow","joinColumn","name","joinColumnName","referencedColumn","referencedColumnName","referencedValues","_","uniq","map","r","filter","value","isNil","isEmpty","forEach","result","rows","entityManager","createQueryBuilder","uid","init","addSelect","alias","where","execute","mapResults","groupBy","first","joinTable","getAlias","joinColAlias","joinColRenameAs","joinColSelect","count","join","referencedTable","inverseJoinColumn","rootColumn","rootTable","on","select","raw","reduce","row","Number","orderBy","oneToMany","mapValues","v","ordering","manyToMany","populateQb","morphX","target","morphBy","targetAttribute","metadata","get","attributes","type","relation","idColumn","typeColumn","morphColumn","matchingRows","matchingValue","field","morphToMany","typeField","joinRows","Object","keys","joinMap","idsByType","acc","idValue","typeValue","has","push","typePopulate","ids","joinResults","flatMap","joinResult","id","morphToOne","pickPopulateParams","populate","fieldsToPick","pick","applyPopulate","meta","Error","filters","state"],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+ var types = require('../../../utils/types.js');
5
+
6
+ const getRootLevelPopulate = (meta)=>{
7
+ const populate = {};
8
+ for (const attributeName of Object.keys(meta.attributes)){
9
+ const attribute = meta.attributes[attributeName];
10
+ if (attribute.type === 'relation') {
11
+ populate[attributeName] = true;
12
+ }
13
+ }
14
+ return populate;
15
+ };
16
+ /**
17
+ * Converts and prepares the query for populate
18
+ *
19
+ * @param {boolean|string[]|object} populate populate param
20
+ * @param {object} ctx query context
21
+ * @param {object} ctx.db database instance
22
+ * @param {object} ctx.qb query builder instance
23
+ * @param {string} ctx.uid model uid
24
+ */ const processPopulate = (populate, ctx)=>{
25
+ const { qb, db, uid } = ctx;
26
+ const meta = db.metadata.get(uid);
27
+ let populateMap = {};
28
+ if (populate === false || _.isNil(populate)) {
29
+ return null;
30
+ }
31
+ if (populate === true) {
32
+ populateMap = getRootLevelPopulate(meta);
33
+ } else if (Array.isArray(populate)) {
34
+ for (const key of populate){
35
+ const [root, ...rest] = key.split('.');
36
+ if (rest.length > 0) {
37
+ const subPopulate = rest.join('.');
38
+ if (populateMap[root]) {
39
+ const populateValue = populateMap[root];
40
+ if (populateValue === true) {
41
+ populateMap[root] = {
42
+ populate: [
43
+ subPopulate
44
+ ]
45
+ };
46
+ } else {
47
+ populateValue.populate = [
48
+ subPopulate
49
+ ].concat(populateValue.populate ?? []);
50
+ }
51
+ } else {
52
+ populateMap[root] = {
53
+ populate: [
54
+ subPopulate
55
+ ]
56
+ };
57
+ }
58
+ } else {
59
+ populateMap[root] = populateMap[root] ? populateMap[root] : true;
60
+ }
61
+ }
62
+ } else {
63
+ populateMap = populate;
64
+ }
65
+ if (!_.isPlainObject(populateMap)) {
66
+ throw new Error('Populate must be an object');
67
+ }
68
+ const finalPopulate = {};
69
+ for (const key of Object.keys(populateMap)){
70
+ const attribute = meta.attributes[key];
71
+ if (!attribute) {
72
+ continue;
73
+ }
74
+ if (!types.isRelation(attribute.type)) {
75
+ continue;
76
+ }
77
+ // Make sure to query the join column value if needed,
78
+ // so that we can apply the populate later on
79
+ if ('joinColumn' in attribute && attribute.joinColumn) {
80
+ qb.addSelect(attribute.joinColumn.name);
81
+ }
82
+ // Make sure id is present for future populate queries
83
+ if (_.has('id', meta.attributes)) {
84
+ qb.addSelect('id');
85
+ }
86
+ finalPopulate[key] = populateMap[key];
87
+ }
88
+ return finalPopulate;
89
+ };
90
+
91
+ module.exports = processPopulate;
92
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../../utils/types';\nimport type { Meta } from '../../../metadata';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\n\nconst getRootLevelPopulate = (meta: Meta) => {\n const populate: PopulateMap = {};\n\n for (const attributeName of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[attributeName];\n if (attribute.type === 'relation') {\n populate[attributeName] = true;\n }\n }\n\n return populate;\n};\n\ntype Context = {\n qb: QueryBuilder;\n db: Database;\n uid: string;\n};\n\ntype PopulateMap = {\n [key: string]:\n | true\n | {\n populate?: PopulateMap | true | string[];\n };\n};\n\n/**\n * Converts and prepares the query for populate\n *\n * @param {boolean|string[]|object} populate populate param\n * @param {object} ctx query context\n * @param {object} ctx.db database instance\n * @param {object} ctx.qb query builder instance\n * @param {string} ctx.uid model uid\n */\nconst processPopulate = (populate: unknown, ctx: Context) => {\n const { qb, db, uid } = ctx;\n const meta = db.metadata.get(uid);\n\n let populateMap: PopulateMap = {};\n\n if (populate === false || _.isNil(populate)) {\n return null;\n }\n\n if (populate === true) {\n populateMap = getRootLevelPopulate(meta);\n } else if (Array.isArray(populate)) {\n for (const key of populate) {\n const [root, ...rest] = key.split('.');\n\n if (rest.length > 0) {\n const subPopulate = rest.join('.');\n if (populateMap[root]) {\n const populateValue = populateMap[root];\n\n if (populateValue === true) {\n populateMap[root] = {\n populate: [subPopulate],\n };\n } else {\n populateValue.populate = [subPopulate].concat(populateValue.populate ?? []);\n }\n } else {\n populateMap[root] = {\n populate: [subPopulate],\n };\n }\n } else {\n populateMap[root] = populateMap[root] ? populateMap[root] : true;\n }\n }\n } else {\n populateMap = populate as PopulateMap;\n }\n\n if (!_.isPlainObject(populateMap)) {\n throw new Error('Populate must be an object');\n }\n\n const finalPopulate: PopulateMap = {};\n for (const key of Object.keys(populateMap)) {\n const attribute = meta.attributes[key];\n\n if (!attribute) {\n continue;\n }\n\n if (!types.isRelation(attribute.type)) {\n continue;\n }\n\n // Make sure to query the join column value if needed,\n // so that we can apply the populate later on\n if ('joinColumn' in attribute && attribute.joinColumn) {\n qb.addSelect(attribute.joinColumn.name);\n }\n\n // Make sure id is present for future populate queries\n if (_.has('id', meta.attributes)) {\n qb.addSelect('id');\n }\n\n finalPopulate[key] = populateMap[key];\n }\n\n return finalPopulate;\n};\n\nexport default processPopulate;\n"],"names":["getRootLevelPopulate","meta","populate","attributeName","Object","keys","attributes","attribute","type","processPopulate","ctx","qb","db","uid","metadata","get","populateMap","_","isNil","Array","isArray","key","root","rest","split","length","subPopulate","join","populateValue","concat","isPlainObject","Error","finalPopulate","types","joinColumn","addSelect","name","has"],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import _ from 'lodash/fp';
2
+ import { isRelation } from '../../../utils/types.mjs';
3
+
4
+ const getRootLevelPopulate = (meta)=>{
5
+ const populate = {};
6
+ for (const attributeName of Object.keys(meta.attributes)){
7
+ const attribute = meta.attributes[attributeName];
8
+ if (attribute.type === 'relation') {
9
+ populate[attributeName] = true;
10
+ }
11
+ }
12
+ return populate;
13
+ };
14
+ /**
15
+ * Converts and prepares the query for populate
16
+ *
17
+ * @param {boolean|string[]|object} populate populate param
18
+ * @param {object} ctx query context
19
+ * @param {object} ctx.db database instance
20
+ * @param {object} ctx.qb query builder instance
21
+ * @param {string} ctx.uid model uid
22
+ */ const processPopulate = (populate, ctx)=>{
23
+ const { qb, db, uid } = ctx;
24
+ const meta = db.metadata.get(uid);
25
+ let populateMap = {};
26
+ if (populate === false || _.isNil(populate)) {
27
+ return null;
28
+ }
29
+ if (populate === true) {
30
+ populateMap = getRootLevelPopulate(meta);
31
+ } else if (Array.isArray(populate)) {
32
+ for (const key of populate){
33
+ const [root, ...rest] = key.split('.');
34
+ if (rest.length > 0) {
35
+ const subPopulate = rest.join('.');
36
+ if (populateMap[root]) {
37
+ const populateValue = populateMap[root];
38
+ if (populateValue === true) {
39
+ populateMap[root] = {
40
+ populate: [
41
+ subPopulate
42
+ ]
43
+ };
44
+ } else {
45
+ populateValue.populate = [
46
+ subPopulate
47
+ ].concat(populateValue.populate ?? []);
48
+ }
49
+ } else {
50
+ populateMap[root] = {
51
+ populate: [
52
+ subPopulate
53
+ ]
54
+ };
55
+ }
56
+ } else {
57
+ populateMap[root] = populateMap[root] ? populateMap[root] : true;
58
+ }
59
+ }
60
+ } else {
61
+ populateMap = populate;
62
+ }
63
+ if (!_.isPlainObject(populateMap)) {
64
+ throw new Error('Populate must be an object');
65
+ }
66
+ const finalPopulate = {};
67
+ for (const key of Object.keys(populateMap)){
68
+ const attribute = meta.attributes[key];
69
+ if (!attribute) {
70
+ continue;
71
+ }
72
+ if (!isRelation(attribute.type)) {
73
+ continue;
74
+ }
75
+ // Make sure to query the join column value if needed,
76
+ // so that we can apply the populate later on
77
+ if ('joinColumn' in attribute && attribute.joinColumn) {
78
+ qb.addSelect(attribute.joinColumn.name);
79
+ }
80
+ // Make sure id is present for future populate queries
81
+ if (_.has('id', meta.attributes)) {
82
+ qb.addSelect('id');
83
+ }
84
+ finalPopulate[key] = populateMap[key];
85
+ }
86
+ return finalPopulate;
87
+ };
88
+
89
+ export { processPopulate as default };
90
+ //# sourceMappingURL=process.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.mjs","sources":["../../../../src/query/helpers/populate/process.ts"],"sourcesContent":["import _ from 'lodash/fp';\n\nimport * as types from '../../../utils/types';\nimport type { Meta } from '../../../metadata';\nimport type { QueryBuilder } from '../../query-builder';\nimport type { Database } from '../../..';\n\nconst getRootLevelPopulate = (meta: Meta) => {\n const populate: PopulateMap = {};\n\n for (const attributeName of Object.keys(meta.attributes)) {\n const attribute = meta.attributes[attributeName];\n if (attribute.type === 'relation') {\n populate[attributeName] = true;\n }\n }\n\n return populate;\n};\n\ntype Context = {\n qb: QueryBuilder;\n db: Database;\n uid: string;\n};\n\ntype PopulateMap = {\n [key: string]:\n | true\n | {\n populate?: PopulateMap | true | string[];\n };\n};\n\n/**\n * Converts and prepares the query for populate\n *\n * @param {boolean|string[]|object} populate populate param\n * @param {object} ctx query context\n * @param {object} ctx.db database instance\n * @param {object} ctx.qb query builder instance\n * @param {string} ctx.uid model uid\n */\nconst processPopulate = (populate: unknown, ctx: Context) => {\n const { qb, db, uid } = ctx;\n const meta = db.metadata.get(uid);\n\n let populateMap: PopulateMap = {};\n\n if (populate === false || _.isNil(populate)) {\n return null;\n }\n\n if (populate === true) {\n populateMap = getRootLevelPopulate(meta);\n } else if (Array.isArray(populate)) {\n for (const key of populate) {\n const [root, ...rest] = key.split('.');\n\n if (rest.length > 0) {\n const subPopulate = rest.join('.');\n if (populateMap[root]) {\n const populateValue = populateMap[root];\n\n if (populateValue === true) {\n populateMap[root] = {\n populate: [subPopulate],\n };\n } else {\n populateValue.populate = [subPopulate].concat(populateValue.populate ?? []);\n }\n } else {\n populateMap[root] = {\n populate: [subPopulate],\n };\n }\n } else {\n populateMap[root] = populateMap[root] ? populateMap[root] : true;\n }\n }\n } else {\n populateMap = populate as PopulateMap;\n }\n\n if (!_.isPlainObject(populateMap)) {\n throw new Error('Populate must be an object');\n }\n\n const finalPopulate: PopulateMap = {};\n for (const key of Object.keys(populateMap)) {\n const attribute = meta.attributes[key];\n\n if (!attribute) {\n continue;\n }\n\n if (!types.isRelation(attribute.type)) {\n continue;\n }\n\n // Make sure to query the join column value if needed,\n // so that we can apply the populate later on\n if ('joinColumn' in attribute && attribute.joinColumn) {\n qb.addSelect(attribute.joinColumn.name);\n }\n\n // Make sure id is present for future populate queries\n if (_.has('id', meta.attributes)) {\n qb.addSelect('id');\n }\n\n finalPopulate[key] = populateMap[key];\n }\n\n return finalPopulate;\n};\n\nexport default processPopulate;\n"],"names":["getRootLevelPopulate","meta","populate","attributeName","Object","keys","attributes","attribute","type","processPopulate","ctx","qb","db","uid","metadata","get","populateMap","_","isNil","Array","isArray","key","root","rest","split","length","subPopulate","join","populateValue","concat","isPlainObject","Error","finalPopulate","types","joinColumn","addSelect","name","has"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash/fp');
4
+ var types = require('../../utils/types.js');
5
+ var transform = require('./transform.js');
6
+
7
+ const applySearch = (knex, query, ctx)=>{
8
+ const { qb, uid, db } = ctx;
9
+ const meta = db.metadata.get(uid);
10
+ const { attributes } = meta;
11
+ const searchColumns = [
12
+ 'id'
13
+ ];
14
+ const stringColumns = Object.keys(attributes).filter((attributeName)=>{
15
+ const attribute = attributes[attributeName];
16
+ return types.isScalarAttribute(attribute) && types.isString(attribute.type) && attribute.searchable !== false;
17
+ });
18
+ searchColumns.push(...stringColumns);
19
+ if (!_.isNaN(_.toNumber(query))) {
20
+ const numberColumns = Object.keys(attributes).filter((attributeName)=>{
21
+ const attribute = attributes[attributeName];
22
+ return types.isScalarAttribute(attribute) && types.isNumber(attribute.type) && attribute.searchable !== false;
23
+ });
24
+ searchColumns.push(...numberColumns);
25
+ }
26
+ switch(db.dialect.client){
27
+ case 'postgres':
28
+ {
29
+ searchColumns.forEach((attr)=>{
30
+ const columnName = transform.toColumnName(meta, attr);
31
+ return knex.orWhereRaw(`??::text ILIKE ?`, [
32
+ qb.aliasColumn(columnName),
33
+ `%${escapeQuery(query, '*%\\')}%`
34
+ ]);
35
+ });
36
+ break;
37
+ }
38
+ case 'sqlite':
39
+ {
40
+ searchColumns.forEach((attr)=>{
41
+ const columnName = transform.toColumnName(meta, attr);
42
+ return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\'`, [
43
+ qb.aliasColumn(columnName),
44
+ `%${escapeQuery(query, '*%\\')}%`
45
+ ]);
46
+ });
47
+ break;
48
+ }
49
+ case 'mysql':
50
+ {
51
+ searchColumns.forEach((attr)=>{
52
+ const columnName = transform.toColumnName(meta, attr);
53
+ return knex.orWhereRaw(`?? LIKE ?`, [
54
+ qb.aliasColumn(columnName),
55
+ `%${escapeQuery(query, '*%\\')}%`
56
+ ]);
57
+ });
58
+ break;
59
+ }
60
+ }
61
+ };
62
+ const escapeQuery = (query, charsToEscape, escapeChar = '\\')=>{
63
+ return query.split('').reduce((escapedQuery, char)=>charsToEscape.includes(char) ? `${escapedQuery}${escapeChar}${char}` : `${escapedQuery}${char}`, '');
64
+ };
65
+
66
+ exports.applySearch = applySearch;
67
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nconst escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","_","isNaN","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import _ from 'lodash/fp';
2
+ import { isScalarAttribute, isString, isNumber } from '../../utils/types.mjs';
3
+ import { toColumnName } from './transform.mjs';
4
+
5
+ const applySearch = (knex, query, ctx)=>{
6
+ const { qb, uid, db } = ctx;
7
+ const meta = db.metadata.get(uid);
8
+ const { attributes } = meta;
9
+ const searchColumns = [
10
+ 'id'
11
+ ];
12
+ const stringColumns = Object.keys(attributes).filter((attributeName)=>{
13
+ const attribute = attributes[attributeName];
14
+ return isScalarAttribute(attribute) && isString(attribute.type) && attribute.searchable !== false;
15
+ });
16
+ searchColumns.push(...stringColumns);
17
+ if (!_.isNaN(_.toNumber(query))) {
18
+ const numberColumns = Object.keys(attributes).filter((attributeName)=>{
19
+ const attribute = attributes[attributeName];
20
+ return isScalarAttribute(attribute) && isNumber(attribute.type) && attribute.searchable !== false;
21
+ });
22
+ searchColumns.push(...numberColumns);
23
+ }
24
+ switch(db.dialect.client){
25
+ case 'postgres':
26
+ {
27
+ searchColumns.forEach((attr)=>{
28
+ const columnName = toColumnName(meta, attr);
29
+ return knex.orWhereRaw(`??::text ILIKE ?`, [
30
+ qb.aliasColumn(columnName),
31
+ `%${escapeQuery(query, '*%\\')}%`
32
+ ]);
33
+ });
34
+ break;
35
+ }
36
+ case 'sqlite':
37
+ {
38
+ searchColumns.forEach((attr)=>{
39
+ const columnName = toColumnName(meta, attr);
40
+ return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\'`, [
41
+ qb.aliasColumn(columnName),
42
+ `%${escapeQuery(query, '*%\\')}%`
43
+ ]);
44
+ });
45
+ break;
46
+ }
47
+ case 'mysql':
48
+ {
49
+ searchColumns.forEach((attr)=>{
50
+ const columnName = toColumnName(meta, attr);
51
+ return knex.orWhereRaw(`?? LIKE ?`, [
52
+ qb.aliasColumn(columnName),
53
+ `%${escapeQuery(query, '*%\\')}%`
54
+ ]);
55
+ });
56
+ break;
57
+ }
58
+ }
59
+ };
60
+ const escapeQuery = (query, charsToEscape, escapeChar = '\\')=>{
61
+ return query.split('').reduce((escapedQuery, char)=>charsToEscape.includes(char) ? `${escapedQuery}${escapeChar}${char}` : `${escapedQuery}${char}`, '');
62
+ };
63
+
64
+ export { applySearch };
65
+ //# sourceMappingURL=search.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.mjs","sources":["../../../src/query/helpers/search.ts"],"sourcesContent":["import _ from 'lodash/fp';\nimport type { Knex } from 'knex';\n\nimport * as types from '../../utils/types';\nimport { toColumnName } from './transform';\nimport type { Ctx } from '../types';\n\nexport const applySearch = (knex: Knex.QueryBuilder, query: string, ctx: Ctx) => {\n const { qb, uid, db } = ctx;\n const meta = db.metadata.get(uid);\n\n const { attributes } = meta;\n\n const searchColumns = ['id'];\n\n const stringColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isString(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...stringColumns);\n\n if (!_.isNaN(_.toNumber(query))) {\n const numberColumns = Object.keys(attributes).filter((attributeName) => {\n const attribute = attributes[attributeName];\n return (\n types.isScalarAttribute(attribute) &&\n types.isNumber(attribute.type) &&\n attribute.searchable !== false\n );\n });\n\n searchColumns.push(...numberColumns);\n }\n\n switch (db.dialect.client) {\n case 'postgres': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`??::text ILIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n\n break;\n }\n case 'sqlite': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ? ESCAPE '\\\\'`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n case 'mysql': {\n searchColumns.forEach((attr) => {\n const columnName = toColumnName(meta, attr);\n return knex.orWhereRaw(`?? LIKE ?`, [\n qb.aliasColumn(columnName),\n `%${escapeQuery(query, '*%\\\\')}%`,\n ]);\n });\n break;\n }\n default: {\n // do nothing\n }\n }\n};\n\nconst escapeQuery = (query: string, charsToEscape: string, escapeChar = '\\\\') => {\n return query\n .split('')\n .reduce(\n (escapedQuery, char) =>\n charsToEscape.includes(char)\n ? `${escapedQuery}${escapeChar}${char}`\n : `${escapedQuery}${char}`,\n ''\n );\n};\n"],"names":["applySearch","knex","query","ctx","qb","uid","db","meta","metadata","get","attributes","searchColumns","stringColumns","Object","keys","filter","attributeName","attribute","types","type","searchable","push","_","isNaN","toNumber","numberColumns","dialect","client","forEach","attr","columnName","toColumnName","orWhereRaw","aliasColumn","escapeQuery","charsToEscape","escapeChar","split","reduce","escapedQuery","char","includes"],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ var stream = require('stream');
4
+ var _ = require('lodash/fp');
5
+ var apply = require('../populate/apply.js');
6
+ var transform = require('../transform.js');
7
+
8
+ const knexQueryDone = Symbol('knexQueryDone');
9
+ const knexPerformingQuery = Symbol('knexPerformingQuery');
10
+ class ReadableStrapiQuery extends stream.Readable {
11
+ _destroy(err, cb) {
12
+ // If the stream is destroyed while a query is being made, then wait for a
13
+ // kQueryDone event to be emitted before actually destroying the stream
14
+ if (this[knexPerformingQuery]) {
15
+ this.once(knexQueryDone, (er)=>cb(err || er));
16
+ } else {
17
+ cb(err);
18
+ }
19
+ }
20
+ /**
21
+ * Custom ._read() implementation
22
+ *
23
+ * NOTE: Here "size" means the number of entities to be read from the database.
24
+ * Not the actual byte size, as it would mean that we need to return partial entities.
25
+ *
26
+ */ async _read(size) {
27
+ const query = this._query;
28
+ // Remove the original offset & limit properties from the query
29
+ // Theoretically, they would be replaced by calling them again, but this is just to be sure
30
+ query.clear('limit').clear('offset');
31
+ // Define the maximum read size based on the limit and the requested size
32
+ // NOTE: size is equal to _batchSize by default. Since we want to allow customizing it on
33
+ // the fly, we need to use its value instead of batchSize when computing the maxReadSize value
34
+ const maxReadSize = // if no limit is defined in the query, use the given size,
35
+ // otherwise, use the smallest value between the two
36
+ this._limit === null ? size : Math.min(size, this._limit);
37
+ // Compute the limit for the next query
38
+ const limit = // If a limit is defined
39
+ this._limit !== null && // And reading `maxReadSize` would fetch too many entities (> _limit)
40
+ this._fetched + maxReadSize > this._limit ? this._limit - this._fetched : maxReadSize;
41
+ // If we don't have anything left to read (_limit === _fetched),
42
+ // don't bother making the query and end the stream by pushing null
43
+ if (limit <= 0) {
44
+ this.push(null);
45
+ return;
46
+ }
47
+ // Compute the offset (base offset + number of entities already fetched)
48
+ const offset = this._offset + this._fetched;
49
+ // Update the query with the new values (offset + limit)
50
+ query.offset(offset).limit(limit);
51
+ // Lock the ._destroy()
52
+ this[knexPerformingQuery] = true;
53
+ let results;
54
+ let count;
55
+ let err;
56
+ try {
57
+ // Execute the query and store the results & count
58
+ results = await query;
59
+ const { populate } = this._qb.state;
60
+ // Applies the populate if needed
61
+ if (populate) {
62
+ await apply(results, populate, {
63
+ qb: this._qb,
64
+ uid: this._uid,
65
+ db: this._db
66
+ });
67
+ }
68
+ // Map results if asked to
69
+ if (this._mapResults) {
70
+ results = transform.fromRow(this._meta, results);
71
+ }
72
+ count = results.length;
73
+ } catch (e) {
74
+ err = e;
75
+ }
76
+ // Unlock the ._destroy()
77
+ this[knexPerformingQuery] = false;
78
+ // Tell ._destroy() that it's now safe to close the db connection
79
+ if (this.destroyed) {
80
+ this.emit(knexQueryDone);
81
+ return;
82
+ }
83
+ // If there is an error, destroy with the given error
84
+ if (err) {
85
+ this.destroy(err);
86
+ return;
87
+ }
88
+ // Update the amount of fetched entities
89
+ this._fetched += count;
90
+ // While there is at least one value to unpack
91
+ for (const result of results){
92
+ this.push(result);
93
+ }
94
+ // If the amount of fetched entities is smaller than the
95
+ // maximum read size, Then push null to close the stream
96
+ if (this._fetched === this._limit || count < this._batchSize) {
97
+ this.push(null);
98
+ }
99
+ }
100
+ constructor({ qb, db, uid, mapResults = true, batchSize = 500 }){
101
+ super({
102
+ objectMode: true,
103
+ highWaterMark: batchSize
104
+ });
105
+ // Extract offset & limit from the query-builder's state
106
+ const { offset, limit } = qb.state;
107
+ // Original offset value
108
+ this._offset = _.isFinite(offset) ? Number(offset) : 0;
109
+ // Max amount of entities to fetch, force null as undefined value
110
+ this._limit = _.isFinite(limit) ? Number(limit) : null;
111
+ // Total amount of entities fetched
112
+ this._fetched = 0;
113
+ /**
114
+ * Original query
115
+ */ this._query = qb.getKnexQuery();
116
+ // Query Builder instance
117
+ this._qb = qb;
118
+ // Database related properties
119
+ this._db = db;
120
+ this._uid = uid;
121
+ this._meta = db.metadata.get(uid);
122
+ // Stream params
123
+ this._batchSize = batchSize;
124
+ this._mapResults = mapResults;
125
+ // States
126
+ this[knexPerformingQuery] = false;
127
+ }
128
+ }
129
+
130
+ module.exports = ReadableStrapiQuery;
131
+ //# sourceMappingURL=readable.js.map