the-algorithm/pushservice/src/main/scala/com/twitter/frigate/pushservice/model/TopTweetImpressionsPushCandidate.scala
twitter-team b389c3d302 Open-sourcing pushservice
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.
2023-05-19 16:27:07 -05:00

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