From f079c7fcc0a91715cf3c54231f0c11f4c3b30725 Mon Sep 17 00:00:00 2001 From: Anurag Date: Mon, 5 Oct 2020 20:51:37 +0530 Subject: [PATCH] fix(GraphQL Query): Remove extra fields when querying interfaces (#6596) (#6647) (cherry picked from commit cec5567) This PR fixes: GRAPHQL-638 --- graphql/e2e/common/fragment.go | 42 ++++++++++++++++++++++++++++++++++ graphql/resolve/resolver.go | 9 ++++++++ 2 files changed, 51 insertions(+) diff --git a/graphql/e2e/common/fragment.go b/graphql/e2e/common/fragment.go index d529ee63407..e1115e29f45 100644 --- a/graphql/e2e/common/fragment.go +++ b/graphql/e2e/common/fragment.go @@ -160,10 +160,32 @@ 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 + } + } qc2: queryCharacter { ... on Human { name n: name + } } queryThing { @@ -274,6 +296,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" + } + ], "qc2":[ { "name": "Han", diff --git a/graphql/resolve/resolver.go b/graphql/resolve/resolver.go index 9dd5fce8f0c..06afb223e93 100644 --- a/graphql/resolve/resolver.go +++ b/graphql/resolve/resolver.go @@ -1265,6 +1265,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{}) @@ -1283,6 +1287,9 @@ func completeObject( if len(dgraphTypes) > 0 { includeField = f.IncludeInterfaceField(dgraphTypes) } + if _, ok := seenField[f.ResponseName()]; ok { + includeField = false + } if !includeField { continue } @@ -1292,6 +1299,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: