Code Monkey home page Code Monkey logo

Comments (7)

rantav avatar rantav commented on July 21, 2024 11

To answer my own question, here's how I solved this:

Assume you have the query:

query {
  companies {
    id,
    name
  }
}

And you want to know whether the companies fields contain id or name or other fields.
Use the following func

func getSelectedFields(selectionPath []string,
    resolveParams graphql.ResolveParams) []string {
    fields := resolveParams.Info.FieldASTs
    for _, propName := range selectionPath {
        found := false
        for _, field := range fields {
            if field.Name.Value == propName {
                selections := field.SelectionSet.Selections
                fields = make([]*ast.Field, 0)
                for _, selection := range selections {
                    fields = append(fields, selection.(*ast.Field))
                }
                found = true
                break
            }
        }
        if !found {
            return []string{}
        }
    }
    var collect []string
    for _, field := range fields {
        collect = append(collect, field.Name.Value)
    }
    return collect
}

And invoke it like this:

getSelectedFields([]string{"companies"}, resolveParams) 
// this will return []string{"id", "name"}

In case you have a "path" you want to select from, e.g.

query {
  a {
    b {
      x,
      y,
      z
    }
  }
}

Then you'd call it like this:

getSelectedFields([]string{"a", "b"}, resolveParams)
// Returns []string{"x", "y", "z"}

For context, this problem had also been discussed here: graphql/graphql-js#19 as well as mentioned here http://pcarion.com/2015/09/26/graphql-resolve/

from graphql.

kellyellis avatar kellyellis commented on July 21, 2024 1

Thanks! I'm going to use this solution. But I still think the library should provide a straightforward way to access this.

from graphql.

bsr203 avatar bsr203 commented on July 21, 2024

look at https://godoc.org/github.com/graphql-go/graphql#ResolveParams

you can access graphql query variables through Args which is map[string]interface{}, keyed with parameter name.

from graphql.

rantav avatar rantav commented on July 21, 2024

Thanks @bsr203 but unfortunately this isn't what I'm looking for.
Yes, I can access the query variables, but what I want is to access the list of requested fields (it's the first time I use graphql so I hope my terminology is right...)

So if I had a query:

query {
  companies(arg1: 5.4) {
    id,
    name
  }
}

What you're suggesting is being able to access arg1, which indeed is required.
But what I'm asking, on top of that, is being able to access the list of requested fields, e.g. I want to know that the user asked for the fields id and name but did not ask for other fields.
My motivation is that I'm sending a query to a database and in this query I request a list of fields. I want to know what fields to include in the select statement.

from graphql.

bsr203 avatar bsr203 commented on July 21, 2024

thank you for posting the solution. I too may want to use it one day, but not there yet. cheers.

from graphql.

kellyellis avatar kellyellis commented on July 21, 2024

Just an FYI for anyone reading this, I used the same solution, and it breaks if the client uses fragments:

[interface conversion: ast.Selection is *ast.FragmentSpread, not *ast.Field]

I'll post here when I find a solution to this.

from graphql.

kellyellis avatar kellyellis commented on July 21, 2024

I've posted my modified solution here, which works for queries that include fragments: #157 (comment)

from graphql.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.