use crate::error_chirho::ResultChirho;
use super::SearchEngineChirho;
#[derive(Debug, Clone)]
pub struct SearchResultEntryChirho {
pub reference_chirho: String,
pub text_chirho: String,
pub score_chirho: f32,
}
#[derive(Debug, Clone, Default)]
pub struct SearchQueryOptionsChirho {
pub case_insensitive_chirho: bool,
pub max_results_chirho: Option<usize>,
pub scope_chirho: Option<String>,
pub fuzzy_chirho: bool,
pub fuzzy_distance_chirho: u8,
}
impl SearchQueryOptionsChirho {
pub fn new_chirho() -> Self {
Self::default()
}
pub fn case_insensitive_chirho(mut self, value_chirho: bool) -> Self {
self.case_insensitive_chirho = value_chirho;
self
}
pub fn max_results_chirho(mut self, max_chirho: usize) -> Self {
self.max_results_chirho = Some(max_chirho);
self
}
pub fn scope_chirho(mut self, scope_chirho: &str) -> Self {
self.scope_chirho = Some(scope_chirho.to_string());
self
}
pub fn fuzzy_chirho(mut self, distance_chirho: u8) -> Self {
self.fuzzy_chirho = true;
self.fuzzy_distance_chirho = distance_chirho.min(2);
self
}
}
pub trait SearchBackendChirho: Send + Sync {
fn module_name_chirho(&self) -> &str;
fn has_index_chirho(&self) -> bool;
fn create_index_chirho(&mut self) -> ResultChirho<()>;
fn delete_index_chirho(&mut self) -> ResultChirho<()>;
fn search_chirho(
&self,
query_chirho: &str,
options_chirho: &SearchQueryOptionsChirho,
) -> ResultChirho<Vec<SearchResultEntryChirho>>;
fn document_count_chirho(&self) -> usize {
0
}
}
#[cfg(feature = "native")]
pub fn get_default_search_backend_chirho(
module_path_chirho: &std::path::Path,
module_name_chirho: &str,
) -> ResultChirho<Box<dyn SearchBackendChirho>> {
match super::TantivySearchChirho::new_chirho(module_path_chirho) {
Ok(tantivy_chirho) => Ok(Box::new(TantivySearchBackendChirho::new_chirho(
tantivy_chirho,
module_name_chirho.to_string(),
))),
Err(_) => Ok(Box::new(RegexSearchBackendChirho::new_chirho(
module_path_chirho.to_path_buf(),
module_name_chirho.to_string(),
))),
}
}
#[cfg(not(feature = "native"))]
pub fn get_default_search_backend_chirho(
module_path_chirho: &std::path::Path,
module_name_chirho: &str,
) -> ResultChirho<Box<dyn SearchBackendChirho>> {
Ok(Box::new(RegexSearchBackendChirho::new_chirho(
module_path_chirho.to_path_buf(),
module_name_chirho.to_string(),
)))
}
#[cfg(feature = "native")]
pub struct TantivySearchBackendChirho {
inner_chirho: super::TantivySearchChirho,
module_name_chirho: String,
}
#[cfg(feature = "native")]
impl TantivySearchBackendChirho {
pub fn new_chirho(tantivy_chirho: super::TantivySearchChirho, module_name_chirho: String) -> Self {
Self {
inner_chirho: tantivy_chirho,
module_name_chirho,
}
}
}
#[cfg(feature = "native")]
impl SearchBackendChirho for TantivySearchBackendChirho {
fn module_name_chirho(&self) -> &str {
&self.module_name_chirho
}
fn has_index_chirho(&self) -> bool {
self.inner_chirho.has_index_chirho()
}
fn create_index_chirho(&mut self) -> ResultChirho<()> {
use super::SearchEngineChirho;
self.inner_chirho.create_index_chirho()
}
fn delete_index_chirho(&mut self) -> ResultChirho<()> {
use super::SearchEngineChirho;
self.inner_chirho.delete_index_chirho()
}
fn search_chirho(
&self,
query_chirho: &str,
options_chirho: &SearchQueryOptionsChirho,
) -> ResultChirho<Vec<SearchResultEntryChirho>> {
use super::{SearchOptionsChirho, SearchTypeChirho};
let mut opts_chirho = SearchOptionsChirho::new_chirho()
.case_insensitive_chirho(options_chirho.case_insensitive_chirho);
if let Some(max_chirho) = options_chirho.max_results_chirho {
opts_chirho = opts_chirho.with_max_results_chirho(max_chirho);
}
if let Some(ref scope_chirho) = options_chirho.scope_chirho {
opts_chirho = opts_chirho.with_scope_chirho(scope_chirho);
}
if options_chirho.fuzzy_chirho {
opts_chirho = opts_chirho
.with_type_chirho(SearchTypeChirho::FuzzyChirho)
.with_fuzzy_chirho(options_chirho.fuzzy_distance_chirho);
}
let list_key_chirho = SearchEngineChirho::search_chirho(&self.inner_chirho, query_chirho, &opts_chirho)?;
let total_chirho = list_key_chirho.count_chirho();
let results_chirho: Vec<SearchResultEntryChirho> = list_key_chirho
.iter_chirho()
.enumerate()
.map(|(i_chirho, key_chirho)| SearchResultEntryChirho {
reference_chirho: key_chirho.get_text_chirho().to_string(),
text_chirho: String::new(), score_chirho: if total_chirho > 0 {
1.0 - (i_chirho as f32 / total_chirho as f32)
} else {
1.0
},
})
.collect();
Ok(results_chirho)
}
fn document_count_chirho(&self) -> usize {
0
}
}
pub struct RegexSearchBackendChirho {
#[allow(dead_code)]
module_path_chirho: std::path::PathBuf,
module_name_chirho: String,
}
impl RegexSearchBackendChirho {
pub fn new_chirho(
module_path_chirho: std::path::PathBuf,
module_name_chirho: String,
) -> Self {
Self {
module_path_chirho,
module_name_chirho,
}
}
}
impl SearchBackendChirho for RegexSearchBackendChirho {
fn module_name_chirho(&self) -> &str {
&self.module_name_chirho
}
fn has_index_chirho(&self) -> bool {
true
}
fn create_index_chirho(&mut self) -> ResultChirho<()> {
Ok(())
}
fn delete_index_chirho(&mut self) -> ResultChirho<()> {
Ok(())
}
fn search_chirho(
&self,
query_chirho: &str,
options_chirho: &SearchQueryOptionsChirho,
) -> ResultChirho<Vec<SearchResultEntryChirho>> {
use super::{RegexSearchChirho, SearchOptionsChirho};
let search_chirho = RegexSearchChirho::new_chirho();
let mut opts_chirho = SearchOptionsChirho::new_chirho()
.case_insensitive_chirho(options_chirho.case_insensitive_chirho);
if let Some(max_chirho) = options_chirho.max_results_chirho {
opts_chirho = opts_chirho.with_max_results_chirho(max_chirho);
}
if let Some(ref scope_chirho) = options_chirho.scope_chirho {
opts_chirho = opts_chirho.with_scope_chirho(scope_chirho);
}
let list_key_chirho = SearchEngineChirho::search_chirho(&search_chirho, query_chirho, &opts_chirho)?;
let results_chirho: Vec<SearchResultEntryChirho> = list_key_chirho
.iter_chirho()
.map(|key_chirho| SearchResultEntryChirho {
reference_chirho: key_chirho.get_text_chirho().to_string(),
text_chirho: String::new(),
score_chirho: 1.0, })
.collect();
Ok(results_chirho)
}
}
#[cfg(test)]
mod tests_chirho {
use super::*;
#[test]
fn test_search_query_options_builder_chirho() {
let opts_chirho = SearchQueryOptionsChirho::new_chirho()
.case_insensitive_chirho(true)
.max_results_chirho(50)
.scope_chirho("NT")
.fuzzy_chirho(1);
assert!(opts_chirho.case_insensitive_chirho);
assert_eq!(opts_chirho.max_results_chirho, Some(50));
assert_eq!(opts_chirho.scope_chirho, Some("NT".to_string()));
assert!(opts_chirho.fuzzy_chirho);
assert_eq!(opts_chirho.fuzzy_distance_chirho, 1);
}
#[test]
fn test_search_result_entry_chirho() {
let result_chirho = SearchResultEntryChirho {
reference_chirho: "John 3:16".to_string(),
text_chirho: "For God so loved...".to_string(),
score_chirho: 0.95,
};
assert_eq!(result_chirho.reference_chirho, "John 3:16");
assert_eq!(result_chirho.score_chirho, 0.95);
}
}