GWorking
GWorking

Reputation: 4341

graphql filter based on internal fragments (gatsbyJS)

Why is this not possible? In the sense that it looks like I have no access to any property accessed through an internal fragment such as ... on File

codebox from gatsby-docs

{
  books: allMarkdownRemark(filter: {parent: {sourceInstanceName: {eq: "whatever"}}}) {
    totalCount
    edges {
      node {
        parent {
          ... on File {
            sourceInstanceName
          }
        }
      }
    }
  }
}

Error: Field is not defined by type NodeFilterInput

Upvotes: 1

Views: 1970

Answers (1)

xadm
xadm

Reputation: 8418

It's a resolver authors responsibility.

You can compare it to general function arguments and returned result. In graphQL both are strictly defined/typed.

In this case, for query allMarkdownRemark you have

allMarkdownRemark(
  filter: MarkdownRemarkFilterInput
  limit: Int
  skip: Int
  sort: MarkdownRemarkSortInput
): MarkdownRemarkConnection!

... so possible arguments are only filter, limit, skip and sort. Argument filter has defined shape, too - it has to be MarkdownRemarkFilterInput type. You can only use properties defined in this type for filter argument.

This is by design, this is how designer created resolver and his intentions about how and what arguments are handled.

It's like pagination - you don't have to use any of result fields as arguments as skip and limit are for record level. This way those arguments are not related to fields at all. They are used for some logic in resolver. filter argument is used for logic, too ... but it's deleveloper decision to choose and cover filtering use cases.

It's impossible to cover all imaginable filters on all processed data layers and properties, ... for parent you can only use children, id, internal and parent properties and subproperties (you can explore them in playground).

Of course it's not enough to extend type definition to make it working with another argument - it's about code to handle it.

If you need onother filtering logic, you can write your own resolver (or modify forked gatsby project) for your file types or other source.

Upvotes: 1

Related Questions