read/write crosstable/matchup from yoloDb

crosstable3
Thibault Duplessis 2021-09-18 15:09:15 +02:00
parent 62ffcb7710
commit 5671513c1e
2 changed files with 49 additions and 40 deletions

View File

@ -3,12 +3,13 @@ package lila.game
import org.joda.time.DateTime import org.joda.time.DateTime
import scala.concurrent.ExecutionContext import scala.concurrent.ExecutionContext
import lila.db.AsyncCollFailingSilently
import lila.db.dsl._ import lila.db.dsl._
import lila.user.User import lila.user.User
final class CrosstableApi( final class CrosstableApi(
coll: Coll, coll: AsyncCollFailingSilently,
matchupColl: Coll, matchupColl: AsyncCollFailingSilently,
enabled: () => Boolean enabled: () => Boolean
)(implicit ec: ExecutionContext) { )(implicit ec: ExecutionContext) {
@ -29,7 +30,7 @@ final class CrosstableApi(
justFetch(u1, u2) dmap { _ | Crosstable.empty(u1, u2) } justFetch(u1, u2) dmap { _ | Crosstable.empty(u1, u2) }
def justFetch(u1: User.ID, u2: User.ID): Fu[Option[Crosstable]] = enabled() ?? def justFetch(u1: User.ID, u2: User.ID): Fu[Option[Crosstable]] = enabled() ??
coll.one[Crosstable](select(u1, u2)) coll(_.one[Crosstable](select(u1, u2)))
def withMatchup(u1: User.ID, u2: User.ID): Fu[Crosstable.WithMatchup] = def withMatchup(u1: User.ID, u2: User.ID): Fu[Crosstable.WithMatchup] =
apply(u1, u2) zip getMatchup(u1, u2) dmap { case (crosstable, matchup) => apply(u1, u2) zip getMatchup(u1, u2) dmap { case (crosstable, matchup) =>
@ -37,17 +38,18 @@ final class CrosstableApi(
} }
def nbGames(u1: User.ID, u2: User.ID): Fu[Int] = enabled() ?? def nbGames(u1: User.ID, u2: User.ID): Fu[Int] = enabled() ??
coll coll {
.find( _.find(
select(u1, u2), select(u1, u2),
$doc("s1" -> true, "s2" -> true).some $doc("s1" -> true, "s2" -> true).some
) )
.one[Bdoc] dmap { res => .one[Bdoc] dmap { res =>
~(for { ~(for {
o <- res o <- res
s1 <- o.int("s1") s1 <- o.int("s1")
s2 <- o.int("s2") s2 <- o.int("s2")
} yield (s1 + s2) / 10) } yield (s1 + s2) / 10)
}
} }
def add(game: Game): Funit = def add(game: Game): Funit =
@ -63,32 +65,37 @@ final class CrosstableApi(
} }
val inc1 = incScore(u1) val inc1 = incScore(u1)
val inc2 = incScore(u2) val inc2 = incScore(u2)
val updateCrosstable = enabled() ?? coll.update val updateCrosstable = enabled() ?? coll {
.one( _.update
select(u1, u2), .one(
$inc( select(u1, u2),
F.score1 -> inc1, $inc(
F.score2 -> inc2 F.score1 -> inc1,
) ++ $push( F.score2 -> inc2
Crosstable.BSONFields.results -> $doc( ) ++ $push(
"$each" -> List(bsonResult), Crosstable.BSONFields.results -> $doc(
"$slice" -> -Crosstable.maxGames "$each" -> List(bsonResult),
) "$slice" -> -Crosstable.maxGames
), )
upsert = true ),
) upsert = true
.void )
val updateMatchup = .void
matchupColl.update.one( }
select(u1, u2), val updateMatchup = matchupColl {
$inc( _.update
F.score1 -> inc1, .one(
F.score2 -> inc2 select(u1, u2),
) ++ $set( $inc(
F.lastPlayed -> DateTime.now F.score1 -> inc1,
), F.score2 -> inc2
upsert = true ) ++ $set(
) F.lastPlayed -> DateTime.now
),
upsert = true
)
.void
}
updateCrosstable zip updateMatchup void updateCrosstable zip updateMatchup void
case _ => funit case _ => funit
} }
@ -96,7 +103,7 @@ final class CrosstableApi(
private val matchupProjection = $doc(F.lastPlayed -> false) private val matchupProjection = $doc(F.lastPlayed -> false)
def getMatchup(u1: User.ID, u2: User.ID): Fu[Option[Matchup]] = def getMatchup(u1: User.ID, u2: User.ID): Fu[Option[Matchup]] =
matchupColl.find(select(u1, u2), matchupProjection.some).one[Matchup] matchupColl(_.find(select(u1, u2), matchupProjection.some).one[Matchup])
private def select(u1: User.ID, u2: User.ID) = private def select(u1: User.ID, u2: User.ID) =
$id(Crosstable.makeKey(u1, u2)) $id(Crosstable.makeKey(u1, u2))

View File

@ -2,6 +2,7 @@ package lila.game
import akka.actor._ import akka.actor._
import com.softwaremill.macwire._ import com.softwaremill.macwire._
import com.softwaremill.tagging._
import io.methvin.play.autoconfig._ import io.methvin.play.autoconfig._
import play.api.Configuration import play.api.Configuration
import play.api.libs.ws.StandaloneWSClient import play.api.libs.ws.StandaloneWSClient
@ -23,6 +24,7 @@ final class Env(
appConfig: Configuration, appConfig: Configuration,
ws: StandaloneWSClient, ws: StandaloneWSClient,
db: lila.db.Db, db: lila.db.Db,
yoloDb: lila.db.AsyncDb @@ lila.db.YoloDb,
baseUrl: BaseUrl, baseUrl: BaseUrl,
userRepo: lila.user.UserRepo, userRepo: lila.user.UserRepo,
mongoCache: lila.memo.MongoCache.Api, mongoCache: lila.memo.MongoCache.Api,
@ -60,8 +62,8 @@ final class Env(
) )
lazy val crosstableApi = new CrosstableApi( lazy val crosstableApi = new CrosstableApi(
coll = db(config.crosstableColl), coll = yoloDb(config.crosstableColl).failingSilently(),
matchupColl = db(config.matchupColl), matchupColl = yoloDb(config.matchupColl).failingSilently(),
enabled = crosstableEnable.get _ enabled = crosstableEnable.get _
) )