Browse Source

Add multiple database queries test for warp-rust (#5413)

Konrad Borowski 5 years ago
parent
commit
baeb1aa191

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

@@ -5,6 +5,7 @@ authors = ["Konrad Borowski <[email protected]>"]
 edition = "2018"
 edition = "2018"
 
 
 [dependencies]
 [dependencies]
+futures = "0.3.1"
 rand = "0.7.3"
 rand = "0.7.3"
 serde = { version = "1.0.103", features = ["derive"] }
 serde = { version = "1.0.103", features = ["derive"] }
 tokio = { version = "0.2.9", features = ["macros"] }
 tokio = { version = "0.2.9", features = ["macros"] }

+ 5 - 0
frameworks/Rust/warp-rust/README.md

@@ -9,6 +9,7 @@ warp is a composable web server framework based on hyper.
 * [JSON](src/main.rs)
 * [JSON](src/main.rs)
 * [PLAINTEXT](src/main.rs)
 * [PLAINTEXT](src/main.rs)
 * [DB](src/main.rs)
 * [DB](src/main.rs)
+* [QUERIES](src/main.rs)
 
 
 ## Test URLs
 ## Test URLs
 ### JSON
 ### JSON
@@ -22,3 +23,7 @@ http://localhost:8080/plaintext
 ### DB
 ### DB
 
 
 http://localhost:8080/db
 http://localhost:8080/db
+
+### QUERIES
+
+http://localhost:8080/queries/[1...500]

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

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

+ 20 - 0
frameworks/Rust/warp-rust/src/main.rs

@@ -1,6 +1,8 @@
 mod db;
 mod db;
 
 
 use crate::db::Database;
 use crate::db::Database;
+use futures::stream::futures_unordered::FuturesUnordered;
+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;
@@ -34,12 +36,30 @@ fn db(database: &'static Database) -> impl Filter<Extract = impl Reply, Error =
     })
     })
 }
 }
 
 
+fn queries(
+    database: &'static Database,
+) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
+    let between = Uniform::from(1..=10_000);
+    let clamped = warp::path!(u32).map(|queries: u32| queries.max(1).min(500));
+    warp::path!("queries" / ..)
+        .and(clamped.or(warp::any().map(|| 1)).unify())
+        .and_then(move |queries| {
+            let mut rng = rand::thread_rng();
+            (0..queries)
+                .map(|_| database.get_world_by_id(between.sample(&mut rng)))
+                .collect::<FuturesUnordered<_>>()
+                .collect::<Vec<_>>()
+                .map(|worlds| Ok::<_, Rejection>(warp::reply::json(&worlds)))
+        })
+}
+
 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 {
     json()
     json()
         .or(plaintext())
         .or(plaintext())
         .or(db(database))
         .or(db(database))
+        .or(queries(database))
         .map(|reply| warp::reply::with_header(reply, header::SERVER, "warp"))
         .map(|reply| warp::reply::with_header(reply, header::SERVER, "warp"))
 }
 }