the-algorithm/pushservice/src/main/scala/com/twitter/frigate/pushservice/model/ListRecommendationPushCandidate.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

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