@payloadcms/drizzle 4.0.0-internal.2f0d313 → 4.0.0-internal.314c594
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/postgres/init.d.ts.map +1 -1
- package/dist/postgres/init.js +6 -0
- package/dist/postgres/init.js.map +1 -1
- package/dist/queries/getTableColumnFromPath.d.ts +12 -3
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +50 -27
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +151 -3
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/resolveRelationshipPath.d.ts +36 -0
- package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
- package/dist/queries/resolveRelationshipPath.js +66 -0
- package/dist/queries/resolveRelationshipPath.js.map +1 -0
- package/dist/schema/build.d.ts.map +1 -1
- package/dist/schema/build.js +4 -5
- package/dist/schema/build.js.map +1 -1
- package/dist/schema/buildRawSchema.spec.js +70 -10
- package/dist/schema/buildRawSchema.spec.js.map +1 -1
- package/dist/utilities/buildForeignKeyName.d.ts.map +1 -1
- package/dist/utilities/buildForeignKeyName.js +3 -2
- package/dist/utilities/buildForeignKeyName.js.map +1 -1
- package/dist/utilities/buildIndexName.d.ts.map +1 -1
- package/dist/utilities/buildIndexName.js +3 -2
- package/dist/utilities/buildIndexName.js.map +1 -1
- package/dist/utilities/checkTruncatedIdentifiers.d.ts +13 -0
- package/dist/utilities/checkTruncatedIdentifiers.d.ts.map +1 -0
- package/dist/utilities/checkTruncatedIdentifiers.js +56 -0
- package/dist/utilities/checkTruncatedIdentifiers.js.map +1 -0
- package/dist/utilities/checkTruncatedIdentifiers.spec.js +301 -0
- package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +1 -0
- package/dist/utilities/validateIdentifierLength.d.ts +5 -0
- package/dist/utilities/validateIdentifierLength.d.ts.map +1 -1
- package/dist/utilities/validateIdentifierLength.js +4 -0
- package/dist/utilities/validateIdentifierLength.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/postgres/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/postgres/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAWnC,eAAO,MAAM,IAAI,EAAE,IAqClB,CAAA"}
|
package/dist/postgres/init.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { buildDrizzleRelations } from '../schema/buildDrizzleRelations.js';
|
|
2
2
|
import { buildRawSchema } from '../schema/buildRawSchema.js';
|
|
3
|
+
import { checkTruncatedIdentifiers } from '../utilities/checkTruncatedIdentifiers.js';
|
|
3
4
|
import { executeSchemaHooks } from '../utilities/executeSchemaHooks.js';
|
|
4
5
|
import { buildDrizzleTable } from './schema/buildDrizzleTable.js';
|
|
5
6
|
import { setColumnID } from './schema/setColumnID.js';
|
|
@@ -14,6 +15,11 @@ export const init = async function init() {
|
|
|
14
15
|
type: 'beforeSchemaInit',
|
|
15
16
|
adapter: this
|
|
16
17
|
});
|
|
18
|
+
// Warn on identifiers Postgres will truncate past 63 chars; throw only when two collide.
|
|
19
|
+
checkTruncatedIdentifiers({
|
|
20
|
+
adapter: this,
|
|
21
|
+
logWarnings: process.env.NODE_ENV !== 'production'
|
|
22
|
+
});
|
|
17
23
|
if (this.payload.config.localization) {
|
|
18
24
|
this.enums.enum__locales = this.pgSchema.enum('_locales', this.payload.config.localization.locales.map(({ code })=>code));
|
|
19
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/postgres/init.ts"],"sourcesContent":["import type { Init } from 'payload'\n\nimport type { BasePostgresAdapter } from './types.js'\n\nimport { buildDrizzleRelations } from '../schema/buildDrizzleRelations.js'\nimport { buildRawSchema } from '../schema/buildRawSchema.js'\nimport { executeSchemaHooks } from '../utilities/executeSchemaHooks.js'\nimport { buildDrizzleTable } from './schema/buildDrizzleTable.js'\nimport { setColumnID } from './schema/setColumnID.js'\n\nexport const init: Init = async function init(this: BasePostgresAdapter) {\n this.rawRelations = {}\n this.rawTables = {}\n\n buildRawSchema({\n adapter: this,\n setColumnID,\n })\n\n await executeSchemaHooks({ type: 'beforeSchemaInit', adapter: this })\n\n if (this.payload.config.localization) {\n this.enums.enum__locales = this.pgSchema.enum(\n '_locales',\n this.payload.config.localization.locales.map(({ code }) => code) as [string, ...string[]],\n )\n }\n\n for (const tableName in this.rawTables) {\n buildDrizzleTable({ adapter: this, rawTable: this.rawTables[tableName] })\n }\n\n buildDrizzleRelations({\n adapter: this,\n })\n\n await executeSchemaHooks({ type: 'afterSchemaInit', adapter: this })\n\n this.schema = {\n pgSchema: this.pgSchema,\n ...this.tables,\n ...this.relations,\n ...this.enums,\n }\n}\n"],"names":["buildDrizzleRelations","buildRawSchema","executeSchemaHooks","buildDrizzleTable","setColumnID","init","rawRelations","rawTables","adapter","type","payload","config","localization","enums","enum__locales","pgSchema","enum","locales","map","code","tableName","rawTable","schema","tables","relations"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,qCAAoC;AAC1E,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,WAAW,QAAQ,0BAAyB;AAErD,OAAO,MAAMC,OAAa,eAAeA;IACvC,IAAI,CAACC,YAAY,GAAG,CAAC;IACrB,IAAI,CAACC,SAAS,GAAG,CAAC;
|
|
1
|
+
{"version":3,"sources":["../../src/postgres/init.ts"],"sourcesContent":["import type { Init } from 'payload'\n\nimport type { BasePostgresAdapter } from './types.js'\n\nimport { buildDrizzleRelations } from '../schema/buildDrizzleRelations.js'\nimport { buildRawSchema } from '../schema/buildRawSchema.js'\nimport { checkTruncatedIdentifiers } from '../utilities/checkTruncatedIdentifiers.js'\nimport { executeSchemaHooks } from '../utilities/executeSchemaHooks.js'\nimport { buildDrizzleTable } from './schema/buildDrizzleTable.js'\nimport { setColumnID } from './schema/setColumnID.js'\n\nexport const init: Init = async function init(this: BasePostgresAdapter) {\n this.rawRelations = {}\n this.rawTables = {}\n\n buildRawSchema({\n adapter: this,\n setColumnID,\n })\n\n await executeSchemaHooks({ type: 'beforeSchemaInit', adapter: this })\n\n // Warn on identifiers Postgres will truncate past 63 chars; throw only when two collide.\n checkTruncatedIdentifiers({ adapter: this, logWarnings: process.env.NODE_ENV !== 'production' })\n\n if (this.payload.config.localization) {\n this.enums.enum__locales = this.pgSchema.enum(\n '_locales',\n this.payload.config.localization.locales.map(({ code }) => code) as [string, ...string[]],\n )\n }\n\n for (const tableName in this.rawTables) {\n buildDrizzleTable({ adapter: this, rawTable: this.rawTables[tableName] })\n }\n\n buildDrizzleRelations({\n adapter: this,\n })\n\n await executeSchemaHooks({ type: 'afterSchemaInit', adapter: this })\n\n this.schema = {\n pgSchema: this.pgSchema,\n ...this.tables,\n ...this.relations,\n ...this.enums,\n }\n}\n"],"names":["buildDrizzleRelations","buildRawSchema","checkTruncatedIdentifiers","executeSchemaHooks","buildDrizzleTable","setColumnID","init","rawRelations","rawTables","adapter","type","logWarnings","process","env","NODE_ENV","payload","config","localization","enums","enum__locales","pgSchema","enum","locales","map","code","tableName","rawTable","schema","tables","relations"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,qCAAoC;AAC1E,SAASC,cAAc,QAAQ,8BAA6B;AAC5D,SAASC,yBAAyB,QAAQ,4CAA2C;AACrF,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,WAAW,QAAQ,0BAAyB;AAErD,OAAO,MAAMC,OAAa,eAAeA;IACvC,IAAI,CAACC,YAAY,GAAG,CAAC;IACrB,IAAI,CAACC,SAAS,GAAG,CAAC;IAElBP,eAAe;QACbQ,SAAS,IAAI;QACbJ;IACF;IAEA,MAAMF,mBAAmB;QAAEO,MAAM;QAAoBD,SAAS,IAAI;IAAC;IAEnE,yFAAyF;IACzFP,0BAA0B;QAAEO,SAAS,IAAI;QAAEE,aAAaC,QAAQC,GAAG,CAACC,QAAQ,KAAK;IAAa;IAE9F,IAAI,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,YAAY,EAAE;QACpC,IAAI,CAACC,KAAK,CAACC,aAAa,GAAG,IAAI,CAACC,QAAQ,CAACC,IAAI,CAC3C,YACA,IAAI,CAACN,OAAO,CAACC,MAAM,CAACC,YAAY,CAACK,OAAO,CAACC,GAAG,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA;IAE/D;IAEA,IAAK,MAAMC,aAAa,IAAI,CAACjB,SAAS,CAAE;QACtCJ,kBAAkB;YAAEK,SAAS,IAAI;YAAEiB,UAAU,IAAI,CAAClB,SAAS,CAACiB,UAAU;QAAC;IACzE;IAEAzB,sBAAsB;QACpBS,SAAS,IAAI;IACf;IAEA,MAAMN,mBAAmB;QAAEO,MAAM;QAAmBD,SAAS,IAAI;IAAC;IAElE,IAAI,CAACkB,MAAM,GAAG;QACZP,UAAU,IAAI,CAACA,QAAQ;QACvB,GAAG,IAAI,CAACQ,MAAM;QACd,GAAG,IAAI,CAACC,SAAS;QACjB,GAAG,IAAI,CAACX,KAAK;IACf;AACF,EAAC"}
|
|
@@ -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
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
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,
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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 = `${
|
|
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: `${
|
|
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(
|
|
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
|
-
|
|
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 ===
|
|
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(
|
|
408
|
-
like(table.path,
|
|
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:
|
|
433
|
+
queryPath: fieldStoragePath,
|
|
421
434
|
table
|
|
422
435
|
});
|
|
423
436
|
} else {
|
|
424
437
|
addJoinTable({
|
|
425
438
|
condition: and(...joinConstraints),
|
|
426
439
|
joins,
|
|
427
|
-
queryPath:
|
|
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 &&
|
|
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 &&
|
|
489
|
+
if (relationshipPath.locale && relationshipPath.locale !== 'all' && relationshipPath.isLocalized && adapter.payload.config.localization) {
|
|
466
490
|
const conditions = [
|
|
467
|
-
eq(
|
|
468
|
-
like(aliasRelationshipTable.path,
|
|
491
|
+
eq(tableContainingField.id, aliasRelationshipTable.parent),
|
|
492
|
+
like(aliasRelationshipTable.path, relationshipPath.path)
|
|
469
493
|
];
|
|
470
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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: `${
|
|
733
|
+
constraintPath: `${fieldStoragePath}.`,
|
|
711
734
|
constraints,
|
|
712
735
|
fields: field.flattenedFields,
|
|
713
736
|
joins,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/getTableColumnFromPath.ts"],"sourcesContent":["import type { SQL, Table } from 'drizzle-orm'\nimport type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport type {\n FlattenedBlock,\n FlattenedField,\n NumberField,\n RelationshipField,\n TextField,\n} from 'payload'\n\nimport { and, eq, getTableName, like, or, sql } from 'drizzle-orm'\nimport { type PgTableWithColumns } from 'drizzle-orm/pg-core'\nimport { APIError, getFieldByPath } from 'payload'\nimport { fieldShouldBeLocalized, tabHasName } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\nimport { validate as uuidValidate } from 'uuid'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { isPolymorphicRelationship } from '../utilities/isPolymorphicRelationship.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { jsonBuildObject } from '../utilities/json.js'\nimport { DistinctSymbol } from '../utilities/rawConstraint.js'\nimport { resolveBlockTableName } from '../utilities/validateExistingBlockIsIdentical.js'\nimport { addJoinTable } from './addJoinTable.js'\nimport { getTableAlias } from './getTableAlias.js'\n\ntype Constraint = {\n columnName: string\n table: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n value: unknown\n}\n\ntype TableColumn = {\n columnName?: string\n columns?: {\n idType: 'number' | 'text' | 'uuid'\n rawColumn: SQL<unknown>\n }[]\n constraints: Constraint[]\n field: FlattenedField\n getNotNullColumnByValue?: (val: unknown) => string\n pathSegments?: string[]\n rawColumn?: SQL\n table: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n}\n\ntype Args = {\n adapter: DrizzleAdapter\n aliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n collectionPath: string\n columnPrefix?: string\n constraintPath?: string\n constraints?: Constraint[]\n fields: FlattenedField[]\n joins: BuildQueryJoinAliases\n locale?: string\n parentAliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n parentIsLocalized: boolean\n pathSegments: string[]\n rootTableName?: string\n selectFields: Record<string, GenericColumn>\n selectLocale?: boolean\n tableName: string\n /**\n * If creating a new table name for arrays and blocks, this suffix should be appended to the table name\n */\n tableNameSuffix?: string\n /**\n * The raw value of the query before sanitization\n */\n value: unknown\n}\n/**\n * Transforms path to table and column name or to a list of OR columns\n * Adds tables to `join`\n * @returns TableColumn\n */\nexport const getTableColumnFromPath = ({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix = '',\n constraintPath: incomingConstraintPath,\n constraints = [],\n fields,\n joins,\n locale: incomingLocale,\n parentAliasTable,\n parentIsLocalized,\n pathSegments: incomingSegments,\n rootTableName: incomingRootTableName,\n selectFields,\n selectLocale,\n tableName,\n tableNameSuffix = '',\n value,\n}: Args): TableColumn => {\n const fieldPath = incomingSegments[0]\n let locale = incomingLocale\n const rootTableName = incomingRootTableName || tableName\n let constraintPath = incomingConstraintPath || ''\n\n const field = fields.find((fieldToFind) => fieldToFind.name === fieldPath)\n let newTableName = tableName\n\n if (!field && fieldPath === 'id') {\n selectFields.id = adapter.tables[newTableName].id\n return {\n columnName: 'id',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: adapter.tables[newTableName],\n }\n }\n\n let localizedPathQuery = false\n if (field) {\n const pathSegments = [...incomingSegments]\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If next segment is a locale,\n // we need to take it out and use it as the locale from this point on\n if (isFieldLocalized && adapter.payload.config.localization) {\n const matchedLocale = adapter.payload.config.localization.localeCodes.find(\n (locale) => locale === pathSegments[1],\n )\n\n if (matchedLocale) {\n locale = matchedLocale\n localizedPathQuery = true\n pathSegments.splice(1, 1)\n }\n }\n\n switch (field.type) {\n case 'array': {\n newTableName = adapter.tableNameMap.get(\n `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`,\n )\n\n const arrayParentTable = aliasTable || adapter.tables[tableName]\n\n constraintPath = `${constraintPath}${field.name}.%.`\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [eq(arrayParentTable.id, adapter.tables[newTableName]._parentID)]\n\n if (selectLocale) {\n selectFields._locale = adapter.tables[newTableName]._locale\n }\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n addJoinTable({\n condition: and(...conditions),\n isOneToMany: true,\n joins,\n table: adapter.tables[newTableName],\n })\n } else {\n addJoinTable({\n condition: eq(arrayParentTable.id, adapter.tables[newTableName]._parentID),\n isOneToMany: true,\n joins,\n table: adapter.tables[newTableName],\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n collectionPath,\n constraintPath,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentAliasTable: aliasTable,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n break\n }\n let blockTableColumn: TableColumn\n let newTableName: string\n\n // handle blockType queries\n if (pathSegments[1] === 'blockType') {\n // find the block config using the value\n const blockTypes = Array.isArray(value) ? value : [value]\n blockTypes.forEach((blockType) => {\n const block =\n adapter.payload.blocks[blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === blockType,\n ) as FlattenedBlock | undefined)\n\n newTableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${tableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n\n joins.push({\n condition: eq(adapter.tables[tableName].id, newAliasTable._parentID),\n table: newAliasTable,\n })\n constraints.push({\n columnName: '_path',\n table: newAliasTable,\n value: `${constraintPath}${pathSegments[0]}`,\n })\n })\n return {\n constraints,\n field,\n getNotNullColumnByValue: () => 'id',\n table: adapter.tables[tableName],\n }\n }\n\n const hasBlockField = field.blocks.some((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n newTableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${tableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n constraintPath = `${constraintPath}${field.name}.%.`\n\n let result: TableColumn\n const blockConstraints = []\n const blockSelectFields = {}\n\n let blockJoin: BuildQueryJoinAliases[0]\n if (isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [\n eq(\n (aliasTable || adapter.tables[tableName]).id,\n adapter.tables[newTableName]._parentID,\n ),\n ]\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n\n blockJoin = {\n condition: and(...conditions),\n table: adapter.tables[newTableName],\n }\n } else {\n blockJoin = {\n condition: eq(\n (aliasTable || adapter.tables[tableName]).id,\n adapter.tables[newTableName]._parentID,\n ),\n table: adapter.tables[newTableName],\n }\n }\n\n // Create a new reference for nested joins\n const newJoins = [...joins]\n\n try {\n result = getTableColumnFromPath({\n adapter,\n collectionPath,\n constraintPath,\n constraints: blockConstraints,\n fields: block.flattenedFields,\n joins: newJoins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields: blockSelectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n } catch (_) {\n // this is fine, not every block will have the field\n }\n if (!result) {\n return\n }\n blockTableColumn = result\n constraints = constraints.concat(blockConstraints)\n selectFields = { ...selectFields, ...blockSelectFields }\n\n const previousLength = joins.length\n joins.push(blockJoin)\n // Append new joins AFTER the block join to prevent errors with missing FROM clause.\n if (newJoins.length > previousLength) {\n for (let i = previousLength; i < newJoins.length; i++) {\n joins.push(newJoins[i])\n }\n }\n return true\n })\n if (hasBlockField) {\n return {\n columnName: blockTableColumn.columnName,\n constraints,\n field: blockTableColumn.field,\n pathSegments: pathSegments.slice(1),\n rawColumn: blockTableColumn.rawColumn,\n table: blockTableColumn.table,\n }\n }\n break\n }\n\n case 'group': {\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n newTableName = `${tableName}${adapter.localesSuffix}`\n\n let condition = eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID)\n\n if (locale !== 'all') {\n condition = and(condition, eq(adapter.tables[newTableName]._locale, locale))\n }\n\n addJoinTable({\n condition,\n joins,\n table: adapter.tables[newTableName],\n })\n }\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix: `${columnPrefix}${field.name}_`,\n constraintPath: `${constraintPath}${field.name}.`,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`,\n value,\n })\n }\n\n case 'join': {\n if (Array.isArray(field.collection)) {\n throw new APIError('Not supported')\n }\n\n const newCollectionPath = pathSegments.slice(1).join('.')\n\n if (field.hasMany) {\n const relationTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`\n\n const existingTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}._rels`,\n )\n\n const aliasRelationshipTable = (existingTable?.table ??\n getTableAlias({\n adapter,\n tableName: relationTableName,\n }).newAliasTable) as PgTableWithColumns<any>\n\n const relationshipField = getFieldByPath({\n fields: adapter.payload.collections[field.collection].config.flattenedFields,\n path: field.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship was not found')\n }\n\n if (!existingTable) {\n addJoinTable({\n condition: and(\n eq(\n adapter.tables[rootTableName].id,\n aliasRelationshipTable[\n `${(relationshipField.field as RelationshipField).relationTo as string}ID`\n ],\n ),\n like(aliasRelationshipTable.path, field.on),\n ),\n joins,\n queryPath: `${constraintPath}${field.name}._rels`,\n table: aliasRelationshipTable,\n })\n }\n\n if (newCollectionPath === 'id') {\n return {\n columnName: 'parent',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: aliasRelationshipTable,\n }\n }\n\n const relationshipConfig = adapter.payload.collections[field.collection].config\n const relationshipTableName = adapter.tableNameMap.get(\n toSnakeCase(relationshipConfig.slug),\n )\n\n // parent to relationship join table\n const relationshipFields = relationshipConfig.flattenedFields\n\n const existingMainTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}`,\n )\n\n const relationshipTable = (existingMainTable?.table ??\n getTableAlias({\n adapter,\n tableName: relationshipTableName,\n }).newAliasTable) as PgTableWithColumns<any>\n\n if (!existingMainTable) {\n joins.push({\n condition: eq(aliasRelationshipTable.parent, relationshipTable.id),\n queryPath: `${constraintPath}${field.name}`,\n table: relationshipTable,\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: relationshipTable,\n collectionPath: newCollectionPath,\n constraints,\n // relationshipFields are fields from a different collection => no parentIsLocalized\n fields: relationshipFields,\n joins,\n locale,\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n rootTableName: relationshipTableName,\n selectFields,\n selectLocale,\n tableName: relationshipTableName,\n value,\n })\n }\n\n const newTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[field.collection].config.slug),\n )\n\n const existingTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}`,\n )?.table\n const newAliasTable =\n existingTable || getTableAlias({ adapter, tableName: newTableName }).newAliasTable\n\n if (!existingTable) {\n const onSegments = field.on.split('.')\n const collectionFlattenedFields =\n adapter.payload.collections[field.collection].config.flattenedFields\n const firstSegField =\n onSegments.length > 1\n ? collectionFlattenedFields.find((f) => f.name === onSegments[0])\n : null\n\n const arrayTableName =\n firstSegField?.type === 'array'\n ? adapter.tableNameMap.get(`${newTableName}_${toSnakeCase(onSegments[0])}`)\n : undefined\n\n if (arrayTableName) {\n // join from main table to array table\n const { newAliasTable: arrayAliasTable } = getTableAlias({\n adapter,\n tableName: arrayTableName,\n })\n\n joins.push({\n condition: eq(\n arrayAliasTable[onSegments.slice(1).join('_')],\n aliasTable ? aliasTable.id : adapter.tables[tableName].id,\n ),\n queryPath: `${constraintPath}${field.name}._array`,\n table: arrayAliasTable,\n })\n\n joins.push({\n condition: eq(\n (newAliasTable as PgTableWithColumns<any>).id,\n arrayAliasTable._parentID,\n ),\n queryPath: `${constraintPath}${field.name}`,\n table: newAliasTable,\n })\n } else {\n joins.push({\n condition: eq(\n newAliasTable[field.on.replaceAll('.', '_')],\n aliasTable ? aliasTable.id : adapter.tables[tableName].id,\n ),\n queryPath: `${constraintPath}${field.name}`,\n table: newAliasTable,\n })\n }\n }\n\n if (newCollectionPath === 'id') {\n return {\n columnName: 'id',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: newAliasTable,\n }\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraintPath: '',\n constraints,\n fields: adapter.payload.collections[field.collection].config.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n selectFields,\n tableName: newTableName,\n value,\n })\n\n break\n }\n\n case 'number':\n case 'text': {\n if (field.hasMany) {\n let tableType = 'texts'\n let columnName = 'text'\n if (field.type === 'number') {\n tableType = 'numbers'\n columnName = 'number'\n }\n newTableName = `${rootTableName}_${tableType}`\n\n const existingTable = joins.find((e) => e.queryPath === `${constraintPath}${field.name}`)\n\n const table = (existingTable?.table ??\n getTableAlias({ adapter, tableName: newTableName })\n .newAliasTable) as PgTableWithColumns<any>\n\n const joinConstraints = [\n eq(adapter.tables[rootTableName].id, table.parent),\n like(table.path, `${constraintPath}${field.name}`),\n ]\n\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [...joinConstraints]\n\n if (locale !== 'all') {\n conditions.push(eq(table._locale, locale))\n }\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n queryPath: `${constraintPath}${field.name}`,\n table,\n })\n } else {\n addJoinTable({\n condition: and(...joinConstraints),\n joins,\n queryPath: `${constraintPath}${field.name}`,\n table,\n })\n }\n\n return {\n columnName,\n constraints,\n field,\n table,\n }\n }\n break\n }\n case 'relationship':\n case 'upload': {\n const newCollectionPath = pathSegments.slice(1).join('.')\n\n if (Array.isArray(field.relationTo) || field.hasMany) {\n let relationshipFields: FlattenedField[]\n const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}`\n\n const existingJoin = joins.find((e) => e.queryPath === `${constraintPath}.${field.name}`)\n\n let aliasRelationshipTable: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n let aliasRelationshipTableName: string\n if (existingJoin) {\n aliasRelationshipTable = existingJoin.table\n aliasRelationshipTableName = getTableName(existingJoin.table)\n } else {\n const res = getTableAlias({\n adapter,\n tableName: relationTableName,\n })\n aliasRelationshipTable = res.newAliasTable\n aliasRelationshipTableName = res.newAliasTableName\n }\n\n if (selectLocale && isFieldLocalized && adapter.payload.config.localization) {\n selectFields._locale = aliasRelationshipTable.locale\n }\n\n // Join in the relationships table\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [\n eq(\n (parentAliasTable || aliasTable || adapter.tables[rootTableName]).id,\n aliasRelationshipTable.parent,\n ),\n like(aliasRelationshipTable.path, `${constraintPath}${field.name}`),\n ]\n\n if (locale !== 'all') {\n conditions.push(eq(aliasRelationshipTable.locale, locale))\n }\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n queryPath: `${constraintPath}.${field.name}`,\n table: aliasRelationshipTable,\n })\n } else {\n // Join in the relationships table\n addJoinTable({\n condition: and(\n eq(\n (parentAliasTable || aliasTable || adapter.tables[rootTableName]).id,\n aliasRelationshipTable.parent,\n ),\n like(aliasRelationshipTable.path, `${constraintPath}${field.name}`),\n ),\n joins,\n queryPath: `${constraintPath}.${field.name}`,\n table: aliasRelationshipTable,\n })\n }\n\n selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path\n\n let newAliasTable\n\n if (typeof field.relationTo === 'string') {\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n newTableName = adapter.tableNameMap.get(toSnakeCase(relationshipConfig.slug))\n\n // parent to relationship join table\n relationshipFields = relationshipConfig.flattenedFields\n ;({ newAliasTable } = getTableAlias({ adapter, tableName: newTableName }))\n\n joins.push({\n condition: eq(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]),\n table: newAliasTable,\n })\n\n if (newCollectionPath === '' || newCollectionPath === 'id') {\n return {\n columnName: `${field.relationTo}ID`,\n constraints,\n field,\n table: aliasRelationshipTable,\n }\n }\n } else if (newCollectionPath === 'value') {\n const hasCustomCollectionWithCustomID = field.relationTo.some(\n (relationTo) => !!adapter.payload.collections[relationTo].customIDType,\n )\n\n const columns: TableColumn['columns'] = field.relationTo\n .map((relationTo) => {\n let idType: 'number' | 'text' | 'uuid' = isUUIDType(adapter.idType)\n ? 'uuid'\n : 'number'\n\n const { customIDType } = adapter.payload.collections[relationTo]\n\n if (customIDType) {\n idType = customIDType\n }\n\n const idTypeTextOrUuid = idType === 'text' || idType === 'uuid'\n\n // Do not add the column to OR if we know that it can't match by the type\n // We can't do the same with idType: 'number' because `value` can be from the REST search query params\n if (typeof value === 'number' && idTypeTextOrUuid) {\n return null\n }\n\n if (\n Array.isArray(value) &&\n value.every((val) => typeof val === 'number') &&\n idTypeTextOrUuid\n ) {\n return null\n }\n\n // Do not add the UUID type column if incoming query value doesn't match UUID. If there aren't any collections with\n // a custom ID type, we skip this check\n // We need this because Postgres throws an error if querying by UUID column with a value that isn't a valid UUID.\n if (\n value &&\n !Array.isArray(value) &&\n idType === 'uuid' &&\n hasCustomCollectionWithCustomID\n ) {\n if (!uuidValidate(value)) {\n return null\n }\n }\n\n if (\n Array.isArray(value) &&\n idType === 'uuid' &&\n hasCustomCollectionWithCustomID &&\n !value.some((val) => uuidValidate(val))\n ) {\n return null\n }\n\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n return {\n idType,\n rawColumn: sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`),\n }\n })\n .filter(Boolean)\n\n return {\n columns,\n constraints,\n field,\n table: aliasRelationshipTable,\n }\n } else if (newCollectionPath === 'relationTo') {\n const relationTo = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n\n return {\n constraints,\n field,\n getNotNullColumnByValue: (val) => {\n const matchedRelation = relationTo.find((relation) => relation === val)\n if (matchedRelation) {\n return `${matchedRelation}ID`\n }\n return undefined\n },\n table: aliasRelationshipTable,\n }\n } else if (isPolymorphicRelationship(value)) {\n const { relationTo } = value\n\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n return {\n constraints,\n field,\n rawColumn: sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`),\n table: aliasRelationshipTable,\n }\n } else if (value === DistinctSymbol) {\n const obj: Record<string, SQL> = {}\n\n field.relationTo.forEach((relationTo) => {\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n obj[relationTo] = sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`)\n })\n\n let rawColumn = jsonBuildObject(adapter, obj)\n if (adapter.name === 'postgres') {\n rawColumn = sql`${rawColumn}::text`\n }\n\n return {\n constraints,\n field,\n rawColumn,\n table: aliasRelationshipTable,\n }\n } else {\n throw new APIError('Not supported')\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraints,\n // relationshipFields are fields from a different collection => no parentIsLocalized\n fields: relationshipFields,\n joins,\n locale,\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n rootTableName: newTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n } else if (\n pathSegments.length > 1 &&\n !(pathSegments.length === 2 && pathSegments[1] === 'id')\n ) {\n // simple relationships\n const columnName = `${columnPrefix}${field.name}`\n const newTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[field.relationTo].config.slug),\n )\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n\n if (isFieldLocalized && adapter.payload.config.localization) {\n const { newAliasTable: aliasLocaleTable } = getTableAlias({\n adapter,\n tableName: `${rootTableName}${adapter.localesSuffix}`,\n })\n\n const condtions = [eq(aliasLocaleTable._parentID, adapter.tables[rootTableName].id)]\n\n if (selectLocale) {\n selectFields._locale = aliasLocaleTable._locale\n }\n\n if (locale !== 'all') {\n condtions.push(eq(aliasLocaleTable._locale, locale))\n }\n\n const localesTable = adapter.tables[`${rootTableName}${adapter.localesSuffix}`]\n\n addJoinTable({\n condition: and(...condtions),\n joins,\n table: localesTable,\n })\n\n joins.push({\n condition: eq(localesTable[columnName], newAliasTable.id),\n table: newAliasTable,\n })\n } else {\n joins.push({\n condition: eq(\n newAliasTable.id,\n aliasTable ? aliasTable[columnName] : adapter.tables[tableName][columnName],\n ),\n table: newAliasTable,\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraintPath: '',\n constraints,\n fields: adapter.payload.collections[field.relationTo].config.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n selectFields,\n tableName: newTableName,\n value,\n })\n }\n\n break\n }\n\n case 'select': {\n if (field.hasMany) {\n const newTableName = adapter.tableNameMap.get(\n `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`,\n )\n\n const idColumn = (aliasTable ?? adapter.tables[tableName]).id\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [\n eq(idColumn, adapter.tables[newTableName].parent),\n eq(adapter.tables[newTableName]._locale, locale),\n ]\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n table: adapter.tables[newTableName],\n })\n } else {\n addJoinTable({\n condition: eq(idColumn, adapter.tables[newTableName].parent),\n joins,\n table: adapter.tables[newTableName],\n })\n }\n\n return {\n columnName: 'value',\n constraints,\n field,\n table: adapter.tables[newTableName],\n }\n }\n break\n }\n\n case 'tab': {\n if (tabHasName(field)) {\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix: `${columnPrefix}${field.name}_`,\n constraintPath: `${constraintPath}${field.name}.`,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`,\n value,\n })\n }\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix,\n constraintPath,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix,\n value,\n })\n }\n\n default: {\n // fall through\n break\n }\n }\n\n let newTable = adapter.tables[newTableName]\n\n if (isFieldLocalized && adapter.payload.config.localization) {\n // If localized, we go to localized table and set aliasTable to undefined\n // so it is not picked up below to be used as targetTable\n const parentTable = aliasTable || adapter.tables[tableName]\n newTableName = `${tableName}${adapter.localesSuffix}`\n\n // use an alias because the same query may contain constraints with different locale value\n if (localizedPathQuery) {\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n newTable = newAliasTable\n } else {\n newTable = adapter.tables[newTableName]\n }\n\n let condition = eq(parentTable.id, newTable._parentID)\n\n if (locale !== 'all') {\n condition = and(condition, eq(newTable._locale, locale))\n }\n\n if (selectLocale) {\n selectFields._locale = newTable._locale\n }\n\n addJoinTable({\n condition,\n joins,\n table: newTable,\n })\n\n aliasTable = undefined\n }\n\n const targetTable = aliasTable || newTable\n\n selectFields[`${newTableName}.${columnPrefix}${field.name}`] =\n targetTable[`${columnPrefix}${field.name}`]\n\n return {\n columnName: `${columnPrefix}${field.name}`,\n constraints,\n field,\n pathSegments,\n table: targetTable,\n }\n }\n\n throw new APIError(`Cannot find field for path at ${fieldPath}`)\n}\n"],"names":["and","eq","getTableName","like","sql","APIError","getFieldByPath","fieldShouldBeLocalized","tabHasName","toSnakeCase","validate","uuidValidate","isPolymorphicRelationship","isUUIDType","jsonBuildObject","DistinctSymbol","resolveBlockTableName","addJoinTable","getTableAlias","getTableColumnFromPath","adapter","aliasTable","collectionPath","columnPrefix","constraintPath","incomingConstraintPath","constraints","fields","joins","locale","incomingLocale","parentAliasTable","parentIsLocalized","pathSegments","incomingSegments","rootTableName","incomingRootTableName","selectFields","selectLocale","tableName","tableNameSuffix","value","fieldPath","field","find","fieldToFind","name","newTableName","id","tables","columnName","type","idType","table","localizedPathQuery","isFieldLocalized","payload","config","localization","matchedLocale","localeCodes","splice","tableNameMap","get","arrayParentTable","conditions","_parentID","_locale","push","condition","isOneToMany","flattenedFields","localized","slice","blocksAsJSON","blockTableColumn","blockTypes","Array","isArray","forEach","blockType","block","blocks","slug","newAliasTable","getNotNullColumnByValue","hasBlockField","some","_block","result","blockConstraints","blockSelectFields","blockJoin","newJoins","_","concat","previousLength","length","i","rawColumn","localesSuffix","collection","newCollectionPath","join","hasMany","relationTableName","relationshipsSuffix","existingTable","e","queryPath","aliasRelationshipTable","relationshipField","collections","path","on","relationTo","relationshipConfig","relationshipTableName","relationshipFields","existingMainTable","relationshipTable","parent","onSegments","split","collectionFlattenedFields","firstSegField","f","arrayTableName","undefined","arrayAliasTable","replaceAll","tableType","joinConstraints","existingJoin","aliasRelationshipTableName","res","newAliasTableName","hasCustomCollectionWithCustomID","customIDType","columns","map","idTypeTextOrUuid","every","val","raw","filter","Boolean","matchedRelation","relation","obj","aliasLocaleTable","condtions","localesTable","idColumn","newTable","parentTable","targetTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/queries/getTableColumnFromPath.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { SQLiteTableWithColumns } from 'drizzle-orm/sqlite-core'\nimport type {\n FlattenedBlock,\n FlattenedField,\n NumberField,\n RelationshipField,\n TextField,\n} from 'payload'\n\nimport { and, eq, getTableName, like, sql } from 'drizzle-orm'\nimport { type PgTableWithColumns } from 'drizzle-orm/pg-core'\nimport { APIError, getFieldByPath } from 'payload'\nimport { fieldShouldBeLocalized, tabHasName } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\nimport { validate as uuidValidate } from 'uuid'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { isPolymorphicRelationship } from '../utilities/isPolymorphicRelationship.js'\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { jsonBuildObject } from '../utilities/json.js'\nimport { DistinctSymbol } from '../utilities/rawConstraint.js'\nimport { resolveBlockTableName } from '../utilities/validateExistingBlockIsIdentical.js'\nimport { addJoinTable } from './addJoinTable.js'\nimport { getTableAlias } from './getTableAlias.js'\nimport { appendFieldToStoragePath, resolveRelationshipPath } from './resolveRelationshipPath.js'\n\ntype Constraint = {\n columnName: string\n table: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n value: unknown\n}\n\ntype TableColumn = {\n columnName?: string\n columns?: {\n idType: 'number' | 'text' | 'uuid'\n rawColumn: SQL<unknown>\n }[]\n constraints: Constraint[]\n field: FlattenedField\n getNotNullColumnByValue?: (val: unknown) => string\n pathSegments?: string[]\n rawColumn?: SQL\n table: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n}\n\ntype Args = {\n adapter: DrizzleAdapter\n /** The current table when a query is being built with an alias, such as inside a subquery. */\n aliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n collectionPath: string\n columnPrefix?: string\n constraintPath?: string\n constraints?: Constraint[]\n fields: FlattenedField[]\n joins: BuildQueryJoinAliases\n locale?: string\n /** The aliased table that owns a field nested inside an array or block. */\n parentAliasTable?: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n parentIsLocalized: boolean\n pathSegments: string[]\n rootTableName?: string\n selectFields: Record<string, GenericColumn>\n selectLocale?: boolean\n tableName: string\n /**\n * If creating a new table name for arrays and blocks, this suffix should be appended to the table name\n */\n tableNameSuffix?: string\n /**\n * The raw value of the query before sanitization\n */\n value: unknown\n}\n/**\n * Resolves a field path to the database table and column that store its value.\n *\n * While walking through relationships, arrays, and blocks, the function adds the joins required\n * to reach the final column. Table aliases are used when the path is resolved inside a subquery.\n *\n * @example\n * Resolving `movies.name` adds joins from the parent collection to its relationship table and then\n * to the `movies` table. The returned column is `movies.name`.\n *\n * @returns The final field and column, plus any extra constraints discovered while resolving it.\n */\nexport const getTableColumnFromPath = ({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix = '',\n constraintPath: incomingConstraintPath,\n constraints = [],\n fields,\n joins,\n locale: incomingLocale,\n parentAliasTable,\n parentIsLocalized,\n pathSegments: incomingSegments,\n rootTableName: incomingRootTableName,\n selectFields,\n selectLocale,\n tableName,\n tableNameSuffix = '',\n value,\n}: Args): TableColumn => {\n const fieldPath = incomingSegments[0]\n let locale = incomingLocale\n const rootTableName = incomingRootTableName || tableName\n const tableContainingField = parentAliasTable ?? aliasTable ?? adapter.tables[rootTableName]\n let constraintPath = incomingConstraintPath || ''\n\n const field = fields.find((fieldToFind) => fieldToFind.name === fieldPath)\n let newTableName = tableName\n\n if (!field && fieldPath === 'id') {\n selectFields.id = adapter.tables[newTableName].id\n return {\n columnName: 'id',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: adapter.tables[newTableName],\n }\n }\n\n let localizedPathQuery = false\n if (field) {\n const pathSegments = [...incomingSegments]\n const fieldStoragePath = appendFieldToStoragePath({ field, path: constraintPath })\n\n const isFieldLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n // If next segment is a locale,\n // we need to take it out and use it as the locale from this point on\n if (isFieldLocalized && adapter.payload.config.localization) {\n const matchedLocale = adapter.payload.config.localization.localeCodes.find(\n (locale) => locale === pathSegments[1],\n )\n\n if (matchedLocale) {\n locale = matchedLocale\n localizedPathQuery = true\n pathSegments.splice(1, 1)\n }\n }\n\n switch (field.type) {\n case 'array': {\n newTableName = adapter.tableNameMap.get(\n `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`,\n )\n\n const arrayParentTable = aliasTable || adapter.tables[tableName]\n\n constraintPath = `${fieldStoragePath}.`\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [eq(arrayParentTable.id, adapter.tables[newTableName]._parentID)]\n\n if (selectLocale) {\n selectFields._locale = adapter.tables[newTableName]._locale\n }\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n addJoinTable({\n condition: and(...conditions),\n isOneToMany: true,\n joins,\n table: adapter.tables[newTableName],\n })\n } else {\n addJoinTable({\n condition: eq(arrayParentTable.id, adapter.tables[newTableName]._parentID),\n isOneToMany: true,\n joins,\n table: adapter.tables[newTableName],\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n collectionPath,\n constraintPath,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentAliasTable: aliasTable,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n }\n case 'blocks': {\n if (adapter.blocksAsJSON) {\n break\n }\n let blockTableColumn: TableColumn\n let newTableName: string\n\n // handle blockType queries\n if (pathSegments[1] === 'blockType') {\n // find the block config using the value\n const blockTypes = Array.isArray(value) ? value : [value]\n blockTypes.forEach((blockType) => {\n const block =\n adapter.payload.blocks[blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === blockType,\n ) as FlattenedBlock | undefined)\n\n newTableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${tableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n\n joins.push({\n condition: eq(adapter.tables[tableName].id, newAliasTable._parentID),\n table: newAliasTable,\n })\n constraints.push({\n columnName: '_path',\n table: newAliasTable,\n value: `${constraintPath}${pathSegments[0]}`,\n })\n })\n return {\n constraints,\n field,\n getNotNullColumnByValue: () => 'id',\n table: adapter.tables[tableName],\n }\n }\n\n const hasBlockField = field.blocks.some((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n\n newTableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${tableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n let result: TableColumn\n const blockConstraints = []\n const blockSelectFields = {}\n\n let blockJoin: BuildQueryJoinAliases[0]\n if (isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [\n eq(\n (aliasTable || adapter.tables[tableName]).id,\n adapter.tables[newTableName]._parentID,\n ),\n ]\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n\n blockJoin = {\n condition: and(...conditions),\n table: adapter.tables[newTableName],\n }\n } else {\n blockJoin = {\n condition: eq(\n (aliasTable || adapter.tables[tableName]).id,\n adapter.tables[newTableName]._parentID,\n ),\n table: adapter.tables[newTableName],\n }\n }\n\n // Create a new reference for nested joins\n const newJoins = [...joins]\n\n try {\n result = getTableColumnFromPath({\n adapter,\n collectionPath,\n constraintPath: `${fieldStoragePath}.`,\n constraints: blockConstraints,\n fields: block.flattenedFields,\n joins: newJoins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields: blockSelectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n } catch (_) {\n // this is fine, not every block will have the field\n }\n if (!result) {\n return\n }\n blockTableColumn = result\n constraints = constraints.concat(blockConstraints)\n selectFields = { ...selectFields, ...blockSelectFields }\n\n const previousLength = joins.length\n joins.push(blockJoin)\n // Append new joins AFTER the block join to prevent errors with missing FROM clause.\n if (newJoins.length > previousLength) {\n for (let i = previousLength; i < newJoins.length; i++) {\n joins.push(newJoins[i])\n }\n }\n return true\n })\n if (hasBlockField) {\n return {\n columnName: blockTableColumn.columnName,\n constraints,\n field: blockTableColumn.field,\n pathSegments: pathSegments.slice(1),\n rawColumn: blockTableColumn.rawColumn,\n table: blockTableColumn.table,\n }\n }\n break\n }\n\n case 'group': {\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n newTableName = `${tableName}${adapter.localesSuffix}`\n\n let condition = eq(adapter.tables[tableName].id, adapter.tables[newTableName]._parentID)\n\n if (locale !== 'all') {\n condition = and(condition, eq(adapter.tables[newTableName]._locale, locale))\n }\n\n addJoinTable({\n condition,\n joins,\n table: adapter.tables[newTableName],\n })\n }\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix: `${columnPrefix}${field.name}_`,\n constraintPath: `${fieldStoragePath}.`,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`,\n value,\n })\n }\n\n case 'join': {\n if (Array.isArray(field.collection)) {\n throw new APIError('Not supported')\n }\n\n const newCollectionPath = pathSegments.slice(1).join('.')\n\n if (field.hasMany) {\n const relationTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`\n\n const existingTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}._rels`,\n )\n\n const aliasRelationshipTable = (existingTable?.table ??\n getTableAlias({\n adapter,\n tableName: relationTableName,\n }).newAliasTable) as PgTableWithColumns<any>\n\n const relationshipField = getFieldByPath({\n fields: adapter.payload.collections[field.collection].config.flattenedFields,\n path: field.on,\n })\n if (!relationshipField) {\n throw new APIError('Relationship was not found')\n }\n\n if (!existingTable) {\n addJoinTable({\n condition: and(\n eq(\n tableContainingField.id,\n aliasRelationshipTable[\n `${(relationshipField.field as RelationshipField).relationTo as string}ID`\n ],\n ),\n like(aliasRelationshipTable.path, field.on),\n ),\n joins,\n queryPath: `${constraintPath}${field.name}._rels`,\n table: aliasRelationshipTable,\n })\n }\n\n if (newCollectionPath === 'id') {\n return {\n columnName: 'parent',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: aliasRelationshipTable,\n }\n }\n\n const relationshipConfig = adapter.payload.collections[field.collection].config\n const relationshipTableName = adapter.tableNameMap.get(\n toSnakeCase(relationshipConfig.slug),\n )\n\n // parent to relationship join table\n const relationshipFields = relationshipConfig.flattenedFields\n\n const existingMainTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}`,\n )\n\n const relationshipTable = (existingMainTable?.table ??\n getTableAlias({\n adapter,\n tableName: relationshipTableName,\n }).newAliasTable) as PgTableWithColumns<any>\n\n if (!existingMainTable) {\n joins.push({\n condition: eq(aliasRelationshipTable.parent, relationshipTable.id),\n queryPath: `${constraintPath}${field.name}`,\n table: relationshipTable,\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: relationshipTable,\n collectionPath: newCollectionPath,\n constraints,\n fields: relationshipFields,\n joins,\n locale,\n // A join reads from a different collection, so localization does not carry over\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n rootTableName: relationshipTableName,\n selectFields,\n selectLocale,\n tableName: relationshipTableName,\n value,\n })\n }\n\n const newTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[field.collection].config.slug),\n )\n\n const existingTable = joins.find(\n (e) => e.queryPath === `${constraintPath}${field.name}`,\n )?.table\n const newAliasTable =\n existingTable || getTableAlias({ adapter, tableName: newTableName }).newAliasTable\n\n if (!existingTable) {\n const onSegments = field.on.split('.')\n const collectionFlattenedFields =\n adapter.payload.collections[field.collection].config.flattenedFields\n const firstSegField =\n onSegments.length > 1\n ? collectionFlattenedFields.find((f) => f.name === onSegments[0])\n : null\n\n const arrayTableName =\n firstSegField?.type === 'array'\n ? adapter.tableNameMap.get(`${newTableName}_${toSnakeCase(onSegments[0])}`)\n : undefined\n\n if (arrayTableName) {\n // join from main table to array table\n const { newAliasTable: arrayAliasTable } = getTableAlias({\n adapter,\n tableName: arrayTableName,\n })\n\n joins.push({\n condition: eq(\n arrayAliasTable[onSegments.slice(1).join('_')],\n aliasTable ? aliasTable.id : adapter.tables[tableName].id,\n ),\n queryPath: `${constraintPath}${field.name}._array`,\n table: arrayAliasTable,\n })\n\n joins.push({\n condition: eq(\n (newAliasTable as PgTableWithColumns<any>).id,\n arrayAliasTable._parentID,\n ),\n queryPath: `${constraintPath}${field.name}`,\n table: newAliasTable,\n })\n } else {\n joins.push({\n condition: eq(\n newAliasTable[field.on.replaceAll('.', '_')],\n aliasTable ? aliasTable.id : adapter.tables[tableName].id,\n ),\n queryPath: `${constraintPath}${field.name}`,\n table: newAliasTable,\n })\n }\n }\n\n if (newCollectionPath === 'id') {\n return {\n columnName: 'id',\n constraints,\n field: {\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as NumberField | TextField,\n table: newAliasTable,\n }\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraintPath: '',\n constraints,\n fields: adapter.payload.collections[field.collection].config.flattenedFields,\n joins,\n locale,\n // A join reads from a different collection, so localization does not carry over\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n selectFields,\n tableName: newTableName,\n value,\n })\n\n break\n }\n\n case 'number':\n case 'text': {\n if (field.hasMany) {\n let tableType = 'texts'\n let columnName = 'text'\n if (field.type === 'number') {\n tableType = 'numbers'\n columnName = 'number'\n }\n newTableName = `${rootTableName}_${tableType}`\n\n const existingTable = joins.find((e) => e.queryPath === fieldStoragePath)\n\n const table = (existingTable?.table ??\n getTableAlias({ adapter, tableName: newTableName })\n .newAliasTable) as PgTableWithColumns<any>\n\n const joinConstraints = [\n eq(tableContainingField.id, table.parent),\n like(table.path, fieldStoragePath),\n ]\n\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [...joinConstraints]\n\n if (locale !== 'all') {\n conditions.push(eq(table._locale, locale))\n }\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n queryPath: fieldStoragePath,\n table,\n })\n } else {\n addJoinTable({\n condition: and(...joinConstraints),\n joins,\n queryPath: fieldStoragePath,\n table,\n })\n }\n\n return {\n columnName,\n constraints,\n field,\n table,\n }\n }\n break\n }\n case 'relationship':\n case 'upload': {\n const newCollectionPath = pathSegments.slice(1).join('.')\n\n if (Array.isArray(field.relationTo) || field.hasMany) {\n const relationshipPath = resolveRelationshipPath({\n adapter,\n fields,\n locale,\n parentIsLocalized,\n path: field.name,\n pathPrefix: constraintPath,\n })\n\n if (!relationshipPath) {\n throw new APIError(`Relationship path could not be resolved: ${collectionPath}`)\n }\n\n let relationshipFields: FlattenedField[]\n const relationTableName = `${rootTableName}${adapter.relationshipsSuffix}`\n\n const existingJoin = joins.find((e) => e.queryPath === `${constraintPath}.${field.name}`)\n\n let aliasRelationshipTable: PgTableWithColumns<any> | SQLiteTableWithColumns<any>\n let aliasRelationshipTableName: string\n if (existingJoin) {\n aliasRelationshipTable = existingJoin.table\n aliasRelationshipTableName = getTableName(existingJoin.table)\n } else {\n const res = getTableAlias({\n adapter,\n tableName: relationTableName,\n })\n aliasRelationshipTable = res.newAliasTable\n aliasRelationshipTableName = res.newAliasTableName\n }\n\n if (selectLocale && relationshipPath.isLocalized && adapter.payload.config.localization) {\n selectFields._locale = aliasRelationshipTable.locale\n }\n\n // Join in the relationships table\n if (\n relationshipPath.locale &&\n relationshipPath.locale !== 'all' &&\n relationshipPath.isLocalized &&\n adapter.payload.config.localization\n ) {\n const conditions = [\n eq(tableContainingField.id, aliasRelationshipTable.parent),\n like(aliasRelationshipTable.path, relationshipPath.path),\n ]\n\n conditions.push(eq(aliasRelationshipTable.locale, relationshipPath.locale))\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n queryPath: `${constraintPath}.${field.name}`,\n table: aliasRelationshipTable,\n })\n } else {\n // Join in the relationships table\n addJoinTable({\n condition: and(\n eq(tableContainingField.id, aliasRelationshipTable.parent),\n like(aliasRelationshipTable.path, relationshipPath.path),\n ),\n joins,\n queryPath: `${constraintPath}.${field.name}`,\n table: aliasRelationshipTable,\n })\n }\n\n selectFields[`${relationTableName}.path`] = aliasRelationshipTable.path\n\n let newAliasTable\n\n if (typeof field.relationTo === 'string') {\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n newTableName = adapter.tableNameMap.get(toSnakeCase(relationshipConfig.slug))\n\n // parent to relationship join table\n relationshipFields = relationshipConfig.flattenedFields\n ;({ newAliasTable } = getTableAlias({ adapter, tableName: newTableName }))\n\n joins.push({\n condition: eq(newAliasTable.id, aliasRelationshipTable[`${field.relationTo}ID`]),\n table: newAliasTable,\n })\n\n if (newCollectionPath === '' || newCollectionPath === 'id') {\n return {\n columnName: `${field.relationTo}ID`,\n constraints,\n field,\n table: aliasRelationshipTable,\n }\n }\n } else if (newCollectionPath === 'value') {\n const hasCustomCollectionWithCustomID = field.relationTo.some(\n (relationTo) => !!adapter.payload.collections[relationTo].customIDType,\n )\n\n const columns: TableColumn['columns'] = field.relationTo\n .map((relationTo) => {\n let idType: 'number' | 'text' | 'uuid' = isUUIDType(adapter.idType)\n ? 'uuid'\n : 'number'\n\n const { customIDType } = adapter.payload.collections[relationTo]\n\n if (customIDType) {\n idType = customIDType\n }\n\n const idTypeTextOrUuid = idType === 'text' || idType === 'uuid'\n\n // Do not add the column to OR if we know that it can't match by the type\n // We can't do the same with idType: 'number' because `value` can be from the REST search query params\n if (typeof value === 'number' && idTypeTextOrUuid) {\n return null\n }\n\n if (\n Array.isArray(value) &&\n value.every((val) => typeof val === 'number') &&\n idTypeTextOrUuid\n ) {\n return null\n }\n\n // Do not add the UUID type column if incoming query value doesn't match UUID. If there aren't any collections with\n // a custom ID type, we skip this check\n // We need this because Postgres throws an error if querying by UUID column with a value that isn't a valid UUID.\n if (\n value &&\n !Array.isArray(value) &&\n idType === 'uuid' &&\n hasCustomCollectionWithCustomID\n ) {\n if (!uuidValidate(value)) {\n return null\n }\n }\n\n if (\n Array.isArray(value) &&\n idType === 'uuid' &&\n hasCustomCollectionWithCustomID &&\n !value.some((val) => uuidValidate(val))\n ) {\n return null\n }\n\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n return {\n idType,\n rawColumn: sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`),\n }\n })\n .filter(Boolean)\n\n return {\n columns,\n constraints,\n field,\n table: aliasRelationshipTable,\n }\n } else if (newCollectionPath === 'relationTo') {\n const relationTo = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n\n return {\n constraints,\n field,\n getNotNullColumnByValue: (val) => {\n const matchedRelation = relationTo.find((relation) => relation === val)\n if (matchedRelation) {\n return `${matchedRelation}ID`\n }\n return undefined\n },\n table: aliasRelationshipTable,\n }\n } else if (isPolymorphicRelationship(value)) {\n const { relationTo } = value\n\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n return {\n constraints,\n field,\n rawColumn: sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`),\n table: aliasRelationshipTable,\n }\n } else if (value === DistinctSymbol) {\n const obj: Record<string, SQL> = {}\n\n field.relationTo.forEach((relationTo) => {\n const relationTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[relationTo].config.slug),\n )\n\n obj[relationTo] = sql.raw(`\"${aliasRelationshipTableName}\".\"${relationTableName}_id\"`)\n })\n\n let rawColumn = jsonBuildObject(adapter, obj)\n if (adapter.name === 'postgres') {\n rawColumn = sql`${rawColumn}::text`\n }\n\n return {\n constraints,\n field,\n rawColumn,\n table: aliasRelationshipTable,\n }\n } else {\n throw new APIError('Not supported')\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraints,\n fields: relationshipFields,\n joins,\n locale,\n // A relationship jumps to a different collection, so localization does not carry over\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n rootTableName: newTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n value,\n })\n } else if (\n pathSegments.length > 1 &&\n !(pathSegments.length === 2 && pathSegments[1] === 'id')\n ) {\n // simple relationships\n const columnName = `${columnPrefix}${field.name}`\n const newTableName = adapter.tableNameMap.get(\n toSnakeCase(adapter.payload.collections[field.relationTo].config.slug),\n )\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n\n if (isFieldLocalized && adapter.payload.config.localization) {\n const { newAliasTable: aliasLocaleTable } = getTableAlias({\n adapter,\n tableName: `${rootTableName}${adapter.localesSuffix}`,\n })\n\n const condtions = [eq(aliasLocaleTable._parentID, tableContainingField.id)]\n\n if (selectLocale) {\n selectFields._locale = aliasLocaleTable._locale\n }\n\n if (locale !== 'all') {\n condtions.push(eq(aliasLocaleTable._locale, locale))\n }\n\n const localesTable = adapter.tables[`${rootTableName}${adapter.localesSuffix}`]\n\n addJoinTable({\n condition: and(...condtions),\n joins,\n table: localesTable,\n })\n\n joins.push({\n condition: eq(localesTable[columnName], newAliasTable.id),\n table: newAliasTable,\n })\n } else {\n joins.push({\n condition: eq(\n newAliasTable.id,\n aliasTable ? aliasTable[columnName] : adapter.tables[tableName][columnName],\n ),\n table: newAliasTable,\n })\n }\n\n return getTableColumnFromPath({\n adapter,\n aliasTable: newAliasTable,\n collectionPath: newCollectionPath,\n constraintPath: '',\n constraints,\n fields: adapter.payload.collections[field.relationTo].config.flattenedFields,\n joins,\n locale,\n // A relationship jumps to a different collection, so localization does not carry over\n parentIsLocalized: false,\n pathSegments: pathSegments.slice(1),\n selectFields,\n tableName: newTableName,\n value,\n })\n }\n\n break\n }\n\n case 'select': {\n if (field.hasMany) {\n const newTableName = adapter.tableNameMap.get(\n `${tableName}_${tableNameSuffix}${toSnakeCase(field.name)}`,\n )\n\n const idColumn = (aliasTable ?? adapter.tables[tableName]).id\n if (locale && isFieldLocalized && adapter.payload.config.localization) {\n const conditions = [\n eq(idColumn, adapter.tables[newTableName].parent),\n eq(adapter.tables[newTableName]._locale, locale),\n ]\n\n if (locale !== 'all') {\n conditions.push(eq(adapter.tables[newTableName]._locale, locale))\n }\n\n addJoinTable({\n condition: and(...conditions),\n joins,\n table: adapter.tables[newTableName],\n })\n } else {\n addJoinTable({\n condition: eq(idColumn, adapter.tables[newTableName].parent),\n joins,\n table: adapter.tables[newTableName],\n })\n }\n\n return {\n columnName: 'value',\n constraints,\n field,\n table: adapter.tables[newTableName],\n }\n }\n break\n }\n\n case 'tab': {\n if (tabHasName(field)) {\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix: `${columnPrefix}${field.name}_`,\n constraintPath: `${fieldStoragePath}.`,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix: `${tableNameSuffix}${toSnakeCase(field.name)}_`,\n value,\n })\n }\n return getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath,\n columnPrefix,\n constraintPath,\n constraints,\n fields: field.flattenedFields,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n pathSegments: pathSegments.slice(1),\n rootTableName,\n selectFields,\n selectLocale,\n tableName: newTableName,\n tableNameSuffix,\n value,\n })\n }\n\n default: {\n // fall through\n break\n }\n }\n\n let newTable = adapter.tables[newTableName]\n\n if (isFieldLocalized && adapter.payload.config.localization) {\n // If localized, we go to localized table and set aliasTable to undefined\n // so it is not picked up below to be used as targetTable\n const parentTable = aliasTable || adapter.tables[tableName]\n newTableName = `${tableName}${adapter.localesSuffix}`\n\n // use an alias because the same query may contain constraints with different locale value\n if (localizedPathQuery) {\n const { newAliasTable } = getTableAlias({ adapter, tableName: newTableName })\n newTable = newAliasTable\n } else {\n newTable = adapter.tables[newTableName]\n }\n\n let condition = eq(parentTable.id, newTable._parentID)\n\n if (locale !== 'all') {\n condition = and(condition, eq(newTable._locale, locale))\n }\n\n if (selectLocale) {\n selectFields._locale = newTable._locale\n }\n\n addJoinTable({\n condition,\n joins,\n table: newTable,\n })\n\n aliasTable = undefined\n }\n\n const targetTable = aliasTable || newTable\n\n selectFields[`${newTableName}.${columnPrefix}${field.name}`] =\n targetTable[`${columnPrefix}${field.name}`]\n\n return {\n columnName: `${columnPrefix}${field.name}`,\n constraints,\n field,\n pathSegments,\n table: targetTable,\n }\n }\n\n throw new APIError(`Cannot find field for path at ${fieldPath}`)\n}\n"],"names":["and","eq","getTableName","like","sql","APIError","getFieldByPath","fieldShouldBeLocalized","tabHasName","toSnakeCase","validate","uuidValidate","isPolymorphicRelationship","isUUIDType","jsonBuildObject","DistinctSymbol","resolveBlockTableName","addJoinTable","getTableAlias","appendFieldToStoragePath","resolveRelationshipPath","getTableColumnFromPath","adapter","aliasTable","collectionPath","columnPrefix","constraintPath","incomingConstraintPath","constraints","fields","joins","locale","incomingLocale","parentAliasTable","parentIsLocalized","pathSegments","incomingSegments","rootTableName","incomingRootTableName","selectFields","selectLocale","tableName","tableNameSuffix","value","fieldPath","tableContainingField","tables","field","find","fieldToFind","name","newTableName","id","columnName","type","idType","table","localizedPathQuery","fieldStoragePath","path","isFieldLocalized","payload","config","localization","matchedLocale","localeCodes","splice","tableNameMap","get","arrayParentTable","conditions","_parentID","_locale","push","condition","isOneToMany","flattenedFields","localized","slice","blocksAsJSON","blockTableColumn","blockTypes","Array","isArray","forEach","blockType","block","blocks","slug","newAliasTable","getNotNullColumnByValue","hasBlockField","some","_block","result","blockConstraints","blockSelectFields","blockJoin","newJoins","_","concat","previousLength","length","i","rawColumn","localesSuffix","collection","newCollectionPath","join","hasMany","relationTableName","relationshipsSuffix","existingTable","e","queryPath","aliasRelationshipTable","relationshipField","collections","on","relationTo","relationshipConfig","relationshipTableName","relationshipFields","existingMainTable","relationshipTable","parent","onSegments","split","collectionFlattenedFields","firstSegField","f","arrayTableName","undefined","arrayAliasTable","replaceAll","tableType","joinConstraints","relationshipPath","pathPrefix","existingJoin","aliasRelationshipTableName","res","newAliasTableName","isLocalized","hasCustomCollectionWithCustomID","customIDType","columns","map","idTypeTextOrUuid","every","val","raw","filter","Boolean","matchedRelation","relation","obj","aliasLocaleTable","condtions","localesTable","idColumn","newTable","parentTable","targetTable"],"mappings":"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"}
|