summaryrefslogtreecommitdiff
path: root/src/web_frontend/util.rs
diff options
context:
space:
mode:
authorBenedict Börger <benedict@0xb8000.de>2019-07-12 22:52:26 +0200
committerBenedict Börger <benedict@0xb8000.de>2019-07-12 22:52:51 +0200
commit6f1990a2e1b7c678571d24471511c17cb634fef8 (patch)
tree8483dbd9dc48f1b9896757fb45b7990f7e70a8a2 /src/web_frontend/util.rs
parentfd7d78bf9662429ca600564f22e3a8699b3fac18 (diff)
[web_frontend] filering: perfomance optimizationHEADmaster
Diffstat (limited to 'src/web_frontend/util.rs')
-rw-r--r--src/web_frontend/util.rs45
1 files changed, 22 insertions, 23 deletions
diff --git a/src/web_frontend/util.rs b/src/web_frontend/util.rs
index 7a29173..9bfef25 100644
--- a/src/web_frontend/util.rs
+++ b/src/web_frontend/util.rs
@@ -68,13 +68,12 @@ struct TransactionFilter {
* sender name of transation. The value is what is should be and can be a regex
* key value pair is split by -
*/
-pub fn apply_transaction_filter(filter : String, transactions : Vec<crate::banking::account::Transaction>) -> Vec<crate::banking::account::Transaction> {
- let mut tmp = transactions.clone();
+pub fn apply_transaction_filter<'t>(filter : &str , transactions : &'t Vec<crate::banking::account::Transaction>) -> Vec<&'t crate::banking::account::Transaction> {
+ let mut tmp;
// special case if for general search
if !filter.to_string().contains(";") {
- println!("in special case");
let re = Regex::new(&filter).unwrap();
- tmp = transactions.into_iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect();
+ tmp = transactions.iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect();
return tmp;
}
@@ -83,41 +82,41 @@ pub fn apply_transaction_filter(filter : String, transactions : Vec<crate::banki
let mut reference_vec = Vec::new();
for entry in filter.to_string().split(";") {
let v : Vec<_> = entry.split("-").collect();
- println!("{:?}", v);
if v.len() > 1 {
if v[0] == "sender" {
- println!("Filter for sender_name");
- sender_name_vec.push(v[1].to_string());
+ let re_sender = RegexBuilder::new(v[1])
+ .case_insensitive(true)
+ .build()
+ .expect("invalid regex");
+ sender_name_vec.push(re_sender);
}
else if v[0] == "reference" {
- println!("filter for reference");
- reference_vec.push(v[1].to_string());
+ let re_reference = RegexBuilder::new(v[1])
+ .case_insensitive(true)
+ .build()
+ .expect("invalid regex");
+ reference_vec.push(re_reference);
}
}
}
- tmp = transactions.clone().into_iter().filter(|transaction| {
- let mut sender_match = false;
- let mut reference_match = false;
+ // prebuild regexes ...
+ println!("sender name len {}, reference name length {}", sender_name_vec.len(), reference_vec.len());
+ tmp = transactions.iter().filter(|transaction| {
for sender in &sender_name_vec {
- let mut re_sender = RegexBuilder::new(&sender)
- .case_insensitive(true)
- .build()
- .expect("invalid regex");
- if re_sender.is_match(&transaction.sender_name) {
- sender_match = true;
+ if sender.is_match(&transaction.sender_name) {
+ return true;
}
}
for reference in &reference_vec {
- let re = Regex::new(&reference).unwrap();
- if re.is_match(&transaction.reference) {
- reference_match = true;
+ if reference.is_match(&transaction.reference) {
+ return true;
}
}
- sender_match || reference_match
+ return false;
}).collect();
+ println!("end filtering {}", filter);
tmp
-
}
pub fn apply_date_filter(transactions : Vec<crate::banking::account::Transaction>, date_start : chrono::NaiveDate, date_end : chrono::NaiveDate) -> Vec<crate::banking::account::Transaction> {