@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.
Files changed (53) hide show
  1. package/dist/create.d.ts.map +1 -1
  2. package/dist/create.js +2 -1
  3. package/dist/create.js.map +1 -1
  4. package/dist/deleteMany.d.ts.map +1 -1
  5. package/dist/deleteMany.js +2 -0
  6. package/dist/deleteMany.js.map +1 -1
  7. package/dist/deleteOne.d.ts.map +1 -1
  8. package/dist/deleteOne.js +2 -0
  9. package/dist/deleteOne.js.map +1 -1
  10. package/dist/deleteVersions.d.ts.map +1 -1
  11. package/dist/deleteVersions.js +2 -0
  12. package/dist/deleteVersions.js.map +1 -1
  13. package/dist/find/buildFindManyArgs.d.ts +3 -28
  14. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  15. package/dist/find/buildFindManyArgs.js +1 -4
  16. package/dist/find/buildFindManyArgs.js.map +1 -1
  17. package/dist/find/findMany.d.ts.map +1 -1
  18. package/dist/find/findMany.js +1 -61
  19. package/dist/find/findMany.js.map +1 -1
  20. package/dist/find/traverseFields.d.ts.map +1 -1
  21. package/dist/find/traverseFields.js +27 -53
  22. package/dist/find/traverseFields.js.map +1 -1
  23. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  24. package/dist/queries/getTableColumnFromPath.js +27 -5
  25. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  26. package/dist/types.d.ts +18 -0
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js.map +1 -1
  29. package/dist/updateJobs.d.ts.map +1 -1
  30. package/dist/updateJobs.js +2 -1
  31. package/dist/updateJobs.js.map +1 -1
  32. package/dist/updateMany.d.ts.map +1 -1
  33. package/dist/updateMany.js +2 -1
  34. package/dist/updateMany.js.map +1 -1
  35. package/dist/updateOne.d.ts.map +1 -1
  36. package/dist/updateOne.js +2 -1
  37. package/dist/updateOne.js.map +1 -1
  38. package/dist/upsertRow/index.d.ts.map +1 -1
  39. package/dist/upsertRow/index.js +2 -0
  40. package/dist/upsertRow/index.js.map +1 -1
  41. package/dist/utilities/getPrimaryDb.d.ts +6 -0
  42. package/dist/utilities/getPrimaryDb.d.ts.map +1 -0
  43. package/dist/utilities/getPrimaryDb.js +10 -0
  44. package/dist/utilities/getPrimaryDb.js.map +1 -0
  45. package/dist/utilities/getTransaction.d.ts +3 -0
  46. package/dist/utilities/getTransaction.d.ts.map +1 -1
  47. package/dist/utilities/getTransaction.js +7 -0
  48. package/dist/utilities/getTransaction.js.map +1 -1
  49. package/dist/utilities/readAfterWrite.d.ts +17 -0
  50. package/dist/utilities/readAfterWrite.d.ts.map +1 -0
  51. package/dist/utilities/readAfterWrite.js +21 -0
  52. package/dist/utilities/readAfterWrite.js.map +1 -0
  53. package/package.json +3 -3
@@ -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;AASrC,eAAO,MAAM,MAAM,EAAE,MA6BpB,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,
@@ -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,CAAChB,YAAYI,WAAWa,IAAI;IAEnE,MAAMC,KAAK,MAAMhB,eAAe,IAAI,EAAEM;IAEtC,MAAMW,SAAS,MAAMlB,UAAU;QAC7BmB,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"}
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"}
@@ -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;AAWzC,eAAO,MAAM,UAAU,EAAE,UAoDxB,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"}
@@ -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
@@ -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;AAE9D,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,CAACf,YAAYS,iBAAiBO,IAAI;IAEzE,MAAMC,QAAQ,IAAI,CAACC,MAAM,CAACL,UAAU;IAEpC,MAAM,EAAEM,KAAK,EAAEZ,KAAK,EAAE,GAAGL,WAAW;QAClCkB,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,MAAMzB,SAAS;YAC5BmB,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,aAAazB,QACXkB,MAAMc,EAAE,EACRL,OAAOM,IAAI,CAACC,GAAG,CAAC,CAACC,MAAQA,IAAIH,EAAE;IAEnC;IAEA,MAAMI,KAAK,MAAMhC,eAAe,IAAI,EAAEG;IAEtC,MAAM,IAAI,CAAC8B,WAAW,CAAC;QACrBD;QACAtB;QACAN,OAAOiB;IACT;AACF,EAAC"}
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"}
@@ -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;AAaxC,eAAO,MAAM,SAAS,EAAE,SAwEvB,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
 
