mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-01 08:48:46 +02:00
b389c3d302
Pushservice is the main recommendation service we use to surface recommendations to our users via notifications. It fetches candidates from various sources, ranks them in order of relevance, and applies filters to determine the best one to send.
71 lines
3.3 KiB
Scala
71 lines
3.3 KiB
Scala
package com.twitter.frigate.pushservice.model
|
|
|
|
import com.twitter.finagle.stats.StatsReceiver
|
|
import com.twitter.frigate.common.base.TopTweetImpressionsCandidate
|
|
import com.twitter.frigate.pushservice.model.PushTypes.PushCandidate
|
|
import com.twitter.frigate.pushservice.model.PushTypes.RawCandidate
|
|
import com.twitter.frigate.pushservice.config.Config
|
|
import com.twitter.frigate.pushservice.ml.PushMLModelScorer
|
|
import com.twitter.frigate.pushservice.model.candidate.CopyIds
|
|
import com.twitter.frigate.pushservice.model.ibis.TopTweetImpressionsCandidateIbis2Hydrator
|
|
import com.twitter.frigate.pushservice.model.ntab.TopTweetImpressionsNTabRequestHydrator
|
|
import com.twitter.frigate.pushservice.predicate.TopTweetImpressionsPredicates
|
|
import com.twitter.frigate.pushservice.take.predicates.BasicTweetPredicatesForRFPH
|
|
import com.twitter.frigate.thriftscala.CommonRecommendationType
|
|
import com.twitter.hermit.predicate.NamedPredicate
|
|
import com.twitter.notificationservice.thriftscala.StoryContext
|
|
import com.twitter.notificationservice.thriftscala.StoryContextValue
|
|
import com.twitter.stitch.tweetypie.TweetyPie
|
|
|
|
/**
|
|
* This class defines a hydrated [[TopTweetImpressionsCandidate]]
|
|
*
|
|
* @param candidate: [[TopTweetImpressionsCandidate]] for the candidate representing the user's Tweet with the most impressions
|
|
* @param copyIds: push and ntab notification copy
|
|
* @param stats: finagle scoped states receiver
|
|
* @param pushModelScorer: ML model score object for fetching prediction scores
|
|
*/
|
|
class TopTweetImpressionsPushCandidate(
|
|
candidate: RawCandidate with TopTweetImpressionsCandidate,
|
|
copyIds: CopyIds
|
|
)(
|
|
implicit stats: StatsReceiver,
|
|
pushModelScorer: PushMLModelScorer)
|
|
extends PushCandidate
|
|
with TopTweetImpressionsCandidate
|
|
with TopTweetImpressionsNTabRequestHydrator
|
|
with TopTweetImpressionsCandidateIbis2Hydrator {
|
|
override val target: PushTypes.Target = candidate.target
|
|
override val commonRecType: CommonRecommendationType = candidate.commonRecType
|
|
override val tweetId: Long = candidate.tweetId
|
|
override lazy val tweetyPieResult: Option[TweetyPie.TweetyPieResult] =
|
|
candidate.tweetyPieResult
|
|
override val impressionsCount: Long = candidate.impressionsCount
|
|
|
|
override val statsReceiver: StatsReceiver = stats.scope(getClass.getSimpleName)
|
|
override val pushCopyId: Option[Int] = copyIds.pushCopyId
|
|
override val ntabCopyId: Option[Int] = copyIds.ntabCopyId
|
|
override val copyAggregationId: Option[String] = copyIds.aggregationId
|
|
override val weightedOpenOrNtabClickModelScorer: PushMLModelScorer = pushModelScorer
|
|
override val storyContext: Option[StoryContext] =
|
|
Some(StoryContext(altText = "", value = Some(StoryContextValue.Tweets(Seq(tweetId)))))
|
|
}
|
|
|
|
case class TopTweetImpressionsPushCandidatePredicates(config: Config)
|
|
extends BasicTweetPredicatesForRFPH[TopTweetImpressionsPushCandidate] {
|
|
|
|
implicit val statsReceiver: StatsReceiver = config.statsReceiver.scope(getClass.getSimpleName)
|
|
|
|
override val preCandidateSpecificPredicates: List[
|
|
NamedPredicate[TopTweetImpressionsPushCandidate]
|
|
] = List(
|
|
TopTweetImpressionsPredicates.topTweetImpressionsFatiguePredicate
|
|
)
|
|
|
|
override val postCandidateSpecificPredicates: List[
|
|
NamedPredicate[TopTweetImpressionsPushCandidate]
|
|
] = List(
|
|
TopTweetImpressionsPredicates.topTweetImpressionsThreshold()
|
|
)
|
|
}
|