61 lines
1.7 KiB
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))
|
|
}
|
|
}
|