Skip to content
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

Formally specify Non-Null behavior #5

Merged
merged 6 commits into from
May 6, 2021

Conversation

fotoetienne
Copy link

This edit adds a distinct Behavior section that specifies how a client-side Non-Null operator functions

This is separated from the Syntax proposal to avoid confusion.

This edit adds a distinct Behavior section that specifies how a client-side Non-Null operator functions

This is separated from the Syntax proposal to avoid confusion.
rfcs/QueryLevelNullability.md Outdated Show resolved Hide resolved
Co-authored-by: Alex Reilly <fabiobean2@gmail.com>
@fotoetienne fotoetienne marked this pull request as ready for review May 6, 2021 06:07
Comment on lines +101 to +120
## 🧑‍💻 Proposed Solution

A client specified Non-Null designator.

## 🎬 Behavior

The proposed query-side Non-Null designator would have identical semantics as the current
SDL-defined [Non-Null](https://spec.graphql.org/June2018/#sec-Errors-and-Non-Nullability). Specifically:

- If the result of resolving a field is null (either because the function to resolve the field returned null
or because an error occurred), and that field is of a Non-Null type,
**or the operation specifies this field as Non-Null**,
then a field error is thrown. The error must be added to the "errors" list in the response.

- Since Non-Null type fields cannot be null, field errors are propagated to be handled by the parent field.
If the parent field may be null then it resolves to null, otherwise the field error
is further propagated to its parent field.

- If all fields from the root of the request to the source of the field error return Non-Null types or are
specified as Non-Null in the operation, then the "data" entry in the response should be null.
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this clarification. Crystal clear 💎

rfcs/QueryLevelNullability.md Outdated Show resolved Hide resolved
rfcs/QueryLevelNullability.md Outdated Show resolved Hide resolved
fotoetienne and others added 2 commits May 5, 2021 23:17
Co-authored-by: Alex Reilly <fabiobean2@gmail.com>
Co-authored-by: Alex Reilly <fabiobean2@gmail.com>
@twof twof self-requested a review May 6, 2021 06:20
@twof twof merged commit 5d5a519 into twof:QueryLevelNullability May 6, 2021
twof pushed a commit that referenced this pull request Oct 18, 2021
* Comments on the proposal

Hi, thanks for this extensive and in-depth work.

I will try to keep my comments concise (which might make them sound agressive, apologies if that's the case, it's definitely not the intent)

This PR touches one of the most challengeable founding philosophical choices of GraphQL: having 2 different type systems for input and output.

I understand that the sender -> receiver relation is an unbalanced one: the sender has obligations, the receiver has options.

However:
 - ALL GraphQL users use programming languages (Javascript, Java, C#, Python...) which make no difference between input and output types
 - I actually don't know any other protocol that does that (is there one?)
 - having 2 different type systems for input and output solves (does it?) an implementer problem, not a user problem

The lack of polymorphism on input is only a side-effect of the aformentioned original choice.
In an unreal world, rather than tweak GraphQL to fix that, it would be time for GraphQL2, unifying input and output types (amongst other improvements).

That's very unlikely to happen, but saying so helps forming an opinion on the various proposals:
 - adding yet another polymorphic construct only available on input 'smells' like increasing confusion 
 - it would increase the gap between input and output type systems, rather than reduce it

From there, I think proposal #5 @OneOf is the most useful one:
 - it acts as a constraint on existing type constructs rather than yet another type construct
 - it expresses the required behavior much better than proposal #7

* Comments on the proposal

Hi, thanks for this extensive and in-depth work.

I will try to keep my comments concise (which might make them sound agressive, apologies if that's the case, it's definitely not the intent)

This PR touches one of the most challengeable founding philosophical choices of GraphQL: having 2 different type systems for input and output.

I understand that the sender -> receiver relation is an unbalanced one: the sender has obligations, the receiver has options.

However:
 - ALL GraphQL users use programming languages (Javascript, Java, C#, Python...) which make no difference between input and output types
 - I actually don't know any other protocol that does that (is there one?)
 - having 2 different type systems for input and output solves (does it?) an implementer problem, not a user problem

The lack of polymorphism on input is only a side-effect of the aformentioned original choice.
In an unreal world, rather than tweak GraphQL to fix that, it would be time for GraphQL2, unifying input and output types (amongst other improvements).

That's very unlikely to happen, but saying so helps forming an opinion on the various proposals:
 - adding yet another polymorphic construct only available on input 'smells' like increasing confusion 
 - it would increase the gap between input and output type systems, rather than reduce it

From there, I think proposal #5 @OneOf is the most useful one:
 - it acts as a constraint on existing type constructs rather than yet another type construct
 - it expresses the required behavior much better than proposal #7

* Update InputUnion.md

* clean up merge dirt
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.

2 participants