From 775b09f4a5c9f12b1d3a470d09adbea9b5470e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Phil=20H=C3=B6fer?= <phil.hoefer@suma-ev.de> Date: Mon, 22 Jul 2024 14:34:17 +0200 Subject: [PATCH] Add Basic Incremental Startup --- src/main.rs | 4 ++-- src/predictors/basic_markov.rs | 12 ++++++++++-- src/predictors/basic_set.rs | 11 ++++++++++- src/predictors/composite.rs | 3 +++ src/predictors/mod.rs | 1 + 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8b75aab..0c1125b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -143,7 +143,7 @@ fn process_request(request: tiny_http::Request, config: HashMap<String, String>, request.respond(response); let now = std::time::SystemTime::now(); let elapsed = now.duration_since(last_update).expect("Time went backwards"); - if elapsed >= std::time::Duration::from_secs(12 * 60 * 60) { //every 12h + if elapsed >= std::time::Duration::from_secs(2 * 60 * 60) || (markov_chain.update_count()<1800000) { //every 2h markov_chain.decay(); read_from_db(config.clone(), markov_chain); last_update = now; @@ -180,7 +180,7 @@ fn read_from_db(config: HashMap<String, String>, predictor: &mut CompositePredic match client { Ok(mut c) => { let mut count = 0; - match c.query("SELECT query FROM public.logs_partitioned ORDER BY time DESC LIMIT 10000", &[]) { + match c.query("SELECT query FROM public.logs_partitioned ORDER BY time DESC LIMIT 20000", &[]) { Ok(rows) => { for row in rows { let query: &str = row.get(0); diff --git a/src/predictors/basic_markov.rs b/src/predictors/basic_markov.rs index ed4bcc3..40ad615 100644 --- a/src/predictors/basic_markov.rs +++ b/src/predictors/basic_markov.rs @@ -11,6 +11,7 @@ pub type MarkovChain = HashMap<String, HashMap<String, usize>>; pub struct MarkovChainPredictor { chain: MarkovChain, configuration: HashMap<String, String>, + update_count: usize } impl Predictor for MarkovChainPredictor { @@ -18,7 +19,8 @@ impl Predictor for MarkovChainPredictor { { MarkovChainPredictor { chain: HashMap::new(), - configuration: HashMap::new() + configuration: HashMap::new(), + update_count: 0 } } @@ -32,9 +34,14 @@ impl Predictor for MarkovChainPredictor { MarkovChainPredictor { chain: HashMap::new(), configuration, + update_count: 0 } } + fn update_count(&self) -> usize { + return self.update_count; + } + fn update_from_importer<I: Importer>(&mut self, importer: &mut I, count: usize) -> Result<usize,Box<dyn std::error::Error>> {let mut raw_list = String::new(); let blocklist: Vec<&str> = match self.configuration.get("blocklist") { Some(list) => { @@ -80,7 +87,8 @@ impl Predictor for MarkovChainPredictor { .or_insert(1); } } - + + self.update_count += 1; Ok(()) } diff --git a/src/predictors/basic_set.rs b/src/predictors/basic_set.rs index 05edb13..27f0af3 100644 --- a/src/predictors/basic_set.rs +++ b/src/predictors/basic_set.rs @@ -9,6 +9,7 @@ use super::Predictor; pub struct SetPredictor { set: HashMap<String,usize>, configuration: HashMap<String, String>, + update_count: usize } impl Predictor for SetPredictor { @@ -16,7 +17,8 @@ impl Predictor for SetPredictor { { SetPredictor { set: HashMap::new(), - configuration: HashMap::new() + configuration: HashMap::new(), + update_count: 0 } } @@ -30,9 +32,15 @@ impl Predictor for SetPredictor { SetPredictor { set: HashMap::new(), configuration, + update_count: 0 } } + + fn update_count(&self) -> usize { + return self.update_count; + } + fn update_from_importer<I: Importer>(&mut self, importer: &mut I, count: usize) -> Result<usize,Box<dyn std::error::Error>> { let mut raw_list = String::new(); @@ -85,6 +93,7 @@ impl Predictor for SetPredictor { let counter = self.set.entry(word.to_string()).or_insert(0); *counter += 1; } + self.update_count += 1; Ok(()) } diff --git a/src/predictors/composite.rs b/src/predictors/composite.rs index 10494ac..ad43241 100644 --- a/src/predictors/composite.rs +++ b/src/predictors/composite.rs @@ -34,6 +34,9 @@ impl Predictor for CompositePredictor { } } + fn update_count(&self) -> usize { + self.markov_predictor.update_count() + } fn update_from_importer<I: Importer>(&mut self, importer: &mut I, count: usize) -> Result<usize,Box<dyn std::error::Error>> { diff --git a/src/predictors/mod.rs b/src/predictors/mod.rs index e8d1def..09ce077 100644 --- a/src/predictors/mod.rs +++ b/src/predictors/mod.rs @@ -11,6 +11,7 @@ pub trait Predictor { fn update_from_query(&mut self, query: &str, blocklist: &Vec<&str>) -> Result<(),Box<dyn std::error::Error>>; fn update_from_importer<I: Importer>(&mut self, importer: &mut I, count: usize) -> Result<usize,Box<dyn std::error::Error>>; fn decay(&mut self) -> (); + fn update_count(&self) -> usize; fn new() -> Self where Self: Sized; fn new_from_config(config: HashMap<String, impl Into<String>>) -> Self where Self:Sized; -- GitLab