From cec55674cb343c1c7f3e96dd9c5fe7867a42f5b8 Mon Sep 17 00:00:00 2001 From: Anurag Date: Wed, 30 Sep 2020 12:43:46 +0530 Subject: [PATCH] fix(GraphQL Query): Remove extra fields when querying interfaces (#6596) --- graphql/e2e/common/fragment.go | 41 ++++++++++++++++++++++++++++++++++ graphql/resolve/resolver.go | 9 ++++++++ 2 files changed, 50 insertions(+) diff --git a/graphql/e2e/common/fragment.go b/graphql/e2e/common/fragment.go index 5e54ecaa19a..f92e2086a6b 100644 --- a/graphql/e2e/common/fragment.go +++ b/graphql/e2e/common/fragment.go @@ -161,6 +161,27 @@ func fragmentInQueryOnInterface(t *testing.T) { id } } + qcRep1: queryCharacter { + name + ... on Human { + name + totalCredits + } + ... on Droid { + name + primaryFunction + } + } + qcRep2: queryCharacter { + ... on Human { + totalCredits + } + name + ... on Droid { + primaryFunction + name + } + } queryThing { __typename ... on ThingOne { @@ -269,6 +290,26 @@ func fragmentInQueryOnInterface(t *testing.T) { "id": "%s" } ], + "qcRep1": [ + { + "name": "Han", + "totalCredits": 10 + }, + { + "name": "R2-D2", + "primaryFunction": "Robot" + } + ], + "qcRep2": [ + { + "totalCredits": 10, + "name": "Han" + }, + { + "name": "R2-D2", + "primaryFunction": "Robot" + } + ], "queryThing":[ { "__typename": "ThingOne", diff --git a/graphql/resolve/resolver.go b/graphql/resolve/resolver.go index b04c4bb6e1e..afbeed1a3e2 100644 --- a/graphql/resolve/resolver.go +++ b/graphql/resolve/resolver.go @@ -1268,6 +1268,10 @@ func completeObject( var buf bytes.Buffer comma := "" + // Below map keeps track of fields which have been seen as part of + // interface to avoid double entry in the resulting response + seenField := make(map[string]bool) + x.Check2(buf.WriteRune('{')) dgraphTypes, ok := res["dgraph.type"].([]interface{}) for _, f := range fields { @@ -1285,6 +1289,9 @@ func completeObject( if len(dgraphTypes) > 0 { includeField = f.IncludeInterfaceField(dgraphTypes) } + if _, ok := seenField[f.ResponseName()]; ok { + includeField = false + } if !includeField { continue } @@ -1294,6 +1301,8 @@ func completeObject( x.Check2(buf.WriteString(f.ResponseName())) x.Check2(buf.WriteString(`": `)) + seenField[f.ResponseName()] = true + val := res[f.DgraphAlias()] if f.Name() == schema.Typename { // From GraphQL spec: