the-algorithm/timelineranker/server/src/main/scala/com/twitter/timelineranker/common/CandidateGenerationTransform.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

41 lines
1.6 KiB
Scala

package com.twitter.timelineranker.common
import com.twitter.finagle.stats.StatsReceiver
import com.twitter.servo.util.FutureArrow
import com.twitter.timelineranker.core.HydratedCandidatesAndFeaturesEnvelope
import com.twitter.timelineranker.model.CandidateTweet
import com.twitter.timelineranker.model.CandidateTweetsResult
import com.twitter.util.Future
class CandidateGenerationTransform(statsReceiver: StatsReceiver)
extends FutureArrow[HydratedCandidatesAndFeaturesEnvelope, CandidateTweetsResult] {
private[this] val numCandidateTweetsStat = statsReceiver.stat("numCandidateTweets")
private[this] val numSourceTweetsStat = statsReceiver.stat("numSourceTweets")
override def apply(
candidatesAndFeaturesEnvelope: HydratedCandidatesAndFeaturesEnvelope
): Future[CandidateTweetsResult] = {
val hydratedTweets = candidatesAndFeaturesEnvelope.candidateEnvelope.hydratedTweets.outerTweets
if (hydratedTweets.nonEmpty) {
val candidates = hydratedTweets.map { hydratedTweet =>
CandidateTweet(hydratedTweet, candidatesAndFeaturesEnvelope.features(hydratedTweet.tweetId))
}
numCandidateTweetsStat.add(candidates.size)
val sourceTweets =
candidatesAndFeaturesEnvelope.candidateEnvelope.sourceHydratedTweets.outerTweets.map {
hydratedTweet =>
CandidateTweet(
hydratedTweet,
candidatesAndFeaturesEnvelope.features(hydratedTweet.tweetId))
}
numSourceTweetsStat.add(sourceTweets.size)
Future.value(CandidateTweetsResult(candidates, sourceTweets))
} else {
Future.value(CandidateTweetsResult.Empty)
}
}
}