public List fetchPageOffsetListByChunkOffset()

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;
  }