Browse Source

Implement fortunes for warp-rust (#6014)

Konrad Borowski 4 years ago
parent
commit
0814d55b47

+ 1 - 0
frameworks/Rust/warp-rust/Cargo.toml

@@ -11,3 +11,4 @@ serde = { version = "1.0.103", features = ["derive"] }
 tokio = { version = "0.2.21", features = ["macros", "rt-threaded"] }
 tokio = { version = "0.2.21", features = ["macros", "rt-threaded"] }
 tokio-postgres = "0.5.1"
 tokio-postgres = "0.5.1"
 warp = "0.2.3"
 warp = "0.2.3"
+yarte = "0.12.2"

+ 1 - 0
frameworks/Rust/warp-rust/benchmark_config.json

@@ -7,6 +7,7 @@
         "plaintext_url": "/plaintext",
         "plaintext_url": "/plaintext",
         "db_url": "/db",
         "db_url": "/db",
         "query_url": "/queries/",
         "query_url": "/queries/",
+        "fortune_url": "/fortunes",
         "port": 8080,
         "port": 8080,
         "approach": "Realistic",
         "approach": "Realistic",
         "classification": "Micro",
         "classification": "Micro",

+ 25 - 1
frameworks/Rust/warp-rust/src/db.rs

@@ -6,6 +6,7 @@ const DATABASE_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-datab
 pub struct Database {
 pub struct Database {
     client: Client,
     client: Client,
     world: Statement,
     world: Statement,
+    fortune: Statement,
 }
 }
 
 
 #[derive(Serialize)]
 #[derive(Serialize)]
@@ -14,6 +15,11 @@ pub struct World {
     pub randomnumber: i32,
     pub randomnumber: i32,
 }
 }
 
 
+pub struct Fortune {
+    pub id: i32,
+    pub message: String,
+}
+
 impl Database {
 impl Database {
     pub async fn connect() -> Result<Self, Error> {
     pub async fn connect() -> Result<Self, Error> {
         let (client, connection) = tokio_postgres::connect(DATABASE_URL, NoTls).await?;
         let (client, connection) = tokio_postgres::connect(DATABASE_URL, NoTls).await?;
@@ -21,7 +27,12 @@ impl Database {
         let world = client
         let world = client
             .prepare("SELECT id, randomnumber FROM world WHERE id=$1")
             .prepare("SELECT id, randomnumber FROM world WHERE id=$1")
             .await?;
             .await?;
-        Ok(Self { client, world })
+        let fortune = client.prepare("SELECT id, message FROM fortune").await?;
+        Ok(Self {
+            client,
+            world,
+            fortune,
+        })
     }
     }
 
 
     pub async fn get_world_by_id(&self, id: i32) -> World {
     pub async fn get_world_by_id(&self, id: i32) -> World {
@@ -31,4 +42,17 @@ impl Database {
             randomnumber: row.get(1),
             randomnumber: row.get(1),
         }
         }
     }
     }
+
+    pub async fn query_fortunes(&self) -> Vec<Fortune> {
+        self.client
+            .query(&self.fortune, &[])
+            .await
+            .unwrap()
+            .into_iter()
+            .map(|row| Fortune {
+                id: row.get(0),
+                message: row.get(1),
+            })
+            .collect()
+    }
 }
 }

+ 29 - 7
frameworks/Rust/warp-rust/src/main.rs

@@ -1,12 +1,13 @@
 mod db;
 mod db;
 
 
-use crate::db::Database;
+use crate::db::{Database, Fortune};
 use futures::stream::futures_unordered::FuturesUnordered;
 use futures::stream::futures_unordered::FuturesUnordered;
 use futures::{FutureExt, StreamExt};
 use futures::{FutureExt, StreamExt};
 use rand::distributions::{Distribution, Uniform};
 use rand::distributions::{Distribution, Uniform};
 use serde::Serialize;
 use serde::Serialize;
 use warp::http::header;
 use warp::http::header;
 use warp::{Filter, Rejection, Reply};
 use warp::{Filter, Rejection, Reply};
+use yarte::Template;
 
 
 #[derive(Serialize)]
 #[derive(Serialize)]
 struct Message {
 struct Message {
@@ -27,12 +28,10 @@ fn plaintext() -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
 
 
 fn db(database: &'static Database) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
 fn db(database: &'static Database) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
     let between = Uniform::from(1..=10_000);
     let between = Uniform::from(1..=10_000);
-    warp::path!("db").and_then(move || {
-        async move {
-            let id = between.sample(&mut rand::thread_rng());
-            let world = database.get_world_by_id(id).await;
-            Ok::<_, Rejection>(warp::reply::json(&world))
-        }
+    warp::path!("db").and_then(move || async move {
+        let id = between.sample(&mut rand::thread_rng());
+        let world = database.get_world_by_id(id).await;
+        Ok::<_, Rejection>(warp::reply::json(&world))
     })
     })
 }
 }
 
 
@@ -53,6 +52,28 @@ fn queries(
         })
         })
 }
 }
 
 
+#[derive(Template)]
+#[template(path = "fortune")]
+struct FortunesYarteTemplate {
+    fortunes: Vec<Fortune>,
+}
+
+fn fortune(
+    database: &'static Database,
+) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
+    warp::path!("fortunes").and_then(move || async move {
+        let mut fortunes = database.query_fortunes().await;
+        fortunes.push(Fortune {
+            id: 0,
+            message: "Additional fortune added at request time.".into(),
+        });
+        fortunes.sort_by(|a, b| a.message.cmp(&b.message));
+        Ok::<_, Rejection>(warp::reply::html(
+            FortunesYarteTemplate { fortunes }.call().unwrap(),
+        ))
+    })
+}
+
 fn routes(
 fn routes(
     database: &'static Database,
     database: &'static Database,
 ) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
 ) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
@@ -60,6 +81,7 @@ fn routes(
         .or(plaintext())
         .or(plaintext())
         .or(db(database))
         .or(db(database))
         .or(queries(database))
         .or(queries(database))
+        .or(fortune(database))
         .map(|reply| warp::reply::with_header(reply, header::SERVER, "warp"))
         .map(|reply| warp::reply::with_header(reply, header::SERVER, "warp"))
 }
 }
 
 

+ 5 - 0
frameworks/Rust/warp-rust/templates/fortune.hbs

@@ -0,0 +1,5 @@
+<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
+      {{~# each fortunes ~}}
+      <tr><td>{{id}}</td><td>{{message}}</td></tr>
+      {{~/each ~}}
+</table></body></html>

+ 1 - 0
frameworks/Rust/warp-rust/warp-rust.dockerfile

@@ -2,6 +2,7 @@ FROM rust:1.44
 
 
 WORKDIR /warp-rust
 WORKDIR /warp-rust
 COPY src src
 COPY src src
+COPY templates templates
 COPY Cargo.toml Cargo.toml
 COPY Cargo.toml Cargo.toml
 
 
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release