@payloadcms/drizzle 3.24.0-canary.7d9fbaf → 3.24.0-canary.80e034e

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.
@@ -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,SAgEvB,CAAA"}
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,SA+DvB,CAAA"}
package/dist/deleteOne.js CHANGED
@@ -54,8 +54,7 @@ export const deleteOne = async function deleteOne({ collection: collectionSlug,
54
54
  config: this.payload.config,
55
55
  data: docToDelete,
56
56
  fields: collection.flattenedFields,
57
- joinQuery: false,
58
- parentIsLocalized: false
57
+ joinQuery: false
59
58
  });
60
59
  await this.deleteWhere({
61
60
  db,
@@ -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, select, where: whereArg },\n) {\n const db = await getTransaction(this, req)\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 selectDistinctResult = await selectDistinct({\n adapter: this,\n chainedMethods: [{ args: [1], method: 'limit' }],\n db,\n joins,\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 const result = transform({\n adapter: this,\n config: this.payload.config,\n data: docToDelete,\n fields: collection.flattenedFields,\n joinQuery: false,\n parentIsLocalized: false,\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","select","where","whereArg","db","payload","collections","config","tableName","tableNameMap","get","slug","docToDelete","joins","selectFields","adapter","fields","flattenedFields","locale","selectDistinctResult","chainedMethods","args","method","id","query","findFirst","tables","findManyArgs","depth","joinQuery","result","data","parentIsLocalized","deleteWhere"],"mappings":"AAEA,SAASA,EAAE,QAAQ,cAAa;AAChC,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,OAAOC,gBAAgB,0BAAyB;AAChD,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,MAAM,EAAEC,OAAOC,QAAQ,EAAE;IAE5D,MAAMC,KAAK,MAAMR,eAAe,IAAI,EAAEI;IACtC,MAAMF,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,EAAEZ,KAAK,EAAE,GAAGT,WAAW;QAChDsB,SAAS,IAAI;QACbC,QAAQlB,WAAWmB,eAAe;QAClCC,QAAQlB,KAAKkB;QACbV;QACAN,OAAOC;IACT;IAEA,MAAMgB,uBAAuB,MAAMzB,eAAe;QAChDqB,SAAS,IAAI;QACbK,gBAAgB;YAAC;gBAAEC,MAAM;oBAAC;iBAAE;gBAAEC,QAAQ;YAAQ;SAAE;QAChDlB;QACAS;QACAC;QACAN;QACAN;IACF;IAEA,IAAIiB,sBAAsB,CAAC,EAAE,EAAEI,IAAI;QACjCX,cAAc,MAAMR,GAAGoB,KAAK,CAAChB,UAAU,CAACiB,SAAS,CAAC;YAChDvB,OAAOZ,GAAG,IAAI,CAACoC,MAAM,CAAClB,UAAU,CAACe,EAAE,EAAEJ,oBAAoB,CAAC,EAAE,CAACI,EAAE;QACjE;IACF,OAAO;QACL,MAAMI,eAAenC,kBAAkB;YACrCuB,SAAS,IAAI;YACba,OAAO;YACPZ,QAAQlB,WAAWmB,eAAe;YAClCY,WAAW;YACX5B;YACAO;QACF;QAEAmB,aAAazB,KAAK,GAAGA;QAErBU,cAAc,MAAMR,GAAGoB,KAAK,CAAChB,UAAU,CAACiB,SAAS,CAACE;IACpD;IAEA,MAAMG,SAASnC,UAAU;QACvBoB,SAAS,IAAI;QACbR,QAAQ,IAAI,CAACF,OAAO,CAACE,MAAM;QAC3BwB,MAAMnB;QACNI,QAAQlB,WAAWmB,eAAe;QAClCY,WAAW;QACXG,mBAAmB;IACrB;IAEA,MAAM,IAAI,CAACC,WAAW,CAAC;QACrB7B;QACAI;QACAN,OAAOZ,GAAG,IAAI,CAACoC,MAAM,CAAClB,UAAU,CAACe,EAAE,EAAEX,YAAYW,EAAE;IACrD;IAEA,OAAOO;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'\n\nexport const deleteOne: DeleteOne = async function deleteOne(\n this: DrizzleAdapter,\n { collection: collectionSlug, req, select, where: whereArg },\n) {\n const db = await getTransaction(this, req)\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 selectDistinctResult = await selectDistinct({\n adapter: this,\n chainedMethods: [{ args: [1], method: 'limit' }],\n db,\n joins,\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 const result = transform({\n adapter: this,\n config: this.payload.config,\n data: docToDelete,\n fields: collection.flattenedFields,\n joinQuery: false,\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","select","where","whereArg","db","payload","collections","config","tableName","tableNameMap","get","slug","docToDelete","joins","selectFields","adapter","fields","flattenedFields","locale","selectDistinctResult","chainedMethods","args","method","id","query","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,OAAOC,gBAAgB,0BAAyB;AAChD,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,MAAM,EAAEC,OAAOC,QAAQ,EAAE;IAE5D,MAAMC,KAAK,MAAMR,eAAe,IAAI,EAAEI;IACtC,MAAMF,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,EAAEZ,KAAK,EAAE,GAAGT,WAAW;QAChDsB,SAAS,IAAI;QACbC,QAAQlB,WAAWmB,eAAe;QAClCC,QAAQlB,KAAKkB;QACbV;QACAN,OAAOC;IACT;IAEA,MAAMgB,uBAAuB,MAAMzB,eAAe;QAChDqB,SAAS,IAAI;QACbK,gBAAgB;YAAC;gBAAEC,MAAM;oBAAC;iBAAE;gBAAEC,QAAQ;YAAQ;SAAE;QAChDlB;QACAS;QACAC;QACAN;QACAN;IACF;IAEA,IAAIiB,sBAAsB,CAAC,EAAE,EAAEI,IAAI;QACjCX,cAAc,MAAMR,GAAGoB,KAAK,CAAChB,UAAU,CAACiB,SAAS,CAAC;YAChDvB,OAAOZ,GAAG,IAAI,CAACoC,MAAM,CAAClB,UAAU,CAACe,EAAE,EAAEJ,oBAAoB,CAAC,EAAE,CAACI,EAAE;QACjE;IACF,OAAO;QACL,MAAMI,eAAenC,kBAAkB;YACrCuB,SAAS,IAAI;YACba,OAAO;YACPZ,QAAQlB,WAAWmB,eAAe;YAClCY,WAAW;YACX5B;YACAO;QACF;QAEAmB,aAAazB,KAAK,GAAGA;QAErBU,cAAc,MAAMR,GAAGoB,KAAK,CAAChB,UAAU,CAACiB,SAAS,CAACE;IACpD;IAEA,MAAMG,SAASnC,UAAU;QACvBoB,SAAS,IAAI;QACbR,QAAQ,IAAI,CAACF,OAAO,CAACE,MAAM;QAC3BwB,MAAMnB;QACNI,QAAQlB,WAAWmB,eAAe;QAClCY,WAAW;IACb;IAEA,MAAM,IAAI,CAACG,WAAW,CAAC;QACrB5B;QACAI;QACAN,OAAOZ,GAAG,IAAI,CAACoC,MAAM,CAAClB,UAAU,CAACe,EAAE,EAAEX,YAAYW,EAAE;IACrD;IAEA,OAAOO;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;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,qKAgBlB,IAAI;;;;;;;;;;;EAkJN,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,qKAgBlB,IAAI;;;;;;;;;;;EAiJN,CAAA"}
@@ -129,8 +129,7 @@ export const findMany = async function find({ adapter, collectionSlug, fields, j
129
129
  config: adapter.payload.config,
130
130
  data,
131
131
  fields,
132
- joinQuery,
133
- parentIsLocalized: false
132
+ joinQuery
134
133
  });
135
134
  });
136
135
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { FindArgs, FlattenedField, TypeWithID } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\nimport type { ChainedMethods } from './chainMethods.js'\n\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 { 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 fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req,\n select,\n skip,\n sort,\n tableName,\n versions,\n where: whereArg,\n}: Args) {\n const db = await getTransaction(adapter, req)\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 = skip || (page - 1) * limit\n\n if (limit === 0) {\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 selectDistinctMethods: ChainedMethods = []\n\n if (orderBy) {\n selectDistinctMethods.push({\n args: [() => orderBy.map(({ column, order }) => order(column))],\n method: 'orderBy',\n })\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n collectionSlug,\n depth: 0,\n fields,\n joinQuery,\n joins,\n locale,\n select,\n tableName,\n versions,\n })\n\n selectDistinctMethods.push({ args: [offset], method: 'offset' })\n selectDistinctMethods.push({ args: [limit], method: 'limit' })\n\n const selectDistinctResult = await selectDistinct({\n adapter,\n chainedMethods: selectDistinctMethods,\n db,\n joins,\n selectFields,\n tableName,\n where,\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 parentIsLocalized: false,\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":["inArray","buildQuery","selectDistinct","transform","getTransaction","buildFindManyArgs","findMany","find","adapter","collectionSlug","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","select","skip","sort","tableName","versions","where","whereArg","db","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","selectDistinctMethods","push","args","map","column","order","method","findManyArgs","depth","selectDistinctResult","chainedMethods","length","docs","nextPage","prevPage","forEach","id","i","Object","keys","tables","findPromise","query","countDistinct","Math","ceil","rawDocs","a","b","data","config","payload","parentIsLocalized"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { FindArgs, FlattenedField, TypeWithID } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\nimport type { ChainedMethods } from './chainMethods.js'\n\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 { 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 fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req,\n select,\n skip,\n sort,\n tableName,\n versions,\n where: whereArg,\n}: Args) {\n const db = await getTransaction(adapter, req)\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 = skip || (page - 1) * limit\n\n if (limit === 0) {\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 selectDistinctMethods: ChainedMethods = []\n\n if (orderBy) {\n selectDistinctMethods.push({\n args: [() => orderBy.map(({ column, order }) => order(column))],\n method: 'orderBy',\n })\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n collectionSlug,\n depth: 0,\n fields,\n joinQuery,\n joins,\n locale,\n select,\n tableName,\n versions,\n })\n\n selectDistinctMethods.push({ args: [offset], method: 'offset' })\n selectDistinctMethods.push({ args: [limit], method: 'limit' })\n\n const selectDistinctResult = await selectDistinct({\n adapter,\n chainedMethods: selectDistinctMethods,\n db,\n joins,\n selectFields,\n tableName,\n where,\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 })\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":["inArray","buildQuery","selectDistinct","transform","getTransaction","buildFindManyArgs","findMany","find","adapter","collectionSlug","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","select","skip","sort","tableName","versions","where","whereArg","db","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","selectDistinctMethods","push","args","map","column","order","method","findManyArgs","depth","selectDistinctResult","chainedMethods","length","docs","nextPage","prevPage","forEach","id","i","Object","keys","tables","findPromise","query","countDistinct","Math","ceil","rawDocs","a","b","data","config","payload"],"mappings":"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"}
@@ -12,6 +12,7 @@ type TraverseFieldArgs = {
12
12
  joinQuery: JoinQuery;
13
13
  joins?: BuildQueryJoinAliases;
14
14
  locale?: string;
15
+ parentIsLocalized?: boolean;
15
16
  path: string;
16
17
  select?: SelectType;
17
18
  selectAllOnCurrentLevel?: boolean;
@@ -20,13 +21,12 @@ type TraverseFieldArgs = {
20
21
  topLevelArgs: Record<string, unknown>;
21
22
  topLevelTableName: string;
22
23
  versions?: boolean;
23
- withinLocalizedField?: boolean;
24
24
  withTabledFields: {
25
25
  numbers?: boolean;
26
26
  rels?: boolean;
27
27
  texts?: boolean;
28
28
  };
29
29
  };
30
- export declare const traverseFields: ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, fields, joinQuery, joins, locale, path, select, selectAllOnCurrentLevel, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withinLocalizedField, withTabledFields, }: TraverseFieldArgs) => Record<string, unknown>;
30
+ export declare const traverseFields: ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, fields, joinQuery, joins, locale, parentIsLocalized, path, select, selectAllOnCurrentLevel, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields, }: TraverseFieldArgs) => Record<string, unknown>;
31
31
  export {};
32
32
  //# sourceMappingURL=traverseFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAS,MAAM,SAAS,CAAA;AAMvF,OAAO,KAAK,EAAE,qBAAqB,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AASpD,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,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,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,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,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,oQAqBxB,iBAAiB,4BA+gBnB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAS,MAAM,SAAS,CAAA;AAMvF,OAAO,KAAK,EAAE,qBAAqB,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AA+CpD,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,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,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,iQAqBxB,iBAAiB,4BAkoBnB,CAAA"}
@@ -1,20 +1,59 @@
1
- import { sql } from 'drizzle-orm';
1
+ import { and, asc, desc, eq, or, sql } from 'drizzle-orm';
2
2
  import { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared';
3
3
  import toSnakeCase from 'to-snake-case';
4
4
  import buildQuery from '../queries/buildQuery.js';
5
5
  import { getTableAlias } from '../queries/getTableAlias.js';
6
+ import { operatorMap } from '../queries/operatorMap.js';
6
7
  import { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js';
7
8
  import { jsonAggBuildObject } from '../utilities/json.js';
8
9
  import { rawConstraint } from '../utilities/rawConstraint.js';
9
10
  import { chainMethods } from './chainMethods.js';
10
- export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, fields, joinQuery = {}, joins, locale, path, select, selectAllOnCurrentLevel = false, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withinLocalizedField = false, withTabledFields })=>{
11
+ const flattenAllWherePaths = (where, paths)=>{
12
+ for(const k in where){
13
+ if ([
14
+ 'AND',
15
+ 'OR'
16
+ ].includes(k.toUpperCase())) {
17
+ if (Array.isArray(where[k])) {
18
+ for (const whereField of where[k]){
19
+ flattenAllWherePaths(whereField, paths);
20
+ }
21
+ }
22
+ } else {
23
+ // TODO: explore how to support arrays/relationship querying.
24
+ paths.push(k.split('.').join('_'));
25
+ }
26
+ }
27
+ };
28
+ const buildSQLWhere = (where, alias)=>{
29
+ for(const k in where){
30
+ if ([
31
+ 'AND',
32
+ 'OR'
33
+ ].includes(k.toUpperCase())) {
34
+ if (Array.isArray(where[k])) {
35
+ const op = 'AND' === k.toUpperCase() ? and : or;
36
+ const accumulated = [];
37
+ for (const whereField of where[k]){
38
+ accumulated.push(buildSQLWhere(whereField, alias));
39
+ }
40
+ return op(...accumulated);
41
+ }
42
+ } else {
43
+ const payloadOperator = Object.keys(where[k])[0];
44
+ const value = where[k][payloadOperator];
45
+ return operatorMap[payloadOperator](sql.raw(`"${alias}"."${k.split('.').join('_')}"`), value);
46
+ }
47
+ }
48
+ };
49
+ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs, currentTableName, depth, fields, joinQuery = {}, joins, locale, parentIsLocalized = false, path, select, selectAllOnCurrentLevel = false, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withTabledFields })=>{
11
50
  fields.forEach((field)=>{
12
51
  if (fieldIsVirtual(field)) {
13
52
  return;
14
53
  }
15
54
  const isFieldLocalized = fieldShouldBeLocalized({
16
55
  field,
17
- parentIsLocalized: withinLocalizedField
56
+ parentIsLocalized
18
57
  });
19
58
  // handle simple relationship
20
59
  if (depth > 0 && (field.type === 'upload' || field.type === 'relationship') && !field.hasMany && typeof field.relationTo === 'string') {
@@ -76,13 +115,13 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
76
115
  fields: field.flattenedFields,
77
116
  joinQuery,
78
117
  locale,
118
+ parentIsLocalized: parentIsLocalized || field.localized,
79
119
  path: '',
80
120
  select: typeof arraySelect === 'object' ? arraySelect : undefined,
81
121
  selectMode,
82
122
  tablePath: '',
83
123
  topLevelArgs,
84
124
  topLevelTableName,
85
- withinLocalizedField: withinLocalizedField || field.localized,
86
125
  withTabledFields
87
126
  });
88
127
  if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
@@ -160,13 +199,13 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
160
199
  fields: block.flattenedFields,
161
200
  joinQuery,
162
201
  locale,
202
+ parentIsLocalized: parentIsLocalized || field.localized,
163
203
  path: '',
164
204
  select: typeof blockSelect === 'object' ? blockSelect : undefined,
165
205
  selectMode: blockSelectMode,
166
206
  tablePath: '',
167
207
  topLevelArgs,
168
208
  topLevelTableName,
169
- withinLocalizedField: withinLocalizedField || field.localized,
170
209
  withTabledFields
171
210
  });
