@strapi/database 5.12.1 → 5.12.3
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.
- package/dist/connection.js +43 -0
- package/dist/connection.js.map +1 -0
- package/dist/connection.mjs +41 -0
- package/dist/connection.mjs.map +1 -0
- package/dist/dialects/dialect.js +54 -0
- package/dist/dialects/dialect.js.map +1 -0
- package/dist/dialects/dialect.mjs +52 -0
- package/dist/dialects/dialect.mjs.map +1 -0
- package/dist/dialects/index.js +44 -0
- package/dist/dialects/index.js.map +1 -0
- package/dist/dialects/index.mjs +42 -0
- package/dist/dialects/index.mjs.map +1 -0
- package/dist/dialects/mysql/constants.js +8 -0
- package/dist/dialects/mysql/constants.js.map +1 -0
- package/dist/dialects/mysql/constants.mjs +5 -0
- package/dist/dialects/mysql/constants.mjs.map +1 -0
- package/dist/dialects/mysql/database-inspector.js +35 -0
- package/dist/dialects/mysql/database-inspector.js.map +1 -0
- package/dist/dialects/mysql/database-inspector.mjs +33 -0
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -0
- package/dist/dialects/mysql/index.js +75 -0
- package/dist/dialects/mysql/index.js.map +1 -0
- package/dist/dialects/mysql/index.mjs +73 -0
- package/dist/dialects/mysql/index.mjs.map +1 -0
- package/dist/dialects/mysql/schema-inspector.js +297 -0
- package/dist/dialects/mysql/schema-inspector.js.map +1 -0
- package/dist/dialects/mysql/schema-inspector.mjs +295 -0
- package/dist/dialects/mysql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/postgresql/index.js +62 -0
- package/dist/dialects/postgresql/index.js.map +1 -0
- package/dist/dialects/postgresql/index.mjs +60 -0
- package/dist/dialects/postgresql/index.mjs.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.js +316 -0
- package/dist/dialects/postgresql/schema-inspector.js.map +1 -0
- package/dist/dialects/postgresql/schema-inspector.mjs +314 -0
- package/dist/dialects/postgresql/schema-inspector.mjs.map +1 -0
- package/dist/dialects/sqlite/index.js +82 -0
- package/dist/dialects/sqlite/index.js.map +1 -0
- package/dist/dialects/sqlite/index.mjs +80 -0
- package/dist/dialects/sqlite/index.mjs.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.js +211 -0
- package/dist/dialects/sqlite/schema-inspector.js.map +1 -0
- package/dist/dialects/sqlite/schema-inspector.mjs +209 -0
- package/dist/dialects/sqlite/schema-inspector.mjs.map +1 -0
- package/dist/entity-manager/entity-repository.js +139 -0
- package/dist/entity-manager/entity-repository.js.map +1 -0
- package/dist/entity-manager/entity-repository.mjs +137 -0
- package/dist/entity-manager/entity-repository.mjs.map +1 -0
- package/dist/entity-manager/index.js +1186 -0
- package/dist/entity-manager/index.js.map +1 -0
- package/dist/entity-manager/index.mjs +1184 -0
- package/dist/entity-manager/index.mjs.map +1 -0
- package/dist/entity-manager/morph-relations.js +73 -0
- package/dist/entity-manager/morph-relations.js.map +1 -0
- package/dist/entity-manager/morph-relations.mjs +69 -0
- package/dist/entity-manager/morph-relations.mjs.map +1 -0
- package/dist/entity-manager/regular-relations.js +247 -0
- package/dist/entity-manager/regular-relations.js.map +1 -0
- package/dist/entity-manager/regular-relations.mjs +242 -0
- package/dist/entity-manager/regular-relations.mjs.map +1 -0
- package/dist/entity-manager/relations-orderer.js +221 -0
- package/dist/entity-manager/relations-orderer.js.map +1 -0
- package/dist/entity-manager/relations-orderer.mjs +218 -0
- package/dist/entity-manager/relations-orderer.mjs.map +1 -0
- package/dist/errors/database.js +13 -0
- package/dist/errors/database.js.map +1 -0
- package/dist/errors/database.mjs +11 -0
- package/dist/errors/database.mjs.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/index.mjs +7 -0
- package/dist/errors/index.mjs.map +1 -0
- package/dist/errors/invalid-date.js +13 -0
- package/dist/errors/invalid-date.js.map +1 -0
- package/dist/errors/invalid-date.mjs +11 -0
- package/dist/errors/invalid-date.mjs.map +1 -0
- package/dist/errors/invalid-datetime.js +13 -0
- package/dist/errors/invalid-datetime.js.map +1 -0
- package/dist/errors/invalid-datetime.mjs +11 -0
- package/dist/errors/invalid-datetime.mjs.map +1 -0
- package/dist/errors/invalid-relation.js +13 -0
- package/dist/errors/invalid-relation.js.map +1 -0
- package/dist/errors/invalid-relation.mjs +11 -0
- package/dist/errors/invalid-relation.mjs.map +1 -0
- package/dist/errors/invalid-time.js +13 -0
- package/dist/errors/invalid-time.js.map +1 -0
- package/dist/errors/invalid-time.mjs +11 -0
- package/dist/errors/invalid-time.mjs.map +1 -0
- package/dist/errors/not-null.js +17 -0
- package/dist/errors/not-null.js.map +1 -0
- package/dist/errors/not-null.mjs +15 -0
- package/dist/errors/not-null.mjs.map +1 -0
- package/dist/fields/biginteger.js +9 -0
- package/dist/fields/biginteger.js.map +1 -0
- package/dist/fields/biginteger.mjs +7 -0
- package/dist/fields/biginteger.mjs.map +1 -0
- package/dist/fields/boolean.js +48 -0
- package/dist/fields/boolean.js.map +1 -0
- package/dist/fields/boolean.mjs +46 -0
- package/dist/fields/boolean.mjs.map +1 -0
- package/dist/fields/date.js +16 -0
- package/dist/fields/date.js.map +1 -0
- package/dist/fields/date.mjs +14 -0
- package/dist/fields/date.mjs.map +1 -0
- package/dist/fields/datetime.js +37 -0
- package/dist/fields/datetime.js.map +1 -0
- package/dist/fields/datetime.mjs +16 -0
- package/dist/fields/datetime.mjs.map +1 -0
- package/dist/fields/field.js +16 -0
- package/dist/fields/field.js.map +1 -0
- package/dist/fields/field.mjs +14 -0
- package/dist/fields/field.mjs.map +1 -0
- package/dist/fields/index.js +45 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/fields/index.mjs +43 -0
- package/dist/fields/index.mjs.map +1 -0
- package/dist/fields/json.js +36 -0
- package/dist/fields/json.js.map +1 -0
- package/dist/fields/json.mjs +34 -0
- package/dist/fields/json.mjs.map +1 -0
- package/dist/fields/number.js +20 -0
- package/dist/fields/number.js.map +1 -0
- package/dist/fields/number.mjs +18 -0
- package/dist/fields/number.mjs.map +1 -0
- package/dist/fields/shared/parsers.js +91 -0
- package/dist/fields/shared/parsers.js.map +1 -0
- package/dist/fields/shared/parsers.mjs +68 -0
- package/dist/fields/shared/parsers.mjs.map +1 -0
- package/dist/fields/string.js +16 -0
- package/dist/fields/string.js.map +1 -0
- package/dist/fields/string.mjs +14 -0
- package/dist/fields/string.mjs.map +1 -0
- package/dist/fields/time.js +17 -0
- package/dist/fields/time.js.map +1 -0
- package/dist/fields/time.mjs +15 -0
- package/dist/fields/time.mjs.map +1 -0
- package/dist/fields/timestamp.js +37 -0
- package/dist/fields/timestamp.js.map +1 -0
- package/dist/fields/timestamp.mjs +16 -0
- package/dist/fields/timestamp.mjs.map +1 -0
- package/dist/index.js +33 -8569
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -8532
- package/dist/index.mjs.map +1 -1
- package/dist/lifecycles/index.js +73 -0
- package/dist/lifecycles/index.js.map +1 -0
- package/dist/lifecycles/index.mjs +71 -0
- package/dist/lifecycles/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/index.js +10 -0
- package/dist/lifecycles/subscribers/index.js.map +1 -0
- package/dist/lifecycles/subscribers/index.mjs +8 -0
- package/dist/lifecycles/subscribers/index.mjs.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js +13 -0
- package/dist/lifecycles/subscribers/models-lifecycles.js.map +1 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs +11 -0
- package/dist/lifecycles/subscribers/models-lifecycles.mjs.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.js +55 -0
- package/dist/lifecycles/subscribers/timestamps.js.map +1 -0
- package/dist/lifecycles/subscribers/timestamps.mjs +53 -0
- package/dist/lifecycles/subscribers/timestamps.mjs.map +1 -0
- package/dist/metadata/index.js +24 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/metadata/index.mjs +16 -0
- package/dist/metadata/index.mjs.map +1 -0
- package/dist/metadata/metadata.js +100 -0
- package/dist/metadata/metadata.js.map +1 -0
- package/dist/metadata/metadata.mjs +98 -0
- package/dist/metadata/metadata.mjs.map +1 -0
- package/dist/metadata/relations.js +545 -0
- package/dist/metadata/relations.js.map +1 -0
- package/dist/metadata/relations.mjs +536 -0
- package/dist/metadata/relations.mjs.map +1 -0
- package/dist/migrations/common.js +8 -0
- package/dist/migrations/common.js.map +1 -0
- package/dist/migrations/common.mjs +6 -0
- package/dist/migrations/common.mjs.map +1 -0
- package/dist/migrations/index.js +39 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/index.mjs +37 -0
- package/dist/migrations/index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js +179 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs +177 -0
- package/dist/migrations/internal-migrations/5.0.0-01-convert-identifiers-long-than-max-length.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js +125 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs +123 -0
- package/dist/migrations/internal-migrations/5.0.0-02-document-id.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js +41 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs +39 -0
- package/dist/migrations/internal-migrations/5.0.0-03-locale.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js +45 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs +43 -0
- package/dist/migrations/internal-migrations/5.0.0-04-published-at.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +43 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +41 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -0
- package/dist/migrations/internal-migrations/index.js +26 -0
- package/dist/migrations/internal-migrations/index.js.map +1 -0
- package/dist/migrations/internal-migrations/index.mjs +24 -0
- package/dist/migrations/internal-migrations/index.mjs.map +1 -0
- package/dist/migrations/internal.js +63 -0
- package/dist/migrations/internal.js.map +1 -0
- package/dist/migrations/internal.mjs +61 -0
- package/dist/migrations/internal.mjs.map +1 -0
- package/dist/migrations/logger.js +24 -0
- package/dist/migrations/logger.js.map +1 -0
- package/dist/migrations/logger.mjs +22 -0
- package/dist/migrations/logger.mjs.map +1 -0
- package/dist/migrations/storage.js +39 -0
- package/dist/migrations/storage.js.map +1 -0
- package/dist/migrations/storage.mjs +37 -0
- package/dist/migrations/storage.mjs.map +1 -0
- package/dist/migrations/users.js +87 -0
- package/dist/migrations/users.js.map +1 -0
- package/dist/migrations/users.mjs +85 -0
- package/dist/migrations/users.mjs.map +1 -0
- package/dist/query/helpers/join.js +127 -0
- package/dist/query/helpers/join.js.map +1 -0
- package/dist/query/helpers/join.mjs +122 -0
- package/dist/query/helpers/join.mjs.map +1 -0
- package/dist/query/helpers/order-by.js +167 -0
- package/dist/query/helpers/order-by.js.map +1 -0
- package/dist/query/helpers/order-by.mjs +163 -0
- package/dist/query/helpers/order-by.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.js +592 -0
- package/dist/query/helpers/populate/apply.js.map +1 -0
- package/dist/query/helpers/populate/apply.mjs +590 -0
- package/dist/query/helpers/populate/apply.mjs.map +1 -0
- package/dist/query/helpers/populate/process.js +92 -0
- package/dist/query/helpers/populate/process.js.map +1 -0
- package/dist/query/helpers/populate/process.mjs +90 -0
- package/dist/query/helpers/populate/process.mjs.map +1 -0
- package/dist/query/helpers/search.js +67 -0
- package/dist/query/helpers/search.js.map +1 -0
- package/dist/query/helpers/search.mjs +65 -0
- package/dist/query/helpers/search.mjs.map +1 -0
- package/dist/query/helpers/streams/readable.js +131 -0
- package/dist/query/helpers/streams/readable.js.map +1 -0
- package/dist/query/helpers/streams/readable.mjs +129 -0
- package/dist/query/helpers/streams/readable.mjs.map +1 -0
- package/dist/query/helpers/transform.js +77 -0
- package/dist/query/helpers/transform.js.map +1 -0
- package/dist/query/helpers/transform.mjs +73 -0
- package/dist/query/helpers/transform.mjs.map +1 -0
- package/dist/query/helpers/where.js +372 -0
- package/dist/query/helpers/where.js.map +1 -0
- package/dist/query/helpers/where.mjs +369 -0
- package/dist/query/helpers/where.mjs.map +1 -0
- package/dist/query/query-builder.js +507 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/query-builder.mjs +505 -0
- package/dist/query/query-builder.mjs.map +1 -0
- package/dist/repairs/index.js +13 -0
- package/dist/repairs/index.js.map +1 -0
- package/dist/repairs/index.mjs +11 -0
- package/dist/repairs/index.mjs.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js +54 -0
- package/dist/repairs/operations/remove-orphan-morph-types.js.map +1 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs +52 -0
- package/dist/repairs/operations/remove-orphan-morph-types.mjs.map +1 -0
- package/dist/schema/builder.js +354 -0
- package/dist/schema/builder.js.map +1 -0
- package/dist/schema/builder.mjs +352 -0
- package/dist/schema/builder.mjs.map +1 -0
- package/dist/schema/diff.js +379 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/diff.mjs +377 -0
- package/dist/schema/diff.mjs.map +1 -0
- package/dist/schema/index.js +93 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/index.mjs +91 -0
- package/dist/schema/index.mjs.map +1 -0
- package/dist/schema/schema.js +266 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.mjs +264 -0
- package/dist/schema/schema.mjs.map +1 -0
- package/dist/schema/storage.js +58 -0
- package/dist/schema/storage.js.map +1 -0
- package/dist/schema/storage.mjs +56 -0
- package/dist/schema/storage.mjs.map +1 -0
- package/dist/transaction-context.js +65 -0
- package/dist/transaction-context.js.map +1 -0
- package/dist/transaction-context.mjs +63 -0
- package/dist/transaction-context.mjs.map +1 -0
- package/dist/utils/async-curry.js +19 -0
- package/dist/utils/async-curry.js.map +1 -0
- package/dist/utils/async-curry.mjs +17 -0
- package/dist/utils/async-curry.mjs.map +1 -0
- package/dist/utils/identifiers/hash.js +30 -0
- package/dist/utils/identifiers/hash.js.map +1 -0
- package/dist/utils/identifiers/hash.mjs +28 -0
- package/dist/utils/identifiers/hash.mjs.map +1 -0
- package/dist/utils/identifiers/index.js +414 -0
- package/dist/utils/identifiers/index.js.map +1 -0
- package/dist/utils/identifiers/index.mjs +411 -0
- package/dist/utils/identifiers/index.mjs.map +1 -0
- package/dist/utils/knex.js +21 -0
- package/dist/utils/knex.js.map +1 -0
- package/dist/utils/knex.mjs +18 -0
- package/dist/utils/knex.mjs.map +1 -0
- package/dist/utils/types.js +51 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/types.mjs +44 -0
- package/dist/utils/types.mjs.map +1 -0
- package/dist/validations/index.js +12 -0
- package/dist/validations/index.js.map +1 -0
- package/dist/validations/index.mjs +10 -0
- package/dist/validations/index.mjs.map +1 -0
- package/dist/validations/relations/bidirectional.js +64 -0
- package/dist/validations/relations/bidirectional.js.map +1 -0
- package/dist/validations/relations/bidirectional.mjs +62 -0
- package/dist/validations/relations/bidirectional.mjs.map +1 -0
- package/dist/validations/relations/index.js +13 -0
- package/dist/validations/relations/index.js.map +1 -0
- package/dist/validations/relations/index.mjs +11 -0
- package/dist/validations/relations/index.mjs.map +1 -0
- 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
|