in client/tsblock.go [45:110]
func DeserializeTsBlock(data []byte) (*TsBlock, error) {
// Serialized tsblock:
// +-------------+---------------+---------+------------+-----------+----------+
// | val col cnt | val col types | pos cnt | encodings | time col | val col |
// +-------------+---------------+---------+------------+-----------+----------+
// | int32 | list[byte] | int32 | list[byte] | bytes | bytes |
// +-------------+---------------+---------+------------+-----------+----------+
reader := bytes.NewReader(data)
// value column count
var valueColumnCount int32
if err := binary.Read(reader, binary.BigEndian, &valueColumnCount); err != nil {
return nil, err
}
// value column data types
valueColumnDataTypes := make([]TSDataType, valueColumnCount)
for i := int32(0); i < valueColumnCount; i++ {
dataType, err := deserializeDataType(reader)
if err != nil {
return nil, err
}
valueColumnDataTypes[i] = dataType
}
// position count
var positionCount int32
if err := binary.Read(reader, binary.BigEndian, &positionCount); err != nil {
return nil, err
}
// column encodings
columnEncodings := make([]ColumnEncoding, valueColumnCount+1)
for i := int32(0); i < valueColumnCount+1; i++ {
columnEncoding, err := deserializeColumnEncoding(reader)
if err != nil {
return nil, err
}
columnEncodings[i] = columnEncoding
}
// time column
timeColumnDecoder, err := getColumnDecoder(columnEncodings[0])
if err != nil {
return nil, err
}
timeColumn, err := timeColumnDecoder.ReadColumn(reader, INT64, positionCount)
if err != nil {
return nil, err
}
// value columns
valueColumns := make([]Column, valueColumnCount)
for i := int32(0); i < valueColumnCount; i++ {
valueColumnDecoder, err := getColumnDecoder(columnEncodings[i+1])
if err != nil {
return nil, err
}
valueColumn, err := valueColumnDecoder.ReadColumn(reader, valueColumnDataTypes[i], positionCount)
if err != nil {
return nil, err
}
valueColumns[i] = valueColumn
}
return NewTsBlock(positionCount, timeColumn, valueColumns...)
}