Guest User

Untitled

a guest
Mar 24th, 2018
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.56 KB | None | 0 0
  1. From f78d920327dd738dd91ccb16a9fe78fe59a4908b Mon Sep 17 00:00:00 2001
  2. From: Vladislav Fursov <ghostrussian@gmail.com>
  3. Date: Fri, 16 Mar 2018 06:12:06 +0900
  4. Subject: [PATCH] separate resolver
  5.  
  6. ---
  7. internal/exec/exec.go | 12 ++++++++-
  8. internal/exec/resolvable/resolvable.go | 48 ++++++++++++++++++++++++++--------
  9. 2 files changed, 48 insertions(+), 12 deletions(-)
  10.  
  11. diff --git a/internal/exec/exec.go b/internal/exec/exec.go
  12. index f714961..88d44f5 100644
  13. --- a/internal/exec/exec.go
  14. +++ b/internal/exec/exec.go
  15. @@ -40,7 +40,17 @@ func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.O
  16. func() {
  17. defer r.handlePanic(ctx)
  18. sels := selected.ApplyOperation(&r.Request, s, op)
  19. - r.execSelections(ctx, sels, nil, s.Resolver, &out, op.Type == query.Mutation)
  20. +
  21. + var resolver reflect.Value
  22. + switch op.Type {
  23. + case query.Query:
  24. + resolver = s.QueryResolver
  25. + case query.Mutation:
  26. + resolver = s.MutationResolver
  27. + default:
  28. + panic("unknown query operation")
  29. + }
  30. + r.execSelections(ctx, sels, nil, resolver, &out, op.Type == query.Mutation)
  31. }()
  32.  
  33. if err := ctx.Err(); err != nil {
  34. diff --git a/internal/exec/resolvable/resolvable.go b/internal/exec/resolvable/resolvable.go
  35. index b7c1d93..970aef6 100644
  36. --- a/internal/exec/resolvable/resolvable.go
  37. +++ b/internal/exec/resolvable/resolvable.go
  38. @@ -5,7 +5,6 @@ import (
  39. "fmt"
  40. "reflect"
  41. "strings"
  42. -
  43. "github.com/graph-gophers/graphql-go/internal/common"
  44. "github.com/graph-gophers/graphql-go/internal/exec/packer"
  45. "github.com/graph-gophers/graphql-go/internal/schema"
  46. @@ -13,9 +12,10 @@ import (
  47.  
  48. type Schema struct {
  49. schema.Schema
  50. - Query Resolvable
  51. - Mutation Resolvable
  52. - Resolver reflect.Value
  53. + Query Resolvable
  54. + Mutation Resolvable
  55. + QueryResolver reflect.Value
  56. + MutationResolver reflect.Value
  57. }
  58.  
  59. type Resolvable interface {
  60. @@ -54,19 +54,44 @@ func (*Object) isResolvable() {}
  61. func (*List) isResolvable() {}
  62. func (*Scalar) isResolvable() {}
  63.  
  64. +type Queryer interface {
  65. + Query() interface{}
  66. +}
  67. +
  68. +type Mutationer interface {
  69. + Mutation() interface{}
  70. +}
  71. +
  72. func ApplyResolver(s *schema.Schema, resolver interface{}) (*Schema, error) {
  73. b := newBuilder(s)
  74.  
  75. - var query, mutation Resolvable
  76. + var (
  77. + query, mutation Resolvable
  78. + queryResolver, mutationResolver reflect.Value
  79. + )
  80. +
  81. + sqr, isSeparateQueryResolver := resolver.(Queryer)
  82. + if isSeparateQueryResolver {
  83. + queryResolver = reflect.ValueOf(sqr.Query())
  84. + } else {
  85. + queryResolver = reflect.ValueOf(resolver)
  86. + }
  87. +
  88. + smr, isSeparateMutationResolver := resolver.(Mutationer)
  89. + if isSeparateMutationResolver {
  90. + mutationResolver = reflect.ValueOf(smr.Mutation())
  91. + } else {
  92. + mutationResolver = reflect.ValueOf(resolver)
  93. + }
  94.  
  95. if t, ok := s.EntryPoints["query"]; ok {
  96. - if err := b.assignExec(&query, t, reflect.TypeOf(resolver)); err != nil {
  97. + if err := b.assignExec(&query, t, queryResolver.Type()); err != nil {
  98. return nil, err
  99. }
  100. }
  101.  
  102. if t, ok := s.EntryPoints["mutation"]; ok {
  103. - if err := b.assignExec(&mutation, t, reflect.TypeOf(resolver)); err != nil {
  104. + if err := b.assignExec(&mutation, t, mutationResolver.Type()); err != nil {
  105. return nil, err
  106. }
  107. }
  108. @@ -76,10 +101,11 @@ func ApplyResolver(s *schema.Schema, resolver interface{}) (*Schema, error) {
  109. }
  110.  
  111. return &Schema{
  112. - Schema: *s,
  113. - Resolver: reflect.ValueOf(resolver),
  114. - Query: query,
  115. - Mutation: mutation,
  116. + Schema: *s,
  117. + Query: query,
  118. + Mutation: mutation,
  119. + QueryResolver: queryResolver,
  120. + MutationResolver: mutationResolver,
  121. }, nil
  122. }
  123.  
  124. --
  125. 2.16.2
Add Comment
Please, Sign In to add comment