@@ -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;AAE9D,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,CAACnB,YAAYO,WAAWa,IAAI;IAEnE,IAAIC;IAEJ,MAAM,EAAEC,KAAK,EAAEC,YAAY,EAAEX,KAAK,EAAE,GAAGV,WAAW;QAChDsB,SAAS,IAAI;QACbC,QAAQlB,WAAWmB,eAAe;QAClCC,QAAQlB,KAAKkB;QACbV;QACAL,OAAOC;IACT;IAEA,MAAMe,KAAK,MAAMvB,eAAe,IAAI,EAAEI;IAEtC,MAAMoB,uBAAuB,MAAM1B,eAAe;QAChDqB,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,OAAOb,GAAG,IAAI,CAACmC,MAAM,CAACjB,UAAU,CAACe,EAAE,EAAEH,oBAAoB,CAAC,EAAE,CAACG,EAAE;QACjE;IACF,OAAO;QACL,MAAMG,eAAelC,kBAAkB;YACrCuB,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,OACAN,UAAU;QACRoB,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,OAAOb,GAAG,IAAI,CAACmC,MAAM,CAACjB,UAAU,CAACe,EAAE,EAAEX,YAAYW,EAAE;IACrD;IAEA,OAAOM;AACT,EAAC"}
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;AAWxF,eAAO,MAAM,cAAc,EAAE,cAoD5B,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"}
@@ -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;AAE9D,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,EAAEpB,YAAYO,cAAc,IAAI,CAACc,cAAc,EAAE;QACrFT,SAASb,yBAAyB,IAAI,CAACe,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,EAAEpB,YAAYsB,iBAAiBJ,IAAI,IAAI,IAAI,CAACG,cAAc,EAAE;QAEhET,SAASd,6BAA6B,IAAI,CAACgB,OAAO,CAACE,MAAM,EAAEM,kBAAkB;IAC/E,OAAO;QACL,MAAM,IAAIzB,SAAS;IACrB;IAEA,MAAM,EAAE2B,IAAI,EAAE,GAAG,MAAMvB,SAAS;QAC9BwB,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,MAAMlC,eAAe,IAAI,EAAEO;QAEtC,MAAM,IAAI,CAAC4B,WAAW,CAAC;YACrBD;YACAzB;YACAD,OAAOd,QAAQ,IAAI,CAAC0C,MAAM,CAAC3B,UAAU,CAACuB,EAAE,EAAEJ;QAC5C;IACF;IAEA,OAAON;AACT,EAAC"}
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, SQL } from 'drizzle-orm';
2
- import type { FlattenedField, JoinQuery, SelectType, Where } from 'payload';
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, useBatchPolymorphicJoins, versions, }: BuildFindQueryArgs) => Result;
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,GAAG,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAI3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIxE;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,YAAY,EAAE,GAAG,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,KAAK,GAAG,MAAM,CAAA;IAEvB,QAAQ,CAAC,EAAE,GAAG,CAAA;IACd,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,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;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,mBAAmB,EAAE,CAAA;IACzC,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,gJAa3B,kBAAkB,KAAG,MAsGvB,CAAA"}
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, useBatchPolymorphicJoins, versions })=>{
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, SQL } from 'drizzle-orm'\nimport type { FlattenedField, JoinQuery, SelectType, Where } from 'payload'\n\nimport { getSelectMode } from 'payload/shared'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\n\nimport { traverseFields } from './traverseFields.js'\n\n/**\n * Metadata captured by traverseFields for each polymorphic join field when\n * batch loading is enabled. findMany.ts uses this to execute a single batch\n * query per join field after the main parent query, avoiding N+1 correlated\n * subqueries.\n */\nexport type PolymorphicJoinInfo = {\n columnName: string\n countColumnName?: string\n // The unsorted UNION SQLSelect built from all child collection tables\n currentQuery: any\n limit: number\n onPath: string\n page?: number\n sortDir: 'ASC' | 'DESC'\n // Pre-built SQL condition for the join's where clause (alias: ${columnName}_pre)\n sqlWhere?: SQL\n where?: Where\n}\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 /**\n * When true, polymorphic join fields are deferred for batch loading by findMany.ts\n * instead of using per-row correlated subqueries. Only valid for PostgreSQL.\n * Populated into _polymorphicJoins on the returned Result.\n */\n useBatchPolymorphicJoins?: boolean\n versions?: boolean\n}\n\nexport type Result = {\n /** Populated only when useBatchPolymorphicJoins=true; processed by findMany.ts */\n _polymorphicJoins?: PolymorphicJoinInfo[]\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 useBatchPolymorphicJoins,\n versions,\n}: BuildFindQueryArgs): Result => {\n const result: Result = {\n extras: {},\n with: {},\n }\n\n if (useBatchPolymorphicJoins && adapter.name === 'postgres') {\n result._polymorphicJoins = []\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","useBatchPolymorphicJoins","versions","result","extras","with","name","_polymorphicJoins","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;AAqDpD,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,wBAAwB,EACxBC,QAAQ,EACW;IACnB,MAAMC,SAAiB;QACrBC,QAAQ,CAAC;QACTC,MAAM,CAAC;IACT;IAEA,IAAIJ,4BAA4BV,QAAQe,IAAI,KAAK,YAAY;QAC3DH,OAAOI,iBAAiB,GAAG,EAAE;IAC/B;IAEA,IAAIR,QAAQ;QACVI,OAAOK,OAAO,GAAG;YACfC,IAAI;QACN;IACF;IAEA,MAAMC,WAAmB;QACvBF,SAAST,SACL;YAAEY,SAAS;QAAK,IAChB;YACEF,IAAI;YACJG,WAAW;QACb;QACJR,QAAQ,CAAC;QACTC,MAAM,CAAC;IACT;IAEA,MAAMQ,mBAAmBd,SACrB,CAAC,IACD;QACEe,SAAS;QACTC,MAAM;QACNC,OAAO;IACT;IAEJ3B,eAAe;QACbqB;QACAnB;QACAC;QACAyB,aAAad;QACbe,kBAAkBlB;QAClBP;QACAC;QACAC;QACAC;QACAC;QACAC;QACAqB,MAAM;QACNpB;QACAqB,YAAYrB,SAASX,cAAcW,UAAUsB;QAC7CC,WAAW;QACXC,cAAcpB;QACdqB,mBAAmBxB;QACnBE;QACAW;IACF;IAEA,IAAItB,QAAQkC,MAAM,CAAC,GAAGzB,UAAU,MAAM,CAAC,CAAC,IAAIa,iBAAiBG,KAAK,EAAE;QAClEb,OAAOE,IAAI,CAACqB,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,IAAItC,QAAQkC,MAAM,CAAC,GAAGzB,UAAU,QAAQ,CAAC,CAAC,IAAIa,iBAAiBC,OAAO,EAAE;QACtEX,OAAOE,IAAI,CAAC2B,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,IAAItC,QAAQkC,MAAM,CAAC,GAAGzB,YAAYT,QAAQ0C,mBAAmB,EAAE,CAAC,IAAIpB,iBAAiBE,IAAI,EAAE;QACzFZ,OAAOE,IAAI,CAAC6B,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,IACEtC,QAAQkC,MAAM,CAAC,GAAGzB,YAAYT,QAAQ4C,aAAa,EAAE,CAAC,IACrD,CAAA,CAACpC,UAAUqC,OAAOC,IAAI,CAAC3B,SAASF,OAAO,EAAE8B,MAAM,GAAG,CAAA,GACnD;QACAnC,OAAOE,IAAI,CAACK,QAAQ,GAAGA;IACzB;IAEA,mCAAmC;IACnC,KAAK,MAAM6B,OAAOH,OAAOC,IAAI,CAAClC,QAAS;QACrC,IAAI,CAACiC,OAAOC,IAAI,CAAClC,MAAM,CAACoC,IAAI,EAAED,MAAM,EAAE;YACpC,OAAOnC,MAAM,CAACoC,IAAI;QACpB;IACF;IAEA,OAAOpC;AACT,EAAC"}
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;AAUjD,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;;;;;;;;;;;EA6QN,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"}
@@ -1,10 +1,9 @@
1
- import { asc, desc, inArray, max, min, sql } from 'drizzle-orm';
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,4BAk0BnB,CAAA"}
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
- // Sort direction for the batch / window-function query.
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
- if (currentArgs._polymorphicJoins) {
420
- // Batch mode (enabled by findMany.ts): defer loading to a single
421
- // post-query batch instead of executing a correlated subquery per parent row.
422
- // Pre-build the WHERE SQL using the alias that findMany.ts will use for the
423
- // UNION subquery (${columnName}_pre), so it can be applied without re-importing
424
- // buildSQLWhere.
425
- const sqlWhere = where && Object.keys(where).length > 0 ? buildSQLWhere(where, `${columnName}_pre`) : undefined;
426
- currentArgs._polymorphicJoins.push({
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;