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

45 lines
1.8 KiB
Scala

package com.twitter.home_mixer.functional_component.candidate_source
import com.twitter.product_mixer.core.feature.FeatureWithDefaultOnFailure
import com.twitter.product_mixer.core.feature.featuremap.FeatureMapBuilder
import com.twitter.product_mixer.core.functional_component.candidate_source.CandidateSourceWithExtractedFeatures
import com.twitter.product_mixer.core.functional_component.candidate_source.CandidatesWithSourceFeatures
import com.twitter.product_mixer.core.model.common.identifier.CandidateSourceIdentifier
import com.twitter.search.earlybird.{thriftscala => t}
import com.twitter.stitch.Stitch
import javax.inject.Inject
import javax.inject.Singleton
case object EarlybirdResponseTruncatedFeature
extends FeatureWithDefaultOnFailure[t.EarlybirdRequest, Boolean] {
override val defaultValue: Boolean = false
}
case object EarlybirdBottomTweetFeature
extends FeatureWithDefaultOnFailure[t.EarlybirdRequest, Option[Long]] {
override val defaultValue: Option[Long] = None
}
@Singleton
case class EarlybirdCandidateSource @Inject() (
earlybird: t.EarlybirdService.MethodPerEndpoint)
extends CandidateSourceWithExtractedFeatures[t.EarlybirdRequest, t.ThriftSearchResult] {
override val identifier = CandidateSourceIdentifier("Earlybird")
override def apply(
request: t.EarlybirdRequest
): Stitch[CandidatesWithSourceFeatures[t.ThriftSearchResult]] = {
Stitch.callFuture(earlybird.search(request)).map { response =>
val candidates = response.searchResults.map(_.results).getOrElse(Seq.empty)
val features = FeatureMapBuilder()
.add(EarlybirdResponseTruncatedFeature, candidates.size == request.searchQuery.numResults)
.add(EarlybirdBottomTweetFeature, candidates.lastOption.map(_.id))
.build()
CandidatesWithSourceFeatures(candidates, features)
}
}
}