-
Notifications
You must be signed in to change notification settings - Fork 257
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix assertion errors when querying types with no common supertypes at… #2467
Fix assertion errors when querying types with no common supertypes at… #2467
Conversation
… the same path 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 apollographql#2466
👷 Deploy request for apollo-federation-docs pending review.Visit the deploys page to approve it
|
🦋 Changeset detectedLatest commit: 2093d61 The changes in this PR will be included in the next version bump. This PR includes changesets to release 7 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. |
… 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
… the same path
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:where
Book
is a concrete implementation ofProduct
but unknown to subgraphA
.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 aFetchGroup
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