@payloadcms/drizzle 4.0.0-internal.af6aad0 → 4.0.0-internal.b8e7c89

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 (46) hide show
  1. package/dist/migrate.d.ts.map +1 -1
  2. package/dist/migrate.js +35 -13
  3. package/dist/migrate.js.map +1 -1
  4. package/dist/migrateDown.d.ts +2 -1
  5. package/dist/migrateDown.d.ts.map +1 -1
  6. package/dist/migrateDown.js +12 -2
  7. package/dist/migrateDown.js.map +1 -1
  8. package/dist/migrateFresh.d.ts +4 -2
  9. package/dist/migrateFresh.d.ts.map +1 -1
  10. package/dist/migrateFresh.js +21 -7
  11. package/dist/migrateFresh.js.map +1 -1
  12. package/dist/migrateRefresh.d.ts +2 -1
  13. package/dist/migrateRefresh.d.ts.map +1 -1
  14. package/dist/migrateRefresh.js +14 -3
  15. package/dist/migrateRefresh.js.map +1 -1
  16. package/dist/migrateReset.d.ts +2 -1
  17. package/dist/migrateReset.d.ts.map +1 -1
  18. package/dist/migrateReset.js +12 -2
  19. package/dist/migrateReset.js.map +1 -1
  20. package/dist/migrateStatus.d.ts +2 -1
  21. package/dist/migrateStatus.d.ts.map +1 -1
  22. package/dist/migrateStatus.js +11 -6
  23. package/dist/migrateStatus.js.map +1 -1
  24. package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
  25. package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
  26. package/dist/queries/getTableColumnFromPath.d.ts +12 -3
  27. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  28. package/dist/queries/getTableColumnFromPath.js +50 -27
  29. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  30. package/dist/queries/parseParams.d.ts.map +1 -1
  31. package/dist/queries/parseParams.js +151 -3
  32. package/dist/queries/parseParams.js.map +1 -1
  33. package/dist/queries/resolveRelationshipPath.d.ts +36 -0
  34. package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
  35. package/dist/queries/resolveRelationshipPath.js +66 -0
  36. package/dist/queries/resolveRelationshipPath.js.map +1 -0
  37. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  38. package/dist/transform/write/traverseFields.js +3 -0
  39. package/dist/transform/write/traverseFields.js.map +1 -1
  40. package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
  41. package/dist/utilities/buildCreateMigration.js +12 -8
  42. package/dist/utilities/buildCreateMigration.js.map +1 -1
  43. package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
  44. package/dist/utilities/createSchemaGenerator.js +3 -0
  45. package/dist/utilities/createSchemaGenerator.js.map +1 -1
  46. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/postgres/predefinedMigrations/v2-v3/index.ts"],"sourcesContent":["import type { DrizzleSnapshotJSON } from 'drizzle-kit/api'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport fs from 'fs'\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BasePostgresAdapter } from '../../types.js'\nimport type { PathsToQuery } from './types.js'\n\nimport { getTransaction } from '../../../utilities/getTransaction.js'\nimport { groupUpSQLStatements } from './groupUpSQLStatements.js'\nimport { migrateRelationships } from './migrateRelationships.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n debug?: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n}\n\nconst runStatementGroup = async ({ adapter, db, debug, statements }) => {\n const addColumnsStatement = statements.join('\\n')\n\n if (debug) {\n adapter.payload.logger.info(debug)\n adapter.payload.logger.info(addColumnsStatement)\n }\n\n await db.execute(sql.raw(addColumnsStatement))\n}\n\n/**\n * Moves upload and relationship columns from the join table and into the tables while moving data\n * This is done in the following order:\n * ADD COLUMNs\n * -- manipulate data to move relationships to new columns\n * ADD CONSTRAINTs\n * NOT NULLs\n * DROP TABLEs\n * DROP CONSTRAINTs\n * DROP COLUMNs\n * @param debug\n * @param payload\n * @param req\n */\nexport const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {\n const adapter = payload.db as unknown as BasePostgresAdapter\n const dir = payload.db.migrationDir\n\n // get the drizzle migrateUpSQL from drizzle using the last schema\n const { generateDrizzleJson, generateMigration, upSnapshot } = adapter.requireDrizzleKit()\n const drizzleJsonAfter = generateDrizzleJson(adapter.schema) as DrizzleSnapshotJSON\n\n // Get the previous migration snapshot\n const previousSnapshot = fs\n .readdirSync(dir)\n .filter((file) => file.endsWith('.json') && !file.endsWith('relationships_v2_v3.json'))\n .sort()\n .reverse()?.[0]\n\n if (!previousSnapshot) {\n throw new Error(\n `No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`,\n )\n }\n\n let drizzleJsonBefore = JSON.parse(\n fs.readFileSync(`${dir}/${previousSnapshot}`, 'utf8'),\n ) as DrizzleSnapshotJSON\n\n if (upSnapshot && drizzleJsonBefore.version < drizzleJsonAfter.version) {\n drizzleJsonBefore = upSnapshot(drizzleJsonBefore)\n }\n\n const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter)\n\n if (!generatedSQL.length) {\n payload.logger.info(`No schema changes needed.`)\n process.exit(0)\n }\n\n const sqlUpStatements = groupUpSQLStatements(generatedSQL)\n\n const db = await getTransaction(adapter, req)\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TYPES' : null,\n statements: sqlUpStatements.createType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ALTERING TYPES' : null,\n statements: sqlUpStatements.alterType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TABLES' : null,\n statements: sqlUpStatements.createTable,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'RENAMING COLUMNS' : null,\n statements: sqlUpStatements.renameColumn,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,\n statements: sqlUpStatements.addColumn,\n })\n\n // SET DEFAULTS\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'SETTING DEFAULTS' : null,\n statements: sqlUpStatements.setDefault,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING INDEXES' : null,\n statements: sqlUpStatements.createIndex,\n })\n\n for (const collection of payload.config.collections) {\n if (collection.slug === 'payload-locked-documents') {\n continue\n }\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug))\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: collection.flattenedFields,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: collection.flattenedFields,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (collection.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`,\n )\n const versionFields = buildVersionCollectionFields(payload.config, collection, true)\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: versionFields,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n for (const global of payload.config.globals) {\n const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug))\n\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (global.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`,\n )\n\n const versionFields = buildVersionGlobalFields(payload.config, global, true)\n\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n // ADD CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ADDING CONSTRAINTS' : null,\n statements: sqlUpStatements.addConstraint,\n })\n\n // NOT NULL\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'NOT NULL CONSTRAINTS' : null,\n statements: sqlUpStatements.notNull,\n })\n\n // DROP TABLE\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TABLES' : null,\n statements: sqlUpStatements.dropTable,\n })\n\n // DROP INDEX\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING INDEXES' : null,\n statements: sqlUpStatements.dropIndex,\n })\n\n // DROP CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING CONSTRAINTS' : null,\n statements: sqlUpStatements.dropConstraint,\n })\n\n // DROP COLUMN\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING COLUMNS' : null,\n statements: sqlUpStatements.dropColumn,\n })\n\n // DROP TYPES\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TYPES' : null,\n statements: sqlUpStatements.dropType,\n })\n}\n"],"names":["sql","fs","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","getTransaction","groupUpSQLStatements","migrateRelationships","traverseFields","runStatementGroup","adapter","db","debug","statements","addColumnsStatement","join","payload","logger","info","execute","raw","migratePostgresV2toV3","req","dir","migrationDir","generateDrizzleJson","generateMigration","upSnapshot","requireDrizzleKit","drizzleJsonAfter","schema","previousSnapshot","readdirSync","filter","file","endsWith","sort","reverse","Error","drizzleJsonBefore","JSON","parse","readFileSync","version","generatedSQL","length","process","exit","sqlUpStatements","createType","alterType","createTable","renameColumn","addColumn","setDefault","createIndex","collection","config","collections","slug","tableName","tableNameMap","get","pathsToQuery","Set","collectionSlug","columnPrefix","disableNotNull","fields","flattenedFields","isVersions","newTableName","parentTableName","path","rootTableName","versions","versionsTableName","versionsSuffix","versionFields","versionPathsToQuery","global","globals","globalSlug","addConstraint","notNull","dropTable","dropIndex","dropConstraint","dropColumn","dropType"],"mappings":"AAGA,SAASA,GAAG,QAAQ,cAAa;AACjC,OAAOC,QAAQ,KAAI;AACnB,SAASC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAS;AAChF,OAAOC,iBAAiB,gBAAe;AAKvC,SAASC,cAAc,QAAQ,uCAAsC;AACrE,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,cAAc,QAAQ,sBAAqB;AAQpD,MAAMC,oBAAoB,OAAO,EAAEC,OAAO,EAAEC,EAAE,EAAEC,KAAK,EAAEC,UAAU,EAAE;IACjE,MAAMC,sBAAsBD,WAAWE,IAAI,CAAC;IAE5C,IAAIH,OAAO;QACTF,QAAQM,OAAO,CAACC,MAAM,CAACC,IAAI,CAACN;QAC5BF,QAAQM,OAAO,CAACC,MAAM,CAACC,IAAI,CAACJ;IAC9B;IAEA,MAAMH,GAAGQ,OAAO,CAACnB,IAAIoB,GAAG,CAACN;AAC3B;AAEA;;;;;;;;;;;;;CAaC,GACD,OAAO,MAAMO,wBAAwB,OAAO,EAAET,KAAK,EAAEI,OAAO,EAAEM,GAAG,EAAQ;IACvE,MAAMZ,UAAUM,QAAQL,EAAE;IAC1B,MAAMY,MAAMP,QAAQL,EAAE,CAACa,YAAY;IAEnC,kEAAkE;IAClE,MAAM,EAAEC,mBAAmB,EAAEC,iBAAiB,EAAEC,UAAU,EAAE,GAAGjB,QAAQkB,iBAAiB;IACxF,MAAMC,mBAAmBJ,oBAAoBf,QAAQoB,MAAM;IAE3D,sCAAsC;IACtC,MAAMC,mBAAmB9B,GACtB+B,WAAW,CAACT,KACZU,MAAM,CAAC,CAACC,OAASA,KAAKC,QAAQ,CAAC,YAAY,CAACD,KAAKC,QAAQ,CAAC,6BAC1DC,IAAI,GACJC,OAAO,IAAI,CAAC,EAAE;IAEjB,IAAI,CAACN,kBAAkB;QACrB,MAAM,IAAIO,MACR,CAAC,gGAAgG,CAAC;IAEtG;IAEA,IAAIC,oBAAoBC,KAAKC,KAAK,CAChCxC,GAAGyC,YAAY,CAAC,GAAGnB,IAAI,CAAC,EAAEQ,kBAAkB,EAAE;IAGhD,IAAIJ,cAAcY,kBAAkBI,OAAO,GAAGd,iBAAiBc,OAAO,EAAE;QACtEJ,oBAAoBZ,WAAWY;IACjC;IAEA,MAAMK,eAAe,MAAMlB,kBAAkBa,mBAAmBV;IAEhE,IAAI,CAACe,aAAaC,MAAM,EAAE;QACxB7B,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,CAAC;QAC/C4B,QAAQC,IAAI,CAAC;IACf;IAEA,MAAMC,kBAAkB1C,qBAAqBsC;IAE7C,MAAMjC,KAAK,MAAMN,eAAeK,SAASY;IAEzC,MAAMb,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,mBAAmB;QAClCC,YAAYmC,gBAAgBC,UAAU;IACxC;IAEA,MAAMxC,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,mBAAmB;QAClCC,YAAYmC,gBAAgBE,SAAS;IACvC;IAEA,MAAMzC,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,oBAAoB;QACnCC,YAAYmC,gBAAgBG,WAAW;IACzC;IAEA,MAAM1C,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,qBAAqB;QACpCC,YAAYmC,gBAAgBI,YAAY;IAC1C;IAEA,MAAM3C,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,sCAAsC;QACrDC,YAAYmC,gBAAgBK,SAAS;IACvC;IAEA,eAAe;IACf,MAAM5C,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,qBAAqB;QACpCC,YAAYmC,gBAAgBM,UAAU;IACxC;IAEA,MAAM7C,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,qBAAqB;QACpCC,YAAYmC,gBAAgBO,WAAW;IACzC;IAEA,KAAK,MAAMC,cAAcxC,QAAQyC,MAAM,CAACC,WAAW,CAAE;QACnD,IAAIF,WAAWG,IAAI,KAAK,4BAA4B;YAClD;QACF;QACA,MAAMC,YAAYlD,QAAQmD,YAAY,CAACC,GAAG,CAAC1D,YAAYoD,WAAWG,IAAI;QACtE,MAAMI,eAA6B,IAAIC;QAEvCxD,eAAe;YACbE;YACAuD,gBAAgBT,WAAWG,IAAI;YAC/BO,cAAc;YACdvD;YACAwD,gBAAgB;YAChBC,QAAQZ,WAAWa,eAAe;YAClCC,YAAY;YACZC,cAAcX;YACdY,iBAAiBZ;YACjBa,MAAM;YACNV;YACA/C;YACA0D,eAAed;QACjB;QAEA,MAAMrD,qBAAqB;YACzBG;YACAuD,gBAAgBT,WAAWG,IAAI;YAC/BhD;YACAC;YACAwD,QAAQZ,WAAWa,eAAe;YAClCC,YAAY;YACZP;YACA/C;YACAM;YACAsC;QACF;QAEA,IAAIJ,WAAWmB,QAAQ,EAAE;YACvB,MAAMC,oBAAoBlE,QAAQmD,YAAY,CAACC,GAAG,CAChD,CAAC,CAAC,EAAE1D,YAAYoD,WAAWG,IAAI,IAAIjD,QAAQmE,cAAc,EAAE;YAE7D,MAAMC,gBAAgB5E,6BAA6Bc,QAAQyC,MAAM,EAAED,YAAY;YAC/E,MAAMuB,sBAAoC,IAAIf;YAE9CxD,eAAe;gBACbE;gBACAuD,gBAAgBT,WAAWG,IAAI;gBAC/BO,cAAc;gBACdvD;gBACAwD,gBAAgB;gBAChBC,QAAQU;gBACRR,YAAY;gBACZC,cAAcK;gBACdJ,iBAAiBI;gBACjBH,MAAM;gBACNV,cAAcgB;gBACd/D;gBACA0D,eAAeE;YACjB;YAEA,MAAMrE,qBAAqB;gBACzBG;gBACAuD,gBAAgBT,WAAWG,IAAI;gBAC/BhD;gBACAC;gBACAwD,QAAQU;gBACRR,YAAY;gBACZP,cAAcgB;gBACd/D;gBACAM;gBACAsC,WAAWgB;YACb;QACF;IACF;IAEA,KAAK,MAAMI,UAAUhE,QAAQyC,MAAM,CAACwB,OAAO,CAAE;QAC3C,MAAMrB,YAAYlD,QAAQmD,YAAY,CAACC,GAAG,CAAC1D,YAAY4E,OAAOrB,IAAI;QAElE,MAAMI,eAA6B,IAAIC;QAEvCxD,eAAe;YACbE;YACAwD,cAAc;YACdvD;YACAwD,gBAAgB;YAChBC,QAAQY,OAAOX,eAAe;YAC9Ba,YAAYF,OAAOrB,IAAI;YACvBW,YAAY;YACZC,cAAcX;YACdY,iBAAiBZ;YACjBa,MAAM;YACNV;YACA/C;YACA0D,eAAed;QACjB;QAEA,MAAMrD,qBAAqB;YACzBG;YACAC;YACAC;YACAwD,QAAQY,OAAOX,eAAe;YAC9Ba,YAAYF,OAAOrB,IAAI;YACvBW,YAAY;YACZP;YACA/C;YACAM;YACAsC;QACF;QAEA,IAAIoB,OAAOL,QAAQ,EAAE;YACnB,MAAMC,oBAAoBlE,QAAQmD,YAAY,CAACC,GAAG,CAChD,CAAC,CAAC,EAAE1D,YAAY4E,OAAOrB,IAAI,IAAIjD,QAAQmE,cAAc,EAAE;YAGzD,MAAMC,gBAAgB3E,yBAAyBa,QAAQyC,MAAM,EAAEuB,QAAQ;YAEvE,MAAMD,sBAAoC,IAAIf;YAE9CxD,eAAe;gBACbE;gBACAwD,cAAc;gBACdvD;gBACAwD,gBAAgB;gBAChBC,QAAQU;gBACRI,YAAYF,OAAOrB,IAAI;gBACvBW,YAAY;gBACZC,cAAcK;gBACdJ,iBAAiBI;gBACjBH,MAAM;gBACNV,cAAcgB;gBACd/D;gBACA0D,eAAeE;YACjB;YAEA,MAAMrE,qBAAqB;gBACzBG;gBACAC;gBACAC;gBACAwD,QAAQU;gBACRI,YAAYF,OAAOrB,IAAI;gBACvBW,YAAY;gBACZP,cAAcgB;gBACd/D;gBACAM;gBACAsC,WAAWgB;YACb;QACF;IACF;IAEA,iBAAiB;IACjB,MAAMnE,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,uBAAuB;QACtCC,YAAYmC,gBAAgBmC,aAAa;IAC3C;IAEA,WAAW;IACX,MAAM1E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,yBAAyB;QACxCC,YAAYmC,gBAAgBoC,OAAO;IACrC;IAEA,aAAa;IACb,MAAM3E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,oBAAoB;QACnCC,YAAYmC,gBAAgBqC,SAAS;IACvC;IAEA,aAAa;IACb,MAAM5E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,qBAAqB;QACpCC,YAAYmC,gBAAgBsC,SAAS;IACvC;IAEA,kBAAkB;IAClB,MAAM7E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,yBAAyB;QACxCC,YAAYmC,gBAAgBuC,cAAc;IAC5C;IAEA,cAAc;IACd,MAAM9E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,qBAAqB;QACpCC,YAAYmC,gBAAgBwC,UAAU;IACxC;IAEA,aAAa;IACb,MAAM/E,kBAAkB;QACtBC;QACAC;QACAC,OAAOA,QAAQ,mBAAmB;QAClCC,YAAYmC,gBAAgByC,QAAQ;IACtC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/postgres/predefinedMigrations/v2-v3/index.ts"],"sourcesContent":["import type { DrizzleSnapshotJSON } from 'drizzle-kit/api'\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport fs from 'fs'\nimport { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BasePostgresAdapter } from '../../types.js'\nimport type { PathsToQuery } from './types.js'\n\nimport { getTransaction } from '../../../utilities/getTransaction.js'\nimport { groupUpSQLStatements } from './groupUpSQLStatements.js'\nimport { migrateRelationships } from './migrateRelationships.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n debug?: boolean\n payload: Payload\n req?: Partial<PayloadRequest>\n}\n\nconst runStatementGroup = async ({ adapter, db, debug, statements }) => {\n const addColumnsStatement = statements.join('\\n')\n\n if (debug) {\n adapter.payload.logger.info(debug)\n adapter.payload.logger.info(addColumnsStatement)\n }\n\n await db.execute(sql.raw(addColumnsStatement))\n}\n\n/**\n * Moves upload and relationship columns from the join table and into the tables while moving data\n * This is done in the following order:\n * ADD COLUMNs\n * -- manipulate data to move relationships to new columns\n * ADD CONSTRAINTs\n * NOT NULLs\n * DROP TABLEs\n * DROP CONSTRAINTs\n * DROP COLUMNs\n * @param debug\n * @param payload\n * @param req\n */\nexport const migratePostgresV2toV3 = async ({ debug, payload, req }: Args) => {\n const adapter = payload.db as unknown as BasePostgresAdapter\n const dir = payload.db.migrationDir\n\n // get the drizzle migrateUpSQL from drizzle using the last schema\n const { generateDrizzleJson, generateMigration, upSnapshot } = adapter.requireDrizzleKit()\n const drizzleJsonAfter = generateDrizzleJson(adapter.schema) as DrizzleSnapshotJSON\n\n // Get the previous migration snapshot\n const previousSnapshot = fs\n .readdirSync(dir)\n .filter((file) => file.endsWith('.json') && !file.endsWith('relationships_v2_v3.json'))\n .sort()\n .reverse()?.[0]\n\n if (!previousSnapshot) {\n throw new Error(\n `No previous migration schema file found! A prior migration from v2 is required to migrate to v3.`,\n )\n }\n\n let drizzleJsonBefore = JSON.parse(\n fs.readFileSync(`${dir}/${previousSnapshot}`, 'utf8'),\n ) as DrizzleSnapshotJSON\n\n if (upSnapshot && drizzleJsonBefore.version < drizzleJsonAfter.version) {\n drizzleJsonBefore = upSnapshot(drizzleJsonBefore)\n }\n\n const generatedSQL = await generateMigration(drizzleJsonBefore, drizzleJsonAfter)\n\n if (!generatedSQL.length) {\n payload.logger.info(`No schema changes needed.`)\n return\n }\n\n const sqlUpStatements = groupUpSQLStatements(generatedSQL)\n\n const db = await getTransaction(adapter, req)\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TYPES' : null,\n statements: sqlUpStatements.createType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ALTERING TYPES' : null,\n statements: sqlUpStatements.alterType,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING TABLES' : null,\n statements: sqlUpStatements.createTable,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'RENAMING COLUMNS' : null,\n statements: sqlUpStatements.renameColumn,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING NEW RELATIONSHIP COLUMNS' : null,\n statements: sqlUpStatements.addColumn,\n })\n\n // SET DEFAULTS\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'SETTING DEFAULTS' : null,\n statements: sqlUpStatements.setDefault,\n })\n\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'CREATING INDEXES' : null,\n statements: sqlUpStatements.createIndex,\n })\n\n for (const collection of payload.config.collections) {\n if (collection.slug === 'payload-locked-documents') {\n continue\n }\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection.slug))\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: collection.flattenedFields,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: collection.flattenedFields,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (collection.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(collection.slug)}${adapter.versionsSuffix}`,\n )\n const versionFields = buildVersionCollectionFields(payload.config, collection, true)\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n collectionSlug: collection.slug,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n collectionSlug: collection.slug,\n db,\n debug,\n fields: versionFields,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n for (const global of payload.config.globals) {\n const tableName = adapter.tableNameMap.get(toSnakeCase(global.slug))\n\n const pathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: false,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n newTableName: tableName,\n parentTableName: tableName,\n path: '',\n pathsToQuery,\n payload,\n rootTableName: tableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: global.flattenedFields,\n globalSlug: global.slug,\n isVersions: false,\n pathsToQuery,\n payload,\n req,\n tableName,\n })\n\n if (global.versions) {\n const versionsTableName = adapter.tableNameMap.get(\n `_${toSnakeCase(global.slug)}${adapter.versionsSuffix}`,\n )\n\n const versionFields = buildVersionGlobalFields(payload.config, global, true)\n\n const versionPathsToQuery: PathsToQuery = new Set()\n\n traverseFields({\n adapter,\n columnPrefix: '',\n db,\n disableNotNull: true,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n newTableName: versionsTableName,\n parentTableName: versionsTableName,\n path: '',\n pathsToQuery: versionPathsToQuery,\n payload,\n rootTableName: versionsTableName,\n })\n\n await migrateRelationships({\n adapter,\n db,\n debug,\n fields: versionFields,\n globalSlug: global.slug,\n isVersions: true,\n pathsToQuery: versionPathsToQuery,\n payload,\n req,\n tableName: versionsTableName,\n })\n }\n }\n\n // ADD CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'ADDING CONSTRAINTS' : null,\n statements: sqlUpStatements.addConstraint,\n })\n\n // NOT NULL\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'NOT NULL CONSTRAINTS' : null,\n statements: sqlUpStatements.notNull,\n })\n\n // DROP TABLE\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TABLES' : null,\n statements: sqlUpStatements.dropTable,\n })\n\n // DROP INDEX\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING INDEXES' : null,\n statements: sqlUpStatements.dropIndex,\n })\n\n // DROP CONSTRAINT\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING CONSTRAINTS' : null,\n statements: sqlUpStatements.dropConstraint,\n })\n\n // DROP COLUMN\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING COLUMNS' : null,\n statements: sqlUpStatements.dropColumn,\n })\n\n // DROP TYPES\n await runStatementGroup({\n adapter,\n db,\n debug: debug ? 'DROPPING TYPES' : null,\n statements: sqlUpStatements.dropType,\n })\n}\n"],"names":["sql","fs","buildVersionCollectionFields","buildVersionGlobalFields","toSnakeCase","getTransaction","groupUpSQLStatements","migrateRelationships","traverseFields","runStatementGroup","adapter","db","debug","statements","addColumnsStatement","join","payload","logger","info","execute","raw","migratePostgresV2toV3","req","dir","migrationDir","generateDrizzleJson","generateMigration","upSnapshot","requireDrizzleKit","drizzleJsonAfter","schema","previousSnapshot","readdirSync","filter","file","endsWith","sort","reverse","Error","drizzleJsonBefore","JSON","parse","readFileSync","version","generatedSQL","length","sqlUpStatements","createType","alterType","createTable","renameColumn","addColumn","setDefault","createIndex","collection","config","collections","slug","tableName","tableNameMap","get","pathsToQuery","Set","collectionSlug","columnPrefix","disableNotNull","fields","flattenedFields","isVersions","newTableName","parentTableName","path","rootTableName","versions","versionsTableName","versionsSuffix","versionFields","versionPathsToQuery","global","globals","globalSlug","addConstraint","notNull","dropTable","dropIndex","dropConstraint","dropColumn","dropType"],"mappings":"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"}
