in tsfile-viewer-core/src/main/java/org/apache/iotdb/tool/core/service/TsFileAnalyserV13.java [1205:1331]
public PageDataTableInfo fetchBatchDataByTimeseriesIndexOffset(
TimeseriesIndexOffsetInfo timeseriesIndexOffsetInfo)
throws IOException, InterruptedException {
PageDataTableInfo tableInfo = new PageDataTableInfo();
BatchData batchData;
Decoder timeDecoder =
Decoder.getDecoderByType(
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
TSDataType.INT64);
reader.position(timeseriesIndexOffsetInfo.getOffset());
if (!timeseriesIndexOffsetInfo.isAligned()) {
byte marker = reader.readMarker();
PageHeader pageHeader =
reader.readPageHeader(
timeseriesIndexOffsetInfo.getTsDataType(),
timeseriesIndexOffsetInfo.isHasStatistics());
Decoder valueDecoder =
Decoder.getDecoderByType(
timeseriesIndexOffsetInfo.getEncodingType(),
timeseriesIndexOffsetInfo.getTsDataType());
ByteBuffer pageData =
reader.readPage(pageHeader, timeseriesIndexOffsetInfo.getCompressionType());
PageReader pageReader =
new PageReader(
pageHeader,
pageData,
timeseriesIndexOffsetInfo.getTsDataType(),
valueDecoder,
timeDecoder,
null);
batchData = pageReader.getAllSatisfiedPageData();
tableInfo.getTitle().add("timestamp");
tableInfo.getTitle().add("value");
} else {
List<PageOffsetInfo> valuePageInfoList = new ArrayList<>();
long timeseriesIndexOffset = timeseriesIndexOffsetInfo.getTimeseriesIndexOffset();
Pair<Path, ITimeSeriesMetadata> pair = timeseriesMetadataMap.get(timeseriesIndexOffset);
AlignedTimeSeriesMetadata alignedMetadata = (AlignedTimeSeriesMetadata) pair.right;
AlignedChunkMetadata alignedChunkMetadata =
alignedMetadata.getChunkMetadataList().stream()
.filter(
alignedchunk -> {
if (alignedchunk.getOffsetOfChunkHeader()
== timeseriesIndexOffsetInfo.getChunkOffset()) {
return true;
}
return false;
})
.collect(Collectors.toList())
.get(0);
IChunkMetadata timeChunk = alignedChunkMetadata.getTimeChunkMetadata();
List<IChunkMetadata> valueChunkList = alignedChunkMetadata.getValueChunkMetadataList();
tableInfo.getTitle().add("timestamp");
tableInfo
.getTitle()
.addAll(
valueChunkList.stream()
.map(chunkOffsetInfo -> chunkOffsetInfo.getMeasurementUid())
.collect(Collectors.toList()));
// 查找当前page在timeChunk中的位置
List<PageOffsetInfo> pageOffsetListInTimeChunk =
fetchPageOffsetListByChunkOffset(timeChunk.getOffsetOfChunkHeader());
int positionInTimmeChunkPages = 0;
for (int i = 0; i < pageOffsetListInTimeChunk.size(); i++) {
if (timeseriesIndexOffsetInfo.getOffset() == pageOffsetListInTimeChunk.get(i).getOffset()) {
positionInTimmeChunkPages = i;
break;
}
}
for (int i = 0; i < valueChunkList.size(); i++) {
long valueChunkOffset = valueChunkList.get(i).getOffsetOfChunkHeader();
List<PageOffsetInfo> pageOffsetInfoList =
fetchPageOffsetListByChunkOffset(valueChunkOffset);
valuePageInfoList.add(pageOffsetInfoList.get(positionInTimmeChunkPages));
}
reader.position(timeseriesIndexOffsetInfo.getOffset());
reader.readMarker();
PageHeader timePageHeader =
reader.readPageHeader(
timeseriesIndexOffsetInfo.getTsDataType(),
timeseriesIndexOffsetInfo.isHasStatistics());
ByteBuffer timeByteBuffer =
reader.readPage(timePageHeader, timeseriesIndexOffsetInfo.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;
}