public List getAlignedChunkMetadataByMetadataIndexNode()

in java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java [2614:2680]


  public List<AbstractAlignedChunkMetadata> getAlignedChunkMetadataByMetadataIndexNode(
      IDeviceID device, MetadataIndexNode metadataIndexNode, boolean ignoreAllNullRows)
      throws IOException {
    TimeseriesMetadata firstTimeseriesMetadata = getTimeColumnMetadata(metadataIndexNode);
    if (firstTimeseriesMetadata == null) {
      throw new IOException("Timeseries of device {" + device + "} are not aligned");
    }

    Map<IDeviceID, List<TimeseriesMetadata>> timeseriesMetadataMap = new TreeMap<>();
    List<IMetadataIndexEntry> metadataIndexEntryList = metadataIndexNode.getChildren();

    for (int i = 0; i < metadataIndexEntryList.size(); i++) {
      IMetadataIndexEntry metadataIndexEntry = metadataIndexEntryList.get(i);
      long endOffset = metadataIndexNode.getEndOffset();
      if (i != metadataIndexEntryList.size() - 1) {
        endOffset = metadataIndexEntryList.get(i + 1).getOffset();
      }
      ByteBuffer buffer = readData(metadataIndexEntry.getOffset(), endOffset);
      if (metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
        List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
        while (buffer.hasRemaining()) {
          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
        }
        timeseriesMetadataMap
            .computeIfAbsent(device, k -> new ArrayList<>())
            .addAll(timeseriesMetadataList);
      } else {
        generateMetadataIndex(
            metadataIndexEntry,
            buffer,
            device,
            metadataIndexNode.getNodeType(),
            timeseriesMetadataMap,
            true);
      }
    }

    if (timeseriesMetadataMap.values().size() != 1) {
      throw new IOException(
          String.format(
              "Error when reading timeseriesMetadata of device %s in file %s: should only one timeseriesMetadataList in one device, actual: %d",
              device, file, timeseriesMetadataMap.values().size()));
    }

    List<TimeseriesMetadata> timeseriesMetadataList =
        timeseriesMetadataMap.values().iterator().next();
    TimeseriesMetadata timeseriesMetadata = timeseriesMetadataList.get(0);
    List<TimeseriesMetadata> valueTimeseriesMetadataList = new ArrayList<>();

    for (int i = 1; i < timeseriesMetadataList.size(); i++) {
      valueTimeseriesMetadataList.add(timeseriesMetadataList.get(i));
    }

    AbstractAlignedTimeSeriesMetadata alignedTimeSeriesMetadata;
    if (ignoreAllNullRows) {
      alignedTimeSeriesMetadata =
          new AlignedTimeSeriesMetadata(timeseriesMetadata, valueTimeseriesMetadataList);
    } else {
      alignedTimeSeriesMetadata =
          new TableDeviceTimeSeriesMetadata(timeseriesMetadata, valueTimeseriesMetadataList);
    }
    List<AbstractAlignedChunkMetadata> chunkMetadataList = new ArrayList<>();
    for (IChunkMetadata chunkMetadata : readIChunkMetaDataList(alignedTimeSeriesMetadata)) {
      chunkMetadataList.add((AbstractAlignedChunkMetadata) chunkMetadata);
    }
    return chunkMetadataList;
  }