in cr-mixer/server/src/main/scala/com/twitter/cr_mixer/source_signal/UssSourceSignalFetcher.scala [34:122]
override def isEnabled(query: FetcherQuery): Boolean = true
override def fetchAndProcess(
query: FetcherQuery,
): Future[Option[Seq[SourceInfo]]] = {
// Fetch raw signals
val rawSignals = ussStore.get(UssStore.Query(query.userId, query.params, query.product)).map {
_.map {
_.map {
case (signalType, signals) =>
trackUssSignalStatsPerSignalType(query, signalType, signals)
(signalType, signals)
}
}
}
/**
* Process signals:
* Transform a Seq of USS Signals with signalType specified to a Seq of SourceInfo
* We do case match to make sure the SignalType can correctly map to a SourceType defined in CrMixer
* and it should be simplified.
*/
rawSignals.map {
_.map { nestedSignal =>
val sourceInfoList = nestedSignal.flatMap {
case (signalType, ussSignals) =>
signalType match {
case SignalType.TweetFavorite =>
convertSourceInfo(sourceType = SourceType.TweetFavorite, signals = ussSignals)
case SignalType.Retweet =>
convertSourceInfo(sourceType = SourceType.Retweet, signals = ussSignals)
case SignalType.Reply =>
convertSourceInfo(sourceType = SourceType.Reply, signals = ussSignals)
case SignalType.OriginalTweet =>
convertSourceInfo(sourceType = SourceType.OriginalTweet, signals = ussSignals)
case SignalType.AccountFollow =>
convertSourceInfo(sourceType = SourceType.UserFollow, signals = ussSignals)
case SignalType.RepeatedProfileVisit180dMinVisit6V1 |
SignalType.RepeatedProfileVisit90dMinVisit6V1 |
SignalType.RepeatedProfileVisit14dMinVisit2V1 =>
convertSourceInfo(
sourceType = SourceType.UserRepeatedProfileVisit,
signals = ussSignals)
case SignalType.NotificationOpenAndClickV1 =>
convertSourceInfo(sourceType = SourceType.NotificationClick, signals = ussSignals)
case SignalType.TweetShareV1 =>
convertSourceInfo(sourceType = SourceType.TweetShare, signals = ussSignals)
case SignalType.RealGraphOon =>
convertSourceInfo(sourceType = SourceType.RealGraphOon, signals = ussSignals)
case SignalType.GoodTweetClick | SignalType.GoodTweetClick5s |
SignalType.GoodTweetClick10s | SignalType.GoodTweetClick30s =>
convertSourceInfo(sourceType = SourceType.GoodTweetClick, signals = ussSignals)
case SignalType.VideoView90dPlayback50V1 =>
convertSourceInfo(
sourceType = SourceType.VideoTweetPlayback50,
signals = ussSignals)
case SignalType.VideoView90dQualityV1 =>
convertSourceInfo(
sourceType = SourceType.VideoTweetQualityView,
signals = ussSignals)
case SignalType.GoodProfileClick | SignalType.GoodProfileClick20s |
SignalType.GoodProfileClick30s =>
convertSourceInfo(sourceType = SourceType.GoodProfileClick, signals = ussSignals)
// negative signals
case SignalType.AccountBlock =>
convertSourceInfo(sourceType = SourceType.AccountBlock, signals = ussSignals)
case SignalType.AccountMute =>
convertSourceInfo(sourceType = SourceType.AccountMute, signals = ussSignals)
case SignalType.TweetReport =>
convertSourceInfo(sourceType = SourceType.TweetReport, signals = ussSignals)
case SignalType.TweetDontLike =>
convertSourceInfo(sourceType = SourceType.TweetDontLike, signals = ussSignals)
// Aggregated Signals
case SignalType.TweetBasedUnifiedEngagementWeightedSignal |
SignalType.TweetBasedUnifiedUniformSignal =>
convertSourceInfo(sourceType = SourceType.TweetAggregation, signals = ussSignals)
case SignalType.ProducerBasedUnifiedEngagementWeightedSignal |
SignalType.ProducerBasedUnifiedUniformSignal =>
convertSourceInfo(sourceType = SourceType.ProducerAggregation, signals = ussSignals)
// Default
case _ =>
Seq.empty[SourceInfo]
}
}
sourceInfoList
}
}
}