This is an automated email from the ASF dual-hosted git repository. hanahmily pushed a commit to branch feat/liasion in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit 14a7fcb5cedf21ce18aefcad44c164932c299810 Author: Qiuxia Fan <[email protected]> AuthorDate: Sun Jun 20 18:15:46 2021 +0800 Serialize Fields --- banyand/liaison/grpc/grpc.go | 80 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/banyand/liaison/grpc/grpc.go b/banyand/liaison/grpc/grpc.go index 58014cf..9f8b108 100644 --- a/banyand/liaison/grpc/grpc.go +++ b/banyand/liaison/grpc/grpc.go @@ -19,8 +19,8 @@ package grpc import ( "context" - "fmt" "net" + "strconv" "time" flatbuffers "github.com/google/flatbuffers/go" @@ -77,7 +77,7 @@ func (s *Server) GracefulStop() { } func (s *Server) WriteTraces(entityValue *v1.EntityValue, metaData *v1.Metadata) (*flatbuffers.Builder, error) { - s.log.Info("Write called...") + s.log.Info("WriteTraces called...") builder := flatbuffers.NewBuilder(0) // Serialize MetaData group, name := builder.CreateString(string(metaData.Group())), builder.CreateString(string(metaData.Name())) @@ -85,19 +85,65 @@ func (s *Server) WriteTraces(entityValue *v1.EntityValue, metaData *v1.Metadata) v1.MetadataAddGroup(builder, group) v1.MetadataAddName(builder, name) v1.MetadataEnd(builder) - // Serialize Field + // Serialize Fields v1.FieldStart(builder) - //for i := 0; i < entityValue.FieldsLength(); i++ { - // v1.FieldAddValueType(builder, v1.ValueTypeString) - // field := builder.CreateString("test") - // v1.FieldAddValue(builder, field) - //} - v1.FieldAddValueType(builder, v1.ValueTypeString) - field := builder.CreateString("test") - fmt.Println(field) - v1.FieldAddValue(builder, field) + var fieldList []flatbuffers.UOffsetT + for i := 0; i < entityValue.FieldsLength(); i++ { + var f v1.Field + var s string + if ok := entityValue.Fields(&f, i); ok { + unionValueType := new(flatbuffers.Table) + if f.Value(unionValueType) { + valueType := f.ValueType() + if valueType == v1.ValueTypeString { + unionStr := new(v1.String) + unionStr.Init(unionValueType.Bytes, unionValueType.Pos) + v1.FieldAddValueType(builder, v1.ValueTypeString) + s = string(unionStr.Value()) + } else if valueType == v1.ValueTypeInt { + unionInt := new(v1.Int) + unionInt.Init(unionValueType.Bytes, unionValueType.Pos) + v1.FieldAddValueType(builder, v1.ValueTypeInt) + field := flatbuffers.UOffsetT(unionInt.Value()) + v1.FieldAddValue(builder, field) + fieldList = append(fieldList, field) + } else if valueType == v1.ValueTypeStringArray { + unionStrArray := new(v1.StringArray) + unionStrArray.Init(unionValueType.Bytes, unionValueType.Pos) + len := unionStrArray.ValueLength() + if len == 1 { + s += string(unionStrArray.Value(0)) + } else { + s += "[" + for i := 0; i < len; i++ { + s += string(unionStrArray.Value(i)) + } + s += "]" + } + } else if valueType == v1.ValueTypeIntArray { + unionIntArray := new(v1.IntArray) + unionIntArray.Init(unionValueType.Bytes, unionValueType.Pos) + l := unionIntArray.ValueLength() + if l == 1 { + s += strconv.FormatInt(unionIntArray.Value(0), 10) + } else if l > 1{ + s += "[" + for i := 0; i < l; i++ { + s += strconv.FormatInt(unionIntArray.Value(i), 10) + } + s += "]" + } + } + if valueType == v1.ValueTypeIntArray || valueType == v1.ValueTypeStringArray || valueType == v1.ValueTypeString { + field := builder.CreateString(s) + v1.FieldAddValue(builder, field) + fieldList = append(fieldList, field) + } + } + } + } v1.FieldEnd(builder) - // Serialize WriteEntity + // Serialize EntityValue dataBinaryLength := entityValue.DataBinaryLength() v1.EntityStartDataBinaryVector(builder, dataBinaryLength) for i := dataBinaryLength; i >= 0; i-- { @@ -110,9 +156,11 @@ func (s *Server) WriteTraces(entityValue *v1.EntityValue, metaData *v1.Metadata) time := uint64(time.Now().UnixNano()) v1.EntityValueAddTimestampNanoseconds(builder, time) v1.EntityValueAddDataBinary(builder, dataBinary) - v1.EntityValueStartFieldsVector(builder, 1) - builder.PrependUOffsetT(field) - fields := builder.EndVector(1) + v1.EntityValueStartFieldsVector(builder, len(fieldList)) + for val := range fieldList { + builder.PrependUOffsetT(flatbuffers.UOffsetT(val)) + } + fields := builder.EndVector(len(fieldList)) v1.EntityValueAddFields(builder, fields) v1.EntityValueEnd(builder) trace := v1.WriteEntityEnd(builder)
