private static Type getOrcReadType(Type columnType, TypeManager typeManager) {
    if (columnType instanceof ArrayType) {
      return new ArrayType(getOrcReadType(((ArrayType) columnType).getElementType(), typeManager));
    }
    if (columnType instanceof MapType mapType) {
      Type keyType = getOrcReadType(mapType.getKeyType(), typeManager);
      Type valueType = getOrcReadType(mapType.getValueType(), typeManager);
      return new MapType(keyType, valueType, typeManager.getTypeOperators());
    }
    if (columnType instanceof RowType) {
      return RowType.from(
          ((RowType) columnType)
              .getFields().stream()
                  .map(
                      field ->
                          new RowType.Field(
                              field.getName(), getOrcReadType(field.getType(), typeManager)))
                  .collect(toImmutableList()));
    }

    return columnType;
  }
Gets the index based dereference chain to get from the readColumnHandle to the
expectedColumnHandle
amoro-format-mixed/amoro-mixed-trino/src/main/java/org/apache/amoro/trino/unkeyed/IcebergPageSourceProvider.java