public static String describe(List<org.apache.iceberg.expressions.Expression> exprs) {
    return exprs.stream().map(Spark3Util::describe).collect(Collectors.joining(", "));
  }
@Test
  public void testDescribeSortOrder() {
    Schema schema =
        new Schema(
            required(1, "data", Types.StringType.get()),
            required(2, "time", Types.TimestampType.withoutZone()));

    assertThat(Spark3Util.describe(buildSortOrder("Identity", schema, 1)))
        .as("Sort order isn't correct.")
        .isEqualTo("data DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("bucket[1]", schema, 1)))
        .as("Sort order isn't correct.")
        .isEqualTo("bucket(1, data) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("truncate[3]", schema, 1)))
        .as("Sort order isn't correct.")
        .isEqualTo("truncate(data, 3) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("year", schema, 2)))
        .as("Sort order isn't correct.")
        .isEqualTo("years(time) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("month", schema, 2)))
        .as("Sort order isn't correct.")
        .isEqualTo("months(time) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("day", schema, 2)))
        .as("Sort order isn't correct.")
        .isEqualTo("days(time) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("hour", schema, 2)))
        .as("Sort order isn't correct.")
        .isEqualTo("hours(time) DESC NULLS FIRST");

    assertThat(Spark3Util.describe(buildSortOrder("unknown", schema, 1)))
        .as("Sort order isn't correct.")
        .isEqualTo("unknown(data) DESC NULLS FIRST");

    // multiple sort orders
    SortOrder multiOrder =
        SortOrder.builderFor(schema).asc("time", NULLS_FIRST).asc("data", NULLS_LAST).build();
    assertThat(Spark3Util.describe(multiOrder))
        .as("Sort order isn't correct.")
        .isEqualTo("time ASC NULLS FIRST, data ASC NULLS LAST");
  }