-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtranslator.go
124 lines (98 loc) · 1.99 KB
/
translator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package graphlator
import (
"fmt"
"strings"
"sync"
)
type Translator struct {
DefaultLanguage Language
buffers sync.Pool
adjustments option
}
func setupTranslator() *Translator {
return &Translator{
DefaultLanguage: GraphQLPlus,
buffers: sync.Pool{
New: func() interface{} {
return &strings.Builder{}
},
},
}
}
func NewTranslator(r ...Regulation) *Translator {
t := setupTranslator()
for _, reg := range r {
reg(&t.adjustments)
}
return t
}
func (t *Translator) TranslateQuery(f Function, r ...Regulation) string {
buf := t.buffers.Get().(*strings.Builder)
defer func() {
buf.Reset()
t.buffers.Put(buf)
}()
buf.WriteString(fmt.Sprintf("{%s(func: %s(",
f.Name, f.Parameter.Operation))
writeOperation(buf, f.Parameter)
buf.WriteString(") ")
if f.Filters != nil {
buf.WriteString("@filter(")
for i, p := range f.Filters.params {
if f.Filters.constraint != invalidConstraint && i != 0 {
buf.WriteString(" " + f.Filters.constraint.String() + " ")
}
buf.WriteString(p.Operation.String() + "(")
writeOperation(buf, p)
}
buf.WriteByte(')')
}
loopResults(buf, f.Results)
buf.WriteByte('}') // End of Query
query := buf.String()
buf.Reset()
t.buffers.Put(buf)
return query
}
func writeOperation(buf StringByteWriter, p Parameter) {
switch p.Operation {
case operationUIDIn:
buf.WriteString(fmt.Sprintf("%s,%v)", p.Predicate, p.Value))
fallthrough
case operationType:
buf.WriteString("\"" + p.Predicate + "\"")
default:
buf.WriteString(p.Predicate)
}
if p.Value != nil {
buf.WriteString(fmt.Sprintf(",%#v", p.Value))
}
buf.WriteByte(')')
}
func loopResults(buf StringByteWriter, r []Result) {
buf.WriteByte('{')
for _, rr := range r {
buf.WriteString(rr.want)
if rr.isExpanded {
loopResults(buf, rr.ResultSlice)
}
buf.WriteByte(' ')
}
buf.WriteByte('}')
}
/*
GraphQL+
{
me(func: type("person")) @filter(eq(name, "Damien")) {
uid
name
}
}
GraphQL
{
person(name: "Damien") {
uid
name
}
}
*/