blob: 2faf4d0a81e3a04fdaa1d80c3d064d7d725712b8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.tsfile.read.common.block.column;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.read.common.block.TsBlock;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
public class TsBlockSerde {
/**
* Deserialize a tsblock.
*
* @param byteBuffer serialized tsblock.
* @return Deserialized tsblock.
*/
public TsBlock deserialize(ByteBuffer byteBuffer) {
// Serialized tsblock:
// +-------------+---------------+---------+------------+-----------+----------+
// | val col cnt | val col types | pos cnt | encodings | time col | val col |
// +-------------+---------------+---------+------------+-----------+----------+
// | int32 | list[byte] | int32 | list[byte] | bytes | byte |
// +-------------+---------------+---------+------------+-----------+----------+
// Value column count.
int valueColumnCount = byteBuffer.getInt();
// Value column data types.
List<TSDataType> valueColumnDataTypes = new ArrayList<>(valueColumnCount);
for (int i = 0; i < valueColumnCount; i++) {
valueColumnDataTypes.add(TSDataType.deserializeFrom(byteBuffer));
}
// Position count.
int positionCount = byteBuffer.getInt();
// Column encodings.
List<ColumnEncoding> columnEncodings = new ArrayList<>(valueColumnCount + 1);
for (int i = 0; i < valueColumnCount + 1; i++) {
columnEncodings.add(ColumnEncoding.deserializeFrom(byteBuffer));
}
// Time column.
TimeColumn timeColumn =
ColumnEncoderFactory.get(columnEncodings.get(0)).readTimeColumn(byteBuffer, positionCount);
// Value columns
Column[] valueColumns = new Column[valueColumnCount];
for (int i = 0; i < valueColumnCount; i++) {
// Value column.
valueColumns[i] =
ColumnEncoderFactory.get(columnEncodings.get(1 + i))
.readColumn(byteBuffer, valueColumnDataTypes.get(i), positionCount);
}
return new TsBlock(positionCount, timeColumn, valueColumns);
}
/**
* Serialize a tsblock.
*
* @param tsBlock The tsblock to serialize.
* @return Serialized tsblock.
*/
public ByteBuffer serialize(TsBlock tsBlock) throws IOException {
if (tsBlock.getRetainedSizeInBytes() > Integer.MAX_VALUE) {
throw new IllegalStateException(
"TsBlock should not be that large: " + tsBlock.getRetainedSizeInBytes());
}
ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream((int) tsBlock.getRetainedSizeInBytes());
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
// Value column count.
dataOutputStream.writeInt(tsBlock.getValueColumnCount());
// Value column data types.
for (int i = 0; i < tsBlock.getValueColumnCount(); i++) {
tsBlock.getColumn(i).getDataType().serializeTo(dataOutputStream);
}
// Position count.
dataOutputStream.writeInt(tsBlock.getPositionCount());
// Column encodings.
tsBlock.getTimeColumn().getEncoding().serializeTo(dataOutputStream);
for (int i = 0; i < tsBlock.getValueColumnCount(); i++) {
tsBlock.getColumn(i).getEncoding().serializeTo(dataOutputStream);
}
// Time column.
ColumnEncoder columnEncoder = ColumnEncoderFactory.get(tsBlock.getTimeColumn().getEncoding());
columnEncoder.writeColumn(dataOutputStream, tsBlock.getTimeColumn());
for (int i = 0; i < tsBlock.getValueColumnCount(); i++) {
// Value column.
columnEncoder = ColumnEncoderFactory.get(tsBlock.getColumn(i).getEncoding());
columnEncoder.writeColumn(dataOutputStream, tsBlock.getColumn(i));
}
return ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
}
}