Browse Source

added SingleQueryRoute to get a random "world" instance in JSON from /db route

David Denton 8 years ago
parent
commit
9c15e0f0b8

+ 3 - 1
frameworks/Scala/fintrospect/benchmark_config.json

@@ -6,12 +6,14 @@
         "orm": "Raw",
         "database_os": "Linux",
         "setup_file": "setup",
+        "fortune_url": "/fortunes",
+        "db_url": "/db",
         "json_url": "/json",
         "plaintext_url": "/plaintext",
         "port": 9000,
         "approach": "Realistic",
         "classification": "Micro",
-        "database": "None",
+        "database": "MySQL",
         "framework": "fintrospect",
         "language": "Scala",
         "platform": "Netty",

+ 1 - 1
frameworks/Scala/fintrospect/build.sbt

@@ -19,6 +19,6 @@ libraryDependencies ++= Seq(
   "io.fintrospect" %% "fintrospect-json4s" % "13.11.0",
   "io.fintrospect" %% "fintrospect-mustache" % "13.11.0",
   "com.twitter" %% "finagle-mysql" % "6.38.0"
-  )
+)
 
 resolvers += Resolver.sonatypeRepo("snapshots")

+ 4 - 3
frameworks/Scala/fintrospect/source_code

@@ -1,5 +1,6 @@
 fintrospect/src/main/scala/
-fintrospect/src/main/scala/Fortunes.scala
-fintrospect/src/main/scala/JsonHelloWorld.scala
-fintrospect/src/main/scala/PlainTextHelloWorld.scala
+fintrospect/src/main/scala/Database.scala
+fintrospect/src/main/scala/FortunesRoute.scala
+fintrospect/src/main/scala/JsonRoute.scala
+fintrospect/src/main/scala/PlainTextRoute.scala
 fintrospect/src/main/scala/FintrospectBenchmarkServer.scala

+ 19 - 0
frameworks/Scala/fintrospect/src/main/scala/Database.scala

@@ -0,0 +1,19 @@
+import com.twitter.finagle.Mysql
+import com.twitter.finagle.client.DefaultPool.Param
+import com.twitter.finagle.mysql.Client
+import com.twitter.finagle.stats.NullStatsReceiver
+import com.twitter.finagle.tracing.NullTracer
+import com.twitter.util.Duration.fromSeconds
+import com.twitter.util.NullMonitor
+
+object Database {
+  def apply(): Client = Mysql.client
+    .withCredentials("benchmarkdbuser", "benchmarkdbpass")
+    .withDatabase("hello_world")
+    .configured(Param(low = 0, high = 10, idleTime = fromSeconds(5 * 60), bufferSize = 0, maxWaiters = Int.MaxValue))
+    .withStatsReceiver(NullStatsReceiver)
+    .withMonitor(NullMonitor)
+    .withTracer(NullTracer)
+    .withMaxConcurrentPrepareStatements(256)
+    .newRichClient("localhost:3306")
+}

+ 6 - 3
frameworks/Scala/fintrospect/src/main/scala/FintrospectBenchmarkServer.scala

@@ -20,10 +20,13 @@ object FintrospectBenchmarkServer extends App {
     })
   }
 
+  val database = Database()
+
   val module = ModuleSpec(Root, SimpleJson(), addServerAndDate)
