Application.scala 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package controllers
  2. import play.api.Play.current
  3. import play.api.mvc._
  4. import play.api.libs.json._
  5. import scala.concurrent.forkjoin.ThreadLocalRandom
  6. import scala.concurrent.{Future, ExecutionContext}
  7. import scala.collection.convert.WrapAsScala.collectionAsScalaIterable
  8. import play.modules.reactivemongo.ReactiveMongoPlugin
  9. import play.modules.reactivemongo.json.collection.JSONCollection
  10. import play.api.libs.concurrent.Execution.Implicits._
  11. import play.api.libs.concurrent.Akka
  12. object Application extends Controller {
  13. val DEFAULT_HOST = "localhost:27017"
  14. val servers = current.configuration.getStringList("mongodb.servers") match {
  15. case Some(servers) => collectionAsScalaIterable(servers).toList
  16. case None => List(DEFAULT_HOST)
  17. }
  18. val DEFAULT_DB = "hello_world"
  19. val dbName = current.configuration.getString("mongodb.db").getOrElse(DEFAULT_DB)
  20. //private val dbExecutionContext: ExecutionContext = Akka.system.dispatchers.lookup("dbExecutionContext")
  21. private val database = {
  22. ReactiveMongoPlugin
  23. .driver
  24. .connection(servers, nbChannelsPerNode = 10)
  25. .db(dbName)//(dbExecutionContext)
  26. }
  27. private val projection = Json.obj("_id" -> 0)
  28. def getRandomWorlds(n: Int): Future[Seq[JsValue]] = {
  29. val random = ThreadLocalRandom.current()
  30. Future.sequence((for {
  31. _ <- 1 to n
  32. } yield {
  33. database.collection[JSONCollection]("world")
  34. .find(Json.obj("id" -> (random.nextInt(TestDatabaseRows) + 1)), projection)
  35. .one[JsValue].map(_.get)
  36. }))
  37. }
  38. // Common code between Scala database code
  39. private val TestDatabaseRows = 10000
  40. def db = Action.async {
  41. getRandomWorlds(1).map { worlds =>
  42. Ok(Json.toJson(worlds.head))
  43. }
  44. }
  45. def queries(countString: String) = Action.async {
  46. val n = parseCount(countString)
  47. getRandomWorlds(n).map { worlds =>
  48. Ok(Json.toJson(worlds))
  49. }
  50. }
  51. private def parseCount(s: String): Int = {
  52. try {
  53. val parsed = java.lang.Integer.parseInt(s, 10)
  54. parsed match {
  55. case i if i < 1 => 1
  56. case i if i > 500 => 500
  57. case i => i
  58. }
  59. } catch {
  60. case _: NumberFormatException => 1
  61. }
  62. }
  63. }