mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-13 14:48:54 +02:00
137 lines
5.6 KiB
Scala
137 lines
5.6 KiB
Scala
|
package com.twitter.frigate.pushservice.model
|
||
|
|
||
|
import com.twitter.finagle.stats.StatsReceiver
|
||
|
import com.twitter.frigate.common.base.HydratedMagicFanoutCreatorEventCandidate
|
||
|
import com.twitter.frigate.common.base.MagicFanoutCreatorEventCandidate
|
||
|
import com.twitter.frigate.magic_events.thriftscala.CreatorFanoutType
|
||
|
import com.twitter.frigate.magic_events.thriftscala.MagicEventsReason
|
||
|
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.MagicFanoutCreatorEventIbis2Hydrator
|
||
|
import com.twitter.frigate.pushservice.model.ntab.MagicFanoutCreatorEventNtabRequestHydrator
|
||
|
import com.twitter.frigate.pushservice.params.PushFeatureSwitchParams
|
||
|
import com.twitter.frigate.pushservice.predicate.PredicatesForCandidate
|
||
|
import com.twitter.frigate.pushservice.predicate.magic_fanout.MagicFanoutPredicatesForCandidate
|
||
|
import com.twitter.frigate.pushservice.predicate.ntab_caret_fatigue.MagicFanoutNtabCaretFatiguePredicate
|
||
|
import com.twitter.frigate.pushservice.take.predicates.BasicSendHandlerPredicates
|
||
|
import com.twitter.frigate.thriftscala.CommonRecommendationType
|
||
|
import com.twitter.frigate.thriftscala.FrigateNotification
|
||
|
import com.twitter.gizmoduck.thriftscala.User
|
||
|
import com.twitter.hermit.predicate.NamedPredicate
|
||
|
import com.twitter.storehaus.ReadableStore
|
||
|
import com.twitter.strato.client.UserId
|
||
|
import com.twitter.util.Future
|
||
|
import scala.util.control.NoStackTrace
|
||
|
|
||
|
class MagicFanoutCreatorEventPushCandidateHydratorException(private val message: String)
|
||
|
extends Exception(message)
|
||
|
with NoStackTrace
|
||
|
|
||
|
class MagicFanoutCreatorEventPushCandidate(
|
||
|
candidate: RawCandidate with MagicFanoutCreatorEventCandidate,
|
||
|
creatorUser: Option[User],
|
||
|
copyIds: CopyIds,
|
||
|
creatorTweetCountStore: ReadableStore[UserId, Int]
|
||
|
)(
|
||
|
implicit val statsScoped: StatsReceiver,
|
||
|
pushModelScorer: PushMLModelScorer)
|
||
|
extends PushCandidate
|
||
|
with MagicFanoutCreatorEventIbis2Hydrator
|
||
|
with MagicFanoutCreatorEventNtabRequestHydrator
|
||
|
with MagicFanoutCreatorEventCandidate
|
||
|
with HydratedMagicFanoutCreatorEventCandidate {
|
||
|
override def creatorId: Long = candidate.creatorId
|
||
|
|
||
|
override def hydratedCreator: Option[User] = creatorUser
|
||
|
|
||
|
override lazy val numberOfTweetsFut: Future[Option[Int]] =
|
||
|
creatorTweetCountStore.get(UserId(creatorId))
|
||
|
|
||
|
lazy val userProfile = hydratedCreator
|
||
|
.flatMap(_.profile).getOrElse(
|
||
|
throw new MagicFanoutCreatorEventPushCandidateHydratorException(
|
||
|
s"Unable to get user profile to generate tapThrough for userId: $creatorId"))
|
||
|
|
||
|
override val frigateNotification: FrigateNotification = candidate.frigateNotification
|
||
|
|
||
|
override def subscriberId: Option[Long] = candidate.subscriberId
|
||
|
|
||
|
override def creatorFanoutType: CreatorFanoutType = candidate.creatorFanoutType
|
||
|
|
||
|
override def target: PushTypes.Target = candidate.target
|
||
|
|
||
|
override def pushId: Long = candidate.pushId
|
||
|
|
||
|
override def candidateMagicEventsReasons: Seq[MagicEventsReason] =
|
||
|
candidate.candidateMagicEventsReasons
|
||
|
|
||
|
override def statsReceiver: StatsReceiver = statsScoped
|
||
|
|
||
|
override def pushCopyId: Option[Int] = copyIds.pushCopyId
|
||
|
|
||
|
override def ntabCopyId: Option[Int] = copyIds.ntabCopyId
|
||
|
|
||
|
override def copyAggregationId: Option[String] = copyIds.aggregationId
|
||
|
|
||
|
override def commonRecType: CommonRecommendationType = candidate.commonRecType
|
||
|
|
||
|
override def weightedOpenOrNtabClickModelScorer: PushMLModelScorer = pushModelScorer
|
||
|
|
||
|
}
|
||
|
|
||
|
case class MagicFanouCreatorSubscriptionEventPushPredicates(config: Config)
|
||
|
extends BasicSendHandlerPredicates[MagicFanoutCreatorEventPushCandidate] {
|
||
|
|
||
|
implicit val statsReceiver: StatsReceiver = config.statsReceiver.scope(getClass.getSimpleName)
|
||
|
|
||
|
override val preCandidateSpecificPredicates: List[
|
||
|
NamedPredicate[MagicFanoutCreatorEventPushCandidate]
|
||
|
] =
|
||
|
List(
|
||
|
PredicatesForCandidate.paramPredicate(
|
||
|
PushFeatureSwitchParams.EnableCreatorSubscriptionPush
|
||
|
),
|
||
|
PredicatesForCandidate.isDeviceEligibleForCreatorPush,
|
||
|
MagicFanoutPredicatesForCandidate.creatorPushTargetIsNotCreator(),
|
||
|
MagicFanoutPredicatesForCandidate.duplicateCreatorPredicate,
|
||
|
MagicFanoutPredicatesForCandidate.magicFanoutCreatorPushFatiguePredicate(),
|
||
|
)
|
||
|
|
||
|
override val postCandidateSpecificPredicates: List[
|
||
|
NamedPredicate[MagicFanoutCreatorEventPushCandidate]
|
||
|
] =
|
||
|
List(
|
||
|
MagicFanoutNtabCaretFatiguePredicate(),
|
||
|
MagicFanoutPredicatesForCandidate.isSuperFollowingCreator()(config, statsReceiver).flip
|
||
|
)
|
||
|
}
|
||
|
|
||
|
case class MagicFanoutNewCreatorEventPushPredicates(config: Config)
|
||
|
extends BasicSendHandlerPredicates[MagicFanoutCreatorEventPushCandidate] {
|
||
|
|
||
|
implicit val statsReceiver: StatsReceiver = config.statsReceiver.scope(getClass.getSimpleName)
|
||
|
|
||
|
override val preCandidateSpecificPredicates: List[
|
||
|
NamedPredicate[MagicFanoutCreatorEventPushCandidate]
|
||
|
] =
|
||
|
List(
|
||
|
PredicatesForCandidate.paramPredicate(
|
||
|
PushFeatureSwitchParams.EnableNewCreatorPush
|
||
|
),
|
||
|
PredicatesForCandidate.isDeviceEligibleForCreatorPush,
|
||
|
MagicFanoutPredicatesForCandidate.duplicateCreatorPredicate,
|
||
|
MagicFanoutPredicatesForCandidate.magicFanoutCreatorPushFatiguePredicate,
|
||
|
)
|
||
|
|
||
|
override val postCandidateSpecificPredicates: List[
|
||
|
NamedPredicate[MagicFanoutCreatorEventPushCandidate]
|
||
|
] =
|
||
|
List(
|
||
|
MagicFanoutNtabCaretFatiguePredicate(),
|
||
|
MagicFanoutPredicatesForCandidate.isSuperFollowingCreator()(config, statsReceiver).flip
|
||
|
)
|
||
|
}
|