Skip to content

Commit 59637ea

Browse files
authored
Merge pull request #493 from bhoriuchi/master
adds a field sort by source location before executing serially
2 parents d925012 + b6b24cf commit 59637ea

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

executor.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"reflect"
8+
"sort"
89
"strings"
910

1011
"github.com/graphql-go/graphql/gqlerrors"
@@ -254,7 +255,9 @@ func executeFieldsSerially(p executeFieldsParams) *Result {
254255
}
255256

256257
finalResults := make(map[string]interface{}, len(p.Fields))
257-
for responseName, fieldASTs := range p.Fields {
258+
for _, orderedField := range orderedFields(p.Fields) {
259+
responseName := orderedField.responseName
260+
fieldASTs := orderedField.fieldASTs
258261
fieldPath := p.Path.WithKey(responseName)
259262
resolved, state := resolveField(p.ExecutionContext, p.ParentType, p.Source, fieldASTs, fieldPath)
260263
if state.hasNoFieldDefs {
@@ -1038,3 +1041,39 @@ func getFieldDef(schema Schema, parentType *Object, fieldName string) *FieldDefi
10381041
}
10391042
return parentType.Fields()[fieldName]
10401043
}
1044+
1045+
// contains field information that will be placed in an ordered slice
1046+
type orderedField struct {
1047+
responseName string
1048+
fieldASTs []*ast.Field
1049+
}
1050+
1051+
// orders fields from a fields map by location in the source
1052+
func orderedFields(fields map[string][]*ast.Field) []*orderedField {
1053+
orderedFields := []*orderedField{}
1054+
fieldMap := map[int]*orderedField{}
1055+
startLocs := []int{}
1056+
1057+
for responseName, fieldASTs := range fields {
1058+
// find the lowest location in the current fieldASTs
1059+
lowest := -1
1060+
for _, fieldAST := range fieldASTs {
1061+
loc := fieldAST.GetLoc().Start
1062+
if lowest == -1 || loc < lowest {
1063+
lowest = loc
1064+
}
1065+
}
1066+
startLocs = append(startLocs, lowest)
1067+
fieldMap[lowest] = &orderedField{
1068+
responseName: responseName,
1069+
fieldASTs: fieldASTs,
1070+
}
1071+
}
1072+
1073+
sort.Ints(startLocs)
1074+
for _, startLoc := range startLocs {
1075+
orderedFields = append(orderedFields, fieldMap[startLoc])
1076+
}
1077+
1078+
return orderedFields
1079+
}

0 commit comments

Comments
 (0)