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.
73 lines
2.7 KiB
Scala
73 lines
2.7 KiB
Scala
package com.twitter.frigate.pushservice.model
|
|
|
|
import com.twitter.channels.common.thriftscala.ApiList
|
|
import com.twitter.finagle.stats.StatsReceiver
|
|
import com.twitter.frigate.common.base.ListPushCandidate
|
|
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.ListIbis2Hydrator
|
|
import com.twitter.frigate.pushservice.model.ntab.ListCandidateNTabRequestHydrator
|
|
import com.twitter.frigate.pushservice.predicate.ListPredicates
|
|
import com.twitter.frigate.pushservice.take.predicates.BasicRFPHPredicates
|
|
import com.twitter.frigate.thriftscala.CommonRecommendationType
|
|
import com.twitter.hermit.predicate.NamedPredicate
|
|
import com.twitter.storehaus.ReadableStore
|
|
import com.twitter.util.Future
|
|
|
|
class ListRecommendationPushCandidate(
|
|
val apiListStore: ReadableStore[Long, ApiList],
|
|
candidate: RawCandidate with ListPushCandidate,
|
|
copyIds: CopyIds
|
|
)(
|
|
implicit stats: StatsReceiver,
|
|
pushModelScorer: PushMLModelScorer)
|
|
extends PushCandidate
|
|
with ListPushCandidate
|
|
with ListIbis2Hydrator
|
|
with ListCandidateNTabRequestHydrator {
|
|
|
|
override val commonRecType: CommonRecommendationType = candidate.commonRecType
|
|
|
|
override val pushCopyId: Option[Int] = copyIds.pushCopyId
|
|
|
|
override val ntabCopyId: Option[Int] = copyIds.ntabCopyId
|
|
|
|
override val copyAggregationId: Option[String] = copyIds.aggregationId
|
|
|
|
override val statsReceiver: StatsReceiver = stats
|
|
|
|
override val weightedOpenOrNtabClickModelScorer: PushMLModelScorer = pushModelScorer
|
|
|
|
override val target: PushTypes.Target = candidate.target
|
|
|
|
override val listId: Long = candidate.listId
|
|
|
|
lazy val apiList: Future[Option[ApiList]] = apiListStore.get(listId)
|
|
|
|
lazy val listName: Future[Option[String]] = apiList.map { apiListOpt =>
|
|
apiListOpt.map(_.name)
|
|
}
|
|
|
|
lazy val listOwnerId: Future[Option[Long]] = apiList.map { apiListOpt =>
|
|
apiListOpt.map(_.ownerId)
|
|
}
|
|
|
|
}
|
|
|
|
case class ListRecommendationPredicates(config: Config)
|
|
extends BasicRFPHPredicates[ListRecommendationPushCandidate] {
|
|
|
|
implicit val statsReceiver: StatsReceiver = config.statsReceiver.scope(getClass.getSimpleName)
|
|
|
|
override val predicates: List[NamedPredicate[ListRecommendationPushCandidate]] = List(
|
|
ListPredicates.listNameExistsPredicate(),
|
|
ListPredicates.listAuthorExistsPredicate(),
|
|
ListPredicates.listAuthorAcceptableToTargetUser(config.edgeStore),
|
|
ListPredicates.listAcceptablePredicate(),
|
|
ListPredicates.listSubscriberCountPredicate()
|
|
)
|
|
}
|