mirror of
https://github.com/twitter/the-algorithm.git
synced 2024-06-02 17:28:45 +02:00
44 lines
1.8 KiB
Scala
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
|
|
}
|
|
}
|