Skip to content
Snippets Groups Projects
Commit 7be0e39c authored by Pawan Rawal's avatar Pawan Rawal
Browse files

Adding xid field to graph.Node and passing pointer to destination node in

preTraverse()
parent 5a62b48a
No related branches found
No related tags found
No related merge requests found
......@@ -53,9 +53,10 @@ func (*Value) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
type Node struct {
Uid uint64 `protobuf:"varint,1,opt,name=uid" json:"uid,omitempty"`
Attribute string `protobuf:"bytes,2,opt,name=attribute" json:"attribute,omitempty"`
Properties map[string]*Value `protobuf:"bytes,3,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
Children []*Node `protobuf:"bytes,4,rep,name=children" json:"children,omitempty"`
Xid string `protobuf:"bytes,2,opt,name=xid" json:"xid,omitempty"`
Attribute string `protobuf:"bytes,3,opt,name=attribute" json:"attribute,omitempty"`
Properties map[string]*Value `protobuf:"bytes,4,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
Children []*Node `protobuf:"bytes,5,rep,name=children" json:"children,omitempty"`
}
func (m *Node) Reset() { *m = Node{} }
......@@ -155,22 +156,22 @@ var _DGraph_serviceDesc = grpc.ServiceDesc{
}
var fileDescriptor0 = []byte{
// 266 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x5c, 0x90, 0x41, 0x4b, 0xc3, 0x40,
0x10, 0x85, 0x4d, 0x93, 0x8d, 0x76, 0x52, 0x54, 0x46, 0x91, 0x50, 0x05, 0x4b, 0x0e, 0xda, 0x53,
0x90, 0x78, 0x11, 0xbd, 0x2a, 0x1e, 0x04, 0xd1, 0x3d, 0x78, 0x4f, 0xcc, 0x60, 0x17, 0x4b, 0x12,
0x37, 0x1b, 0xa1, 0x3f, 0xd9, 0x7f, 0x61, 0x76, 0xba, 0xd6, 0xd0, 0xdb, 0xcc, 0x7c, 0x33, 0x8f,
0x37, 0x0f, 0x8e, 0x3e, 0x74, 0xde, 0x2c, 0x34, 0xb5, 0x4d, 0x5d, 0xb5, 0x94, 0x36, 0xba, 0x36,
0x35, 0x0a, 0x1e, 0x26, 0xe7, 0xb0, 0x2b, 0xe9, 0xab, 0xa3, 0xd6, 0xe0, 0x31, 0x88, 0xbe, 0xd0,
0xab, 0xd8, 0x9b, 0x79, 0xf3, 0xb1, 0x5c, 0x37, 0xfd, 0x82, 0x78, 0xcb, 0x97, 0x1d, 0xe1, 0x09,
0x84, 0x85, 0xaa, 0x72, 0xc7, 0x27, 0xd2, 0x75, 0xc9, 0x8f, 0x07, 0xc1, 0x73, 0x5d, 0x12, 0x1e,
0x82, 0xdf, 0xa9, 0x92, 0x69, 0x20, 0x6d, 0x89, 0x67, 0x30, 0xce, 0x8d, 0xd1, 0xaa, 0xe8, 0x0c,
0xc5, 0x23, 0x56, 0xfd, 0x1f, 0xe0, 0x1d, 0x40, 0x6f, 0xa5, 0x21, 0x6d, 0x14, 0xb5, 0xb1, 0x3f,
0xf3, 0xe7, 0x51, 0x76, 0x9a, 0xb2, 0xad, 0xd4, 0x0a, 0xa6, 0x2f, 0x1b, 0xfa, 0x50, 0x19, 0xbd,
0x92, 0x83, 0x75, 0xbc, 0x84, 0xbd, 0xf7, 0x85, 0x5a, 0x96, 0x9a, 0xaa, 0x38, 0xe0, 0xd3, 0x68,
0x70, 0x2a, 0x37, 0x70, 0xfa, 0x04, 0x07, 0x5b, 0x3a, 0xd6, 0xe8, 0x27, 0xfd, 0xbd, 0x69, 0x4b,
0x4c, 0x40, 0x7c, 0xdb, 0x27, 0xd9, 0x64, 0x94, 0x4d, 0x9c, 0x14, 0x3f, 0x2e, 0xd7, 0xe8, 0x76,
0x74, 0xe3, 0x65, 0x57, 0x10, 0xde, 0x3f, 0x5a, 0x84, 0x17, 0x20, 0x5e, 0x6d, 0x3e, 0xb8, 0xef,
0x76, 0x5d, 0x8a, 0xd3, 0xa1, 0x8d, 0x64, 0xa7, 0x08, 0x39, 0xed, 0xeb, 0xdf, 0x00, 0x00, 0x00,
0xff, 0xff, 0x2c, 0xc9, 0x79, 0xe9, 0x84, 0x01, 0x00, 0x00,
// 272 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x5c, 0x50, 0xc1, 0x4a, 0xc3, 0x40,
0x10, 0x35, 0x4d, 0x36, 0xda, 0x49, 0x51, 0x19, 0x45, 0x42, 0x15, 0x2c, 0x39, 0x68, 0x4f, 0x41,
0xe2, 0x45, 0xf4, 0xaa, 0x78, 0x10, 0x44, 0xf7, 0xe0, 0x3d, 0x31, 0x83, 0x5d, 0x2c, 0x49, 0xdc,
0x6c, 0xc4, 0x7e, 0xbb, 0x17, 0xb3, 0xd3, 0xb5, 0x06, 0x6f, 0x6f, 0xdf, 0x9b, 0x79, 0xfb, 0xe6,
0xc1, 0xc1, 0x9b, 0xce, 0x9b, 0x85, 0xa6, 0xb6, 0xa9, 0xab, 0x96, 0xd2, 0x46, 0xd7, 0xa6, 0x46,
0xc1, 0x64, 0x72, 0x0a, 0xdb, 0x92, 0x3e, 0x3a, 0x6a, 0x0d, 0x1e, 0x82, 0xe8, 0x81, 0x5e, 0xc5,
0xde, 0xcc, 0x9b, 0x8f, 0xe5, 0xfa, 0xd1, 0x0f, 0x88, 0x97, 0x7c, 0xd9, 0x11, 0x1e, 0x41, 0x58,
0xa8, 0x2a, 0x77, 0xfa, 0x44, 0xba, 0x57, 0xf2, 0xed, 0x41, 0xf0, 0x58, 0x97, 0x84, 0xfb, 0xe0,
0x77, 0xaa, 0x64, 0x35, 0x90, 0x16, 0x5a, 0xe6, 0xab, 0x67, 0x46, 0xec, 0x67, 0x21, 0x9e, 0xc0,
0x38, 0x37, 0x46, 0xab, 0xa2, 0x33, 0x14, 0xfb, 0xcc, 0xff, 0x11, 0x78, 0x03, 0xd0, 0x87, 0x6b,
0x48, 0x1b, 0x45, 0x6d, 0x1c, 0xcc, 0xfc, 0x79, 0x94, 0x1d, 0xa7, 0x1c, 0x34, 0xb5, 0x5f, 0xa4,
0x4f, 0x1b, 0xf5, 0xae, 0x32, 0x7a, 0x25, 0x07, 0xe3, 0x78, 0x0e, 0x3b, 0xaf, 0x0b, 0xb5, 0x2c,
0x35, 0x55, 0xb1, 0xe0, 0xd5, 0x68, 0xb0, 0x2a, 0x37, 0xe2, 0xf4, 0x01, 0xf6, 0xfe, 0xf9, 0xd8,
0xa0, 0xef, 0xf4, 0x7b, 0xb8, 0x85, 0x98, 0x80, 0xf8, 0xb4, 0x67, 0x73, 0xf8, 0x28, 0x9b, 0x38,
0x2b, 0xae, 0x42, 0xae, 0xa5, 0xeb, 0xd1, 0x95, 0x97, 0x5d, 0x40, 0x78, 0x7b, 0x6f, 0x25, 0x3c,
0x03, 0xf1, 0x6c, 0x1b, 0xc3, 0x5d, 0x37, 0xeb, 0x7a, 0x9d, 0x0e, 0x63, 0x24, 0x5b, 0x45, 0xc8,
0xfd, 0x5f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x91, 0x31, 0x0d, 0x96, 0x01, 0x00, 0x00,
}
......@@ -18,7 +18,8 @@ message Value {
message Node {
uint64 uid = 1;
string attribute = 2;
map<string, Value> properties = 3;
repeated Node children = 4; // Each node can have multiple children
string xid = 2;
string attribute = 3;
map<string, Value> properties = 4;
repeated Node children = 5; // Each node can have multiple children
}
......@@ -271,18 +271,19 @@ func indexOf(uid uint64, q *task.Query) int {
}
// This method gets the values and children for a subgraph.
func preTraverse(uid uint64, g *SubGraph) (map[string]*graph.Value, []*graph.Node, error) {
values := make(map[string]*graph.Value)
func (g *SubGraph) preTraverse(uid uint64, dst *graph.Node) error {
properties := make(map[string]*graph.Value)
var children []*graph.Node
for _, predChild := range g.Children {
ro := flatbuffers.GetUOffsetT(predChild.result)
// We go through all predicate children of the subgraph.
for _, pc := range g.Children {
ro := flatbuffers.GetUOffsetT(pc.result)
r := new(task.Result)
r.Init(predChild.result, ro)
r.Init(pc.result, ro)
uo := flatbuffers.GetUOffsetT(predChild.query)
uo := flatbuffers.GetUOffsetT(pc.query)
q := new(task.Query)
q.Init(predChild.query, uo)
q.Init(pc.query, uo)
idx := indexOf(uid, q)
......@@ -290,15 +291,15 @@ func preTraverse(uid uint64, g *SubGraph) (map[string]*graph.Value, []*graph.Nod
glog.WithFields(logrus.Fields{
"uid": uid,
"attribute": g.Attr,
"childAttribute": predChild.Attr,
"childAttribute": pc.Attr,
}).Fatal("Attribute with uid not found in child Query uids")
return values, children, fmt.Errorf("Attribute with uid not found")
return fmt.Errorf("Attribute with uid not found")
}
var ul task.UidList
var tv task.Value
if ok := r.Uidmatrix(&ul, idx); !ok {
return values, children, fmt.Errorf("While parsing UidList")
return fmt.Errorf("While parsing UidList")
}
if ul.UidsLength() > 0 {
......@@ -306,28 +307,25 @@ func preTraverse(uid uint64, g *SubGraph) (map[string]*graph.Value, []*graph.Nod
// this predicate.
for i := 0; i < ul.UidsLength(); i++ {
uid := ul.Uids(i)
uidChild := new(graph.Node)
uidChild.Attribute = predChild.Attr
uidChild.Uid = uid
vals, ch, rerr := preTraverse(uid, predChild)
if rerr != nil {
uc := new(graph.Node)
uc.Attribute = pc.Attr
uc.Uid = uid
if rerr := pc.preTraverse(uid, uc); rerr != nil {
x.Err(glog, rerr).Error("Error while traversal")
return values, children, rerr
return rerr
}
uidChild.Properties, uidChild.Children = vals, ch
children = append(children, uidChild)
children = append(children, uc)
}
} else {
v := new(graph.Value)
if ok := r.Values(&tv, idx); !ok {
return values, children, fmt.Errorf("While parsing value")
return fmt.Errorf("While parsing value")
}
var ival interface{}
if err := posting.ParseValue(&ival, tv.ValBytes()); err != nil {
return values, children, err
return err
}
if ival == nil {
......@@ -335,10 +333,14 @@ func preTraverse(uid uint64, g *SubGraph) (map[string]*graph.Value, []*graph.Nod
}
v.Binary = []byte(ival.(string))
values[predChild.Attr] = v
properties[pc.Attr] = v
}
}
return values, children, nil
if val, ok := properties["xid"]; ok {
dst.Xid = string(val.Binary)
}
dst.Properties, dst.Children = properties, children
return nil
}
// This method transforms the predicate based subgraph to an
......@@ -358,8 +360,7 @@ func (g *SubGraph) ToProtocolBuffer(l *Latency) (n *graph.Node, rerr error) {
r.Uidmatrix(&ul, 0)
n.Uid = ul.Uids(0)
n.Properties, n.Children, rerr = preTraverse(n.Uid, g)
if rerr != nil {
if rerr = g.preTraverse(n.Uid, n); rerr != nil {
x.Err(glog, rerr).Error("Error while traversal")
return n, rerr
}
......
......@@ -184,6 +184,9 @@ func populateGraph(t *testing.T) (string, *store.Store) {
edge.Value = "Andrea"
addEdge(t, edge, posting.GetOrCreate(posting.Key(31, "name"), ps))
edge.Value = "mich"
addEdge(t, edge, posting.GetOrCreate(posting.Key(1, "xid"), ps))
return dir, ps
}
......@@ -327,6 +330,7 @@ func TestToProtocolBuffer(t *testing.T) {
query := `
{
me(_uid_:0x01) {
xid
name
gender
status
......@@ -367,8 +371,11 @@ func TestToProtocolBuffer(t *testing.T) {
if gr.Uid != 1 {
t.Errorf("Expected uid 1, Got: %v", gr.Uid)
}
if len(gr.Properties) != 3 {
t.Errorf("Expected values map to contain 3 properties, Got: %v",
if gr.Xid != "mich" {
t.Errorf("Expected xid mich, Got: %v", gr.Xid)
}
if len(gr.Properties) != 4 {
t.Errorf("Expected values map to contain 4 properties, Got: %v",
len(gr.Properties))
}
if string(gr.Properties["name"].Binary) != "Michonne" {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment