private[samplers] def hashProtobufField[T <: AbstractMessage: ClassTag]()

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
      }
    }
  }