From 12b67d9d67d0e3256f6ddc8bc47572f6a178df4c Mon Sep 17 00:00:00 2001 From: lukeflo Date: Sat, 12 Oct 2024 21:34:12 +0200 Subject: reworked search mechanism --- src/backend/search.rs | 64 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 21 deletions(-) (limited to 'src/backend/search.rs') 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, pub filtered_entry_list_by_search: Vec>, // Temporary holds entry list filtered by search pattern to refilter it pub filtered_entry_list_by_tags: Vec>, // Holds entry list filtered by tag to filter it further by search pub filtered_tag_list: Vec, @@ -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 by joining/concat - fn convert_to_string(inner_vec: &Vec) -> 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> { + orig_list: Vec, + ) -> Vec { // Create a hashmap to connect stingified entry with entry vec - let mut entry_string_hm: HashMap> = HashMap::new(); + let mut entry_string_hm: HashMap = HashMap::new(); // Convert all entries to string and insert them into the hashmap // next to the original inner Vec 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::new(); + let mut filtered_list: Vec = 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> { - let mut filtered_list: Vec> = Vec::new(); + pub fn filter_entries_by_tag( + keyword: &str, + orig_list: &Vec, + ) -> Vec { + let mut filtered_list: Vec = 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); -- cgit v1.2.3