Skip to content

fix(graphql): preserve hasMany relationship order in populated results#17004

Open
yashs33244 wants to merge 1 commit into
payloadcms:mainfrom
yashs33244:fix/graphql-relationship-array-order
Open

fix(graphql): preserve hasMany relationship order in populated results#17004
yashs33244 wants to merge 1 commit into
payloadcms:mainfrom
yashs33244:fix/graphql-relationship-array-order

Conversation

@yashs33244

Copy link
Copy Markdown

What?

hasMany relationship and upload fields could return populated documents in the wrong order when a single relationship to the same collection was queried before the array field in the same request.

Why?

The populate promises run in parallel via Promise.all and were pushed onto the results array in resolution order, not input order. When a sibling single relationship warms the per-request dataloader cache for a shared document, that document settles out of order, so e.g. [A, B, C] comes back as [B, C, A].

How?

Assign each populated doc to its source index (results[i] = ...) instead of pushing, then filter out the holes left by skipped entries, so the returned list always matches the stored order regardless of which promise settles first. Applied to both the relationship and upload resolvers. Added an int test that reproduces the reorder.

Fixes #14956

hasMany relationship and upload fields could return populated documents in
the wrong order when a single relationship to the same collection was queried
before the array field in the same request. The populate promises run in
parallel via Promise.all and pushed onto results in resolution order, so a
dataloader cache hit on a shared document settled out of input order.

Assign each populated doc to its source index instead of pushing, then filter
out the holes left by skipped entries, so the returned list always matches the
stored order regardless of which promise settles first.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

relationship array order corrupted in GraphQL query when multiple fields use same relationshipo

1 participant