the-algorithm/home-mixer/server/src/main/scala/com/twitter/home_mixer/product/scored_tweets/feature_hydrator/real_time_aggregates/TweetEngagementRealTimeAggregateFeatureHydrator.scala

62 lines
2.8 KiB
Scala

package com.twitter.home_mixer.product.scored_tweets.feature_hydrator.real_time_aggregates
import com.google.inject.name.Named
import com.twitter.finagle.stats.StatsReceiver
import com.twitter.home_mixer.param.HomeMixerInjectionNames.TweetEngagementCache
import com.twitter.home_mixer.util.CandidatesUtil
import com.twitter.ml.api.DataRecord
import com.twitter.product_mixer.component_library.model.candidate.TweetCandidate
import com.twitter.product_mixer.core.feature.FeatureWithDefaultOnFailure
import com.twitter.product_mixer.core.feature.datarecord.DataRecordInAFeature
import com.twitter.product_mixer.core.model.common.CandidateWithFeatures
import com.twitter.product_mixer.core.model.common.identifier.FeatureHydratorIdentifier
import com.twitter.product_mixer.core.pipeline.PipelineQuery
import com.twitter.servo.cache.ReadCache
import com.twitter.timelines.data_processing.ml_util.aggregation_framework.AggregateGroup
import com.twitter.timelines.prediction.common.aggregates.real_time.TimelinesOnlineAggregationFeaturesOnlyConfig._
import javax.inject.Inject
import javax.inject.Singleton
object TweetEngagementRealTimeAggregateFeature
extends DataRecordInAFeature[TweetCandidate]
with FeatureWithDefaultOnFailure[TweetCandidate, DataRecord] {
override def defaultValue: DataRecord = new DataRecord()
}
@Singleton
class TweetEngagementRealTimeAggregateFeatureHydrator @Inject() (
@Named(TweetEngagementCache) override val client: ReadCache[Long, DataRecord],
override val statsReceiver: StatsReceiver)
extends BaseRealTimeAggregateBulkCandidateFeatureHydrator[Long] {
override val identifier: FeatureHydratorIdentifier =
FeatureHydratorIdentifier("TweetEngagementRealTimeAggregate")
override val outputFeature: DataRecordInAFeature[TweetCandidate] =
TweetEngagementRealTimeAggregateFeature
override val aggregateGroups: Seq[AggregateGroup] = Seq(
tweetEngagement30MinuteCountsProd,
tweetEngagementTotalCountsProd,
tweetEngagementUserStateRealTimeAggregatesProd,
tweetNegativeEngagementUserStateRealTimeAggregates,
tweetNegativeEngagement6HourCounts,
tweetNegativeEngagementTotalCounts,
tweetShareEngagementsRealTimeAggregates,
tweetBCEDwellEngagementsRealTimeAggregates
)
override val aggregateGroupToPrefix: Map[AggregateGroup, String] = Map(
tweetShareEngagementsRealTimeAggregates -> "original_tweet.timelines.tweet_share_engagements_real_time_aggregates.",
tweetBCEDwellEngagementsRealTimeAggregates -> "original_tweet.timelines.tweet_bce_dwell_engagements_real_time_aggregates."
)
override def keysFromQueryAndCandidates(
query: PipelineQuery,
candidates: Seq[CandidateWithFeatures[TweetCandidate]]
): Seq[Option[Long]] = {
candidates
.map(candidate => Some(CandidatesUtil.getOriginalTweetId(candidate)))
}
}