public boolean eval(StructLike data) {
    return new EvalVisitor().eval(data);
  }
@Test
  public void testNotIn() {
    assertThat(notIn("s", 7, 8, 9).literals()).hasSize(3);
    assertThat(notIn("s", 7, 8.1, Long.MAX_VALUE).literals()).hasSize(3);
    assertThat(notIn("s", "abc", "abd", "abc").literals()).hasSize(3);
    assertThat(notIn("s").literals()).isEmpty();
    assertThat(notIn("s", 5).literals()).hasSize(1);
    assertThat(notIn("s", 5, 5).literals()).hasSize(2);
    assertThat(notIn("s", Arrays.asList(5, 5)).literals()).hasSize(2);
    assertThat(notIn("s", Collections.emptyList()).literals()).isEmpty();

    Evaluator evaluator = new Evaluator(STRUCT, notIn("x", 7, 8, Long.MAX_VALUE));
    assertThat(evaluator.eval(TestHelpers.Row.of(7, 8, null)))
        .as("7 not in [7, 8] => false")
        .isFalse();
    assertThat(evaluator.eval(TestHelpers.Row.of(9, 8, null)))
        .as("6 not in [7, 8]  => true")
        .isTrue();

    Evaluator intSetEvaluator =
        new Evaluator(STRUCT, notIn("x", Long.MAX_VALUE, Integer.MAX_VALUE, Long.MIN_VALUE));
    assertThat(intSetEvaluator.eval(TestHelpers.Row.of(Integer.MAX_VALUE, 7.0, null)))
        .as("Integer.MAX_VALUE not_in [Integer.MAX_VALUE] => false")
        .isFalse();
    assertThat(intSetEvaluator.eval(TestHelpers.Row.of(6, 6.8, null)))
        .as("6 not_in [Integer.MAX_VALUE]  => true")
        .isTrue();

    Evaluator integerEvaluator = new Evaluator(STRUCT, notIn("y", 7, 8, 9.1));
    assertThat(integerEvaluator.eval(TestHelpers.Row.of(0, 7.0, null)))
        .as("7.0 not in [7, 8, 9] => false")
        .isFalse();
    assertThat(integerEvaluator.eval(TestHelpers.Row.of(7, 9.1, null)))
        .as("9.1 not in [7, 8, 9.1] => false")
        .isFalse();
    assertThat(integerEvaluator.eval(TestHelpers.Row.of(6, 6.8, null)))
        .as("6.8 not in [7, 8, 9.1]  => true")
        .isTrue();

    Evaluator structEvaluator = new Evaluator(STRUCT, notIn("s1.s2.s3.s4.i", 7, 8, 9));
    assertThat(
            structEvaluator.eval(
                TestHelpers.Row.of(
                    7,
                    8,
                    null,
                    TestHelpers.Row.of(
                        TestHelpers.Row.of(TestHelpers.Row.of(TestHelpers.Row.of(7)))))))
        .as("7 not in [7, 8, 9] => false")
        .isFalse();
    assertThat(
            structEvaluator.eval(
                TestHelpers.Row.of(
                    6,
                    8,
                    null,
                    TestHelpers.Row.of(
                        TestHelpers.Row.of(TestHelpers.Row.of(TestHelpers.Row.of(6)))))))
        .as("6 not in [7, 8, 9]  => true")
        .isTrue();

    StructType charSeqStruct = StructType.of(required(34, "s", Types.StringType.get()));
    Evaluator charSeqEvaluator = new Evaluator(charSeqStruct, notIn("s", "abc", "abd", "abc"));
    assertThat(charSeqEvaluator.eval(TestHelpers.Row.of(new Utf8("abc"))))
        .as("utf8(abc) not in [string(abc), string(abd)] => false")
        .isFalse();
    assertThat(charSeqEvaluator.eval(TestHelpers.Row.of(new Utf8("abcd"))))
        .as("utf8(abcd) not in [string(abc), string(abd)] => true")
        .isTrue();
  }