the-algorithm/home-mixer/server/src/main/scala/com/twitter/home_mixer/model/ClearCacheIncludeInstruction.scala
2023-03-31 22:16:43 -04:00

44 lines
1.8 KiB
Scala

package com.twitter.home_mixer.model
import com.twitter.home_mixer.model.request.DeviceContext.RequestContext
import com.twitter.home_mixer.model.request.HasDeviceContext
import com.twitter.product_mixer.component_library.premarshaller.urt.builder.IncludeInstruction
import com.twitter.product_mixer.core.model.marshalling.response.urt.TimelineEntry
import com.twitter.product_mixer.core.model.marshalling.response.urt.TimelineModule
import com.twitter.product_mixer.core.model.marshalling.response.urt.item.tweet.TweetItem
import com.twitter.product_mixer.core.pipeline.PipelineQuery
import com.twitter.timelines.configapi.FSBoundedParam
import com.twitter.timelines.configapi.FSParam
/**
* Include a clear cache timeline instruction when we satisfy these criteria:
* - Request Provenance is "pull to refresh"
* - At least N non-ad tweet entries in the response
*
* This is to ensure that we have sufficient new content to justify jumping users to the
* top of the new timelines response and don't add unnecessary load to backend systems
*/
case class ClearCacheIncludeInstruction(
enableParam: FSParam[Boolean],
minEntriesParam: FSBoundedParam[Int])
extends IncludeInstruction[PipelineQuery with HasDeviceContext] {
override def apply(
query: PipelineQuery with HasDeviceContext,
entries: Seq[TimelineEntry]
): Boolean = {
val enabled = query.params(enableParam)
val ptr =
query.deviceContext.flatMap(_.requestContextValue).contains(RequestContext.PullToRefresh)
val minTweets = query.params(minEntriesParam) <= entries.collect {
case item: TweetItem if item.promotedMetadata.isEmpty => 1
case module: TimelineModule if module.items.head.item.isInstanceOf[TweetItem] =>
module.items.size
}.sum
enabled && ptr && minTweets
}
}