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.
@yashs33244

Copy link
Copy Markdown
Author

Hi @JarrodMFlesch — this one's waiting on the first-time-contributor CI approval (the ci workflow is sitting in action_required). Could you approve the run and take a look when you get a chance?

It's a small graphql fix that preserves hasMany relationship order in populated results, with a regression test. Thanks!

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