in tsfile-viewer-core/src/main/java/org/apache/iotdb/tool/core/service/TsFileAnalyserV13.java [527:597]
public ChunkModel fetchChunkByChunkMetadata(ChunkMetadata chunkMetadata)
throws IOException, InterruptedException {
countDownLatch.await();
long offsetOfChunkHeader = chunkMetadata.getOffsetOfChunkHeader();
reader.position(offsetOfChunkHeader);
byte marker = reader.readMarker();
ChunkHeader chunkHeader = reader.readChunkHeader(marker);
Statistics<? extends Serializable> chunkStatistics =
Statistics.getStatsByType(chunkMetadata.getDataType());
int dataSize = chunkHeader.getDataSize();
List<PageHeader> pageHeaders = new ArrayList<>();
List<BatchData> batchDataList = new ArrayList<>();
if (((byte) (chunkHeader.getChunkType() & CHUNK_HEADER_MASK)) == MetaMarker.CHUNK_HEADER) {
while (dataSize > 0) {
// a new Page
PageHeader pageHeader = reader.readPageHeader(chunkHeader.getDataType(), true);
if (pageHeader.getUncompressedSize() != 0) {
// not empty page
chunkStatistics.mergeStatistics(pageHeader.getStatistics());
}
Decoder valueDecoder =
Decoder.getDecoderByType(chunkHeader.getEncodingType(), chunkHeader.getDataType());
ByteBuffer pageData = reader.readPage(pageHeader, chunkHeader.getCompressionType());
Decoder timeDecoder =
Decoder.getDecoderByType(
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
TSDataType.INT64);
PageReader pageReader =
new PageReader(
pageHeader, pageData, chunkHeader.getDataType(), valueDecoder, timeDecoder, null);
BatchData batchData = pageReader.getAllSatisfiedPageData();
dataSize -= pageHeader.getSerializedPageSize();
chunkHeader.increasePageNums(1);
pageHeaders.add(pageHeader);
batchDataList.add(batchData);
}
} else {
// only one page without statistic, we need to iterate each point to generate
// statistic
PageHeader pageHeader = reader.readPageHeader(chunkHeader.getDataType(), false);
Decoder valueDecoder =
Decoder.getDecoderByType(chunkHeader.getEncodingType(), chunkHeader.getDataType());
ByteBuffer pageData = reader.readPage(pageHeader, chunkHeader.getCompressionType());
Decoder timeDecoder =
Decoder.getDecoderByType(
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
TSDataType.INT64);
PageReader reader =
new PageReader(
pageHeader, pageData, chunkHeader.getDataType(), valueDecoder, timeDecoder, null);
BatchData batchData = reader.getAllSatisfiedPageData();
chunkHeader.increasePageNums(1);
pageHeaders.add(pageHeader);
batchDataList.add(batchData);
}
ChunkModel model = new ChunkModel();
model.setChunkMetadata(chunkMetadata);
model.setPageHeaders(pageHeaders);
model.setBatchDataList(batchDataList);
model.setChunk(reader.readMemChunk(chunkMetadata));
return model;
}