in ratatool-sampling/src/main/scala/com/spotify/ratatool/samplers/BigSamplerProto.scala [52:84]
private[samplers] def hashProtobufField[T <: AbstractMessage: ClassTag](
m: T,
fieldStr: String,
hasher: Hasher
): Hasher = {
val subfields = fieldStr.split(BigSampler.fieldSep)
val field = Option(m.getDescriptorForType.findFieldByName(subfields.head)).getOrElse {
throw new NoSuchElementException(s"Can't find field $fieldStr in protobuf schema")
}
val v = m.getField(field)
if (v == null) {
log.debug(
s"Field `${field.getFullName}` of type ${field.getType} is null - won't account" +
s" for hash"
)
hasher
} else {
field.getJavaType match {
case JavaType.MESSAGE =>
hashProtobufField(v.asInstanceOf[AbstractMessage], subfields.tail.mkString("."), hasher)
case JavaType.INT => hasher.putLong(v.asInstanceOf[Int].toLong)
case JavaType.LONG => hasher.putLong(v.asInstanceOf[Long])
case JavaType.FLOAT => hasher.putFloat(v.asInstanceOf[Float])
case JavaType.DOUBLE => hasher.putDouble(v.asInstanceOf[Double])
case JavaType.BOOLEAN => hasher.putBoolean(v.asInstanceOf[Boolean])
case JavaType.STRING =>
hasher.putString(v.asInstanceOf[CharSequence], BigSampler.utf8Charset)
case JavaType.BYTE_STRING => hasher.putBytes(v.asInstanceOf[ByteString].toByteArray)
case JavaType.ENUM => hasher.putString(v.asInstanceOf[Enum[_]].name, BigSampler.utf8Charset)
// Array, Union
}
}
}