diff --git a/search/src/index/documents.rs b/search/src/index/documents.rs index 568a932..36abb90 100644 --- a/search/src/index/documents.rs +++ b/search/src/index/documents.rs @@ -40,7 +40,7 @@ impl Documents { let mut prev = ""; writer.write_vbyte(documents.len() as u32); - for l in documents.iter() { + for l in documents { let p_len = utils::get_matching_prefix_len(prev, &l.path); writer.write_gamma(p_len as u32); let remaining: String = l.path.chars().skip(p_len).collect(); diff --git a/server/src/main.rs b/server/src/main.rs index 117e659..a05623d 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -13,12 +13,15 @@ use serde::{Deserialize, Serialize}; use std::{ env, fs::read_to_string, + mem::replace, sync::{Arc, Mutex}, }; struct AppState { index_path: String, query_processor: Mutex, + cached_query: Mutex, + cached_result: Mutex>, } #[tokio::main] @@ -40,6 +43,8 @@ async fn main() { let state = Arc::new(AppState { index_path: base_path.clone(), query_processor: Mutex::new(Processor::build_query_processor(&index_path)), + cached_query: Mutex::new(String::new()), + cached_result: Mutex::new(None), }); let app = Router::new() @@ -91,7 +96,7 @@ struct QueryRequest { query: String, } -#[derive(Template)] +#[derive(Template, Clone)] #[template(path = "query.html")] struct QueryResponse { tokens: Vec, @@ -99,7 +104,7 @@ struct QueryResponse { documents: Vec, } -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, Clone)] struct Document { id: u32, score: f64, @@ -112,7 +117,15 @@ async fn post_query( State(state): State>, Json(payload): Json, ) -> impl IntoResponse { - info!("Query request: {:?}", payload); + info!("Query request: {}", payload.query); + + let mut cq = state.cached_query.lock().unwrap(); + let mut cqr = state.cached_result.lock().unwrap(); + + if *cq == payload.query { + info!("Cache hit for query: {}", payload.query); + return HtmlTemplate(cqr.clone().unwrap()); + } let mut q = state.query_processor.lock().unwrap(); @@ -129,11 +142,17 @@ async fn post_query( }) .collect(); - HtmlTemplate(QueryResponse { + let response = QueryResponse { tokens: query_result.tokens, documents, time_ms: query_result.time_ms, - }) + }; + + info!("Replacing cache with query: {}", payload.query); + let _ = replace(&mut *cq, payload.query); + let _ = replace(&mut *cqr, Some(response.clone())); + + HtmlTemplate(response) } fn read_file_content(path: String) -> String { diff --git a/server/templates/index.html b/server/templates/index.html index 1039cb7..d2f8c92 100644 --- a/server/templates/index.html +++ b/server/templates/index.html @@ -23,6 +23,27 @@ } + + search-rs diff --git a/server/templates/query.html b/server/templates/query.html index 6a7a5b1..efe3877 100644 --- a/server/templates/query.html +++ b/server/templates/query.html @@ -22,13 +22,21 @@

{% for doc in documents %} -
-
+ +
+
+

+ {{ doc.path }} +

+

+ {{ doc.content|truncate(150) }} +

+
+