-    .withRoute(JsonHelloWorld.route)
-    .withRoute(PlainTextHelloWorld.route)
-    .withRoute(Fortunes.route)
+    .withRoute(JsonRoute())
+    .withRoute(PlainTextRoute())
+    .withRoute(FortunesRoute(database))
+    .withRoute(QueriesRoute(database))
 
   Await.ready(
     Http.server

+ 0 - 52
frameworks/Scala/fintrospect/src/main/scala/Fortunes.scala

@@ -1,52 +0,0 @@
-import com.twitter.finagle.client.DefaultPool.Param
-import com.twitter.finagle.http.Method.Get
-import com.twitter.finagle.http.Request
-import com.twitter.finagle.mysql.{IntValue, Result, ResultSet, StringValue}
-import com.twitter.finagle.stats.NullStatsReceiver
-import com.twitter.finagle.tracing.NullTracer
-import com.twitter.finagle.{Mysql, Service}
-import com.twitter.util.Duration.fromSeconds
-import com.twitter.util.NullMonitor
-import io.fintrospect.RouteSpec
-import io.fintrospect.formats.Html
-import io.fintrospect.templating.MustacheTemplates.CachingClasspath
-import io.fintrospect.templating.{RenderView, View}
-
-case class Fortune(id: Int, message: String)
-
-case class FortunesList(items: Seq[Fortune]) extends View
-
-object Fortunes {
-  private val toFortunes: PartialFunction[Result, Seq[Fortune]] = {
-    case rs: ResultSet => rs.rows
-      .map(row => {
-        val IntValue(id) = row("id").get
-        val StringValue(message) = row("message").get
-        Fortune(id, message)
-      })
-    case _ => Seq.empty
-  }
-
-  private val dbClient = Mysql.client
-    .withCredentials("benchmarkdbuser", "benchmarkdbpass")
-    .withDatabase("hello_world")
-    .configured(Param(low = 0, high = 10, idleTime = fromSeconds(5 * 60), bufferSize = 0, maxWaiters = Int.MaxValue))
-    .withStatsReceiver(NullStatsReceiver)
-    .withMonitor(NullMonitor)
-    .withTracer(NullTracer)
-    .withMaxConcurrentPrepareStatements(256)
-    .newRichClient("localhost:3306")
-
-  private val statement = dbClient.prepare("SELECT * FROM fortune")
-
-  private val service = new RenderView(Html.ResponseBuilder, CachingClasspath()).andThen(
-    Service.mk {
-      r: Request =>
-        statement().map(toFortunes).map(f => {
-          val sortedFortunes = (Fortune(0, "Additional fortune added at request time.") +: f).sortBy(_.message)
-          FortunesList(sortedFortunes)
-        })
-    })
-
-  val route = RouteSpec().at(Get) / "fortunes" bindTo Fortunes.service
-}

+ 41 - 0
frameworks/Scala/fintrospect/src/main/scala/FortunesRoute.scala

@@ -0,0 +1,41 @@
+import com.twitter.finagle.Service
+import com.twitter.finagle.http.Method.Get
+import com.twitter.finagle.http.Request
+import com.twitter.finagle.mysql.{Client, IntValue, Result, ResultSet, StringValue}
+import io.fintrospect.RouteSpec
+import io.fintrospect.formats.Html
+import io.fintrospect.templating.MustacheTemplates.CachingClasspath
+import io.fintrospect.templating.{RenderView, View}
+
+case class Fortune(id: Int, message: String)
+
+case class FortunesList(items: Seq[Fortune]) extends View
+
+object FortunesRoute {
+
+  private val toFortunes: PartialFunction[Result, Seq[Fortune]] = {
+    case rs: ResultSet => rs.rows
+      .map(row => {
+        val IntValue(id) = row("id").get
+        val StringValue(message) = row("message").get
+        Fortune(id, message)
+      })
+    case _ => Seq.empty
+  }
+
+  def apply(database: Client) = {
+
+    val statement = database.prepare("SELECT * FROM fortune")
+
+    val service = new RenderView(Html.ResponseBuilder, CachingClasspath()).andThen(
+      Service.mk {
+        r: Request =>
+          statement().map(toFortunes).map(f => {
+            val sortedFortunes = (Fortune(0, "Additional fortune added at request time.") +: f).sortBy(_.message)
+            FortunesList(sortedFortunes)
+          })
+      })
+
+    RouteSpec().at(Get) / "fortunes" bindTo service
+  }
+}

+ 2 - 2
frameworks/Scala/fintrospect/src/main/scala/JsonHelloWorld.scala → frameworks/Scala/fintrospect/src/main/scala/JsonRoute.scala

@@ -6,9 +6,9 @@ import io.fintrospect.RouteSpec
 import io.fintrospect.formats.Json4sJackson.JsonFormat.{obj, string}
 import io.fintrospect.formats.Json4sJackson.ResponseBuilder.implicits._
 
-object JsonHelloWorld {
+object JsonRoute {
 
   private val service = Service.mk { r: Request => Ok(obj("message" -> string("Hello, World!"))) }
 
-  val route = RouteSpec().at(Get) / "json" bindTo JsonHelloWorld.service
+  def apply() = RouteSpec().at(Get) / "json" bindTo service
 }

+ 2 - 2
frameworks/Scala/fintrospect/src/main/scala/PlainTextHelloWorld.scala → frameworks/Scala/fintrospect/src/main/scala/PlainTextRoute.scala

@@ -6,11 +6,11 @@ import com.twitter.io.Buf
 import io.fintrospect.RouteSpec
 import io.fintrospect.formats.PlainText.ResponseBuilder.implicits._
 
-object PlainTextHelloWorld {
+object PlainTextRoute {
 
   private val preallocatedMsgForPlainText = Buf.Utf8("Hello, World!")
 
   private val service = Service.mk { r: Request => Ok(preallocatedMsgForPlainText) }
 
-  val route = RouteSpec().at(Get) / "plaintext" bindTo service
+  def apply() = RouteSpec().at(Get) / "plaintext" bindTo service
 }

+ 39 - 0
frameworks/Scala/fintrospect/src/main/scala/QueriesRoute.scala

@@ -0,0 +1,39 @@
+import com.twitter.finagle.Service
+import com.twitter.finagle.http.Method.Get
+import com.twitter.finagle.http.Request
+import com.twitter.finagle.http.Status.{NotFound, Ok}
+import com.twitter.finagle.mysql.Parameter.wrap
+import com.twitter.finagle.mysql.{Client, IntValue, Result, ResultSet}
+import io.fintrospect.RouteSpec
+import io.fintrospect.formats.Json4sJackson.JsonFormat.{number, obj}
+import io.fintrospect.formats.Json4sJackson.ResponseBuilder.implicits._
+import org.json4s.JValue
+
+import scala.util.Random
+
+object QueriesRoute {
+
+  private val toJson: PartialFunction[Result, Option[JValue]] = {
+    case rs: ResultSet => rs.rows.headOption
+      .map(row => {
+        val IntValue(id) = row("id").get
+        val IntValue(random) = row("randomNumber").get
+        obj("id" -> number(id), "randomNumber" -> number(random))
+      })
+    case _ => None
+  }
+
+  private def generateRandomId = Random.nextInt(9999) + 1
+
+  def apply(database: Client) = {
+    val statement = database.prepare("SELECT id, randomNumber FROM world WHERE id = ?")
+
+    val service = Service.mk {
+      r: Request => statement(generateRandomId)
+        .map(toJson)
+        .map(_.map(Ok(_)).getOrElse(NotFound()).build())
+    }
+
+    RouteSpec().at(Get) / "db" bindTo service
+  }
+}