the-algorithm/home-mixer/server/src/main/scala/com/twitter/home_mixer/functional_component/feature_hydrator/TimelineServiceTweetsQueryFeatureHydrator.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

64 lines
2.6 KiB
Scala

package com.twitter.home_mixer.functional_component.feature_hydrator
import com.twitter.home_mixer.marshaller.timelines.DeviceContextMarshaller
import com.twitter.home_mixer.model.request.DeviceContext
import com.twitter.home_mixer.model.request.HasDeviceContext
import com.twitter.home_mixer.service.HomeMixerAlertConfig
import com.twitter.product_mixer.core.feature.Feature
import com.twitter.product_mixer.core.feature.featuremap.FeatureMap
import com.twitter.product_mixer.core.feature.featuremap.FeatureMapBuilder
import com.twitter.product_mixer.core.functional_component.feature_hydrator.QueryFeatureHydrator
import com.twitter.product_mixer.core.model.common.identifier.FeatureHydratorIdentifier
import com.twitter.product_mixer.core.pipeline.PipelineQuery
import com.twitter.stitch.Stitch
import com.twitter.stitch.timelineservice.TimelineService
import com.twitter.timelineservice.{thriftscala => t}
import javax.inject.Inject
import javax.inject.Singleton
object TimelineServiceTweetsFeature extends Feature[PipelineQuery, Seq[Long]]
@Singleton
case class TimelineServiceTweetsQueryFeatureHydrator @Inject() (
timelineService: TimelineService,
deviceContextMarshaller: DeviceContextMarshaller)
extends QueryFeatureHydrator[PipelineQuery with HasDeviceContext] {
override val identifier: FeatureHydratorIdentifier =
FeatureHydratorIdentifier("TimelineServiceTweets")
override val features: Set[Feature[_, _]] = Set(TimelineServiceTweetsFeature)
private val MaxTimelineServiceTweets = 200
override def hydrate(query: PipelineQuery with HasDeviceContext): Stitch[FeatureMap] = {
val deviceContext = query.deviceContext.getOrElse(DeviceContext.Empty)
val timelineQueryOptions = t.TimelineQueryOptions(
contextualUserId = query.clientContext.userId,
deviceContext = Some(deviceContextMarshaller(deviceContext, query.clientContext))
)
val timelineServiceQuery = t.TimelineQuery(
timelineType = t.TimelineType.Home,
timelineId = query.getRequiredUserId,
maxCount = MaxTimelineServiceTweets.toShort,
cursor2 = None,
options = Some(timelineQueryOptions),
timelineId2 = query.clientContext.userId.map(t.TimelineId(t.TimelineType.Home, _, None)),
)
timelineService.getTimeline(timelineServiceQuery).map { timeline =>
val tweets = timeline.entries.collect {
case t.TimelineEntry.Tweet(tweet) => tweet.statusId
}
FeatureMapBuilder().add(TimelineServiceTweetsFeature, tweets).build()
}
}
override val alerts = Seq(
HomeMixerAlertConfig.BusinessHours.defaultSuccessRateAlert(99.7)
)
}