@@ -24,6 +24,7 @@ type TableColumn = {
24
24
  };
25
25
  type Args = {
26
26
  adapter: DrizzleAdapter;
27
+ /** The current table when a query is being built with an alias, such as inside a subquery. */
27
28
  aliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>;
28
29
  collectionPath: string;
29
30
  columnPrefix?: string;
@@ -32,6 +33,7 @@ type Args = {
32
33
  fields: FlattenedField[];
33
34
  joins: BuildQueryJoinAliases;
34
35
  locale?: string;
36
+ /** The aliased table that owns a field nested inside an array or block. */
35
37
  parentAliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>;
36
38
  parentIsLocalized: boolean;
37
39
  pathSegments: string[];
@@ -49,9 +51,16 @@ type Args = {
49
51
  value: unknown;
50
52
  };
51
53
  /**
52
- * Transforms path to table and column name or to a list of OR columns
53
- * Adds tables to `join`
54
- * @returns TableColumn
54
+ * Resolves a field path to the database table and column that store its value.
55
+ *
56
+ * While walking through relationships, arrays, and blocks, the function adds the joins required
57
+ * to reach the final column. Table aliases are used when the path is resolved inside a subquery.
58
+ *
59
+ * @example
60
+ * Resolving `movies.name` adds joins from the parent collection to its relationship table and then
61
+ * to the `movies` table. The returned column is `movies.name`.
62
+ *
63
+ * @returns The final field and column, plus any extra constraints discovered while resolving it.
55
64
  */
56
65
  export declare const getTableColumnFromPath: ({ adapter, aliasTable, collectionPath, columnPrefix, constraintPath: incomingConstraintPath, constraints, fields, joins, locale: incomingLocale, parentAliasTable, parentIsLocalized, pathSegments: incomingSegments, rootTableName: incomingRootTableName, selectFields, selectLocale, tableName, tableNameSuffix, value, }: Args) => TableColumn;
57
66
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"getTableColumnFromPath.d.ts","sourceRoot":"","sources":["../../src/queries/getTableColumnFromPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAS,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAU5D,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC5D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;QAClC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KACxB,EAAE,CAAA;IACH,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,uBAAuB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;CAC7D,CAAA;AAED,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAClE,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,KAAK,EAAE,qBAAqB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IACxE,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,iUAmBhC,IAAI,KAAG,WA87BT,CAAA"}
1
+ {"version":3,"file":"getTableColumnFromPath.d.ts","sourceRoot":"","sources":["../../src/queries/getTableColumnFromPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAEV,cAAc,EAIf,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAM7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAW5D,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAC5D,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;QAClC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KACxB,EAAE,CAAA;IACH,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,uBAAuB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IAClD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,KAAK,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;CAC7D,CAAA;AAED,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,8FAA8F;IAC9F,UAAU,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IAClE,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,KAAK,EAAE,qBAAqB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAA;IACxE,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AACD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,iUAmBhC,IAAI,KAAG,WA08BT,CAAA"}
@@ -10,14 +10,23 @@ import { DistinctSymbol } from '../utilities/rawConstraint.js';
10
10
  import { resolveBlockTableName } from '../utilities/validateExistingBlockIsIdentical.js';
11
11
  import { addJoinTable } from './addJoinTable.js';
12
12
  import { getTableAlias } from './getTableAlias.js';
13
+ import { appendFieldToStoragePath, resolveRelationshipPath } from './resolveRelationshipPath.js';
13
14
  /**
14
- * Transforms path to table and column name or to a list of OR columns
15
- * Adds tables to `join`
16
- * @returns TableColumn
15
+ * Resolves a field path to the database table and column that store its value.
16
+ *
17
+ * While walking through relationships, arrays, and blocks, the function adds the joins required
18
+ * to reach the final column. Table aliases are used when the path is resolved inside a subquery.
19
+ *
20
+ * @example
21
+ * Resolving `movies.name` adds joins from the parent collection to its relationship table and then
22
+ * to the `movies` table. The returned column is `movies.name`.
23
+ *
24
+ * @returns The final field and column, plus any extra constraints discovered while resolving it.
17
25
  */ export const getTableColumnFromPath = ({ adapter, aliasTable, collectionPath, columnPrefix = '', constraintPath: incomingConstraintPath, constraints = [], fields, joins, locale: incomingLocale, parentAliasTable, parentIsLocalized, pathSegments: incomingSegments, rootTableName: incomingRootTableName, selectFields, selectLocale, tableName, tableNameSuffix = '', value })=>{
18
26
  const fieldPath = incomingSegments[0];
19
27
  let locale = incomingLocale;
20
28
  const rootTableName = incomingRootTableName || tableName;
29
+ const tableContainingField = parentAliasTable ?? aliasTable ?? adapter.tables[rootTableName];
21
30
  let constraintPath = incomingConstraintPath || '';
22
31
  const field = fields.find((fieldToFind)=>fieldToFind.name === fieldPath);
23
32
  let newTableName = tableName;
@@ -38,6 +47,10 @@ import { getTableAlias } from './getTableAlias.js';
38
47
  const pathSegments = [
39
48
  ...incomingSegments
40
49
  ];
50
+ const fieldStoragePath = appendFieldToStoragePath({
51
+ field,
52
+ path: constraintPath
53
+ });
41
54
  const isFieldLocalized = fieldShouldBeLocalized({
42
55
  field,
43
56
  parentIsLocalized
@@ -57,7 +70,7 @@ import { getTableAlias } from './getTableAlias.js';
57
70
  {
58
71
  newTableName = adapter.tableNameMap.get(`${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`);
59
72
  const arrayParentTable = aliasTable || adapter.tables[tableName];
60
- constraintPath = `${constraintPath}${field.name}.%.`;
73
+ constraintPath = `${fieldStoragePath}.`;
61
74
  if (locale && isFieldLocalized && adapter.payload.config.localization) {
62
75
  const conditions = [
63
76
  eq(arrayParentTable.id, adapter.tables[newTableName]._parentID)
@@ -140,7 +153,6 @@ import { getTableAlias } from './getTableAlias.js';
140
153
  const hasBlockField = field.blocks.some((_block)=>{
141
154
  const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block;
142
155
  newTableName = resolveBlockTableName(block, adapter.tableNameMap.get(`${tableName}_blocks_${toSnakeCase(block.slug)}`));
143
- constraintPath = `${constraintPath}${field.name}.%.`;
144
156
  let result;
145
157
  const blockConstraints = [];
146
158
  const blockSelectFields = {};
@@ -170,7 +182,7 @@ import { getTableAlias } from './getTableAlias.js';
170
182
  result = getTableColumnFromPath({
171
183
  adapter,
172
184
  collectionPath,
173
- constraintPath,
185
+ constraintPath: `${fieldStoragePath}.`,
174
186
  constraints: blockConstraints,
175
187
  fields: block.flattenedFields,
176
188
  joins: newJoins,
@@ -236,7 +248,7 @@ import { getTableAlias } from './getTableAlias.js';
236
248
  aliasTable,
237
249
  collectionPath,
238
250
  columnPrefix: `${columnPrefix}${field.name}_`,
239
- constraintPath: `${constraintPath}${field.name}.`,
251
+ constraintPath: `${fieldStoragePath}.`,
240
252
  constraints,
241
253
  fields: field.flattenedFields,
242
254
  joins,
@@ -273,7 +285,7 @@ import { getTableAlias } from './getTableAlias.js';
273
285
  }
274
286
  if (!existingTable) {
275
287
  addJoinTable({
276
- condition: and(eq(adapter.tables[rootTableName].id, aliasRelationshipTable[`${relationshipField.field.relationTo}ID`]), like(aliasRelationshipTable.path, field.on)),
288
+ condition: and(eq(tableContainingField.id, aliasRelationshipTable[`${relationshipField.field.relationTo}ID`]), like(aliasRelationshipTable.path, field.on)),
277
289
  joins,
278
290
  queryPath: `${constraintPath}${field.name}._rels`,
279
291
  table: aliasRelationshipTable
@@ -311,10 +323,10 @@ import { getTableAlias } from './getTableAlias.js';
311
323
  aliasTable: relationshipTable,
312
324
  collectionPath: newCollectionPath,
313
325
  constraints,
314
- // relationshipFields are fields from a different collection => no parentIsLocalized
315
326
  fields: relationshipFields,
316
327
  joins,
317
328
  locale,
329
+ // A join reads from a different collection, so localization does not carry over
318
330
  parentIsLocalized: false,
319
331
  pathSegments: pathSegments.slice(1),
320
332
  rootTableName: relationshipTableName,
@@ -379,7 +391,8 @@ import { getTableAlias } from './getTableAlias.js';
379
391
  fields: adapter.payload.collections[field.collection].config.flattenedFields,
380
392
  joins,
381
393
  locale,
382
- parentIsLocalized: parentIsLocalized || field.localized,
394
+ // A join reads from a different collection, so localization does not carry over
395
+ parentIsLocalized: false,
383
396
  pathSegments: pathSegments.slice(1),
384
397
  selectFields,
385
398
  tableName: newTableName,
@@ -398,14 +411,14 @@ import { getTableAlias } from './getTableAlias.js';
398
411
  columnName = 'number';
399
412
  }
400
413
  newTableName = `${rootTableName}_${tableType}`;
401
- const existingTable = joins.find((e)=>e.queryPath === `${constraintPath}${field.name}`);
414
+ const existingTable = joins.find((e)=>e.queryPath === fieldStoragePath);
402
415
  const table = existingTable?.table ?? getTableAlias({
403
416
  adapter,
404
417
  tableName: newTableName
405
418
  }).newAliasTable;
406
419
  const joinConstraints = [
407
- eq(adapter.tables[rootTableName].id, table.parent),
408
- like(table.path, `${constraintPath}${field.name}`)
420
+ eq(tableContainingField.id, table.parent),
421
+ like(table.path, fieldStoragePath)
409
422
  ];
410
423
  if (locale && isFieldLocalized && adapter.payload.config.localization) {
411
424
  const conditions = [
@@ -417,14 +430,14 @@ import { getTableAlias } from './getTableAlias.js';
417
430
  addJoinTable({
418
431
  condition: and(...conditions),
419
432
  joins,
420
- queryPath: `${constraintPath}${field.name}`,
433
+ queryPath: fieldStoragePath,
421
434
  table
422
435
  });
423
436
  } else {
424
437
  addJoinTable({
425
438
  condition: and(...joinConstraints),
426
439
  joins,
427
- queryPath: `${constraintPath}${field.name}`,
440
+ queryPath: fieldStoragePath,
428
441
  table
429
442
  });
430
443
  }
@@ -442,6 +455,17 @@ import { getTableAlias } from './getTableAlias.js';
442
455
  {
443
456
  const newCollectionPath = pathSegments.slice(1).join('.');
444
457
  if (Array.isArray(field.relationTo) || field.hasMany) {
458
+ const relationshipPath = resolveRelationshipPath({
459
+ adapter,
460
+ fields,
461
+ locale,
462
+ parentIsLocalized,
463
+ path: field.name,
464
+ pathPrefix: constraintPath
465
+ });
466
+ if (!relationshipPath) {
467
+ throw new APIError(`Relationship path could not be resolved: ${collectionPath}`);
468
+ }
445
469
  let relationshipFields;
446
470
  const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}`;
447
471
  const existingJoin = joins.find((e)=>e.queryPath === `${constraintPath}.${field.name}`);
@@ -458,18 +482,16 @@ import { getTableAlias } from './getTableAlias.js';
458
482
  aliasRelationshipTable = res.newAliasTable;
459
483
  aliasRelationshipTableName = res.newAliasTableName;
460
484
  }
461
- if (selectLocale && isFieldLocalized && adapter.payload.config.localization) {
485
+ if (selectLocale && relationshipPath.isLocalized && adapter.payload.config.localization) {
462
486
  selectFields._locale = aliasRelationshipTable.locale;
463
487
  }
464
488
  // Join in the relationships table
465
- if (locale && isFieldLocalized && adapter.payload.config.localization) {
489
+ if (relationshipPath.locale && relationshipPath.locale !== 'all' && relationshipPath.isLocalized && adapter.payload.config.localization) {
466
490
  const conditions = [
467
- eq((parentAliasTable || aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent),
468
- like(aliasRelationshipTable.path, `${constraintPath}${field.name}`)
491
+ eq(tableContainingField.id, aliasRelationshipTable.parent),
492
+ like(aliasRelationshipTable.path, relationshipPath.path)
469
493
  ];
470
- if (locale !== 'all') {
471
- conditions.push(eq(aliasRelationshipTable.locale, locale));
472
- }
494
+ conditions.push(eq(aliasRelationshipTable.locale, relationshipPath.locale));
473
495
  addJoinTable({
474
496
  condition: and(...conditions),
475
497
  joins,
@@ -479,7 +501,7 @@ import { getTableAlias } from './getTableAlias.js';
479
501
  } else {
480
502
  // Join in the relationships table
481
503
  addJoinTable({
482
- condition: and(eq((parentAliasTable || aliasTable || adapter.tables[rootTableName]).id, aliasRelationshipTable.parent), like(aliasRelationshipTable.path, `${constraintPath}${field.name}`)),
504
+ condition: and(eq(tableContainingField.id, aliasRelationshipTable.parent), like(aliasRelationshipTable.path, relationshipPath.path)),
483
505
  joins,
484
506
  queryPath: `${constraintPath}.${field.name}`,
485
507
  table: aliasRelationshipTable
@@ -597,10 +619,10 @@ import { getTableAlias } from './getTableAlias.js';
597
619
  aliasTable: newAliasTable,
598
620
  collectionPath: newCollectionPath,
599
621
  constraints,
600
- // relationshipFields are fields from a different collection => no parentIsLocalized
601
622
  fields: relationshipFields,
602
623
  joins,
603
624
  locale,
625
+ // A relationship jumps to a different collection, so localization does not carry over
604
626
  parentIsLocalized: false,
605
627
  pathSegments: pathSegments.slice(1),
606
628
  rootTableName: newTableName,
@@ -623,7 +645,7 @@ import { getTableAlias } from './getTableAlias.js';
623
645
  tableName: `${rootTableName}${adapter.localesSuffix}`
624
646
  });
625
647
  const condtions = [
626
- eq(aliasLocaleTable._parentID, adapter.tables[rootTableName].id)
648
+ eq(aliasLocaleTable._parentID, tableContainingField.id)
627
649
  ];
628
650
  if (selectLocale) {
629
651
  selectFields._locale = aliasLocaleTable._locale;
@@ -656,7 +678,8 @@ import { getTableAlias } from './getTableAlias.js';
656
678
  fields: adapter.payload.collections[field.relationTo].config.flattenedFields,
657
679
  joins,
658
680
  locale,
659
- parentIsLocalized: parentIsLocalized || field.localized,
681
+ // A relationship jumps to a different collection, so localization does not carry over
682
+ parentIsLocalized: false,
660
683
  pathSegments: pathSegments.slice(1),
661
684
  selectFields,
662
685
  tableName: newTableName,
@@ -707,7 +730,7 @@ import { getTableAlias } from './getTableAlias.js';
707
730
  aliasTable,
708
731
  collectionPath,
709
732
  columnPrefix: `${columnPrefix}${field.name}_`,
710
- constraintPath: `${constraintPath}${field.name}.`,
733
+ constraintPath: `${fieldStoragePath}.`,
711
734
  constraints,
712
735
  fields: field.flattenedFields,
713
736
  joins,