the-algorithm/cr-mixer/server/src/main/scala/com/twitter/cr_mixer/source_signal/SourceInfoRouter.scala
twitter-team ef4c5eb65e Twitter Recommendation Algorithm
Please note we have force-pushed a new initial commit in order to remove some publicly-available Twitter user information. Note that this process may be required in the future.
2023-03-31 17:36:31 -05:00

69 lines
2.2 KiB
Scala

package com.twitter.cr_mixer.source_signal
import com.twitter.core_workflows.user_model.thriftscala.UserState
import com.twitter.cr_mixer.model.GraphSourceInfo
import com.twitter.cr_mixer.model.SourceInfo
import com.twitter.cr_mixer.source_signal.SourceFetcher.FetcherQuery
import com.twitter.cr_mixer.thriftscala.SourceType
import com.twitter.cr_mixer.thriftscala.{Product => TProduct}
import com.twitter.simclusters_v2.common.UserId
import com.twitter.timelines.configapi
import com.twitter.util.Future
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
case class SourceInfoRouter @Inject() (
ussSourceSignalFetcher: UssSourceSignalFetcher,
frsSourceSignalFetcher: FrsSourceSignalFetcher,
frsSourceGraphFetcher: FrsSourceGraphFetcher,
realGraphOonSourceGraphFetcher: RealGraphOonSourceGraphFetcher,
realGraphInSourceGraphFetcher: RealGraphInSourceGraphFetcher,
) {
def get(
userId: UserId,
product: TProduct,
userState: UserState,
params: configapi.Params
): Future[(Set[SourceInfo], Map[String, Option[GraphSourceInfo]])] = {
val fetcherQuery = FetcherQuery(userId, product, userState, params)
Future.join(
getSourceSignals(fetcherQuery),
getSourceGraphs(fetcherQuery)
)
}
private def getSourceSignals(
fetcherQuery: FetcherQuery
): Future[Set[SourceInfo]] = {
Future
.join(
ussSourceSignalFetcher.get(fetcherQuery),
frsSourceSignalFetcher.get(fetcherQuery)).map {
case (ussSignalsOpt, frsSignalsOpt) =>
(ussSignalsOpt.getOrElse(Seq.empty) ++ frsSignalsOpt.getOrElse(Seq.empty)).toSet
}
}
private def getSourceGraphs(
fetcherQuery: FetcherQuery
): Future[Map[String, Option[GraphSourceInfo]]] = {
Future
.join(
frsSourceGraphFetcher.get(fetcherQuery),
realGraphOonSourceGraphFetcher.get(fetcherQuery),
realGraphInSourceGraphFetcher.get(fetcherQuery)
).map {
case (frsGraphOpt, realGraphOonGraphOpt, realGraphInGraphOpt) =>
Map(
SourceType.FollowRecommendation.name -> frsGraphOpt,
SourceType.RealGraphOon.name -> realGraphOonGraphOpt,
SourceType.RealGraphIn.name -> realGraphInGraphOpt,
)
}
}
}