Skip to content

Commit

Permalink
[TT-5117] Removed duplicate code
Browse files Browse the repository at this point in the history
[changelog]
internal: Removed duplicate code.
  • Loading branch information
David Stutt committed Apr 29, 2022
1 parent edc4f3d commit d12e057
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 71 deletions.
14 changes: 7 additions & 7 deletions pkg/federation/sdlmerge/remove_duplicate_fielded_value_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ func (r *removeDuplicateFieldedValueTypesVisitor) EnterInputObjectTypeDefinition
refs := document.InputObjectTypeDefinitions[ref].InputFieldsDefinition.Refs
input, exists := r.valueTypeSet[name]
if exists {
if !AreFieldsIdentical(input, refs) {
if !input.AreFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrDuplicateValueTypesMustBeIdenticalToFederate(name))
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInputObjectTypeDefinition, Ref: ref})
} else {
r.valueTypeSet[name] = NewInputFieldedValueType(document, refs)
r.valueTypeSet[name] = NewFieldedValueType(document, ast.NodeKindInputValueDefinition, refs)
}
r.lastInputRef = ref
}
Expand All @@ -67,14 +67,14 @@ func (r *removeDuplicateFieldedValueTypesVisitor) EnterInterfaceTypeDefinition(r
document := r.document
name := document.InterfaceTypeDefinitionNameString(ref)
refs := document.InterfaceTypeDefinitions[ref].FieldsDefinition.Refs
i, exists := r.valueTypeSet[name]
iFace, exists := r.valueTypeSet[name]
if exists {
if !AreFieldsIdentical(i, refs) {
if !iFace.AreFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrDuplicateValueTypesMustBeIdenticalToFederate(name))
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInterfaceTypeDefinition, Ref: ref})
} else {
r.valueTypeSet[name] = NewNonInputFieldedValueType(document, refs)
r.valueTypeSet[name] = NewFieldedValueType(document, ast.NodeKindFieldDefinition, refs)
}
r.lastInterfaceRef = ref
}
Expand All @@ -88,12 +88,12 @@ func (r *removeDuplicateFieldedValueTypesVisitor) EnterObjectTypeDefinition(ref
refs := document.ObjectTypeDefinitions[ref].FieldsDefinition.Refs
object, exists := r.valueTypeSet[name]
if exists {
if !AreFieldsIdentical(object, refs) {
if !object.AreFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrDuplicateValueTypesMustBeIdenticalToFederate(name))
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindObjectTypeDefinition, Ref: ref})
} else {
r.valueTypeSet[name] = NewNonInputFieldedValueType(document, refs)
r.valueTypeSet[name] = NewFieldedValueType(document, ast.NodeKindFieldDefinition, refs)
}
r.lastObjectRef = ref
}
Expand Down
98 changes: 34 additions & 64 deletions pkg/federation/sdlmerge/sdlmerge.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,34 +103,31 @@ func (m *normalizer) normalize(operation *ast.Document) error {
return nil
}

type FieldedValueType interface {
FieldRefs() []int
FieldSet() map[string]string
fieldName(ref int) string
fieldTypeName(ref int) string
}

type NonInputFieldedValueType struct {
type FieldedValueType struct {
document *ast.Document
fieldKind ast.NodeKind
fieldRefs []int
fieldSet map[string]string
}

func createFieldSet(f FieldedValueType) map[string]string {
fieldSet := make(map[string]string)
for _, fieldRef := range f.FieldRefs() {
fieldSet[f.fieldName(fieldRef)] = f.fieldTypeName(fieldRef)
func NewFieldedValueType(document *ast.Document, fieldKind ast.NodeKind, fieldRefs []int) FieldedValueType {
f := FieldedValueType{
document,
fieldKind,
fieldRefs,
nil,
}
return fieldSet
f.createFieldSet()
return f
}

func AreFieldsIdentical(f FieldedValueType, fieldRefsToCompare []int) bool {
if len(f.FieldRefs()) != len(fieldRefsToCompare) {
func (f FieldedValueType) AreFieldsIdentical(fieldRefsToCompare []int) bool {
if len(f.fieldRefs) != len(fieldRefsToCompare) {
return false
}
for _, fieldRef := range fieldRefsToCompare {
actualFieldName := f.fieldName(fieldRef)
expectedTypeName, exists := f.FieldSet()[actualFieldName]
expectedTypeName, exists := f.fieldSet[actualFieldName]
if !exists {
return false
}
Expand All @@ -142,31 +139,32 @@ func AreFieldsIdentical(f FieldedValueType, fieldRefsToCompare []int) bool {
return true
}

func NewNonInputFieldedValueType(document *ast.Document, fieldRefs []int) NonInputFieldedValueType {
i := NonInputFieldedValueType{
document,
fieldRefs,
nil,
func (f FieldedValueType) createFieldSet() {
fieldSet := make(map[string]string)
for _, fieldRef := range f.fieldRefs {
fieldSet[f.fieldName(fieldRef)] = f.fieldTypeName(fieldRef)
}
i.fieldSet = createFieldSet(i)
return i
}

func (n NonInputFieldedValueType) FieldRefs() []int {
return n.fieldRefs
}

func (n NonInputFieldedValueType) FieldSet() map[string]string {
return n.fieldSet
f.fieldSet = fieldSet
}

func (n NonInputFieldedValueType) fieldName(ref int) string {
return n.document.FieldDefinitionNameString(ref)
func (f FieldedValueType) fieldName(ref int) string {
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
return f.document.InputValueDefinitionNameString(ref)
default:
return f.document.FieldDefinitionNameString(ref)
}
}

func (n NonInputFieldedValueType) fieldTypeName(ref int) string {
document := n.document
typeRef := document.FieldDefinitions[ref].Type
func (f FieldedValueType) fieldTypeName(ref int) string {
document := f.document
var typeRef = ast.InvalidRef
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
typeRef = document.InputValueDefinitions[ref].Type
default:
typeRef = document.FieldDefinitions[ref].Type
}
return document.TypeNameString(typeRef)
}

Expand All @@ -176,34 +174,6 @@ type InputFieldedValueType struct {
fieldSet map[string]string
}

func NewInputFieldedValueType(document *ast.Document, fieldRefs []int) InputFieldedValueType {
i := InputFieldedValueType{
document,
fieldRefs,
nil,
}
i.fieldSet = createFieldSet(i)
return i
}

func (i InputFieldedValueType) FieldRefs() []int {
return i.fieldRefs
}

func (i InputFieldedValueType) FieldSet() map[string]string {
return i.fieldSet
}

func (i InputFieldedValueType) fieldName(ref int) string {
return i.document.InputValueDefinitionNameString(ref)
}

func (i InputFieldedValueType) fieldTypeName(ref int) string {
document := i.document
typeRef := document.InputValueDefinitions[ref].Type
return document.TypeNameString(typeRef)
}

type FieldlessValueType interface {
AreValuesIdentical(valueRefsToCompare []int) bool
valueRefs() []int
Expand Down

0 comments on commit d12e057

Please sign in to comment.