}
FieldType fieldType = fieldTypes.getFieldType(new SchemaIdImpl(Bytes.tail(key, key.length - 1)));
if (context != null) {
context.addFieldType(fieldType);
}
ValueType valueType = fieldType.getValueType();
Metadata metadata = null;
int metadataSpace = 0; // space taken up by metadata (= metadata itself + length suffix)
int metadataEncodingVersion = FieldFlags.getFieldMetadataVersion(flags);
if (metadataEncodingVersion == 0) {
// there is no metadata
} else if (metadataEncodingVersion == 1) {
int metadataSize = Bytes.toInt(prefixedValue, prefixedValue.length - Bytes.SIZEOF_INT, Bytes.SIZEOF_INT);
metadataSpace = metadataSize + Bytes.SIZEOF_INT;
metadata = MetadataSerDeser.read(
new DataInputImpl(prefixedValue, prefixedValue.length - metadataSpace, metadataSize));
} else {
throw new RuntimeException("Unsupported field metadata encoding version: " + metadataEncodingVersion);
}
Object value = valueType.read(new DataInputImpl(prefixedValue, FieldFlags.SIZE_OF_FIELD_FLAGS,
prefixedValue.length - FieldFlags.SIZE_OF_FIELD_FLAGS - metadataSpace));
return new ExtractedField(fieldType, value, metadata);
}