diff options
Diffstat (limited to 'src/web_frontend/util.rs')
| -rw-r--r-- | src/web_frontend/util.rs | 45 |
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> { |
