@payloadcms/drizzle 3.91.0 → 3.92.1
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 +4 -2
- package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -1
- package/dist/find/buildPolymorphicJoinQuery.js +16 -5
- package/dist/find/buildPolymorphicJoinQuery.js.map +1 -1
- package/dist/find/buildPolymorphicJoinQuery.spec.js +165 -2
- package/dist/find/buildPolymorphicJoinQuery.spec.js.map +1 -1
- package/dist/find/buildPolymorphicJoinWhere.js +6 -1
- package/dist/find/buildPolymorphicJoinWhere.js.map +1 -1
- package/dist/find/createPolymorphicJoinWherePlan.d.ts +2 -1
- package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -1
- package/dist/find/createPolymorphicJoinWherePlan.js +14 -5
- package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -1
- package/dist/find/createPolymorphicJoinWherePlan.spec.js +76 -1
- package/dist/find/createPolymorphicJoinWherePlan.spec.js.map +1 -1
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +2 -0
- package/dist/find/traverseFields.js.map +1 -1
- package/package.json +4 -4
|
@@ -8,7 +8,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
8
8
|
* whether the path uses a scalar column or a has-many select value table. A field may be absent
|
|
9
9
|
* from some target collections; those branches compare against SQL NULL or an empty JSON array.
|
|
10
10
|
*
|
|
11
|
-
* Paths are marked as invalid when their storage shapes conflict, require
|
|
11
|
+
* Paths are marked as invalid when their storage shapes conflict, require separate-row
|
|
12
12
|
* traversal, have no matching field, lack a required column, or collide after path flattening.
|
|
13
13
|
*
|
|
14
14
|
* @returns A plan keyed by each unique schema path in `where`.
|
|
@@ -27,7 +27,8 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
27
27
|
return {
|
|
28
28
|
collection,
|
|
29
29
|
collectionConfig,
|
|
30
|
-
table
|
|
30
|
+
table,
|
|
31
|
+
tableName
|
|
31
32
|
};
|
|
32
33
|
});
|
|
33
34
|
const schemaPathsByColumnPath = new Map();
|
|
@@ -46,7 +47,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
46
47
|
let hasManySelect = false;
|
|
47
48
|
let hasUnsupportedFieldShape = false;
|
|
48
49
|
const scalarQueryValueSignatures = new Set();
|
|
49
|
-
for (const { collection, collectionConfig, table } of collectionContexts){
|
|
50
|
+
for (const { collection, collectionConfig, table, tableName } of collectionContexts){
|
|
50
51
|
const fieldAtPath = getFieldByPath({
|
|
51
52
|
fields: collectionConfig.flattenedFields,
|
|
52
53
|
path: schemaPath
|
|
@@ -78,7 +79,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
78
79
|
continue;
|
|
79
80
|
}
|
|
80
81
|
isFieldPresent = true;
|
|
81
|
-
if (
|
|
82
|
+
if (pathHasSeparateRows({
|
|
82
83
|
fields: collectionConfig.flattenedFields,
|
|
83
84
|
path: schemaPath
|
|
84
85
|
})) {
|
|
@@ -86,6 +87,10 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
86
87
|
continue;
|
|
87
88
|
}
|
|
88
89
|
if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {
|
|
90
|
+
if (fieldAtPath.pathHasLocalized) {
|
|
91
|
+
hasUnsupportedFieldShape = true;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
89
94
|
hasManySelect = true;
|
|
90
95
|
fieldsByCollection.set(collection, {
|
|
91
96
|
type: 'hasManySelect',
|
|
@@ -93,7 +98,8 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
93
98
|
});
|
|
94
99
|
continue;
|
|
95
100
|
}
|
|
96
|
-
const
|
|
101
|
+
const fieldTable = fieldAtPath.pathHasLocalized ? adapter.tables[`${tableName}${adapter.localesSuffix}`] : table;
|
|
102
|
+
const fieldColumn = fieldTable?.[columnPath];
|
|
97
103
|
if (!fieldColumn) {
|
|
98
104
|
hasUnsupportedFieldShape = true;
|
|
99
105
|
continue;
|
|
@@ -101,6 +107,9 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
|
|
|
101
107
|
fieldsByCollection.set(collection, {
|
|
102
108
|
type: 'scalar',
|
|
103
109
|
field: fieldAtPath.field,
|
|
110
|
+
...fieldAtPath.pathHasLocalized && {
|
|
111
|
+
isLocalized: true
|
|
112
|
+
},
|
|
104
113
|
isUUID: fieldColumn.columnType === 'PgUUID'
|
|
105
114
|
});
|
|
106
115
|
scalarQueryValueSignatures.add(getScalarQueryValueSignature({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"sourcesContent":["import type { Column } from 'drizzle-orm'\n\nimport { type FlattenedField, getFieldByPath, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { sanitizePathSegment } from '../utilities/sanitizePathSegment.js'\n\nexport type ScalarWhereField = {\n field: FlattenedField\n isUUID: boolean\n type: 'scalar'\n}\n\ntype CollectionWhereField = { field: FlattenedField; type: 'hasManySelect' } | ScalarWhereField\n\nexport type WherePathPlan = {\n columnPath: string\n fieldsByCollection: Map<string, CollectionWhereField>\n schemaPath: string\n type: 'hasManySelect' | 'invalid' | 'scalar'\n}\n\nexport type PolymorphicJoinWherePlan = Map<string, WherePathPlan>\n\n/**\n * Analyzes every leaf path in a polymorphic join where clause before SQL is built. Each plan entry\n * records the flattened column path, the compatible field shape for each target collection, and\n * whether the path uses a scalar column or a has-many select value table. A field may be absent\n * from some target collections; those branches compare against SQL NULL or an empty JSON array.\n *\n * Paths are marked as invalid when their storage shapes conflict, require localized or separate-row\n * traversal, have no matching field, lack a required column, or collide after path flattening.\n *\n * @returns A plan keyed by each unique schema path in `where`.\n * @throws If a target collection or its mapped database table is not available in the adapter.\n */\nexport const createPolymorphicJoinWherePlan = ({\n adapter,\n collections,\n where,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n where: Where\n}): PolymorphicJoinWherePlan => {\n const collectionContexts = collections.map((collection) => {\n const collectionConfig = adapter.payload.collections[collection]?.config\n\n if (!collectionConfig) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n return { collection, collectionConfig, table }\n })\n const schemaPathsByColumnPath = new Map<string, Set<string>>()\n const schemaPaths = new Set(getWhereSchemaPaths(where))\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const paths = schemaPathsByColumnPath.get(columnPath) ?? new Set<string>()\n\n paths.add(schemaPath)\n schemaPathsByColumnPath.set(columnPath, paths)\n }\n\n const plan: PolymorphicJoinWherePlan = new Map()\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const fieldsByCollection = new Map<string, CollectionWhereField>()\n let isFieldPresent = schemaPath === 'id' || schemaPath === 'relationTo'\n let hasManySelect = false\n let hasUnsupportedFieldShape = false\n const scalarQueryValueSignatures = new Set<string>()\n\n for (const { collection, collectionConfig, table } of collectionContexts) {\n const fieldAtPath = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n\n if (schemaPath === 'id') {\n const idColumn = table['id'] as Column | undefined\n\n if (!idColumn) {\n hasUnsupportedFieldShape = true\n } else {\n scalarQueryValueSignatures.add(`id:${idColumn.getSQLType()}`)\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field:\n fieldAtPath?.field ??\n ({\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as FlattenedField),\n isUUID: !fieldAtPath && isUUIDType(adapter.idType),\n })\n }\n\n continue\n }\n\n if (!fieldAtPath) {\n if (\n pathHasUnsupportedNestedContainer({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n ) {\n hasUnsupportedFieldShape = true\n }\n\n continue\n }\n\n isFieldPresent = true\n\n if (\n fieldAtPath.pathHasLocalized ||\n pathHasSeparateRows({ fields: collectionConfig.flattenedFields, path: schemaPath })\n ) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {\n hasManySelect = true\n fieldsByCollection.set(collection, {\n type: 'hasManySelect',\n field: fieldAtPath.field,\n })\n continue\n }\n\n const fieldColumn = table[columnPath] as Column | undefined\n\n if (!fieldColumn) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field: fieldAtPath.field,\n isUUID: fieldColumn.columnType === 'PgUUID',\n })\n scalarQueryValueSignatures.add(\n getScalarQueryValueSignature({ column: fieldColumn, field: fieldAtPath.field }),\n )\n }\n\n const hasColumnPathCollision = (schemaPathsByColumnPath.get(columnPath)?.size ?? 0) > 1\n const isInvalid =\n hasColumnPathCollision ||\n !isFieldPresent ||\n hasUnsupportedFieldShape ||\n (hasManySelect && scalarQueryValueSignatures.size > 0) ||\n scalarQueryValueSignatures.size > 1\n\n plan.set(schemaPath, {\n type: isInvalid ? 'invalid' : hasManySelect ? 'hasManySelect' : 'scalar',\n columnPath,\n fieldsByCollection,\n schemaPath,\n })\n }\n\n return plan\n}\n\nconst textQueryFieldTypes = new Set<FlattenedField['type']>(['code', 'email', 'text', 'textarea'])\n\nconst getScalarQueryValueSignature = ({\n column,\n field,\n}: {\n column: Column\n field: FlattenedField\n}): string => {\n if (field.type === 'radio' || field.type === 'select') {\n const optionValues = field.options.map((option) =>\n typeof option === 'object' ? option.value : option,\n )\n\n return `${field.type}:${JSON.stringify(optionValues)}`\n }\n\n if (textQueryFieldTypes.has(field.type)) {\n return 'text'\n }\n\n return `${field.type}:${column.getSQLType()}`\n}\n\nconst getWhereSchemaPaths = (where: Where): string[] => {\n const paths: string[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (Array.isArray(where[key])) {\n for (const nestedWhere of where[key]) {\n paths.push(...getWhereSchemaPaths(nestedWhere))\n }\n }\n } else {\n paths.push(key)\n }\n }\n\n return paths\n}\n\nconst getColumnPath = (schemaPath: string): string =>\n schemaPath\n .split('.')\n .map((segment) => sanitizePathSegment(segment))\n .join('_')\n\nconst pathHasSeparateRows = ({ fields, path }: { fields: FlattenedField[]; path: string }) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (fieldAtParentPath?.field.type === 'array' || fieldAtParentPath?.field.type === 'blocks') {\n return true\n }\n }\n\n return false\n}\n\nconst pathHasUnsupportedNestedContainer = ({\n fields,\n path,\n}: {\n fields: FlattenedField[]\n path: string\n}) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (!fieldAtParentPath) {\n return false\n }\n\n if (!['group', 'tab'].includes(fieldAtParentPath.field.type)) {\n return true\n }\n }\n\n return false\n}\n"],"names":["getFieldByPath","toSnakeCase","isUUIDType","sanitizePathSegment","createPolymorphicJoinWherePlan","adapter","collections","where","collectionContexts","map","collection","collectionConfig","payload","config","Error","tableName","tableNameMap","get","table","tables","undefined","schemaPathsByColumnPath","Map","schemaPaths","Set","getWhereSchemaPaths","schemaPath","columnPath","getColumnPath","paths","add","set","plan","fieldsByCollection","isFieldPresent","hasManySelect","hasUnsupportedFieldShape","scalarQueryValueSignatures","fieldAtPath","fields","flattenedFields","path","idColumn","getSQLType","type","field","name","idType","isUUID","pathHasUnsupportedNestedContainer","pathHasLocalized","pathHasSeparateRows","hasMany","fieldColumn","columnType","getScalarQueryValueSignature","column","hasColumnPathCollision","size","isInvalid","textQueryFieldTypes","optionValues","options","option","value","JSON","stringify","has","key","includes","toUpperCase","Array","isArray","nestedWhere","push","split","segment","join","pathSegments","segmentIndex","length","fieldAtParentPath","slice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"sourcesContent":["import type { Column } from 'drizzle-orm'\n\nimport { type FlattenedField, getFieldByPath, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { sanitizePathSegment } from '../utilities/sanitizePathSegment.js'\n\nexport type ScalarWhereField = {\n field: FlattenedField\n isLocalized?: boolean\n isUUID: boolean\n type: 'scalar'\n}\n\ntype CollectionWhereField = { field: FlattenedField; type: 'hasManySelect' } | ScalarWhereField\n\nexport type WherePathPlan = {\n columnPath: string\n fieldsByCollection: Map<string, CollectionWhereField>\n schemaPath: string\n type: 'hasManySelect' | 'invalid' | 'scalar'\n}\n\nexport type PolymorphicJoinWherePlan = Map<string, WherePathPlan>\n\n/**\n * Analyzes every leaf path in a polymorphic join where clause before SQL is built. Each plan entry\n * records the flattened column path, the compatible field shape for each target collection, and\n * whether the path uses a scalar column or a has-many select value table. A field may be absent\n * from some target collections; those branches compare against SQL NULL or an empty JSON array.\n *\n * Paths are marked as invalid when their storage shapes conflict, require separate-row\n * traversal, have no matching field, lack a required column, or collide after path flattening.\n *\n * @returns A plan keyed by each unique schema path in `where`.\n * @throws If a target collection or its mapped database table is not available in the adapter.\n */\nexport const createPolymorphicJoinWherePlan = ({\n adapter,\n collections,\n where,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n where: Where\n}): PolymorphicJoinWherePlan => {\n const collectionContexts = collections.map((collection) => {\n const collectionConfig = adapter.payload.collections[collection]?.config\n\n if (!collectionConfig) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n return { collection, collectionConfig, table, tableName }\n })\n const schemaPathsByColumnPath = new Map<string, Set<string>>()\n const schemaPaths = new Set(getWhereSchemaPaths(where))\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const paths = schemaPathsByColumnPath.get(columnPath) ?? new Set<string>()\n\n paths.add(schemaPath)\n schemaPathsByColumnPath.set(columnPath, paths)\n }\n\n const plan: PolymorphicJoinWherePlan = new Map()\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const fieldsByCollection = new Map<string, CollectionWhereField>()\n let isFieldPresent = schemaPath === 'id' || schemaPath === 'relationTo'\n let hasManySelect = false\n let hasUnsupportedFieldShape = false\n const scalarQueryValueSignatures = new Set<string>()\n\n for (const { collection, collectionConfig, table, tableName } of collectionContexts) {\n const fieldAtPath = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n\n if (schemaPath === 'id') {\n const idColumn = table['id'] as Column | undefined\n\n if (!idColumn) {\n hasUnsupportedFieldShape = true\n } else {\n scalarQueryValueSignatures.add(`id:${idColumn.getSQLType()}`)\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field:\n fieldAtPath?.field ??\n ({\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as FlattenedField),\n isUUID: !fieldAtPath && isUUIDType(adapter.idType),\n })\n }\n\n continue\n }\n\n if (!fieldAtPath) {\n if (\n pathHasUnsupportedNestedContainer({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n ) {\n hasUnsupportedFieldShape = true\n }\n\n continue\n }\n\n isFieldPresent = true\n\n if (pathHasSeparateRows({ fields: collectionConfig.flattenedFields, path: schemaPath })) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {\n if (fieldAtPath.pathHasLocalized) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n hasManySelect = true\n fieldsByCollection.set(collection, {\n type: 'hasManySelect',\n field: fieldAtPath.field,\n })\n continue\n }\n\n const fieldTable = fieldAtPath.pathHasLocalized\n ? adapter.tables[`${tableName}${adapter.localesSuffix}`]\n : table\n const fieldColumn = fieldTable?.[columnPath] as Column | undefined\n\n if (!fieldColumn) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field: fieldAtPath.field,\n ...(fieldAtPath.pathHasLocalized && { isLocalized: true }),\n isUUID: fieldColumn.columnType === 'PgUUID',\n })\n scalarQueryValueSignatures.add(\n getScalarQueryValueSignature({ column: fieldColumn, field: fieldAtPath.field }),\n )\n }\n\n const hasColumnPathCollision = (schemaPathsByColumnPath.get(columnPath)?.size ?? 0) > 1\n const isInvalid =\n hasColumnPathCollision ||\n !isFieldPresent ||\n hasUnsupportedFieldShape ||\n (hasManySelect && scalarQueryValueSignatures.size > 0) ||\n scalarQueryValueSignatures.size > 1\n\n plan.set(schemaPath, {\n type: isInvalid ? 'invalid' : hasManySelect ? 'hasManySelect' : 'scalar',\n columnPath,\n fieldsByCollection,\n schemaPath,\n })\n }\n\n return plan\n}\n\nconst textQueryFieldTypes = new Set<FlattenedField['type']>(['code', 'email', 'text', 'textarea'])\n\nconst getScalarQueryValueSignature = ({\n column,\n field,\n}: {\n column: Column\n field: FlattenedField\n}): string => {\n if (field.type === 'radio' || field.type === 'select') {\n const optionValues = field.options.map((option) =>\n typeof option === 'object' ? option.value : option,\n )\n\n return `${field.type}:${JSON.stringify(optionValues)}`\n }\n\n if (textQueryFieldTypes.has(field.type)) {\n return 'text'\n }\n\n return `${field.type}:${column.getSQLType()}`\n}\n\nconst getWhereSchemaPaths = (where: Where): string[] => {\n const paths: string[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (Array.isArray(where[key])) {\n for (const nestedWhere of where[key]) {\n paths.push(...getWhereSchemaPaths(nestedWhere))\n }\n }\n } else {\n paths.push(key)\n }\n }\n\n return paths\n}\n\nconst getColumnPath = (schemaPath: string): string =>\n schemaPath\n .split('.')\n .map((segment) => sanitizePathSegment(segment))\n .join('_')\n\nconst pathHasSeparateRows = ({ fields, path }: { fields: FlattenedField[]; path: string }) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (fieldAtParentPath?.field.type === 'array' || fieldAtParentPath?.field.type === 'blocks') {\n return true\n }\n }\n\n return false\n}\n\nconst pathHasUnsupportedNestedContainer = ({\n fields,\n path,\n}: {\n fields: FlattenedField[]\n path: string\n}) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (!fieldAtParentPath) {\n return false\n }\n\n if (!['group', 'tab'].includes(fieldAtParentPath.field.type)) {\n return true\n }\n }\n\n return false\n}\n"],"names":["getFieldByPath","toSnakeCase","isUUIDType","sanitizePathSegment","createPolymorphicJoinWherePlan","adapter","collections","where","collectionContexts","map","collection","collectionConfig","payload","config","Error","tableName","tableNameMap","get","table","tables","undefined","schemaPathsByColumnPath","Map","schemaPaths","Set","getWhereSchemaPaths","schemaPath","columnPath","getColumnPath","paths","add","set","plan","fieldsByCollection","isFieldPresent","hasManySelect","hasUnsupportedFieldShape","scalarQueryValueSignatures","fieldAtPath","fields","flattenedFields","path","idColumn","getSQLType","type","field","name","idType","isUUID","pathHasUnsupportedNestedContainer","pathHasSeparateRows","hasMany","pathHasLocalized","fieldTable","localesSuffix","fieldColumn","isLocalized","columnType","getScalarQueryValueSignature","column","hasColumnPathCollision","size","isInvalid","textQueryFieldTypes","optionValues","options","option","value","JSON","stringify","has","key","includes","toUpperCase","Array","isArray","nestedWhere","push","split","segment","join","pathSegments","segmentIndex","length","fieldAtParentPath","slice"],"mappings":"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"}
|
|
@@ -363,6 +363,81 @@ const createPlan = (where, collections = [
|
|
|
363
363
|
where
|
|
364
364
|
});
|
|
365
365
|
describe('createPolymorphicJoinWherePlan', ()=>{
|
|
366
|
+
it('should resolve scalar fields stored in a localized group through the locale table', ()=>{
|
|
367
|
+
const localizedAdapter = createAdapter({
|
|
368
|
+
articles: {
|
|
369
|
+
fields: [
|
|
370
|
+
{
|
|
371
|
+
name: 'details',
|
|
372
|
+
type: 'group',
|
|
373
|
+
localized: true,
|
|
374
|
+
fields: [
|
|
375
|
+
{
|
|
376
|
+
name: 'status',
|
|
377
|
+
type: 'text'
|
|
378
|
+
}
|
|
379
|
+
]
|
|
380
|
+
}
|
|
381
|
+
],
|
|
382
|
+
table: articlesTable
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
localizedAdapter.localesSuffix = '_locales';
|
|
386
|
+
localizedAdapter.tables.join_articles_locales = sqliteTable('join_articles_locales', {
|
|
387
|
+
details_status: text('details_status')
|
|
388
|
+
});
|
|
389
|
+
const plan = createPolymorphicJoinWherePlan({
|
|
390
|
+
adapter: localizedAdapter,
|
|
391
|
+
collections: [
|
|
392
|
+
'articles'
|
|
393
|
+
],
|
|
394
|
+
where: {
|
|
395
|
+
'details.status': {
|
|
396
|
+
equals: 'published'
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
expect(plan.get('details.status')).toMatchObject({
|
|
401
|
+
columnPath: 'details_status',
|
|
402
|
+
type: 'scalar'
|
|
403
|
+
});
|
|
404
|
+
expect(plan.get('details.status')?.fieldsByCollection.get('articles')).toMatchObject({
|
|
405
|
+
type: 'scalar',
|
|
406
|
+
isLocalized: true
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
it('should continue rejecting localized has-many selects', ()=>{
|
|
410
|
+
const localizedAdapter = createAdapter({
|
|
411
|
+
articles: {
|
|
412
|
+
fields: [
|
|
413
|
+
{
|
|
414
|
+
name: 'tags',
|
|
415
|
+
type: 'select',
|
|
416
|
+
hasMany: true,
|
|
417
|
+
localized: true,
|
|
418
|
+
options: [
|
|
419
|
+
'available'
|
|
420
|
+
]
|
|
421
|
+
}
|
|
422
|
+
],
|
|
423
|
+
table: articlesTable
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
const plan = createPolymorphicJoinWherePlan({
|
|
427
|
+
adapter: localizedAdapter,
|
|
428
|
+
collections: [
|
|
429
|
+
'articles'
|
|
430
|
+
],
|
|
431
|
+
where: {
|
|
432
|
+
tags: {
|
|
433
|
+
equals: 'available'
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
expect(plan.get('tags')).toMatchObject({
|
|
438
|
+
type: 'invalid'
|
|
439
|
+
});
|
|
440
|
+
});
|
|
366
441
|
it('creates one scalar plan per unique field in nested boolean clauses', ()=>{
|
|
367
442
|
const plan = createPlan({
|
|
368
443
|
AND: [
|
|
@@ -740,7 +815,7 @@ describe('createPolymorphicJoinWherePlan', ()=>{
|
|
|
740
815
|
'variantTags'
|
|
741
816
|
],
|
|
742
817
|
[
|
|
743
|
-
'a localized field',
|
|
818
|
+
'a localized field without a locale table',
|
|
744
819
|
{
|
|
745
820
|
localizedTitle: {
|
|
746
821
|
equals: 'value'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.spec.ts"],"sourcesContent":["import type { Field, FlattenedField, Where } from 'payload'\n\nimport { getTableName } from 'drizzle-orm'\nimport { pgEnum, pgTable, serial } from 'drizzle-orm/pg-core'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { flattenAllFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\nimport { describe, expect, it } from 'vitest'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype CollectionFixture = {\n fields: Field[]\n table: GenericTable\n}\n\nconst articlesTable = sqliteTable('join_articles', {\n id: integer('id').primaryKey(),\n details_status: text('details_status_flat'),\n score: integer('score'),\n status: text('status'),\n variantKind: text('variant_kind'),\n variantRadio: text('variant_radio'),\n variantRadioMismatch: text('variant_radio_mismatch'),\n title: text('title'),\n variantSelect: text('variant_select'),\n variantSelectMismatch: text('variant_select_mismatch'),\n variantValue: text('variant_value'),\n})\n\nconst notesTable = sqliteTable('join_notes', {\n id: integer('id').primaryKey(),\n details_status: text('details_status_flat'),\n status: text('status'),\n variantKind: text('variant_kind'),\n variantRadio: integer('variant_radio'),\n variantRadioMismatch: integer('variant_radio_mismatch'),\n title: text('title'),\n variantSelect: integer('variant_select'),\n variantSelectMismatch: integer('variant_select_mismatch'),\n variantTags: text('variant_tags'),\n variantValue: integer('variant_value'),\n})\n\nconst articleSelectEnum = pgEnum('join_plan_article_select', ['available', 'reviewed'])\nconst articleRadioEnum = pgEnum('join_plan_article_radio', ['draft', 'published'])\nconst noteSelectEnum = pgEnum('join_plan_note_select', ['available', 'reviewed'])\nconst noteRadioEnum = pgEnum('join_plan_note_radio', ['draft', 'published'])\n\nconst postgresArticlesTable = pgTable('join_plan_articles', {\n id: serial('id').primaryKey(),\n variantRadio: articleRadioEnum('variant_radio'),\n variantSelect: articleSelectEnum('variant_select'),\n})\n\nconst postgresNotesTable = pgTable('join_plan_notes', {\n id: serial('id').primaryKey(),\n variantRadio: noteRadioEnum('variant_radio'),\n variantSelect: noteSelectEnum('variant_select'),\n})\n\nconst articleFields: Field[] = [\n { name: 'title', type: 'text' },\n { name: 'score', type: 'number' },\n {\n name: 'details',\n type: 'group',\n fields: [\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'tags', options: ['available'], type: 'select' },\n ],\n },\n { name: 'details_status', type: 'text' },\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'variantTags', options: ['available'], type: 'select' },\n { name: 'variantKind', options: ['available'], type: 'select' },\n {\n name: 'variantRadio',\n options: [{ label: 'Available', value: 'available' }, 'reviewed'],\n type: 'radio',\n },\n { name: 'variantRadioMismatch', options: ['available', 'reviewed'], type: 'radio' },\n { name: 'variantSelect', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantSelectMismatch', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantValue', type: 'text' },\n { localized: true, name: 'localizedTitle', type: 'text' },\n {\n name: 'entries',\n type: 'array',\n fields: [{ hasMany: true, name: 'tags', options: ['available'], type: 'select' }],\n },\n {\n name: 'content',\n type: 'blocks',\n blocks: [\n {\n slug: 'hero',\n fields: [{ hasMany: true, name: 'tags', options: ['available'], type: 'select' }],\n },\n ],\n },\n]\n\nconst noteFields: Field[] = [\n { name: 'title', type: 'text' },\n {\n name: 'details',\n type: 'group',\n fields: [\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'tags', options: ['available'], type: 'select' },\n ],\n },\n { name: 'details_status', type: 'text' },\n { name: 'status', type: 'text' },\n { name: 'variantTags', options: ['available'], type: 'select' },\n { name: 'variantKind', options: ['available'], type: 'radio' },\n {\n name: 'variantRadio',\n options: [{ label: 'Different label', value: 'available' }, 'reviewed'],\n type: 'radio',\n },\n { name: 'variantRadioMismatch', options: ['reviewed', 'available'], type: 'radio' },\n { name: 'variantSelect', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantSelectMismatch', options: ['reviewed', 'available'], type: 'select' },\n { name: 'variantValue', type: 'number' },\n]\n\nconst articleEnumFields: Field[] = [\n {\n name: 'variantSelect',\n options: ['available', { label: 'Reviewed', value: 'reviewed' }],\n type: 'select',\n },\n { name: 'variantRadio', options: ['draft', 'published'], type: 'radio' },\n]\n\nconst noteEnumFields: Field[] = [\n {\n name: 'variantSelect',\n options: [{ label: 'Available', value: 'available' }, 'reviewed'],\n type: 'select',\n },\n {\n name: 'variantRadio',\n options: [\n { label: 'Draft', value: 'draft' },\n { label: 'Published', value: 'published' },\n ],\n type: 'radio',\n },\n]\n\nconst createAdapter = (fixtures: Record<string, CollectionFixture>): DrizzleAdapter => {\n const collections: Record<\n string,\n { config: { fields: Field[]; flattenedFields: FlattenedField[] } }\n > = {}\n const tableNameMap = new Map<string, string>()\n const tables: Record<string, GenericTable | undefined> = {}\n\n for (const [slug, fixture] of Object.entries(fixtures)) {\n const tableName = getTableName(fixture.table)\n\n collections[slug] = {\n config: {\n fields: fixture.fields,\n flattenedFields: flattenAllFields({ fields: fixture.fields }),\n },\n }\n tableNameMap.set(toSnakeCase(slug), tableName)\n tables[tableName] = fixture.table\n }\n\n return {\n idType: 'serial',\n payload: { collections },\n tableNameMap,\n tables,\n } as unknown as DrizzleAdapter\n}\n\nconst adapter = createAdapter({\n articles: { fields: articleFields, table: articlesTable },\n notes: { fields: noteFields, table: notesTable },\n})\n\nconst createPlan = (where: Where, collections = ['articles', 'notes']) =>\n createPolymorphicJoinWherePlan({ adapter, collections, where })\n\ndescribe('createPolymorphicJoinWherePlan', () => {\n it('creates one scalar plan per unique field in nested boolean clauses', () => {\n const plan = createPlan({\n AND: [\n { title: { equals: 'available' } },\n { 'details.status': { equals: 'reviewed' } },\n { OR: [{ score: { greater_than: 1 } }, { title: { not_equals: 'restricted' } }] },\n ],\n })\n\n expect([...plan.keys()]).toEqual(['title', 'details.status', 'score'])\n expect(plan.get('title')).toMatchObject({\n columnPath: 'title',\n schemaPath: 'title',\n type: 'scalar',\n })\n expect([...plan.get('title').fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n expect(plan.get('details.status')).toMatchObject({\n columnPath: 'details_status',\n type: 'scalar',\n })\n expect([...plan.get('score').fieldsByCollection.keys()]).toEqual(['articles'])\n })\n\n it('creates scalar plans for id and relationTo without configured fields', () => {\n const plan = createPlan({\n id: { in: [1, 2] },\n relationTo: { equals: 'articles' },\n })\n\n expect(plan.get('id')).toMatchObject({ columnPath: 'id', type: 'scalar' })\n expect([...plan.get('id').fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n expect(plan.get('relationTo')).toMatchObject({ columnPath: 'relationTo', type: 'scalar' })\n expect(plan.get('relationTo').fieldsByCollection.size).toBe(0)\n })\n\n it('uses a synthetic UUID field context for an id path without a configured id field', () => {\n const uuidTable = sqliteTable('uuid_articles', {\n id: text('id').primaryKey(),\n })\n const uuidAdapter = createAdapter({ articles: { fields: [], table: uuidTable } })\n\n uuidAdapter.idType = 'uuid'\n\n const idPlan = createPolymorphicJoinWherePlan({\n adapter: uuidAdapter,\n collections: ['articles'],\n where: { id: { equals: '01991f04-1780-7000-8000-000000000001' } },\n }).get('id')\n\n expect(idPlan.fieldsByCollection.get('articles')).toMatchObject({\n field: { name: 'id', type: 'text' },\n isUUID: true,\n type: 'scalar',\n })\n })\n\n it('keeps a scalar path valid when it is absent from one target collection', () => {\n const scorePlan = createPlan({ score: { equals: 5 } }).get('score')\n\n expect(scorePlan.type).toBe('scalar')\n expect([...scorePlan.fieldsByCollection.keys()]).toEqual(['articles'])\n })\n\n it('creates a hasManySelect plan when the field uses separate value rows', () => {\n const tagsPlan = createPlan({ 'details.tags': { contains: 'available' } }).get('details.tags')\n\n expect(tagsPlan).toMatchObject({\n columnPath: 'details_tags',\n schemaPath: 'details.tags',\n type: 'hasManySelect',\n })\n expect([...tagsPlan.fieldsByCollection.values()]).toEqual([\n expect.objectContaining({\n field: expect.objectContaining({ name: 'tags' }),\n type: 'hasManySelect',\n }),\n expect.objectContaining({\n field: expect.objectContaining({ name: 'tags' }),\n type: 'hasManySelect',\n }),\n ])\n })\n\n it('accepts matching select fields even when their database column types differ', () => {\n const selectPlan = createPlan({ variantSelect: { equals: 'available' } }).get('variantSelect')\n\n expect(selectPlan.type).toBe('scalar')\n expect([...selectPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n })\n\n it('accepts text and textarea fields that use the same query value coercion', () => {\n const fieldsWithTextarea = noteFields.map((field) =>\n field.name === 'title' ? { ...field, type: 'textarea' as const } : field,\n )\n const compatibleAdapter = createAdapter({\n articles: { fields: articleFields, table: articlesTable },\n notes: { fields: fieldsWithTextarea, table: notesTable },\n })\n const titlePlan = createPolymorphicJoinWherePlan({\n adapter: compatibleAdapter,\n collections: ['articles', 'notes'],\n where: { title: { equals: 'available' } },\n }).get('title')\n\n expect(titlePlan.type).toBe('scalar')\n })\n\n it.each([\n ['select', 'variantSelect', 'available'],\n ['radio', 'variantRadio', 'draft'],\n ] as const)(\n 'accepts PostgreSQL %s fields with separate enum types and matching option values',\n (_fieldType, schemaPath, value) => {\n const postgresAdapter = createAdapter({\n articles: { fields: articleEnumFields, table: postgresArticlesTable },\n notes: { fields: noteEnumFields, table: postgresNotesTable },\n })\n const fieldPlan = createPolymorphicJoinWherePlan({\n adapter: postgresAdapter,\n collections: ['articles', 'notes'],\n where: { [schemaPath]: { equals: value } },\n }).get(schemaPath)\n\n expect(fieldPlan.type).toBe('scalar')\n expect([...fieldPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n },\n )\n\n it.each([\n ['select', 'variantSelect', ['available', 'restricted']],\n ['select', 'variantSelect', ['reviewed', 'available']],\n ['radio', 'variantRadio', ['draft', 'restricted']],\n ['radio', 'variantRadio', ['published', 'draft']],\n ] as const)(\n 'rejects PostgreSQL %s fields whose option values differ or use a different order',\n (fieldType, schemaPath, options) => {\n const noteFieldsWithDifferentOptions = noteEnumFields.map((field) =>\n field.name === schemaPath ? { ...field, options: [...options], type: fieldType } : field,\n ) as Field[]\n const postgresAdapter = createAdapter({\n articles: { fields: articleEnumFields, table: postgresArticlesTable },\n notes: { fields: noteFieldsWithDifferentOptions, table: postgresNotesTable },\n })\n const fieldPlan = createPolymorphicJoinWherePlan({\n adapter: postgresAdapter,\n collections: ['articles', 'notes'],\n where: { [schemaPath]: { equals: options[0] } },\n }).get(schemaPath)\n\n expect(fieldPlan.type).toBe('invalid')\n },\n )\n\n it('accepts matching radio option values even when labels and database column types differ', () => {\n const radioPlan = createPlan({ variantRadio: { equals: 'available' } }).get('variantRadio')\n\n expect(radioPlan.type).toBe('scalar')\n expect([...radioPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n })\n\n it.each([\n ['a field that is absent from every collection', { unknown: { equals: 'value' } }, 'unknown'],\n ['incompatible scalar field types', { variantValue: { equals: 'value' } }, 'variantValue'],\n [\n 'select fields with differently ordered option values',\n { variantSelectMismatch: { equals: 'available' } },\n 'variantSelectMismatch',\n ],\n [\n 'radio fields with differently ordered option values',\n { variantRadioMismatch: { equals: 'available' } },\n 'variantRadioMismatch',\n ],\n [\n 'a select field mixed with a radio field',\n { variantKind: { equals: 'available' } },\n 'variantKind',\n ],\n [\n 'a has-many select mixed with a scalar select',\n { variantTags: { contains: 'available' } },\n 'variantTags',\n ],\n ['a localized field', { localizedTitle: { equals: 'value' } }, 'localizedTitle'],\n ['a field stored in array rows', { 'entries.tags': { equals: 'value' } }, 'entries.tags'],\n [\n 'a field stored in block rows',\n { 'content.hero.tags': { equals: 'value' } },\n 'content.hero.tags',\n ],\n ] as const)('marks %s as invalid', (_description, where, schemaPath) => {\n expect(createPlan(where as Where).get(schemaPath)).toMatchObject({ type: 'invalid' })\n })\n\n it('marks both schema paths as invalid when they resolve to the same flattened column path', () => {\n const plan = createPlan({\n 'details.status': { equals: 'available' },\n details_status: { equals: 'available' },\n })\n\n expect(plan.get('details.status')).toMatchObject({\n columnPath: 'details_status',\n type: 'invalid',\n })\n expect(plan.get('details_status')).toMatchObject({\n columnPath: 'details_status',\n type: 'invalid',\n })\n })\n\n it('marks a configured scalar field as invalid when its table column is missing', () => {\n const tableWithoutTitle = sqliteTable('articles_without_title', {\n id: integer('id').primaryKey(),\n })\n const adapterWithoutTitle = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: tableWithoutTitle },\n })\n const plan = createPolymorphicJoinWherePlan({\n adapter: adapterWithoutTitle,\n collections: ['articles'],\n where: { title: { equals: 'available' } },\n })\n\n expect(plan.get('title')).toMatchObject({ type: 'invalid' })\n })\n\n it('marks an id path as invalid when a target table has no id column', () => {\n const tableWithoutID = sqliteTable('articles_without_id', {\n title: text('title'),\n })\n const adapterWithoutID = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: tableWithoutID },\n })\n const plan = createPolymorphicJoinWherePlan({\n adapter: adapterWithoutID,\n collections: ['articles'],\n where: { id: { equals: 1 } },\n })\n\n expect(plan.get('id')).toMatchObject({ type: 'invalid' })\n })\n\n it('marks every requested path as invalid when there are no target collections', () => {\n expect(createPlan({ title: { equals: 'available' } }, []).get('title')).toMatchObject({\n type: 'invalid',\n })\n })\n\n it('throws a descriptive error when a target collection is not configured', () => {\n expect(() => createPlan({ title: { equals: 'available' } }, ['missing'])).toThrow(\n 'Unknown polymorphic join collection \"missing\"',\n )\n })\n\n it('throws a descriptive error when a configured collection has no database table', () => {\n const adapterWithoutTable = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: articlesTable },\n })\n\n adapterWithoutTable.tables = {}\n\n expect(() =>\n createPolymorphicJoinWherePlan({\n adapter: adapterWithoutTable,\n collections: ['articles'],\n where: { title: { equals: 'available' } },\n }),\n ).toThrow('Polymorphic join collection \"articles\" has no database table')\n })\n})\n"],"names":["getTableName","pgEnum","pgTable","serial","integer","sqliteTable","text","flattenAllFields","toSnakeCase","describe","expect","it","createPolymorphicJoinWherePlan","articlesTable","id","primaryKey","details_status","score","status","variantKind","variantRadio","variantRadioMismatch","title","variantSelect","variantSelectMismatch","variantValue","notesTable","variantTags","articleSelectEnum","articleRadioEnum","noteSelectEnum","noteRadioEnum","postgresArticlesTable","postgresNotesTable","articleFields","name","type","fields","hasMany","options","label","value","localized","blocks","slug","noteFields","articleEnumFields","noteEnumFields","createAdapter","fixtures","collections","tableNameMap","Map","tables","fixture","Object","entries","tableName","table","config","flattenedFields","set","idType","payload","adapter","articles","notes","createPlan","where","plan","AND","equals","OR","greater_than","not_equals","keys","toEqual","get","toMatchObject","columnPath","schemaPath","fieldsByCollection","in","relationTo","size","toBe","uuidTable","uuidAdapter","idPlan","field","isUUID","scorePlan","tagsPlan","contains","values","objectContaining","selectPlan","fieldsWithTextarea","map","compatibleAdapter","titlePlan","each","_fieldType","postgresAdapter","fieldPlan","fieldType","noteFieldsWithDifferentOptions","radioPlan","unknown","localizedTitle","_description","tableWithoutTitle","adapterWithoutTitle","tableWithoutID","adapterWithoutID","toThrow","adapterWithoutTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.spec.ts"],"sourcesContent":["import type { Field, FlattenedField, Where } from 'payload'\n\nimport { getTableName } from 'drizzle-orm'\nimport { pgEnum, pgTable, serial } from 'drizzle-orm/pg-core'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { flattenAllFields } from 'payload'\nimport toSnakeCase from 'to-snake-case'\nimport { describe, expect, it } from 'vitest'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype CollectionFixture = {\n fields: Field[]\n table: GenericTable\n}\n\nconst articlesTable = sqliteTable('join_articles', {\n id: integer('id').primaryKey(),\n details_status: text('details_status_flat'),\n score: integer('score'),\n status: text('status'),\n variantKind: text('variant_kind'),\n variantRadio: text('variant_radio'),\n variantRadioMismatch: text('variant_radio_mismatch'),\n title: text('title'),\n variantSelect: text('variant_select'),\n variantSelectMismatch: text('variant_select_mismatch'),\n variantValue: text('variant_value'),\n})\n\nconst notesTable = sqliteTable('join_notes', {\n id: integer('id').primaryKey(),\n details_status: text('details_status_flat'),\n status: text('status'),\n variantKind: text('variant_kind'),\n variantRadio: integer('variant_radio'),\n variantRadioMismatch: integer('variant_radio_mismatch'),\n title: text('title'),\n variantSelect: integer('variant_select'),\n variantSelectMismatch: integer('variant_select_mismatch'),\n variantTags: text('variant_tags'),\n variantValue: integer('variant_value'),\n})\n\nconst articleSelectEnum = pgEnum('join_plan_article_select', ['available', 'reviewed'])\nconst articleRadioEnum = pgEnum('join_plan_article_radio', ['draft', 'published'])\nconst noteSelectEnum = pgEnum('join_plan_note_select', ['available', 'reviewed'])\nconst noteRadioEnum = pgEnum('join_plan_note_radio', ['draft', 'published'])\n\nconst postgresArticlesTable = pgTable('join_plan_articles', {\n id: serial('id').primaryKey(),\n variantRadio: articleRadioEnum('variant_radio'),\n variantSelect: articleSelectEnum('variant_select'),\n})\n\nconst postgresNotesTable = pgTable('join_plan_notes', {\n id: serial('id').primaryKey(),\n variantRadio: noteRadioEnum('variant_radio'),\n variantSelect: noteSelectEnum('variant_select'),\n})\n\nconst articleFields: Field[] = [\n { name: 'title', type: 'text' },\n { name: 'score', type: 'number' },\n {\n name: 'details',\n type: 'group',\n fields: [\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'tags', options: ['available'], type: 'select' },\n ],\n },\n { name: 'details_status', type: 'text' },\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'variantTags', options: ['available'], type: 'select' },\n { name: 'variantKind', options: ['available'], type: 'select' },\n {\n name: 'variantRadio',\n options: [{ label: 'Available', value: 'available' }, 'reviewed'],\n type: 'radio',\n },\n { name: 'variantRadioMismatch', options: ['available', 'reviewed'], type: 'radio' },\n { name: 'variantSelect', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantSelectMismatch', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantValue', type: 'text' },\n { localized: true, name: 'localizedTitle', type: 'text' },\n {\n name: 'entries',\n type: 'array',\n fields: [{ hasMany: true, name: 'tags', options: ['available'], type: 'select' }],\n },\n {\n name: 'content',\n type: 'blocks',\n blocks: [\n {\n slug: 'hero',\n fields: [{ hasMany: true, name: 'tags', options: ['available'], type: 'select' }],\n },\n ],\n },\n]\n\nconst noteFields: Field[] = [\n { name: 'title', type: 'text' },\n {\n name: 'details',\n type: 'group',\n fields: [\n { name: 'status', type: 'text' },\n { hasMany: true, name: 'tags', options: ['available'], type: 'select' },\n ],\n },\n { name: 'details_status', type: 'text' },\n { name: 'status', type: 'text' },\n { name: 'variantTags', options: ['available'], type: 'select' },\n { name: 'variantKind', options: ['available'], type: 'radio' },\n {\n name: 'variantRadio',\n options: [{ label: 'Different label', value: 'available' }, 'reviewed'],\n type: 'radio',\n },\n { name: 'variantRadioMismatch', options: ['reviewed', 'available'], type: 'radio' },\n { name: 'variantSelect', options: ['available', 'reviewed'], type: 'select' },\n { name: 'variantSelectMismatch', options: ['reviewed', 'available'], type: 'select' },\n { name: 'variantValue', type: 'number' },\n]\n\nconst articleEnumFields: Field[] = [\n {\n name: 'variantSelect',\n options: ['available', { label: 'Reviewed', value: 'reviewed' }],\n type: 'select',\n },\n { name: 'variantRadio', options: ['draft', 'published'], type: 'radio' },\n]\n\nconst noteEnumFields: Field[] = [\n {\n name: 'variantSelect',\n options: [{ label: 'Available', value: 'available' }, 'reviewed'],\n type: 'select',\n },\n {\n name: 'variantRadio',\n options: [\n { label: 'Draft', value: 'draft' },\n { label: 'Published', value: 'published' },\n ],\n type: 'radio',\n },\n]\n\nconst createAdapter = (fixtures: Record<string, CollectionFixture>): DrizzleAdapter => {\n const collections: Record<\n string,\n { config: { fields: Field[]; flattenedFields: FlattenedField[] } }\n > = {}\n const tableNameMap = new Map<string, string>()\n const tables: Record<string, GenericTable | undefined> = {}\n\n for (const [slug, fixture] of Object.entries(fixtures)) {\n const tableName = getTableName(fixture.table)\n\n collections[slug] = {\n config: {\n fields: fixture.fields,\n flattenedFields: flattenAllFields({ fields: fixture.fields }),\n },\n }\n tableNameMap.set(toSnakeCase(slug), tableName)\n tables[tableName] = fixture.table\n }\n\n return {\n idType: 'serial',\n payload: { collections },\n tableNameMap,\n tables,\n } as unknown as DrizzleAdapter\n}\n\nconst adapter = createAdapter({\n articles: { fields: articleFields, table: articlesTable },\n notes: { fields: noteFields, table: notesTable },\n})\n\nconst createPlan = (where: Where, collections = ['articles', 'notes']) =>\n createPolymorphicJoinWherePlan({ adapter, collections, where })\n\ndescribe('createPolymorphicJoinWherePlan', () => {\n it('should resolve scalar fields stored in a localized group through the locale table', () => {\n const localizedAdapter = createAdapter({\n articles: {\n fields: [\n {\n name: 'details',\n type: 'group',\n localized: true,\n fields: [{ name: 'status', type: 'text' }],\n },\n ],\n table: articlesTable,\n },\n })\n\n localizedAdapter.localesSuffix = '_locales'\n localizedAdapter.tables.join_articles_locales = sqliteTable('join_articles_locales', {\n details_status: text('details_status'),\n })\n\n const plan = createPolymorphicJoinWherePlan({\n adapter: localizedAdapter,\n collections: ['articles'],\n where: { 'details.status': { equals: 'published' } },\n })\n\n expect(plan.get('details.status')).toMatchObject({\n columnPath: 'details_status',\n type: 'scalar',\n })\n expect(plan.get('details.status')?.fieldsByCollection.get('articles')).toMatchObject({\n type: 'scalar',\n isLocalized: true,\n })\n })\n\n it('should continue rejecting localized has-many selects', () => {\n const localizedAdapter = createAdapter({\n articles: {\n fields: [\n {\n name: 'tags',\n type: 'select',\n hasMany: true,\n localized: true,\n options: ['available'],\n },\n ],\n table: articlesTable,\n },\n })\n const plan = createPolymorphicJoinWherePlan({\n adapter: localizedAdapter,\n collections: ['articles'],\n where: { tags: { equals: 'available' } },\n })\n\n expect(plan.get('tags')).toMatchObject({ type: 'invalid' })\n })\n\n it('creates one scalar plan per unique field in nested boolean clauses', () => {\n const plan = createPlan({\n AND: [\n { title: { equals: 'available' } },\n { 'details.status': { equals: 'reviewed' } },\n { OR: [{ score: { greater_than: 1 } }, { title: { not_equals: 'restricted' } }] },\n ],\n })\n\n expect([...plan.keys()]).toEqual(['title', 'details.status', 'score'])\n expect(plan.get('title')).toMatchObject({\n columnPath: 'title',\n schemaPath: 'title',\n type: 'scalar',\n })\n expect([...plan.get('title').fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n expect(plan.get('details.status')).toMatchObject({\n columnPath: 'details_status',\n type: 'scalar',\n })\n expect([...plan.get('score').fieldsByCollection.keys()]).toEqual(['articles'])\n })\n\n it('creates scalar plans for id and relationTo without configured fields', () => {\n const plan = createPlan({\n id: { in: [1, 2] },\n relationTo: { equals: 'articles' },\n })\n\n expect(plan.get('id')).toMatchObject({ columnPath: 'id', type: 'scalar' })\n expect([...plan.get('id').fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n expect(plan.get('relationTo')).toMatchObject({ columnPath: 'relationTo', type: 'scalar' })\n expect(plan.get('relationTo').fieldsByCollection.size).toBe(0)\n })\n\n it('uses a synthetic UUID field context for an id path without a configured id field', () => {\n const uuidTable = sqliteTable('uuid_articles', {\n id: text('id').primaryKey(),\n })\n const uuidAdapter = createAdapter({ articles: { fields: [], table: uuidTable } })\n\n uuidAdapter.idType = 'uuid'\n\n const idPlan = createPolymorphicJoinWherePlan({\n adapter: uuidAdapter,\n collections: ['articles'],\n where: { id: { equals: '01991f04-1780-7000-8000-000000000001' } },\n }).get('id')\n\n expect(idPlan.fieldsByCollection.get('articles')).toMatchObject({\n field: { name: 'id', type: 'text' },\n isUUID: true,\n type: 'scalar',\n })\n })\n\n it('keeps a scalar path valid when it is absent from one target collection', () => {\n const scorePlan = createPlan({ score: { equals: 5 } }).get('score')\n\n expect(scorePlan.type).toBe('scalar')\n expect([...scorePlan.fieldsByCollection.keys()]).toEqual(['articles'])\n })\n\n it('creates a hasManySelect plan when the field uses separate value rows', () => {\n const tagsPlan = createPlan({ 'details.tags': { contains: 'available' } }).get('details.tags')\n\n expect(tagsPlan).toMatchObject({\n columnPath: 'details_tags',\n schemaPath: 'details.tags',\n type: 'hasManySelect',\n })\n expect([...tagsPlan.fieldsByCollection.values()]).toEqual([\n expect.objectContaining({\n field: expect.objectContaining({ name: 'tags' }),\n type: 'hasManySelect',\n }),\n expect.objectContaining({\n field: expect.objectContaining({ name: 'tags' }),\n type: 'hasManySelect',\n }),\n ])\n })\n\n it('accepts matching select fields even when their database column types differ', () => {\n const selectPlan = createPlan({ variantSelect: { equals: 'available' } }).get('variantSelect')\n\n expect(selectPlan.type).toBe('scalar')\n expect([...selectPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n })\n\n it('accepts text and textarea fields that use the same query value coercion', () => {\n const fieldsWithTextarea = noteFields.map((field) =>\n field.name === 'title' ? { ...field, type: 'textarea' as const } : field,\n )\n const compatibleAdapter = createAdapter({\n articles: { fields: articleFields, table: articlesTable },\n notes: { fields: fieldsWithTextarea, table: notesTable },\n })\n const titlePlan = createPolymorphicJoinWherePlan({\n adapter: compatibleAdapter,\n collections: ['articles', 'notes'],\n where: { title: { equals: 'available' } },\n }).get('title')\n\n expect(titlePlan.type).toBe('scalar')\n })\n\n it.each([\n ['select', 'variantSelect', 'available'],\n ['radio', 'variantRadio', 'draft'],\n ] as const)(\n 'accepts PostgreSQL %s fields with separate enum types and matching option values',\n (_fieldType, schemaPath, value) => {\n const postgresAdapter = createAdapter({\n articles: { fields: articleEnumFields, table: postgresArticlesTable },\n notes: { fields: noteEnumFields, table: postgresNotesTable },\n })\n const fieldPlan = createPolymorphicJoinWherePlan({\n adapter: postgresAdapter,\n collections: ['articles', 'notes'],\n where: { [schemaPath]: { equals: value } },\n }).get(schemaPath)\n\n expect(fieldPlan.type).toBe('scalar')\n expect([...fieldPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n },\n )\n\n it.each([\n ['select', 'variantSelect', ['available', 'restricted']],\n ['select', 'variantSelect', ['reviewed', 'available']],\n ['radio', 'variantRadio', ['draft', 'restricted']],\n ['radio', 'variantRadio', ['published', 'draft']],\n ] as const)(\n 'rejects PostgreSQL %s fields whose option values differ or use a different order',\n (fieldType, schemaPath, options) => {\n const noteFieldsWithDifferentOptions = noteEnumFields.map((field) =>\n field.name === schemaPath ? { ...field, options: [...options], type: fieldType } : field,\n ) as Field[]\n const postgresAdapter = createAdapter({\n articles: { fields: articleEnumFields, table: postgresArticlesTable },\n notes: { fields: noteFieldsWithDifferentOptions, table: postgresNotesTable },\n })\n const fieldPlan = createPolymorphicJoinWherePlan({\n adapter: postgresAdapter,\n collections: ['articles', 'notes'],\n where: { [schemaPath]: { equals: options[0] } },\n }).get(schemaPath)\n\n expect(fieldPlan.type).toBe('invalid')\n },\n )\n\n it('accepts matching radio option values even when labels and database column types differ', () => {\n const radioPlan = createPlan({ variantRadio: { equals: 'available' } }).get('variantRadio')\n\n expect(radioPlan.type).toBe('scalar')\n expect([...radioPlan.fieldsByCollection.keys()]).toEqual(['articles', 'notes'])\n })\n\n it.each([\n ['a field that is absent from every collection', { unknown: { equals: 'value' } }, 'unknown'],\n ['incompatible scalar field types', { variantValue: { equals: 'value' } }, 'variantValue'],\n [\n 'select fields with differently ordered option values',\n { variantSelectMismatch: { equals: 'available' } },\n 'variantSelectMismatch',\n ],\n [\n 'radio fields with differently ordered option values',\n { variantRadioMismatch: { equals: 'available' } },\n 'variantRadioMismatch',\n ],\n [\n 'a select field mixed with a radio field',\n { variantKind: { equals: 'available' } },\n 'variantKind',\n ],\n [\n 'a has-many select mixed with a scalar select',\n { variantTags: { contains: 'available' } },\n 'variantTags',\n ],\n [\n 'a localized field without a locale table',\n { localizedTitle: { equals: 'value' } },\n 'localizedTitle',\n ],\n ['a field stored in array rows', { 'entries.tags': { equals: 'value' } }, 'entries.tags'],\n [\n 'a field stored in block rows',\n { 'content.hero.tags': { equals: 'value' } },\n 'content.hero.tags',\n ],\n ] as const)('marks %s as invalid', (_description, where, schemaPath) => {\n expect(createPlan(where as Where).get(schemaPath)).toMatchObject({ type: 'invalid' })\n })\n\n it('marks both schema paths as invalid when they resolve to the same flattened column path', () => {\n const plan = createPlan({\n 'details.status': { equals: 'available' },\n details_status: { equals: 'available' },\n })\n\n expect(plan.get('details.status')).toMatchObject({\n columnPath: 'details_status',\n type: 'invalid',\n })\n expect(plan.get('details_status')).toMatchObject({\n columnPath: 'details_status',\n type: 'invalid',\n })\n })\n\n it('marks a configured scalar field as invalid when its table column is missing', () => {\n const tableWithoutTitle = sqliteTable('articles_without_title', {\n id: integer('id').primaryKey(),\n })\n const adapterWithoutTitle = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: tableWithoutTitle },\n })\n const plan = createPolymorphicJoinWherePlan({\n adapter: adapterWithoutTitle,\n collections: ['articles'],\n where: { title: { equals: 'available' } },\n })\n\n expect(plan.get('title')).toMatchObject({ type: 'invalid' })\n })\n\n it('marks an id path as invalid when a target table has no id column', () => {\n const tableWithoutID = sqliteTable('articles_without_id', {\n title: text('title'),\n })\n const adapterWithoutID = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: tableWithoutID },\n })\n const plan = createPolymorphicJoinWherePlan({\n adapter: adapterWithoutID,\n collections: ['articles'],\n where: { id: { equals: 1 } },\n })\n\n expect(plan.get('id')).toMatchObject({ type: 'invalid' })\n })\n\n it('marks every requested path as invalid when there are no target collections', () => {\n expect(createPlan({ title: { equals: 'available' } }, []).get('title')).toMatchObject({\n type: 'invalid',\n })\n })\n\n it('throws a descriptive error when a target collection is not configured', () => {\n expect(() => createPlan({ title: { equals: 'available' } }, ['missing'])).toThrow(\n 'Unknown polymorphic join collection \"missing\"',\n )\n })\n\n it('throws a descriptive error when a configured collection has no database table', () => {\n const adapterWithoutTable = createAdapter({\n articles: { fields: [{ name: 'title', type: 'text' }], table: articlesTable },\n })\n\n adapterWithoutTable.tables = {}\n\n expect(() =>\n createPolymorphicJoinWherePlan({\n adapter: adapterWithoutTable,\n collections: ['articles'],\n where: { title: { equals: 'available' } },\n }),\n ).toThrow('Polymorphic join collection \"articles\" has no database table')\n })\n})\n"],"names":["getTableName","pgEnum","pgTable","serial","integer","sqliteTable","text","flattenAllFields","toSnakeCase","describe","expect","it","createPolymorphicJoinWherePlan","articlesTable","id","primaryKey","details_status","score","status","variantKind","variantRadio","variantRadioMismatch","title","variantSelect","variantSelectMismatch","variantValue","notesTable","variantTags","articleSelectEnum","articleRadioEnum","noteSelectEnum","noteRadioEnum","postgresArticlesTable","postgresNotesTable","articleFields","name","type","fields","hasMany","options","label","value","localized","blocks","slug","noteFields","articleEnumFields","noteEnumFields","createAdapter","fixtures","collections","tableNameMap","Map","tables","fixture","Object","entries","tableName","table","config","flattenedFields","set","idType","payload","adapter","articles","notes","createPlan","where","localizedAdapter","localesSuffix","join_articles_locales","plan","equals","get","toMatchObject","columnPath","fieldsByCollection","isLocalized","tags","AND","OR","greater_than","not_equals","keys","toEqual","schemaPath","in","relationTo","size","toBe","uuidTable","uuidAdapter","idPlan","field","isUUID","scorePlan","tagsPlan","contains","values","objectContaining","selectPlan","fieldsWithTextarea","map","compatibleAdapter","titlePlan","each","_fieldType","postgresAdapter","fieldPlan","fieldType","noteFieldsWithDifferentOptions","radioPlan","unknown","localizedTitle","_description","tableWithoutTitle","adapterWithoutTitle","tableWithoutID","adapterWithoutID","toThrow","adapterWithoutTable"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAcpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAcpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,4BA2oBnB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/find/traverseFields.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { count, sql } from 'drizzle-orm'\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SelectMode,\n type SelectType,\n type Where,\n} from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\nimport type { Result } from './buildFindManyArgs.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { getTableAlias } from '../queries/getTableAlias.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { rawConstraint } from '../utilities/rawConstraint.js'\nimport {\n InternalBlockTableNameIndex,\n resolveBlockTableName,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildPolymorphicJoinQuery } from './buildPolymorphicJoinQuery.js'\n\ntype TraverseFieldArgs = {\n _locales: Result\n adapter: DrizzleAdapter\n collectionSlug?: string\n currentArgs: Result\n currentTableName: string\n depth?: number\n draftsEnabled?: boolean\n fields: FlattenedField[]\n forceWithFields?: boolean\n joinQuery: JoinQuery\n joins?: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized?: boolean\n path: string\n select?: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode?: SelectMode\n tablePath: string\n topLevelArgs: Record<string, unknown>\n topLevelTableName: string\n versions?: boolean\n withTabledFields: {\n numbers?: boolean\n rels?: boolean\n texts?: boolean\n }\n}\n\nexport const traverseFields = ({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields,\n forceWithFields,\n joinQuery = {},\n joins,\n locale,\n parentIsLocalized = false,\n path,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n tablePath,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n}: TraverseFieldArgs) => {\n fields.forEach((field) => {\n if (fieldIsVirtual(field)) {\n return\n }\n\n const isFieldLocalized = fieldShouldBeLocalized({\n field,\n parentIsLocalized,\n })\n\n // handle simple relationship\n if (\n depth > 0 &&\n (field.type === 'upload' || field.type === 'relationship') &&\n !field.hasMany &&\n typeof field.relationTo === 'string'\n ) {\n if (isFieldLocalized) {\n _locales.with[`${path}${field.name}`] = true\n } else {\n currentArgs.with[`${path}${field.name}`] = true\n }\n }\n\n switch (field.type) {\n case 'array': {\n const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && typeof arraySelect === 'undefined') ||\n (selectMode === 'exclude' && arraySelect === false)\n ) {\n break\n }\n }\n\n const withArray: Result = {\n columns:\n typeof arraySelect === 'object'\n ? {\n id: true,\n _order: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n if (typeof arraySelect === 'object') {\n if (adapter.tables[arrayTableName]._locale) {\n withArray.columns._locale = true\n }\n\n if (adapter.tables[arrayTableName]._uuid) {\n withArray.columns._uuid = true\n }\n }\n\n const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`\n\n if (adapter.tables[arrayTableNameWithLocales]) {\n withArray.with._locales = {\n columns:\n typeof arraySelect === 'object'\n ? {\n _locale: true,\n }\n : {\n id: false,\n _parentID: false,\n },\n with: {},\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: `${path}${field.name}`,\n tableName: arrayTableName,\n })\n\n currentArgs.with[relationName] = withArray\n\n traverseFields({\n _locales: withArray.with._locales,\n adapter,\n currentArgs: withArray,\n currentTableName: arrayTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof arraySelect === 'object' &&\n withArray.with._locales &&\n Object.keys(withArray.with._locales).length === 1\n ) {\n delete withArray.with._locales\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && !blocksSelect) ||\n (selectMode === 'exclude' && blocksSelect === false)\n ) {\n break\n }\n }\n\n if (adapter.blocksAsJSON) {\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n ;(field.blockReferences ?? field.blocks).forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n const blockKey = `_blocks_${block.slug}${!block[InternalBlockTableNameIndex] ? '' : `_${block[InternalBlockTableNameIndex]}`}`\n\n let blockSelect: boolean | SelectType | undefined\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'include' && blocksSelect === true) {\n blockSelect = true\n }\n\n if (typeof blocksSelect === 'object') {\n if (typeof blocksSelect[block.slug] === 'object') {\n blockSelect = blocksSelect[block.slug]\n } else if (\n (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined') ||\n (selectMode === 'exclude' && blocksSelect[block.slug] === false)\n ) {\n blockSelect = {}\n blockSelectMode = 'include'\n } else if (selectMode === 'include' && Boolean(blocksSelect[block.slug])) {\n blockSelect = true\n }\n }\n\n if (!topLevelArgs[blockKey]) {\n const withBlock: Result = {\n columns:\n typeof blockSelect === 'object'\n ? {\n id: true,\n _order: true,\n _path: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (typeof blockSelect === 'object') {\n if (adapter.tables[tableName]._locale) {\n withBlock.columns._locale = true\n }\n\n if (adapter.tables[tableName]._uuid) {\n withBlock.columns._uuid = true\n }\n }\n\n if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {\n withBlock.with._locales = {\n with: {},\n }\n\n if (typeof blockSelect === 'object') {\n withBlock.with._locales.columns = {\n _locale: true,\n }\n }\n }\n topLevelArgs.with[blockKey] = withBlock\n\n traverseFields({\n _locales: withBlock.with._locales,\n adapter,\n currentArgs: withBlock,\n currentTableName: tableName,\n depth,\n draftsEnabled,\n fields: block.flattenedFields,\n forceWithFields: blockSelect === true,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof blockSelect === 'object' &&\n withBlock.with._locales &&\n Object.keys(withBlock.with._locales.columns).length === 1\n ) {\n delete withBlock.with._locales\n }\n }\n })\n\n break\n }\n\n case 'group':\n case 'tab': {\n const fieldSelect = select?.[field.name]\n\n if (fieldSelect === false) {\n break\n }\n\n traverseFields({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${path}${field.name}_`,\n select: typeof fieldSelect === 'object' ? fieldSelect : undefined,\n selectAllOnCurrentLevel:\n selectAllOnCurrentLevel ||\n fieldSelect === true ||\n (selectMode === 'exclude' && typeof fieldSelect === 'undefined'),\n selectMode,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n })\n\n break\n }\n case 'join': {\n // when `joinsQuery` is false, do not join\n if (joinQuery === false) {\n break\n }\n\n if (\n (select && selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n\n const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`\n\n if (joinQuery[joinSchemaPath] === false) {\n break\n }\n\n const {\n count: shouldCount = false,\n limit: limitArg = field.defaultLimit ?? 10,\n page,\n sort = field.defaultSort,\n where,\n } = joinQuery[joinSchemaPath] || {}\n let limit = limitArg\n\n if (limit !== 0) {\n // get an additional document and slice it later to determine if there is a next page\n limit += 1\n }\n\n if (Array.isArray(field.collection)) {\n const polymorphicJoinQuery = buildPolymorphicJoinQuery({\n adapter,\n currentTableName,\n field,\n limit,\n page,\n path,\n shouldCount,\n sort,\n where,\n })\n\n currentArgs.extras[polymorphicJoinQuery.columnName] = polymorphicJoinQuery.documents\n\n if (polymorphicJoinQuery.count) {\n currentArgs.extras[`${polymorphicJoinQuery.columnName}_count`] =\n polymorphicJoinQuery.count\n }\n } else {\n const db = adapter.drizzle as LibSQLDatabase\n const useDrafts =\n (versions || draftsEnabled) &&\n hasDraftsEnabled(adapter.payload.collections[field.collection].config)\n\n const fields = useDrafts\n ? buildVersionCollectionFields(\n adapter.payload.config,\n adapter.payload.collections[field.collection].config,\n true,\n )\n : adapter.payload.collections[field.collection].config.flattenedFields\n\n const joinCollectionTableName = adapter.tableNameMap.get(\n useDrafts\n ? `_${toSnakeCase(field.collection)}${adapter.versionsSuffix}`\n : toSnakeCase(field.collection),\n )\n\n const joins: BuildQueryJoinAliases = []\n\n const currentIDColumn = versions\n ? adapter.tables[currentTableName].parent\n : adapter.tables[currentTableName].id\n\n let joinQueryWhere: Where\n\n const currentIDRaw = sql.raw(\n `\"${getNameFromDrizzleTable(currentIDColumn.table)}\".\"${currentIDColumn.name}\"`,\n )\n\n if (Array.isArray(field.targetField.relationTo)) {\n joinQueryWhere = {\n [field.on]: {\n equals: {\n relationTo: collectionSlug,\n value: rawConstraint(currentIDRaw),\n },\n },\n }\n } else {\n joinQueryWhere = {\n [field.on]: {\n equals: rawConstraint(currentIDRaw),\n },\n }\n }\n\n if (where && Object.keys(where).length) {\n joinQueryWhere = {\n and: [joinQueryWhere, where],\n }\n }\n\n if (useDrafts) {\n joinQueryWhere = combineQueries(appendVersionToQueryKey(joinQueryWhere), {\n latest: { equals: true },\n })\n }\n\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n\n const subQueryAlias = `${columnName}_alias`\n\n const { newAliasTable } = getTableAlias({\n adapter,\n tableName: joinCollectionTableName,\n })\n\n const {\n orderBy,\n selectFields,\n where: subQueryWhere,\n } = buildQuery({\n adapter,\n aliasTable: newAliasTable,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectLocale: true,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: adapter.payload.collections[field.collection].config,\n sort,\n })\n : sort,\n tableName: joinCollectionTableName,\n where: joinQueryWhere,\n })\n\n for (let key in selectFields) {\n const val = selectFields[key]\n\n if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {\n delete selectFields[key]\n key = key.split('.').pop()\n selectFields[key] = newAliasTable[key]\n }\n }\n\n if (useDrafts) {\n selectFields.parent = newAliasTable.parent\n }\n\n let query: SQLiteSelect = db\n .select(selectFields as any)\n .from(newAliasTable)\n .where(subQueryWhere)\n .orderBy(() => orderBy.map(({ column, order }) => order(column)))\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n query = query[type ?? 'leftJoin'](table, condition)\n })\n\n if (page && limit !== 0) {\n const offset = (page - 1) * limit - 1\n if (offset > 0) {\n query = query.offset(offset)\n }\n }\n\n if (limit !== 0) {\n query = query.limit(limit)\n }\n\n const subQuery = query.as(subQueryAlias)\n\n if (shouldCount) {\n let countSubquery: SQLiteSelect = db\n .select(selectFields as any)\n\n .from(newAliasTable)\n .where(subQueryWhere)\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n countSubquery = countSubquery[type ?? 'leftJoin'](table, condition)\n })\n\n currentArgs.extras[`${columnName}_count`] = sql`${db\n .select({\n count: count(),\n })\n .from(sql`${countSubquery.as(`${subQueryAlias}_count_subquery`)}`)}`.as(\n `${subQueryAlias}_count`,\n )\n }\n\n currentArgs.extras[columnName] = sql`${db\n .select({\n result: jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".${useDrafts ? 'parent_id' : 'id'}`),\n ...(selectFields._locale && {\n locale: sql.raw(`\"${subQueryAlias}\".${selectFields._locale.name}`),\n }),\n }),\n })\n .from(sql`${subQuery}`)}`.as(subQueryAlias)\n }\n\n break\n }\n\n case 'point': {\n if (adapter.name === 'sqlite') {\n break\n }\n\n const args = isFieldLocalized ? _locales : currentArgs\n if (!args.columns) {\n args.columns = {}\n }\n\n if (!args.extras) {\n args.extras = {}\n }\n\n const name = `${path}${field.name}`\n\n // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526\n // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON\n args.columns[name] = false\n\n let shouldSelect = false\n\n if (select || selectAllOnCurrentLevel) {\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n shouldSelect = true\n }\n } else {\n shouldSelect = true\n }\n const tableName = fieldShouldBeLocalized({ field, parentIsLocalized })\n ? `${currentTableName}${adapter.localesSuffix}`\n : currentTableName\n\n if (shouldSelect) {\n args.extras[name] = sql\n .raw(`ST_AsGeoJSON(\"${adapter.tables[tableName][name].name}\")::jsonb`)\n .as(name)\n }\n break\n }\n\n case 'select': {\n if (select && !selectAllOnCurrentLevel) {\n if (\n (selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n }\n\n if (field.hasMany) {\n const withSelect: Result = {\n columns: {\n id: false,\n order: false,\n parent: false,\n },\n orderBy: ({ order }, { asc }) => [asc(order)],\n }\n\n currentArgs.with[`${path}${field.name}`] = withSelect\n break\n }\n\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n default: {\n if (forceWithFields) {\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n if (!select && !selectAllOnCurrentLevel) {\n break\n }\n\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n\n if (\n !withTabledFields.rels &&\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n break\n }\n }\n })\n\n return topLevelArgs\n}\n"],"names":["count","sql","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldIsVirtual","fieldShouldBeLocalized","hasDraftsEnabled","toSnakeCase","buildQuery","getTableAlias","getArrayRelationName","getNameFromDrizzleTable","jsonAggBuildObject","rawConstraint","InternalBlockTableNameIndex","resolveBlockTableName","buildPolymorphicJoinQuery","traverseFields","_locales","adapter","collectionSlug","currentArgs","currentTableName","depth","draftsEnabled","fields","forceWithFields","joinQuery","joins","locale","parentIsLocalized","path","select","selectAllOnCurrentLevel","selectMode","tablePath","topLevelArgs","topLevelTableName","versions","withTabledFields","forEach","field","isFieldLocalized","type","hasMany","relationTo","with","name","arraySelect","withArray","columns","id","_order","_parentID","orderBy","asc","arrayTableName","tableNameMap","get","tables","_locale","_uuid","arrayTableNameWithLocales","localesSuffix","relationName","tableName","flattenedFields","localized","undefined","Object","keys","length","blocksSelect","blocksAsJSON","fieldPath","blockReferences","blocks","_block","block","payload","blockKey","slug","blockSelect","blockSelectMode","Boolean","withBlock","_path","fieldSelect","joinSchemaPath","replaceAll","shouldCount","limit","limitArg","defaultLimit","page","sort","defaultSort","where","Array","isArray","collection","polymorphicJoinQuery","extras","columnName","documents","db","drizzle","useDrafts","collections","config","joinCollectionTableName","versionsSuffix","currentIDColumn","parent","joinQueryWhere","currentIDRaw","raw","table","targetField","on","equals","value","and","latest","subQueryAlias","newAliasTable","selectFields","subQueryWhere","aliasTable","selectLocale","collectionConfig","key","val","split","pop","query","from","map","column","order","$dynamic","condition","offset","subQuery","as","countSubquery","result","args","shouldSelect","withSelect","rels","numbers","texts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/find/traverseFields.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { count, sql } from 'drizzle-orm'\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SelectMode,\n type SelectType,\n type Where,\n} from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\nimport type { Result } from './buildFindManyArgs.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { getTableAlias } from '../queries/getTableAlias.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { rawConstraint } from '../utilities/rawConstraint.js'\nimport {\n InternalBlockTableNameIndex,\n resolveBlockTableName,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildPolymorphicJoinQuery } from './buildPolymorphicJoinQuery.js'\n\ntype TraverseFieldArgs = {\n _locales: Result\n adapter: DrizzleAdapter\n collectionSlug?: string\n currentArgs: Result\n currentTableName: string\n depth?: number\n draftsEnabled?: boolean\n fields: FlattenedField[]\n forceWithFields?: boolean\n joinQuery: JoinQuery\n joins?: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized?: boolean\n path: string\n select?: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode?: SelectMode\n tablePath: string\n topLevelArgs: Record<string, unknown>\n topLevelTableName: string\n versions?: boolean\n withTabledFields: {\n numbers?: boolean\n rels?: boolean\n texts?: boolean\n }\n}\n\nexport const traverseFields = ({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields,\n forceWithFields,\n joinQuery = {},\n joins,\n locale,\n parentIsLocalized = false,\n path,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n tablePath,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n}: TraverseFieldArgs) => {\n fields.forEach((field) => {\n if (fieldIsVirtual(field)) {\n return\n }\n\n const isFieldLocalized = fieldShouldBeLocalized({\n field,\n parentIsLocalized,\n })\n\n // handle simple relationship\n if (\n depth > 0 &&\n (field.type === 'upload' || field.type === 'relationship') &&\n !field.hasMany &&\n typeof field.relationTo === 'string'\n ) {\n if (isFieldLocalized) {\n _locales.with[`${path}${field.name}`] = true\n } else {\n currentArgs.with[`${path}${field.name}`] = true\n }\n }\n\n switch (field.type) {\n case 'array': {\n const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && typeof arraySelect === 'undefined') ||\n (selectMode === 'exclude' && arraySelect === false)\n ) {\n break\n }\n }\n\n const withArray: Result = {\n columns:\n typeof arraySelect === 'object'\n ? {\n id: true,\n _order: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n if (typeof arraySelect === 'object') {\n if (adapter.tables[arrayTableName]._locale) {\n withArray.columns._locale = true\n }\n\n if (adapter.tables[arrayTableName]._uuid) {\n withArray.columns._uuid = true\n }\n }\n\n const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`\n\n if (adapter.tables[arrayTableNameWithLocales]) {\n withArray.with._locales = {\n columns:\n typeof arraySelect === 'object'\n ? {\n _locale: true,\n }\n : {\n id: false,\n _parentID: false,\n },\n with: {},\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: `${path}${field.name}`,\n tableName: arrayTableName,\n })\n\n currentArgs.with[relationName] = withArray\n\n traverseFields({\n _locales: withArray.with._locales,\n adapter,\n currentArgs: withArray,\n currentTableName: arrayTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof arraySelect === 'object' &&\n withArray.with._locales &&\n Object.keys(withArray.with._locales).length === 1\n ) {\n delete withArray.with._locales\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && !blocksSelect) ||\n (selectMode === 'exclude' && blocksSelect === false)\n ) {\n break\n }\n }\n\n if (adapter.blocksAsJSON) {\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n ;(field.blockReferences ?? field.blocks).forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n const blockKey = `_blocks_${block.slug}${!block[InternalBlockTableNameIndex] ? '' : `_${block[InternalBlockTableNameIndex]}`}`\n\n let blockSelect: boolean | SelectType | undefined\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'include' && blocksSelect === true) {\n blockSelect = true\n }\n\n if (typeof blocksSelect === 'object') {\n if (typeof blocksSelect[block.slug] === 'object') {\n blockSelect = blocksSelect[block.slug]\n } else if (\n (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined') ||\n (selectMode === 'exclude' && blocksSelect[block.slug] === false)\n ) {\n blockSelect = {}\n blockSelectMode = 'include'\n } else if (selectMode === 'include' && Boolean(blocksSelect[block.slug])) {\n blockSelect = true\n }\n }\n\n if (!topLevelArgs[blockKey]) {\n const withBlock: Result = {\n columns:\n typeof blockSelect === 'object'\n ? {\n id: true,\n _order: true,\n _path: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (typeof blockSelect === 'object') {\n if (adapter.tables[tableName]._locale) {\n withBlock.columns._locale = true\n }\n\n if (adapter.tables[tableName]._uuid) {\n withBlock.columns._uuid = true\n }\n }\n\n if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {\n withBlock.with._locales = {\n with: {},\n }\n\n if (typeof blockSelect === 'object') {\n withBlock.with._locales.columns = {\n _locale: true,\n }\n }\n }\n topLevelArgs.with[blockKey] = withBlock\n\n traverseFields({\n _locales: withBlock.with._locales,\n adapter,\n currentArgs: withBlock,\n currentTableName: tableName,\n depth,\n draftsEnabled,\n fields: block.flattenedFields,\n forceWithFields: blockSelect === true,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof blockSelect === 'object' &&\n withBlock.with._locales &&\n Object.keys(withBlock.with._locales.columns).length === 1\n ) {\n delete withBlock.with._locales\n }\n }\n })\n\n break\n }\n\n case 'group':\n case 'tab': {\n const fieldSelect = select?.[field.name]\n\n if (fieldSelect === false) {\n break\n }\n\n traverseFields({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${path}${field.name}_`,\n select: typeof fieldSelect === 'object' ? fieldSelect : undefined,\n selectAllOnCurrentLevel:\n selectAllOnCurrentLevel ||\n fieldSelect === true ||\n (selectMode === 'exclude' && typeof fieldSelect === 'undefined'),\n selectMode,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n })\n\n break\n }\n case 'join': {\n // when `joinsQuery` is false, do not join\n if (joinQuery === false) {\n break\n }\n\n if (\n (select && selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n\n const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`\n\n if (joinQuery[joinSchemaPath] === false) {\n break\n }\n\n const {\n count: shouldCount = false,\n limit: limitArg = field.defaultLimit ?? 10,\n page,\n sort = field.defaultSort,\n where,\n } = joinQuery[joinSchemaPath] || {}\n let limit = limitArg\n\n if (limit !== 0) {\n // get an additional document and slice it later to determine if there is a next page\n limit += 1\n }\n\n if (Array.isArray(field.collection)) {\n const polymorphicJoinQuery = buildPolymorphicJoinQuery({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n pageSize: limitArg,\n path,\n shouldCount,\n sort,\n where,\n })\n\n currentArgs.extras[polymorphicJoinQuery.columnName] = polymorphicJoinQuery.documents\n\n if (polymorphicJoinQuery.count) {\n currentArgs.extras[`${polymorphicJoinQuery.columnName}_count`] =\n polymorphicJoinQuery.count\n }\n } else {\n const db = adapter.drizzle as LibSQLDatabase\n const useDrafts =\n (versions || draftsEnabled) &&\n hasDraftsEnabled(adapter.payload.collections[field.collection].config)\n\n const fields = useDrafts\n ? buildVersionCollectionFields(\n adapter.payload.config,\n adapter.payload.collections[field.collection].config,\n true,\n )\n : adapter.payload.collections[field.collection].config.flattenedFields\n\n const joinCollectionTableName = adapter.tableNameMap.get(\n useDrafts\n ? `_${toSnakeCase(field.collection)}${adapter.versionsSuffix}`\n : toSnakeCase(field.collection),\n )\n\n const joins: BuildQueryJoinAliases = []\n\n const currentIDColumn = versions\n ? adapter.tables[currentTableName].parent\n : adapter.tables[currentTableName].id\n\n let joinQueryWhere: Where\n\n const currentIDRaw = sql.raw(\n `\"${getNameFromDrizzleTable(currentIDColumn.table)}\".\"${currentIDColumn.name}\"`,\n )\n\n if (Array.isArray(field.targetField.relationTo)) {\n joinQueryWhere = {\n [field.on]: {\n equals: {\n relationTo: collectionSlug,\n value: rawConstraint(currentIDRaw),\n },\n },\n }\n } else {\n joinQueryWhere = {\n [field.on]: {\n equals: rawConstraint(currentIDRaw),\n },\n }\n }\n\n if (where && Object.keys(where).length) {\n joinQueryWhere = {\n and: [joinQueryWhere, where],\n }\n }\n\n if (useDrafts) {\n joinQueryWhere = combineQueries(appendVersionToQueryKey(joinQueryWhere), {\n latest: { equals: true },\n })\n }\n\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n\n const subQueryAlias = `${columnName}_alias`\n\n const { newAliasTable } = getTableAlias({\n adapter,\n tableName: joinCollectionTableName,\n })\n\n const {\n orderBy,\n selectFields,\n where: subQueryWhere,\n } = buildQuery({\n adapter,\n aliasTable: newAliasTable,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectLocale: true,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: adapter.payload.collections[field.collection].config,\n sort,\n })\n : sort,\n tableName: joinCollectionTableName,\n where: joinQueryWhere,\n })\n\n for (let key in selectFields) {\n const val = selectFields[key]\n\n if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {\n delete selectFields[key]\n key = key.split('.').pop()\n selectFields[key] = newAliasTable[key]\n }\n }\n\n if (useDrafts) {\n selectFields.parent = newAliasTable.parent\n }\n\n let query: SQLiteSelect = db\n .select(selectFields as any)\n .from(newAliasTable)\n .where(subQueryWhere)\n .orderBy(() => orderBy.map(({ column, order }) => order(column)))\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n query = query[type ?? 'leftJoin'](table, condition)\n })\n\n if (page && limit !== 0) {\n const offset = (page - 1) * limit - 1\n if (offset > 0) {\n query = query.offset(offset)\n }\n }\n\n if (limit !== 0) {\n query = query.limit(limit)\n }\n\n const subQuery = query.as(subQueryAlias)\n\n if (shouldCount) {\n let countSubquery: SQLiteSelect = db\n .select(selectFields as any)\n\n .from(newAliasTable)\n .where(subQueryWhere)\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n countSubquery = countSubquery[type ?? 'leftJoin'](table, condition)\n })\n\n currentArgs.extras[`${columnName}_count`] = sql`${db\n .select({\n count: count(),\n })\n .from(sql`${countSubquery.as(`${subQueryAlias}_count_subquery`)}`)}`.as(\n `${subQueryAlias}_count`,\n )\n }\n\n currentArgs.extras[columnName] = sql`${db\n .select({\n result: jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".${useDrafts ? 'parent_id' : 'id'}`),\n ...(selectFields._locale && {\n locale: sql.raw(`\"${subQueryAlias}\".${selectFields._locale.name}`),\n }),\n }),\n })\n .from(sql`${subQuery}`)}`.as(subQueryAlias)\n }\n\n break\n }\n\n case 'point': {\n if (adapter.name === 'sqlite') {\n break\n }\n\n const args = isFieldLocalized ? _locales : currentArgs\n if (!args.columns) {\n args.columns = {}\n }\n\n if (!args.extras) {\n args.extras = {}\n }\n\n const name = `${path}${field.name}`\n\n // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526\n // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON\n args.columns[name] = false\n\n let shouldSelect = false\n\n if (select || selectAllOnCurrentLevel) {\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n shouldSelect = true\n }\n } else {\n shouldSelect = true\n }\n const tableName = fieldShouldBeLocalized({ field, parentIsLocalized })\n ? `${currentTableName}${adapter.localesSuffix}`\n : currentTableName\n\n if (shouldSelect) {\n args.extras[name] = sql\n .raw(`ST_AsGeoJSON(\"${adapter.tables[tableName][name].name}\")::jsonb`)\n .as(name)\n }\n break\n }\n\n case 'select': {\n if (select && !selectAllOnCurrentLevel) {\n if (\n (selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n }\n\n if (field.hasMany) {\n const withSelect: Result = {\n columns: {\n id: false,\n order: false,\n parent: false,\n },\n orderBy: ({ order }, { asc }) => [asc(order)],\n }\n\n currentArgs.with[`${path}${field.name}`] = withSelect\n break\n }\n\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n default: {\n if (forceWithFields) {\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n if (!select && !selectAllOnCurrentLevel) {\n break\n }\n\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n\n if (\n !withTabledFields.rels &&\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n break\n }\n }\n })\n\n return topLevelArgs\n}\n"],"names":["count","sql","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldIsVirtual","fieldShouldBeLocalized","hasDraftsEnabled","toSnakeCase","buildQuery","getTableAlias","getArrayRelationName","getNameFromDrizzleTable","jsonAggBuildObject","rawConstraint","InternalBlockTableNameIndex","resolveBlockTableName","buildPolymorphicJoinQuery","traverseFields","_locales","adapter","collectionSlug","currentArgs","currentTableName","depth","draftsEnabled","fields","forceWithFields","joinQuery","joins","locale","parentIsLocalized","path","select","selectAllOnCurrentLevel","selectMode","tablePath","topLevelArgs","topLevelTableName","versions","withTabledFields","forEach","field","isFieldLocalized","type","hasMany","relationTo","with","name","arraySelect","withArray","columns","id","_order","_parentID","orderBy","asc","arrayTableName","tableNameMap","get","tables","_locale","_uuid","arrayTableNameWithLocales","localesSuffix","relationName","tableName","flattenedFields","localized","undefined","Object","keys","length","blocksSelect","blocksAsJSON","fieldPath","blockReferences","blocks","_block","block","payload","blockKey","slug","blockSelect","blockSelectMode","Boolean","withBlock","_path","fieldSelect","joinSchemaPath","replaceAll","shouldCount","limit","limitArg","defaultLimit","page","sort","defaultSort","where","Array","isArray","collection","polymorphicJoinQuery","pageSize","extras","columnName","documents","db","drizzle","useDrafts","collections","config","joinCollectionTableName","versionsSuffix","currentIDColumn","parent","joinQueryWhere","currentIDRaw","raw","table","targetField","on","equals","value","and","latest","subQueryAlias","newAliasTable","selectFields","subQueryWhere","aliasTable","selectLocale","collectionConfig","key","val","split","pop","query","from","map","column","order","$dynamic","condition","offset","subQuery","as","countSubquery","result","args","shouldSelect","withSelect","rels","numbers","texts"],"mappings":"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"}
|