private void generateMetadataIndexWithOffset()

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


    private void generateMetadataIndexWithOffset(
        long startOffset,
        MetadataIndexEntry metadataIndex,
        ByteBuffer buffer,
        String deviceId,
        MetadataIndexNodeType type,
        Map<Long, Pair<Path, ITimeSeriesMetadata>> timeseriesMetadataMap,
        TimeSeriesMetadataNode tsNode,
        boolean needChunkMetadata)
        throws IOException {
      try {
        if (type.equals(MetadataIndexNodeType.LEAF_MEASUREMENT)) {
          TimeseriesMetadata alignedTime = null;
          List<TimeseriesMetadata> alignedValues = new ArrayList<>();
          AlignedTimeSeriesMetadata alignedTimeSeriesMetadata = null;
          boolean aligned = true;
          while (buffer.hasRemaining()) {
            long pos = startOffset + buffer.position();
            TimeseriesMetadata timeseriesMetadata =
                TimeseriesMetadata.deserializeFrom(buffer, needChunkMetadata);
            // 判断是否对其时间序列
            if ((timeseriesMetadata.getTimeSeriesMetadataType() & TsFileConstant.TIME_COLUMN_MASK)
                == TsFileConstant.TIME_COLUMN_MASK) {
              if (aligned && alignedTime != null && alignedValues.size() > 0) {
                leafNodeWithAligned(
                    alignedTime,
                    alignedValues,
                    startOffset + buffer.position(),
                    deviceId,
                    tsNode,
                    type,
                    timeseriesMetadataMap);
              }
              aligned = true;
              alignedTime = new TimeseriesMetadata(timeseriesMetadata);
            } else if ((timeseriesMetadata.getTimeSeriesMetadataType()
                    & TsFileConstant.VALUE_COLUMN_MASK)
                == TsFileConstant.VALUE_COLUMN_MASK) {
              alignedValues.add(timeseriesMetadata);
            } else {

              if (aligned && alignedTime != null && alignedValues.size() > 0) {
                leafNodeWithAligned(
                    alignedTime,
                    alignedValues,
                    startOffset + buffer.position(),
                    deviceId,
                    tsNode,
                    type,
                    timeseriesMetadataMap);
              }

              timeseriesMetadataMap.put(
                  pos,
                  new Pair<>(
                      new Path(deviceId, timeseriesMetadata.getMeasurementId()),
                      timeseriesMetadata));
              TimeSeriesMetadataNode leafNode = new TimeSeriesMetadataNode();
              leafNode.setChildren(new ArrayList<>());
              leafNode.setPosition(pos);
              leafNode.setDeviceId(deviceId);
              leafNode.setMeasurementId(timeseriesMetadata.getMeasurementId());
              leafNode.setTimeseriesMetadata(timeseriesMetadata);
              allCount += timeseriesMetadata.getStatistics().getCount();
              leafNode.setNodeType(type);
              tsNode.getChildren().add(leafNode);
              aligned = false;
            }
          }
          if (aligned && alignedTime != null && alignedValues.size() > 0) {
            leafNodeWithAligned(
                alignedTime,
                alignedValues,
                startOffset + buffer.position(),
                deviceId,
                tsNode,
                type,
                timeseriesMetadataMap);
          }

          tsNode.setNodeType(type);
          tsNode.setPosition(startOffset + buffer.position());
          tsNode.setDeviceId(deviceId);
        } else {
          // deviceId should be determined by LEAF_DEVICE node
          if (type.equals(MetadataIndexNodeType.LEAF_DEVICE)) {
            deviceId = metadataIndex.getName();
          }
          MetadataIndexNode metadataIndexNode = MetadataIndexNode.deserializeFrom(buffer);
          int metadataIndexListSize = metadataIndexNode.getChildren().size();
          for (int i = 0; i < metadataIndexListSize; i++) {
            long endOffset = metadataIndexNode.getEndOffset();
            if (i != metadataIndexListSize - 1) {
              endOffset = metadataIndexNode.getChildren().get(i + 1).getOffset();
            }
            ByteBuffer nextBuffer =
                readData(metadataIndexNode.getChildren().get(i).getOffset(), endOffset);
            TimeSeriesMetadataNode tsChildNode = new TimeSeriesMetadataNode();
            generateMetadataIndexWithOffset(
                metadataIndexNode.getChildren().get(i).getOffset(),
                metadataIndexNode.getChildren().get(i),
                nextBuffer,
                deviceId,
                metadataIndexNode.getNodeType(),
                timeseriesMetadataMap,
                tsChildNode,
                needChunkMetadata);
            tsNode.getChildren().add(tsChildNode);
          }
          tsNode.setDeviceId(deviceId);
          tsNode.setPosition(startOffset + buffer.position());
          tsNode.setNodeType(type);
        }
      } catch (BufferOverflowException e) {
        logger.error("Unrecognized metadataIndexNode type, type:{}", type);
        throw e;
      }
    }