1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- 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"
- }
|