mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-02 17:28:45 +02:00
75 lines
3.2 KiB
Scala
75 lines
3.2 KiB
Scala
|
package com.twitter.home_mixer.functional_component.feature_hydrator
|
||
|
|
||
|
import com.twitter.home_mixer.model.HomeFeatures.AuthorIdFeature
|
||
|
import com.twitter.home_mixer.model.HomeFeatures.DirectedAtUserIdFeature
|
||
|
import com.twitter.home_mixer.model.HomeFeatures.MentionUserIdFeature
|
||
|
import com.twitter.home_mixer.model.HomeFeatures.SourceUserIdFeature
|
||
|
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.Feature
|
||
|
import com.twitter.product_mixer.core.feature.FeatureWithDefaultOnFailure
|
||
|
import com.twitter.product_mixer.core.feature.datarecord.DataRecordInAFeature
|
||
|
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.CandidateFeatureHydrator
|
||
|
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.timelines.prediction.adapters.real_graph.RealGraphEdgeFeaturesCombineAdapter
|
||
|
import com.twitter.timelines.real_graph.v1.{thriftscala => v1}
|
||
|
import javax.inject.Inject
|
||
|
import javax.inject.Singleton
|
||
|
import scala.collection.JavaConverters._
|
||
|
|
||
|
object RealGraphViewerRelatedUsersDataRecordFeature
|
||
|
extends DataRecordInAFeature[TweetCandidate]
|
||
|
with FeatureWithDefaultOnFailure[TweetCandidate, DataRecord] {
|
||
|
override def defaultValue: DataRecord = new DataRecord()
|
||
|
}
|
||
|
|
||
|
@Singleton
|
||
|
class RealGraphViewerRelatedUsersFeatureHydrator @Inject() ()
|
||
|
extends CandidateFeatureHydrator[PipelineQuery, TweetCandidate] {
|
||
|
|
||
|
override val identifier: FeatureHydratorIdentifier =
|
||
|
FeatureHydratorIdentifier("RealGraphViewerRelatedUsers")
|
||
|
|
||
|
override val features: Set[Feature[_, _]] = Set(RealGraphViewerRelatedUsersDataRecordFeature)
|
||
|
|
||
|
private val RealGraphEdgeFeaturesCombineAdapter = new RealGraphEdgeFeaturesCombineAdapter
|
||
|
|
||
|
override def apply(
|
||
|
query: PipelineQuery,
|
||
|
candidate: TweetCandidate,
|
||
|
existingFeatures: FeatureMap
|
||
|
): Stitch[FeatureMap] = {
|
||
|
val realGraphQueryFeatures = query.features
|
||
|
.flatMap(_.getOrElse(RealGraphFeatures, None))
|
||
|
.getOrElse(Map.empty[Long, v1.RealGraphEdgeFeatures])
|
||
|
|
||
|
val allRelatedUserIds = getRelatedUserIds(existingFeatures)
|
||
|
val realGraphFeatures =
|
||
|
RealGraphViewerAuthorFeatureHydrator.getCombinedRealGraphFeatures(
|
||
|
allRelatedUserIds,
|
||
|
realGraphQueryFeatures)
|
||
|
val realGraphFeaturesDataRecord = RealGraphEdgeFeaturesCombineAdapter
|
||
|
.adaptToDataRecords(Some(realGraphFeatures)).asScala.headOption
|
||
|
.getOrElse(new DataRecord)
|
||
|
|
||
|
Stitch.value {
|
||
|
FeatureMapBuilder()
|
||
|
.add(RealGraphViewerRelatedUsersDataRecordFeature, realGraphFeaturesDataRecord)
|
||
|
.build()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private def getRelatedUserIds(features: FeatureMap): Seq[Long] = {
|
||
|
(CandidatesUtil.getEngagerUserIds(features) ++
|
||
|
features.getOrElse(AuthorIdFeature, None) ++
|
||
|
features.getOrElse(MentionUserIdFeature, Seq.empty) ++
|
||
|
features.getOrElse(SourceUserIdFeature, None) ++
|
||
|
features.getOrElse(DirectedAtUserIdFeature, None)).distinct
|
||
|
}
|
||
|
}
|