public ChunkModel fetchChunkByChunkMetadata()

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


  public ChunkModel fetchChunkByChunkMetadata(ChunkMetadata chunkMetadata)
      throws IOException, InterruptedException {

    countDownLatch.await();
    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<PageHeader> pageHeaders = new ArrayList<>();

    List<BatchData> batchDataList = new ArrayList<>();

    if (((byte) (chunkHeader.getChunkType() & CHUNK_HEADER_MASK)) == MetaMarker.CHUNK_HEADER) {
      while (dataSize > 0) {
        // a new Page
        PageHeader pageHeader = reader.readPageHeader(chunkHeader.getDataType(), true);
        if (pageHeader.getUncompressedSize() != 0) {
          // not empty page
          chunkStatistics.mergeStatistics(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);
        BatchData batchData = pageReader.getAllSatisfiedPageData();

        dataSize -= pageHeader.getSerializedPageSize();
        chunkHeader.increasePageNums(1);

        pageHeaders.add(pageHeader);
        batchDataList.add(batchData);
      }
    } else {
      // 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 reader =
          new PageReader(
              pageHeader, pageData, chunkHeader.getDataType(), valueDecoder, timeDecoder, null);
      BatchData batchData = reader.getAllSatisfiedPageData();

      chunkHeader.increasePageNums(1);

      pageHeaders.add(pageHeader);
      batchDataList.add(batchData);
    }
    ChunkModel model = new ChunkModel();
    model.setChunkMetadata(chunkMetadata);
    model.setPageHeaders(pageHeaders);
    model.setBatchDataList(batchDataList);
    model.setChunk(reader.readMemChunk(chunkMetadata));
    return model;
  }