public static Expression convert(Filter[] filters) {
    Expression expression = Expressions.alwaysTrue();
    for (Filter filter : filters) {
      Expression converted = convert(filter);
      Preconditions.checkArgument(
          converted != null, "Cannot convert filter to Iceberg: %s", filter);
      expression = Expressions.and(expression, converted);
    }
    return expression;
  }
@Test
  public void testTimestampFilterConversion() {
    Instant instant = Instant.parse("2018-10-18T00:00:57.907Z");
    Timestamp timestamp = Timestamp.from(instant);
    long epochMicros = ChronoUnit.MICROS.between(Instant.EPOCH, instant);

    Expression instantExpression = SparkFilters.convert(GreaterThan.apply("x", instant));
    Expression timestampExpression = SparkFilters.convert(GreaterThan.apply("x", timestamp));
    Expression rawExpression = Expressions.greaterThan("x", epochMicros);

    assertThat(timestampExpression.toString())
        .as("Generated Timestamp expression should be correct")
        .isEqualTo(rawExpression.toString());

    assertThat(instantExpression.toString())
        .as("Generated Instant expression should be correct")
        .isEqualTo(rawExpression.toString());
  }