lila/modules/swiss/src/main/SwissCache.scala

61 lines
1.7 KiB
Scala

package lila.swiss
import cats.implicits._
import org.joda.time.DateTime
import scala.concurrent.duration._
import lila.db.dsl._
import lila.hub.LightTeam.TeamID
import lila.memo._
final private class SwissCache(
colls: SwissColls,
cacheApi: CacheApi
)(implicit ec: scala.concurrent.ExecutionContext) {
import BsonHandlers._
val name = cacheApi.sync[Swiss.Id, Option[String]](
name = "swiss.name",
initialCapacity = 4096,
compute = id => colls.swiss.primitiveOne[String]($id(id), "name"),
default = _ => none,
strategy = Syncache.WaitAfterUptime(20 millis),
expireAfter = Syncache.ExpireAfterAccess(20 minutes)
)
val roundInfo = cacheApi[Swiss.Id, Option[Swiss.RoundInfo]](32, "swiss.roundInfo") {
_.expireAfterWrite(1 minute)
.buildAsyncFuture { id =>
colls.swiss.byId[Swiss](id.value).map2(_.roundInfo)
}
}
private[swiss] object featuredInTeam {
private val compute = (teamId: TeamID) => {
val max = 5
for {
enterable <- colls.swiss.primitive[Swiss.Id](
$doc("teamId" -> teamId, "finishedAt" $exists false),
$sort asc "startsAt",
nb = max,
"_id"
)
finished <- colls.swiss.primitive[Swiss.Id](
$doc("teamId" -> teamId, "finishedAt" $exists true),
$sort desc "startsAt",
nb = max - enterable.size,
"_id"
)
} yield enterable ::: finished
}
private val cache = cacheApi[TeamID, List[Swiss.Id]](256, "swiss.visibleByTeam") {
_.expireAfterAccess(30 minutes)
.buildAsyncFuture(compute)
}
def get(teamId: TeamID) = cache get teamId
def invalidate(teamId: TeamID) = cache.put(teamId, compute(teamId))
}
}