public boolean eval(ContentFile<?> file) {
    // TODO: detect the case where a column is missing from the file using file's max field id.
    return new MetricsEvalVisitor().eval(file);
  }
@Test
  public void testStringStartsWith() {
    boolean shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "a"), true).eval(FILE);
    assertThat(shouldRead).as("Should read: no stats").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "a"), true).eval(FILE_2);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "aa"), true).eval(FILE_2);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "aaa"), true).eval(FILE_2);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "1s"), true).eval(FILE_3);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "1str1x"), true).eval(FILE_3);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "ff"), true).eval(FILE_4);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "aB"), true).eval(FILE_2);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "dWX"), true).eval(FILE_2);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "5"), true).eval(FILE_3);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", "3str3x"), true).eval(FILE_3);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("some_empty", "房东整租霍"), true).eval(FILE);
    assertThat(shouldRead).as("Should read: range matches").isTrue();

    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("all_nulls", ""), true).eval(FILE);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();

    String aboveMax = UnicodeUtil.truncateStringMax(Literal.of("イロハニホヘト"), 4).value().toString();
    shouldRead =
        new InclusiveMetricsEvaluator(SCHEMA, startsWith("required", aboveMax), true).eval(FILE_4);
    assertThat(shouldRead).as("Should not read: range doesn't match").isFalse();
  }