@payloadcms/drizzle 4.0.0-internal.314c594 → 4.0.0-internal.31ba7ee
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/find/buildPolymorphicJoinQuery.d.ts +38 -0
- package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinQuery.js +135 -0
- package/dist/find/buildPolymorphicJoinQuery.js.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts +20 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.js +301 -0
- package/dist/find/buildPolymorphicJoinWhere.js.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts +37 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.js +191 -0
- package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -0
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +19 -191
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +41 -15
- package/dist/migrate.js.map +1 -1
- package/dist/migrateDown.d.ts +2 -1
- package/dist/migrateDown.d.ts.map +1 -1
- package/dist/migrateDown.js +17 -4
- package/dist/migrateDown.js.map +1 -1
- package/dist/migrateFresh.d.ts +4 -2
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +26 -9
- package/dist/migrateFresh.js.map +1 -1
- package/dist/migrateRefresh.d.ts +2 -1
- package/dist/migrateRefresh.d.ts.map +1 -1
- package/dist/migrateRefresh.js +20 -5
- package/dist/migrateRefresh.js.map +1 -1
- package/dist/migrateReset.d.ts +2 -1
- package/dist/migrateReset.d.ts.map +1 -1
- package/dist/migrateReset.js +18 -4
- package/dist/migrateReset.js.map +1 -1
- package/dist/migrateStatus.d.ts +2 -1
- package/dist/migrateStatus.d.ts.map +1 -1
- package/dist/migrateStatus.js +11 -6
- package/dist/migrateStatus.js.map +1 -1
- package/dist/postgres/createJSONQuery/index.js +3 -3
- package/dist/postgres/createJSONQuery/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +9 -0
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +59 -2
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js +3 -2
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
- package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
- package/dist/sqlite/createJSONQuery/index.js +6 -5
- package/dist/sqlite/createJSONQuery/index.js.map +1 -1
- package/dist/sqlite/insert.d.ts.map +1 -1
- package/dist/sqlite/insert.js +4 -1
- package/dist/sqlite/insert.js.map +1 -1
- package/dist/transform/write/traverseFields.d.ts.map +1 -1
- package/dist/transform/write/traverseFields.js +8 -14
- package/dist/transform/write/traverseFields.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +41 -1
- package/dist/updateOne.js.map +1 -1
- package/dist/upsertRow/index.d.ts +1 -1
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +25 -5
- package/dist/upsertRow/index.js.map +1 -1
- package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
- package/dist/utilities/buildCreateMigration.js +12 -8
- package/dist/utilities/buildCreateMigration.js.map +1 -1
- package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
- package/dist/utilities/createSchemaGenerator.js +3 -0
- package/dist/utilities/createSchemaGenerator.js.map +1 -1
- package/dist/utilities/parseJSONPathSegment.d.ts +9 -0
- package/dist/utilities/parseJSONPathSegment.d.ts.map +1 -0
- package/dist/utilities/parseJSONPathSegment.js +17 -0
- package/dist/utilities/parseJSONPathSegment.js.map +1 -0
- package/package.json +3 -3
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js +0 -91
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js.map +0 -1
- package/dist/postgres/query/postgresUnaccent.spec.js +0 -71
- package/dist/postgres/query/postgresUnaccent.spec.js.map +0 -1
- package/dist/queries/buildOperatorConstraint.spec.js +0 -348
- package/dist/queries/buildOperatorConstraint.spec.js.map +0 -1
- package/dist/queries/validateOperatorHandlers.spec.js +0 -142
- package/dist/queries/validateOperatorHandlers.spec.js.map +0 -1
- package/dist/schema/buildRawSchema.spec.js +0 -290
- package/dist/schema/buildRawSchema.spec.js.map +0 -1
- package/dist/upsertRow/handleUpsertError.spec.js +0 -42
- package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
- package/dist/utilities/checkTruncatedIdentifiers.spec.js +0 -301
- package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +0 -1
- package/dist/utilities/isValidStringID.spec.js +0 -15
- package/dist/utilities/isValidStringID.spec.js.map +0 -1
- package/dist/utilities/validateIdentifierLength.spec.js +0 -19
- package/dist/utilities/validateIdentifierLength.spec.js.map +0 -1
|
@@ -269,6 +269,15 @@ import { appendFieldToStoragePath, resolveRelationshipPath } from './resolveRela
|
|
|
269
269
|
throw new APIError('Not supported');
|
|
270
270
|
}
|
|
271
271
|
const newCollectionPath = pathSegments.slice(1).join('.');
|
|
272
|
+
// Filtering through a polymorphic `on` relationship is not supported: it is stored in the
|
|
273
|
+
// `_rels` table with no direct column to correlate on, which would otherwise build invalid SQL.
|
|
274
|
+
const onRelationshipField = getFieldByPath({
|
|
275
|
+
fields: adapter.payload.collections[field.collection].config.flattenedFields,
|
|
276
|
+
path: field.on
|
|
277
|
+
})?.field;
|
|
278
|
+
if (onRelationshipField && (onRelationshipField.type === 'relationship' || onRelationshipField.type === 'upload') && Array.isArray(onRelationshipField.relationTo)) {
|
|
279
|
+
throw new APIError('Not supported');
|
|
280
|
+
}
|
|
272
281
|
if (field.hasMany) {
|
|
273
282
|
const relationTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`;
|
|
274
283
|
const existingTable = joins.find((e)=>e.queryPath === `${constraintPath}${field.name}._rels`);
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 // Filtering through a polymorphic `on` relationship is not supported: it is stored in the\n // `_rels` table with no direct column to correlate on, which would otherwise build invalid SQL.\n const onRelationshipField = getFieldByPath({\n fields: adapter.payload.collections[field.collection].config.flattenedFields,\n path: field.on,\n })?.field\n\n if (\n onRelationshipField &&\n (onRelationshipField.type === 'relationship' || onRelationshipField.type === 'upload') &&\n Array.isArray(onRelationshipField.relationTo)\n ) {\n throw new APIError('Not supported')\n }\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","onRelationshipField","collections","on","relationTo","hasMany","relationTableName","relationshipsSuffix","existingTable","e","queryPath","aliasRelationshipTable","relationshipField","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAyC,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAyBjG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAc5D,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AAExD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,KAAK,EAAE,qBAAqB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,KAAK,GACN,EAAE,IAAI,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAyC,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAyBjG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAc5D,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AAExD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,OAAO,EAAE,YAAY,CAAA;IACrB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,KAAK,EAAE,qBAAqB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,KAAK,GACN,EAAE,IAAI,GAAG,GAAG,CA+iBZ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { aliasedTable, and, eq, exists, getTableName, isNotNull, isNull, like, notExists, notInArray, or, sql } from 'drizzle-orm';
|
|
2
2
|
import { PgUUID } from 'drizzle-orm/pg-core';
|
|
3
|
-
import { APIError, QueryError } from 'payload';
|
|
3
|
+
import { APIError, getFieldByPath, QueryError } from 'payload';
|
|
4
4
|
import { hasManyRelationshipOperatorSet, isNestedRelationshipQuery, validOperatorSet } from 'payload/shared';
|
|
5
5
|
import toSnakeCase from 'to-snake-case';
|
|
6
6
|
import { escapeSQLValue } from '../utilities/escapeSQLValue.js';
|
|
@@ -76,6 +76,34 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
76
76
|
}));
|
|
77
77
|
continue;
|
|
78
78
|
}
|
|
79
|
+
// A join points to many related documents. Expanding the nested query into
|
|
80
|
+
// prefixed dot-paths reuses the join's shared table alias, so every condition is
|
|
81
|
+
// evaluated against the same joined row (same-document `contains` semantics).
|
|
82
|
+
if (operator === 'contains' && !relationshipPath) {
|
|
83
|
+
const joinField = getFieldByPath({
|
|
84
|
+
fields,
|
|
85
|
+
path: relationOrPath.replace(/__/g, '.')
|
|
86
|
+
})?.field;
|
|
87
|
+
if (joinField?.type === 'join') {
|
|
88
|
+
constraints.push(parseParams({
|
|
89
|
+
adapter,
|
|
90
|
+
aliasTable,
|
|
91
|
+
context,
|
|
92
|
+
fields,
|
|
93
|
+
joins,
|
|
94
|
+
locale,
|
|
95
|
+
parentIsLocalized,
|
|
96
|
+
selectFields,
|
|
97
|
+
selectLocale,
|
|
98
|
+
tableName,
|
|
99
|
+
where: prefixJoinContainsWhere({
|
|
100
|
+
prefix: relationOrPath,
|
|
101
|
+
where: val
|
|
102
|
+
})
|
|
103
|
+
}));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
79
107
|
}
|
|
80
108
|
const { columnName, columns, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = getTableColumnFromPath({
|
|
81
109
|
adapter,
|
|
@@ -177,7 +205,10 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
177
205
|
'in',
|
|
178
206
|
'not_in'
|
|
179
207
|
].includes(operator) && Array.isArray(val)) {
|
|
180
|
-
formattedValue = `(${val.map((v)
|
|
208
|
+
formattedValue = `(${val.map((v)=>{
|
|
209
|
+
const escaped = escapeSQLValue(v);
|
|
210
|
+
return typeof v === 'string' ? `'${escaped}'` : String(escaped);
|
|
211
|
+
}).join(',')})`;
|
|
181
212
|
} else {
|
|
182
213
|
formattedValue = `'${operatorKeys[operator].wildcard}${escapeSQLValue(val)}${operatorKeys[operator].wildcard}'`;
|
|
183
214
|
}
|
|
@@ -425,6 +456,32 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
425
456
|
}
|
|
426
457
|
return result;
|
|
427
458
|
}
|
|
459
|
+
/**
|
|
460
|
+
* Prefixes every field path in a join's nested `contains` query with the join field's path, so the
|
|
461
|
+
* query can be resolved through the join's shared table alias.
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```ts
|
|
465
|
+
* prefixJoinContainsWhere({ prefix: 'comments', where: { and: [{ text: { equals: 'hi' } }] } })
|
|
466
|
+
* // => { and: [{ 'comments.text': { equals: 'hi' } }] }
|
|
467
|
+
* ```
|
|
468
|
+
*/ function prefixJoinContainsWhere({ prefix, where }) {
|
|
469
|
+
const prefixedWhere = {};
|
|
470
|
+
for (const [key, value] of Object.entries(where)){
|
|
471
|
+
if ([
|
|
472
|
+
'and',
|
|
473
|
+
'or'
|
|
474
|
+
].includes(key.toLowerCase()) && Array.isArray(value)) {
|
|
475
|
+
prefixedWhere[key] = value.map((nestedWhere)=>prefixJoinContainsWhere({
|
|
476
|
+
prefix,
|
|
477
|
+
where: nestedWhere
|
|
478
|
+
}));
|
|
479
|
+
} else {
|
|
480
|
+
prefixedWhere[`${prefix}.${key}`] = value;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return prefixedWhere;
|
|
484
|
+
}
|
|
428
485
|
/**
|
|
429
486
|
* Builds a SQL condition for an operator containing a nested has-many relationship query.
|
|
430
487
|
*
|