Skip to content

Commit

Permalink
Fix assertion errors when querying types with no common supertypes at…
Browse files Browse the repository at this point in the history
… the same path (#2467)

Fetches input selections used to be based on the queried subgraph
schema. However, those selections truly applies to the in-memory data
maintained by the gateway/router, so the supergraph. This used to
not matter (all input selection did correctly applied to the subgraph
schema), but `@interfaceObject` made it so that some input selections
could be invalid for the subgraph. Typically, a fetch that queries a
subgraph with an `@interfaceObject` may look like:
```
Fetch(service: 'A') {
  {
    ... on Book {
      id
    }
  } => {
    ... on Product {
      <some fields>
    }
  }
}
```
where `Book` is a concrete implementation of `Product` but unknown to
subgraph `A`.

However, basing the input selections on the supergraph schema means
having the parent type, in the supergraph, for those selections, and
because some fetches can query multiple different entities, this is
not trivial.

The initial code for `@interfaceObject` make the (incorrect) assumption
that, when a fetch does query multiple types, then we could always find
a common supertype for all those types, and so was using that type as
parent type.

Unfortunately, this isn't always true (see test in this PR, which uses
a union type with types having a field with the same name but different
(and unrelated) types).

So in pratice, fetch inputs cannot always have a common parent type.
This patch thus changes the fetch inputs to be a map of type to
selection sets instead of a single selection set.

Note that it does mean that the `requires` field of a `FetchGroup` is
not a true valid "single" selection for the supergraph (or any subgraph
for that matter), but it is more of a "fun fact" since the execution
never relied on this anyway.

Fixes #2466
  • Loading branch information
Sylvain Lebresne authored and Sylvain Lebresne committed May 15, 2023
1 parent 98844fd commit ce0459a
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changeset/thin-weeks-refuse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@apollo/query-planner": patch
---

Fix query planner assertion error when types with no common supertypes are requested at the same path

0 comments on commit ce0459a

Please sign in to comment.