public static StrictFieldProjectionFilter fromSemicolonDelimitedString(String columnsToKeepGlobs) {
    return new StrictFieldProjectionFilter(parseSemicolonDelimitedString(columnsToKeepGlobs));
  }
@Test
  public void testProjection() {
    StrictFieldProjectionFilter filter = StrictFieldProjectionFilter.fromSemicolonDelimitedString(
        "home.phone_number;home.address;work.address.zip;base_info;*.average;a.b.c.pre{x,y,z{a,b,c}}post");

    assertMatches(
        filter,
        "home.phone_number",
        "home.address",
        "work.address.zip",
        "base_info",
        "foo.average",
        "bar.x.y.z.average",
        "base_info.nested.field",
        "a.b.c.prexpost",
        "a.b.c.prezapost");

    assertDoesNotMatch(
        filter,
        "home2.phone_number",
        "home2.address",
        "work.address",
        "base_info2",
        "foo_average",
        "bar.x.y.z_average",
        "base_info_nested.field",
        "hi",
        "average",
        "a.b.c.pre{x,y,z{a,b,c}}post",
        "");
  }