lila/modules/db/src/main/PaginatorAdapter.scala

55 lines
1.4 KiB
Scala
Raw Normal View History

2013-03-13 15:41:43 -06:00
package lila.db
package paginator
2016-04-01 05:41:57 -06:00
import dsl._
2016-03-02 06:13:36 -07:00
import reactivemongo.api._
2019-11-29 11:08:13 -07:00
import reactivemongo.api.bson._
import scala.concurrent.ExecutionContext
import scala.util.chaining._
2013-03-13 15:41:43 -06:00
2013-05-24 11:04:49 -06:00
import lila.common.paginator.AdapterLike
2013-03-25 11:28:31 -06:00
final class CachedAdapter[A](
adapter: AdapterLike[A],
val nbResults: Fu[Int]
)(implicit ec: ExecutionContext)
extends AdapterLike[A] {
2013-03-13 15:41:43 -06:00
def slice(offset: Int, length: Int): Fu[Seq[A]] =
2013-03-25 11:28:31 -06:00
adapter.slice(offset, length)
2013-03-13 15:41:43 -06:00
}
2014-07-03 12:57:37 -06:00
2016-04-01 10:43:50 -06:00
final class Adapter[A: BSONDocumentReader](
collection: Coll,
selector: Bdoc,
2019-11-29 15:11:03 -07:00
projection: Option[Bdoc],
sort: Bdoc,
readPreference: ReadPreference = ReadPreference.primary,
hint: Option[Bdoc] = None
)(implicit ec: ExecutionContext)
extends AdapterLike[A] {
2014-07-03 12:57:37 -06:00
2019-11-29 15:11:03 -07:00
def nbResults: Fu[Int] = collection.secondaryPreferred.countSel(selector)
2014-07-03 12:57:37 -06:00
def slice(offset: Int, length: Int): Fu[List[A]] =
2019-12-13 07:30:20 -07:00
collection
.find(selector, projection)
2014-07-03 12:57:37 -06:00
.sort(sort)
2016-04-01 10:43:50 -06:00
.skip(offset)
.pipe { query =>
hint match {
case None => query
2020-07-19 07:11:06 -06:00
case Some(h) => query.hint(collection hint h)
}
}
2020-07-19 07:11:06 -06:00
.cursor[A](readPreference)
.list(length)
}
final class StaticAdapter[A](results: Seq[A])(implicit ec: ExecutionContext) extends AdapterLike[A] {
def nbResults = fuccess(results.size)
def slice(offset: Int, length: Int) = fuccess(results drop offset take length)
}