in tsfile-viewer-core/src/main/java/org/apache/iotdb/tool/core/service/TsFileAnalyserV13.java [1021:1093]
public List<PageOffsetInfo> fetchPageOffsetListByChunkOffset(long offset)
throws IOException, InterruptedException {
countDownLatch.await();
List<PageOffsetInfo> pageOffsetInfoList = new ArrayList<>();
reader.position(offset);
byte marker = reader.readMarker();
ChunkHeader chunkHeader = reader.readChunkHeader(marker);
int chunkDataSize = chunkHeader.getDataSize();
boolean isAligned = false;
boolean hasStatistics = false;
if (chunkHeader.getDataType() == TSDataType.VECTOR) {
isAligned = true;
}
if (marker == MetaMarker.CHUNK_HEADER
|| marker == MetaMarker.TIME_CHUNK_HEADER
|| marker == MetaMarker.VALUE_CHUNK_HEADER) {
if (((byte) (chunkHeader.getChunkType() & 0x3F)) == MetaMarker.CHUNK_HEADER) {
hasStatistics = true;
}
}
while (chunkDataSize > 0) {
PageOffsetInfo pageOffsetInfo = new PageOffsetInfo();
pageOffsetInfo.setOffset(reader.position() - 1);
pageOffsetInfo.setAligned(isAligned);
pageOffsetInfo.setTsDataType(chunkHeader.getDataType());
PageHeader pageHeader = reader.readPageHeader(chunkHeader.getDataType(), hasStatistics);
pageOffsetInfo.setCompressionType(chunkHeader.getCompressionType());
pageOffsetInfo.setEncodingType(chunkHeader.getEncodingType());
pageOffsetInfo.setHasStatistics(hasStatistics);
// 界定page的startTime和endTime
if (hasStatistics) {
pageOffsetInfo.setStartTime(pageHeader.getStartTime());
pageOffsetInfo.setEndTime(pageHeader.getEndTime());
} else {
// 查找一下chunk offset 对应 chunkgroup offset
for (int i = chunkGroupInfoList.size() - 1; i >= 0; i--) {
if (chunkGroupInfoList.get(i).getOffset() - offset < 0) {
pageOffsetInfo.setChunkGroupOffset(chunkGroupInfoList.get(i).getOffset());
break;
}
}
BatchData data = fetchBatchDataByPageOffset(pageOffsetInfo).getData();
long startTime = 0;
long endTime = 0;
while (data.hasCurrent()) {
if (startTime == 0) {
startTime = data.currentTime();
endTime = data.currentTime();
}
if (data.currentTime() < startTime) {
startTime = data.currentTime();
}
if (data.currentTime() > endTime) {
endTime = data.currentTime();
}
data.next();
}
pageOffsetInfo.setStartTime(startTime);
pageOffsetInfo.setEndTime(endTime);
}
reader.skipPageData(pageHeader);
chunkDataSize -= pageHeader.getSerializedPageSize();
pageOffsetInfoList.add(pageOffsetInfo);
}
return pageOffsetInfoList;
}