From d6866e2068923239f994d31f1d5533cbbd04e61a Mon Sep 17 00:00:00 2001 From: Berin Aniesh Date: Thu, 11 Jul 2024 07:14:36 +0530 Subject: [PATCH] add whole words only setting to search endpoint --- src/models.rs | 1 + src/routes.rs | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/models.rs b/src/models.rs index e5d13f0..c2df8e4 100644 --- a/src/models.rs +++ b/src/models.rs @@ -145,6 +145,7 @@ pub struct TranslationSelector { pub struct SearchParameters { pub search_text: String, pub match_case: Option, + pub whole_words: Option, pub translation: String, pub book: Option, pub abbreviation: Option, diff --git a/src/routes.rs b/src/routes.rs index 3057085..2fcbb38 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -392,13 +392,24 @@ pub async fn search(search_parameters: web::Json, app_data: we let mut qb: QueryBuilder = QueryBuilder::new(r#" SELECT translation, book, abbreviation, book_name, chapter, verse_number, verse from fulltable where verse "#); let match_case = search_parameters.match_case.unwrap_or(false); - if match_case { - qb.push("like "); + let whole_words = search_parameters.whole_words.unwrap_or(false); + if whole_words { + if match_case { + qb.push("~ "); + } else { + qb.push("~* "); + } + let actual_search_string = format!(r#"\m{}\M"#, &search_parameters.search_text); + qb.push_bind(actual_search_string); } else { - qb.push("ilike "); + if match_case { + qb.push("like "); + } else { + qb.push("ilike "); + } + let actual_search_string = format!("%{}%", &search_parameters.search_text); + qb.push_bind(actual_search_string); } - let actual_search_string = format!("%{}%", &search_parameters.search_text); - qb.push_bind(actual_search_string); qb.push(" and translation="); qb.push_bind(search_parameters.translation.to_uppercase()); if let Some(book) = &search_parameters.book {