in tsfile-viewer-core/src/main/java/org/apache/iotdb/tool/core/service/TsFileAnalyserV13.java [1095:1203]
public PageDataTableInfo fetchBatchDataByPageOffset(PageOffsetInfo pageOffsetInfo)
throws IOException, InterruptedException {
PageDataTableInfo tableInfo = new PageDataTableInfo();
BatchData batchData;
Decoder timeDecoder =
Decoder.getDecoderByType(
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
TSDataType.INT64);
reader.position(pageOffsetInfo.getOffset());
if (!pageOffsetInfo.isAligned()) {
byte marker = reader.readMarker();
PageHeader pageHeader =
reader.readPageHeader(pageOffsetInfo.getTsDataType(), pageOffsetInfo.isHasStatistics());
Decoder valueDecoder =
Decoder.getDecoderByType(
pageOffsetInfo.getEncodingType(), pageOffsetInfo.getTsDataType());
ByteBuffer pageData = reader.readPage(pageHeader, pageOffsetInfo.getCompressionType());
PageReader pageReader =
new PageReader(
pageHeader,
pageData,
pageOffsetInfo.getTsDataType(),
valueDecoder,
timeDecoder,
null);
batchData = pageReader.getAllSatisfiedPageData();
tableInfo.getTitle().add("timestamp");
tableInfo.getTitle().add("value");
} else {
long cgOffset = pageOffsetInfo.getChunkGroupOffset();
List<ChunkOffsetInfo> chunkOffsetInfoList = fetchChunkOffsetListByChunkGroupOffset(cgOffset);
// ChunkOffsetInfo timeChunk = chunkOffsetInfoList.get(0);
// List<PageOffsetInfo> timePageInfoList =
// fetchPageOffsetListByChunkOffset(timeChunk.getOffset());
List<PageOffsetInfo> valuePageInfoList = new ArrayList<>();
tableInfo
.getTitle()
.addAll(
chunkOffsetInfoList.stream()
.map(chunkOffsetInfo -> chunkOffsetInfo.getMeasurementId())
.collect(Collectors.toList()));
tableInfo.getTitle().set(0, "timestamp");
int positionInTimmeChunkPages = 0;
// hasStatistics,对应的是chunk中的信息 false 代表是单页的chunk,
if (pageOffsetInfo.isHasStatistics()) {
// 查找当前page在timeChunk中的位置
List<PageOffsetInfo> pageOffsetListInTimeChunk =
fetchPageOffsetListByChunkOffset(chunkOffsetInfoList.get(0).getOffset());
for (int i = 0; i < pageOffsetListInTimeChunk.size(); i++) {
if (pageOffsetInfo.getOffset() == pageOffsetListInTimeChunk.get(i).getOffset()) {
positionInTimmeChunkPages = i;
break;
}
}
}
for (int i = 1; i < chunkOffsetInfoList.size(); i++) {
long valueChunkOffset = chunkOffsetInfoList.get(i).getOffset();
List<PageOffsetInfo> pageOffsetInfoList =
fetchPageOffsetListByChunkOffset(valueChunkOffset);
valuePageInfoList.add(pageOffsetInfoList.get(positionInTimmeChunkPages));
}
reader.position(pageOffsetInfo.getOffset());
reader.readMarker();
PageHeader timePageHeader =
reader.readPageHeader(pageOffsetInfo.getTsDataType(), pageOffsetInfo.isHasStatistics());
ByteBuffer timeByteBuffer =
reader.readPage(timePageHeader, pageOffsetInfo.getCompressionType());
List<PageHeader> valuePageHeaders = new ArrayList<>();
List<ByteBuffer> valueByteBuffers = new ArrayList<>();
List<TSDataType> valueTSDataTypes = new ArrayList<>();
List<Decoder> valueDecoders = new ArrayList<>();
for (PageOffsetInfo valuePageInfo : valuePageInfoList) {
reader.position(valuePageInfo.getOffset());
reader.readMarker();
PageHeader valuePageHeader =
reader.readPageHeader(valuePageInfo.getTsDataType(), valuePageInfo.isHasStatistics());
valuePageHeaders.add(valuePageHeader);
valueByteBuffers.add(reader.readPage(valuePageHeader, valuePageInfo.getCompressionType()));
valueTSDataTypes.add(valuePageInfo.getTsDataType());
valueDecoders.add(
Decoder.getDecoderByType(
valuePageInfo.getEncodingType(), valuePageInfo.getTsDataType()));
}
AlignedPageReader alignedPageReader =
new AlignedPageReader(
timePageHeader,
timeByteBuffer,
timeDecoder,
valuePageHeaders,
valueByteBuffers,
valueTSDataTypes,
valueDecoders,
null);
batchData = alignedPageReader.getAllSatisfiedPageData();
}
tableInfo.setData(batchData);
return tableInfo;
}