read/write crosstable/matchup from yoloDb
parent
62ffcb7710
commit
5671513c1e
|
@ -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))
|
||||||
|
|
|
@ -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 _
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue