in scrooge-adaptive/src/main/scala/com/twitter/scrooge/adapt/AdaptTrackingDecoder.scala [47:90]
def fieldAccessed(fieldId: Short): Unit =
fieldAccessCounts(fieldId).getAndIncrement()
@volatile private[this] var adaptiveDecoder: Decoder[T] = _
private[this] def allFieldsUsed(useMap: Map[Short, Boolean]): Boolean =
useMap.values.forall(identity)
private[this] def buildDecoder(): Decoder[T] = {
val useMapByField = codec.metaData.fields.map { f =>
(f, fieldAccessCounts(f.id).get >= settings.useThreshold)
}.toMap
val useMapByName = useMapByField.map {
case (f, v) =>
val normalizedName = CaseConverter.toCamelCase(f.name)
(normalizedName, v)
}
val useMapById = useMapByField.map { case (f, v) => (f.id, v) }
if (allFieldsUsed(useMapById)) {
logger.ifDebug(
s"Adaptive scrooge is using all fields for ${codec.metaData.structName} struct."
)
fallbackDecoder
} else {
val namesToUse = useMapByName.collect {
case (name, true) => name
}
if (namesToUse.isEmpty) {
logger.ifDebug(
s"Adaptive scrooge isn't using fields for ${codec.metaData.structName} struct with settings: $settings"
)
} else {
logger.ifDebug(
s"Adaptive scrooge is using fields: ${namesToUse
.mkString(",")} for ${codec.metaData.structName} struct with settings: $settings"
)
}
buildAdaptiveDecoder(useMapByName, useMapById)
}
}