public PageDataTableInfo fetchBatchDataByPageOffset()

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


  public PageDataTableInfo fetchBatchDataByPageOffset(PageOffsetInfo pageOffsetInfo)
      throws IOException, InterruptedException {

    PageDataTableInfo tableInfo = new PageDataTableInfo();
    BatchData batchData;
    Decoder timeDecoder =
        Decoder.getDecoderByType(
            TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
            TSDataType.INT64);

    reader.position(pageOffsetInfo.getOffset());

    if (!pageOffsetInfo.isAligned()) {
      byte marker = reader.readMarker();
      PageHeader pageHeader =
          reader.readPageHeader(pageOffsetInfo.getTsDataType(), pageOffsetInfo.isHasStatistics());
      Decoder valueDecoder =
          Decoder.getDecoderByType(
              pageOffsetInfo.getEncodingType(), pageOffsetInfo.getTsDataType());
      ByteBuffer pageData = reader.readPage(pageHeader, pageOffsetInfo.getCompressionType());

      PageReader pageReader =
          new PageReader(
              pageHeader,
              pageData,
              pageOffsetInfo.getTsDataType(),
              valueDecoder,
              timeDecoder,
              null);
      batchData = pageReader.getAllSatisfiedPageData();
      tableInfo.getTitle().add("timestamp");
      tableInfo.getTitle().add("value");
    } else {
      long cgOffset = pageOffsetInfo.getChunkGroupOffset();
      List<ChunkOffsetInfo> chunkOffsetInfoList = fetchChunkOffsetListByChunkGroupOffset(cgOffset);
      //      ChunkOffsetInfo timeChunk = chunkOffsetInfoList.get(0);
      //      List<PageOffsetInfo> timePageInfoList =
      // fetchPageOffsetListByChunkOffset(timeChunk.getOffset());
      List<PageOffsetInfo> valuePageInfoList = new ArrayList<>();

      tableInfo
          .getTitle()
          .addAll(
              chunkOffsetInfoList.stream()
                  .map(chunkOffsetInfo -> chunkOffsetInfo.getMeasurementId())
                  .collect(Collectors.toList()));
      tableInfo.getTitle().set(0, "timestamp");
      int positionInTimmeChunkPages = 0;
      // hasStatistics,对应的是chunk中的信息 false 代表是单页的chunk,
      if (pageOffsetInfo.isHasStatistics()) {
        // 查找当前page在timeChunk中的位置
        List<PageOffsetInfo> pageOffsetListInTimeChunk =
            fetchPageOffsetListByChunkOffset(chunkOffsetInfoList.get(0).getOffset());
        for (int i = 0; i < pageOffsetListInTimeChunk.size(); i++) {
          if (pageOffsetInfo.getOffset() == pageOffsetListInTimeChunk.get(i).getOffset()) {
            positionInTimmeChunkPages = i;
            break;
          }
        }
      }

      for (int i = 1; i < chunkOffsetInfoList.size(); i++) {
        long valueChunkOffset = chunkOffsetInfoList.get(i).getOffset();
        List<PageOffsetInfo> pageOffsetInfoList =
            fetchPageOffsetListByChunkOffset(valueChunkOffset);
        valuePageInfoList.add(pageOffsetInfoList.get(positionInTimmeChunkPages));
      }

      reader.position(pageOffsetInfo.getOffset());
      reader.readMarker();
      PageHeader timePageHeader =
          reader.readPageHeader(pageOffsetInfo.getTsDataType(), pageOffsetInfo.isHasStatistics());
      ByteBuffer timeByteBuffer =
          reader.readPage(timePageHeader, pageOffsetInfo.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;
  }