mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-30 06:56:08 +02:00
64 lines
2.6 KiB
Scala
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)
|
||
|
)
|
||
|
}
|