public static boolean canDrop(
      FilterPredicate pred, List<ColumnChunkMetaData> columns, DictionaryPageReadStore dictionaries) {
    Objects.requireNonNull(pred, "pred cannnot be null");
    Objects.requireNonNull(columns, "columns cannnot be null");
    return pred.accept(new DictionaryFilter(columns, dictionaries));
  }
@Test
  public void testContainsAnd() throws Exception {
    BinaryColumn col = binaryColumn("binary_field");

    // both evaluate to false (no upper-case letters are in the dictionary)
    Operators.Contains<Binary> B = contains(eq(col, Binary.fromString("B")));
    Operators.Contains<Binary> C = contains(eq(col, Binary.fromString("C")));

    // both evaluate to true (all lower-case letters are in the dictionary)
    Operators.Contains<Binary> x = contains(eq(col, Binary.fromString("x")));
    Operators.Contains<Binary> y = contains(eq(col, Binary.fromString("y")));

    assertTrue("Should drop when either predicate must be false", canDrop(and(B, y), ccmd, dictionaries));
    assertTrue("Should drop when either predicate must be false", canDrop(and(x, C), ccmd, dictionaries));
    assertTrue("Should drop when either predicate must be false", canDrop(and(B, C), ccmd, dictionaries));
    assertFalse("Should not drop when either predicate could be true", canDrop(and(x, y), ccmd, dictionaries));
  }