@payloadcms/drizzle 4.0.0-internal.a2d053c → 4.0.0-internal.a5acc33

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 (180) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +25 -3
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.js +8 -3
  5. package/dist/countGlobalVersions.js.map +1 -1
  6. package/dist/countVersions.d.ts.map +1 -1
  7. package/dist/countVersions.js +29 -4
  8. package/dist/countVersions.js.map +1 -1
  9. package/dist/createGlobalVersion.d.ts.map +1 -1
  10. package/dist/createGlobalVersion.js +17 -2
  11. package/dist/createGlobalVersion.js.map +1 -1
  12. package/dist/createVersion.d.ts.map +1 -1
  13. package/dist/createVersion.js +12 -1
  14. package/dist/createVersion.js.map +1 -1
  15. package/dist/deleteBranchGlobal.d.ts +10 -0
  16. package/dist/deleteBranchGlobal.d.ts.map +1 -0
  17. package/dist/deleteBranchGlobal.js +27 -0
  18. package/dist/deleteBranchGlobal.js.map +1 -0
  19. package/dist/deleteOne.d.ts.map +1 -1
  20. package/dist/deleteOne.js +25 -1
  21. package/dist/deleteOne.js.map +1 -1
  22. package/dist/exports/postgres.d.ts +1 -1
  23. package/dist/exports/postgres.d.ts.map +1 -1
  24. package/dist/exports/postgres.js +1 -1
  25. package/dist/exports/postgres.js.map +1 -1
  26. package/dist/exports/sqlite.d.ts +1 -1
  27. package/dist/exports/sqlite.d.ts.map +1 -1
  28. package/dist/exports/sqlite.js +1 -1
  29. package/dist/exports/sqlite.js.map +1 -1
  30. package/dist/find/buildFindManyArgs.d.ts +3 -2
  31. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  32. package/dist/find/buildFindManyArgs.js +2 -1
  33. package/dist/find/buildFindManyArgs.js.map +1 -1
  34. package/dist/find/buildPolymorphicJoinQuery.d.ts +3 -2
  35. package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -1
  36. package/dist/find/buildPolymorphicJoinQuery.js +28 -11
  37. package/dist/find/buildPolymorphicJoinQuery.js.map +1 -1
  38. package/dist/find/findMany.d.ts +6 -1
  39. package/dist/find/findMany.d.ts.map +1 -1
  40. package/dist/find/findMany.js +16 -3
  41. package/dist/find/findMany.js.map +1 -1
  42. package/dist/find/traverseFields.d.ts +3 -2
  43. package/dist/find/traverseFields.d.ts.map +1 -1
  44. package/dist/find/traverseFields.js +63 -8
  45. package/dist/find/traverseFields.js.map +1 -1
  46. package/dist/find.d.ts.map +1 -1
  47. package/dist/find.js +32 -4
  48. package/dist/find.js.map +1 -1
  49. package/dist/findDistinct.d.ts.map +1 -1
  50. package/dist/findDistinct.js +104 -8
  51. package/dist/findDistinct.js.map +1 -1
  52. package/dist/findGlobal.d.ts.map +1 -1
  53. package/dist/findGlobal.js +24 -5
  54. package/dist/findGlobal.js.map +1 -1
  55. package/dist/findGlobalVersions.js +8 -3
  56. package/dist/findGlobalVersions.js.map +1 -1
  57. package/dist/findOne.d.ts +1 -1
  58. package/dist/findOne.d.ts.map +1 -1
  59. package/dist/findOne.js +30 -3
  60. package/dist/findOne.js.map +1 -1
  61. package/dist/findVersions.d.ts.map +1 -1
  62. package/dist/findVersions.js +32 -5
  63. package/dist/findVersions.js.map +1 -1
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/postgres/insert.d.ts.map +1 -1
  69. package/dist/postgres/insert.js +4 -2
  70. package/dist/postgres/insert.js.map +1 -1
  71. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  72. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  73. package/dist/postgres/requireDrizzleKit.d.ts +4 -0
  74. package/dist/postgres/requireDrizzleKit.d.ts.map +1 -1
  75. package/dist/postgres/requireDrizzleKit.js +16 -10
  76. package/dist/postgres/requireDrizzleKit.js.map +1 -1
  77. package/dist/postgres/types.d.ts +4 -0
  78. package/dist/postgres/types.d.ts.map +1 -1
  79. package/dist/postgres/types.js.map +1 -1
  80. package/dist/queries/buildAndOrConditions.d.ts +3 -2
  81. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  82. package/dist/queries/buildAndOrConditions.js +2 -1
  83. package/dist/queries/buildAndOrConditions.js.map +1 -1
  84. package/dist/queries/buildBranchVisibility.d.ts +11 -0
  85. package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
  86. package/dist/queries/buildBranchVisibility.js +48 -0
  87. package/dist/queries/buildBranchVisibility.js.map +1 -0
  88. package/dist/queries/buildOrderBy.d.ts +3 -2
  89. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  90. package/dist/queries/buildOrderBy.js +2 -1
  91. package/dist/queries/buildOrderBy.js.map +1 -1
  92. package/dist/queries/buildQuery.d.ts +3 -2
  93. package/dist/queries/buildQuery.d.ts.map +1 -1
  94. package/dist/queries/buildQuery.js +4 -2
  95. package/dist/queries/buildQuery.js.map +1 -1
  96. package/dist/queries/getTableColumnFromPath.d.ts +3 -2
  97. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  98. package/dist/queries/getTableColumnFromPath.js +167 -29
  99. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  100. package/dist/queries/parseParams.d.ts +3 -2
  101. package/dist/queries/parseParams.d.ts.map +1 -1
  102. package/dist/queries/parseParams.js +4 -1
  103. package/dist/queries/parseParams.js.map +1 -1
  104. package/dist/queryDrafts.d.ts.map +1 -1
  105. package/dist/queryDrafts.js +27 -5
  106. package/dist/queryDrafts.js.map +1 -1
  107. package/dist/schema/build.d.ts.map +1 -1
  108. package/dist/schema/build.js +25 -17
  109. package/dist/schema/build.js.map +1 -1
  110. package/dist/sqlite/createRequireDrizzleKit.d.ts +6 -0
  111. package/dist/sqlite/createRequireDrizzleKit.d.ts.map +1 -0
  112. package/dist/sqlite/createRequireDrizzleKit.js +15 -0
  113. package/dist/sqlite/createRequireDrizzleKit.js.map +1 -0
  114. package/dist/sqlite/insert.d.ts.map +1 -1
  115. package/dist/sqlite/insert.js +5 -3
  116. package/dist/sqlite/insert.js.map +1 -1
  117. package/dist/sqlite/types.d.ts +4 -0
  118. package/dist/sqlite/types.d.ts.map +1 -1
  119. package/dist/sqlite/types.js.map +1 -1
  120. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  121. package/dist/transactions/beginTransaction.js +13 -5
  122. package/dist/transactions/beginTransaction.js.map +1 -1
  123. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  124. package/dist/transactions/commitTransaction.js +2 -5
  125. package/dist/transactions/commitTransaction.js.map +1 -1
  126. package/dist/transform/write/array.d.ts +3 -2
  127. package/dist/transform/write/array.d.ts.map +1 -1
  128. package/dist/transform/write/array.js +2 -1
  129. package/dist/transform/write/array.js.map +1 -1
  130. package/dist/transform/write/blocks.d.ts +3 -2
  131. package/dist/transform/write/blocks.d.ts.map +1 -1
  132. package/dist/transform/write/blocks.js +2 -1
  133. package/dist/transform/write/blocks.js.map +1 -1
  134. package/dist/transform/write/index.d.ts.map +1 -1
  135. package/dist/transform/write/index.js +2 -0
  136. package/dist/transform/write/index.js.map +1 -1
  137. package/dist/transform/write/traverseFields.d.ts +2 -1
  138. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  139. package/dist/transform/write/traverseFields.js +43 -7
  140. package/dist/transform/write/traverseFields.js.map +1 -1
  141. package/dist/transform/write/types.d.ts +7 -0
  142. package/dist/transform/write/types.d.ts.map +1 -1
  143. package/dist/transform/write/types.js.map +1 -1
  144. package/dist/types.d.ts +3 -2
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js.map +1 -1
  147. package/dist/updateGlobal.d.ts +5 -1
  148. package/dist/updateGlobal.d.ts.map +1 -1
  149. package/dist/updateGlobal.js +96 -4
  150. package/dist/updateGlobal.js.map +1 -1
  151. package/dist/updateOne.d.ts.map +1 -1
  152. package/dist/updateOne.js +54 -5
  153. package/dist/updateOne.js.map +1 -1
  154. package/dist/upsertBranchGlobalChange.d.ts +3 -0
  155. package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
  156. package/dist/upsertBranchGlobalChange.js +35 -0
  157. package/dist/upsertBranchGlobalChange.js.map +1 -0
  158. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  159. package/dist/upsertRow/deleteExistingRowsByPath.js +17 -12
  160. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  161. package/dist/upsertRow/index.d.ts +1 -1
  162. package/dist/upsertRow/index.d.ts.map +1 -1
  163. package/dist/upsertRow/index.js +132 -42
  164. package/dist/upsertRow/index.js.map +1 -1
  165. package/dist/upsertRow/types.d.ts +3 -0
  166. package/dist/upsertRow/types.d.ts.map +1 -1
  167. package/dist/upsertRow/types.js.map +1 -1
  168. package/dist/utilities/blocksToJsonMigrator.js +1 -1
  169. package/dist/utilities/blocksToJsonMigrator.js.map +1 -1
  170. package/dist/utilities/buildCreateMigration.js +1 -1
  171. package/dist/utilities/buildCreateMigration.js.map +1 -1
  172. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +1 -1
  173. package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -1
  174. package/dist/utilities/pushDevSchema.js +1 -1
  175. package/dist/utilities/pushDevSchema.js.map +1 -1
  176. package/package.json +4 -3
  177. package/dist/sqlite/requireDrizzleKit.d.ts +0 -3
  178. package/dist/sqlite/requireDrizzleKit.d.ts.map +0 -1
  179. package/dist/sqlite/requireDrizzleKit.js +0 -12
  180. package/dist/sqlite/requireDrizzleKit.js.map +0 -1