172
211
  if (typeof blockSelect === 'object' && withBlock.with._locales && Object.keys(withBlock.with._locales.columns).length === 1) {
@@ -194,6 +233,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
194
233
  joinQuery,
195
234
  joins,
196
235
  locale,
236
+ parentIsLocalized: parentIsLocalized || field.localized,
197
237
  path: `${path}${field.name}_`,
198
238
  select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
199
239
  selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
@@ -202,7 +242,6 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
202
242
  topLevelArgs,
203
243
  topLevelTableName,
204
244
  versions,
205
- withinLocalizedField: withinLocalizedField || field.localized,
206
245
  withTabledFields
207
246
  });
208
247
  break;
@@ -220,100 +259,181 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
220
259
  if (joinQuery[joinSchemaPath] === false) {
221
260
  break;
222
261
  }
223
- const { limit: limitArg = field.defaultLimit ?? 10, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
262
+ const { limit: limitArg = field.defaultLimit ?? 10, page, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
224
263
  let limit = limitArg;
225
264
  if (limit !== 0) {
226
265
  // get an additional document and slice it later to determine if there is a next page
227
266
  limit += 1;
228
267
  }
229
- const fields = adapter.payload.collections[field.collection].config.flattenedFields;
230
- const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
231
- const joins = [];
232
- const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
233
- let joinQueryWhere;
234
- if (Array.isArray(field.targetField.relationTo)) {
235
- joinQueryWhere = {
236
- [field.on]: {
237
- equals: {
238
- relationTo: collectionSlug,
239
- value: rawConstraint(currentIDColumn)
268
+ const columnName = `${path.replaceAll('.', '_')}${field.name}`;
269
+ const db = adapter.drizzle;
270
+ if (Array.isArray(field.collection)) {
271
+ let currentQuery = null;
272
+ const onPath = field.on.split('.').join('_');
273
+ if (Array.isArray(sort)) {
274
+ throw new Error('Not implemented');
275
+ }
276
+ let sanitizedSort = sort;
277
+ if (!sanitizedSort) {
278
+ if (field.collection.some((collection)=>adapter.payload.collections[collection].config.fields.some((f)=>f.type === 'date' && f.name === 'createdAt'))) {
279
+ sanitizedSort = '-createdAt';
280
+ } else {
281
+ sanitizedSort = 'id';
282
+ }
283
+ }
284
+ const sortOrder = sanitizedSort.startsWith('-') ? desc : asc;
285
+ sanitizedSort = sanitizedSort.replace('-', '');
286
+ const sortPath = sanitizedSort.split('.').join('_');
287
+ const wherePaths = [];
288
+ if (where) {
289
+ flattenAllWherePaths(where, wherePaths);
290
+ }
291
+ for (const collection of field.collection){
292
+ const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(collection));
293
+ const table = adapter.tables[joinCollectionTableName];
294
+ const sortColumn = table[sortPath];
295
+ const selectFields = {
296
+ id: adapter.tables[joinCollectionTableName].id,
297
+ parent: sql`${adapter.tables[joinCollectionTableName][onPath]}`.as(onPath),
298
+ relationTo: sql`${collection}`.as('relationTo'),
299
+ sortPath: sql`${sortColumn ? sortColumn : null}`.as('sortPath')
300
+ };
301
+ // Select for WHERE and Fallback NULL
302
+ for (const path of wherePaths){
303
+ if (adapter.tables[joinCollectionTableName][path]) {
304
+ selectFields[path] = sql`${adapter.tables[joinCollectionTableName][path]}`.as(path);
305
+ // Allow to filter by collectionSlug
306
+ } else if (path !== 'relationTo') {
307
+ selectFields[path] = sql`null`.as(path);
240
308
  }
241
309
  }
242
- };
243
- } else {
244
- joinQueryWhere = {
245
- [field.on]: {
246
- equals: rawConstraint(currentIDColumn)
310
+ const query = db.select(selectFields).from(adapter.tables[joinCollectionTableName]);
311
+ if (currentQuery === null) {
312
+ currentQuery = query;
313
+ } else {
314
+ currentQuery = currentQuery.unionAll(query);
247
315
  }
248
- };
249
- }
250
- if (where && Object.keys(where).length) {
251
- joinQueryWhere = {
252
- and: [
253
- joinQueryWhere,
254
- where
255
- ]
256
- };
257
- }
258
- const columnName = `${path.replaceAll('.', '_')}${field.name}`;
259
- const subQueryAlias = `${columnName}_alias`;
260
- const { newAliasTable } = getTableAlias({
261
- adapter,
262
- tableName: joinCollectionTableName
263
- });
264
- const { orderBy, selectFields, where: subQueryWhere } = buildQuery({
265
- adapter,
266
- aliasTable: newAliasTable,
267
- fields,
268
- joins,
269
- locale,
270
- // Parent is never localized, as we're passing the `fields` of a **different** collection here. This means that the
271
- // parent localization "boundary" is crossed, and we're now in the context of the joined collection.
272
- parentIsLocalized: false,
273
- selectLocale: true,
274
- sort,
275
- tableName: joinCollectionTableName,
276
- where: joinQueryWhere
277
- });
278
- const chainedMethods = [];
279
- joins.forEach(({ type, condition, table })=>{
280
- chainedMethods.push({
281
- args: [
282
- table,
283
- condition
284
- ],
285
- method: type ?? 'leftJoin'
316
+ }
317
+ const subQueryAlias = `${columnName}_subquery`;
318
+ let sqlWhere = eq(adapter.tables[currentTableName].id, sql.raw(`"${subQueryAlias}"."${onPath}"`));
319
+ if (where && Object.keys(where).length > 0) {
320
+ sqlWhere = and(sqlWhere, buildSQLWhere(where, subQueryAlias));
321
+ }
322
+ currentQuery = currentQuery.orderBy(sortOrder(sql`"sortPath"`));
323
+ if (page && limit !== 0) {
324
+ const offset = (page - 1) * limit;
325
+ if (offset > 0) {
326
+ currentQuery = currentQuery.offset(offset);
327
+ }
328
+ }
329
+ if (limit) {
330
+ currentQuery = currentQuery.limit(limit);
331
+ }
332
+ currentArgs.extras[columnName] = sql`${db.select({
333
+ id: jsonAggBuildObject(adapter, {
334
+ id: sql.raw(`"${subQueryAlias}"."id"`),
335
+ relationTo: sql.raw(`"${subQueryAlias}"."relationTo"`)
336
+ })
337
+ }).from(sql`${currentQuery.as(subQueryAlias)}`).where(sqlWhere)}`.as(columnName);
338
+ } else {
339
+ const fields = adapter.payload.collections[field.collection].config.flattenedFields;
340
+ const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
341
+ const joins = [];
342
+ const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
343
+ let joinQueryWhere;
344
+ if (Array.isArray(field.targetField.relationTo)) {
345
+ joinQueryWhere = {
346
+ [field.on]: {
347
+ equals: {
348
+ relationTo: collectionSlug,
349
+ value: rawConstraint(currentIDColumn)
350
+ }
351
+ }
352
+ };
353
+ } else {
354
+ joinQueryWhere = {
355
+ [field.on]: {
356
+ equals: rawConstraint(currentIDColumn)
357
+ }
358
+ };
359
+ }
360
+ if (where && Object.keys(where).length) {
361
+ joinQueryWhere = {
362
+ and: [
363
+ joinQueryWhere,
364
+ where
365
+ ]
366
+ };
367
+ }
368
+ const columnName = `${path.replaceAll('.', '_')}${field.name}`;
369
+ const subQueryAlias = `${columnName}_alias`;
370
+ const { newAliasTable } = getTableAlias({
371
+ adapter,
372
+ tableName: joinCollectionTableName
286
373
  });
287
- });
288
- if (limit !== 0) {
289
- chainedMethods.push({
290
- args: [
291
- limit
292
- ],
293
- method: 'limit'
374
+ const { orderBy, selectFields, where: subQueryWhere } = buildQuery({
375
+ adapter,
376
+ aliasTable: newAliasTable,
377
+ fields,
378
+ joins,
379
+ locale,
380
+ parentIsLocalized,
381
+ selectLocale: true,
382
+ sort,
383
+ tableName: joinCollectionTableName,
384
+ where: joinQueryWhere
294
385
  });
295
- }
296
- const db = adapter.drizzle;
297
- for(let key in selectFields){
298
- const val = selectFields[key];
299
- if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {
300
- delete selectFields[key];
301
- key = key.split('.').pop();
302
- selectFields[key] = newAliasTable[key];
386
+ const chainedMethods = [];
387
+ joins.forEach(({ type, condition, table })=>{
388
+ chainedMethods.push({
389
+ args: [
390
+ table,
391
+ condition
392
+ ],
393
+ method: type ?? 'leftJoin'
394
+ });
395
+ });
396
+ if (page && limit !== 0) {
397
+ const offset = (page - 1) * limit - 1;
398
+ if (offset > 0) {
399
+ chainedMethods.push({
400
+ args: [
401
+ offset
402
+ ],
403
+ method: 'offset'
404
+ });
405
+ }
303
406
  }
304
- }
305
- const subQuery = chainMethods({
306
- methods: chainedMethods,
307
- query: db.select(selectFields).from(newAliasTable).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
308
- }).as(subQueryAlias);
309
- currentArgs.extras[columnName] = sql`${db.select({
310
- result: jsonAggBuildObject(adapter, {
311
- id: sql.raw(`"${subQueryAlias}".id`),
312
- ...selectFields._locale && {
313
- locale: sql.raw(`"${subQueryAlias}".${selectFields._locale.name}`)
407
+ if (limit !== 0) {
408
+ chainedMethods.push({
409
+ args: [
410
+ limit
411
+ ],
412
+ method: 'limit'
413
+ });
414
+ }
415
+ const db = adapter.drizzle;
416
+ for(let key in selectFields){
417
+ const val = selectFields[key];
418
+ if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {
419
+ delete selectFields[key];
420
+ key = key.split('.').pop();
421
+ selectFields[key] = newAliasTable[key];
314
422
  }
315
- })
316
- }).from(sql`${subQuery}`)}`.as(subQueryAlias);
423
+ }
424
+ const subQuery = chainMethods({
425
+ methods: chainedMethods,
426
+ query: db.select(selectFields).from(newAliasTable).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
427
+ }).as(subQueryAlias);
428
+ currentArgs.extras[columnName] = sql`${db.select({
429
+ result: jsonAggBuildObject(adapter, {
430
+ id: sql.raw(`"${subQueryAlias}".id`),
431
+ ...selectFields._locale && {
432
+ locale: sql.raw(`"${subQueryAlias}".${selectFields._locale.name}`)
433
+ }
434
+ })
435
+ }).from(sql`${subQuery}`)}`.as(subQueryAlias);
436
+ }
317
437
  break;
318
438
  }
319
439
  case 'point':
@@ -368,7 +488,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
368
488
  }
369
489
  if (select || selectAllOnCurrentLevel) {
370
490
  const fieldPath = `${path}${field.name}`;
371
- if ((isFieldLocalized || withinLocalizedField) && _locales) {
491
+ if ((isFieldLocalized || parentIsLocalized) && _locales) {
372
492
  _locales.columns[fieldPath] = true;
373
493
  } else if (adapter.tables[currentTableName]?.[fieldPath]) {
374
494
  currentArgs.columns[fieldPath] = true;
@@ -383,7 +503,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
383
503
  }
384
504
  if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
385
505
  const fieldPath = `${path}${field.name}`;
386
- if ((isFieldLocalized || withinLocalizedField) && _locales) {
506
+ if ((isFieldLocalized || parentIsLocalized) && _locales) {
387
507
  _locales.columns[fieldPath] = true;
388
508
  } else if (adapter.tables[currentTableName]?.[fieldPath]) {
389
509
  currentArgs.columns[fieldPath] = true;