Skip to content

Commit 5103316

Browse files
committed
Memoize field maps for Objects and Interfaces
1 parent 9b5a661 commit 5103316

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

definition.go

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,11 @@ type Object struct {
365365
PrivateDescription string `json:"description"`
366366
IsTypeOf IsTypeOfFn
367367

368-
typeConfig ObjectConfig
369-
fields FieldDefinitionMap
370-
interfaces []*Interface
368+
typeConfig ObjectConfig
369+
initialisedFields bool
370+
fields FieldDefinitionMap
371+
initialisedInterfaces bool
372+
interfaces []*Interface
371373
// Interim alternative to throwing an error during schema definition at run-time
372374
err error
373375
}
@@ -441,20 +443,30 @@ func (gt *Object) String() string {
441443
return gt.PrivateName
442444
}
443445
func (gt *Object) Fields() FieldDefinitionMap {
446+
if gt.initialisedFields {
447+
return gt.fields
448+
}
449+
444450
var configureFields Fields
445451
switch gt.typeConfig.Fields.(type) {
446452
case Fields:
447453
configureFields = gt.typeConfig.Fields.(Fields)
448454
case FieldsThunk:
449455
configureFields = gt.typeConfig.Fields.(FieldsThunk)()
450456
}
457+
451458
fields, err := defineFieldMap(gt, configureFields)
452459
gt.err = err
453460
gt.fields = fields
461+
gt.initialisedFields = true
454462
return gt.fields
455463
}
456464

457465
func (gt *Object) Interfaces() []*Interface {
466+
if gt.initialisedInterfaces {
467+
return gt.interfaces
468+
}
469+
458470
var configInterfaces []*Interface
459471
switch gt.typeConfig.Interfaces.(type) {
460472
case InterfacesThunk:
@@ -463,14 +475,18 @@ func (gt *Object) Interfaces() []*Interface {
463475
configInterfaces = gt.typeConfig.Interfaces.([]*Interface)
464476
case nil:
465477
default:
466-
gt.err = fmt.Errorf("Unknown Object.Interfaces type: %v", reflect.TypeOf(gt.typeConfig.Interfaces))
478+
gt.err = fmt.Errorf("Unknown Object.Interfaces type: %T", gt.typeConfig.Interfaces)
479+
gt.initialisedInterfaces = true
467480
return nil
468481
}
482+
469483
interfaces, err := defineInterfaces(gt, configInterfaces)
470484
gt.err = err
471485
gt.interfaces = interfaces
486+
gt.initialisedInterfaces = true
472487
return gt.interfaces
473488
}
489+
474490
func (gt *Object) Error() error {
475491
return gt.err
476492
}
@@ -507,15 +523,7 @@ func defineInterfaces(ttype *Object, interfaces []*Interface) ([]*Interface, err
507523
return ifaces, nil
508524
}
509525

510-
func defineFieldMap(ttype Named, fields interface{}) (FieldDefinitionMap, error) {
511-
var fieldMap Fields
512-
switch fields.(type) {
513-
case Fields:
514-
fieldMap = fields.(Fields)
515-
case FieldsThunk:
516-
fieldMap = fields.(FieldsThunk)()
517-
}
518-
526+
func defineFieldMap(ttype Named, fieldMap Fields) (FieldDefinitionMap, error) {
519527
resultFieldMap := FieldDefinitionMap{}
520528

521529
err := invariant(
@@ -695,9 +703,10 @@ type Interface struct {
695703
PrivateDescription string `json:"description"`
696704
ResolveType ResolveTypeFn
697705

698-
typeConfig InterfaceConfig
699-
fields FieldDefinitionMap
700-
err error
706+
typeConfig InterfaceConfig
707+
initialisedFields bool
708+
fields FieldDefinitionMap
709+
err error
701710
}
702711
type InterfaceConfig struct {
703712
Name string `json:"name"`
@@ -753,28 +762,39 @@ func (it *Interface) AddFieldConfig(fieldName string, fieldConfig *Field) {
753762
it.typeConfig.Fields.(Fields)[fieldName] = fieldConfig
754763
}
755764
}
765+
756766
func (it *Interface) Name() string {
757767
return it.PrivateName
758768
}
769+
759770
func (it *Interface) Description() string {
760771
return it.PrivateDescription
761772
}
773+
762774
func (it *Interface) Fields() (fields FieldDefinitionMap) {
775+
if it.initialisedFields {
776+
return it.fields
777+
}
778+
763779
var configureFields Fields
764780
switch it.typeConfig.Fields.(type) {
765781
case Fields:
766782
configureFields = it.typeConfig.Fields.(Fields)
767783
case FieldsThunk:
768784
configureFields = it.typeConfig.Fields.(FieldsThunk)()
769785
}
786+
770787
fields, err := defineFieldMap(it, configureFields)
771788
it.err = err
772789
it.fields = fields
790+
it.initialisedFields = true
773791
return it.fields
774792
}
793+
775794
func (it *Interface) String() string {
776795
return it.PrivateName
777796
}
797+
778798
func (it *Interface) Error() error {
779799
return it.err
780800
}

0 commit comments

Comments
 (0)