Skip to content

Conversation

@benjamn
Copy link
Member

@benjamn benjamn commented Sep 29, 2020

Note: this PR builds on #7098.

This change means the existence of root objects like ROOT_QUERY and ROOT_MUTATION in the InMemoryCache will no longer depend on whether other queries/mutations have previously written data into the cache.

This matters because (until just recently: #7098) cache.read would return null for a completely missing ROOT_QUERY object, but throw missing field errors if ROOT_QUERY existed but did not have the requested fields:

const cache = new InMemoryCache(); // empty
const query = gql`query { some fields }`;

// Returns null, as before:
const result = cache.readQuery({ query });

// Before PR #7098, this write would cause the ROOT_QUERY object
// to be created, changing the behavior of cache.readQuery below.
cache.writeQuery({
  query: gql`query { unrelated fields }`,
  data: {...},
});

// Previously threw a missing field error, but now returns null:
const result = cache.readQuery({
  query: gql`query { some fields }`,
});

In other words, this commit hides the difference between the absence of ROOT_QUERY and its incompleteness, so unrelated cache writes can no longer unexpectedly influence the null-returning vs. exception-throwing behavior of cache.read.

As an additional motivation, with AC3 field policies, it's possible now to define synthetic root query fields that have a chance of returning useful values even if the cache is completely empty. Providing a default empty object for root IDs like ROOT_QUERY is important to let those read functions be called, instead of prematurely returning null from cache.read when ROOT_QUERY does not exist.

Copy link
Member

@hwillson hwillson left a comment

Choose a reason for hiding this comment

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

👍 LGTM - thanks @benjamn!

@benjamn benjamn force-pushed the default-StoreObject-for-root-IDs branch from 6c87c20 to 63c7cb0 Compare September 30, 2020 18:22
Base automatically changed from fr1-prevent-cache.read-from-throwing to release-3.3 September 30, 2020 20:52
This change means the existence of root objects like ROOT_QUERY and
ROOT_MUTATION will no longer depend on whether other queries/mutations
have previously written data into the cache.

This matters because (until just recently) cache.read would return null
for a completely missing ROOT_QUERY object, but throw missing field errors
if ROOT_QUERY existed but did not have the requested fields.

In other words, this commit hides the difference between the absence of
ROOT_QUERY and its incompleteness, so unrelated cache writes can no longer
unexpectedly influence the null-returning vs. exception-throwing behavior
of cache.read.

As an additional motivation, with AC3 field policies, it's possible now to
define synthetic root query fields that have a chance of returning useful
values even if the cache is completely empty. Providing a default empty
object for root IDs like ROOT_QUERY is important to let those read
functions be called, instead of prematurely returning null from cache.read
when ROOT_QUERY does not exist.

Note: this PR builds on PR #7098.
@benjamn benjamn force-pushed the release-3.3 branch 2 times, most recently from 528a97f to e387014 Compare September 30, 2020 21:08
@benjamn benjamn force-pushed the default-StoreObject-for-root-IDs branch from 63c7cb0 to cf3c2a4 Compare September 30, 2020 21:09
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants