@Override
    public boolean matchesType(Type t) {
        if (t.isPseudoType()) {
            return t.matchesType(this);
        }
        if (!t.isStructType()) {
            return false;
        }

        StructType rhsType = (StructType) t;
        if (fields.size() != rhsType.fields.size()) {
            return false;
        }
        for (int i = 0; i < fields.size(); ++i) {
            if (!fields.get(i).getType().matchesType(rhsType.fields.get(i).getType())) {
                return false;
            }
            if (!StringUtils.equalsIgnoreCase(fields.get(i).getName(), rhsType.fields.get(i).getName())) {
                return false;
            }
        }
        return true;
    }
@Test
    public void testTypeMatch() {
        Assert.assertTrue(Type.ANY_STRUCT.matchesType(Type.ANY_STRUCT));
        Assert.assertTrue(Type.ANY_STRUCT.matchesType(Type.ANY_ELEMENT));
        StructType structType = new StructType(Lists.newArrayList(Type.BIGINT, Type.DOUBLE));
        Assert.assertTrue(Type.ANY_STRUCT.matchesType(structType));
    }