the-algorithm/cr-mixer/server/src/main/scala/com/twitter/cr_mixer/source_signal/FrsSourceSignalFetcher.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

66 lines
2.0 KiB
Scala

package com.twitter.cr_mixer.source_signal
import com.twitter.cr_mixer.config.TimeoutConfig
import com.twitter.cr_mixer.model.ModuleNames
import com.twitter.cr_mixer.model.SourceInfo
import com.twitter.cr_mixer.param.FrsParams
import com.twitter.cr_mixer.param.GlobalParams
import com.twitter.cr_mixer.source_signal.FrsStore.FrsQueryResult
import com.twitter.cr_mixer.source_signal.SourceFetcher.FetcherQuery
import com.twitter.cr_mixer.thriftscala.SourceType
import com.twitter.finagle.stats.StatsReceiver
import com.twitter.simclusters_v2.common.UserId
import com.twitter.simclusters_v2.thriftscala.InternalId
import com.twitter.storehaus.ReadableStore
import com.twitter.util.Future
import javax.inject.Singleton
import javax.inject.Inject
import javax.inject.Named
@Singleton
case class FrsSourceSignalFetcher @Inject() (
@Named(ModuleNames.FrsStore) frsStore: ReadableStore[FrsStore.Query, Seq[FrsQueryResult]],
override val timeoutConfig: TimeoutConfig,
globalStats: StatsReceiver)
extends SourceSignalFetcher {
override protected val stats: StatsReceiver = globalStats.scope(identifier)
override type SignalConvertType = UserId
override def isEnabled(query: FetcherQuery): Boolean = {
query.params(FrsParams.EnableSourceParam)
}
override def fetchAndProcess(query: FetcherQuery): Future[Option[Seq[SourceInfo]]] = {
// Fetch raw signals
val rawSignals = frsStore
.get(FrsStore.Query(query.userId, query.params(GlobalParams.UnifiedMaxSourceKeyNum)))
.map {
_.map {
_.map {
_.userId
}
}
}
// Process signals
rawSignals.map {
_.map { frsUsers =>
convertSourceInfo(SourceType.FollowRecommendation, frsUsers)
}
}
}
override def convertSourceInfo(
sourceType: SourceType,
signals: Seq[SignalConvertType]
): Seq[SourceInfo] = {
signals.map { signal =>
SourceInfo(
sourceType = sourceType,
internalId = InternalId.UserId(signal),
sourceEventTime = None
)
}
}
}