@@ -2,7 +2,7 @@ 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, versions })=>{
5
+ export const buildFindManyArgs = ({ adapter, collectionSlug, depth, draftsEnabled, fields, joinQuery, joins = [], locale, req, select, tableName, versions })=>{
6
6
  const result = {
7
7
  extras: {},
8
8
  with: {}
@@ -40,6 +40,7 @@ export const buildFindManyArgs = ({ adapter, collectionSlug, depth, draftsEnable
40
40
  joins,
41
41
  locale,
42
42
  path: '',
43
+ req,
43
44
  select,
44
45
  selectMode: select ? getSelectMode(select) : undefined,
45
46
  tablePath: '',
@@ -1 +1 @@
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
+ {"version":3,"sources":["../../src/find/buildFindManyArgs.ts"],"sourcesContent":["import type { DBQueryConfig } from 'drizzle-orm'\nimport type { FlattenedField, JoinQuery, PayloadRequest, 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 req?: Partial<PayloadRequest>\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 req,\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 req,\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","req","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;AA0BpD,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,GAAG,EACHC,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;IAEJzB,eAAe;QACbmB;QACAjB;QACAC;QACAuB,aAAaZ;QACba,kBAAkBf;QAClBR;QACAC;QACAC;QACAC;QACAC;QACAC;QACAmB,MAAM;QACNlB;QACAC;QACAkB,YAAYlB,SAASZ,cAAcY,UAAUmB;QAC7CC,WAAW;QACXC,cAAclB;QACdmB,mBAAmBrB;QACnBC;QACAS;IACF;IAEA,IAAIpB,QAAQgC,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,IAAIpC,QAAQgC,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,IAAIpC,QAAQgC,MAAM,CAAC,GAAGtB,YAAYV,QAAQwC,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,IACEpC,QAAQgC,MAAM,CAAC,GAAGtB,YAAYV,QAAQ0C,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,5 +1,5 @@
1
1
  import type { SQL } from 'drizzle-orm';
2
- import { type FlattenedJoinField, type Where } from 'payload';
2
+ import { type FlattenedJoinField, type PayloadRequest, type Where } from 'payload';
3
3
  import type { DrizzleAdapter } from '../types.js';
4
4
  type BuildPolymorphicJoinQueryArgs = {
5
5
  adapter: DrizzleAdapter;
@@ -10,6 +10,7 @@ type BuildPolymorphicJoinQueryArgs = {
10
10
  page?: number;
11
11
  pageSize?: number;
12
12
  path: string;
13
+ req?: Partial<PayloadRequest>;
13
14
  shouldCount: boolean;
14
15
  sort?: string | string[];
15
16
  where?: Where;
@@ -34,6 +35,6 @@ type PolymorphicJoinQuery = {
34
35
  * @throws If the join definition, target collection, mapped table, required columns, or sort shape
35
36
  * cannot be represented by the polymorphic query.
36
37
  */
37
- export declare const buildPolymorphicJoinQuery: ({ adapter, currentTableName, field, limit, locale, page, pageSize, path, shouldCount, sort, where, }: BuildPolymorphicJoinQueryArgs) => PolymorphicJoinQuery;
38
+ export declare const buildPolymorphicJoinQuery: ({ adapter, currentTableName, field, limit, locale, page, pageSize, path, req, shouldCount, sort, where, }: BuildPolymorphicJoinQueryArgs) => PolymorphicJoinQuery;
38
39
  export {};
39
40
  //# sourceMappingURL=buildPolymorphicJoinQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildPolymorphicJoinQuery.d.ts","sourceRoot":"","sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAO/D,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACnB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,yGAYnC,6BAA6B,KAAG,oBAmJlC,CAAA"}
1
+ {"version":3,"file":"buildPolymorphicJoinQuery.d.ts","sourceRoot":"","sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,cAAc,EAEnB,KAAK,KAAK,EACX,MAAM,SAAS,CAAA;AAGhB,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAQ/D,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACnB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,8GAanC,6BAA6B,KAAG,oBAsKlC,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import { and, asc, count, desc, eq, getTableName, sql } from 'drizzle-orm';
2
+ import { combineQueries, getBranchPredicateSync, resolveBranchReadState } from 'payload';
2
3
  import toSnakeCase from 'to-snake-case';
4
+ import { buildBranchVisibility } from '../queries/buildBranchVisibility.js';
3
5
  import { jsonAggBuildObject } from '../utilities/json.js';
4
6
  import { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js';
5
7
  import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js';
@@ -17,7 +19,7 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
17
19
  * `shouldCount` is true.
18
20
  * @throws If the join definition, target collection, mapped table, required columns, or sort shape
19
21
  * cannot be represented by the polymorphic query.
20
- */ export const buildPolymorphicJoinQuery = ({ adapter, currentTableName, field, limit, locale, page, pageSize = limit, path, shouldCount, sort, where })=>{
22
+ */ export const buildPolymorphicJoinQuery = ({ adapter, currentTableName, field, limit, locale, page, pageSize = limit, path, req, shouldCount, sort, where })=>{
21
23
  if (!Array.isArray(field.collection)) {
22
24
  throw new Error('A polymorphic join requires a collection array');
23
25
  }
@@ -58,28 +60,43 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
58
60
  });
59
61
  const sortOrder = sortField.startsWith('-') ? desc : asc;
60
62
  const sortPath = sortField.replace('-', '').split('.').join('_');
61
- const wherePlan = where ? createPolymorphicJoinWherePlan({
62
- adapter,
63
- collections,
64
- where
65
- }) : new Map();
66
63
  let unionQuery = null;
67
64
  for (const { collection, table } of collectionTables){
65
+ const branchReadState = resolveBranchReadState({
66
+ collectionSlug: collection,
67
+ req
68
+ });
69
+ const branchPredicate = branchReadState.useBranching ? null : getBranchPredicateSync({
70
+ collectionSlug: collection,
71
+ req
72
+ });
73
+ const collectionWhere = branchPredicate ? combineQueries(where ?? {}, branchPredicate) : where;
74
+ const wherePlan = collectionWhere ? createPolymorphicJoinWherePlan({
75
+ adapter,
76
+ collections,
77
+ where: collectionWhere
78
+ }) : new Map();
68
79
  const sortColumn = table[sortPath];
69
80
  const selectFields = {
70
- id: table['id'],
81
+ id: (branchReadState.useBranching || branchPredicate) && table['_branchDocID'] ? sql`COALESCE(${table['_branchDocID']}, ${table['id']})`.as('id') : table['id'],
71
82
  parent: sql`${table[onPath]}`.as(onPath),
72
83
  relationTo: sql`${collection}`.as('relationTo'),
73
84
  sortPath: sql`${sortColumn ?? null}`.as('sortPath')
74
85
  };
75
- const collectionWhere = where && Object.keys(where).length > 0 ? buildPolymorphicJoinWhere({
86
+ const parsedCollectionWhere = collectionWhere && Object.keys(collectionWhere).length > 0 ? buildPolymorphicJoinWhere({
76
87
  adapter,
77
88
  collection,
78
89
  locale,
79
90
  table,
80
- where,
91
+ where: collectionWhere,
81
92
  wherePlan
82
93
  }) : undefined;
94
+ const collectionWhereSQL = branchReadState.useBranching ? and(parsedCollectionWhere, buildBranchVisibility({
95
+ adapter,
96
+ branch: branchReadState.branch,
97
+ collectionSlug: collection,
98
+ table
99
+ })) : parsedCollectionWhere;
83
100
  const hasLocalizedWhere = [
84
101
  ...wherePlan.values()
85
102
  ].some((pathPlan)=>{
@@ -92,8 +109,8 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
92
109
  const localesTable = adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`];
93
110
  collectionQuery = collectionQuery.leftJoin(localesTable, and(eq(table['id'], localesTable._parentID), locale && locale !== 'all' ? eq(localesTable._locale, locale) : undefined));
94
111
  }
95
- if (collectionWhere) {
96
- collectionQuery = collectionQuery.where(collectionWhere);
112
+ if (collectionWhereSQL) {
113
+ collectionQuery = collectionQuery.where(collectionWhereSQL);
97
114
  }
98
115
  if (unionQuery === null) {
99
116
  unionQuery = collectionQuery;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { and, asc, count, desc, eq, getTableName, sql } from 'drizzle-orm'\nimport { type FlattenedJoinField, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type { PolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js'\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype BuildPolymorphicJoinQueryArgs = {\n adapter: DrizzleAdapter\n currentTableName: string\n field: FlattenedJoinField\n limit: number\n locale?: string\n page?: number\n pageSize?: number\n path: string\n shouldCount: boolean\n sort?: string | string[]\n where?: Where\n}\n\ntype PolymorphicJoinQuery = {\n columnName: string\n count?: SQL.Aliased\n documents: SQL.Aliased\n}\n\n/**\n * Builds the correlated document and optional count projections for a join that targets multiple\n * collections. Every collection branch exposes the same `id`, parent, `relationTo`, and sort\n * columns before the branches are combined. A missing sort field resolves to SQL NULL so targets\n * with different schemas can still share one ordered union.\n *\n * `field.collection` must contain at least one configured collection. Each mapped table must have\n * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can\n * include an extra look-ahead row and supply the original `pageSize` for offset calculation.\n *\n * @returns The stable projection name, the document projection, and the count projection when\n * `shouldCount` is true.\n * @throws If the join definition, target collection, mapped table, required columns, or sort shape\n * cannot be represented by the polymorphic query.\n */\nexport const buildPolymorphicJoinQuery = ({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n pageSize = limit,\n path,\n shouldCount,\n sort,\n where,\n}: BuildPolymorphicJoinQueryArgs): PolymorphicJoinQuery => {\n if (!Array.isArray(field.collection)) {\n throw new Error('A polymorphic join requires a collection array')\n }\n\n if (field.collection.length === 0) {\n throw new Error('A polymorphic join requires at least one collection')\n }\n\n if (Array.isArray(sort)) {\n throw new Error('Polymorphic joins do not support multiple sort fields')\n }\n\n const collections = field.collection\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n const db = adapter.drizzle as LibSQLDatabase\n const onPath = field.on.split('.').join('_')\n const collectionTables = collections.map((collection) => {\n if (!adapter.payload.collections[collection]) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n if (!table['id']) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"id\" column`)\n }\n\n if (!table[onPath]) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"${onPath}\" column`)\n }\n\n return { collection, table }\n })\n const sortField = getSortField({ adapter, collections, sort })\n const sortOrder = sortField.startsWith('-') ? desc : asc\n const sortPath = sortField.replace('-', '').split('.').join('_')\n const wherePlan: PolymorphicJoinWherePlan = where\n ? createPolymorphicJoinWherePlan({ adapter, collections, where })\n : new Map()\n let unionQuery: null | SQLiteSelect = null\n\n for (const { collection, table } of collectionTables) {\n const sortColumn = table[sortPath]\n const selectFields = {\n id: table['id'],\n parent: sql`${table[onPath]}`.as(onPath),\n relationTo: sql`${collection}`.as('relationTo'),\n sortPath: sql`${sortColumn ?? null}`.as('sortPath'),\n }\n const collectionWhere =\n where && Object.keys(where).length > 0\n ? buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where,\n wherePlan,\n })\n : undefined\n const hasLocalizedWhere = [...wherePlan.values()].some((pathPlan) => {\n const collectionField = pathPlan.fieldsByCollection.get(collection)\n\n return collectionField?.type === 'scalar' && collectionField.isLocalized\n })\n const shouldDeduplicate = hasLocalizedWhere && (!locale || locale === 'all')\n let collectionQuery = (\n shouldDeduplicate ? db.selectDistinct(selectFields) : db.select(selectFields)\n )\n .from(table)\n .$dynamic()\n\n if (hasLocalizedWhere) {\n const localesTable = adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`]\n\n collectionQuery = collectionQuery.leftJoin(\n localesTable,\n and(\n eq(table['id'], localesTable._parentID),\n locale && locale !== 'all' ? eq(localesTable._locale, locale) : undefined,\n ),\n )\n }\n\n if (collectionWhere) {\n collectionQuery = collectionQuery.where(collectionWhere)\n }\n\n if (unionQuery === null) {\n unionQuery = collectionQuery\n } else {\n unionQuery = unionQuery.unionAll(collectionQuery)\n }\n }\n\n const subQueryAlias = `${columnName}_subquery`\n const parentConstraint = eq(\n sql.raw(`\"${currentTableName}\".\"id\"`),\n sql.raw(`\"${subQueryAlias}\".\"${onPath}\"`),\n )\n const countExpression = shouldCount\n ? sql`${db\n .select({ count: count() })\n .from(sql`${unionQuery.as(subQueryAlias)}`)\n .where(parentConstraint)}`.as(`${columnName}_count`)\n : undefined\n\n unionQuery = unionQuery.orderBy(sortOrder(sql`\"sortPath\"`))\n\n const sortedUnionAlias = `${columnName}_sorted`\n let limitOffsetSQL = sql.empty()\n\n if (limit) {\n limitOffsetSQL = sql` LIMIT ${limit}`\n }\n\n if (page && limit !== 0) {\n const offset = (page - 1) * pageSize\n\n if (offset > 0) {\n limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`\n }\n }\n\n const parentWhere = sql.raw(`\"${sortedUnionAlias}\".\"${onPath}\" = \"${currentTableName}\".\"id\"`)\n const documents = sql`(\n SELECT ${jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".\"id\"`),\n relationTo: sql.raw(`\"${subQueryAlias}\".\"relationTo\"`),\n })}\n FROM (\n SELECT * FROM ${sql`${unionQuery.as(sortedUnionAlias)}`}\n WHERE ${parentWhere}${limitOffsetSQL}\n ) AS ${sql.raw(`\"${subQueryAlias}\"`)}\n )`.as(columnName)\n\n return {\n columnName,\n count: countExpression,\n documents,\n }\n}\n\nconst getSortField = ({\n adapter,\n collections,\n sort,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n sort?: string\n}): string => {\n if (sort) {\n return sort\n }\n\n const hasCreatedAt = collections.some((collection) =>\n adapter.payload.collections[collection].config.fields.some(\n (field) => field.type === 'date' && field.name === 'createdAt',\n ),\n )\n\n return hasCreatedAt ? '-createdAt' : 'id'\n}\n"],"names":["and","asc","count","desc","eq","getTableName","sql","toSnakeCase","jsonAggBuildObject","buildPolymorphicJoinWhere","createPolymorphicJoinWherePlan","buildPolymorphicJoinQuery","adapter","currentTableName","field","limit","locale","page","pageSize","path","shouldCount","sort","where","Array","isArray","collection","Error","length","collections","columnName","replaceAll","name","db","drizzle","onPath","on","split","join","collectionTables","map","payload","tableName","tableNameMap","get","table","tables","undefined","sortField","getSortField","sortOrder","startsWith","sortPath","replace","wherePlan","Map","unionQuery","sortColumn","selectFields","id","parent","as","relationTo","collectionWhere","Object","keys","hasLocalizedWhere","values","some","pathPlan","collectionField","fieldsByCollection","type","isLocalized","shouldDeduplicate","collectionQuery","selectDistinct","select","from","$dynamic","localesTable","localesSuffix","leftJoin","_parentID","_locale","unionAll","subQueryAlias","parentConstraint","raw","countExpression","orderBy","sortedUnionAlias","limitOffsetSQL","empty","offset","parentWhere","documents","hasCreatedAt","config","fields"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { and, asc, count, desc, eq, getTableName, sql } from 'drizzle-orm'\nimport {\n combineQueries,\n type FlattenedJoinField,\n getBranchPredicateSync,\n type PayloadRequest,\n resolveBranchReadState,\n type Where,\n} from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type { PolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\nimport { buildBranchVisibility } from '../queries/buildBranchVisibility.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js'\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype BuildPolymorphicJoinQueryArgs = {\n adapter: DrizzleAdapter\n currentTableName: string\n field: FlattenedJoinField\n limit: number\n locale?: string\n page?: number\n pageSize?: number\n path: string\n req?: Partial<PayloadRequest>\n shouldCount: boolean\n sort?: string | string[]\n where?: Where\n}\n\ntype PolymorphicJoinQuery = {\n columnName: string\n count?: SQL.Aliased\n documents: SQL.Aliased\n}\n\n/**\n * Builds the correlated document and optional count projections for a join that targets multiple\n * collections. Every collection branch exposes the same `id`, parent, `relationTo`, and sort\n * columns before the branches are combined. A missing sort field resolves to SQL NULL so targets\n * with different schemas can still share one ordered union.\n *\n * `field.collection` must contain at least one configured collection. Each mapped table must have\n * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can\n * include an extra look-ahead row and supply the original `pageSize` for offset calculation.\n *\n * @returns The stable projection name, the document projection, and the count projection when\n * `shouldCount` is true.\n * @throws If the join definition, target collection, mapped table, required columns, or sort shape\n * cannot be represented by the polymorphic query.\n */\nexport const buildPolymorphicJoinQuery = ({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n pageSize = limit,\n path,\n req,\n shouldCount,\n sort,\n where,\n}: BuildPolymorphicJoinQueryArgs): PolymorphicJoinQuery => {\n if (!Array.isArray(field.collection)) {\n throw new Error('A polymorphic join requires a collection array')\n }\n\n if (field.collection.length === 0) {\n throw new Error('A polymorphic join requires at least one collection')\n }\n\n if (Array.isArray(sort)) {\n throw new Error('Polymorphic joins do not support multiple sort fields')\n }\n\n const collections = field.collection\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n const db = adapter.drizzle as LibSQLDatabase\n const onPath = field.on.split('.').join('_')\n const collectionTables = collections.map((collection) => {\n if (!adapter.payload.collections[collection]) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n if (!table['id']) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"id\" column`)\n }\n\n if (!table[onPath]) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"${onPath}\" column`)\n }\n\n return { collection, table }\n })\n const sortField = getSortField({ adapter, collections, sort })\n const sortOrder = sortField.startsWith('-') ? desc : asc\n const sortPath = sortField.replace('-', '').split('.').join('_')\n let unionQuery: null | SQLiteSelect = null\n\n for (const { collection, table } of collectionTables) {\n const branchReadState = resolveBranchReadState({ collectionSlug: collection, req })\n const branchPredicate = branchReadState.useBranching\n ? null\n : getBranchPredicateSync({ collectionSlug: collection, req })\n const collectionWhere = branchPredicate ? combineQueries(where ?? {}, branchPredicate) : where\n const wherePlan: PolymorphicJoinWherePlan = collectionWhere\n ? createPolymorphicJoinWherePlan({ adapter, collections, where: collectionWhere })\n : new Map()\n const sortColumn = table[sortPath]\n const selectFields = {\n id:\n (branchReadState.useBranching || branchPredicate) && table['_branchDocID']\n ? sql`COALESCE(${table['_branchDocID']}, ${table['id']})`.as('id')\n : table['id'],\n parent: sql`${table[onPath]}`.as(onPath),\n relationTo: sql`${collection}`.as('relationTo'),\n sortPath: sql`${sortColumn ?? null}`.as('sortPath'),\n }\n const parsedCollectionWhere =\n collectionWhere && Object.keys(collectionWhere).length > 0\n ? buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where: collectionWhere,\n wherePlan,\n })\n : undefined\n const collectionWhereSQL = branchReadState.useBranching\n ? and(\n parsedCollectionWhere,\n buildBranchVisibility({\n adapter,\n branch: branchReadState.branch,\n collectionSlug: collection,\n table,\n }),\n )\n : parsedCollectionWhere\n const hasLocalizedWhere = [...wherePlan.values()].some((pathPlan) => {\n const collectionField = pathPlan.fieldsByCollection.get(collection)\n\n return collectionField?.type === 'scalar' && collectionField.isLocalized\n })\n const shouldDeduplicate = hasLocalizedWhere && (!locale || locale === 'all')\n let collectionQuery = (\n shouldDeduplicate ? db.selectDistinct(selectFields) : db.select(selectFields)\n )\n .from(table)\n .$dynamic()\n\n if (hasLocalizedWhere) {\n const localesTable = adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`]\n\n collectionQuery = collectionQuery.leftJoin(\n localesTable,\n and(\n eq(table['id'], localesTable._parentID),\n locale && locale !== 'all' ? eq(localesTable._locale, locale) : undefined,\n ),\n )\n }\n\n if (collectionWhereSQL) {\n collectionQuery = collectionQuery.where(collectionWhereSQL)\n }\n\n if (unionQuery === null) {\n unionQuery = collectionQuery\n } else {\n unionQuery = unionQuery.unionAll(collectionQuery)\n }\n }\n\n const subQueryAlias = `${columnName}_subquery`\n const parentConstraint = eq(\n sql.raw(`\"${currentTableName}\".\"id\"`),\n sql.raw(`\"${subQueryAlias}\".\"${onPath}\"`),\n )\n const countExpression = shouldCount\n ? sql`${db\n .select({ count: count() })\n .from(sql`${unionQuery.as(subQueryAlias)}`)\n .where(parentConstraint)}`.as(`${columnName}_count`)\n : undefined\n\n unionQuery = unionQuery.orderBy(sortOrder(sql`\"sortPath\"`))\n\n const sortedUnionAlias = `${columnName}_sorted`\n let limitOffsetSQL = sql.empty()\n\n if (limit) {\n limitOffsetSQL = sql` LIMIT ${limit}`\n }\n\n if (page && limit !== 0) {\n const offset = (page - 1) * pageSize\n\n if (offset > 0) {\n limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`\n }\n }\n\n const parentWhere = sql.raw(`\"${sortedUnionAlias}\".\"${onPath}\" = \"${currentTableName}\".\"id\"`)\n const documents = sql`(\n SELECT ${jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".\"id\"`),\n relationTo: sql.raw(`\"${subQueryAlias}\".\"relationTo\"`),\n })}\n FROM (\n SELECT * FROM ${sql`${unionQuery.as(sortedUnionAlias)}`}\n WHERE ${parentWhere}${limitOffsetSQL}\n ) AS ${sql.raw(`\"${subQueryAlias}\"`)}\n )`.as(columnName)\n\n return {\n columnName,\n count: countExpression,\n documents,\n }\n}\n\nconst getSortField = ({\n adapter,\n collections,\n sort,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n sort?: string\n}): string => {\n if (sort) {\n return sort\n }\n\n const hasCreatedAt = collections.some((collection) =>\n adapter.payload.collections[collection].config.fields.some(\n (field) => field.type === 'date' && field.name === 'createdAt',\n ),\n )\n\n return hasCreatedAt ? '-createdAt' : 'id'\n}\n"],"names":["and","asc","count","desc","eq","getTableName","sql","combineQueries","getBranchPredicateSync","resolveBranchReadState","toSnakeCase","buildBranchVisibility","jsonAggBuildObject","buildPolymorphicJoinWhere","createPolymorphicJoinWherePlan","buildPolymorphicJoinQuery","adapter","currentTableName","field","limit","locale","page","pageSize","path","req","shouldCount","sort","where","Array","isArray","collection","Error","length","collections","columnName","replaceAll","name","db","drizzle","onPath","on","split","join","collectionTables","map","payload","tableName","tableNameMap","get","table","tables","undefined","sortField","getSortField","sortOrder","startsWith","sortPath","replace","unionQuery","branchReadState","collectionSlug","branchPredicate","useBranching","collectionWhere","wherePlan","Map","sortColumn","selectFields","id","as","parent","relationTo","parsedCollectionWhere","Object","keys","collectionWhereSQL","branch","hasLocalizedWhere","values","some","pathPlan","collectionField","fieldsByCollection","type","isLocalized","shouldDeduplicate","collectionQuery","selectDistinct","select","from","$dynamic","localesTable","localesSuffix","leftJoin","_parentID","_locale","unionAll","subQueryAlias","parentConstraint","raw","countExpression","orderBy","sortedUnionAlias","limitOffsetSQL","empty","offset","parentWhere","documents","hasCreatedAt","config","fields"],"mappings":"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"}
@@ -2,12 +2,17 @@ import type { FindArgs, FlattenedField } from 'payload';
2
2
  import type { DrizzleAdapter } from '../types.js';
3
3
  type Args = {
4
4
  adapter: DrizzleAdapter;
5
+ branchVisibility?: {
6
+ branch: string;
7
+ collectionSlug: string;
8
+ mode?: 'documents' | 'history';
9
+ };
5
10
  collectionSlug?: string;
6
11
  fields: FlattenedField[];
7
12
  tableName: string;
8
13
  versions?: boolean;
9
14
  } & Omit<FindArgs, 'collection'>;
10
- export declare const findMany: ({ adapter, collectionSlug, draftsEnabled, fields, joins: joinQuery, limit: limitArg, locale, page, pagination, req, select, sort, tableName, versions, where: whereArg, }: Args) => Promise<{
15
+ export declare const findMany: ({ adapter, branchVisibility, collectionSlug, draftsEnabled, fields, joins: joinQuery, limit: limitArg, locale, page, pagination, req, select, sort, tableName, versions, where: whereArg, }: Args) => Promise<{
11
16
  docs: any;
12
17
  hasNextPage: boolean;
13
18
  hasPrevPage: boolean;
@@ -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;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
+ {"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,gBAAgB,CAAC,EAAE;QACjB,MAAM,EAAE,MAAM,CAAA;QACd,cAAc,EAAE,MAAM,CAAA;QACtB,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KAC/B,CAAA;IACD,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,gMAiBlB,IAAI;;;;;;;;;;;EA6NN,CAAA"}
@@ -1,11 +1,12 @@
1
- import { asc, desc, inArray, max, min } from 'drizzle-orm';
1
+ import { and, asc, desc, inArray, max, min, sql } from 'drizzle-orm';
2
+ import { buildBranchVisibility } from '../queries/buildBranchVisibility.js';
2
3
  import { buildQuery } from '../queries/buildQuery.js';
3
4
  import { selectDistinct } from '../queries/selectDistinct.js';
4
5
  import { transform } from '../transform/read/index.js';
5
6
  import { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js';
6
7
  import { getTransaction } from '../utilities/getTransaction.js';
7
8
  import { buildFindManyArgs } from './buildFindManyArgs.js';
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 }) {
9
+ export const findMany = async function find({ adapter, branchVisibility, collectionSlug, draftsEnabled, fields, joins: joinQuery, limit: limitArg, locale, page = 1, pagination, req, select, sort, tableName, versions, where: whereArg }) {
9
10
  let limit = limitArg;
10
11
  let totalDocs;
11
12
  let totalPages;
@@ -17,14 +18,25 @@ export const findMany = async function find({ adapter, collectionSlug, draftsEna
17
18
  pagination = false;
18
19
  limit = undefined;
19
20
  }
20
- const { joins, orderBy, selectFields, where } = buildQuery({
21
+ const { joins, orderBy, selectFields, where: queryWhere } = buildQuery({
21
22
  adapter,
22
23
  fields,
23
24
  locale,
25
+ req,
24
26
  sort,
25
27
  tableName,
26
28
  where: whereArg
27
29
  });
30
+ const table = adapter.tables[tableName];
31
+ const branchVisibilityWhere = branchVisibility ? buildBranchVisibility({
32
+ adapter,
33
+ branch: branchVisibility.branch,
34
+ canonicalIDExpression: versions ? sql`COALESCE(${table._branchParent}, ${table.parent})` : undefined,
35
+ collectionSlug: branchVisibility.collectionSlug,
36
+ mode: branchVisibility.mode,
37
+ table
38
+ }) : undefined;
39
+ const where = branchVisibilityWhere ? and(queryWhere, branchVisibilityWhere) : queryWhere;
28
40
  const orderedIDMap = {};
29
41
  let orderedIDs;
30
42
  const findManyArgs = buildFindManyArgs({
@@ -36,6 +48,7 @@ export const findMany = async function find({ adapter, collectionSlug, draftsEna
36
48
  joinQuery,
37
49
  joins,
38
50
  locale,
51
+ req,
39
52
  select,
40
53
  tableName,
41
54
  versions
@@ -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 } 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
+ {"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { FindArgs, FlattenedField, TypeWithID } from 'payload'\n\nimport { and, asc, desc, inArray, max, min, sql } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { buildBranchVisibility } from '../queries/buildBranchVisibility.js'\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 branchVisibility?: {\n branch: string\n collectionSlug: string\n mode?: 'documents' | 'history'\n }\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 branchVisibility,\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 {\n joins,\n orderBy,\n selectFields,\n where: queryWhere,\n } = buildQuery({\n adapter,\n fields,\n locale,\n req,\n sort,\n tableName,\n where: whereArg,\n })\n const table = adapter.tables[tableName]\n const branchVisibilityWhere = branchVisibility\n ? buildBranchVisibility({\n adapter,\n branch: branchVisibility.branch,\n canonicalIDExpression: versions\n ? sql`COALESCE(${table._branchParent}, ${table.parent})`\n : undefined,\n collectionSlug: branchVisibility.collectionSlug,\n mode: branchVisibility.mode,\n table,\n })\n : undefined\n const where = branchVisibilityWhere ? and(queryWhere, branchVisibilityWhere) : queryWhere\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 req,\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":["and","asc","desc","inArray","max","min","sql","buildBranchVisibility","buildQuery","selectDistinct","transform","getNameFromDrizzleTable","getTransaction","buildFindManyArgs","findMany","find","adapter","branchVisibility","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","queryWhere","table","tables","branchVisibilityWhere","branch","canonicalIDExpression","_branchParent","parent","mode","orderedIDMap","orderedIDs","findManyArgs","depth","key","column","primary","some","col","name","db","oneToManyJoinedTableNames","Set","filter","j","isOneToMany","map","hasSortOnOneToMany","size","has","selectDistinctResult","mainTable","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,4 +1,4 @@
1
- import { type FlattenedField, type JoinQuery, type SelectMode, type SelectType } from 'payload';
1
+ import type { FlattenedField, JoinQuery, PayloadRequest, SelectMode, SelectType } from 'payload';
2
2
  import type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js';
3
3
  import type { Result } from './buildFindManyArgs.js';
4
4
  type TraverseFieldArgs = {
@@ -16,6 +16,7 @@ type TraverseFieldArgs = {
16
16
  locale?: string;
17
17
  parentIsLocalized?: boolean;
18
18
  path: string;
19
+ req?: Partial<PayloadRequest>;
19
20
  select?: SelectType;
20
21
  selectAllOnCurrentLevel?: boolean;
21
22
  selectMode?: SelectMode;
@@ -29,6 +30,6 @@ type TraverseFieldArgs = {
29
30
  texts?: boolean;
30
31
  };
31
32
  };
32
- export declare const traverseFields: ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, draftsEnabled, fields, forceWithFields, joinQuery, joins, locale, parentIsLocalized, path, select, selectAllOnCurrentLevel, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields, }: TraverseFieldArgs) => Record<string, unknown>;
33
+ export declare const traverseFields: ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, draftsEnabled, fields, forceWithFields, joinQuery, joins, locale, parentIsLocalized, path, req, select, selectAllOnCurrentLevel, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields, }: TraverseFieldArgs) => Record<string, unknown>;
33
34
  export {};
34
35
  //# sourceMappingURL=traverseFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAEnB,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;AAcpD,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,4BA2oBnB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,UAAU,EACV,UAAU,EAEX,MAAM,SAAS,CAAA;AAgBhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAA;AACvF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAepD,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,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,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,sSAwBxB,iBAAiB,4BAitBnB,CAAA"}
@@ -1,7 +1,8 @@
1
- import { count, sql } from 'drizzle-orm';
2
- import { appendVersionToQueryKey, buildVersionCollectionFields, combineQueries, getQueryDraftsSort } from 'payload';
1
+ import { and, count, sql } from 'drizzle-orm';
2
+ import { appendVersionToQueryKey, buildVersionCollectionFields, combineQueries, getBranchPredicateSync, getQueryDraftsSort, resolveBranchReadState, resolveBranchVersionQuerySync, rewriteBranchVersionParents } from 'payload';
3
3
  import { fieldIsVirtual, fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared';
4
4
  import toSnakeCase from 'to-snake-case';
5
+ import { buildBranchVisibility } from '../queries/buildBranchVisibility.js';
5
6
  import { buildQuery } from '../queries/buildQuery.js';
6
7
  import { getTableAlias } from '../queries/getTableAlias.js';
7
8
  import { getArrayRelationName } from '../utilities/getArrayRelationName.js';
@@ -10,7 +11,7 @@ import { jsonAggBuildObject } from '../utilities/json.js';
10
11
  import { rawConstraint } from '../utilities/rawConstraint.js';
11
12
  import { InternalBlockTableNameIndex, resolveBlockTableName } from '../utilities/validateExistingBlockIsIdentical.js';
12
13
  import { buildPolymorphicJoinQuery } from './buildPolymorphicJoinQuery.js';
13
- export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, draftsEnabled, fields, forceWithFields, joinQuery = {}, joins, locale, parentIsLocalized = false, path, select, selectAllOnCurrentLevel = false, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields })=>{
14
+ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, draftsEnabled, fields, forceWithFields, joinQuery = {}, joins, locale, parentIsLocalized = false, path, req, select, selectAllOnCurrentLevel = false, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields })=>{
14
15
  fields.forEach((field)=>{
15
16
  if (fieldIsVirtual(field)) {
16
17
  return;
@@ -88,6 +89,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
88
89
  locale,
89
90
  parentIsLocalized: parentIsLocalized || field.localized,
90
91
  path: '',
92
+ req,
91
93
  select: typeof arraySelect === 'object' ? arraySelect : undefined,
92
94
  selectMode,
93
95
  tablePath: '',
@@ -184,6 +186,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
184
186
  locale,
185
187
  parentIsLocalized: parentIsLocalized || field.localized,
186
188
  path: '',
189
+ req,
187
190
  select: typeof blockSelect === 'object' ? blockSelect : undefined,
188
191
  selectMode: blockSelectMode,
189
192
  tablePath: '',
@@ -220,6 +223,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
220
223
  locale,
221
224
  parentIsLocalized: parentIsLocalized || field.localized,
222
225
  path: `${path}${field.name}_`,
226
+ req,
223
227
  select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
224
228
  selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
225
229
  selectMode,
@@ -260,6 +264,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
260
264
  page,
261
265
  pageSize: limitArg,
262
266
  path,
267
+ req,
263
268
  shouldCount,
264
269
  sort,
265
270
  where
@@ -276,7 +281,15 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
276
281
  const joins = [];
277
282
  const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
278
283
  let joinQueryWhere;
279
- const currentIDRaw = sql.raw(`"${getNameFromDrizzleTable(currentIDColumn.table)}"."${currentIDColumn.name}"`);
284
+ const parentUsesBranching = collectionSlug ? resolveBranchReadState({
285
+ collectionSlug,
286
+ req
287
+ }).useBranching : false;
288
+ const canonicalIDColumn = parentUsesBranching ? adapter.tables[currentTableName][versions ? '_branchParent' : '_branchDocID'] : undefined;
289
+ // Correlated constraints must reference the outer query's alias, without its schema.
290
+ const currentTableIdentifier = sql.identifier(getNameFromDrizzleTable(currentIDColumn.table));
291
+ const currentIDExpression = sql`${currentTableIdentifier}.${sql.identifier(currentIDColumn.name)}`;
292
+ const currentIDRaw = canonicalIDColumn ? sql`COALESCE(${currentTableIdentifier}.${sql.identifier(canonicalIDColumn.name)}, ${currentIDExpression})` : currentIDExpression;
280
293
  if (Array.isArray(field.targetField.relationTo)) {
281
294
  joinQueryWhere = {
282
295
  [field.on]: {
@@ -301,12 +314,35 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
301
314
  ]
302
315
  };
303
316
  }
317
+ // A join subquery must carry the same branch predicate as the
318
+ // top-level read, or a branch would see main's related documents.
319
+ const branchReadState = resolveBranchReadState({
320
+ collectionSlug: field.collection,
321
+ req
322
+ });
323
+ const joinBranchPredicate = branchReadState.useBranching ? null : getBranchPredicateSync({
324
+ collectionSlug: field.collection,
325
+ req
326
+ });
304
327
  if (useDrafts) {
305
- joinQueryWhere = combineQueries(appendVersionToQueryKey(joinQueryWhere), {
328
+ const versionWhere = appendVersionToQueryKey(joinQueryWhere);
329
+ const branchVersionWhere = branchReadState.useBranching ? rewriteBranchVersionParents(versionWhere) : resolveBranchVersionQuerySync({
330
+ collectionSlug: field.collection,
331
+ req,
332
+ where: versionWhere
333
+ });
334
+ joinQueryWhere = combineQueries(branchVersionWhere ?? {}, {
306
335
  latest: {
307
336
  equals: true
308
337
  }
309
338
  });
339
+ } else if (!branchReadState.useBranching && joinBranchPredicate) {
340
+ joinQueryWhere = {
341
+ and: [
342
+ joinQueryWhere,
343
+ joinBranchPredicate
344
+ ]
345
+ };
310
346
  }
311
347
  const columnName = `${path.replaceAll('.', '_')}${field.name}`;
312
348
  const subQueryAlias = `${columnName}_alias`;
@@ -321,6 +357,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
321
357
  joins,
322
358
  locale,
323
359
  parentIsLocalized,
360
+ req,
324
361
  selectLocale: true,
325
362
  sort: useDrafts ? getQueryDraftsSort({
326
363
  collectionConfig: adapter.payload.collections[field.collection].config,
@@ -329,6 +366,14 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
329
366
  tableName: joinCollectionTableName,
330
367
  where: joinQueryWhere
331
368
  });
369
+ const nativeBranchVisibility = branchReadState.useBranching ? buildBranchVisibility({
370
+ adapter,
371
+ branch: branchReadState.branch,
372
+ canonicalIDExpression: useDrafts ? sql`COALESCE(${newAliasTable._branchParent}, ${newAliasTable.parent})` : undefined,
373
+ collectionSlug: field.collection,
374
+ table: newAliasTable
375
+ }) : undefined;
376
+ const visibleSubQueryWhere = nativeBranchVisibility ? and(subQueryWhere, nativeBranchVisibility) : subQueryWhere;
332
377
  for(let key in selectFields){
333
378
  const val = selectFields[key];
334
379
  if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {
@@ -338,9 +383,19 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
338
383
  }
339
384
  }
340
385
  if (useDrafts) {
341
- selectFields.parent = newAliasTable.parent;
386
+ delete selectFields[`${joinCollectionTableName}.parent`];
387
+ selectFields.parent = newAliasTable._branchParent ? sql`COALESCE(${newAliasTable._branchParent}, ${newAliasTable.parent})`.as(newAliasTable.parent.name) : newAliasTable.parent;
388
+ }
389
+ // Surface the canonical document ID rather than the shadow row's own
390
+ // primary key, so join results address documents the same way every
391
+ // other read does.
392
+ if ((branchReadState.useBranching || joinBranchPredicate) && newAliasTable._branchDocID) {
393
+ // `selectFields` is typed as a column map, but Drizzle accepts an
394
+ // aliased expression in the same position — as the sibling
395
+ // `sql\`...\`.as()` assignments above already rely on.
396
+ selectFields.id = sql`COALESCE(${newAliasTable._branchDocID}, ${newAliasTable.id})`.as('id');
342
397
  }
343
- let query = db.select(selectFields).from(newAliasTable).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column))).$dynamic();
398
+ let query = db.select(selectFields).from(newAliasTable).where(visibleSubQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column))).$dynamic();
344
399
  joins.forEach(({ type, condition, table })=>{
345
400
  query = query[type ?? 'leftJoin'](table, condition);
346
401
  });
@@ -355,7 +410,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
355
410
  }
356
411
  const subQuery = query.as(subQueryAlias);
357
412
  if (shouldCount) {
358
- let countSubquery = db.select(selectFields).from(newAliasTable).where(subQueryWhere).$dynamic();
413
+ let countSubquery = db.select(selectFields).from(newAliasTable).where(visibleSubQueryWhere).$dynamic();
359
414
  joins.forEach(({ type, condition, table })=>{
360
415
  countSubquery = countSubquery[type ?? 'leftJoin'](table, condition);
361
416
  });