From 0f9331ba609adbf864ffc336a8a259d03efec14d Mon Sep 17 00:00:00 2001 From: tretrauit Date: Mon, 8 Jan 2024 12:44:04 +0700 Subject: [PATCH] feat: introduce querying card with partial match using regex --- swordfish-common/src/database/katana.rs | 47 ++++++++++++++++++++++++- swordfish/src/katana.rs | 22 +++++++++--- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/swordfish-common/src/database/katana.rs b/swordfish-common/src/database/katana.rs index 144f0d7..5b4b10e 100644 --- a/swordfish-common/src/database/katana.rs +++ b/swordfish-common/src/database/katana.rs @@ -25,7 +25,7 @@ pub fn init() { .unwrap(); } -pub async fn query_card(name: &str, series: &str) -> Option { +pub async fn query_card(name: &String, series: &String) -> Option { KATANA .get() .unwrap() @@ -40,6 +40,51 @@ pub async fn query_card(name: &str, series: &str) -> Option { .unwrap() } +pub async fn query_card_regex(name: &String, series: &String) -> Option { + let mut name_regex = String::new(); + let mut ascii_name = String::new(); + for c in name.chars() { + if c.is_ascii_alphanumeric() { + ascii_name.push(c); + } else { + ascii_name.push(' '); + } + } + ascii_name.split_whitespace().for_each(|word| { + name_regex.push_str("(?=.*\\b"); + name_regex.push_str(word.to_lowercase().as_str()); + name_regex.push_str("\\b)"); + }); + name_regex.push_str(".+"); + let mut series_regex = String::new(); + let mut ascii_series = String::new(); + for c in series.chars() { + if c.is_ascii_alphanumeric() { + ascii_series.push(c); + } else { + ascii_series.push(' '); + } + } + ascii_series.split_whitespace().for_each(|word| { + series_regex.push_str("(?=.*\\b"); + series_regex.push_str(word.to_lowercase().as_str()); + series_regex.push_str("\\b)"); + }); + series_regex.push_str(".+"); + KATANA + .get() + .unwrap() + .find_one( + mongodb::bson::doc! { + "name": {"$regex": name_regex, "$options" : "i"}, + "series": {"$regex": series_regex, "$options" : "i"} + }, + None, + ) + .await + .unwrap() +} + pub async fn write_card(mut card: Card) -> Result<(), String> { let old_card = KATANA .get() diff --git a/swordfish/src/katana.rs b/swordfish/src/katana.rs index a1a7385..7a8ea51 100644 --- a/swordfish/src/katana.rs +++ b/swordfish/src/katana.rs @@ -253,11 +253,18 @@ pub async fn analyze_card_libtesseract(card: image::DynamicImage, count: u32) -> last_update_ts: 0, }; // Read the wishlist number - match db::query_card(&card.name.as_str(), &card.series.as_str()).await { + match db::query_card(&card.name, &card.series).await { Some(c) => { card = c; } - None => {} + None => { + match db::query_card_regex(&card.name, &card.series).await { + Some(c) => { + card = c; + } + None => {} + } + } } card } @@ -312,11 +319,18 @@ pub async fn analyze_card_subprocess(card: image::DynamicImage, count: u32) -> C last_update_ts: 0, }; // Read the wishlist number - match db::query_card(&card.name.as_str(), &card.series.as_str()).await { + match db::query_card(&card.name, &card.series).await { Some(c) => { card = c; } - None => {} + None => { + match db::query_card_regex(&card.name, &card.series).await { + Some(c) => { + card = c; + } + None => {} + } + } } card }