mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-30 06:56:08 +02:00
58 lines
2.4 KiB
Scala
58 lines
2.4 KiB
Scala
|
package com.twitter.home_mixer.functional_component.feature_hydrator
|
||
|
|
||
|
import com.twitter.conversions.DurationOps._
|
||
|
import com.twitter.home_mixer.model.HomeFeatures.ImpressionBloomFilterFeature
|
||
|
import com.twitter.home_mixer.model.request.HasSeenTweetIds
|
||
|
import com.twitter.home_mixer.service.HomeMixerAlertConfig
|
||
|
import com.twitter.product_mixer.core.feature.Feature
|
||
|
import com.twitter.product_mixer.core.feature.featuremap.FeatureMap
|
||
|
import com.twitter.product_mixer.core.feature.featuremap.FeatureMapBuilder
|
||
|
import com.twitter.product_mixer.core.functional_component.feature_hydrator.QueryFeatureHydrator
|
||
|
import com.twitter.product_mixer.core.model.common.identifier.FeatureHydratorIdentifier
|
||
|
import com.twitter.product_mixer.core.pipeline.PipelineQuery
|
||
|
import com.twitter.stitch.Stitch
|
||
|
import com.twitter.timelines.impressionbloomfilter.{thriftscala => t}
|
||
|
import com.twitter.timelines.impressionstore.impressionbloomfilter.ImpressionBloomFilter
|
||
|
import javax.inject.Inject
|
||
|
import javax.inject.Singleton
|
||
|
|
||
|
@Singleton
|
||
|
case class ImpressionBloomFilterQueryFeatureHydrator[
|
||
|
Query <: PipelineQuery with HasSeenTweetIds] @Inject() (
|
||
|
bloomFilter: ImpressionBloomFilter)
|
||
|
extends QueryFeatureHydrator[Query] {
|
||
|
|
||
|
override val identifier: FeatureHydratorIdentifier = FeatureHydratorIdentifier(
|
||
|
"ImpressionBloomFilter")
|
||
|
|
||
|
private val ImpressionBloomFilterTTL = 7.day
|
||
|
private val ImpressionBloomFilterFalsePositiveRate = 0.002
|
||
|
|
||
|
override val features: Set[Feature[_, _]] = Set(ImpressionBloomFilterFeature)
|
||
|
|
||
|
private val SurfaceArea = t.SurfaceArea.HomeTimeline
|
||
|
|
||
|
override def hydrate(query: Query): Stitch[FeatureMap] = {
|
||
|
val userId = query.getRequiredUserId
|
||
|
bloomFilter.getBloomFilterSeq(userId, SurfaceArea).map { bloomFilterSeq =>
|
||
|
val updatedBloomFilterSeq =
|
||
|
if (query.seenTweetIds.forall(_.isEmpty)) bloomFilterSeq
|
||
|
else {
|
||
|
bloomFilter.addElements(
|
||
|
userId = userId,
|
||
|
surfaceArea = SurfaceArea,
|
||
|
tweetIds = query.seenTweetIds.get,
|
||
|
bloomFilterEntrySeq = bloomFilterSeq,
|
||
|
timeToLive = ImpressionBloomFilterTTL,
|
||
|
falsePositiveRate = ImpressionBloomFilterFalsePositiveRate
|
||
|
)
|
||
|
}
|
||
|
FeatureMapBuilder().add(ImpressionBloomFilterFeature, updatedBloomFilterSeq).build()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
override val alerts = Seq(
|
||
|
HomeMixerAlertConfig.BusinessHours.defaultSuccessRateAlert(99.8)
|
||
|
)
|
||
|
}
|