public List fetchPageInfoListByChunkMetadata()

in tsfile-viewer-core/src/main/java/org/apache/iotdb/tool/core/service/TsFileAnalyserV13.java [638:713]


  public List<IPageInfo> fetchPageInfoListByChunkMetadata(IChunkMetadata chunkMetadata)
      throws IOException {

    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<IPageInfo> pageInfoList = new ArrayList<>();

    if (((byte) (chunkHeader.getChunkType() & CHUNK_HEADER_MASK)) == MetaMarker.CHUNK_HEADER) {
      logger.info(
          "read more than one page or read a page of aligned chunk, the chunkType:{}",
          chunkHeader.getChunkType());
      while (dataSize > 0) {
        PageInfo pageInfo = new PageInfo(reader.position());
        // a new Page
        PageHeader pageHeader = reader.readPageHeader(chunkHeader.getDataType(), true);
        if (pageHeader.getUncompressedSize() != 0) {
          // not empty page
          chunkStatistics.mergeStatistics(pageHeader.getStatistics());
          pageInfo.setStatistics(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);

        pageInfo.setUncompressedSize(pageHeader.getUncompressedSize());
        pageInfo.setCompressedSize(pageHeader.getCompressedSize());
        pageInfo.setDataType(chunkHeader.getDataType());
        pageInfo.setEncodingType(chunkHeader.getEncodingType());
        pageInfo.setCompressionType(chunkHeader.getCompressionType());
        pageInfo.setChunkType(chunkHeader.getChunkType());
        pageInfoList.add(pageInfo);

        dataSize -= pageHeader.getSerializedPageSize();
      }
    } else {
      logger.info("read a page of aligned chunk, the chunkType:{}", chunkHeader.getChunkType());
      PageInfo pageInfo = new PageInfo(reader.position());
      // 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 pageReader =
          new PageReader(
              pageHeader, pageData, chunkHeader.getDataType(), valueDecoder, timeDecoder, null);

      pageInfo.setUncompressedSize(pageHeader.getUncompressedSize());
      pageInfo.setCompressedSize(pageHeader.getCompressedSize());
      pageInfo.setDataType(chunkHeader.getDataType());
      pageInfo.setEncodingType(chunkHeader.getEncodingType());
      pageInfo.setCompressionType(chunkHeader.getCompressionType());
      pageInfo.setChunkType(chunkHeader.getChunkType());
      pageInfoList.add(pageInfo);
    }

    return pageInfoList;
  }