From a9ec1036e2395e10e6fb02bacbbc849fd2c57703 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 19 Jul 2015 07:24:42 -0500 Subject: [PATCH] wip related to implementing executor.execute func --- executor/executor.go | 22 +++++++++++++++++- executor/values.go | 23 +++++++++++++++++++ language/ast/ast.go | 16 +------------ language/fd/fd.go | 54 ++++++++++++++++++++++++++++++++++++++++++++ language/od/od.go | 5 ++++ 5 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 executor/values.go create mode 100644 language/fd/fd.go diff --git a/executor/executor.go b/executor/executor.go index c808cdfc..b1b7bca1 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -5,6 +5,7 @@ import ( "github.com/chris-ramon/graphql-go/errors" "github.com/chris-ramon/graphql-go/language/ast" + "github.com/chris-ramon/graphql-go/language/fd" "github.com/chris-ramon/graphql-go/language/kinds" "github.com/chris-ramon/graphql-go/language/od" "github.com/chris-ramon/graphql-go/types" @@ -47,7 +48,7 @@ func Execute(p ExecuteParams, r chan types.GraphQLResult) { type ExecutionContext struct { Schema types.GraphQLSchema Result types.GraphQLResult - Fragments map[string]ast.FragmentDefinition + Fragments map[string]fd.FragmentDefinition Root map[string]interface{} Operation od.OperationDefinition Variables map[string]interface{} @@ -144,5 +145,24 @@ func buildExecutionContext(p BuildExecutionCtxParams) (eCtx ExecutionContext) { }) return eCtx } + var opName string + if p.OperationName == "" { + var i int + for k, _ := range operations { + opName = k + if i == 0 { + break + } + } + p.OperationName = opName + } + //TODO: validate if operations[opName] is an empty struct + //var operation ast.Definition + //if (operations[opName].(od.OperationDefinition) == od.OperationDefinition{}) || (operations[opName].(fd.FragmentDefinition) == fd.FragmentDefinition{}) { + //p.Result.Errors = append(p.Result.Errors, errors.GraphQLFormattedError{ + //Message: fmt.Sprintf("Unknown operation name: %s", opName), + //}) + //return eCtx + //} return eCtx } diff --git a/executor/values.go b/executor/values.go new file mode 100644 index 00000000..c10a9949 --- /dev/null +++ b/executor/values.go @@ -0,0 +1,23 @@ +package executor + +import ( + "github.com/chris-ramon/graphql-go/language/ast" + "github.com/chris-ramon/graphql-go/types" +) + +//export function getVariableValues( +//schema: GraphQLSchema, +//definitionASTs: Array, +//inputs: { [key: string]: any } +//): { [key: string]: any } { +//return definitionASTs.reduce((values, defAST) => { +//var varName = defAST.variable.name.value; +//values[varName] = getVariableValue(schema, defAST, inputs[varName]); +//return values; +//}, {}); +//} + +func GetVariableValues(schema types.GraphQLSchema, definitionASTs []ast.VariableDefinition, inputs map[string]interface{}) (r map[string]interface{}) { + //TODO: use reduce + return r +} diff --git a/language/ast/ast.go b/language/ast/ast.go index 1d0b0c8f..b4049f0d 100644 --- a/language/ast/ast.go +++ b/language/ast/ast.go @@ -32,6 +32,7 @@ type Definition interface { GetOperation() string GetName() Name GetVariableDefinitions() []VariableDefinition + GetTypeCondition() Name GetDirectives() []Directive GetSelectionSet() SelectionSet } @@ -80,21 +81,6 @@ func NewDirective() *Directive { } } -type FragmentDefinition struct { - Kind string - Loc Location - Name Name - TypeCondition Name - Directives []Directive - SelectionSet SelectionSet -} - -func NewFragmentDefinition() *FragmentDefinition { - return &FragmentDefinition{ - Kind: "FragmentDefinition", - } -} - type Location struct { Start int End int diff --git a/language/fd/fd.go b/language/fd/fd.go new file mode 100644 index 00000000..280550de --- /dev/null +++ b/language/fd/fd.go @@ -0,0 +1,54 @@ +package fd + +import ( + . "github.com/chris-ramon/graphql-go/language/ast" +) + +type FragmentDefinition struct { + Kind string + Loc Location + Operation string + Name Name + VariableDefinitions []VariableDefinition + TypeCondition Name + Directives []Directive + SelectionSet SelectionSet +} + +func NewFragmentDefinition() *FragmentDefinition { + return &FragmentDefinition{ + Kind: "FragmentDefinition", + } +} + +func GetKind(fd *FragmentDefinition) string { + return fd.Kind +} + +func GetLoc(fd *FragmentDefinition) Location { + return fd.Loc +} + +func GetOperation(fd *FragmentDefinition) string { + return fd.Operation +} + +func GetName(fd *FragmentDefinition) Name { + return fd.Name +} + +func GetTypeCondition(fd *FragmentDefinition) Name { + return fd.TypeCondition +} + +func GetVariableDefinitions(fd *FragmentDefinition) []VariableDefinition { + return fd.VariableDefinitions +} + +func GetDirectives(fd *FragmentDefinition) []Directive { + return fd.Directives +} + +func GetSelectionSet(fd *FragmentDefinition) SelectionSet { + return fd.SelectionSet +} diff --git a/language/od/od.go b/language/od/od.go index 0f1b68b8..43d5b4aa 100644 --- a/language/od/od.go +++ b/language/od/od.go @@ -10,6 +10,7 @@ type OperationDefinition struct { Operation string Name Name VariableDefinitions []VariableDefinition + TypeCondition Name Directives []Directive SelectionSet SelectionSet } @@ -30,6 +31,10 @@ func GetName(op *OperationDefinition) Name { return op.Name } +func GetTypeCondition(op *OperationDefinition) Name { + return op.TypeCondition +} + func GetVariableDefinitions(op *OperationDefinition) []VariableDefinition { return op.VariableDefinitions }