Application.scala 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. private val TestDatabaseRows = 10000
  14. val DEFAULT_HOST = "localhost:27017"
  15. val servers = current.configuration.getStringList("mongodb.servers") match {
  16. case Some(servers) => collectionAsScalaIterable(servers).toList
  17. case None => List(DEFAULT_HOST)
  18. }
  19. val DEFAULT_DB = "hello_world"
  20. val db = current.configuration.getString("mongodb.db").getOrElse(DEFAULT_DB)
  21. //private val dbExecutionContext: ExecutionContext = Akka.system.dispatchers.lookup("dbExecutionContext")
  22. private val database = ReactiveMongoPlugin
  23. .driver
  24. .connection(servers, nbChannelsPerNode = 10)
  25. .db(db)//(dbExecutionContext)
  26. private def collection: JSONCollection = database.collection[JSONCollection]("world")
  27. private val projection = Json.obj("_id" -> 0)
  28. /**
  29. * Returns the closest number to <code>toRestrict</code> that is within the
  30. * specified bounds, inclusive on both ends.
  31. */
  32. private def restrictWithin(toRestrict: String, lowerBound: Int, upperBound: Int): Option[Int] = {
  33. try {
  34. Some(math.min(upperBound, math.max(toRestrict.toInt, lowerBound)))
  35. } catch {
  36. case e: Exception => None
  37. }
  38. }
  39. def dbqueries(requestedQueries: String) = Action.async {
  40. import scala.concurrent.ExecutionContext.Implicits.global
  41. val random = ThreadLocalRandom.current()
  42. val queries = restrictWithin(requestedQueries, 1, 500).getOrElse(1)
  43. val futureWorlds = Future.sequence((for {
  44. _ <- 1 to queries
  45. } yield { collection
  46. .find(Json.obj("id" -> (random.nextInt(TestDatabaseRows) + 1)), projection)
  47. .one[JsValue]
  48. }))
  49. futureWorlds.map { worlds =>
  50. Ok(Json.toJson(worlds.map {maybeWorld =>
  51. maybeWorld.map {world =>
  52. world.as[Map[String, Int]]
  53. }
  54. }))
  55. }
  56. }
  57. def singledb() = Action.async {
  58. import scala.concurrent.ExecutionContext.Implicits.global
  59. val random = ThreadLocalRandom.current()
  60. val futureWorld = collection
  61. .find(Json.obj("id" -> (random.nextInt(TestDatabaseRows) + 1)), projection)
  62. .one[JsValue]
  63. futureWorld.map { world =>
  64. Ok(Json.toJson(world.head.as[Map[String, Int]]))
  65. }
  66. }
  67. }