@payloadcms/db-mongodb 4.0.0-internal.fec2230 → 4.0.0-internal.ff27d6e
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/connect.d.ts.map +1 -1
- package/dist/connect.js +9 -2
- package/dist/connect.js.map +1 -1
- package/dist/count.d.ts.map +1 -1
- package/dist/count.js +33 -4
- package/dist/count.js.map +1 -1
- package/dist/countGlobalVersions.d.ts.map +1 -1
- package/dist/countGlobalVersions.js +10 -2
- package/dist/countGlobalVersions.js.map +1 -1
- package/dist/countVersions.d.ts.map +1 -1
- package/dist/countVersions.js +36 -4
- package/dist/countVersions.js.map +1 -1
- package/dist/createGlobalVersion.d.ts +1 -1
- package/dist/createGlobalVersion.d.ts.map +1 -1
- package/dist/createGlobalVersion.js +24 -1
- package/dist/createGlobalVersion.js.map +1 -1
- package/dist/createVersion.d.ts.map +1 -1
- package/dist/createVersion.js +16 -3
- package/dist/createVersion.js.map +1 -1
- package/dist/deleteBranchGlobal.d.ts +10 -0
- package/dist/deleteBranchGlobal.d.ts.map +1 -0
- package/dist/deleteBranchGlobal.js +26 -0
- package/dist/deleteBranchGlobal.js.map +1 -0
- package/dist/deleteMany.d.ts.map +1 -1
- package/dist/deleteMany.js +1 -0
- package/dist/deleteMany.js.map +1 -1
- package/dist/deleteOne.d.ts.map +1 -1
- package/dist/deleteOne.js +20 -1
- package/dist/deleteOne.js.map +1 -1
- package/dist/deleteVersions.d.ts.map +1 -1
- package/dist/deleteVersions.js +1 -0
- package/dist/deleteVersions.js.map +1 -1
- package/dist/exports/migration-utils.d.ts +2 -0
- package/dist/exports/migration-utils.d.ts.map +1 -1
- package/dist/exports/migration-utils.js +2 -0
- package/dist/exports/migration-utils.js.map +1 -1
- package/dist/find.d.ts.map +1 -1
- package/dist/find.js +44 -8
- package/dist/find.js.map +1 -1
- package/dist/findDistinct.d.ts.map +1 -1
- package/dist/findDistinct.js +115 -12
- package/dist/findDistinct.js.map +1 -1
- package/dist/findGlobal.d.ts.map +1 -1
- package/dist/findGlobal.js +48 -9
- package/dist/findGlobal.js.map +1 -1
- package/dist/findGlobalVersions.d.ts.map +1 -1
- package/dist/findGlobalVersions.js +10 -2
- package/dist/findGlobalVersions.js.map +1 -1
- package/dist/findOne.d.ts.map +1 -1
- package/dist/findOne.js +43 -5
- package/dist/findOne.js.map +1 -1
- package/dist/findVersions.d.ts.map +1 -1
- package/dist/findVersions.js +49 -5
- package/dist/findVersions.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +89 -67
- package/dist/init.js.map +1 -1
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +1 -0
- package/dist/migrateFresh.js.map +1 -1
- package/dist/models/buildCollectionSchema.d.ts +8 -2
- package/dist/models/buildCollectionSchema.d.ts.map +1 -1
- package/dist/models/buildCollectionSchema.js +4 -2
- package/dist/models/buildCollectionSchema.js.map +1 -1
- package/dist/models/buildGlobalModel.d.ts +5 -1
- package/dist/models/buildGlobalModel.d.ts.map +1 -1
- package/dist/models/buildGlobalModel.js +34 -3
- package/dist/models/buildGlobalModel.js.map +1 -1
- package/dist/models/buildSchema.d.ts +4 -0
- package/dist/models/buildSchema.d.ts.map +1 -1
- package/dist/models/buildSchema.js +100 -36
- package/dist/models/buildSchema.js.map +1 -1
- package/dist/models/schemaBuildContext.d.ts +21 -0
- package/dist/models/schemaBuildContext.d.ts.map +1 -0
- package/dist/models/schemaBuildContext.js +29 -0
- package/dist/models/schemaBuildContext.js.map +1 -0
- package/dist/predefinedMigrations/branching.d.ts +4 -0
- package/dist/predefinedMigrations/branching.d.ts.map +1 -0
- package/dist/predefinedMigrations/branching.js +9 -0
- package/dist/predefinedMigrations/branching.js.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts +17 -0
- package/dist/predefinedMigrations/migrateBranching.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateBranching.js +90 -0
- package/dist/predefinedMigrations/migrateBranching.js.map +1 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts +13 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.d.ts.map +1 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js +368 -0
- package/dist/predefinedMigrations/migrateSizesToVariants.js.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts +5 -0
- package/dist/predefinedMigrations/sizes-to-variants.d.ts.map +1 -0
- package/dist/predefinedMigrations/sizes-to-variants.js +8 -0
- package/dist/predefinedMigrations/sizes-to-variants.js.map +1 -0
- package/dist/queries/buildAndOrConditions.d.ts +4 -2
- package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
- package/dist/queries/buildAndOrConditions.js +3 -1
- package/dist/queries/buildAndOrConditions.js.map +1 -1
- package/dist/queries/buildBranchVisibility.d.ts +11 -0
- package/dist/queries/buildBranchVisibility.d.ts.map +1 -0
- package/dist/queries/buildBranchVisibility.js +204 -0
- package/dist/queries/buildBranchVisibility.js.map +1 -0
- package/dist/queries/buildQuery.d.ts +4 -2
- package/dist/queries/buildQuery.d.ts.map +1 -1
- package/dist/queries/buildQuery.js +3 -1
- package/dist/queries/buildQuery.js.map +1 -1
- package/dist/queries/buildRelatedQueryPipeline.d.ts +7 -0
- package/dist/queries/buildRelatedQueryPipeline.d.ts.map +1 -0
- package/dist/queries/buildRelatedQueryPipeline.js +56 -0
- package/dist/queries/buildRelatedQueryPipeline.js.map +1 -0
- package/dist/queries/buildSearchParams.d.ts +4 -2
- package/dist/queries/buildSearchParams.d.ts.map +1 -1
- package/dist/queries/buildSearchParams.js +223 -41
- package/dist/queries/buildSearchParams.js.map +1 -1
- package/dist/queries/getBuildQueryPlugin.d.ts +3 -1
- package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -1
- package/dist/queries/getBuildQueryPlugin.js +3 -1
- package/dist/queries/getBuildQueryPlugin.js.map +1 -1
- package/dist/queries/parseParams.d.ts +4 -2
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +5 -1
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/queryDrafts.d.ts.map +1 -1
- package/dist/queryDrafts.js +39 -7
- package/dist/queryDrafts.js.map +1 -1
- package/dist/transactions/commitTransaction.d.ts.map +1 -1
- package/dist/transactions/commitTransaction.js +68 -7
- package/dist/transactions/commitTransaction.js.map +1 -1
- package/dist/transactions/rollbackTransaction.d.ts.map +1 -1
- package/dist/transactions/rollbackTransaction.js +10 -9
- package/dist/transactions/rollbackTransaction.js.map +1 -1
- package/dist/updateGlobal.d.ts.map +1 -1
- package/dist/updateGlobal.js +91 -9
- package/dist/updateGlobal.js.map +1 -1
- package/dist/updateGlobalVersion.d.ts.map +1 -1
- package/dist/updateGlobalVersion.js +3 -2
- package/dist/updateGlobalVersion.js.map +1 -1
- package/dist/updateJobs.js +1 -1
- package/dist/updateJobs.js.map +1 -1
- package/dist/updateMany.d.ts.map +1 -1
- package/dist/updateMany.js +3 -2
- package/dist/updateMany.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +30 -4
- package/dist/updateOne.js.map +1 -1
- package/dist/updateVersion.d.ts.map +1 -1
- package/dist/updateVersion.js +3 -2
- package/dist/updateVersion.js.map +1 -1
- package/dist/upsertBranchGlobalChange.d.ts +3 -0
- package/dist/upsertBranchGlobalChange.d.ts.map +1 -0
- package/dist/upsertBranchGlobalChange.js +28 -0
- package/dist/upsertBranchGlobalChange.js.map +1 -0
- package/dist/utilities/aggregatePaginate.d.ts +2 -1
- package/dist/utilities/aggregatePaginate.d.ts.map +1 -1
- package/dist/utilities/aggregatePaginate.js +21 -5
- package/dist/utilities/aggregatePaginate.js.map +1 -1
- package/dist/utilities/buildJoinAggregation.d.ts +4 -2
- package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
- package/dist/utilities/buildJoinAggregation.js +158 -24
- package/dist/utilities/buildJoinAggregation.js.map +1 -1
- package/dist/utilities/resolveJoins.d.ts +6 -2
- package/dist/utilities/resolveJoins.d.ts.map +1 -1
- package/dist/utilities/resolveJoins.js +115 -26
- package/dist/utilities/resolveJoins.js.map +1 -1
- package/package.json +16 -19
- package/dist/queries/buildSortParam.spec.js +0 -123
- package/dist/queries/buildSortParam.spec.js.map +0 -1
- package/dist/queries/getLocalizedSortProperty.spec.js +0 -215
- package/dist/queries/getLocalizedSortProperty.spec.js.map +0 -1
- package/dist/utilities/transform.spec.js +0 -546
- package/dist/utilities/transform.spec.js.map +0 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { APIError, appendVersionToQueryKey, buildVersionCollectionFields, combineQueries, getQueryDraftsSort } from 'payload';
|
|
1
|
+
import { APIError, appendVersionToQueryKey, buildVersionCollectionFields, combineQueries, getBranchPredicateSync, getQueryDraftsSort, resolveBranchReadState, resolveBranchVersionQuery, rewriteBranchIDs, rewriteBranchVersionParents } from 'payload';
|
|
2
2
|
import { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared';
|
|
3
|
+
import { buildBranchVisibilityStages } from '../queries/buildBranchVisibility.js';
|
|
3
4
|
import { buildQuery } from '../queries/buildQuery.js';
|
|
4
5
|
import { buildSortParam } from '../queries/buildSortParam.js';
|
|
5
6
|
import { getCollection } from './getEntity.js';
|
|
6
|
-
export const buildJoinAggregation = async ({ adapter, collection, collectionConfig, draftsEnabled, joins, locale, projection, versions })=>{
|
|
7
|
+
export const buildJoinAggregation = async ({ adapter, branch, collection, collectionConfig, draftsEnabled, joins, locale, projection, req, versions })=>{
|
|
7
8
|
if (!adapter.useJoinAggregations) {
|
|
8
9
|
return [];
|
|
9
10
|
}
|
|
@@ -15,6 +16,17 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
15
16
|
throw new APIError(`Could not retrieve sanitized join config for ${collection}.`);
|
|
16
17
|
}
|
|
17
18
|
const aggregate = [];
|
|
19
|
+
const outerBranchReadState = resolveBranchReadState({
|
|
20
|
+
branch,
|
|
21
|
+
collectionSlug: collection,
|
|
22
|
+
req
|
|
23
|
+
});
|
|
24
|
+
const canonicalParentField = '__payloadJoinParentID';
|
|
25
|
+
let localField = versions ? 'parent' : '_id';
|
|
26
|
+
if (outerBranchReadState.useBranching) {
|
|
27
|
+
localField = canonicalParentField;
|
|
28
|
+
}
|
|
29
|
+
const rootIDExpression = outerBranchReadState.useBranching ? `$${canonicalParentField}` : '$_id';
|
|
18
30
|
const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins;
|
|
19
31
|
if (!polymorphicJoinsConfig) {
|
|
20
32
|
throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`);
|
|
@@ -49,8 +61,10 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
49
61
|
});
|
|
50
62
|
const $match = await buildQuery({
|
|
51
63
|
adapter,
|
|
64
|
+
branch,
|
|
52
65
|
fields: aggregatedFields,
|
|
53
66
|
locale,
|
|
67
|
+
req,
|
|
54
68
|
where: whereJoin
|
|
55
69
|
});
|
|
56
70
|
const sortProperty = Object.keys(sort)[0]// assert because buildSortParam always returns at least 1 key.
|
|
@@ -62,6 +76,29 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
62
76
|
for (const collectionSlug of join.field.collection){
|
|
63
77
|
const alias = `${as}.docs.${collectionSlug}`;
|
|
64
78
|
aliases.push(alias);
|
|
79
|
+
const joinBranchPredicate = getBranchPredicateSync({
|
|
80
|
+
branch,
|
|
81
|
+
collectionSlug,
|
|
82
|
+
req
|
|
83
|
+
});
|
|
84
|
+
const joinBranchReadState = resolveBranchReadState({
|
|
85
|
+
branch,
|
|
86
|
+
collectionSlug,
|
|
87
|
+
req
|
|
88
|
+
});
|
|
89
|
+
const branchMatch = joinBranchPredicate ? await buildQuery({
|
|
90
|
+
adapter,
|
|
91
|
+
branch,
|
|
92
|
+
fields: adapter.payload.collections[collectionSlug].config.flattenedFields,
|
|
93
|
+
locale,
|
|
94
|
+
req,
|
|
95
|
+
where: joinBranchPredicate
|
|
96
|
+
}) : undefined;
|
|
97
|
+
const branchVisibility = joinBranchReadState.useBranching ? buildBranchVisibilityStages({
|
|
98
|
+
adapter,
|
|
99
|
+
branch: joinBranchReadState.branch,
|
|
100
|
+
collectionSlug
|
|
101
|
+
}) : [];
|
|
65
102
|
const basePipeline = [
|
|
66
103
|
{
|
|
67
104
|
$addFields: {
|
|
@@ -81,10 +118,26 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
81
118
|
]
|
|
82
119
|
}
|
|
83
120
|
},
|
|
84
|
-
$match
|
|
121
|
+
$match,
|
|
122
|
+
...branchMatch ? [
|
|
123
|
+
branchMatch
|
|
124
|
+
] : []
|
|
85
125
|
]
|
|
86
126
|
}
|
|
87
|
-
}
|
|
127
|
+
},
|
|
128
|
+
...branchVisibility,
|
|
129
|
+
...joinBranchPredicate || branchVisibility.length ? [
|
|
130
|
+
{
|
|
131
|
+
$set: {
|
|
132
|
+
_id: {
|
|
133
|
+
$ifNull: [
|
|
134
|
+
'$_branchDocID',
|
|
135
|
+
'$_id'
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
] : []
|
|
88
141
|
];
|
|
89
142
|
const { Model: JoinModel } = getCollection({
|
|
90
143
|
adapter,
|
|
@@ -95,7 +148,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
95
148
|
as: alias,
|
|
96
149
|
from: JoinModel.collection.name,
|
|
97
150
|
let: {
|
|
98
|
-
root_id_:
|
|
151
|
+
root_id_: rootIDExpression
|
|
99
152
|
},
|
|
100
153
|
pipeline: [
|
|
101
154
|
...basePipeline,
|
|
@@ -104,10 +157,12 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
104
157
|
[sortProperty]: sortDirection
|
|
105
158
|
}
|
|
106
159
|
},
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
160
|
+
...limitJoin > 0 ? [
|
|
161
|
+
{
|
|
162
|
+
// Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then
|
|
163
|
+
$limit: page ? page * limitJoin : limitJoin
|
|
164
|
+
}
|
|
165
|
+
] : [],
|
|
111
166
|
{
|
|
112
167
|
$project: {
|
|
113
168
|
value: '$_id',
|
|
@@ -126,7 +181,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
126
181
|
as: `${as}.totalDocs.${alias}`,
|
|
127
182
|
from: JoinModel.collection.name,
|
|
128
183
|
let: {
|
|
129
|
-
root_id_:
|
|
184
|
+
root_id_: rootIDExpression
|
|
130
185
|
},
|
|
131
186
|
pipeline: [
|
|
132
187
|
...basePipeline,
|
|
@@ -191,16 +246,18 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
191
246
|
}
|
|
192
247
|
}
|
|
193
248
|
});
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
249
|
+
if (limitJoin > 0) {
|
|
250
|
+
aggregate.push({
|
|
251
|
+
$set: {
|
|
252
|
+
[`${as}.docs`]: {
|
|
253
|
+
$slice: [
|
|
254
|
+
`$${as}.docs`,
|
|
255
|
+
...sliceValue
|
|
256
|
+
]
|
|
257
|
+
}
|
|
201
258
|
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
204
261
|
}
|
|
205
262
|
for (const slug of Object.keys(joinConfig)){
|
|
206
263
|
const joinsList = joinConfig[slug];
|
|
@@ -247,19 +304,75 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
247
304
|
});
|
|
248
305
|
const sortProperty = Object.keys(sort)[0];
|
|
249
306
|
const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1;
|
|
307
|
+
// A join subquery must carry the same branch predicate as the top-level
|
|
308
|
+
// read, or a branch would see main's related documents.
|
|
309
|
+
const joinBranchPredicate = getBranchPredicateSync({
|
|
310
|
+
branch,
|
|
311
|
+
collectionSlug: collectionConfig.slug,
|
|
312
|
+
req
|
|
313
|
+
});
|
|
314
|
+
const joinBranchReadState = resolveBranchReadState({
|
|
315
|
+
branch,
|
|
316
|
+
collectionSlug: collectionConfig.slug,
|
|
317
|
+
req
|
|
318
|
+
});
|
|
319
|
+
const resolvedWhereJoin = useDrafts ? joinBranchReadState.useBranching ? rewriteBranchVersionParents(appendVersionToQueryKey(whereJoin)) ?? {} : await resolveBranchVersionQuery({
|
|
320
|
+
branch,
|
|
321
|
+
collectionSlug: collectionConfig.slug,
|
|
322
|
+
req,
|
|
323
|
+
where: appendVersionToQueryKey(whereJoin)
|
|
324
|
+
}) ?? {} : joinBranchReadState.useBranching ? rewriteBranchIDs(whereJoin) ?? {} : joinBranchPredicate ? {
|
|
325
|
+
and: [
|
|
326
|
+
whereJoin,
|
|
327
|
+
joinBranchPredicate
|
|
328
|
+
]
|
|
329
|
+
} : whereJoin;
|
|
250
330
|
const $match = await JoinModel.buildQuery({
|
|
331
|
+
branch,
|
|
251
332
|
locale,
|
|
252
333
|
payload: adapter.payload,
|
|
253
|
-
|
|
334
|
+
req,
|
|
335
|
+
where: useDrafts ? combineQueries(resolvedWhereJoin, {
|
|
254
336
|
latest: {
|
|
255
337
|
equals: true
|
|
256
338
|
}
|
|
257
|
-
}) :
|
|
339
|
+
}) : resolvedWhereJoin
|
|
258
340
|
});
|
|
341
|
+
const branchVisibility = joinBranchReadState.useBranching ? buildBranchVisibilityStages({
|
|
342
|
+
adapter,
|
|
343
|
+
branch: joinBranchReadState.branch,
|
|
344
|
+
collectionSlug: collectionConfig.slug,
|
|
345
|
+
mode: useDrafts ? 'drafts' : 'documents'
|
|
346
|
+
}) : [];
|
|
259
347
|
const pipeline = [
|
|
260
348
|
{
|
|
261
349
|
$match
|
|
262
350
|
},
|
|
351
|
+
...branchVisibility,
|
|
352
|
+
// Surface the canonical document ID rather than the shadow row's own
|
|
353
|
+
// primary key, so join results address documents the same way every
|
|
354
|
+
// other read does.
|
|
355
|
+
...joinBranchPredicate || branchVisibility.length ? [
|
|
356
|
+
useDrafts ? {
|
|
357
|
+
$set: {
|
|
358
|
+
parent: {
|
|
359
|
+
$ifNull: [
|
|
360
|
+
'$_branchParent',
|
|
361
|
+
'$parent'
|
|
362
|
+
]
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
} : {
|
|
366
|
+
$set: {
|
|
367
|
+
_id: {
|
|
368
|
+
$ifNull: [
|
|
369
|
+
'$_branchDocID',
|
|
370
|
+
'$_id'
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
] : [],
|
|
263
376
|
{
|
|
264
377
|
$sort: {
|
|
265
378
|
[sortProperty]: sortDirection
|
|
@@ -285,11 +398,12 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
285
398
|
as: `${as}.totalDocs`,
|
|
286
399
|
foreignField,
|
|
287
400
|
from: JoinModel.collection.name,
|
|
288
|
-
localField
|
|
401
|
+
localField,
|
|
289
402
|
pipeline: [
|
|
290
403
|
{
|
|
291
404
|
$match
|
|
292
405
|
},
|
|
406
|
+
...branchVisibility,
|
|
293
407
|
{
|
|
294
408
|
$count: 'result'
|
|
295
409
|
}
|
|
@@ -319,7 +433,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
319
433
|
as: `${as}.docs`,
|
|
320
434
|
foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,
|
|
321
435
|
from: JoinModel.collection.name,
|
|
322
|
-
localField
|
|
436
|
+
localField,
|
|
323
437
|
pipeline
|
|
324
438
|
}
|
|
325
439
|
}, {
|
|
@@ -376,7 +490,7 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
376
490
|
as: `${as}.docs`,
|
|
377
491
|
foreignField: `${foreignFieldPrefix}${foreignField}`,
|
|
378
492
|
from: JoinModel.collection.name,
|
|
379
|
-
localField
|
|
493
|
+
localField,
|
|
380
494
|
pipeline
|
|
381
495
|
}
|
|
382
496
|
}, {
|
|
@@ -416,6 +530,26 @@ export const buildJoinAggregation = async ({ adapter, collection, collectionConf
|
|
|
416
530
|
}
|
|
417
531
|
}
|
|
418
532
|
}
|
|
533
|
+
if (aggregate.length && outerBranchReadState.useBranching) {
|
|
534
|
+
aggregate.unshift({
|
|
535
|
+
$set: {
|
|
536
|
+
[canonicalParentField]: versions ? {
|
|
537
|
+
$ifNull: [
|
|
538
|
+
'$_branchParent',
|
|
539
|
+
'$parent'
|
|
540
|
+
]
|
|
541
|
+
} : {
|
|
542
|
+
$ifNull: [
|
|
543
|
+
'$_branchDocID',
|
|
544
|
+
'$_id'
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
aggregate.push({
|
|
550
|
+
$unset: canonicalParentField
|
|
551
|
+
});
|
|
552
|
+
}
|
|
419
553
|
return aggregate;
|
|
420
554
|
};
|
|
421
555
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SanitizedCollectionConfig,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[]> => {\n if (!adapter.useJoinAggregations) {\n return []\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return []\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n fields: aggregatedFields,\n locale,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const basePipeline = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ],\n },\n },\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: '$_id',\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const $match = await JoinModel.buildQuery({\n locale,\n payload: adapter.payload,\n where: useDrafts\n ? combineQueries(appendVersionToQueryKey(whereJoin), {\n latest: {\n equals: true,\n },\n })\n : whereJoin,\n })\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline: [\n {\n $match,\n },\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField: versions ? 'parent' : '_id',\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldShouldBeLocalized","hasDraftsEnabled","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","collection","collectionConfig","draftsEnabled","joins","locale","projection","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","collectionSlug","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$ifNull","$first","$set","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","latest","equals","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","localField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/buildJoinAggregation.ts"],"sourcesContent":["import type { PipelineStage } from 'mongoose'\n\nimport {\n APIError,\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n type CollectionSlug,\n combineQueries,\n type FlattenedField,\n getBranchPredicateSync,\n getQueryDraftsSort,\n type JoinQuery,\n type PayloadRequest,\n resolveBranchReadState,\n resolveBranchVersionQuery,\n rewriteBranchIDs,\n rewriteBranchVersionParents,\n type SanitizedCollectionConfig,\n type Where,\n} from 'payload'\nimport { fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\n\nimport type { MongooseAdapter } from '../index.js'\nimport type { CollectionModel } from '../types.js'\n\nimport { buildBranchVisibilityStages } from '../queries/buildBranchVisibility.js'\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { buildSortParam } from '../queries/buildSortParam.js'\nimport { getCollection } from './getEntity.js'\n\ntype BuildJoinAggregationArgs = {\n adapter: MongooseAdapter\n branch?: false | string\n collection: CollectionSlug\n collectionConfig: SanitizedCollectionConfig\n draftsEnabled?: boolean\n joins?: JoinQuery\n locale?: string\n projection?: Record<string, true>\n // the where clause for the top collection\n query?: Record<string, unknown>\n req?: Partial<PayloadRequest>\n /** whether the query is from drafts */\n versions?: boolean\n}\n\nexport const buildJoinAggregation = async ({\n adapter,\n branch,\n collection,\n collectionConfig,\n draftsEnabled,\n joins,\n locale,\n projection,\n req,\n versions,\n}: BuildJoinAggregationArgs): Promise<PipelineStage[]> => {\n if (!adapter.useJoinAggregations) {\n return []\n }\n if (\n (Object.keys(collectionConfig.joins).length === 0 &&\n collectionConfig.polymorphicJoins.length == 0) ||\n joins === false\n ) {\n return []\n }\n\n const joinConfig = adapter.payload.collections[collection]?.config?.joins\n\n if (!joinConfig) {\n throw new APIError(`Could not retrieve sanitized join config for ${collection}.`)\n }\n\n const aggregate: PipelineStage[] = []\n const outerBranchReadState = resolveBranchReadState({ branch, collectionSlug: collection, req })\n const canonicalParentField = '__payloadJoinParentID'\n let localField = versions ? 'parent' : '_id'\n\n if (outerBranchReadState.useBranching) {\n localField = canonicalParentField\n }\n\n const rootIDExpression = outerBranchReadState.useBranching ? `$${canonicalParentField}` : '$_id'\n const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins\n\n if (!polymorphicJoinsConfig) {\n throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`)\n }\n\n for (const join of polymorphicJoinsConfig) {\n if (projection && !projection[join.joinPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const {\n count = false,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n const aggregatedFields: FlattenedField[] = []\n for (const collectionSlug of join.field.collection) {\n const { collectionConfig } = getCollection({ adapter, collectionSlug })\n\n for (const field of collectionConfig.flattenedFields) {\n if (!aggregatedFields.some((eachField) => eachField.name === field.name)) {\n aggregatedFields.push(field)\n }\n }\n }\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields: aggregatedFields,\n locale,\n sort: sortJoin,\n timestamps: true,\n })\n\n const $match = await buildQuery({\n adapter,\n branch,\n fields: aggregatedFields,\n locale,\n req,\n where: whereJoin,\n })\n\n const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key.\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo'\n\n const aliases: string[] = []\n\n const as = join.joinPath\n\n for (const collectionSlug of join.field.collection) {\n const alias = `${as}.docs.${collectionSlug}`\n aliases.push(alias)\n\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug,\n req,\n })\n const branchMatch = joinBranchPredicate\n ? await buildQuery({\n adapter,\n branch,\n fields: adapter.payload.collections[collectionSlug]!.config.flattenedFields,\n locale,\n req,\n where: joinBranchPredicate,\n })\n : undefined\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug,\n })\n : []\n const basePipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n {\n $addFields: {\n relationTo: {\n $literal: collectionSlug,\n },\n },\n },\n {\n $match: {\n $and: [\n {\n $expr: {\n $eq: [`$${join.field.on}`, '$$root_id_'],\n },\n },\n $match,\n ...(branchMatch ? [branchMatch] : []),\n ],\n },\n },\n ...branchVisibility,\n ...(joinBranchPredicate || branchVisibility.length\n ? ([{ $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } }] as Exclude<\n PipelineStage,\n PipelineStage.Merge | PipelineStage.Out\n >[])\n : []),\n ]\n\n const { Model: JoinModel } = getCollection({ adapter, collectionSlug })\n\n aggregate.push({\n $lookup: {\n as: alias,\n from: JoinModel.collection.name,\n let: {\n root_id_: rootIDExpression,\n },\n pipeline: [\n ...basePipeline,\n {\n $sort: {\n [sortProperty]: sortDirection,\n },\n },\n ...(limitJoin > 0\n ? [\n {\n // Unfortunately, we can't use $skip here because we can lose data, instead we do $slice then\n $limit: page ? page * limitJoin : limitJoin,\n },\n ]\n : []),\n {\n $project: {\n value: '$_id',\n ...(projectSort && {\n [sortProperty]: 1,\n }),\n relationTo: 1,\n },\n },\n ],\n },\n })\n\n if (count) {\n aggregate.push({\n $lookup: {\n as: `${as}.totalDocs.${alias}`,\n from: JoinModel.collection.name,\n let: {\n root_id_: rootIDExpression,\n },\n pipeline: [\n ...basePipeline,\n {\n $count: 'result',\n },\n ],\n },\n })\n }\n }\n\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $concatArrays: aliases.map((alias) => `$${alias}`),\n },\n },\n })\n\n if (count) {\n aggregate.push({\n $addFields: {\n [`${as}.totalDocs`]: {\n $add: aliases.map((alias) => ({\n $ifNull: [\n {\n $first: `$${as}.totalDocs.${alias}.result`,\n },\n 0,\n ],\n })),\n },\n },\n })\n }\n\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $sortArray: {\n input: `$${as}.docs`,\n sortBy: {\n [sortProperty]: sortDirection,\n },\n },\n },\n },\n })\n\n const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin]\n\n aggregate.push({\n $addFields: {\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n },\n },\n })\n\n if (limitJoin > 0) {\n aggregate.push({\n $set: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, ...sliceValue],\n },\n },\n })\n }\n }\n\n for (const slug of Object.keys(joinConfig)) {\n const joinsList = joinConfig[slug]\n\n if (!joinsList) {\n throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`)\n }\n\n for (const join of joinsList) {\n const projectionPath = versions ? `version.${join.joinPath}` : join.joinPath\n if (projection && !projection[projectionPath]) {\n continue\n }\n\n if (joins?.[join.joinPath] === false) {\n continue\n }\n\n const collectionConfig = adapter.payload.collections[join.field.collection as string]?.config\n\n if (!collectionConfig) {\n throw new APIError(\n `Collection config for ${join.field.collection.toString()} was not found`,\n )\n }\n\n let JoinModel: CollectionModel | undefined\n\n const useDrafts = (draftsEnabled || versions) && hasDraftsEnabled(collectionConfig)\n\n if (useDrafts) {\n JoinModel = adapter.versions[collectionConfig.slug]\n } else {\n JoinModel = adapter.collections[collectionConfig.slug]\n }\n\n if (!JoinModel) {\n throw new APIError(`Join Model was not found for ${collectionConfig.slug}`)\n }\n\n const {\n count,\n limit: limitJoin = join.field.defaultLimit ?? 10,\n page,\n sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort,\n where: whereJoin = {},\n } = joins?.[join.joinPath] || {}\n\n if (Array.isArray(join.field.collection)) {\n throw new Error('Unreachable')\n }\n\n const fields = useDrafts\n ? buildVersionCollectionFields(adapter.payload.config, collectionConfig, true)\n : collectionConfig.flattenedFields\n\n const sort = buildSortParam({\n adapter,\n config: adapter.payload.config,\n fields,\n locale,\n sort: useDrafts ? getQueryDraftsSort({ collectionConfig, sort: sortJoin }) : sortJoin,\n timestamps: true,\n })\n const sortProperty = Object.keys(sort)[0]!\n const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1\n\n // A join subquery must carry the same branch predicate as the top-level\n // read, or a branch would see main's related documents.\n const joinBranchPredicate = getBranchPredicateSync({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n const joinBranchReadState = resolveBranchReadState({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n })\n\n const resolvedWhereJoin = useDrafts\n ? joinBranchReadState.useBranching\n ? (rewriteBranchVersionParents(appendVersionToQueryKey(whereJoin)) ?? {})\n : ((await resolveBranchVersionQuery({\n branch,\n collectionSlug: collectionConfig.slug,\n req,\n where: appendVersionToQueryKey(whereJoin),\n })) ?? {})\n : joinBranchReadState.useBranching\n ? (rewriteBranchIDs(whereJoin) ?? {})\n : joinBranchPredicate\n ? ({ and: [whereJoin, joinBranchPredicate] } as Where)\n : whereJoin\n\n const $match = await JoinModel.buildQuery({\n branch,\n locale,\n payload: adapter.payload,\n req,\n where: useDrafts\n ? combineQueries(resolvedWhereJoin, {\n latest: {\n equals: true,\n },\n })\n : resolvedWhereJoin,\n })\n const branchVisibility = joinBranchReadState.useBranching\n ? buildBranchVisibilityStages({\n adapter,\n branch: joinBranchReadState.branch,\n collectionSlug: collectionConfig.slug,\n mode: useDrafts ? 'drafts' : 'documents',\n })\n : []\n\n const pipeline: Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[] = [\n { $match },\n ...branchVisibility,\n // Surface the canonical document ID rather than the shadow row's own\n // primary key, so join results address documents the same way every\n // other read does.\n ...(joinBranchPredicate || branchVisibility.length\n ? ([\n useDrafts\n ? { $set: { parent: { $ifNull: ['$_branchParent', '$parent'] } } }\n : { $set: { _id: { $ifNull: ['$_branchDocID', '$_id'] } } },\n ] as Exclude<PipelineStage, PipelineStage.Merge | PipelineStage.Out>[])\n : []),\n {\n $sort: { [sortProperty]: sortDirection },\n },\n ]\n\n if (page) {\n pipeline.push({\n $skip: (page - 1) * limitJoin,\n })\n }\n\n if (limitJoin > 0) {\n pipeline.push({\n $limit: limitJoin + 1,\n })\n }\n\n let polymorphicSuffix = ''\n if (Array.isArray(join.targetField.relationTo)) {\n polymorphicSuffix = '.value'\n }\n\n const addTotalDocsAggregation = (as: string, foreignField: string) =>\n aggregate.push(\n {\n $lookup: {\n as: `${as}.totalDocs`,\n foreignField,\n from: JoinModel.collection.name,\n localField,\n pipeline: [\n {\n $match,\n },\n ...branchVisibility,\n {\n $count: 'result',\n },\n ],\n },\n },\n {\n $addFields: {\n [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] },\n },\n },\n )\n\n let foreignFieldPrefix = ''\n\n if (useDrafts) {\n foreignFieldPrefix = 'version.'\n }\n\n if (adapter.payload.config.localization && locale === 'all') {\n adapter.payload.config.localization.localeCodes.forEach((code) => {\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}`\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n from: JoinModel.collection.name,\n localField,\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: limitJoin\n ? { $gt: [{ $size: `$${as}.docs` }, limitJoin] }\n : false,\n // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n\n if (count) {\n addTotalDocsAggregation(\n as,\n `${foreignFieldPrefix}${join.field.on}${code}${polymorphicSuffix}`,\n )\n }\n })\n } else {\n const localeSuffix =\n fieldShouldBeLocalized({\n field: join.field,\n parentIsLocalized: join.parentIsLocalized,\n }) &&\n adapter.payload.config.localization &&\n locale\n ? `.${locale}`\n : ''\n const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${localeSuffix}`\n\n let foreignField: string\n\n if (join.getForeignPath) {\n foreignField = `${join.getForeignPath({ locale })}${polymorphicSuffix}`\n } else {\n foreignField = `${join.field.on}${polymorphicSuffix}`\n }\n\n aggregate.push(\n {\n $lookup: {\n as: `${as}.docs`,\n foreignField: `${foreignFieldPrefix}${foreignField}`,\n from: JoinModel.collection.name,\n localField,\n pipeline,\n },\n },\n {\n $addFields: {\n [`${as}.docs`]: {\n $map: {\n as: 'doc',\n in: useDrafts ? `$$doc.parent` : '$$doc._id',\n input: `$${as}.docs`,\n },\n }, // Slicing the docs to match the limit\n [`${as}.hasNextPage`]: {\n $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE],\n }, // Boolean indicating if more docs than limit\n },\n },\n )\n\n if (count) {\n addTotalDocsAggregation(as, `${foreignFieldPrefix}${foreignField}`)\n }\n\n if (limitJoin > 0) {\n aggregate.push({\n $addFields: {\n [`${as}.docs`]: {\n $slice: [`$${as}.docs`, limitJoin],\n },\n },\n })\n }\n }\n }\n }\n\n if (aggregate.length && outerBranchReadState.useBranching) {\n aggregate.unshift({\n $set: {\n [canonicalParentField]: versions\n ? { $ifNull: ['$_branchParent', '$parent'] }\n : { $ifNull: ['$_branchDocID', '$_id'] },\n },\n })\n aggregate.push({ $unset: canonicalParentField })\n }\n\n return aggregate\n}\n"],"names":["APIError","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getBranchPredicateSync","getQueryDraftsSort","resolveBranchReadState","resolveBranchVersionQuery","rewriteBranchIDs","rewriteBranchVersionParents","fieldShouldBeLocalized","hasDraftsEnabled","buildBranchVisibilityStages","buildQuery","buildSortParam","getCollection","buildJoinAggregation","adapter","branch","collection","collectionConfig","draftsEnabled","joins","locale","projection","req","versions","useJoinAggregations","Object","keys","length","polymorphicJoins","joinConfig","payload","collections","config","aggregate","outerBranchReadState","collectionSlug","canonicalParentField","localField","useBranching","rootIDExpression","polymorphicJoinsConfig","join","joinPath","count","limit","limitJoin","field","defaultLimit","page","sort","sortJoin","defaultSort","where","whereJoin","aggregatedFields","flattenedFields","some","eachField","name","push","fields","timestamps","$match","sortProperty","sortDirection","projectSort","aliases","as","alias","joinBranchPredicate","joinBranchReadState","branchMatch","undefined","branchVisibility","basePipeline","$addFields","relationTo","$literal","$and","$expr","$eq","on","$set","_id","$ifNull","Model","JoinModel","$lookup","from","let","root_id_","pipeline","$sort","$limit","$project","value","$count","$concatArrays","map","$add","$first","$sortArray","input","sortBy","sliceValue","$gt","$size","Number","MAX_VALUE","$slice","slug","joinsList","projectionPath","toString","useDrafts","Array","isArray","Error","resolvedWhereJoin","and","latest","equals","mode","parent","$skip","polymorphicSuffix","targetField","addTotalDocsAggregation","foreignField","foreignFieldPrefix","localization","localeCodes","forEach","code","$map","in","localeSuffix","parentIsLocalized","getForeignPath","unshift","$unset"],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { JoinQuery } from 'payload';
|
|
1
|
+
import type { JoinQuery, PayloadRequest } from 'payload';
|
|
2
2
|
import type { MongooseAdapter } from '../index.js';
|
|
3
3
|
export type ResolveJoinsArgs = {
|
|
4
4
|
/** The MongoDB adapter instance */
|
|
5
5
|
adapter: MongooseAdapter;
|
|
6
|
+
/** Explicit branch override for related document reads */
|
|
7
|
+
branch?: false | string;
|
|
6
8
|
/** The slug of the collection being queried */
|
|
7
9
|
collectionSlug: string;
|
|
8
10
|
/** Array of documents to resolve joins for */
|
|
@@ -13,6 +15,8 @@ export type ResolveJoinsArgs = {
|
|
|
13
15
|
locale?: string;
|
|
14
16
|
/** Optional projection for the join query */
|
|
15
17
|
projection?: Record<string, true>;
|
|
18
|
+
/** Request, for resolving the active branch */
|
|
19
|
+
req?: Partial<PayloadRequest>;
|
|
16
20
|
/** Whether to resolve versions instead of published documents */
|
|
17
21
|
versions?: boolean;
|
|
18
22
|
};
|
|
@@ -21,5 +25,5 @@ export type ResolveJoinsArgs = {
|
|
|
21
25
|
* This function fetches related documents based on join configurations and
|
|
22
26
|
* attaches them to the original documents with pagination support.
|
|
23
27
|
*/
|
|
24
|
-
export declare function resolveJoins({ adapter, collectionSlug, docs, joins, locale, projection, versions, }: ResolveJoinsArgs): Promise<void>;
|
|
28
|
+
export declare function resolveJoins({ adapter, branch, collectionSlug, docs, joins, locale, projection, req, versions, }: ResolveJoinsArgs): Promise<void>;
|
|
25
29
|
//# sourceMappingURL=resolveJoins.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveJoins.d.ts","sourceRoot":"","sources":["../../src/utilities/resolveJoins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAyB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"resolveJoins.d.ts","sourceRoot":"","sources":["../../src/utilities/resolveJoins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAA;AAkB/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAOlD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mCAAmC;IACnC,OAAO,EAAE,eAAe,CAAA;IACxB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACvB,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC/B,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,+CAA+C;IAC/C,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,EACjC,OAAO,EACP,MAAM,EACN,cAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,UAAU,EACV,GAAG,EACH,QAAgB,GACjB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+dlC"}
|