Skip to content

Commit 2bab8f2

Browse files
committed
Remove duplicate code for query processing
1 parent 717710a commit 2bab8f2

9 files changed

Lines changed: 669 additions & 501 deletions

File tree

dgraph/cmd/alpha/http.go

Lines changed: 74 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"compress/gzip"
2222
"context"
2323
"encoding/json"
24-
"fmt"
2524
"io"
2625
"io/ioutil"
2726
"net/http"
@@ -158,6 +157,26 @@ func writeResponse(w http.ResponseWriter, r *http.Request, b []byte) (int, error
158157
return out.Write(b)
159158
}
160159

160+
func writeEntry(out *bytes.Buffer, key string, js []byte) error {
161+
if _, err := out.WriteRune('"'); err != nil {
162+
return err
163+
}
164+
if _, err := out.WriteString(key); err != nil {
165+
return err
166+
}
167+
if _, err := out.WriteRune('"'); err != nil {
168+
return err
169+
}
170+
if _, err := out.WriteRune(':'); err != nil {
171+
return err
172+
}
173+
if _, err := out.Write(js); err != nil {
174+
return err
175+
}
176+
177+
return nil
178+
}
179+
161180
// This method should just build the request and proxy it to the Query method of dgraph.Server.
162181
// It can then encode the response as appropriate before sending it back to the user.
163182
func queryHandler(w http.ResponseWriter, r *http.Request) {
@@ -254,25 +273,6 @@ func queryHandler(w http.ResponseWriter, r *http.Request) {
254273
}
255274

256275
var out bytes.Buffer
257-
writeEntry := func(key string, js []byte) error {
258-
if _, err := out.WriteRune('"'); err != nil {
259-
return err
260-
}
261-
if _, err := out.WriteString(key); err != nil {
262-
return err
263-
}
264-
if _, err := out.WriteRune('"'); err != nil {
265-
return err
266-
}
267-
if _, err := out.WriteRune(':'); err != nil {
268-
return err
269-
}
270-
if _, err := out.Write(js); err != nil {
271-
return err
272-
}
273-
return nil
274-
}
275-
276276
e := query.Extensions{
277277
Txn: resp.Txn,
278278
Latency: resp.Latency,
@@ -288,15 +288,15 @@ func queryHandler(w http.ResponseWriter, r *http.Request) {
288288
x.SetStatusWithData(w, x.Error, err.Error())
289289
return
290290
}
291-
if err := writeEntry("data", resp.Json); err != nil {
291+
if err := writeEntry(&out, "data", resp.Json); err != nil {
292292
x.SetStatusWithData(w, x.Error, err.Error())
293293
return
294294
}
295295
if _, err := out.WriteRune(','); err != nil {
296296
x.SetStatusWithData(w, x.Error, err.Error())
297297
return
298298
}
299-
if err := writeEntry("extensions", js); err != nil {
299+
if err := writeEntry(&out, "extensions", js); err != nil {
300300
x.SetStatusWithData(w, x.Error, err.Error())
301301
return
302302
}
@@ -409,22 +409,61 @@ func mutationHandler(w http.ResponseWriter, r *http.Request) {
409409
e.Txn.Keys = e.Txn.Keys[:0]
410410
}
411411

412-
response := map[string]interface{}{}
413-
response["extensions"] = e
414-
mp := map[string]interface{}{}
415-
mp["code"] = x.Success
416-
mp["message"] = "Done"
417-
mp["uids"] = resp.Uids
418-
if len(resp.Vars) > 0 {
419-
vars := make(map[string][]string)
420-
// Flatten the mutated map so that it is easier to parse for the client.
421-
for v, uids := range resp.Vars {
422-
vars[fmt.Sprintf("uid(%s)", v)] = uids.GetUids()
412+
var out bytes.Buffer
413+
// If response is either empty or only contains empty braces {}, it's a no-op
414+
if len(resp.Json) > 2 {
415+
var i int
416+
for i = len(resp.Json) - 1; i >= 0; i-- {
417+
if resp.Json[i] == '}' {
418+
break
419+
}
420+
}
421+
422+
out = *bytes.NewBuffer(resp.Json[:i])
423+
if _, err := out.WriteRune(','); err != nil {
424+
x.SetStatusWithData(w, x.Error, err.Error())
425+
return
426+
}
427+
} else {
428+
if _, err := out.WriteRune('{'); err != nil {
429+
x.SetStatusWithData(w, x.Error, err.Error())
430+
return
423431
}
424-
mp["vars"] = vars
425432
}
426-
response["data"] = mp
427433

434+
if err := writeEntry(&out, "code", []byte("\""+x.Success+"\"")); err != nil {
435+
x.SetStatusWithData(w, x.Error, err.Error())
436+
return
437+
}
438+
if _, err := out.WriteRune(','); err != nil {
439+
x.SetStatusWithData(w, x.Error, err.Error())
440+
return
441+
}
442+
if err := writeEntry(&out, "message", []byte("\"Done\"")); err != nil {
443+
x.SetStatusWithData(w, x.Error, err.Error())
444+
return
445+
}
446+
if _, err := out.WriteRune(','); err != nil {
447+
x.SetStatusWithData(w, x.Error, err.Error())
448+
return
449+
}
450+
uids, err := json.Marshal(resp.Uids)
451+
if err != nil {
452+
x.SetStatusWithData(w, x.Error, err.Error())
453+
return
454+
}
455+
if err := writeEntry(&out, "uids", uids); err != nil {
456+
x.SetStatusWithData(w, x.Error, err.Error())
457+
return
458+
}
459+
if _, err := out.WriteRune('}'); err != nil {
460+
x.SetStatusWithData(w, x.Error, err.Error())
461+
return
462+
}
463+
464+
response := map[string]interface{}{}
465+
response["extensions"] = e
466+
response["data"] = json.RawMessage(out.Bytes())
428467
js, err := json.Marshal(response)
429468
if err != nil {
430469
x.SetStatusWithData(w, x.Error, err.Error())

dgraph/cmd/alpha/http_test.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ type mutationResponse struct {
166166
keys []string
167167
preds []string
168168
startTs uint64
169-
vars map[string][]string
169+
data json.RawMessage
170170
}
171171

172172
func mutationWithTs(m, t string, isJson bool, commitNow bool, ts uint64) (
@@ -193,18 +193,22 @@ func mutationWithTs(m, t string, isJson bool, commitNow bool, ts uint64) (
193193
return mr, err
194194
}
195195

196-
type resData struct {
197-
MutationVars map[string][]string `json:"vars"`
198-
}
199-
var rd resData
200-
if err := json.Unmarshal(r.Data, &rd); err != nil {
201-
return mr, err
202-
}
203-
204-
mr.vars = rd.MutationVars
205196
mr.keys = r.Extensions.Txn.Keys
206197
mr.preds = r.Extensions.Txn.Preds
207198
mr.startTs = r.Extensions.Txn.StartTs
199+
sort.Strings(mr.preds)
200+
201+
var d map[string]interface{}
202+
if err := json.Unmarshal(r.Data, &d); err != nil {
203+
return mr, err
204+
}
205+
delete(d, "code")
206+
delete(d, "message")
207+
delete(d, "uids")
208+
mr.data, err = json.Marshal(d)
209+
if err != nil {
210+
return mr, err
211+
}
208212
return mr, nil
209213
}
210214

0 commit comments

Comments
 (0)