optimize relation fetching and mapping

pull/1505/merge
Thibault Duplessis 2016-01-24 01:58:04 +07:00
parent 1c0e1e434d
commit 91525fcbf7
1 changed files with 11 additions and 6 deletions

View File

@ -1,6 +1,7 @@
package lila.relation
import play.api.libs.json._
import reactivemongo.bson._
import lila.common.PimpedJson._
import lila.db.api._
@ -9,6 +10,8 @@ import tube.relationTube
private[relation] object RelationRepo {
val coll = relationTube.coll
def relation(id: ID): Fu[Option[Relation]] =
$primitive.one($select byId id, "r")(_.asOpt[Boolean])
@ -21,14 +24,16 @@ private[relation] object RelationRepo {
def blocking(userId: ID) = relating(userId, Block)
private def relaters(userId: ID, relation: Relation): Fu[Set[ID]] =
$projection(Json.obj("u2" -> userId), Seq("u1", "r")) { obj =>
obj str "u1" map { _ -> ~(obj boolean "r") }
} map (_.filter(_._2 == relation).map(_._1).toSet)
coll.distinct("u1", BSONDocument(
"u2" -> userId,
"r" -> relation
).some) map lila.db.BSON.asStringSet
private def relating(userId: ID, relation: Relation): Fu[Set[ID]] =
$projection(Json.obj("u1" -> userId), Seq("u2", "r")) { obj =>
obj str "u2" map { _ -> ~(obj boolean "r") }
} map (_.filter(_._2 == relation).map(_._1).toSet)
coll.distinct("u2", BSONDocument(
"u1" -> userId,
"r" -> relation
).some) map lila.db.BSON.asStringSet
def follow(u1: ID, u2: ID): Funit = save(u1, u2, Follow)
def unfollow(u1: ID, u2: ID): Funit = remove(u1, u2)