import com.fasterxml.jackson.databind.JsonNode; //导入方法依赖的package包/类
private MatchType matches(JsonNode datum, Schema schema) {
switch (schema.getType()) {
case RECORD:
if (datum.isObject()) {
return matchRecord(datum, schema);
}
break;
case UNION:
return resolveUnion(datum, schema.getTypes()).matchType;
case MAP:
if (datum.isObject()) {
return matchMapValue(datum, schema);
}
break;
case ARRAY:
if (datum.isArray()) {
return matchArrayElement(datum, schema);
}
break;
case BOOLEAN:
if (datum.isBoolean()) {
return MatchType.FULL;
}
break;
case FLOAT:
if (datum.isDouble() && datum.doubleValue() >= -Float.MAX_VALUE && datum.doubleValue() <= Float.MAX_VALUE
|| datum.isLong()
&& datum.longValue() >= (long) -Float.MAX_VALUE
&& datum.longValue() <= (long) Float.MAX_VALUE
|| datum.isFloat()
|| datum.isInt()) {
return MatchType.FULL;
}
break;
case DOUBLE:
if (datum.isDouble() || datum.isFloat() || datum.isLong() || datum.isInt()) {
return MatchType.FULL;
}
break;
case INT:
if (datum.isInt()) {
return MatchType.FULL;
}
break;
case LONG:
if (datum.isLong() || datum.isInt()) {
return MatchType.FULL;
}
break;
case STRING:
if (datum.isTextual()) {
return MatchType.FULL;
}
break;
case ENUM:
if (datum.isTextual() && schema.hasEnumSymbol(datum.textValue())) {
return MatchType.FULL;
}
break;
case BYTES:
case FIXED:
if (datum.isTextual()) {
return MatchType.FULL;
}
break;
case NULL:
if (datum.isNull()) {
return MatchType.FULL;
}
break;
default: // unknown
throw new IllegalArgumentException("Unsupported schema: " + schema);
}
return MatchType.NONE;
}