public TimeseriesMetadata readTimeseriesMetadata()

in java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java [541:611]


  public TimeseriesMetadata readTimeseriesMetadata(
      IDeviceID device,
      String measurement,
      boolean ignoreNotExistDevice,
      LongConsumer ioSizeConsumer)
      throws IOException {
    readFileMetadata(ioSizeConsumer);
    MetadataIndexNode deviceMetadataIndexNode =
        tsFileMetaData.getTableMetadataIndexNode(device.getTableName());
    Pair<IMetadataIndexEntry, Long> metadataIndexPair =
        getMetadataAndEndOffsetOfDeviceNode(deviceMetadataIndexNode, device, true, ioSizeConsumer);
    if (metadataIndexPair == null) {
      if (ignoreNotExistDevice) {
        return null;
      }
      throw new IOException("Device {" + device + "} is not in tsFileMetaData of " + file);
    }
    ByteBuffer buffer =
        readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right, ioSizeConsumer);
    MetadataIndexNode metadataIndexNode = deviceMetadataIndexNode;
    if (!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
      try {
        metadataIndexNode =
            deserializeConfig.measurementMetadataIndexNodeBufferDeserializer.deserialize(
                buffer, deserializeConfig);
      } catch (Exception e) {
        logger.error(METADATA_INDEX_NODE_DESERIALIZE_ERROR, file);
        throw e;
      }
      metadataIndexPair =
          getMetadataAndEndOffsetOfMeasurementNode(
              metadataIndexNode, measurement, false, ioSizeConsumer);
    }
    if (metadataIndexPair == null) {
      return null;
    }
    List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
    if (metadataIndexPair.right - metadataIndexPair.left.getOffset() < Integer.MAX_VALUE) {
      buffer =
          readData(metadataIndexPair.left.getOffset(), metadataIndexPair.right, ioSizeConsumer);
      while (buffer.hasRemaining()) {
        try {
          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(buffer, true));
        } catch (Exception e) {
          logger.error(
              "Something error happened while deserializing TimeseriesMetadata of file {}", file);
          throw e;
        }
      }
    } else {
      if (ioSizeConsumer != null) {
        ioSizeConsumer.accept(metadataIndexPair.right - metadataIndexPair.left.getOffset());
      }
      // when the buffer length is over than Integer.MAX_VALUE,
      // using tsFileInput to get timeseriesMetadataList
      tsFileInput.position(metadataIndexPair.left.getOffset());
      while (tsFileInput.position() < metadataIndexPair.right) {
        try {
          timeseriesMetadataList.add(TimeseriesMetadata.deserializeFrom(tsFileInput, true));
        } catch (Exception e1) {
          logger.error(
              "Something error happened while deserializing TimeseriesMetadata of file {}", file);
          throw e1;
        }
      }
    }

    // return null if path does not exist in the TsFile
    int searchResult = binarySearchInTimeseriesMetadataList(timeseriesMetadataList, measurement);
    return searchResult >= 0 ? timeseriesMetadataList.get(searchResult) : null;
  }