func NewGraph(euid uint64, exid string) (*SubGraph, error) { // This would set the Result field in SubGraph, // and populate the children for attributes. if len(exid) > 0 { u, err := uid.GetOrAssign(exid) if err != nil { x.Err(glog, err).WithField("xid", exid).Error( "While GetOrAssign uid from external id") return nil, err } glog.WithField("xid", exid).WithField("_uid_", u).Debug("GetOrAssign") euid = u } if euid == 0 { err := fmt.Errorf("Query internal id is zero") x.Err(glog, err).Error("Invalid query") return nil, err } // Encode uid into result flatbuffer. b := flatbuffers.NewBuilder(0) omatrix := x.UidlistOffset(b, []uint64{euid}) // Also need to add nil value to keep this consistent. var voffset flatbuffers.UOffsetT { bvo := b.CreateByteVector(x.Nilbyte) task.ValueStart(b) task.ValueAddVal(b, bvo) voffset = task.ValueEnd(b) } task.ResultStartUidmatrixVector(b, 1) b.PrependUOffsetT(omatrix) mend := b.EndVector(1) task.ResultStartValuesVector(b, 1) b.PrependUOffsetT(voffset) vend := b.EndVector(1) task.ResultStart(b) task.ResultAddUidmatrix(b, mend) task.ResultAddValues(b, vend) rend := task.ResultEnd(b) b.Finish(rend) sg := new(SubGraph) 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}) return sg, nil }
func ProcessTask(query []byte) (result []byte, rerr error) { uo := flatbuffers.GetUOffsetT(query) q := new(task.Query) q.Init(query, uo) b := flatbuffers.NewBuilder(0) voffsets := make([]flatbuffers.UOffsetT, q.UidsLength()) uoffsets := make([]flatbuffers.UOffsetT, q.UidsLength()) attr := string(q.Attr()) for i := 0; i < q.UidsLength(); i++ { uid := q.Uids(i) key := posting.Key(uid, attr) pl := posting.GetOrCreate(key, dataStore) var valoffset flatbuffers.UOffsetT if val, err := pl.Value(); err != nil { valoffset = b.CreateByteVector(x.Nilbyte) } else { valoffset = b.CreateByteVector(val) } task.ValueStart(b) task.ValueAddVal(b, valoffset) voffsets[i] = task.ValueEnd(b) ulist := pl.GetUids() uoffsets[i] = x.UidlistOffset(b, ulist) } task.ResultStartValuesVector(b, len(voffsets)) for i := len(voffsets) - 1; i >= 0; i-- { b.PrependUOffsetT(voffsets[i]) } valuesVent := b.EndVector(len(voffsets)) task.ResultStartUidmatrixVector(b, len(uoffsets)) for i := len(uoffsets) - 1; i >= 0; i-- { b.PrependUOffsetT(uoffsets[i]) } matrixVent := b.EndVector(len(uoffsets)) task.ResultStart(b) task.ResultAddValues(b, valuesVent) task.ResultAddUidmatrix(b, matrixVent) rend := task.ResultEnd(b) b.Finish(rend) return b.Bytes[b.Head():], nil }