Skip to content

Formally specify Non-Null behavior#5

Merged
twof merged 6 commits intotwof:QueryLevelNullabilityfrom
fotoetienne:QueryLevelNullability
May 6, 2021
Merged

Formally specify Non-Null behavior#5
twof merged 6 commits intotwof:QueryLevelNullabilityfrom
fotoetienne:QueryLevelNullability

Conversation

@fotoetienne
Copy link
Copy Markdown

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.
Comment thread rfcs/QueryLevelNullability.md Outdated
@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
Copy Markdown
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 💎

Comment thread rfcs/QueryLevelNullability.md Outdated
Comment thread rfcs/QueryLevelNullability.md Outdated
@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