mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-02 17:28:45 +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.
163 lines
6.3 KiB
Scala
163 lines
6.3 KiB
Scala
package com.twitter.frigate.pushservice.adaptor
|
|
|
|
import com.twitter.content_mixer.thriftscala.ContentMixerRequest
|
|
import com.twitter.content_mixer.thriftscala.ContentMixerResponse
|
|
import com.twitter.explore_ranker.thriftscala.ExploreRankerRequest
|
|
import com.twitter.explore_ranker.thriftscala.ExploreRankerResponse
|
|
import com.twitter.finagle.stats.StatsReceiver
|
|
import com.twitter.frigate.common.base._
|
|
import com.twitter.frigate.common.candidate._
|
|
import com.twitter.frigate.common.store.RecentTweetsQuery
|
|
import com.twitter.frigate.common.store.interests.InterestsLookupRequestWithContext
|
|
import com.twitter.frigate.pushservice.model.PushTypes.RawCandidate
|
|
import com.twitter.frigate.pushservice.model.PushTypes.Target
|
|
import com.twitter.frigate.pushservice.params.PushFeatureSwitchParams
|
|
import com.twitter.frigate.pushservice.store._
|
|
import com.twitter.geoduck.common.thriftscala.Location
|
|
import com.twitter.geoduck.service.thriftscala.LocationResponse
|
|
import com.twitter.hermit.pop_geo.thriftscala.PopTweetsInPlace
|
|
import com.twitter.hermit.predicate.socialgraph.RelationEdge
|
|
import com.twitter.hermit.store.tweetypie.UserTweet
|
|
import com.twitter.interests.thriftscala.UserInterests
|
|
import com.twitter.interests_discovery.thriftscala.NonPersonalizedRecommendedLists
|
|
import com.twitter.interests_discovery.thriftscala.RecommendedListsRequest
|
|
import com.twitter.interests_discovery.thriftscala.RecommendedListsResponse
|
|
import com.twitter.recommendation.interests.discovery.core.model.InterestDomain
|
|
import com.twitter.stitch.tweetypie.TweetyPie.TweetyPieResult
|
|
import com.twitter.storehaus.ReadableStore
|
|
import com.twitter.trends.trip_v1.trip_tweets.thriftscala.TripDomain
|
|
import com.twitter.trends.trip_v1.trip_tweets.thriftscala.TripTweets
|
|
import com.twitter.tsp.thriftscala.TopicSocialProofRequest
|
|
import com.twitter.tsp.thriftscala.TopicSocialProofResponse
|
|
|
|
/**
|
|
* PushCandidateSourceGenerator generates candidate source list for a given Target user
|
|
*/
|
|
class PushCandidateSourceGenerator(
|
|
earlybirdCandidates: CandidateSource[EarlybirdCandidateSource.Query, EarlybirdCandidate],
|
|
userTweetEntityGraphCandidates: CandidateSource[UserTweetEntityGraphCandidates.Target, Candidate],
|
|
cachedTweetyPieStoreV2: ReadableStore[Long, TweetyPieResult],
|
|
safeCachedTweetyPieStoreV2: ReadableStore[Long, TweetyPieResult],
|
|
userTweetTweetyPieStore: ReadableStore[UserTweet, TweetyPieResult],
|
|
safeUserTweetTweetyPieStore: ReadableStore[UserTweet, TweetyPieResult],
|
|
cachedTweetyPieStoreV2NoVF: ReadableStore[Long, TweetyPieResult],
|
|
edgeStore: ReadableStore[RelationEdge, Boolean],
|
|
interestsLookupStore: ReadableStore[InterestsLookupRequestWithContext, UserInterests],
|
|
uttEntityHydrationStore: UttEntityHydrationStore,
|
|
geoDuckV2Store: ReadableStore[Long, LocationResponse],
|
|
topTweetsByGeoStore: ReadableStore[InterestDomain[String], Map[String, List[(Long, Double)]]],
|
|
topTweetsByGeoV2VersionedStore: ReadableStore[String, PopTweetsInPlace],
|
|
tweetImpressionsStore: TweetImpressionsStore,
|
|
recommendedTrendsCandidateSource: RecommendedTrendsCandidateSource,
|
|
recentTweetsByAuthorStore: ReadableStore[RecentTweetsQuery, Seq[Seq[Long]]],
|
|
topicSocialProofServiceStore: ReadableStore[TopicSocialProofRequest, TopicSocialProofResponse],
|
|
crMixerStore: CrMixerTweetStore,
|
|
contentMixerStore: ReadableStore[ContentMixerRequest, ContentMixerResponse],
|
|
exploreRankerStore: ReadableStore[ExploreRankerRequest, ExploreRankerResponse],
|
|
softUserLocationStore: ReadableStore[Long, Location],
|
|
tripTweetCandidateStore: ReadableStore[TripDomain, TripTweets],
|
|
listRecsStore: ReadableStore[String, NonPersonalizedRecommendedLists],
|
|
idsStore: ReadableStore[RecommendedListsRequest, RecommendedListsResponse]
|
|
)(
|
|
implicit val globalStats: StatsReceiver) {
|
|
|
|
private val earlyBirdFirstDegreeCandidateAdaptor = EarlyBirdFirstDegreeCandidateAdaptor(
|
|
earlybirdCandidates,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
userTweetTweetyPieStore,
|
|
PushFeatureSwitchParams.NumberOfMaxEarlybirdInNetworkCandidatesParam,
|
|
globalStats
|
|
)
|
|
|
|
private val frsTweetCandidateAdaptor = FRSTweetCandidateAdaptor(
|
|
crMixerStore,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
userTweetTweetyPieStore,
|
|
uttEntityHydrationStore,
|
|
topicSocialProofServiceStore,
|
|
globalStats
|
|
)
|
|
|
|
private val contentRecommenderMixerAdaptor = ContentRecommenderMixerAdaptor(
|
|
crMixerStore,
|
|
safeCachedTweetyPieStoreV2,
|
|
edgeStore,
|
|
topicSocialProofServiceStore,
|
|
uttEntityHydrationStore,
|
|
globalStats
|
|
)
|
|
|
|
private val tripGeoCandidatesAdaptor = TripGeoCandidatesAdaptor(
|
|
tripTweetCandidateStore,
|
|
contentMixerStore,
|
|
safeCachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
globalStats
|
|
)
|
|
|
|
val sources: Seq[
|
|
CandidateSource[Target, RawCandidate] with CandidateSourceEligible[
|
|
Target,
|
|
RawCandidate
|
|
]
|
|
] = {
|
|
Seq(
|
|
earlyBirdFirstDegreeCandidateAdaptor,
|
|
GenericCandidateAdaptor(
|
|
userTweetEntityGraphCandidates,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
globalStats.scope("UserTweetEntityGraphCandidates")
|
|
),
|
|
new OnboardingPushCandidateAdaptor(globalStats),
|
|
TopTweetsByGeoAdaptor(
|
|
geoDuckV2Store,
|
|
softUserLocationStore,
|
|
topTweetsByGeoStore,
|
|
topTweetsByGeoV2VersionedStore,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
globalStats
|
|
),
|
|
frsTweetCandidateAdaptor,
|
|
TopTweetImpressionsCandidateAdaptor(
|
|
recentTweetsByAuthorStore,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
tweetImpressionsStore,
|
|
globalStats
|
|
),
|
|
TrendsCandidatesAdaptor(
|
|
softUserLocationStore,
|
|
recommendedTrendsCandidateSource,
|
|
safeCachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
safeUserTweetTweetyPieStore,
|
|
globalStats
|
|
),
|
|
contentRecommenderMixerAdaptor,
|
|
tripGeoCandidatesAdaptor,
|
|
HighQualityTweetsAdaptor(
|
|
tripTweetCandidateStore,
|
|
interestsLookupStore,
|
|
cachedTweetyPieStoreV2,
|
|
cachedTweetyPieStoreV2NoVF,
|
|
globalStats
|
|
),
|
|
ExploreVideoTweetCandidateAdaptor(
|
|
exploreRankerStore,
|
|
cachedTweetyPieStoreV2,
|
|
globalStats
|
|
),
|
|
ListsToRecommendCandidateAdaptor(
|
|
listRecsStore,
|
|
geoDuckV2Store,
|
|
idsStore,
|
|
globalStats
|
|
)
|
|
)
|
|
}
|
|
}
|