the-algorithm/product-mixer/component-library/src/main/scala/com/twitter/product_mixer/component_library/decorator/slice/SliceItemCandidateDecorator.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

42 lines
2.0 KiB
Scala

package com.twitter.product_mixer.component_library.decorator.slice
import com.twitter.product_mixer.component_library.model.candidate.CursorCandidate
import com.twitter.product_mixer.component_library.model.presentation.slice.SliceItemPresentation
import com.twitter.product_mixer.core.model.common.UniversalNoun
import com.twitter.product_mixer.core.model.common.identifier.DecoratorIdentifier
import com.twitter.product_mixer.core.model.marshalling.response.slice.CursorItem
import com.twitter.product_mixer.core.pipeline.PipelineQuery
import com.twitter.product_mixer.core.functional_component.decorator.CandidateDecorator
import com.twitter.product_mixer.core.functional_component.decorator.Decoration
import com.twitter.product_mixer.core.functional_component.decorator.slice.builder.CandidateSliceItemBuilder
import com.twitter.product_mixer.core.model.common.CandidateWithFeatures
import com.twitter.stitch.Stitch
/**
* Adds a [[Decoration]] for all `candidates` that are [[CursorCandidate]]s
*
* @note Only [[CursorCandidate]]s get decorated in [[SliceItemCandidateDecorator]]
* because the [[com.twitter.product_mixer.component_library.premarshaller.slice.SliceDomainMarshaller]]
* handles the undecorated non-[[CursorCandidate]] `candidates` directly.
*/
case class SliceItemCandidateDecorator[Query <: PipelineQuery, Candidate <: UniversalNoun[Any]](
cursorBuilder: CandidateSliceItemBuilder[Query, CursorCandidate, CursorItem],
override val identifier: DecoratorIdentifier = DecoratorIdentifier("SliceItemCandidate"))
extends CandidateDecorator[Query, Candidate] {
override def apply(
query: Query,
candidates: Seq[CandidateWithFeatures[Candidate]]
): Stitch[Seq[Decoration]] = {
val cursorPresentations = candidates.collect {
case CandidateWithFeatures(candidate: CursorCandidate, features) =>
val cursorItem = cursorBuilder(query, candidate, features)
val presentation = SliceItemPresentation(sliceItem = cursorItem)
Decoration(candidate, presentation)
}
Stitch.value(cursorPresentations)
}
}