From a69c58193335a7ee745de8dc9107759707733ce2 Mon Sep 17 00:00:00 2001 From: Pawan Rawal <pawan0201@gmail.com> Date: Tue, 26 Apr 2016 14:08:18 +0530 Subject: [PATCH] Added helper functions for Graph response to client 1. Added Values, HasValue and NumChildren functions --- client/go/main.go | 27 +++++- client/go/main_test.go | 184 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 client/go/main_test.go diff --git a/client/go/main.go b/client/go/main.go index e671f282..a82cea80 100644 --- a/client/go/main.go +++ b/client/go/main.go @@ -29,7 +29,30 @@ import ( var glog = x.Log("client") var ip = flag.String("ip", "127.0.0.1:8081", "Port to communicate with server") -var query = flag.String("query", "", "Query sent to the server") +var q = flag.String("query", "", "Query sent to the server") + +func NumChildren(resp *pb.GraphResponse) int { + return len(resp.Children) +} + +func HasValue(resp *pb.GraphResponse) bool { + for _, val := range resp.Result.Values { + if len(val) > 0 { + return true + } + } + return false +} + +func Values(resp *pb.GraphResponse) []string { + values := []string{} + for _, val := range resp.Result.Values { + if len(val) > 0 { + values = append(values, string(val)) + } + } + return values +} func main() { flag.Parse() @@ -42,7 +65,7 @@ func main() { c := pb.NewDGraphClient(conn) - r, err := c.Query(context.Background(), &pb.GraphRequest{Query: *query}) + r, err := c.Query(context.Background(), &pb.GraphRequest{Query: *q}) if err != nil { x.Err(glog, err).Fatal("Error in getting response from server") } diff --git a/client/go/main_test.go b/client/go/main_test.go new file mode 100644 index 00000000..02fb0348 --- /dev/null +++ b/client/go/main_test.go @@ -0,0 +1,184 @@ +/* + * Copyright 2016 DGraph Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package main + +import ( + "io/ioutil" + "os" + "testing" + "time" + + "github.com/dgraph-io/dgraph/commit" + "github.com/dgraph-io/dgraph/gql" + "github.com/dgraph-io/dgraph/posting" + "github.com/dgraph-io/dgraph/query" + "github.com/dgraph-io/dgraph/store" + "github.com/dgraph-io/dgraph/worker" + "github.com/dgraph-io/dgraph/x" +) + +func addEdge(t *testing.T, edge x.DirectedEdge, l *posting.List) { + if err := l.AddMutation(edge, posting.Set); err != nil { + t.Error(err) + } +} + +func populateGraph(t *testing.T) (string, *store.Store) { + // logrus.SetLevel(logrus.DebugLevel) + dir, err := ioutil.TempDir("", "storetest_") + if err != nil { + t.Error(err) + return "", nil + } + + ps := new(store.Store) + ps.Init(dir) + + worker.Init(ps, nil, 0, 1) + + clog := commit.NewLogger(dir, "mutations", 50<<20) + clog.Init() + posting.Init(clog) + + // So, user we're interested in has uid: 1. + // She has 4 friends: 23, 24, 25, 31, and 101 + edge := x.DirectedEdge{ + ValueId: 23, + Source: "testing", + Timestamp: time.Now(), + } + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "friend"), ps)) + + edge.ValueId = 24 + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "friend"), ps)) + + edge.ValueId = 25 + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "friend"), ps)) + + edge.ValueId = 31 + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "friend"), ps)) + + edge.ValueId = 101 + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "friend"), ps)) + + // Now let's add a few properties for the main user. + edge.Value = "Michonne" + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "name"), ps)) + + edge.Value = "female" + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "gender"), ps)) + + edge.Value = "alive" + addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "status"), ps)) + + // Now let's add a name for each of the friends, except 101. + edge.Value = "Rick Grimes" + addEdge(t, edge, posting.GetOrCreate(posting.Key(23, "name"), ps)) + + edge.Value = "Glenn Rhee" + addEdge(t, edge, posting.GetOrCreate(posting.Key(24, "name"), ps)) + + edge.Value = "Daryl Dixon" + addEdge(t, edge, posting.GetOrCreate(posting.Key(25, "name"), ps)) + + edge.Value = "Andrea" + addEdge(t, edge, posting.GetOrCreate(posting.Key(31, "name"), ps)) + + return dir, ps +} + +func TestQuery(t *testing.T) { + dir, _ := populateGraph(t) + defer os.RemoveAll(dir) + + q0 := ` + { + me(_uid_:0x01) { + name + gender + status + friend { + name + } + } + } + ` + + // Parse GQL into internal query representation. + gq, _, err := gql.Parse(q0) + if err != nil { + t.Error(err) + return + } + g, err := query.ToSubGraph(gq) + if err != nil { + t.Error(err) + return + } + + ch := make(chan error) + go query.ProcessGraph(g, ch) + if err := <-ch; err != nil { + t.Error(err) + return + } + resp, err := g.PreTraverse() + if err != nil { + t.Error(err) + return + } + + if NumChildren(resp) != 4 { + t.Errorf("Expected 4 children, Got: %v", NumChildren(resp)) + } + if HasValue(resp) { + t.Errorf("Expected HasValue to return false, Got: true") + } + + child := resp.Children[0] + if child.Attribute != "name" { + t.Errorf("Expected attribute name, Got: %v", child.Attribute) + } + if !HasValue(child) { + t.Errorf("Expected HasValue to return true, Got: false") + } + if Values(child)[0] != "Michonne" { + t.Errorf("Expected Value to return Michonee, Got %v", Values(child)[0]) + } + + child = resp.Children[3] + if child.Attribute != "friend" { + t.Errorf("Expected attribute friend, Got: %v", child.Attribute) + } + if NumChildren(child) != 1 { + t.Errorf("Expected 1 child, Got: %v", NumChildren(child)) + } + if HasValue(child) { + t.Errorf("Expected HasValue to return false, Got: true") + } + + child = child.Children[0] + if child.Attribute != "name" { + t.Errorf("Expected attribute name, Got: %v", child.Attribute) + } + if !HasValue(child) { + t.Errorf("Expected HasValue to return true, Got: false") + } + if len(Values(child)) != 4 { + t.Errorf("Expected 4 Values. Got: %v", len(Values(child))) + } +} -- GitLab