Skip to content
Snippets Groups Projects
Commit f80cd552 authored by Manish R Jain's avatar Manish R Jain
Browse files

Working end to end

parent 3048929d
No related branches found
No related tags found
No related merge requests found
......@@ -152,7 +152,7 @@ func parseArguments(l *lex.Lexer) (result []pair, rerr error) {
for {
var p pair
// Get key.
// Get key
item := <-l.Items
if item.Typ == itemArgName {
p.Key = item.Val
......@@ -164,7 +164,7 @@ func parseArguments(l *lex.Lexer) (result []pair, rerr error) {
return result, fmt.Errorf("Expecting argument name. Got: %v", item)
}
// Get value.
// Get value
item = <-l.Items
if item.Typ == itemArgVal {
p.Val = item.Val
......@@ -238,7 +238,6 @@ func godeep(l *lex.Lexer, gq *GraphQuery) error {
return nil
} else if item.Typ == itemLeftRound {
args, err := parseArguments(l)
if err != nil {
return err
......
......@@ -720,15 +720,35 @@ func (l *List) LastCompactionTs() time.Time {
return l.lastCompact
}
func (l *List) GetUids() []uint64 {
func (l *List) GetUids(offset, count int) []uint64 {
l.wg.Wait()
l.RLock()
defer l.RUnlock()
result := make([]uint64, l.length())
if offset < 0 {
glog.WithField("offset", offset).Fatal("Unexpected offset")
return make([]uint64, 0)
}
if count < 0 {
count = 0 - count
offset = l.length() - count
}
if count == 0 {
count = l.length() - offset
} else if count > l.length()-offset {
count = l.length() - offset
}
if count < 0 {
count = 0
}
result := make([]uint64, count)
result = result[:0]
var p types.Posting
for i := 0; i < l.length(); i++ {
for i := offset; i < count+offset && i < l.length(); i++ {
if ok := l.get(&p, i); !ok || p.Uid() == math.MaxUint64 {
break
}
......
......@@ -44,6 +44,32 @@ func checkUids(t *testing.T, l *List, uids ...uint64) error {
return fmt.Errorf("Expected: %v. Got: %v", uids[i], p.Uid())
}
}
if len(uids) >= 3 {
ruids := l.GetUids(1, 2)
if len(ruids) != 2 {
return fmt.Errorf("Expected result of length: 2. Got: %v", len(ruids))
}
for i := 0; i < len(ruids); i++ {
if ruids[i] != uids[1+i] {
return fmt.Errorf("GetUids expected: %v. Got: %v", uids[1+i], ruids[i])
}
}
ruids = l.GetUids(1, -2) // offset should be ignored.
ulen := len(uids)
if ulen > 2 && len(ruids) != 2 {
return fmt.Errorf("Expected result of length: 2. Got: %v", len(ruids))
}
for i := 0; i < len(ruids); i++ {
if ruids[i] != uids[ulen-2+i] {
return fmt.Errorf("GetUids neg count expected: %v. Got: %v",
uids[ulen-2+i], ruids[i])
}
}
}
return nil
}
......
......@@ -110,6 +110,8 @@ func (l *Latency) ToMap() map[string]string {
// client convenient formats, like GraphQL / JSON.
type SubGraph struct {
Attr string
Count int
Offset int
Children []*SubGraph
query []byte
......@@ -325,9 +327,14 @@ func (g *SubGraph) PreTraverse() (gr *pb.GraphResponse, rerr error) {
}
func treeCopy(gq *gql.GraphQuery, sg *SubGraph) {
// Typically you act on the current node, and leave recursion to deal with
// children. But, in this case, we don't want to muck with the current
// node, because of the way we're dealing with the root node.
// So, we work on the children, and then recurse for grand children.
for _, gchild := range gq.Children {
dst := new(SubGraph)
dst.Attr = gchild.Attr
dst.Count = gchild.First
sg.Children = append(sg.Children, dst)
treeCopy(gchild, dst)
}
......@@ -394,14 +401,14 @@ func newGraph(euid uint64, exid string) (*SubGraph, error) {
sg.Attr = "_root_"
sg.result = b.Bytes[b.Head():]
// Also add query for consistency and to allow for ToJson() later.
sg.query = createTaskQuery(sg.Attr, []uint64{euid})
sg.query = createTaskQuery(sg, []uint64{euid})
return sg, nil
}
// createTaskQuery generates the query buffer.
func createTaskQuery(attr string, sorted []uint64) []byte {
func createTaskQuery(sg *SubGraph, sorted []uint64) []byte {
b := flatbuffers.NewBuilder(0)
ao := b.CreateString(attr)
ao := b.CreateString(sg.Attr)
task.QueryStartUidsVector(b, len(sorted))
for i := len(sorted) - 1; i >= 0; i-- {
......@@ -412,6 +419,8 @@ func createTaskQuery(attr string, sorted []uint64) []byte {
task.QueryStart(b)
task.QueryAddAttr(b, ao)
task.QueryAddUids(b, vend)
task.QueryAddCount(b, int32(sg.Count))
qend := task.QueryEnd(b)
b.Finish(qend)
return b.Bytes[b.Head():]
......@@ -531,7 +540,7 @@ func ProcessGraph(sg *SubGraph, rch chan error, td time.Duration) {
childchan := make(chan error, len(sg.Children))
for i := 0; i < len(sg.Children); i++ {
child := sg.Children[i]
child.query = createTaskQuery(child.Attr, sorted)
child.query = createTaskQuery(child, sorted)
go ProcessGraph(child, childchan, timeleft)
}
......
......@@ -3,6 +3,8 @@ namespace task;
table Query {
attr:string;
uids:[ulong];
count:int;
offset:int;
}
table Value {
......
......@@ -39,9 +39,27 @@ func (rcv *Query) UidsLength() int {
return 0
}
func QueryStart(builder *flatbuffers.Builder) { builder.StartObject(2) }
func (rcv *Query) Count() int32 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
if o != 0 {
return rcv._tab.GetInt32(o + rcv._tab.Pos)
}
return 0
}
func (rcv *Query) Offset() int32 {
o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
if o != 0 {
return rcv._tab.GetInt32(o + rcv._tab.Pos)
}
return 0
}
func QueryStart(builder *flatbuffers.Builder) { builder.StartObject(4) }
func QueryAddAttr(builder *flatbuffers.Builder, attr flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(attr), 0) }
func QueryAddUids(builder *flatbuffers.Builder, uids flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(uids), 0) }
func QueryStartUidsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { return builder.StartVector(8, numElems, 8)
}
func QueryAddCount(builder *flatbuffers.Builder, count int32) { builder.PrependInt32Slot(2, count, 0) }
func QueryAddOffset(builder *flatbuffers.Builder, offset int32) { builder.PrependInt32Slot(3, offset, 0) }
func QueryEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() }
......@@ -94,7 +94,7 @@ func processTask(query []byte) (result []byte, rerr error) {
task.ValueAddVal(b, valoffset)
voffsets[i] = task.ValueEnd(b)
ulist := pl.GetUids()
ulist := pl.GetUids(int(q.Offset()), int(q.Count()))
uoffsets[i] = x.UidlistOffset(b, ulist)
}
task.ResultStartValuesVector(b, len(voffsets))
......
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