@payloadcms/drizzle 3.91.0-internal.6e3dc85 → 4.0.0-beta.0
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/LICENSE.md +1 -1
- package/dist/exports/postgres.d.ts +4 -0
- package/dist/exports/postgres.d.ts.map +1 -1
- package/dist/exports/postgres.js +4 -0
- package/dist/exports/postgres.js.map +1 -1
- package/dist/exports/sqlite.d.ts +2 -0
- package/dist/exports/sqlite.d.ts.map +1 -1
- package/dist/exports/sqlite.js +2 -0
- package/dist/exports/sqlite.js.map +1 -1
- package/dist/find/buildPolymorphicJoinQuery.d.ts +2 -1
- package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -1
- package/dist/find/buildPolymorphicJoinQuery.js +2 -1
- package/dist/find/buildPolymorphicJoinQuery.js.map +1 -1
- package/dist/find/buildPolymorphicJoinWhere.d.ts +2 -1
- package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -1
- package/dist/find/buildPolymorphicJoinWhere.js +43 -10
- package/dist/find/buildPolymorphicJoinWhere.js.map +1 -1
- package/dist/find/createPolymorphicJoinWherePlan.js +3 -2
- package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -1
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +2 -2
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/index.d.ts +4 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +41 -15
- package/dist/migrate.js.map +1 -1
- package/dist/migrateDown.d.ts +2 -1
- package/dist/migrateDown.d.ts.map +1 -1
- package/dist/migrateDown.js +17 -4
- package/dist/migrateDown.js.map +1 -1
- package/dist/migrateFresh.d.ts +4 -2
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +26 -9
- package/dist/migrateFresh.js.map +1 -1
- package/dist/migrateRefresh.d.ts +2 -1
- package/dist/migrateRefresh.d.ts.map +1 -1
- package/dist/migrateRefresh.js +20 -5
- package/dist/migrateRefresh.js.map +1 -1
- package/dist/migrateReset.d.ts +2 -1
- package/dist/migrateReset.d.ts.map +1 -1
- package/dist/migrateReset.js +18 -4
- package/dist/migrateReset.js.map +1 -1
- package/dist/migrateStatus.d.ts +2 -1
- package/dist/migrateStatus.d.ts.map +1 -1
- package/dist/migrateStatus.js +11 -6
- package/dist/migrateStatus.js.map +1 -1
- package/dist/postgres/predefinedMigrations/localize-status/index.d.ts +11 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.js +296 -0
- package/dist/postgres/predefinedMigrations/localize-status/index.js.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts +13 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js +51 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +13 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js +54 -0
- package/dist/postgres/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.d.ts.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/traverseFields.js.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/index.js.map +1 -1
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts +15 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.d.ts.map +1 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js +25 -0
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.js.map +1 -0
- package/dist/postgres/query/postgresUnaccent.d.ts +13 -0
- package/dist/postgres/query/postgresUnaccent.d.ts.map +1 -0
- package/dist/postgres/query/postgresUnaccent.js +40 -0
- package/dist/postgres/query/postgresUnaccent.js.map +1 -0
- package/dist/postgres/schema/geometryColumn.d.ts +2 -2
- package/dist/postgres/types.d.ts +13 -2
- package/dist/postgres/types.d.ts.map +1 -1
- package/dist/postgres/types.js.map +1 -1
- package/dist/queries/addJoinTable.d.ts +1 -1
- package/dist/queries/buildOperatorConstraint.d.ts +22 -0
- package/dist/queries/buildOperatorConstraint.d.ts.map +1 -0
- package/dist/queries/buildOperatorConstraint.js +63 -0
- package/dist/queries/buildOperatorConstraint.js.map +1 -0
- package/dist/queries/buildOrderBy.d.ts +1 -1
- package/dist/queries/buildOrderBy.d.ts.map +1 -1
- package/dist/queries/buildOrderBy.js +6 -1
- package/dist/queries/buildOrderBy.js.map +1 -1
- package/dist/queries/getTableColumnFromPath.d.ts +12 -3
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +52 -29
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/queries/operatorMap.d.ts +7 -3
- package/dist/queries/operatorMap.d.ts.map +1 -1
- package/dist/queries/operatorMap.js.map +1 -1
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +226 -36
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queries/resolveRelationshipPath.d.ts +36 -0
- package/dist/queries/resolveRelationshipPath.d.ts.map +1 -0
- package/dist/queries/resolveRelationshipPath.js +66 -0
- package/dist/queries/resolveRelationshipPath.js.map +1 -0
- package/dist/queries/validateOperatorHandlers.d.ts +8 -0
- package/dist/queries/validateOperatorHandlers.d.ts.map +1 -0
- package/dist/queries/validateOperatorHandlers.js +30 -0
- package/dist/queries/validateOperatorHandlers.js.map +1 -0
- package/dist/schema/traverseFields.d.ts.map +1 -1
- package/dist/schema/traverseFields.js +2 -1
- package/dist/schema/traverseFields.js.map +1 -1
- package/dist/sqlite/insert.d.ts.map +1 -1
- package/dist/sqlite/insert.js +4 -1
- package/dist/sqlite/insert.js.map +1 -1
- package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts +28 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.js +198 -0
- package/dist/sqlite/predefinedMigrations/localize-status/index.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts +12 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js +24 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainCollection.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts +12 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js +28 -0
- package/dist/sqlite/predefinedMigrations/localize-status/migrateMainGlobal.js.map +1 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/transform/read/traverseFields.js +2 -2
- package/dist/transform/read/traverseFields.js.map +1 -1
- package/dist/transform/write/blocks.js +1 -1
- package/dist/transform/write/blocks.js.map +1 -1
- package/dist/transform/write/traverseFields.js +1 -2
- package/dist/transform/write/traverseFields.js.map +1 -1
- package/dist/types.d.ts +50 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/updateJobs.d.ts.map +1 -1
- package/dist/updateJobs.js +37 -0
- package/dist/updateJobs.js.map +1 -1
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +5 -2
- package/dist/upsertRow/index.js.map +1 -1
- package/dist/upsertRow/insertArrays.d.ts.map +1 -1
- package/dist/upsertRow/insertArrays.js +2 -1
- package/dist/upsertRow/insertArrays.js.map +1 -1
- package/dist/utilities/buildCreateMigration.d.ts.map +1 -1
- package/dist/utilities/buildCreateMigration.js +12 -8
- package/dist/utilities/buildCreateMigration.js.map +1 -1
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
- package/dist/utilities/checkTruncatedIdentifiers.d.ts +1 -1
- package/dist/utilities/createSchemaGenerator.d.ts.map +1 -1
- package/dist/utilities/createSchemaGenerator.js +3 -0
- package/dist/utilities/createSchemaGenerator.js.map +1 -1
- package/dist/utilities/getPrimaryDb.d.ts +1 -1
- package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
- package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
- package/dist/utilities/getSizesToVariantsRenames.js +251 -0
- package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
- package/dist/utilities/getTransaction.d.ts +1 -1
- package/dist/utilities/getTransaction.d.ts.map +1 -1
- package/dist/utilities/validateExistingBlockIsIdentical.d.ts +1 -4
- package/dist/utilities/validateExistingBlockIsIdentical.d.ts.map +1 -1
- package/dist/utilities/validateExistingBlockIsIdentical.js.map +1 -1
- package/package.json +6 -11
- package/dist/exports/types-deprecated.d.ts +0 -150
- package/dist/exports/types-deprecated.d.ts.map +0 -1
- package/dist/exports/types-deprecated.js +0 -5
- package/dist/exports/types-deprecated.js.map +0 -1
- package/dist/find/buildPolymorphicJoinQuery.spec.js +0 -384
- package/dist/find/buildPolymorphicJoinQuery.spec.js.map +0 -1
- package/dist/find/buildPolymorphicJoinWhere.spec.js +0 -762
- package/dist/find/buildPolymorphicJoinWhere.spec.js.map +0 -1
- package/dist/find/chainMethods.d.ts +0 -20
- package/dist/find/chainMethods.d.ts.map +0 -1
- package/dist/find/chainMethods.js +0 -16
- package/dist/find/chainMethods.js.map +0 -1
- package/dist/find/createPolymorphicJoinWherePlan.spec.js +0 -897
- package/dist/find/createPolymorphicJoinWherePlan.spec.js.map +0 -1
- package/dist/schema/buildRawSchema.spec.js +0 -231
- package/dist/schema/buildRawSchema.spec.js.map +0 -1
- package/dist/sqlite/createJSONQuery/index.spec.js +0 -28
- package/dist/sqlite/createJSONQuery/index.spec.js.map +0 -1
- package/dist/updateOne.spec.js +0 -84
- package/dist/updateOne.spec.js.map +0 -1
- package/dist/upsertRow/conditionalUpdate.spec.js +0 -61
- package/dist/upsertRow/conditionalUpdate.spec.js.map +0 -1
- package/dist/upsertRow/handleUpsertError.spec.js +0 -42
- package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
- package/dist/utilities/checkTruncatedIdentifiers.spec.js +0 -301
- package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +0 -1
- package/dist/utilities/isValidStringID.spec.js +0 -15
- package/dist/utilities/isValidStringID.spec.js.map +0 -1
- package/dist/utilities/validateIdentifierLength.spec.js +0 -19
- package/dist/utilities/validateIdentifierLength.spec.js.map +0 -1
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { and, getTableName, isNotNull, isNull,
|
|
1
|
+
import { aliasedTable, and, eq, exists, getTableName, isNotNull, isNull, like, notExists, notInArray, or, sql } from 'drizzle-orm';
|
|
2
2
|
import { PgUUID } from 'drizzle-orm/pg-core';
|
|
3
3
|
import { APIError, getFieldByPath, QueryError } from 'payload';
|
|
4
|
-
import { isNestedRelationshipQuery, validOperatorSet } from 'payload/shared';
|
|
4
|
+
import { hasManyRelationshipOperatorSet, isNestedRelationshipQuery, validOperatorSet } from 'payload/shared';
|
|
5
|
+
import toSnakeCase from 'to-snake-case';
|
|
5
6
|
import { escapeSQLValue } from '../utilities/escapeSQLValue.js';
|
|
6
7
|
import { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js';
|
|
7
8
|
import { isValidStringID } from '../utilities/isValidStringID.js';
|
|
8
|
-
import { DistinctSymbol } from '../utilities/rawConstraint.js';
|
|
9
|
+
import { DistinctSymbol, isRawConstraint } from '../utilities/rawConstraint.js';
|
|
9
10
|
import { buildAndOrConditions } from './buildAndOrConditions.js';
|
|
11
|
+
import { buildOperatorConstraint } from './buildOperatorConstraint.js';
|
|
12
|
+
import { getTableAlias } from './getTableAlias.js';
|
|
10
13
|
import { getTableColumnFromPath } from './getTableColumnFromPath.js';
|
|
14
|
+
import { resolveRelationshipPath } from './resolveRelationshipPath.js';
|
|
11
15
|
import { sanitizeQueryValue } from './sanitizeQueryValue.js';
|
|
12
16
|
export function parseParams({ adapter, aliasTable, context, fields, joins, locale, parentIsLocalized, selectFields, selectLocale, tableName, where }) {
|
|
13
17
|
let result;
|
|
@@ -47,41 +51,60 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
47
51
|
const pathOperators = where[relationOrPath];
|
|
48
52
|
if (typeof pathOperators === 'object') {
|
|
49
53
|
for (let operator of Object.keys(pathOperators)){
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (operator === 'contains' && isNestedRelationshipQuery(nestedRelationshipValue)) {
|
|
56
|
-
const resolvedField = getFieldByPath({
|
|
57
|
-
fields,
|
|
58
|
-
path: relationOrPath.replace(/__/g, '.')
|
|
59
|
-
})?.field;
|
|
60
|
-
if (resolvedField && (resolvedField.type === 'relationship' || resolvedField.type === 'upload' || resolvedField.type === 'join')) {
|
|
61
|
-
const nestedCondition = parseParams({
|
|
54
|
+
if (validOperatorSet.has(operator)) {
|
|
55
|
+
const val = where[relationOrPath][operator];
|
|
56
|
+
const originalOperator = operator;
|
|
57
|
+
if (hasManyRelationshipOperatorSet.has(operator) && isNestedRelationshipQuery(val) && !isRawConstraint(val)) {
|
|
58
|
+
const relationshipPath = resolveRelationshipPath({
|
|
62
59
|
adapter,
|
|
63
|
-
aliasTable,
|
|
64
|
-
context,
|
|
65
60
|
fields,
|
|
66
|
-
joins,
|
|
67
61
|
locale,
|
|
68
62
|
parentIsLocalized,
|
|
69
|
-
|
|
70
|
-
selectLocale,
|
|
71
|
-
tableName,
|
|
72
|
-
where: prefixJoinContainsWhere({
|
|
73
|
-
prefix: relationOrPath,
|
|
74
|
-
where: nestedRelationshipValue
|
|
75
|
-
})
|
|
63
|
+
path: relationOrPath.replace(/__/g, '.')
|
|
76
64
|
});
|
|
77
|
-
if (
|
|
78
|
-
constraints.push(
|
|
65
|
+
if (relationshipPath?.field.hasMany && typeof relationshipPath.field.relationTo === 'string') {
|
|
66
|
+
constraints.push(buildHasManyRelationshipCondition({
|
|
67
|
+
adapter,
|
|
68
|
+
aliasTable,
|
|
69
|
+
fields,
|
|
70
|
+
locale,
|
|
71
|
+
operator: operator,
|
|
72
|
+
parentIsLocalized,
|
|
73
|
+
relationOrPath,
|
|
74
|
+
tableName,
|
|
75
|
+
where: val
|
|
76
|
+
}));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// A join points to many related documents. Expanding the nested query into
|
|
80
|
+
// prefixed dot-paths reuses the join's shared table alias, so every condition is
|
|
81
|
+
// evaluated against the same joined row (same-document `contains` semantics).
|
|
82
|
+
if (operator === 'contains' && !relationshipPath) {
|
|
83
|
+
const joinField = getFieldByPath({
|
|
84
|
+
fields,
|
|
85
|
+
path: relationOrPath.replace(/__/g, '.')
|
|
86
|
+
})?.field;
|
|
87
|
+
if (joinField?.type === 'join') {
|
|
88
|
+
constraints.push(parseParams({
|
|
89
|
+
adapter,
|
|
90
|
+
aliasTable,
|
|
91
|
+
context,
|
|
92
|
+
fields,
|
|
93
|
+
joins,
|
|
94
|
+
locale,
|
|
95
|
+
parentIsLocalized,
|
|
96
|
+
selectFields,
|
|
97
|
+
selectLocale,
|
|
98
|
+
tableName,
|
|
99
|
+
where: prefixJoinContainsWhere({
|
|
100
|
+
prefix: relationOrPath,
|
|
101
|
+
where: val
|
|
102
|
+
})
|
|
103
|
+
}));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
79
106
|
}
|
|
80
|
-
continue;
|
|
81
107
|
}
|
|
82
|
-
}
|
|
83
|
-
if (validOperatorSet.has(operator)) {
|
|
84
|
-
const val = where[relationOrPath][operator];
|
|
85
108
|
const { columnName, columns, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = getTableColumnFromPath({
|
|
86
109
|
adapter,
|
|
87
110
|
aliasTable,
|
|
@@ -217,7 +240,16 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
217
240
|
operator = 'equals';
|
|
218
241
|
}
|
|
219
242
|
if (operator === 'like') {
|
|
220
|
-
constraints.push(and(...val.split(' ').map((word)=>
|
|
243
|
+
constraints.push(and(...val.split(' ').map((word)=>buildOperatorConstraint({
|
|
244
|
+
adapter,
|
|
245
|
+
column: table[columnName],
|
|
246
|
+
field,
|
|
247
|
+
locale,
|
|
248
|
+
originalOperator,
|
|
249
|
+
path: relationOrPath,
|
|
250
|
+
resolvedOperator: 'like',
|
|
251
|
+
value: `%${word}%`
|
|
252
|
+
}))));
|
|
221
253
|
break;
|
|
222
254
|
}
|
|
223
255
|
const sanitizedQueryValue = sanitizeQueryValue({
|
|
@@ -255,11 +287,29 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
255
287
|
].includes(operator)) {
|
|
256
288
|
wrapOperator = and;
|
|
257
289
|
}
|
|
258
|
-
constraints.push(wrapOperator(...queryColumns.map(({ rawColumn, value })=>
|
|
290
|
+
constraints.push(wrapOperator(...queryColumns.map(({ rawColumn, value })=>buildOperatorConstraint({
|
|
291
|
+
adapter,
|
|
292
|
+
column: rawColumn,
|
|
293
|
+
field,
|
|
294
|
+
locale,
|
|
295
|
+
originalOperator,
|
|
296
|
+
path: relationOrPath,
|
|
297
|
+
resolvedOperator: queryOperator,
|
|
298
|
+
value
|
|
299
|
+
}))));
|
|
259
300
|
break;
|
|
260
301
|
}
|
|
261
302
|
if (queryOperator === 'not_equals' && queryValue !== null) {
|
|
262
|
-
constraints.push(or(isNull(resolvedColumn),
|
|
303
|
+
constraints.push(or(isNull(resolvedColumn), buildOperatorConstraint({
|
|
304
|
+
adapter,
|
|
305
|
+
column: resolvedColumn,
|
|
306
|
+
field,
|
|
307
|
+
locale,
|
|
308
|
+
originalOperator,
|
|
309
|
+
path: relationOrPath,
|
|
310
|
+
resolvedOperator: 'not_equals',
|
|
311
|
+
value: queryValue
|
|
312
|
+
})));
|
|
263
313
|
break;
|
|
264
314
|
}
|
|
265
315
|
if ((field.type === 'relationship' || field.type === 'upload') && Array.isArray(queryValue) && queryOperator === 'not_in') {
|
|
@@ -323,7 +373,16 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
323
373
|
'text'
|
|
324
374
|
].includes(field.type)) {
|
|
325
375
|
// Create OR conditions for each value in the array
|
|
326
|
-
orConditions.push(...queryValue.map((val)=>
|
|
376
|
+
orConditions.push(...queryValue.map((val)=>buildOperatorConstraint({
|
|
377
|
+
adapter,
|
|
378
|
+
column: resolvedColumn,
|
|
379
|
+
field,
|
|
380
|
+
locale,
|
|
381
|
+
originalOperator,
|
|
382
|
+
path: relationOrPath,
|
|
383
|
+
resolvedOperator: queryOperator,
|
|
384
|
+
value: val
|
|
385
|
+
})));
|
|
327
386
|
// Set constraint to combine all OR conditions
|
|
328
387
|
const constraint = orConditions.length > 0 ? or(...orConditions) : undefined;
|
|
329
388
|
if (constraint) {
|
|
@@ -331,7 +390,16 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
331
390
|
}
|
|
332
391
|
break;
|
|
333
392
|
}
|
|
334
|
-
let constraint =
|
|
393
|
+
let constraint = buildOperatorConstraint({
|
|
394
|
+
adapter,
|
|
395
|
+
column: resolvedColumn,
|
|
396
|
+
field,
|
|
397
|
+
locale,
|
|
398
|
+
originalOperator,
|
|
399
|
+
path: relationOrPath,
|
|
400
|
+
resolvedOperator: queryOperator,
|
|
401
|
+
value: resolvedQueryValue
|
|
402
|
+
});
|
|
335
403
|
if (adapter.limitedBoundParameters && (operator === 'in' || operator === 'not_in') && relationOrPath === 'id' && Array.isArray(queryValue)) {
|
|
336
404
|
let isInvalid = false;
|
|
337
405
|
for (const val of queryValue){
|
|
@@ -414,5 +482,127 @@ export function parseParams({ adapter, aliasTable, context, fields, joins, local
|
|
|
414
482
|
}
|
|
415
483
|
return prefixedWhere;
|
|
416
484
|
}
|
|
485
|
+
/**
|
|
486
|
+
* Builds a SQL condition for an operator containing a nested has-many relationship query.
|
|
487
|
+
*
|
|
488
|
+
* `contains`: at least one related document matches.
|
|
489
|
+
* `not_equals`: no related documents match.
|
|
490
|
+
* `equals`: all related documents match; an empty relationship also matches.
|
|
491
|
+
*
|
|
492
|
+
* A normal dotted relationship query adds joins to the parent query. That cannot implement
|
|
493
|
+
* the negative cases, because they must inspect all relationship rows before deciding whether to
|
|
494
|
+
* include the parent. A correlated `EXISTS` subquery keeps that decision scoped to one parent.
|
|
495
|
+
*
|
|
496
|
+
* @example
|
|
497
|
+
* ```ts
|
|
498
|
+
* // Find burgers with no unhealthy ingredients.
|
|
499
|
+
* const where = {
|
|
500
|
+
* ingredients: {
|
|
501
|
+
* not_equals: {
|
|
502
|
+
* isHealthy: { equals: false },
|
|
503
|
+
* },
|
|
504
|
+
* },
|
|
505
|
+
* }
|
|
506
|
+
* ```
|
|
507
|
+
*/ function buildHasManyRelationshipCondition({ adapter, aliasTable, fields, locale, operator, parentIsLocalized, relationOrPath, tableName, where }) {
|
|
508
|
+
const relationshipFieldPath = relationOrPath.replace(/__/g, '.');
|
|
509
|
+
if (!where || typeof where !== 'object' || Array.isArray(where)) {
|
|
510
|
+
throw new QueryError([
|
|
511
|
+
{
|
|
512
|
+
path: `${relationshipFieldPath}.${operator}`
|
|
513
|
+
}
|
|
514
|
+
]);
|
|
515
|
+
}
|
|
516
|
+
const relationshipPath = resolveRelationshipPath({
|
|
517
|
+
adapter,
|
|
518
|
+
fields,
|
|
519
|
+
locale,
|
|
520
|
+
parentIsLocalized,
|
|
521
|
+
path: relationshipFieldPath
|
|
522
|
+
});
|
|
523
|
+
if (!relationshipPath) {
|
|
524
|
+
throw new QueryError([
|
|
525
|
+
{
|
|
526
|
+
path: `${relationshipFieldPath}.${operator}`
|
|
527
|
+
}
|
|
528
|
+
]);
|
|
529
|
+
}
|
|
530
|
+
const relationshipField = relationshipPath.field;
|
|
531
|
+
if (!relationshipField.hasMany || typeof relationshipField.relationTo !== 'string') {
|
|
532
|
+
throw new QueryError([
|
|
533
|
+
{
|
|
534
|
+
path: `${relationshipFieldPath}.${operator}`
|
|
535
|
+
}
|
|
536
|
+
]);
|
|
537
|
+
}
|
|
538
|
+
// Every related document matches an empty query, including when there are no related documents.
|
|
539
|
+
if (operator === 'equals' && Object.keys(where).length === 0) {
|
|
540
|
+
return sql`true`;
|
|
541
|
+
}
|
|
542
|
+
const relationshipTableName = `${tableName}${adapter.relationshipsSuffix}`;
|
|
543
|
+
const relatedCollection = adapter.payload.collections[relationshipField.relationTo];
|
|
544
|
+
const relatedTableName = adapter.tableNameMap.get(toSnakeCase(relatedCollection.config.slug));
|
|
545
|
+
const relationshipLocale = relationshipPath.locale;
|
|
546
|
+
const { newAliasTable: relationshipTable } = getTableAlias({
|
|
547
|
+
adapter,
|
|
548
|
+
tableName: relationshipTableName
|
|
549
|
+
});
|
|
550
|
+
const { newAliasTable: relatedTable } = getTableAlias({
|
|
551
|
+
adapter,
|
|
552
|
+
tableName: relatedTableName
|
|
553
|
+
});
|
|
554
|
+
// Parse the nested `where` exactly like a normal query, but start from the related collection
|
|
555
|
+
// and keep its joins inside the subquery.
|
|
556
|
+
const nestedJoins = [];
|
|
557
|
+
const relatedDocumentWhere = Object.keys(where).length > 0 ? parseParams({
|
|
558
|
+
adapter,
|
|
559
|
+
aliasTable: relatedTable,
|
|
560
|
+
context: {
|
|
561
|
+
sort: undefined
|
|
562
|
+
},
|
|
563
|
+
fields: relatedCollection.config.flattenedFields,
|
|
564
|
+
joins: nestedJoins,
|
|
565
|
+
locale: relationshipLocale,
|
|
566
|
+
parentIsLocalized: false,
|
|
567
|
+
selectFields: {},
|
|
568
|
+
tableName: relatedTableName,
|
|
569
|
+
where
|
|
570
|
+
}) : undefined;
|
|
571
|
+
// Correlate relationship rows back to the parent document currently being considered by the
|
|
572
|
+
// outer query. The stored path distinguishes this field from other relationships on the parent.
|
|
573
|
+
const outerTable = aliasTable ?? aliasedTable(adapter.tables[tableName], tableName);
|
|
574
|
+
const relationshipRowConstraints = [
|
|
575
|
+
eq(relationshipTable.parent, outerTable.id),
|
|
576
|
+
relationshipPath.path.includes('%') ? like(relationshipTable.path, relationshipPath.path) : eq(relationshipTable.path, relationshipPath.path)
|
|
577
|
+
];
|
|
578
|
+
if (relationshipLocale && relationshipLocale !== 'all' && relationshipPath.isLocalized) {
|
|
579
|
+
relationshipRowConstraints.push(eq(relationshipTable.locale, relationshipLocale));
|
|
580
|
+
}
|
|
581
|
+
const relatedDocumentConstraints = [
|
|
582
|
+
eq(relatedTable.id, relationshipTable[`${relationshipField.relationTo}ID`])
|
|
583
|
+
];
|
|
584
|
+
if (relatedDocumentWhere) {
|
|
585
|
+
relatedDocumentConstraints.push(relatedDocumentWhere);
|
|
586
|
+
}
|
|
587
|
+
let relatedDocumentSubquery = adapter.drizzle.select({
|
|
588
|
+
id: relatedTable.id
|
|
589
|
+
}).from(relatedTable).$dynamic();
|
|
590
|
+
for (const join of nestedJoins){
|
|
591
|
+
relatedDocumentSubquery = relatedDocumentSubquery[join.type ?? 'leftJoin'](join.table, join.condition);
|
|
592
|
+
}
|
|
593
|
+
relatedDocumentSubquery = relatedDocumentSubquery.where(and(...relatedDocumentConstraints));
|
|
594
|
+
const buildRelationshipRowsSubquery = (relatedDocumentCheck)=>adapter.drizzle.select({
|
|
595
|
+
id: relationshipTable.parent
|
|
596
|
+
}).from(relationshipTable).where(and(...relationshipRowConstraints, relatedDocumentCheck));
|
|
597
|
+
switch(operator){
|
|
598
|
+
case 'contains':
|
|
599
|
+
return exists(buildRelationshipRowsSubquery(exists(relatedDocumentSubquery)));
|
|
600
|
+
case 'equals':
|
|
601
|
+
// All related documents match when no relationship row points to one that fails.
|
|
602
|
+
return notExists(buildRelationshipRowsSubquery(notExists(relatedDocumentSubquery)));
|
|
603
|
+
case 'not_equals':
|
|
604
|
+
return notExists(buildRelationshipRowsSubquery(exists(relatedDocumentSubquery)));
|
|
605
|
+
}
|
|
606
|
+
}
|
|
417
607
|
|
|
418
608
|
//# sourceMappingURL=parseParams.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { SQL, Table } from 'drizzle-orm'\nimport type { FlattenedField, Operator, Sort, Where } from 'payload'\n\nimport { and, getTableName, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm'\nimport { PgUUID } from 'drizzle-orm/pg-core'\nimport { APIError, getFieldByPath, QueryError } from 'payload'\nimport { isNestedRelationshipQuery, validOperatorSet } from 'payload/shared'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { escapeSQLValue } from '../utilities/escapeSQLValue.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { isValidStringID } from '../utilities/isValidStringID.js'\nimport { DistinctSymbol } from '../utilities/rawConstraint.js'\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { getTableColumnFromPath } from './getTableColumnFromPath.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\nexport type QueryContext = { rawSort?: SQL; sort: Sort }\n\ntype Args = {\n adapter: DrizzleAdapter\n aliasTable?: Table\n context: QueryContext\n fields: FlattenedField[]\n joins: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized: boolean\n selectFields: Record<string, GenericColumn>\n selectLocale?: boolean\n tableName: string\n where: Where\n}\n\nexport function parseParams({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where,\n}: Args): SQL {\n let result: SQL\n const constraints: SQL[] = []\n\n if (typeof where === 'object' && Object.keys(where).length > 0) {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n if (relationOrPath) {\n const condition = where[relationOrPath]\n let conditionOperator: typeof and | typeof or\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = and\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = or\n }\n if (Array.isArray(condition)) {\n const builtConditions = buildAndOrConditions({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result = conditionOperator(...builtConditions)\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n for (let operator of Object.keys(pathOperators)) {\n const nestedRelationshipValue = where[relationOrPath][operator]\n\n // A `contains` query with a nested `where` targets a has-many relationship, upload,\n // or join field. Prefix the nested paths with the relationship path and delegate\n // back to `parseParams`. Reusing the same join alias keeps every constraint scoped\n // to the SAME related document, closing a related-document oracle.\n if (operator === 'contains' && isNestedRelationshipQuery(nestedRelationshipValue)) {\n const resolvedField = getFieldByPath({\n fields,\n path: relationOrPath.replace(/__/g, '.'),\n })?.field\n\n if (\n resolvedField &&\n (resolvedField.type === 'relationship' ||\n resolvedField.type === 'upload' ||\n resolvedField.type === 'join')\n ) {\n const nestedCondition = parseParams({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where: prefixJoinContainsWhere({\n prefix: relationOrPath,\n where: nestedRelationshipValue,\n }),\n })\n\n if (nestedCondition) {\n constraints.push(nestedCondition)\n }\n\n continue\n }\n }\n\n if (validOperatorSet.has(operator as Operator)) {\n const val = where[relationOrPath][operator]\n\n const {\n columnName,\n columns,\n constraints: queryConstraints,\n field,\n getNotNullColumnByValue,\n pathSegments,\n rawColumn,\n table,\n } = getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath: relationOrPath,\n fields,\n joins,\n locale,\n parentIsLocalized,\n pathSegments: relationOrPath.replace(/__/g, '.').split('.'),\n selectFields,\n selectLocale,\n tableName,\n value: val,\n })\n\n const resolvedColumn =\n rawColumn ||\n (aliasTable && tableName === getNameFromDrizzleTable(table)\n ? aliasTable[columnName]\n : table[columnName])\n\n if (val === DistinctSymbol) {\n selectFields['_selected'] = resolvedColumn\n break\n }\n\n queryConstraints.forEach(({ columnName: col, table: constraintTable, value }) => {\n if (typeof value === 'string' && value.indexOf('%') > -1) {\n constraints.push(adapter.operators.like(constraintTable[col], value))\n } else {\n constraints.push(adapter.operators.equals(constraintTable[col], value))\n }\n })\n\n if (\n (['json', 'richText'].includes(field.type) ||\n (field.type === 'blocks' && adapter.blocksAsJSON)) &&\n Array.isArray(pathSegments) &&\n pathSegments.length > 1\n ) {\n if (adapter.name === 'postgres') {\n const constraint = adapter.createJSONQuery({\n column: rawColumn || table[columnName],\n operator,\n pathSegments,\n value: val,\n })\n\n constraints.push(sql.raw(constraint))\n break\n }\n\n const segments = pathSegments.slice(1)\n segments.unshift(table[columnName].name)\n\n if (field.type === 'richText') {\n // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg\n const jsonTable =\n joins.length === 0\n ? tableName\n : joins[joins.length - 1].table[\n Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0]\n ]\n const jsonQuery = adapter.createJSONQuery({\n operator,\n pathSegments: segments,\n table: jsonTable,\n treatAsArray: ['children'],\n treatRootAsArray: true,\n value: val,\n })\n\n constraints.push(sql.raw(jsonQuery))\n break\n }\n\n const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments)\n const operatorKeys: Record<string, { operator: string; wildcard: string }> = {\n contains: { operator: 'like', wildcard: '%' },\n equals: { operator: '=', wildcard: '' },\n exists: { operator: val === true ? 'is not null' : 'is null', wildcard: '' },\n in: { operator: 'in', wildcard: '' },\n like: { operator: 'like', wildcard: '%' },\n not_equals: { operator: '<>', wildcard: '' },\n not_in: { operator: 'not in', wildcard: '' },\n not_like: { operator: 'not like', wildcard: '%' },\n }\n\n let formattedValue = val\n if (\n adapter.name === 'sqlite' &&\n operator === 'equals' &&\n (typeof val === 'number' || typeof val === 'boolean')\n ) {\n formattedValue = val\n } else if (['in', 'not_in'].includes(operator) && Array.isArray(val)) {\n formattedValue = `(${val\n .map((v) => {\n const escaped = escapeSQLValue(v)\n return typeof v === 'string' ? `'${escaped}'` : String(escaped)\n })\n .join(',')})`\n } else {\n formattedValue = `'${operatorKeys[operator].wildcard}${escapeSQLValue(val)}${operatorKeys[operator].wildcard}'`\n }\n if (operator === 'exists') {\n formattedValue = ''\n }\n\n let jsonQuerySelector = `${table[columnName].name}${jsonQuery}`\n\n if (adapter.name === 'sqlite' && operator === 'not_like') {\n jsonQuerySelector = `COALESCE(${table[columnName].name}${jsonQuery}, '')`\n }\n\n const rawSQLQuery = `${jsonQuerySelector} ${operatorKeys[operator].operator} ${formattedValue}`\n\n constraints.push(sql.raw(rawSQLQuery))\n\n break\n }\n\n if (getNotNullColumnByValue) {\n const columnName = getNotNullColumnByValue(val)\n if (columnName) {\n constraints.push(isNotNull(table[columnName]))\n } else {\n throw new QueryError([{ path: relationOrPath }])\n }\n break\n }\n\n if (\n operator === 'like' &&\n (field.type === 'number' ||\n field.type === 'relationship' ||\n field.type === 'upload' ||\n table[columnName].columnType === 'PgUUID')\n ) {\n operator = 'equals'\n }\n\n if (operator === 'like') {\n constraints.push(\n and(\n ...val\n .split(' ')\n .map((word) => adapter.operators.like(table[columnName], `%${word}%`)),\n ),\n )\n break\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n columns,\n field,\n isUUID: table?.[columnName] instanceof PgUUID,\n operator,\n relationOrPath,\n val,\n })\n\n if (sanitizedQueryValue === null) {\n break\n }\n\n const {\n columns: queryColumns,\n operator: queryOperator,\n value: queryValue,\n } = sanitizedQueryValue\n\n // Handle polymorphic relationships by value\n if (queryColumns) {\n if (!queryColumns.length) {\n break\n }\n\n let wrapOperator = or\n\n if (queryValue === null && ['equals', 'not_equals'].includes(operator)) {\n if (operator === 'equals') {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn }) =>\n operator === 'equals' ? isNull(rawColumn) : isNotNull(rawColumn),\n ),\n ),\n )\n break\n }\n\n if (['not_equals', 'not_in'].includes(operator)) {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn, value }) =>\n adapter.operators[queryOperator](rawColumn, value),\n ),\n ),\n )\n\n break\n }\n\n if (queryOperator === 'not_equals' && queryValue !== null) {\n constraints.push(\n or(\n isNull(resolvedColumn),\n /* eslint-disable @typescript-eslint/no-explicit-any */\n ne<any>(resolvedColumn, queryValue),\n ),\n )\n break\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(queryValue) &&\n queryOperator === 'not_in'\n ) {\n constraints.push(\n sql`(${notInArray(table[columnName], queryValue)} OR\n ${table[columnName]}\n IS\n NULL)`,\n )\n\n break\n }\n\n if (operator === 'equals' && queryValue === null) {\n constraints.push(isNull(resolvedColumn))\n break\n }\n\n if (operator === 'not_equals' && queryValue === null) {\n constraints.push(isNotNull(resolvedColumn))\n break\n }\n\n if (field.type === 'point' && adapter.name === 'postgres') {\n switch (operator) {\n case 'intersects': {\n constraints.push(\n sql`ST_Intersects(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`,\n )\n break\n }\n\n case 'near': {\n const [lng, lat, maxDistance, minDistance] = queryValue as number[]\n const geoConstraints: SQL[] = []\n\n if (typeof maxDistance === 'number' && !Number.isNaN(maxDistance)) {\n geoConstraints.push(\n sql`ST_DWithin(${table[columnName]}::geography, ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)::geography, ${maxDistance})`,\n )\n }\n\n if (typeof minDistance === 'number' && !Number.isNaN(minDistance)) {\n geoConstraints.push(\n sql`ST_Distance(${table[columnName]}::geography, ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)::geography) >= ${minDistance}`,\n )\n }\n if (geoConstraints.length) {\n context.sort = relationOrPath\n context.rawSort = sql`${table[columnName]} <-> ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)`\n constraints.push(and(...geoConstraints))\n }\n break\n }\n\n case 'within': {\n constraints.push(\n sql`ST_Within(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`,\n )\n break\n }\n\n default:\n break\n }\n break\n }\n\n const orConditions: SQL<unknown>[] = []\n let resolvedQueryValue = queryValue\n if (\n operator === 'in' &&\n Array.isArray(queryValue) &&\n queryValue.some((v) => v === null)\n ) {\n orConditions.push(isNull(resolvedColumn))\n resolvedQueryValue = queryValue.filter((v) => v !== null)\n }\n\n if (\n operator === 'contains' &&\n Array.isArray(queryValue) &&\n 'hasMany' in field &&\n field.hasMany &&\n ['number', 'select', 'text'].includes(field.type)\n ) {\n // Create OR conditions for each value in the array\n orConditions.push(\n ...queryValue.map((val) =>\n adapter.operators[queryOperator](resolvedColumn, val),\n ),\n )\n // Set constraint to combine all OR conditions\n const constraint = orConditions.length > 0 ? or(...orConditions) : undefined\n if (constraint) {\n constraints.push(constraint)\n }\n break\n }\n\n let constraint = adapter.operators[queryOperator](\n resolvedColumn,\n resolvedQueryValue,\n )\n\n if (\n adapter.limitedBoundParameters &&\n (operator === 'in' || operator === 'not_in') &&\n relationOrPath === 'id' &&\n Array.isArray(queryValue)\n ) {\n let isInvalid = false\n for (const val of queryValue) {\n if (typeof val === 'number' || val === null) {\n continue\n }\n if (typeof val === 'string') {\n if (!isValidStringID(val)) {\n isInvalid = true\n break\n } else {\n continue\n }\n }\n isInvalid = true\n break\n }\n\n if (isInvalid) {\n throw new APIError(`Invalid ID value in ${JSON.stringify(queryValue)}`)\n }\n\n constraints.push(\n sql.raw(\n `\"${getTableName(resolvedColumn.table)}\".\"${resolvedColumn.name}\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${queryValue\n .map((e) => {\n if (e === null) {\n return `NULL`\n }\n\n if (typeof e === 'number') {\n return e\n }\n\n return `'${e}'`\n })\n .join(',')})`,\n ),\n )\n break\n }\n\n if (orConditions.length) {\n orConditions.push(constraint)\n constraint = or(...orConditions)\n }\n constraints.push(constraint)\n }\n }\n }\n }\n }\n }\n }\n if (constraints.length > 0) {\n if (result) {\n result = and(result, ...constraints)\n } else {\n result = and(...constraints)\n }\n }\n if (constraints.length === 1 && !result) {\n ;[result] = constraints\n }\n\n return result\n}\n\n/**\n * Prefixes every field path in a join's nested `contains` query with the join field's path, so the\n * query can be resolved through the join's shared table alias.\n *\n * @example\n * ```ts\n * prefixJoinContainsWhere({ prefix: 'comments', where: { and: [{ text: { equals: 'hi' } }] } })\n * // => { and: [{ 'comments.text': { equals: 'hi' } }] }\n * ```\n */\nfunction prefixJoinContainsWhere({ prefix, where }: { prefix: string; where: Where }): Where {\n const prefixedWhere: Where = {}\n\n for (const [key, value] of Object.entries(where)) {\n if (['and', 'or'].includes(key.toLowerCase()) && Array.isArray(value)) {\n prefixedWhere[key] = value.map((nestedWhere) =>\n prefixJoinContainsWhere({ prefix, where: nestedWhere }),\n )\n } else {\n prefixedWhere[`${prefix}.${key}`] = value\n }\n }\n\n return prefixedWhere\n}\n"],"names":["and","getTableName","isNotNull","isNull","ne","notInArray","or","sql","PgUUID","APIError","getFieldByPath","QueryError","isNestedRelationshipQuery","validOperatorSet","escapeSQLValue","getNameFromDrizzleTable","isValidStringID","DistinctSymbol","buildAndOrConditions","getTableColumnFromPath","sanitizeQueryValue","parseParams","adapter","aliasTable","context","fields","joins","locale","parentIsLocalized","selectFields","selectLocale","tableName","where","result","constraints","Object","keys","length","relationOrPath","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","pathOperators","operator","nestedRelationshipValue","resolvedField","path","replace","field","type","nestedCondition","prefixJoinContainsWhere","prefix","push","has","val","columnName","columns","queryConstraints","getNotNullColumnByValue","pathSegments","rawColumn","table","collectionPath","split","value","resolvedColumn","forEach","col","constraintTable","indexOf","operators","like","equals","includes","blocksAsJSON","name","constraint","createJSONQuery","column","raw","segments","slice","unshift","jsonTable","getOwnPropertySymbols","jsonQuery","treatAsArray","treatRootAsArray","convertPathToJSONTraversal","operatorKeys","contains","wildcard","exists","in","not_equals","not_in","not_like","formattedValue","map","v","escaped","String","join","jsonQuerySelector","rawSQLQuery","columnType","word","sanitizedQueryValue","isUUID","queryColumns","queryOperator","queryValue","wrapOperator","JSON","stringify","lng","lat","maxDistance","minDistance","geoConstraints","Number","isNaN","sort","rawSort","orConditions","resolvedQueryValue","some","filter","hasMany","undefined","limitedBoundParameters","isInvalid","e","prefixedWhere","key","entries","nestedWhere"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { SQL, Table } from 'drizzle-orm'\nimport type { FlattenedField, HasManyRelationshipOperator, Operator, Sort, Where } from 'payload'\n\nimport {\n aliasedTable,\n and,\n eq,\n exists,\n getTableName,\n isNotNull,\n isNull,\n like,\n notExists,\n notInArray,\n or,\n sql,\n} from 'drizzle-orm'\nimport { PgUUID } from 'drizzle-orm/pg-core'\nimport { APIError, getFieldByPath, QueryError } from 'payload'\nimport {\n hasManyRelationshipOperatorSet,\n isNestedRelationshipQuery,\n validOperatorSet,\n} from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\nimport type { DrizzleResolvedOperator } from './operatorMap.js'\n\nimport { escapeSQLValue } from '../utilities/escapeSQLValue.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { isValidStringID } from '../utilities/isValidStringID.js'\nimport { DistinctSymbol, isRawConstraint } from '../utilities/rawConstraint.js'\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { buildOperatorConstraint } from './buildOperatorConstraint.js'\nimport { getTableAlias } from './getTableAlias.js'\nimport { getTableColumnFromPath } from './getTableColumnFromPath.js'\nimport { resolveRelationshipPath } from './resolveRelationshipPath.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\nexport type QueryContext = { rawSort?: SQL; sort: Sort }\n\ntype Args = {\n adapter: DrizzleAdapter\n aliasTable?: Table\n context: QueryContext\n fields: FlattenedField[]\n joins: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized: boolean\n selectFields: Record<string, GenericColumn>\n selectLocale?: boolean\n tableName: string\n where: Where\n}\n\nexport function parseParams({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where,\n}: Args): SQL {\n let result: SQL\n const constraints: SQL[] = []\n\n if (typeof where === 'object' && Object.keys(where).length > 0) {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n if (relationOrPath) {\n const condition = where[relationOrPath]\n let conditionOperator: typeof and | typeof or\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = and\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = or\n }\n if (Array.isArray(condition)) {\n const builtConditions = buildAndOrConditions({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result = conditionOperator(...builtConditions)\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n for (let operator of Object.keys(pathOperators)) {\n if (validOperatorSet.has(operator as Operator)) {\n const val = where[relationOrPath][operator]\n const originalOperator = operator as Operator\n\n if (\n hasManyRelationshipOperatorSet.has(operator as HasManyRelationshipOperator) &&\n isNestedRelationshipQuery(val) &&\n !isRawConstraint(val)\n ) {\n const relationshipPath = resolveRelationshipPath({\n adapter,\n fields,\n locale,\n parentIsLocalized,\n path: relationOrPath.replace(/__/g, '.'),\n })\n\n if (\n relationshipPath?.field.hasMany &&\n typeof relationshipPath.field.relationTo === 'string'\n ) {\n constraints.push(\n buildHasManyRelationshipCondition({\n adapter,\n aliasTable,\n fields,\n locale,\n operator: operator as HasManyRelationshipOperator,\n parentIsLocalized,\n relationOrPath,\n tableName,\n where: val,\n }),\n )\n continue\n }\n\n // A join points to many related documents. Expanding the nested query into\n // prefixed dot-paths reuses the join's shared table alias, so every condition is\n // evaluated against the same joined row (same-document `contains` semantics).\n if (operator === 'contains' && !relationshipPath) {\n const joinField = getFieldByPath({\n fields,\n path: relationOrPath.replace(/__/g, '.'),\n })?.field\n\n if (joinField?.type === 'join') {\n constraints.push(\n parseParams({\n adapter,\n aliasTable,\n context,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectFields,\n selectLocale,\n tableName,\n where: prefixJoinContainsWhere({\n prefix: relationOrPath,\n where: val,\n }),\n }),\n )\n continue\n }\n }\n }\n\n const {\n columnName,\n columns,\n constraints: queryConstraints,\n field,\n getNotNullColumnByValue,\n pathSegments,\n rawColumn,\n table,\n } = getTableColumnFromPath({\n adapter,\n aliasTable,\n collectionPath: relationOrPath,\n fields,\n joins,\n locale,\n parentIsLocalized,\n pathSegments: relationOrPath.replace(/__/g, '.').split('.'),\n selectFields,\n selectLocale,\n tableName,\n value: val,\n })\n\n const resolvedColumn =\n rawColumn ||\n (aliasTable && tableName === getNameFromDrizzleTable(table)\n ? aliasTable[columnName]\n : table[columnName])\n\n if (val === DistinctSymbol) {\n selectFields['_selected'] = resolvedColumn\n break\n }\n\n queryConstraints.forEach(({ columnName: col, table: constraintTable, value }) => {\n if (typeof value === 'string' && value.indexOf('%') > -1) {\n constraints.push(adapter.operators.like(constraintTable[col], value))\n } else {\n constraints.push(adapter.operators.equals(constraintTable[col], value))\n }\n })\n\n if (\n (['json', 'richText'].includes(field.type) ||\n (field.type === 'blocks' && adapter.blocksAsJSON)) &&\n Array.isArray(pathSegments) &&\n pathSegments.length > 1\n ) {\n if (adapter.name === 'postgres') {\n const constraint = adapter.createJSONQuery({\n column: rawColumn || table[columnName],\n operator,\n pathSegments,\n value: val,\n })\n\n constraints.push(sql.raw(constraint))\n break\n }\n\n const segments = pathSegments.slice(1)\n segments.unshift(table[columnName].name)\n\n if (field.type === 'richText') {\n // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg\n const jsonTable =\n joins.length === 0\n ? tableName\n : joins[joins.length - 1].table[\n Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0]\n ]\n const jsonQuery = adapter.createJSONQuery({\n operator,\n pathSegments: segments,\n table: jsonTable,\n treatAsArray: ['children'],\n treatRootAsArray: true,\n value: val,\n })\n\n constraints.push(sql.raw(jsonQuery))\n break\n }\n\n const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments)\n const operatorKeys: Record<string, { operator: string; wildcard: string }> = {\n contains: { operator: 'like', wildcard: '%' },\n equals: { operator: '=', wildcard: '' },\n exists: { operator: val === true ? 'is not null' : 'is null', wildcard: '' },\n in: { operator: 'in', wildcard: '' },\n like: { operator: 'like', wildcard: '%' },\n not_equals: { operator: '<>', wildcard: '' },\n not_in: { operator: 'not in', wildcard: '' },\n not_like: { operator: 'not like', wildcard: '%' },\n }\n\n let formattedValue = val\n if (\n adapter.name === 'sqlite' &&\n operator === 'equals' &&\n (typeof val === 'number' || typeof val === 'boolean')\n ) {\n formattedValue = val\n } else if (['in', 'not_in'].includes(operator) && Array.isArray(val)) {\n formattedValue = `(${val\n .map((v) => {\n const escaped = escapeSQLValue(v)\n return typeof v === 'string' ? `'${escaped}'` : String(escaped)\n })\n .join(',')})`\n } else {\n formattedValue = `'${operatorKeys[operator].wildcard}${escapeSQLValue(val)}${operatorKeys[operator].wildcard}'`\n }\n if (operator === 'exists') {\n formattedValue = ''\n }\n\n let jsonQuerySelector = `${table[columnName].name}${jsonQuery}`\n\n if (adapter.name === 'sqlite' && operator === 'not_like') {\n jsonQuerySelector = `COALESCE(${table[columnName].name}${jsonQuery}, '')`\n }\n\n const rawSQLQuery = `${jsonQuerySelector} ${operatorKeys[operator].operator} ${formattedValue}`\n\n constraints.push(sql.raw(rawSQLQuery))\n\n break\n }\n\n if (getNotNullColumnByValue) {\n const columnName = getNotNullColumnByValue(val)\n if (columnName) {\n constraints.push(isNotNull(table[columnName]))\n } else {\n throw new QueryError([{ path: relationOrPath }])\n }\n break\n }\n\n if (\n operator === 'like' &&\n (field.type === 'number' ||\n field.type === 'relationship' ||\n field.type === 'upload' ||\n table[columnName].columnType === 'PgUUID')\n ) {\n operator = 'equals'\n }\n\n if (operator === 'like') {\n constraints.push(\n and(\n ...val.split(' ').map((word) =>\n buildOperatorConstraint({\n adapter,\n column: table[columnName],\n field,\n locale,\n originalOperator,\n path: relationOrPath,\n resolvedOperator: 'like',\n value: `%${word}%`,\n }),\n ),\n ),\n )\n break\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n columns,\n field,\n isUUID: table?.[columnName] instanceof PgUUID,\n operator,\n relationOrPath,\n val,\n })\n\n if (sanitizedQueryValue === null) {\n break\n }\n\n const {\n columns: queryColumns,\n operator: queryOperator,\n value: queryValue,\n } = sanitizedQueryValue\n\n // Handle polymorphic relationships by value\n if (queryColumns) {\n if (!queryColumns.length) {\n break\n }\n\n let wrapOperator = or\n\n if (queryValue === null && ['equals', 'not_equals'].includes(operator)) {\n if (operator === 'equals') {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn }) =>\n operator === 'equals' ? isNull(rawColumn) : isNotNull(rawColumn),\n ),\n ),\n )\n break\n }\n\n if (['not_equals', 'not_in'].includes(operator)) {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn, value }) =>\n buildOperatorConstraint({\n adapter,\n column: rawColumn,\n field,\n locale,\n originalOperator,\n path: relationOrPath,\n resolvedOperator: queryOperator as DrizzleResolvedOperator,\n value,\n }),\n ),\n ),\n )\n\n break\n }\n\n if (queryOperator === 'not_equals' && queryValue !== null) {\n constraints.push(\n or(\n isNull(resolvedColumn),\n buildOperatorConstraint({\n adapter,\n column: resolvedColumn,\n field,\n locale,\n originalOperator,\n path: relationOrPath,\n resolvedOperator: 'not_equals',\n value: queryValue,\n }),\n ),\n )\n break\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(queryValue) &&\n queryOperator === 'not_in'\n ) {\n constraints.push(\n sql`(${notInArray(table[columnName], queryValue)} OR\n ${table[columnName]}\n IS\n NULL)`,\n )\n\n break\n }\n\n if (operator === 'equals' && queryValue === null) {\n constraints.push(isNull(resolvedColumn))\n break\n }\n\n if (operator === 'not_equals' && queryValue === null) {\n constraints.push(isNotNull(resolvedColumn))\n break\n }\n\n if (field.type === 'point' && adapter.name === 'postgres') {\n switch (operator) {\n case 'intersects': {\n constraints.push(\n sql`ST_Intersects(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`,\n )\n break\n }\n\n case 'near': {\n const [lng, lat, maxDistance, minDistance] = queryValue as number[]\n const geoConstraints: SQL[] = []\n\n if (typeof maxDistance === 'number' && !Number.isNaN(maxDistance)) {\n geoConstraints.push(\n sql`ST_DWithin(${table[columnName]}::geography, ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)::geography, ${maxDistance})`,\n )\n }\n\n if (typeof minDistance === 'number' && !Number.isNaN(minDistance)) {\n geoConstraints.push(\n sql`ST_Distance(${table[columnName]}::geography, ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)::geography) >= ${minDistance}`,\n )\n }\n if (geoConstraints.length) {\n context.sort = relationOrPath\n context.rawSort = sql`${table[columnName]} <-> ST_SetSRID(ST_MakePoint(${lng}, ${lat}), 4326)`\n constraints.push(and(...geoConstraints))\n }\n break\n }\n\n case 'within': {\n constraints.push(\n sql`ST_Within(${table[columnName]}, ST_GeomFromGeoJSON(${JSON.stringify(queryValue)}))`,\n )\n break\n }\n\n default:\n break\n }\n break\n }\n\n const orConditions: SQL<unknown>[] = []\n let resolvedQueryValue = queryValue\n if (\n operator === 'in' &&\n Array.isArray(queryValue) &&\n queryValue.some((v) => v === null)\n ) {\n orConditions.push(isNull(resolvedColumn))\n resolvedQueryValue = queryValue.filter((v) => v !== null)\n }\n\n if (\n operator === 'contains' &&\n Array.isArray(queryValue) &&\n 'hasMany' in field &&\n field.hasMany &&\n ['number', 'select', 'text'].includes(field.type)\n ) {\n // Create OR conditions for each value in the array\n orConditions.push(\n ...queryValue.map((val) =>\n buildOperatorConstraint({\n adapter,\n column: resolvedColumn,\n field,\n locale,\n originalOperator,\n path: relationOrPath,\n resolvedOperator: queryOperator as DrizzleResolvedOperator,\n value: val,\n }),\n ),\n )\n // Set constraint to combine all OR conditions\n const constraint = orConditions.length > 0 ? or(...orConditions) : undefined\n if (constraint) {\n constraints.push(constraint)\n }\n break\n }\n\n let constraint = buildOperatorConstraint({\n adapter,\n column: resolvedColumn,\n field,\n locale,\n originalOperator,\n path: relationOrPath,\n resolvedOperator: queryOperator as DrizzleResolvedOperator,\n value: resolvedQueryValue,\n })\n\n if (\n adapter.limitedBoundParameters &&\n (operator === 'in' || operator === 'not_in') &&\n relationOrPath === 'id' &&\n Array.isArray(queryValue)\n ) {\n let isInvalid = false\n for (const val of queryValue) {\n if (typeof val === 'number' || val === null) {\n continue\n }\n if (typeof val === 'string') {\n if (!isValidStringID(val)) {\n isInvalid = true\n break\n } else {\n continue\n }\n }\n isInvalid = true\n break\n }\n\n if (isInvalid) {\n throw new APIError(`Invalid ID value in ${JSON.stringify(queryValue)}`)\n }\n\n constraints.push(\n sql.raw(\n `\"${getTableName(resolvedColumn.table)}\".\"${resolvedColumn.name}\" ${operator === 'in' ? 'IN' : 'NOT IN'} (${queryValue\n .map((e) => {\n if (e === null) {\n return `NULL`\n }\n\n if (typeof e === 'number') {\n return e\n }\n\n return `'${e}'`\n })\n .join(',')})`,\n ),\n )\n break\n }\n\n if (orConditions.length) {\n orConditions.push(constraint)\n constraint = or(...orConditions)\n }\n constraints.push(constraint)\n }\n }\n }\n }\n }\n }\n }\n if (constraints.length > 0) {\n if (result) {\n result = and(result, ...constraints)\n } else {\n result = and(...constraints)\n }\n }\n if (constraints.length === 1 && !result) {\n ;[result] = constraints\n }\n\n return result\n}\n\n/**\n * Prefixes every field path in a join's nested `contains` query with the join field's path, so the\n * query can be resolved through the join's shared table alias.\n *\n * @example\n * ```ts\n * prefixJoinContainsWhere({ prefix: 'comments', where: { and: [{ text: { equals: 'hi' } }] } })\n * // => { and: [{ 'comments.text': { equals: 'hi' } }] }\n * ```\n */\nfunction prefixJoinContainsWhere({ prefix, where }: { prefix: string; where: Where }): Where {\n const prefixedWhere: Where = {}\n\n for (const [key, value] of Object.entries(where)) {\n if (['and', 'or'].includes(key.toLowerCase()) && Array.isArray(value)) {\n prefixedWhere[key] = value.map((nestedWhere) =>\n prefixJoinContainsWhere({ prefix, where: nestedWhere }),\n )\n } else {\n prefixedWhere[`${prefix}.${key}`] = value\n }\n }\n\n return prefixedWhere\n}\n\n/**\n * Builds a SQL condition for an operator containing a nested has-many relationship query.\n *\n * `contains`: at least one related document matches.\n * `not_equals`: no related documents match.\n * `equals`: all related documents match; an empty relationship also matches.\n *\n * A normal dotted relationship query adds joins to the parent query. That cannot implement\n * the negative cases, because they must inspect all relationship rows before deciding whether to\n * include the parent. A correlated `EXISTS` subquery keeps that decision scoped to one parent.\n *\n * @example\n * ```ts\n * // Find burgers with no unhealthy ingredients.\n * const where = {\n * ingredients: {\n * not_equals: {\n * isHealthy: { equals: false },\n * },\n * },\n * }\n * ```\n */\nfunction buildHasManyRelationshipCondition({\n adapter,\n aliasTable,\n fields,\n locale,\n operator,\n parentIsLocalized,\n relationOrPath,\n tableName,\n where,\n}: {\n adapter: DrizzleAdapter\n aliasTable?: Table\n fields: FlattenedField[]\n locale?: string\n operator: HasManyRelationshipOperator\n parentIsLocalized: boolean\n relationOrPath: string\n tableName: string\n where: Where\n}): SQL {\n const relationshipFieldPath = relationOrPath.replace(/__/g, '.')\n\n if (!where || typeof where !== 'object' || Array.isArray(where)) {\n throw new QueryError([{ path: `${relationshipFieldPath}.${operator}` }])\n }\n\n const relationshipPath = resolveRelationshipPath({\n adapter,\n fields,\n locale,\n parentIsLocalized,\n path: relationshipFieldPath,\n })\n\n if (!relationshipPath) {\n throw new QueryError([{ path: `${relationshipFieldPath}.${operator}` }])\n }\n\n const relationshipField = relationshipPath.field\n\n if (!relationshipField.hasMany || typeof relationshipField.relationTo !== 'string') {\n throw new QueryError([{ path: `${relationshipFieldPath}.${operator}` }])\n }\n\n // Every related document matches an empty query, including when there are no related documents.\n if (operator === 'equals' && Object.keys(where).length === 0) {\n return sql`true`\n }\n\n const relationshipTableName = `${tableName}${adapter.relationshipsSuffix}`\n const relatedCollection = adapter.payload.collections[relationshipField.relationTo]\n const relatedTableName = adapter.tableNameMap.get(toSnakeCase(relatedCollection.config.slug))\n const relationshipLocale = relationshipPath.locale\n const { newAliasTable: relationshipTable } = getTableAlias({\n adapter,\n tableName: relationshipTableName,\n })\n const { newAliasTable: relatedTable } = getTableAlias({\n adapter,\n tableName: relatedTableName,\n })\n\n // Parse the nested `where` exactly like a normal query, but start from the related collection\n // and keep its joins inside the subquery.\n const nestedJoins: BuildQueryJoinAliases = []\n const relatedDocumentWhere =\n Object.keys(where).length > 0\n ? parseParams({\n adapter,\n aliasTable: relatedTable,\n context: { sort: undefined },\n fields: relatedCollection.config.flattenedFields,\n joins: nestedJoins,\n locale: relationshipLocale,\n parentIsLocalized: false,\n selectFields: {},\n tableName: relatedTableName,\n where,\n })\n : undefined\n\n // Correlate relationship rows back to the parent document currently being considered by the\n // outer query. The stored path distinguishes this field from other relationships on the parent.\n const outerTable = aliasTable ?? aliasedTable(adapter.tables[tableName], tableName)\n const relationshipRowConstraints: SQL[] = [\n eq(relationshipTable.parent, outerTable.id),\n relationshipPath.path.includes('%')\n ? like(relationshipTable.path, relationshipPath.path)\n : eq(relationshipTable.path, relationshipPath.path),\n ]\n\n if (relationshipLocale && relationshipLocale !== 'all' && relationshipPath.isLocalized) {\n relationshipRowConstraints.push(eq(relationshipTable.locale, relationshipLocale))\n }\n\n const relatedDocumentConstraints = [\n eq(relatedTable.id, relationshipTable[`${relationshipField.relationTo}ID`]),\n ]\n\n if (relatedDocumentWhere) {\n relatedDocumentConstraints.push(relatedDocumentWhere)\n }\n\n let relatedDocumentSubquery = (adapter.drizzle as any)\n .select({ id: relatedTable.id })\n .from(relatedTable)\n .$dynamic()\n\n for (const join of nestedJoins) {\n relatedDocumentSubquery = relatedDocumentSubquery[join.type ?? 'leftJoin'](\n join.table,\n join.condition,\n )\n }\n\n relatedDocumentSubquery = relatedDocumentSubquery.where(and(...relatedDocumentConstraints))\n\n const buildRelationshipRowsSubquery = (relatedDocumentCheck: SQL) =>\n (adapter.drizzle as any)\n .select({ id: relationshipTable.parent })\n .from(relationshipTable)\n .where(and(...relationshipRowConstraints, relatedDocumentCheck))\n\n switch (operator) {\n case 'contains':\n return exists(buildRelationshipRowsSubquery(exists(relatedDocumentSubquery)))\n\n case 'equals':\n // All related documents match when no relationship row points to one that fails.\n return notExists(buildRelationshipRowsSubquery(notExists(relatedDocumentSubquery)))\n\n case 'not_equals':\n return notExists(buildRelationshipRowsSubquery(exists(relatedDocumentSubquery)))\n }\n}\n"],"names":["aliasedTable","and","eq","exists","getTableName","isNotNull","isNull","like","notExists","notInArray","or","sql","PgUUID","APIError","getFieldByPath","QueryError","hasManyRelationshipOperatorSet","isNestedRelationshipQuery","validOperatorSet","toSnakeCase","escapeSQLValue","getNameFromDrizzleTable","isValidStringID","DistinctSymbol","isRawConstraint","buildAndOrConditions","buildOperatorConstraint","getTableAlias","getTableColumnFromPath","resolveRelationshipPath","sanitizeQueryValue","parseParams","adapter","aliasTable","context","fields","joins","locale","parentIsLocalized","selectFields","selectLocale","tableName","where","result","constraints","Object","keys","length","relationOrPath","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","pathOperators","operator","has","val","originalOperator","relationshipPath","path","replace","field","hasMany","relationTo","push","buildHasManyRelationshipCondition","joinField","type","prefixJoinContainsWhere","prefix","columnName","columns","queryConstraints","getNotNullColumnByValue","pathSegments","rawColumn","table","collectionPath","split","value","resolvedColumn","forEach","col","constraintTable","indexOf","operators","equals","includes","blocksAsJSON","name","constraint","createJSONQuery","column","raw","segments","slice","unshift","jsonTable","getOwnPropertySymbols","jsonQuery","treatAsArray","treatRootAsArray","convertPathToJSONTraversal","operatorKeys","contains","wildcard","in","not_equals","not_in","not_like","formattedValue","map","v","escaped","String","join","jsonQuerySelector","rawSQLQuery","columnType","word","resolvedOperator","sanitizedQueryValue","isUUID","queryColumns","queryOperator","queryValue","wrapOperator","JSON","stringify","lng","lat","maxDistance","minDistance","geoConstraints","Number","isNaN","sort","rawSort","orConditions","resolvedQueryValue","some","filter","undefined","limitedBoundParameters","isInvalid","e","prefixedWhere","key","entries","nestedWhere","relationshipFieldPath","relationshipField","relationshipTableName","relationshipsSuffix","relatedCollection","payload","collections","relatedTableName","tableNameMap","get","config","slug","relationshipLocale","newAliasTable","relationshipTable","relatedTable","nestedJoins","relatedDocumentWhere","flattenedFields","outerTable","tables","relationshipRowConstraints","parent","id","isLocalized","relatedDocumentConstraints","relatedDocumentSubquery","drizzle","select","from","$dynamic","buildRelationshipRowsSubquery","relatedDocumentCheck"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FlattenedField, RelationshipField, UploadField } from 'payload';
|
|
2
|
+
import type { DrizzleAdapter } from '../types.js';
|
|
3
|
+
type ResolvedRelationshipPath = {
|
|
4
|
+
field: RelationshipField | UploadField;
|
|
5
|
+
isLocalized: boolean;
|
|
6
|
+
locale?: string;
|
|
7
|
+
path: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Adds a field to the path used by Drizzle's shared relationship, text, and number tables.
|
|
11
|
+
* Array and block entries are stored with a numeric position, represented by `%` while querying.
|
|
12
|
+
*
|
|
13
|
+
* @example `blocks` becomes `blocks.%` and then `directors` becomes
|
|
14
|
+
* `blocks.%.directors`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function appendFieldToStoragePath({ field, path, }: {
|
|
17
|
+
field: FlattenedField;
|
|
18
|
+
path?: string;
|
|
19
|
+
}): string;
|
|
20
|
+
/**
|
|
21
|
+
* Resolves a schema path to the relationship field and the path stored in the collection's shared
|
|
22
|
+
* relationships table. This understands groups, tabs, arrays, blocks, and explicit locale
|
|
23
|
+
* segments.
|
|
24
|
+
*
|
|
25
|
+
* @example `blocks.directors` resolves to the stored path `blocks.%.directors`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveRelationshipPath({ adapter, fields, locale, parentIsLocalized, path, pathPrefix, }: {
|
|
28
|
+
adapter: DrizzleAdapter;
|
|
29
|
+
fields: FlattenedField[];
|
|
30
|
+
locale?: string;
|
|
31
|
+
parentIsLocalized: boolean;
|
|
32
|
+
path: string;
|
|
33
|
+
pathPrefix?: string;
|
|
34
|
+
}): null | ResolvedRelationshipPath;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=resolveRelationshipPath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveRelationshipPath.d.ts","sourceRoot":"","sources":["../../src/queries/resolveRelationshipPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,iBAAiB,GAAG,WAAW,CAAA;IACtC,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,IAAS,GACV,EAAE;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,MAAM,CAQT;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,MAAM,EACN,MAAM,EACN,iBAAiB,EACjB,IAAI,EACJ,UAAe,GAChB,EAAE;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,IAAI,GAAG,wBAAwB,CAiDlC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adds a field to the path used by Drizzle's shared relationship, text, and number tables.
|
|
3
|
+
* Array and block entries are stored with a numeric position, represented by `%` while querying.
|
|
4
|
+
*
|
|
5
|
+
* @example `blocks` becomes `blocks.%` and then `directors` becomes
|
|
6
|
+
* `blocks.%.directors`.
|
|
7
|
+
*/ export function appendFieldToStoragePath({ field, path = '' }) {
|
|
8
|
+
const pathSegments = path ? [
|
|
9
|
+
path.replace(/\.$/, ''),
|
|
10
|
+
field.name
|
|
11
|
+
] : [
|
|
12
|
+
field.name
|
|
13
|
+
];
|
|
14
|
+
if (field.type === 'array' || field.type === 'blocks') {
|
|
15
|
+
pathSegments.push('%');
|
|
16
|
+
}
|
|
17
|
+
return pathSegments.join('.');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolves a schema path to the relationship field and the path stored in the collection's shared
|
|
21
|
+
* relationships table. This understands groups, tabs, arrays, blocks, and explicit locale
|
|
22
|
+
* segments.
|
|
23
|
+
*
|
|
24
|
+
* @example `blocks.directors` resolves to the stored path `blocks.%.directors`.
|
|
25
|
+
*/ export function resolveRelationshipPath({ adapter, fields, locale, parentIsLocalized, path, pathPrefix = '' }) {
|
|
26
|
+
const localeCodes = adapter.payload.config.localization ? adapter.payload.config.localization.localeCodes : [];
|
|
27
|
+
const pathSegments = path.split('.');
|
|
28
|
+
let currentField;
|
|
29
|
+
let currentFields = fields;
|
|
30
|
+
let isLocalized = parentIsLocalized;
|
|
31
|
+
let resolvedPath = pathPrefix;
|
|
32
|
+
for (const segment of pathSegments){
|
|
33
|
+
const field = currentFields.find(({ name })=>name === segment);
|
|
34
|
+
if (!field && isLocalized && localeCodes.includes(segment)) {
|
|
35
|
+
locale = segment;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (!field) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
currentField = field;
|
|
42
|
+
resolvedPath = appendFieldToStoragePath({
|
|
43
|
+
field,
|
|
44
|
+
path: resolvedPath
|
|
45
|
+
});
|
|
46
|
+
isLocalized = isLocalized || Boolean(field.localized);
|
|
47
|
+
if ('flattenedFields' in field) {
|
|
48
|
+
currentFields = field.flattenedFields;
|
|
49
|
+
} else if (field.type === 'blocks') {
|
|
50
|
+
currentFields = field.blocks.flatMap((block)=>typeof block === 'string' ? adapter.payload.blocks[block].flattenedFields : block.flattenedFields);
|
|
51
|
+
} else {
|
|
52
|
+
currentFields = [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!currentField || currentField.type !== 'relationship' && currentField.type !== 'upload') {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
field: currentField,
|
|
60
|
+
isLocalized,
|
|
61
|
+
locale,
|
|
62
|
+
path: resolvedPath
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=resolveRelationshipPath.js.map
|