func DeserializeTsBlock()

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...)
}