|
@@ -1,89 +0,0 @@
|
|
|
-package com.ibm.techempower
|
|
|
-
|
|
|
-import java.util.concurrent.ThreadLocalRandom.{ current => random }
|
|
|
-
|
|
|
-import scala.language.implicitConversions
|
|
|
-import scala.language.postfixOps
|
|
|
-import scala.collection.mutable.MutableList
|
|
|
-
|
|
|
-import com.ibm.plain.ignore
|
|
|
-import com.ibm.plain.rest.{ Form, Resource }
|
|
|
-import com.ibm.plain.json.{ Json => J }
|
|
|
-import com.ibm.plain.jdbc.withConnection
|
|
|
-import com.ibm.plain.jdbc.ConnectionHelper._
|
|
|
-
|
|
|
-final class Db
|
|
|
-
|
|
|
- extends DbResource {
|
|
|
-
|
|
|
- Get { get(None) }
|
|
|
-
|
|
|
- Get { form: Form => get(Some(form)) }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-final class Update
|
|
|
-
|
|
|
- extends DbResource {
|
|
|
-
|
|
|
- Get { form: Form => update(form) }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-sealed abstract class DbResource
|
|
|
-
|
|
|
- extends Resource {
|
|
|
-
|
|
|
- @inline protected[this] final def get(form: Option[Form]): J = {
|
|
|
- val output = new MutableList[J]
|
|
|
- val q = form match { case None => 1 case Some(f) => queries(f) }
|
|
|
- withConnection(datasource) { implicit connection =>
|
|
|
- for (i <- 1 to q) { for (j <- selectsql << next ! asJson) { output += j } }
|
|
|
- }
|
|
|
- form match { case None => output.head case _ => J(output.toList) }
|
|
|
- }
|
|
|
-
|
|
|
- @inline protected[this] final def update(form: Form): J = {
|
|
|
- val input = new MutableList[World]
|
|
|
- val output = new MutableList[J]
|
|
|
- val q = queries(form)
|
|
|
- withConnection(datasource) { implicit connection =>
|
|
|
- for (i <- 1 to q) { for (j <- selectsql << next ! asTuple) { input += j } }
|
|
|
- input.foreach {
|
|
|
- case (id, _) =>
|
|
|
- val randomNumber = next
|
|
|
- updatesql << randomNumber << id ++;
|
|
|
- output += asJson(id, randomNumber)
|
|
|
- }
|
|
|
- ignore(updatesql ++!)
|
|
|
- }
|
|
|
- J(output.toList)
|
|
|
- }
|
|
|
-
|
|
|
- @inline private[this] final def queries(form: Form) = try {
|
|
|
- form.get("queries").get.head.toInt match {
|
|
|
- case q if 1 > q => 1
|
|
|
- case q if 500 < q => 500
|
|
|
- case q => q
|
|
|
- }
|
|
|
- } catch {
|
|
|
- case _: Throwable => 1
|
|
|
- }
|
|
|
-
|
|
|
- @inline private[this] final def asJson = (r: RichResultSet) => J(Map("id" -> r.nextInt, "randomNumber" -> r.nextInt))
|
|
|
-
|
|
|
- @inline private[this] final def asJson(id: Int, randomNumber: Int) = J(Map("id" -> id, "randomNumber" -> randomNumber))
|
|
|
-
|
|
|
- @inline private[this] final def asTuple = (r: RichResultSet) => (r.nextInt, r.nextInt)
|
|
|
-
|
|
|
- @inline private[this] final def next = random.nextInt(1, 10001)
|
|
|
-
|
|
|
- private[this] final type World = (Int, Int)
|
|
|
-
|
|
|
- private[this] final val selectsql = "select id, randomNumber from World where id = ?"
|
|
|
-
|
|
|
- private[this] final val updatesql = "update World set randomNumber = ? where id = ?"
|
|
|
-
|
|
|
- private[this] final val datasource = "MysqlBenchmark"
|
|
|
-
|
|
|
-}
|