public Pair<List<Integer>, List<String>> computeSourceOfLogicalView(
      final ISchemaComputation schemaComputation) {
    if (!schemaComputation.hasLogicalViewNeedProcess()) {
      return new Pair<>(new ArrayList<>(), new ArrayList<>());
    }

    final List<Integer> indexOfMissingMeasurements = new ArrayList<>();
    final Pair<Integer, Integer> beginToEnd =
        schemaComputation.getRangeOfLogicalViewSchemaListRecorded();
    final List<LogicalViewSchema> logicalViewSchemaList =
        schemaComputation.getLogicalViewSchemaList();
    final List<Integer> indexListOfLogicalViewPaths =
        schemaComputation.getIndexListOfLogicalViewPaths();

    for (int i = beginToEnd.left; i < beginToEnd.right; i++) {
      final LogicalViewSchema logicalViewSchema = logicalViewSchemaList.get(i);
      final int realIndex = indexListOfLogicalViewPaths.get(i);
      if (!logicalViewSchema.isWritable()) {
        throw new RuntimeException(
            new InsertNonWritableViewException(
                schemaComputation
                    .getDevicePath()
                    .concatAsMeasurementPath(schemaComputation.getMeasurements()[realIndex])
                    .getFullPath()));
      }

      final PartialPath fullPath = logicalViewSchema.getSourcePathIfWritable();
      final IDeviceSchema schema =
          tableDeviceSchemaCache.getDeviceSchema(fullPath.getDevicePath().getNodes());
      if (!(schema instanceof TreeDeviceNormalSchema)) {
        indexOfMissingMeasurements.add(i);
        continue;
      }

      final TreeDeviceNormalSchema treeSchema = (TreeDeviceNormalSchema) schema;
      final SchemaCacheEntry value = treeSchema.getSchemaCacheEntry(fullPath.getMeasurement());
      if (Objects.isNull(value)) {
        indexOfMissingMeasurements.add(i);
        continue;
      }

      if (value.isLogicalView()) {
        throw new RuntimeException(
            new UnsupportedOperationException(
                String.format(
                    "The source of view [%s] is also a view! Nested view is unsupported! "
                        + "Please check it.",
                    logicalViewSchema.getSourcePathIfWritable())));
      }

      schemaComputation.computeMeasurementOfView(realIndex, value, treeSchema.isAligned());
    }

    return new Pair<>(
        indexOfMissingMeasurements,
        indexOfMissingMeasurements.stream()
            .map(index -> logicalViewSchemaList.get(index).getSourcePathStringIfWritable())
            .collect(Collectors.toList()));
  }
This function is used to process logical view schema list in statement. It will try to find the
source paths of those views in cache. If it found sources, measurement schemas of sources will
be recorded in measurement schema list; else the views will be recorded as missed. The indexes
of missed views and full paths of their source paths will be returned.

@param schemaComputation the statement you want to process
@return The indexes of missed views and full paths of their source paths will be returned.
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/cache/TreeDeviceSchemaCacheManager.java