Skip to content

Commit

Permalink
Dataloader key field slice support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmytro Garanzha committed Jan 16, 2019
1 parent 644ade1 commit c47dae2
Show file tree
Hide file tree
Showing 12 changed files with 166 additions and 28 deletions.
7 changes: 4 additions & 3 deletions generator/plugins/dataloader/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ type DataLoaderProviderConfig struct {
WaitDurationMs int `mapstructure:"wait_duration_ms"`
}
type DataLoaderFieldConfig struct {
FieldName string `mapstructure:"field_name"`
KeyFieldName string `mapstructure:"key_field_name"`
DataLoader string `mapstructure:"data_loader_name"`
FieldName string `mapstructure:"field_name"`
KeyFieldName string `mapstructure:"key_field_name"`
KeyFieldSlice bool `mapstructure:"key_field_slice"`
DataLoader string `mapstructure:"data_loader_name"`
}
21 changes: 18 additions & 3 deletions generator/plugins/dataloader/field_renderers.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,25 @@ func (r *fieldsRenderer) RenderFields(o graphql.OutputObject, ctx graphql.BodyCo
"loadersPkg": func() string {
return ctx.Importer.New(r.dataLoader.Pkg)
},
"graphqlOutputLoaderTypeName": func(ctx graphql.BodyContext, dataLoaderName string) string {
dataLoaderConfig := r.dataLoader.Loaders[dataLoaderName]
"graphqlOutputLoaderTypeName": func(ctx graphql.BodyContext, dataLoaderFieldConfig graphql.DataLoaderField) string {
dataLoaderConfig := r.dataLoader.Loaders[dataLoaderFieldConfig.DataLoaderName]

return dataLoaderConfig.OutputGraphqlType(ctx)
resolver := dataLoaderConfig.OutputGraphqlType

if dataLoaderFieldConfig.KeyFieldSlice {
resolver = graphql.GqlListTypeResolver(resolver)
}

res := resolver(ctx)

return res
},
"outputGoType": func(ctx graphql.BodyContext, dataLoaderFieldConfig graphql.DataLoaderField) string {
dataLoaderConfig := r.dataLoader.Loaders[dataLoaderFieldConfig.DataLoaderName]

typ := dataLoaderConfig.OutputGoType

return typ.String(ctx.Importer)
},
}

Expand Down
12 changes: 6 additions & 6 deletions generator/plugins/dataloader/templates.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{{$.OutputObject.VariableName}}.AddFieldConfig("{{$field.Name}}", &{{gqlPkg}}.Field{
Name: "{{$field.Name}}",
Description: "",
Type: {{graphqlOutputLoaderTypeName $.ObjectContext $field.DataLoaderName}},
Type: {{graphqlOutputLoaderTypeName $.ObjectContext $field}},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
parent := p.Source.(*{{goType $.OutputObject.GoType}})

Expand All @@ -13,11 +13,37 @@
return nil, errors.New("Data loaders not found in context. Call loaders.GetContextWithLoaders")
}

{{if $field.KeyFieldSlice}}
results := make([]func() (({{outputGoType $.ObjectContext $field}}), error), len(parent.{{$field.NormalizedParentKeyFieldName}}))

for i, key := range parent.{{$field.NormalizedParentKeyFieldName}} {
results[i] = loaders.{{$field.DataLoaderName}}Loader.LoadThunk(key)
}

return func() (interface{}, error) {
var lastErr error

data := make([]{{outputGoType $.ObjectContext $field}}, len(parent.{{$field.NormalizedParentKeyFieldName}}))

for i, thunk := range results {
var err error

data[i], err = thunk()

if err != nil {
lastErr = err
}
}

return data, lastErr
}, nil
{{else}}
thunk := loaders.{{$field.DataLoaderName}}Loader.LoadThunk(parent.{{$field.NormalizedParentKeyFieldName}})

return func() (interface{}, error) {
return thunk()
}, nil
{{end}}
},
})
{{ end -}}
1 change: 1 addition & 0 deletions generator/plugins/graphql/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ type DataLoaderField struct {
Name string
Type string
ParentKeyFieldName string
KeyFieldSlice bool
NormalizedParentKeyFieldName string
DataLoaderName string
}
Expand Down
14 changes: 7 additions & 7 deletions generator/plugins/graphql/templates.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions generator/plugins/proto2gql/messages_outputs.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ func (g *Proto2GraphQL) dataLoaderFields(configs []dataloader.DataLoaderFieldCon
Name: cfg.FieldName,
NormalizedParentKeyFieldName: camelCase(cfg.KeyFieldName),
ParentKeyFieldName: cfg.KeyFieldName,
KeyFieldSlice: cfg.KeyFieldSlice,
DataLoaderName: cfg.DataLoader,
}

Expand Down
1 change: 1 addition & 0 deletions generator/plugins/swagger2gql/output_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ func (p *Plugin) dataLoaderFields(configs []dataloader.DataLoaderFieldConfig) ([
field := &graphql.DataLoaderField{
Name: cfg.FieldName,
ParentKeyFieldName: cfg.KeyFieldName,
KeyFieldSlice: cfg.KeyFieldSlice,
NormalizedParentKeyFieldName: pascalize(cfg.KeyFieldName),
DataLoaderName: cfg.DataLoader,
}
Expand Down
Loading

0 comments on commit c47dae2

Please sign in to comment.