Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix assertion errors when querying types with no common supertypes at…
… 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