diff options
Diffstat (limited to 'src/backend/search.rs')
| -rw-r--r-- | src/backend/search.rs | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/src/backend/search.rs b/src/backend/search.rs index 6757790..bb87416 100644 --- a/src/backend/search.rs +++ b/src/backend/search.rs @@ -4,10 +4,13 @@ use nucleo_matcher::{ }; use std::collections::HashMap; +use crate::frontend::entries::EntryTableItem; + #[derive(Debug)] pub struct BibiSearch { pub search_string: String, // Search string show in footer, used for search pub inner_search: bool, // True, if we trigger a search for already filtered list + // pub entry_list_at_search_start: Vec<EntryTableItem>, pub filtered_entry_list_by_search: Vec<Vec<String>>, // Temporary holds entry list filtered by search pattern to refilter it pub filtered_entry_list_by_tags: Vec<Vec<String>>, // Holds entry list filtered by tag to filter it further by search pub filtered_tag_list: Vec<String>, @@ -18,6 +21,7 @@ impl Default for BibiSearch { Self { search_string: String::new(), inner_search: false, + // entry_list_at_search_start: Vec::new(), filtered_entry_list_by_search: Vec::new(), filtered_entry_list_by_tags: Vec::new(), filtered_tag_list: Vec::new(), @@ -26,18 +30,29 @@ impl Default for BibiSearch { } impl BibiSearch { - // Stringify inner Vec<String> by joining/concat - fn convert_to_string(inner_vec: &Vec<String>) -> String { - inner_vec[0..6].join(" ") + // Stringify EntryTableItem by joining/concat + fn convert_to_string(inner_vec: &EntryTableItem) -> String { + let entry_table_item_str = { + format!( + "{} {} {} {} {} {}", + &inner_vec.authors, + &inner_vec.title, + &inner_vec.year, + &inner_vec.pubtype, + &inner_vec.keywords, + &inner_vec.citekey + ) + }; + entry_table_item_str } // Return a filtered entry list pub fn search_entry_list( search_pattern: &str, - orig_list: Vec<Vec<String>>, - ) -> Vec<Vec<String>> { + orig_list: Vec<EntryTableItem>, + ) -> Vec<EntryTableItem> { // Create a hashmap to connect stingified entry with entry vec - let mut entry_string_hm: HashMap<String, Vec<String>> = HashMap::new(); + let mut entry_string_hm: HashMap<String, EntryTableItem> = HashMap::new(); // Convert all entries to string and insert them into the hashmap // next to the original inner Vec<String> of the entry list @@ -58,10 +73,11 @@ impl BibiSearch { // Create filtered entry list and push the inner entry vec's to it // Use the filtered stringified hm-key as index - let mut filtered_list: Vec<Vec<String>> = Vec::new(); + let mut filtered_list: Vec<EntryTableItem> = Vec::new(); for m in filtered_matches { filtered_list.push(entry_string_hm[&m].to_owned()); } + filtered_list.sort(); filtered_list } @@ -79,11 +95,17 @@ impl BibiSearch { filtered_matches } - pub fn filter_entries_by_tag(keyword: &str, orig_list: &Vec<Vec<String>>) -> Vec<Vec<String>> { - let mut filtered_list: Vec<Vec<String>> = Vec::new(); + pub fn filter_entries_by_tag( + keyword: &str, + orig_list: &Vec<EntryTableItem>, + ) -> Vec<EntryTableItem> { + let mut filtered_list: Vec<EntryTableItem> = Vec::new(); + // Loop over the whole given entry table + // Check if the selected keyword is present in the current entry + // If present, push the entry to the filtered list for e in orig_list { - if e[4].contains(keyword) { + if e.keywords.contains(keyword) { filtered_list.push(e.to_owned()); } } @@ -98,17 +120,17 @@ mod tests { #[test] fn test_vector_join() { - let bibvec = vec![ - "Author".to_string(), - "Title".to_string(), - "1999".to_string(), - "article".to_string(), - "hello, bye".to_string(), - "author_1999".to_string(), - "An abstract with multiple sentences. Sometimes thats necessary".to_string(), - "www.bibiman.org".to_string(), - "/home/file/path.pdf".to_string(), - ]; + let bibvec: EntryTableItem = EntryTableItem::new( + "Author", + "Title", + "1999", + "article", + "hello, bye", + "author_1999", + "An abstract with multiple sentences. Here is the second", + "https://www.bibiman.org", + "/home/file/path.pdf", + ); let joined_vec = BibiSearch::convert_to_string(&bibvec); |
