-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Closed
Description
How can I get fields requested in external fragment from fieldASTs?
Consider following query
`
query QueryWithFragment {
todo(_id: "55a624bad009804e552eeea8") {
...TextFragment
}
}
fragment TextFragment on Todo {
text
}
`This query results in following, so there is no way to get those fields without directly parsing query string.
{
"kind": "Field",
"alias": null,
"name": {
"kind": "Name",
"value": "todo",
"loc": {
"start": 27,
"end": 31,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
},
"arguments": [{
"kind": "Argument",
"name": {
"kind": "Name",
"value": "_id",
"loc": {
"start": 32,
"end": 35,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
},
"value": {
"kind": "StringValue",
"value": "55a624bad009804e552eeea8",
"loc": {
"start": 37,
"end": 63,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
},
"loc": {
"start": 32,
"end": 63,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
}],
"directives": [],
"selectionSet": {
"kind": "SelectionSet",
"selections": [{
"kind": "FragmentSpread",
"name": {
"kind": "Name",
"value": "TextFragment",
"loc": {
"start": 76,
"end": 88,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
},
"directives": [],
"loc": {
"start": 73,
"end": 88,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
}],
"loc": {
"start": 65,
"end": 94,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
},
"loc": {
"start": 27,
"end": 94,
"source": {
"body": "\n query UseFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ...TextFragment\n }\n }\n\n fragment TextFragment on Todo {\n text\n }\n",
"name": "GraphQL request"
}
}
}Now lets take a look in InlineFragment version
`
query QueryWithoutFragment {
todo(_id: "55a624bad009804e552eeea8") {
... on Todo {
text
}
}
}
`We can easily access requested fields for fragment in selectionSet
{
"kind": "Field",
"alias": null,
"name": {
"kind": "Name",
"value": "todo",
"loc": {
"start": 36,
"end": 40,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"arguments": [{
"kind": "Argument",
"name": {
"kind": "Name",
"value": "_id",
"loc": {
"start": 41,
"end": 44,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"value": {
"kind": "StringValue",
"value": "55a624bad009804e552eeea8",
"loc": {
"start": 46,
"end": 72,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"loc": {
"start": 41,
"end": 72,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
}],
"directives": [],
"selectionSet": {
"kind": "SelectionSet",
"selections": [{
"kind": "InlineFragment",
"typeCondition": {
"kind": "Name",
"value": "Todo",
"loc": {
"start": 89,
"end": 93,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"directives": [],
"selectionSet": {
"kind": "SelectionSet",
"selections": [{
"kind": "Field",
"alias": null,
"name": {
"kind": "Name",
"value": "text",
"loc": {
"start": 104,
"end": 108,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"arguments": [],
"directives": [],
"selectionSet": null,
"loc": {
"start": 104,
"end": 108,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
}],
"loc": {
"start": 94,
"end": 116,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"loc": {
"start": 82,
"end": 116,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
}],
"loc": {
"start": 74,
"end": 122,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
},
"loc": {
"start": 36,
"end": 122,
"source": {
"body": "\n query QueryWithoutFragment {\n todo(_id: \"55a624bad009804e552eeea8\") {\n ... on Todo {\n text\n }\n }\n }\n",
"name": "GraphQL request"
}
}
}I'm currently working on conversion fieldASTs to MongoDB projections. I've done with InlineFragment. Any thoughts?
Metadata
Metadata
Assignees
Labels
No labels