From eef5efc67b9f0b2eeede9a6d89d2de796634acb7 Mon Sep 17 00:00:00 2001 From: Benedict Börger Date: Sat, 22 Jun 2019 23:55:47 +0200 Subject: [web_frontend][transaction] implement filter syntax --- src/web_frontend/transactions.rs | 57 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'src/web_frontend') diff --git a/src/web_frontend/transactions.rs b/src/web_frontend/transactions.rs index 54aacf9..f6d65af 100644 --- a/src/web_frontend/transactions.rs +++ b/src/web_frontend/transactions.rs @@ -30,9 +30,62 @@ struct TransactionContext { date_end : String } +struct TransactionFilter { + sender_name_filter : Vec, + reference_filter : Vec +} + +/* + * files syntax: . seperates different search critereas + * a search crietera is a key value pair, with key as fiter type, e.g. + * sender name of transation. The value is what is should be and can be a regex + * key value pair is split by - + */ fn apply_transaction_filter(filter : String, transactions : Vec) -> Vec { - let re = Regex::new(&filter).unwrap(); - let tmp = transactions.into_iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect(); + let mut tmp = transactions.clone(); + // 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(); + return tmp; + } + + // parse filter string and construct TransactionFilter struct + let mut sender_name_vec = Vec::new(); + 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()); + } + else if v[0] == "reference" { + println!("filter for reference"); + reference_vec.push(v[1].to_string()); + } + } + + } + tmp = transactions.clone().into_iter().filter(|transaction| { + let mut sender_match = false; + let mut reference_match = false; + for sender in &sender_name_vec { + let re_sender = Regex::new(&sender).unwrap(); + if re_sender.is_match(&transaction.sender_name) { + sender_match = true; + } + } + for reference in &reference_vec { + let re = Regex::new(&reference).unwrap(); + if re.is_match(&transaction.reference) { + reference_match = true; + } + } + sender_match || reference_match + }).collect(); tmp } -- cgit v1.2.3-70-g09d2