@payloadcms/drizzle 3.81.0-internal.181753b → 3.82.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +2 -1
- package/dist/create.js.map +1 -1
- package/dist/deleteMany.d.ts.map +1 -1
- package/dist/deleteMany.js +2 -0
- package/dist/deleteMany.js.map +1 -1
- package/dist/deleteOne.d.ts.map +1 -1
- package/dist/deleteOne.js +2 -0
- package/dist/deleteOne.js.map +1 -1
- package/dist/deleteVersions.d.ts.map +1 -1
- package/dist/deleteVersions.js +2 -0
- package/dist/deleteVersions.js.map +1 -1
- package/dist/find/buildFindManyArgs.d.ts +3 -28
- package/dist/find/buildFindManyArgs.d.ts.map +1 -1
- package/dist/find/buildFindManyArgs.js +1 -4
- package/dist/find/buildFindManyArgs.js.map +1 -1
- package/dist/find/findMany.d.ts.map +1 -1
- package/dist/find/findMany.js +1 -61
- package/dist/find/findMany.js.map +1 -1
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +27 -53
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +27 -5
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/updateJobs.d.ts.map +1 -1
- package/dist/updateJobs.js +2 -1
- package/dist/updateJobs.js.map +1 -1
- package/dist/updateMany.d.ts.map +1 -1
- package/dist/updateMany.js +2 -1
- package/dist/updateMany.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +2 -1
- package/dist/updateOne.js.map +1 -1
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +2 -0
- package/dist/upsertRow/index.js.map +1 -1
- package/dist/utilities/getPrimaryDb.d.ts +6 -0
- package/dist/utilities/getPrimaryDb.d.ts.map +1 -0
- package/dist/utilities/getPrimaryDb.js +10 -0
- package/dist/utilities/getPrimaryDb.js.map +1 -0
- package/dist/utilities/getTransaction.d.ts +3 -0
- package/dist/utilities/getTransaction.d.ts.map +1 -1
- package/dist/utilities/getTransaction.js +7 -0
- package/dist/utilities/getTransaction.js.map +1 -1
- package/dist/utilities/readAfterWrite.d.ts +17 -0
- package/dist/utilities/readAfterWrite.d.ts.map +1 -0
- package/dist/utilities/readAfterWrite.js +21 -0
- package/dist/utilities/readAfterWrite.js.map +1 -0
- package/package.json +3 -3
package/dist/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAUrC,eAAO,MAAM,MAAM,EAAE,MA6BpB,CAAA"}
|
package/dist/create.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import toSnakeCase from 'to-snake-case';
|
|
2
2
|
import { upsertRow } from './upsertRow/index.js';
|
|
3
|
+
import { getPrimaryDb } from './utilities/getPrimaryDb.js';
|
|
3
4
|
import { getTransaction } from './utilities/getTransaction.js';
|
|
4
5
|
export const create = async function create({ collection: collectionSlug, customID, data, req, returning, select }) {
|
|
5
6
|
const collection = this.payload.collections[collectionSlug].config;
|
|
6
7
|
const tableName = this.tableNameMap.get(toSnakeCase(collection.slug));
|
|
7
|
-
const db = await getTransaction(this, req);
|
|
8
|
+
const db = getPrimaryDb(this, await getTransaction(this, req));
|
|
8
9
|
const result = await upsertRow({
|
|
9
10
|
adapter: this,
|
|
10
11
|
collectionSlug,
|
package/dist/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/create.ts"],"sourcesContent":["import type { Create } from 'payload'\n\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { upsertRow } from './upsertRow/index.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const create: Create = async function create(\n this: DrizzleAdapter,\n { collection: collectionSlug, customID, data, req, returning, select },\n) {\n const collection = this.payload.collections[collectionSlug].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n\n const db = await getTransaction(this, req)\n\n const result = await upsertRow({\n adapter: this,\n collectionSlug,\n customID,\n data,\n db,\n fields: collection.flattenedFields,\n ignoreResult: returning === false,\n operation: 'create',\n req,\n select,\n tableName,\n })\n\n if (returning === false) {\n return null\n }\n\n return result\n}\n"],"names":["toSnakeCase","upsertRow","getTransaction","create","collection","collectionSlug","customID","data","req","returning","select","payload","collections","config","tableName","tableNameMap","get","slug","db","result","adapter","fields","flattenedFields","ignoreResult","operation"],"mappings":"AAEA,OAAOA,iBAAiB,gBAAe;AAIvC,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,cAAc,QAAQ,gCAA+B;AAE9D,OAAO,MAAMC,SAAiB,eAAeA,OAE3C,EAAEC,YAAYC,cAAc,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAE;IAEtE,MAAMN,aAAa,IAAI,CAACO,OAAO,CAACC,WAAW,CAACP,eAAe,CAACQ,MAAM;IAElE,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,
|
|
1
|
+
{"version":3,"sources":["../src/create.ts"],"sourcesContent":["import type { Create } from 'payload'\n\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { upsertRow } from './upsertRow/index.js'\nimport { getPrimaryDb } from './utilities/getPrimaryDb.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const create: Create = async function create(\n this: DrizzleAdapter,\n { collection: collectionSlug, customID, data, req, returning, select },\n) {\n const collection = this.payload.collections[collectionSlug].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n\n const db = getPrimaryDb(this, await getTransaction(this, req))\n\n const result = await upsertRow({\n adapter: this,\n collectionSlug,\n customID,\n data,\n db,\n fields: collection.flattenedFields,\n ignoreResult: returning === false,\n operation: 'create',\n req,\n select,\n tableName,\n })\n\n if (returning === false) {\n return null\n }\n\n return result\n}\n"],"names":["toSnakeCase","upsertRow","getPrimaryDb","getTransaction","create","collection","collectionSlug","customID","data","req","returning","select","payload","collections","config","tableName","tableNameMap","get","slug","db","result","adapter","fields","flattenedFields","ignoreResult","operation"],"mappings":"AAEA,OAAOA,iBAAiB,gBAAe;AAIvC,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,YAAY,QAAQ,8BAA6B;AAC1D,SAASC,cAAc,QAAQ,gCAA+B;AAE9D,OAAO,MAAMC,SAAiB,eAAeA,OAE3C,EAAEC,YAAYC,cAAc,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAE;IAEtE,MAAMN,aAAa,IAAI,CAACO,OAAO,CAACC,WAAW,CAACP,eAAe,CAACQ,MAAM;IAElE,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,CAACjB,YAAYK,WAAWa,IAAI;IAEnE,MAAMC,KAAKjB,aAAa,IAAI,EAAE,MAAMC,eAAe,IAAI,EAAEM;IAEzD,MAAMW,SAAS,MAAMnB,UAAU;QAC7BoB,SAAS,IAAI;QACbf;QACAC;QACAC;QACAW;QACAG,QAAQjB,WAAWkB,eAAe;QAClCC,cAAcd,cAAc;QAC5Be,WAAW;QACXhB;QACAE;QACAI;IACF;IAEA,IAAIL,cAAc,OAAO;QACvB,OAAO;IACT;IAEA,OAAOU;AACT,EAAC"}
|
package/dist/deleteMany.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteMany.d.ts","sourceRoot":"","sources":["../src/deleteMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"deleteMany.d.ts","sourceRoot":"","sources":["../src/deleteMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAYzC,eAAO,MAAM,UAAU,EAAE,UAsDxB,CAAA"}
|
package/dist/deleteMany.js
CHANGED
|
@@ -3,6 +3,7 @@ import toSnakeCase from 'to-snake-case';
|
|
|
3
3
|
import { findMany } from './find/findMany.js';
|
|
4
4
|
import { buildQuery } from './queries/buildQuery.js';
|
|
5
5
|
import { getTransaction } from './utilities/getTransaction.js';
|
|
6
|
+
import { markWrite } from './utilities/readAfterWrite.js';
|
|
6
7
|
export const deleteMany = async function deleteMany({ collection, req, where: whereArg }) {
|
|
7
8
|
const collectionConfig = this.payload.collections[collection].config;
|
|
8
9
|
const tableName = this.tableNameMap.get(toSnakeCase(collectionConfig.slug));
|
|
@@ -41,6 +42,7 @@ export const deleteMany = async function deleteMany({ collection, req, where: wh
|
|
|
41
42
|
tableName,
|
|
42
43
|
where: whereToUse
|
|
43
44
|
});
|
|
45
|
+
markWrite(this);
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
//# sourceMappingURL=deleteMany.js.map
|
package/dist/deleteMany.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deleteMany.ts"],"sourcesContent":["import type { DeleteMany } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const deleteMany: DeleteMany = async function deleteMany(\n this: DrizzleAdapter,\n { collection, req, where: whereArg },\n) {\n const collectionConfig = this.payload.collections[collection].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collectionConfig.slug))\n\n const table = this.tables[tableName]\n\n const { joins, where } = buildQuery({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n locale: req?.locale,\n tableName,\n where: whereArg,\n })\n\n let whereToUse = where\n\n if (joins?.length) {\n // Difficult to support joins (through where referencing other tables) in deleteMany. => 2 separate queries.\n // We can look into supporting this using one single query (through a subquery) in the future, though that's difficult to do in a generic way.\n const result = await findMany({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n joins: false,\n limit: 0,\n locale: req?.locale,\n page: 1,\n pagination: false,\n req,\n select: {\n id: true,\n },\n tableName,\n where: whereArg,\n })\n\n whereToUse = inArray(\n table.id,\n result.docs.map((doc) => doc.id),\n )\n }\n\n const db = await getTransaction(this, req)\n\n await this.deleteWhere({\n db,\n tableName,\n where: whereToUse,\n })\n}\n"],"names":["inArray","toSnakeCase","findMany","buildQuery","getTransaction","deleteMany","collection","req","where","whereArg","collectionConfig","payload","collections","config","tableName","tableNameMap","get","slug","table","tables","joins","adapter","fields","flattenedFields","locale","whereToUse","length","result","limit","page","pagination","select","id","docs","map","doc","db","deleteWhere"],"mappings":"AAEA,SAASA,OAAO,QAAQ,cAAa;AACrC,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAC7C,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,gCAA+B;
|
|
1
|
+
{"version":3,"sources":["../src/deleteMany.ts"],"sourcesContent":["import type { DeleteMany } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { getTransaction } from './utilities/getTransaction.js'\nimport { markWrite } from './utilities/readAfterWrite.js'\n\nexport const deleteMany: DeleteMany = async function deleteMany(\n this: DrizzleAdapter,\n { collection, req, where: whereArg },\n) {\n const collectionConfig = this.payload.collections[collection].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collectionConfig.slug))\n\n const table = this.tables[tableName]\n\n const { joins, where } = buildQuery({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n locale: req?.locale,\n tableName,\n where: whereArg,\n })\n\n let whereToUse = where\n\n if (joins?.length) {\n // Difficult to support joins (through where referencing other tables) in deleteMany. => 2 separate queries.\n // We can look into supporting this using one single query (through a subquery) in the future, though that's difficult to do in a generic way.\n const result = await findMany({\n adapter: this,\n fields: collectionConfig.flattenedFields,\n joins: false,\n limit: 0,\n locale: req?.locale,\n page: 1,\n pagination: false,\n req,\n select: {\n id: true,\n },\n tableName,\n where: whereArg,\n })\n\n whereToUse = inArray(\n table.id,\n result.docs.map((doc) => doc.id),\n )\n }\n\n const db = await getTransaction(this, req)\n\n await this.deleteWhere({\n db,\n tableName,\n where: whereToUse,\n })\n\n markWrite(this)\n}\n"],"names":["inArray","toSnakeCase","findMany","buildQuery","getTransaction","markWrite","deleteMany","collection","req","where","whereArg","collectionConfig","payload","collections","config","tableName","tableNameMap","get","slug","table","tables","joins","adapter","fields","flattenedFields","locale","whereToUse","length","result","limit","page","pagination","select","id","docs","map","doc","db","deleteWhere"],"mappings":"AAEA,SAASA,OAAO,QAAQ,cAAa;AACrC,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAC7C,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,SAAS,QAAQ,gCAA+B;AAEzD,OAAO,MAAMC,aAAyB,eAAeA,WAEnD,EAAEC,UAAU,EAAEC,GAAG,EAAEC,OAAOC,QAAQ,EAAE;IAEpC,MAAMC,mBAAmB,IAAI,CAACC,OAAO,CAACC,WAAW,CAACN,WAAW,CAACO,MAAM;IAEpE,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,CAAChB,YAAYU,iBAAiBO,IAAI;IAEzE,MAAMC,QAAQ,IAAI,CAACC,MAAM,CAACL,UAAU;IAEpC,MAAM,EAAEM,KAAK,EAAEZ,KAAK,EAAE,GAAGN,WAAW;QAClCmB,SAAS,IAAI;QACbC,QAAQZ,iBAAiBa,eAAe;QACxCC,QAAQjB,KAAKiB;QACbV;QACAN,OAAOC;IACT;IAEA,IAAIgB,aAAajB;IAEjB,IAAIY,OAAOM,QAAQ;QACjB,4GAA4G;QAC5G,8IAA8I;QAC9I,MAAMC,SAAS,MAAM1B,SAAS;YAC5BoB,SAAS,IAAI;YACbC,QAAQZ,iBAAiBa,eAAe;YACxCH,OAAO;YACPQ,OAAO;YACPJ,QAAQjB,KAAKiB;YACbK,MAAM;YACNC,YAAY;YACZvB;YACAwB,QAAQ;gBACNC,IAAI;YACN;YACAlB;YACAN,OAAOC;QACT;QAEAgB,aAAa1B,QACXmB,MAAMc,EAAE,EACRL,OAAOM,IAAI,CAACC,GAAG,CAAC,CAACC,MAAQA,IAAIH,EAAE;IAEnC;IAEA,MAAMI,KAAK,MAAMjC,eAAe,IAAI,EAAEI;IAEtC,MAAM,IAAI,CAAC8B,WAAW,CAAC;QACrBD;QACAtB;QACAN,OAAOiB;IACT;IAEArB,UAAU,IAAI;AAChB,EAAC"}
|
package/dist/deleteOne.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteOne.d.ts","sourceRoot":"","sources":["../src/deleteOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"deleteOne.d.ts","sourceRoot":"","sources":["../src/deleteOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAcxC,eAAO,MAAM,SAAS,EAAE,SA0EvB,CAAA"}
|
package/dist/deleteOne.js
CHANGED
|
@@ -5,6 +5,7 @@ import { buildQuery } from './queries/buildQuery.js';
|
|
|
5
5
|
import { selectDistinct } from './queries/selectDistinct.js';
|
|
6
6
|
import { transform } from './transform/read/index.js';
|
|
7
7
|
import { getTransaction } from './utilities/getTransaction.js';
|
|
8
|
+
import { markWrite } from './utilities/readAfterWrite.js';
|
|
8
9
|
export const deleteOne = async function deleteOne({ collection: collectionSlug, req, returning, select, where: whereArg }) {
|
|
9
10
|
const collection = this.payload.collections[collectionSlug].config;
|
|
10
11
|
const tableName = this.tableNameMap.get(toSnakeCase(collection.slug));
|
|
@@ -58,6 +59,7 @@ export const deleteOne = async function deleteOne({ collection: collectionSlug,
|
|
|
58
59
|
tableName,
|
|
59
60
|
where: eq(this.tables[tableName].id, docToDelete.id)
|
|
60
61
|
});
|
|
62
|
+
markWrite(this);
|
|
61
63
|
return result;
|
|
62
64
|
};
|
|
63
65
|
|
package/dist/deleteOne.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deleteOne.ts"],"sourcesContent":["import type { DeleteOne } from 'payload'\n\nimport { eq } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { buildFindManyArgs } from './find/buildFindManyArgs.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { selectDistinct } from './queries/selectDistinct.js'\nimport { transform } from './transform/read/index.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const deleteOne: DeleteOne = async function deleteOne(\n this: DrizzleAdapter,\n { collection: collectionSlug, req, returning, select, where: whereArg },\n) {\n const collection = this.payload.collections[collectionSlug].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n\n let docToDelete: Record<string, unknown>\n\n const { joins, selectFields, where } = buildQuery({\n adapter: this,\n fields: collection.flattenedFields,\n locale: req?.locale,\n tableName,\n where: whereArg,\n })\n\n const db = await getTransaction(this, req)\n\n const selectDistinctResult = await selectDistinct({\n adapter: this,\n db,\n joins,\n query: ({ query }) => query.limit(1),\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult?.[0]?.id) {\n docToDelete = await db.query[tableName].findFirst({\n where: eq(this.tables[tableName].id, selectDistinctResult[0].id),\n })\n } else {\n const findManyArgs = buildFindManyArgs({\n adapter: this,\n depth: 0,\n fields: collection.flattenedFields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = where\n\n docToDelete = await db.query[tableName].findFirst(findManyArgs)\n }\n\n if (!docToDelete) {\n return null\n }\n\n const result =\n returning === false\n ? null\n : transform({\n adapter: this,\n config: this.payload.config,\n data: docToDelete,\n fields: collection.flattenedFields,\n joinQuery: false,\n tableName,\n })\n\n await this.deleteWhere({\n db,\n tableName,\n where: eq(this.tables[tableName].id, docToDelete.id),\n })\n\n return result\n}\n"],"names":["eq","toSnakeCase","buildFindManyArgs","buildQuery","selectDistinct","transform","getTransaction","deleteOne","collection","collectionSlug","req","returning","select","where","whereArg","payload","collections","config","tableName","tableNameMap","get","slug","docToDelete","joins","selectFields","adapter","fields","flattenedFields","locale","db","selectDistinctResult","query","limit","id","findFirst","tables","findManyArgs","depth","joinQuery","result","data","deleteWhere"],"mappings":"AAEA,SAASA,EAAE,QAAQ,cAAa;AAChC,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,cAAc,QAAQ,gCAA+B;
|
|
1
|
+
{"version":3,"sources":["../src/deleteOne.ts"],"sourcesContent":["import type { DeleteOne } from 'payload'\n\nimport { eq } from 'drizzle-orm'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { buildFindManyArgs } from './find/buildFindManyArgs.js'\nimport { buildQuery } from './queries/buildQuery.js'\nimport { selectDistinct } from './queries/selectDistinct.js'\nimport { transform } from './transform/read/index.js'\nimport { getTransaction } from './utilities/getTransaction.js'\nimport { markWrite } from './utilities/readAfterWrite.js'\n\nexport const deleteOne: DeleteOne = async function deleteOne(\n this: DrizzleAdapter,\n { collection: collectionSlug, req, returning, select, where: whereArg },\n) {\n const collection = this.payload.collections[collectionSlug].config\n\n const tableName = this.tableNameMap.get(toSnakeCase(collection.slug))\n\n let docToDelete: Record<string, unknown>\n\n const { joins, selectFields, where } = buildQuery({\n adapter: this,\n fields: collection.flattenedFields,\n locale: req?.locale,\n tableName,\n where: whereArg,\n })\n\n const db = await getTransaction(this, req)\n\n const selectDistinctResult = await selectDistinct({\n adapter: this,\n db,\n joins,\n query: ({ query }) => query.limit(1),\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult?.[0]?.id) {\n docToDelete = await db.query[tableName].findFirst({\n where: eq(this.tables[tableName].id, selectDistinctResult[0].id),\n })\n } else {\n const findManyArgs = buildFindManyArgs({\n adapter: this,\n depth: 0,\n fields: collection.flattenedFields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = where\n\n docToDelete = await db.query[tableName].findFirst(findManyArgs)\n }\n\n if (!docToDelete) {\n return null\n }\n\n const result =\n returning === false\n ? null\n : transform({\n adapter: this,\n config: this.payload.config,\n data: docToDelete,\n fields: collection.flattenedFields,\n joinQuery: false,\n tableName,\n })\n\n await this.deleteWhere({\n db,\n tableName,\n where: eq(this.tables[tableName].id, docToDelete.id),\n })\n\n markWrite(this)\n\n return result\n}\n"],"names":["eq","toSnakeCase","buildFindManyArgs","buildQuery","selectDistinct","transform","getTransaction","markWrite","deleteOne","collection","collectionSlug","req","returning","select","where","whereArg","payload","collections","config","tableName","tableNameMap","get","slug","docToDelete","joins","selectFields","adapter","fields","flattenedFields","locale","db","selectDistinctResult","query","limit","id","findFirst","tables","findManyArgs","depth","joinQuery","result","data","deleteWhere"],"mappings":"AAEA,SAASA,EAAE,QAAQ,cAAa;AAChC,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,UAAU,QAAQ,0BAAyB;AACpD,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,SAAS,QAAQ,4BAA2B;AACrD,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,SAAS,QAAQ,gCAA+B;AAEzD,OAAO,MAAMC,YAAuB,eAAeA,UAEjD,EAAEC,YAAYC,cAAc,EAAEC,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAEC,OAAOC,QAAQ,EAAE;IAEvE,MAAMN,aAAa,IAAI,CAACO,OAAO,CAACC,WAAW,CAACP,eAAe,CAACQ,MAAM;IAElE,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,CAACpB,YAAYQ,WAAWa,IAAI;IAEnE,IAAIC;IAEJ,MAAM,EAAEC,KAAK,EAAEC,YAAY,EAAEX,KAAK,EAAE,GAAGX,WAAW;QAChDuB,SAAS,IAAI;QACbC,QAAQlB,WAAWmB,eAAe;QAClCC,QAAQlB,KAAKkB;QACbV;QACAL,OAAOC;IACT;IAEA,MAAMe,KAAK,MAAMxB,eAAe,IAAI,EAAEK;IAEtC,MAAMoB,uBAAuB,MAAM3B,eAAe;QAChDsB,SAAS,IAAI;QACbI;QACAN;QACAQ,OAAO,CAAC,EAAEA,KAAK,EAAE,GAAKA,MAAMC,KAAK,CAAC;QAClCR;QACAN;QACAL;IACF;IAEA,IAAIiB,sBAAsB,CAAC,EAAE,EAAEG,IAAI;QACjCX,cAAc,MAAMO,GAAGE,KAAK,CAACb,UAAU,CAACgB,SAAS,CAAC;YAChDrB,OAAOd,GAAG,IAAI,CAACoC,MAAM,CAACjB,UAAU,CAACe,EAAE,EAAEH,oBAAoB,CAAC,EAAE,CAACG,EAAE;QACjE;IACF,OAAO;QACL,MAAMG,eAAenC,kBAAkB;YACrCwB,SAAS,IAAI;YACbY,OAAO;YACPX,QAAQlB,WAAWmB,eAAe;YAClCW,WAAW;YACX1B;YACAM;QACF;QAEAkB,aAAavB,KAAK,GAAGA;QAErBS,cAAc,MAAMO,GAAGE,KAAK,CAACb,UAAU,CAACgB,SAAS,CAACE;IACpD;IAEA,IAAI,CAACd,aAAa;QAChB,OAAO;IACT;IAEA,MAAMiB,SACJ5B,cAAc,QACV,OACAP,UAAU;QACRqB,SAAS,IAAI;QACbR,QAAQ,IAAI,CAACF,OAAO,CAACE,MAAM;QAC3BuB,MAAMlB;QACNI,QAAQlB,WAAWmB,eAAe;QAClCW,WAAW;QACXpB;IACF;IAEN,MAAM,IAAI,CAACuB,WAAW,CAAC;QACrBZ;QACAX;QACAL,OAAOd,GAAG,IAAI,CAACoC,MAAM,CAACjB,UAAU,CAACe,EAAE,EAAEX,YAAYW,EAAE;IACrD;IAEA3B,UAAU,IAAI;IAEd,OAAOiC;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteVersions.d.ts","sourceRoot":"","sources":["../src/deleteVersions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"deleteVersions.d.ts","sourceRoot":"","sources":["../src/deleteVersions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,SAAS,CAAA;AAYxF,eAAO,MAAM,cAAc,EAAE,cAsD5B,CAAA"}
|
package/dist/deleteVersions.js
CHANGED
|
@@ -3,6 +3,7 @@ import { APIError, buildVersionCollectionFields, buildVersionGlobalFields } from
|
|
|
3
3
|
import toSnakeCase from 'to-snake-case';
|
|
4
4
|
import { findMany } from './find/findMany.js';
|
|
5
5
|
import { getTransaction } from './utilities/getTransaction.js';
|
|
6
|
+
import { markWrite } from './utilities/readAfterWrite.js';
|
|
6
7
|
export const deleteVersions = async function deleteVersion({ collection: collectionSlug, globalSlug, locale, req, where: where }) {
|
|
7
8
|
let tableName;
|
|
8
9
|
let fields;
|
|
@@ -40,6 +41,7 @@ export const deleteVersions = async function deleteVersion({ collection: collect
|
|
|
40
41
|
tableName,
|
|
41
42
|
where: inArray(this.tables[tableName].id, ids)
|
|
42
43
|
});
|
|
44
|
+
markWrite(this);
|
|
43
45
|
}
|
|
44
46
|
return docs;
|
|
45
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deleteVersions.ts"],"sourcesContent":["import type { DeleteVersions, FlattenedField, SanitizedCollectionConfig } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\nimport { APIError, buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\nimport { getTransaction } from './utilities/getTransaction.js'\n\nexport const deleteVersions: DeleteVersions = async function deleteVersion(\n this: DrizzleAdapter,\n { collection: collectionSlug, globalSlug, locale, req, where: where },\n) {\n let tableName: string\n let fields: FlattenedField[]\n\n if (globalSlug) {\n const globalConfig = this.payload.globals.config.find(({ slug }) => slug === globalSlug)\n tableName = this.tableNameMap.get(`_${toSnakeCase(globalSlug)}${this.versionsSuffix}`)\n fields = buildVersionGlobalFields(this.payload.config, globalConfig, true)\n } else if (collectionSlug) {\n const collectionConfig: SanitizedCollectionConfig =\n this.payload.collections[collectionSlug].config\n tableName = this.tableNameMap.get(\n `_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`,\n )\n fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n } else {\n throw new APIError('Either collection or globalSlug must be passed.')\n }\n\n const { docs } = await findMany({\n adapter: this,\n fields,\n joins: false,\n limit: 0,\n locale,\n page: 1,\n pagination: false,\n req,\n tableName,\n where,\n })\n\n const ids = []\n\n docs.forEach((doc) => {\n ids.push(doc.id)\n })\n\n if (ids.length > 0) {\n const db = await getTransaction(this, req)\n\n await this.deleteWhere({\n db,\n tableName,\n where: inArray(this.tables[tableName].id, ids),\n })\n }\n\n return docs\n}\n"],"names":["inArray","APIError","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","findMany","getTransaction","deleteVersions","deleteVersion","collection","collectionSlug","globalSlug","locale","req","where","tableName","fields","globalConfig","payload","globals","config","find","slug","tableNameMap","get","versionsSuffix","collectionConfig","collections","docs","adapter","joins","limit","page","pagination","ids","forEach","doc","push","id","length","db","deleteWhere","tables"],"mappings":"AAEA,SAASA,OAAO,QAAQ,cAAa;AACrC,SAASC,QAAQ,EAAEC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAS;AAC1F,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAC7C,SAASC,cAAc,QAAQ,gCAA+B;
|
|
1
|
+
{"version":3,"sources":["../src/deleteVersions.ts"],"sourcesContent":["import type { DeleteVersions, FlattenedField, SanitizedCollectionConfig } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\nimport { APIError, buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\nimport { getTransaction } from './utilities/getTransaction.js'\nimport { markWrite } from './utilities/readAfterWrite.js'\n\nexport const deleteVersions: DeleteVersions = async function deleteVersion(\n this: DrizzleAdapter,\n { collection: collectionSlug, globalSlug, locale, req, where: where },\n) {\n let tableName: string\n let fields: FlattenedField[]\n\n if (globalSlug) {\n const globalConfig = this.payload.globals.config.find(({ slug }) => slug === globalSlug)\n tableName = this.tableNameMap.get(`_${toSnakeCase(globalSlug)}${this.versionsSuffix}`)\n fields = buildVersionGlobalFields(this.payload.config, globalConfig, true)\n } else if (collectionSlug) {\n const collectionConfig: SanitizedCollectionConfig =\n this.payload.collections[collectionSlug].config\n tableName = this.tableNameMap.get(\n `_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`,\n )\n fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n } else {\n throw new APIError('Either collection or globalSlug must be passed.')\n }\n\n const { docs } = await findMany({\n adapter: this,\n fields,\n joins: false,\n limit: 0,\n locale,\n page: 1,\n pagination: false,\n req,\n tableName,\n where,\n })\n\n const ids = []\n\n docs.forEach((doc) => {\n ids.push(doc.id)\n })\n\n if (ids.length > 0) {\n const db = await getTransaction(this, req)\n\n await this.deleteWhere({\n db,\n tableName,\n where: inArray(this.tables[tableName].id, ids),\n })\n\n markWrite(this)\n }\n\n return docs\n}\n"],"names":["inArray","APIError","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","findMany","getTransaction","markWrite","deleteVersions","deleteVersion","collection","collectionSlug","globalSlug","locale","req","where","tableName","fields","globalConfig","payload","globals","config","find","slug","tableNameMap","get","versionsSuffix","collectionConfig","collections","docs","adapter","joins","limit","page","pagination","ids","forEach","doc","push","id","length","db","deleteWhere","tables"],"mappings":"AAEA,SAASA,OAAO,QAAQ,cAAa;AACrC,SAASC,QAAQ,EAAEC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAS;AAC1F,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAC7C,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,SAAS,QAAQ,gCAA+B;AAEzD,OAAO,MAAMC,iBAAiC,eAAeC,cAE3D,EAAEC,YAAYC,cAAc,EAAEC,UAAU,EAAEC,MAAM,EAAEC,GAAG,EAAEC,OAAOA,KAAK,EAAE;IAErE,IAAIC;IACJ,IAAIC;IAEJ,IAAIL,YAAY;QACd,MAAMM,eAAe,IAAI,CAACC,OAAO,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAASX;QAC7EI,YAAY,IAAI,CAACQ,YAAY,CAACC,GAAG,CAAC,CAAC,CAAC,EAAErB,YAAYQ,cAAc,IAAI,CAACc,cAAc,EAAE;QACrFT,SAASd,yBAAyB,IAAI,CAACgB,OAAO,CAACE,MAAM,EAAEH,cAAc;IACvE,OAAO,IAAIP,gBAAgB;QACzB,MAAMgB,mBACJ,IAAI,CAACR,OAAO,CAACS,WAAW,CAACjB,eAAe,CAACU,MAAM;QACjDL,YAAY,IAAI,CAACQ,YAAY,CAACC,GAAG,CAC/B,CAAC,CAAC,EAAErB,YAAYuB,iBAAiBJ,IAAI,IAAI,IAAI,CAACG,cAAc,EAAE;QAEhET,SAASf,6BAA6B,IAAI,CAACiB,OAAO,CAACE,MAAM,EAAEM,kBAAkB;IAC/E,OAAO;QACL,MAAM,IAAI1B,SAAS;IACrB;IAEA,MAAM,EAAE4B,IAAI,EAAE,GAAG,MAAMxB,SAAS;QAC9ByB,SAAS,IAAI;QACbb;QACAc,OAAO;QACPC,OAAO;QACPnB;QACAoB,MAAM;QACNC,YAAY;QACZpB;QACAE;QACAD;IACF;IAEA,MAAMoB,MAAM,EAAE;IAEdN,KAAKO,OAAO,CAAC,CAACC;QACZF,IAAIG,IAAI,CAACD,IAAIE,EAAE;IACjB;IAEA,IAAIJ,IAAIK,MAAM,GAAG,GAAG;QAClB,MAAMC,KAAK,MAAMnC,eAAe,IAAI,EAAEQ;QAEtC,MAAM,IAAI,CAAC4B,WAAW,CAAC;YACrBD;YACAzB;YACAD,OAAOf,QAAQ,IAAI,CAAC2C,MAAM,CAAC3B,UAAU,CAACuB,EAAE,EAAEJ;QAC5C;QAEA5B,UAAU,IAAI;IAChB;IAEA,OAAOsB;AACT,EAAC"}
|
|
@@ -1,23 +1,6 @@
|
|
|
1
|
-
import type { DBQueryConfig
|
|
2
|
-
import type { FlattenedField, JoinQuery, SelectType
|
|
1
|
+
import type { DBQueryConfig } from 'drizzle-orm';
|
|
2
|
+
import type { FlattenedField, JoinQuery, SelectType } from 'payload';
|
|
3
3
|
import type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js';
|
|
4
|
-
/**
|
|
5
|
-
* Metadata captured by traverseFields for each polymorphic join field when
|
|
6
|
-
* batch loading is enabled. findMany.ts uses this to execute a single batch
|
|
7
|
-
* query per join field after the main parent query, avoiding N+1 correlated
|
|
8
|
-
* subqueries.
|
|
9
|
-
*/
|
|
10
|
-
export type PolymorphicJoinInfo = {
|
|
11
|
-
columnName: string;
|
|
12
|
-
countColumnName?: string;
|
|
13
|
-
currentQuery: any;
|
|
14
|
-
limit: number;
|
|
15
|
-
onPath: string;
|
|
16
|
-
page?: number;
|
|
17
|
-
sortDir: 'ASC' | 'DESC';
|
|
18
|
-
sqlWhere?: SQL;
|
|
19
|
-
where?: Where;
|
|
20
|
-
};
|
|
21
4
|
type BuildFindQueryArgs = {
|
|
22
5
|
adapter: DrizzleAdapter;
|
|
23
6
|
collectionSlug?: string;
|
|
@@ -32,21 +15,13 @@ type BuildFindQueryArgs = {
|
|
|
32
15
|
locale?: string;
|
|
33
16
|
select?: SelectType;
|
|
34
17
|
tableName: string;
|
|
35
|
-
/**
|
|
36
|
-
* When true, polymorphic join fields are deferred for batch loading by findMany.ts
|
|
37
|
-
* instead of using per-row correlated subqueries. Only valid for PostgreSQL.
|
|
38
|
-
* Populated into _polymorphicJoins on the returned Result.
|
|
39
|
-
*/
|
|
40
|
-
useBatchPolymorphicJoins?: boolean;
|
|
41
18
|
versions?: boolean;
|
|
42
19
|
};
|
|
43
20
|
export type Result = {
|
|
44
|
-
/** Populated only when useBatchPolymorphicJoins=true; processed by findMany.ts */
|
|
45
|
-
_polymorphicJoins?: PolymorphicJoinInfo[];
|
|
46
21
|
with?: {
|
|
47
22
|
_locales?: DBQueryConfig<'many', true, any, any>;
|
|
48
23
|
} & DBQueryConfig<'many', true, any, any>;
|
|
49
24
|
} & DBQueryConfig<'many', true, any, any>;
|
|
50
|
-
export declare const buildFindManyArgs: ({ adapter, collectionSlug, depth, draftsEnabled, fields, joinQuery, joins, locale, select, tableName,
|
|
25
|
+
export declare const buildFindManyArgs: ({ adapter, collectionSlug, depth, draftsEnabled, fields, joinQuery, joins, locale, select, tableName, versions, }: BuildFindQueryArgs) => Result;
|
|
51
26
|
export {};
|
|
52
27
|
//# sourceMappingURL=buildFindManyArgs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildFindManyArgs.d.ts","sourceRoot":"","sources":["../../src/find/buildFindManyArgs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"buildFindManyArgs.d.ts","sourceRoot":"","sources":["../../src/find/buildFindManyArgs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIxE,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;KACjD,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAC1C,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAIzC,eAAO,MAAM,iBAAiB,sHAY3B,kBAAkB,KAAG,MAkGvB,CAAA"}
|
|
@@ -2,14 +2,11 @@ import { getSelectMode } from 'payload/shared';
|
|
|
2
2
|
import { traverseFields } from './traverseFields.js';
|
|
3
3
|
// Generate the Drizzle query for findMany based on
|
|
4
4
|
// a collection field structure
|
|
5
|
-
export const buildFindManyArgs = ({ adapter, collectionSlug, depth, draftsEnabled, fields, joinQuery, joins = [], locale, select, tableName,
|
|
5
|
+
export const buildFindManyArgs = ({ adapter, collectionSlug, depth, draftsEnabled, fields, joinQuery, joins = [], locale, select, tableName, versions })=>{
|
|
6
6
|
const result = {
|
|
7
7
|
extras: {},
|
|
8
8
|
with: {}
|
|
9
9
|
};
|
|
10
|
-
if (useBatchPolymorphicJoins && adapter.name === 'postgres') {
|
|
11
|
-
result._polymorphicJoins = [];
|
|
12
|
-
}
|
|
13
10
|
if (select) {
|
|
14
11
|
result.columns = {
|
|
15
12
|
id: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/find/buildFindManyArgs.ts"],"sourcesContent":["import type { DBQueryConfig
|
|
1
|
+
{"version":3,"sources":["../../src/find/buildFindManyArgs.ts"],"sourcesContent":["import type { DBQueryConfig } from 'drizzle-orm'\nimport type { FlattenedField, JoinQuery, SelectType } from 'payload'\n\nimport { getSelectMode } from 'payload/shared'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\n\nimport { traverseFields } from './traverseFields.js'\n\ntype BuildFindQueryArgs = {\n adapter: DrizzleAdapter\n collectionSlug?: string\n depth: number\n draftsEnabled?: boolean\n fields: FlattenedField[]\n joinQuery?: JoinQuery\n /**\n * The joins array will be mutated by pushing any joins needed for the where queries of join field joins\n */\n joins?: BuildQueryJoinAliases\n locale?: string\n select?: SelectType\n tableName: string\n versions?: boolean\n}\n\nexport type Result = {\n with?: {\n _locales?: DBQueryConfig<'many', true, any, any>\n } & DBQueryConfig<'many', true, any, any>\n} & DBQueryConfig<'many', true, any, any>\n\n// Generate the Drizzle query for findMany based on\n// a collection field structure\nexport const buildFindManyArgs = ({\n adapter,\n collectionSlug,\n depth,\n draftsEnabled,\n fields,\n joinQuery,\n joins = [],\n locale,\n select,\n tableName,\n versions,\n}: BuildFindQueryArgs): Result => {\n const result: Result = {\n extras: {},\n with: {},\n }\n\n if (select) {\n result.columns = {\n id: true,\n }\n }\n\n const _locales: Result = {\n columns: select\n ? { _locale: true }\n : {\n id: false,\n _parentID: false,\n },\n extras: {},\n with: {},\n }\n\n const withTabledFields = select\n ? {}\n : {\n numbers: true,\n rels: true,\n texts: true,\n }\n\n traverseFields({\n _locales,\n adapter,\n collectionSlug,\n currentArgs: result,\n currentTableName: tableName,\n depth,\n draftsEnabled,\n fields,\n joinQuery,\n joins,\n locale,\n path: '',\n select,\n selectMode: select ? getSelectMode(select) : undefined,\n tablePath: '',\n topLevelArgs: result,\n topLevelTableName: tableName,\n versions,\n withTabledFields,\n })\n\n if (adapter.tables[`${tableName}_texts`] && withTabledFields.texts) {\n result.with._texts = {\n columns: {\n id: false,\n parent: false,\n },\n orderBy: ({ order }, { asc: ASC }) => [ASC(order)],\n }\n }\n\n if (adapter.tables[`${tableName}_numbers`] && withTabledFields.numbers) {\n result.with._numbers = {\n columns: {\n id: false,\n parent: false,\n },\n orderBy: ({ order }, { asc: ASC }) => [ASC(order)],\n }\n }\n\n if (adapter.tables[`${tableName}${adapter.relationshipsSuffix}`] && withTabledFields.rels) {\n result.with._rels = {\n columns: {\n id: false,\n parent: false,\n },\n orderBy: ({ order }, { asc: ASC }) => [ASC(order)],\n }\n }\n\n if (\n adapter.tables[`${tableName}${adapter.localesSuffix}`] &&\n (!select || Object.keys(_locales.columns).length > 1)\n ) {\n result.with._locales = _locales\n }\n\n // Delete properties that are empty\n for (const key of Object.keys(result)) {\n if (!Object.keys(result[key]).length) {\n delete result[key]\n }\n }\n\n return result\n}\n"],"names":["getSelectMode","traverseFields","buildFindManyArgs","adapter","collectionSlug","depth","draftsEnabled","fields","joinQuery","joins","locale","select","tableName","versions","result","extras","with","columns","id","_locales","_locale","_parentID","withTabledFields","numbers","rels","texts","currentArgs","currentTableName","path","selectMode","undefined","tablePath","topLevelArgs","topLevelTableName","tables","_texts","parent","orderBy","order","asc","ASC","_numbers","relationshipsSuffix","_rels","localesSuffix","Object","keys","length","key"],"mappings":"AAGA,SAASA,aAAa,QAAQ,iBAAgB;AAI9C,SAASC,cAAc,QAAQ,sBAAqB;AAyBpD,mDAAmD;AACnD,+BAA+B;AAC/B,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,OAAO,EACPC,cAAc,EACdC,KAAK,EACLC,aAAa,EACbC,MAAM,EACNC,SAAS,EACTC,QAAQ,EAAE,EACVC,MAAM,EACNC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACW;IACnB,MAAMC,SAAiB;QACrBC,QAAQ,CAAC;QACTC,MAAM,CAAC;IACT;IAEA,IAAIL,QAAQ;QACVG,OAAOG,OAAO,GAAG;YACfC,IAAI;QACN;IACF;IAEA,MAAMC,WAAmB;QACvBF,SAASN,SACL;YAAES,SAAS;QAAK,IAChB;YACEF,IAAI;YACJG,WAAW;QACb;QACJN,QAAQ,CAAC;QACTC,MAAM,CAAC;IACT;IAEA,MAAMM,mBAAmBX,SACrB,CAAC,IACD;QACEY,SAAS;QACTC,MAAM;QACNC,OAAO;IACT;IAEJxB,eAAe;QACbkB;QACAhB;QACAC;QACAsB,aAAaZ;QACba,kBAAkBf;QAClBP;QACAC;QACAC;QACAC;QACAC;QACAC;QACAkB,MAAM;QACNjB;QACAkB,YAAYlB,SAASX,cAAcW,UAAUmB;QAC7CC,WAAW;QACXC,cAAclB;QACdmB,mBAAmBrB;QACnBC;QACAS;IACF;IAEA,IAAInB,QAAQ+B,MAAM,CAAC,GAAGtB,UAAU,MAAM,CAAC,CAAC,IAAIU,iBAAiBG,KAAK,EAAE;QAClEX,OAAOE,IAAI,CAACmB,MAAM,GAAG;YACnBlB,SAAS;gBACPC,IAAI;gBACJkB,QAAQ;YACV;YACAC,SAAS,CAAC,EAAEC,KAAK,EAAE,EAAE,EAAEC,KAAKC,GAAG,EAAE,GAAK;oBAACA,IAAIF;iBAAO;QACpD;IACF;IAEA,IAAInC,QAAQ+B,MAAM,CAAC,GAAGtB,UAAU,QAAQ,CAAC,CAAC,IAAIU,iBAAiBC,OAAO,EAAE;QACtET,OAAOE,IAAI,CAACyB,QAAQ,GAAG;YACrBxB,SAAS;gBACPC,IAAI;gBACJkB,QAAQ;YACV;YACAC,SAAS,CAAC,EAAEC,KAAK,EAAE,EAAE,EAAEC,KAAKC,GAAG,EAAE,GAAK;oBAACA,IAAIF;iBAAO;QACpD;IACF;IAEA,IAAInC,QAAQ+B,MAAM,CAAC,GAAGtB,YAAYT,QAAQuC,mBAAmB,EAAE,CAAC,IAAIpB,iBAAiBE,IAAI,EAAE;QACzFV,OAAOE,IAAI,CAAC2B,KAAK,GAAG;YAClB1B,SAAS;gBACPC,IAAI;gBACJkB,QAAQ;YACV;YACAC,SAAS,CAAC,EAAEC,KAAK,EAAE,EAAE,EAAEC,KAAKC,GAAG,EAAE,GAAK;oBAACA,IAAIF;iBAAO;QACpD;IACF;IAEA,IACEnC,QAAQ+B,MAAM,CAAC,GAAGtB,YAAYT,QAAQyC,aAAa,EAAE,CAAC,IACrD,CAAA,CAACjC,UAAUkC,OAAOC,IAAI,CAAC3B,SAASF,OAAO,EAAE8B,MAAM,GAAG,CAAA,GACnD;QACAjC,OAAOE,IAAI,CAACG,QAAQ,GAAGA;IACzB;IAEA,mCAAmC;IACnC,KAAK,MAAM6B,OAAOH,OAAOC,IAAI,CAAChC,QAAS;QACrC,IAAI,CAAC+B,OAAOC,IAAI,CAAChC,MAAM,CAACkC,IAAI,EAAED,MAAM,EAAE;YACpC,OAAOjC,MAAM,CAACkC,IAAI;QACpB;IACF;IAEA,OAAOlC;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../src/find/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"findMany.d.ts","sourceRoot":"","sources":["../../src/find/findMany.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AASjD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AAEhC,eAAO,MAAM,QAAQ,8KAgBlB,IAAI;;;;;;;;;;;EAwMN,CAAA"}
|
package/dist/find/findMany.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { asc, desc, inArray, max, min
|
|
1
|
+
import { asc, desc, inArray, max, min } from 'drizzle-orm';
|
|
2
2
|
import { buildQuery } from '../queries/buildQuery.js';
|
|
3
3
|
import { selectDistinct } from '../queries/selectDistinct.js';
|
|
4
4
|
import { transform } from '../transform/read/index.js';
|
|
5
5
|
import { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js';
|
|
6
6
|
import { getTransaction } from '../utilities/getTransaction.js';
|
|
7
|
-
import { jsonAggBuildObject } from '../utilities/json.js';
|
|
8
7
|
import { buildFindManyArgs } from './buildFindManyArgs.js';
|
|
9
8
|
export const findMany = async function find({ adapter, collectionSlug, draftsEnabled, fields, joins: joinQuery, limit: limitArg, locale, page = 1, pagination, req, select, sort, tableName, versions, where: whereArg }) {
|
|
10
9
|
let limit = limitArg;
|
|
@@ -39,7 +38,6 @@ export const findMany = async function find({ adapter, collectionSlug, draftsEna
|
|
|
39
38
|
locale,
|
|
40
39
|
select,
|
|
41
40
|
tableName,
|
|
42
|
-
useBatchPolymorphicJoins: true,
|
|
43
41
|
versions
|
|
44
42
|
});
|
|
45
43
|
if (orderBy) {
|
|
@@ -141,64 +139,6 @@ export const findMany = async function find({ adapter, collectionSlug, draftsEna
|
|
|
141
139
|
if (Object.keys(orderedIDMap).length > 0) {
|
|
142
140
|
rawDocs.sort((a, b)=>orderedIDMap[a.id] - orderedIDMap[b.id]);
|
|
143
141
|
}
|
|
144
|
-
// Batch-load polymorphic join fields: execute one query per join field for all
|
|
145
|
-
// fetched parents, replacing the N+1 correlated subquery pattern with 2 queries total.
|
|
146
|
-
if (findManyArgs._polymorphicJoins?.length && rawDocs.length > 0) {
|
|
147
|
-
const parentIds = rawDocs.map((doc)=>doc.id).filter(Boolean);
|
|
148
|
-
for (const join of findManyArgs._polymorphicJoins){
|
|
149
|
-
const { columnName, countColumnName, currentQuery, limit, onPath, page, sortDir, sqlWhere } = join;
|
|
150
|
-
const rankedAlias = `${columnName}_ranked`;
|
|
151
|
-
const preAlias = `${columnName}_pre`;
|
|
152
|
-
// Compute ROW_NUMBER range from page/limit
|
|
153
|
-
const rnOffset = page && limit !== 0 ? (page - 1) * limit : 0;
|
|
154
|
-
const rnStart = rnOffset + 1;
|
|
155
|
-
const rnEndSQL = limit !== 0 ? sql` AND "_rn" <= ${rnOffset + limit}` : sql``;
|
|
156
|
-
// Use IN (...) rather than = ANY(ARRAY[...]) so PostgreSQL can coerce bind
|
|
157
|
-
// parameter types to match the column type without an explicit cast.
|
|
158
|
-
const parentIdsSql = sql.join(parentIds.map((id)=>sql`${id}`), sql`, `);
|
|
159
|
-
// Apply the join's where filter alongside the parent-ID filter.
|
|
160
|
-
const rankSourceSQL = sql`(
|
|
161
|
-
SELECT * FROM ${sql`${currentQuery.as(preAlias)}`}
|
|
162
|
-
WHERE ${sql.raw(`"${onPath}"`)} IN (${parentIdsSql})${sqlWhere ? sql` AND ${sqlWhere}` : sql``}
|
|
163
|
-
) AS ${sql.raw(`"${preAlias}_src"`)}`;
|
|
164
|
-
// Single query: rank all children for all fetched parents, aggregate per parent.
|
|
165
|
-
// COUNT(*) OVER is placed in the inner (ranking) query so it reflects the total
|
|
166
|
-
// number of matching children per parent — not just the current page's rows.
|
|
167
|
-
const batchResult = await db.execute(sql`
|
|
168
|
-
SELECT
|
|
169
|
-
${sql.raw(`"${rankedAlias}"."${onPath}"`)} AS "_parent_id",
|
|
170
|
-
${jsonAggBuildObject(adapter, {
|
|
171
|
-
id: sql.raw(`"${rankedAlias}"."id"`),
|
|
172
|
-
relationTo: sql.raw(`"${rankedAlias}"."relationTo"`)
|
|
173
|
-
})} AS "_result"
|
|
174
|
-
${countColumnName ? sql`, MAX(${sql.raw(`"${rankedAlias}"."_total_count"`)}) AS "_total_count"` : sql``}
|
|
175
|
-
FROM (
|
|
176
|
-
SELECT *,
|
|
177
|
-
ROW_NUMBER() OVER (
|
|
178
|
-
PARTITION BY ${sql.raw(`"${onPath}"`)}
|
|
179
|
-
ORDER BY "sortPath" ${sql.raw(sortDir)}
|
|
180
|
-
) AS "_rn"
|
|
181
|
-
${countColumnName ? sql`, COUNT(*) OVER (PARTITION BY ${sql.raw(`"${onPath}"`)}) AS "_total_count"` : sql``}
|
|
182
|
-
FROM ${rankSourceSQL}
|
|
183
|
-
) AS ${sql.raw(`"${rankedAlias}"`)}
|
|
184
|
-
WHERE "_rn" >= ${rnStart}${rnEndSQL}
|
|
185
|
-
GROUP BY ${sql.raw(`"${rankedAlias}"."${onPath}"`)}
|
|
186
|
-
`);
|
|
187
|
-
const rows = batchResult.rows ?? batchResult;
|
|
188
|
-
const childMap = new Map(rows.map((r)=>[
|
|
189
|
-
String(r._parent_id),
|
|
190
|
-
r
|
|
191
|
-
]));
|
|
192
|
-
for (const doc of rawDocs){
|
|
193
|
-
const row = childMap.get(String(doc.id));
|
|
194
|
-
doc[columnName] = row?._result ?? null;
|
|
195
|
-
if (countColumnName) {
|
|
196
|
-
;
|
|
197
|
-
doc[countColumnName] = row?._total_count ?? 0;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
142
|
if (pagination === false || !totalDocs) {
|
|
203
143
|
totalDocs = rawDocs.length;
|
|
204
144
|
totalPages = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { FindArgs, FlattenedField, TypeWithID } from 'payload'\n\nimport { asc, desc, inArray, max, min, sql } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { selectDistinct } from '../queries/selectDistinct.js'\nimport { transform } from '../transform/read/index.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { getTransaction } from '../utilities/getTransaction.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { buildFindManyArgs } from './buildFindManyArgs.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n collectionSlug?: string\n fields: FlattenedField[]\n tableName: string\n versions?: boolean\n} & Omit<FindArgs, 'collection'>\n\nexport const findMany = async function find({\n adapter,\n collectionSlug,\n draftsEnabled,\n fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req,\n select,\n sort,\n tableName,\n versions,\n where: whereArg,\n}: Args) {\n let limit = limitArg\n let totalDocs: number\n let totalPages: number\n let hasPrevPage: boolean\n let hasNextPage: boolean\n let pagingCounter: number\n const offset = (page - 1) * limit\n\n if (limit === 0) {\n pagination = false\n limit = undefined\n }\n\n const { joins, orderBy, selectFields, where } = buildQuery({\n adapter,\n fields,\n locale,\n sort,\n tableName,\n where: whereArg,\n })\n\n const orderedIDMap: Record<number | string, number> = {}\n let orderedIDs: (number | string)[]\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n collectionSlug,\n depth: 0,\n draftsEnabled,\n fields,\n joinQuery,\n joins,\n locale,\n select,\n tableName,\n useBatchPolymorphicJoins: true,\n versions,\n })\n\n if (orderBy) {\n for (const key in selectFields) {\n const column = selectFields[key]\n if (!column || column.primary) {\n continue\n }\n\n if (\n !orderBy.some(\n (col) =>\n col.column.name === column.name &&\n getNameFromDrizzleTable(col.column.table) === getNameFromDrizzleTable(column.table),\n )\n ) {\n delete selectFields[key]\n }\n }\n }\n\n const db = await getTransaction(adapter, req)\n\n const oneToManyJoinedTableNames = new Set(\n joins.filter((j) => j.isOneToMany).map((j) => getNameFromDrizzleTable(j.table)),\n )\n\n const hasSortOnOneToMany =\n oneToManyJoinedTableNames.size > 0 &&\n orderBy?.some(({ column }) =>\n oneToManyJoinedTableNames.has(getNameFromDrizzleTable(column.table)),\n )\n\n let selectDistinctResult: { id: number | string }[] | undefined\n\n // avoid duplicate results by using a group query instead of select distinct when there is a sort on a one-to-many joined table\n if (hasSortOnOneToMany) {\n const mainTable = adapter.tables[tableName]\n let groupQuery = (db as any).select({ id: mainTable.id }).from(mainTable).$dynamic()\n\n if (where) {\n groupQuery = groupQuery.where(where)\n }\n\n joins.forEach(({ type, condition, table }) => {\n groupQuery = groupQuery[type ?? 'leftJoin'](table, condition)\n })\n\n groupQuery = groupQuery.groupBy(mainTable.id)\n\n groupQuery = groupQuery.orderBy(() =>\n orderBy.map(({ column, order }) => {\n if (oneToManyJoinedTableNames.has(getNameFromDrizzleTable(column.table))) {\n return order === asc ? asc(min(column)) : desc(max(column))\n }\n return order(column)\n }),\n )\n\n selectDistinctResult = await groupQuery.offset(offset).limit(limit)\n } else {\n selectDistinctResult = await selectDistinct({\n adapter,\n db,\n joins,\n query: ({ query }) => {\n if (orderBy) {\n query = query.orderBy(() => orderBy.map(({ column, order }) => order(column)))\n }\n return query.offset(offset).limit(limit)\n },\n selectFields,\n tableName,\n where,\n })\n }\n\n if (selectDistinctResult) {\n if (selectDistinctResult.length === 0) {\n return {\n docs: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit,\n nextPage: null,\n page: 1,\n pagingCounter: 0,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n }\n } else {\n // set the id in an object for sorting later\n selectDistinctResult.forEach(({ id }, i) => {\n orderedIDMap[id] = i\n })\n orderedIDs = Object.keys(orderedIDMap)\n findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)\n }\n } else {\n findManyArgs.limit = limit\n findManyArgs.offset = offset\n findManyArgs.orderBy = () => orderBy.map(({ column, order }) => order(column))\n\n if (where) {\n findManyArgs.where = where\n }\n }\n\n const findPromise = db.query[tableName].findMany(findManyArgs)\n\n if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {\n totalDocs = await adapter.countDistinct({\n db,\n joins,\n tableName,\n where,\n })\n\n totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1\n hasPrevPage = page > 1\n hasNextPage = totalPages > page\n pagingCounter = (page - 1) * limit + 1\n }\n\n const rawDocs = await findPromise\n // sort rawDocs from selectQuery\n if (Object.keys(orderedIDMap).length > 0) {\n rawDocs.sort((a, b) => orderedIDMap[a.id] - orderedIDMap[b.id])\n }\n\n // Batch-load polymorphic join fields: execute one query per join field for all\n // fetched parents, replacing the N+1 correlated subquery pattern with 2 queries total.\n if (findManyArgs._polymorphicJoins?.length && rawDocs.length > 0) {\n const parentIds = rawDocs.map((doc) => doc.id).filter(Boolean)\n\n for (const join of findManyArgs._polymorphicJoins) {\n const { columnName, countColumnName, currentQuery, limit, onPath, page, sortDir, sqlWhere } =\n join\n\n const rankedAlias = `${columnName}_ranked`\n const preAlias = `${columnName}_pre`\n\n // Compute ROW_NUMBER range from page/limit\n const rnOffset = page && limit !== 0 ? (page - 1) * limit : 0\n const rnStart = rnOffset + 1\n const rnEndSQL = limit !== 0 ? sql` AND \"_rn\" <= ${rnOffset + limit}` : sql``\n\n // Use IN (...) rather than = ANY(ARRAY[...]) so PostgreSQL can coerce bind\n // parameter types to match the column type without an explicit cast.\n const parentIdsSql = sql.join(\n parentIds.map((id) => sql`${id}`),\n sql`, `,\n )\n\n // Apply the join's where filter alongside the parent-ID filter.\n const rankSourceSQL = sql`(\n SELECT * FROM ${sql`${currentQuery.as(preAlias)}`}\n WHERE ${sql.raw(`\"${onPath}\"`)} IN (${parentIdsSql})${sqlWhere ? sql` AND ${sqlWhere}` : sql``}\n ) AS ${sql.raw(`\"${preAlias}_src\"`)}`\n\n // Single query: rank all children for all fetched parents, aggregate per parent.\n // COUNT(*) OVER is placed in the inner (ranking) query so it reflects the total\n // number of matching children per parent — not just the current page's rows.\n const batchResult = await (db as any).execute(sql`\n SELECT\n ${sql.raw(`\"${rankedAlias}\".\"${onPath}\"`)} AS \"_parent_id\",\n ${jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${rankedAlias}\".\"id\"`),\n relationTo: sql.raw(`\"${rankedAlias}\".\"relationTo\"`),\n })} AS \"_result\"\n ${countColumnName ? sql`, MAX(${sql.raw(`\"${rankedAlias}\".\"_total_count\"`)}) AS \"_total_count\"` : sql``}\n FROM (\n SELECT *,\n ROW_NUMBER() OVER (\n PARTITION BY ${sql.raw(`\"${onPath}\"`)}\n ORDER BY \"sortPath\" ${sql.raw(sortDir)}\n ) AS \"_rn\"\n ${countColumnName ? sql`, COUNT(*) OVER (PARTITION BY ${sql.raw(`\"${onPath}\"`)}) AS \"_total_count\"` : sql``}\n FROM ${rankSourceSQL}\n ) AS ${sql.raw(`\"${rankedAlias}\"`)}\n WHERE \"_rn\" >= ${rnStart}${rnEndSQL}\n GROUP BY ${sql.raw(`\"${rankedAlias}\".\"${onPath}\"`)}\n `)\n\n const rows: Array<{ _parent_id: unknown; _result: unknown; _total_count?: number }> =\n batchResult.rows ?? batchResult\n const childMap = new Map(rows.map((r) => [String(r._parent_id), r]))\n\n for (const doc of rawDocs) {\n const row = childMap.get(String((doc as any).id))\n ;(doc as any)[columnName] = row?._result ?? null\n if (countColumnName) {\n ;(doc as any)[countColumnName] = row?._total_count ?? 0\n }\n }\n }\n }\n\n if (pagination === false || !totalDocs) {\n totalDocs = rawDocs.length\n totalPages = 1\n pagingCounter = 1\n hasPrevPage = false\n hasNextPage = false\n }\n\n const docs = rawDocs.map((data: TypeWithID) => {\n return transform({\n adapter,\n config: adapter.payload.config,\n data,\n fields,\n joinQuery,\n tableName,\n })\n })\n\n return {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: limitArg,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n"],"names":["asc","desc","inArray","max","min","sql","buildQuery","selectDistinct","transform","getNameFromDrizzleTable","getTransaction","jsonAggBuildObject","buildFindManyArgs","findMany","find","adapter","collectionSlug","draftsEnabled","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","select","sort","tableName","versions","where","whereArg","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","findManyArgs","depth","useBatchPolymorphicJoins","key","column","primary","some","col","name","table","db","oneToManyJoinedTableNames","Set","filter","j","isOneToMany","map","hasSortOnOneToMany","size","has","selectDistinctResult","mainTable","tables","groupQuery","id","from","$dynamic","forEach","type","condition","groupBy","order","query","length","docs","nextPage","prevPage","i","Object","keys","findPromise","countDistinct","Math","ceil","rawDocs","a","b","_polymorphicJoins","parentIds","doc","Boolean","join","columnName","countColumnName","currentQuery","onPath","sortDir","sqlWhere","rankedAlias","preAlias","rnOffset","rnStart","rnEndSQL","parentIdsSql","rankSourceSQL","as","raw","batchResult","execute","relationTo","rows","childMap","Map","r","String","_parent_id","row","get","_result","_total_count","data","config","payload"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { FindArgs, FlattenedField, TypeWithID } from 'payload'\n\nimport { asc, desc, inArray, max, min } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { selectDistinct } from '../queries/selectDistinct.js'\nimport { transform } from '../transform/read/index.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { getTransaction } from '../utilities/getTransaction.js'\nimport { buildFindManyArgs } from './buildFindManyArgs.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n collectionSlug?: string\n fields: FlattenedField[]\n tableName: string\n versions?: boolean\n} & Omit<FindArgs, 'collection'>\n\nexport const findMany = async function find({\n adapter,\n collectionSlug,\n draftsEnabled,\n fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req,\n select,\n sort,\n tableName,\n versions,\n where: whereArg,\n}: Args) {\n let limit = limitArg\n let totalDocs: number\n let totalPages: number\n let hasPrevPage: boolean\n let hasNextPage: boolean\n let pagingCounter: number\n const offset = (page - 1) * limit\n\n if (limit === 0) {\n pagination = false\n limit = undefined\n }\n\n const { joins, orderBy, selectFields, where } = buildQuery({\n adapter,\n fields,\n locale,\n sort,\n tableName,\n where: whereArg,\n })\n\n const orderedIDMap: Record<number | string, number> = {}\n let orderedIDs: (number | string)[]\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n collectionSlug,\n depth: 0,\n draftsEnabled,\n fields,\n joinQuery,\n joins,\n locale,\n select,\n tableName,\n versions,\n })\n\n if (orderBy) {\n for (const key in selectFields) {\n const column = selectFields[key]\n if (!column || column.primary) {\n continue\n }\n\n if (\n !orderBy.some(\n (col) =>\n col.column.name === column.name &&\n getNameFromDrizzleTable(col.column.table) === getNameFromDrizzleTable(column.table),\n )\n ) {\n delete selectFields[key]\n }\n }\n }\n\n const db = await getTransaction(adapter, req)\n\n const oneToManyJoinedTableNames = new Set(\n joins.filter((j) => j.isOneToMany).map((j) => getNameFromDrizzleTable(j.table)),\n )\n\n const hasSortOnOneToMany =\n oneToManyJoinedTableNames.size > 0 &&\n orderBy?.some(({ column }) =>\n oneToManyJoinedTableNames.has(getNameFromDrizzleTable(column.table)),\n )\n\n let selectDistinctResult: { id: number | string }[] | undefined\n\n // avoid duplicate results by using a group query instead of select distinct when there is a sort on a one-to-many joined table\n if (hasSortOnOneToMany) {\n const mainTable = adapter.tables[tableName]\n let groupQuery = (db as any).select({ id: mainTable.id }).from(mainTable).$dynamic()\n\n if (where) {\n groupQuery = groupQuery.where(where)\n }\n\n joins.forEach(({ type, condition, table }) => {\n groupQuery = groupQuery[type ?? 'leftJoin'](table, condition)\n })\n\n groupQuery = groupQuery.groupBy(mainTable.id)\n\n groupQuery = groupQuery.orderBy(() =>\n orderBy.map(({ column, order }) => {\n if (oneToManyJoinedTableNames.has(getNameFromDrizzleTable(column.table))) {\n return order === asc ? asc(min(column)) : desc(max(column))\n }\n return order(column)\n }),\n )\n\n selectDistinctResult = await groupQuery.offset(offset).limit(limit)\n } else {\n selectDistinctResult = await selectDistinct({\n adapter,\n db,\n joins,\n query: ({ query }) => {\n if (orderBy) {\n query = query.orderBy(() => orderBy.map(({ column, order }) => order(column)))\n }\n return query.offset(offset).limit(limit)\n },\n selectFields,\n tableName,\n where,\n })\n }\n\n if (selectDistinctResult) {\n if (selectDistinctResult.length === 0) {\n return {\n docs: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit,\n nextPage: null,\n page: 1,\n pagingCounter: 0,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n }\n } else {\n // set the id in an object for sorting later\n selectDistinctResult.forEach(({ id }, i) => {\n orderedIDMap[id] = i\n })\n orderedIDs = Object.keys(orderedIDMap)\n findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)\n }\n } else {\n findManyArgs.limit = limit\n findManyArgs.offset = offset\n findManyArgs.orderBy = () => orderBy.map(({ column, order }) => order(column))\n\n if (where) {\n findManyArgs.where = where\n }\n }\n\n const findPromise = db.query[tableName].findMany(findManyArgs)\n\n if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {\n totalDocs = await adapter.countDistinct({\n db,\n joins,\n tableName,\n where,\n })\n\n totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1\n hasPrevPage = page > 1\n hasNextPage = totalPages > page\n pagingCounter = (page - 1) * limit + 1\n }\n\n const rawDocs = await findPromise\n // sort rawDocs from selectQuery\n if (Object.keys(orderedIDMap).length > 0) {\n rawDocs.sort((a, b) => orderedIDMap[a.id] - orderedIDMap[b.id])\n }\n\n if (pagination === false || !totalDocs) {\n totalDocs = rawDocs.length\n totalPages = 1\n pagingCounter = 1\n hasPrevPage = false\n hasNextPage = false\n }\n\n const docs = rawDocs.map((data: TypeWithID) => {\n return transform({\n adapter,\n config: adapter.payload.config,\n data,\n fields,\n joinQuery,\n tableName,\n })\n })\n\n return {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: limitArg,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n"],"names":["asc","desc","inArray","max","min","buildQuery","selectDistinct","transform","getNameFromDrizzleTable","getTransaction","buildFindManyArgs","findMany","find","adapter","collectionSlug","draftsEnabled","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","select","sort","tableName","versions","where","whereArg","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","findManyArgs","depth","key","column","primary","some","col","name","table","db","oneToManyJoinedTableNames","Set","filter","j","isOneToMany","map","hasSortOnOneToMany","size","has","selectDistinctResult","mainTable","tables","groupQuery","id","from","$dynamic","forEach","type","condition","groupBy","order","query","length","docs","nextPage","prevPage","i","Object","keys","findPromise","countDistinct","Math","ceil","rawDocs","a","b","data","config","payload"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAGnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AA6EpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAGnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AA6EpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,4BAkyBnB,CAAA"}
|
|
@@ -411,62 +411,36 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
|
|
|
411
411
|
count: count()
|
|
412
412
|
}).from(sql`${currentQuery.as(subQueryAlias)}`).where(sqlWhere)}`.as(`${columnName}_count`);
|
|
413
413
|
}
|
|
414
|
-
|
|
415
|
-
// NOTE: sanitizedSort has already had its '-' stripped by this point (line ~503),
|
|
416
|
-
// so we derive direction from sortOrder (computed before the strip) instead.
|
|
417
|
-
const sortDir = sortOrder === desc ? 'DESC' : 'ASC';
|
|
414
|
+
currentQuery = currentQuery.orderBy(sortOrder(sql`"sortPath"`));
|
|
418
415
|
const sortedUnionAlias = `${columnName}_sorted`;
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
columnName,
|
|
428
|
-
countColumnName: shouldCount ? `${columnName}_count` : undefined,
|
|
429
|
-
currentQuery,
|
|
430
|
-
limit,
|
|
431
|
-
onPath,
|
|
432
|
-
page,
|
|
433
|
-
sortDir,
|
|
434
|
-
sqlWhere,
|
|
435
|
-
where
|
|
436
|
-
});
|
|
437
|
-
} else {
|
|
438
|
-
// Fallback: correlated subquery per parent row.
|
|
439
|
-
// Used for single-doc reads (upsertRow / deleteOne) where N=1 and N+1 is negligible.
|
|
440
|
-
let limitOffsetSQL = sql.empty();
|
|
441
|
-
if (limit) {
|
|
442
|
-
limitOffsetSQL = sql` LIMIT ${limit}`;
|
|
443
|
-
}
|
|
444
|
-
if (page && limit !== 0) {
|
|
445
|
-
const offset = (page - 1) * limit;
|
|
446
|
-
if (offset > 0) {
|
|
447
|
-
limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`;
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
currentQuery = currentQuery.orderBy(sortOrder(sql`"sortPath"`));
|
|
451
|
-
let innerWhere = sql.raw(`"${sortedUnionAlias}"."${onPath}" = "${currentTableName}"."id"`);
|
|
452
|
-
if (where && Object.keys(where).length > 0) {
|
|
453
|
-
const additionalWhere = buildSQLWhere(where, sortedUnionAlias);
|
|
454
|
-
innerWhere = sql`${innerWhere} AND ${additionalWhere}`;
|
|
416
|
+
let limitOffsetSQL = sql.empty();
|
|
417
|
+
if (limit) {
|
|
418
|
+
limitOffsetSQL = sql` LIMIT ${limit}`;
|
|
419
|
+
}
|
|
420
|
+
if (page && limit !== 0) {
|
|
421
|
+
const offset = (page - 1) * limit;
|
|
422
|
+
if (offset > 0) {
|
|
423
|
+
limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`;
|
|
455
424
|
}
|
|
456
|
-
// IMPORTANT: For polymorphic joins, LIMIT must be applied AFTER correlating
|
|
457
|
-
// to the parent row. Otherwise, the limit applies globally across ALL parents,
|
|
458
|
-
// not per-parent.
|
|
459
|
-
currentArgs.extras[columnName] = sql`(
|
|
460
|
-
SELECT ${jsonAggBuildObject(adapter, {
|
|
461
|
-
id: sql.raw(`"${columnName}_subquery"."id"`),
|
|
462
|
-
relationTo: sql.raw(`"${columnName}_subquery"."relationTo"`)
|
|
463
|
-
})}
|
|
464
|
-
FROM (
|
|
465
|
-
SELECT * FROM ${sql`${currentQuery.as(sortedUnionAlias)}`}
|
|
466
|
-
WHERE ${innerWhere}${limitOffsetSQL}
|
|
467
|
-
) AS ${sql.raw(`"${columnName}_subquery"`)}
|
|
468
|
-
)`.as(columnName);
|
|
469
425
|
}
|
|
426
|
+
// Correlate to parent row + apply any join where filters
|
|
427
|
+
let innerWhere = sql.raw(`"${sortedUnionAlias}"."${onPath}" = "${currentTableName}"."id"`);
|
|
428
|
+
if (where && Object.keys(where).length > 0) {
|
|
429
|
+
const additionalWhere = buildSQLWhere(where, sortedUnionAlias);
|
|
430
|
+
innerWhere = sql`${innerWhere} AND ${additionalWhere}`;
|
|
431
|
+
}
|
|
432
|
+
// IMPORTANT: For polymorphic joins, LIMIT must be applied AFTER correlating to the parent row.
|
|
433
|
+
// Otherwise, the limit applies globally across ALL parents, not per-parent.
|
|
434
|
+
currentArgs.extras[columnName] = sql`(
|
|
435
|
+
SELECT ${jsonAggBuildObject(adapter, {
|
|
436
|
+
id: sql.raw(`"${subQueryAlias}"."id"`),
|
|
437
|
+
relationTo: sql.raw(`"${subQueryAlias}"."relationTo"`)
|
|
438
|
+
})}
|
|
439
|
+
FROM (
|
|
440
|
+
SELECT * FROM ${sql`${currentQuery.as(sortedUnionAlias)}`}
|
|
441
|
+
WHERE ${innerWhere}${limitOffsetSQL}
|
|
442
|
+
) AS ${sql.raw(`"${subQueryAlias}"`)}
|
|
443
|
+
)`.as(columnName);
|
|
470
444
|
} else {
|
|
471
445
|
const useDrafts = (versions || draftsEnabled) && hasDraftsEnabled(adapter.payload.collections[field.collection].config);
|
|
472
446
|
const fields = useDrafts ? buildVersionCollectionFields(adapter.payload.config, adapter.payload.collections[field.collection].config, true) : adapter.payload.collections[field.collection].config.flattenedFields;
|