public static boolean canDrop(FilterPredicate pred, List<ColumnChunkMetaData> columns) {
    Objects.requireNonNull(pred, "pred cannot be null");
    Objects.requireNonNull(columns, "columns cannot be null");
    return pred.accept(new StatisticsFilter(columns));
  }
@Test
  public void testInNotIn() {
    Set<Integer> values1 = new HashSet<>();
    values1.add(10);
    values1.add(12);
    values1.add(15);
    values1.add(17);
    values1.add(19);
    assertFalse(canDrop(in(intColumn, values1), columnMetas));
    assertFalse(canDrop(notIn(intColumn, values1), columnMetas));

    Set<Integer> values2 = new HashSet<>();
    values2.add(109);
    values2.add(2);
    values2.add(5);
    values2.add(117);
    values2.add(101);
    assertFalse(canDrop(in(intColumn, values2), columnMetas));
    assertFalse(canDrop(notIn(intColumn, values2), columnMetas));

    Set<Integer> values3 = new HashSet<>();
    values3.add(1);
    values3.add(2);
    values3.add(5);
    values3.add(7);
    values3.add(10);
    assertFalse(canDrop(in(intColumn, values3), columnMetas));
    assertFalse(canDrop(notIn(intColumn, values3), columnMetas));

    Set<Integer> values4 = new HashSet<>();
    values4.add(50);
    values4.add(60);
    assertFalse(canDrop(in(intColumn, values4), missingMinMaxColumnMetas));
    assertFalse(canDrop(notIn(intColumn, values4), missingMinMaxColumnMetas));

    Set<Double> values5 = new HashSet<>();
    values5.add(1.0);
    values5.add(2.0);
    values5.add(95.0);
    values5.add(107.0);
    values5.add(99.0);
    assertFalse(canDrop(in(doubleColumn, values5), columnMetas));
    assertFalse(canDrop(notIn(doubleColumn, values5), columnMetas));

    Set<Binary> values6 = new HashSet<>();
    values6.add(Binary.fromString("test1"));
    values6.add(Binary.fromString("test2"));
    assertTrue(canDrop(in(missingColumn, values6), columnMetas));
    assertFalse(canDrop(notIn(missingColumn, values6), columnMetas));

    Set<Integer> values7 = new HashSet<>();
    values7.add(null);
    assertFalse(canDrop(in(intColumn, values7), nullColumnMetas));
    assertFalse(canDrop(notIn(intColumn, values7), nullColumnMetas));

    Set<Binary> values8 = new HashSet<>();
    values8.add(null);
    assertFalse(canDrop(in(missingColumn, values8), columnMetas));
    assertFalse(canDrop(notIn(missingColumn, values8), columnMetas));

    IntStatistics statsNoNulls = new IntStatistics();
    statsNoNulls.setMinMax(10, 100);
    statsNoNulls.setNumNulls(0);

    IntStatistics statsSomeNulls = new IntStatistics();
    statsSomeNulls.setMinMax(10, 100);
    statsSomeNulls.setNumNulls(3);

    Set<Integer> values9 = new HashSet<>();
    values9.add(null);
    assertTrue(canDrop(
        in(intColumn, values9),
        Arrays.asList(getIntColumnMeta(statsNoNulls, 177L), getDoubleColumnMeta(doubleStats, 177L))));

    assertFalse(canDrop(
        notIn(intColumn, values9),
        Arrays.asList(getIntColumnMeta(statsNoNulls, 177L), getDoubleColumnMeta(doubleStats, 177L))));

    assertFalse(canDrop(
        in(intColumn, values9),
        Arrays.asList(getIntColumnMeta(statsSomeNulls, 177L), getDoubleColumnMeta(doubleStats, 177L))));

    assertFalse(canDrop(
        notIn(intColumn, values9),
        Arrays.asList(getIntColumnMeta(statsSomeNulls, 177L), getDoubleColumnMeta(doubleStats, 177L))));
  }