use std::sync::Arc;
use crate::error::Result;
use crate::lexical::index::LexicalIndex;
use crate::lexical::index::inverted::InvertedIndex;
use crate::lexical::store::config::LexicalIndexConfig;
use crate::storage::Storage;
pub struct LexicalIndexFactory;
impl LexicalIndexFactory {
pub fn create(
storage: Arc<dyn Storage>,
config: LexicalIndexConfig,
) -> Result<Box<dyn LexicalIndex>> {
match config {
LexicalIndexConfig::Inverted(inverted_config) => {
let index = InvertedIndex::create(storage, inverted_config)?;
Ok(Box::new(index))
} }
}
pub fn open(
storage: Arc<dyn Storage>,
config: LexicalIndexConfig,
) -> Result<Box<dyn LexicalIndex>> {
match config {
LexicalIndexConfig::Inverted(inverted_config) => {
let index = InvertedIndex::open(storage, inverted_config)?;
Ok(Box::new(index))
} }
}
pub fn open_or_create(
storage: Arc<dyn Storage>,
config: LexicalIndexConfig,
) -> Result<Box<dyn LexicalIndex>> {
match config {
LexicalIndexConfig::Inverted(inverted_config) => {
let index = InvertedIndex::open_or_create(storage, inverted_config)?;
Ok(Box::new(index))
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::lexical::store::config::LexicalIndexConfig;
use crate::storage::memory::MemoryStorage;
use crate::storage::memory::MemoryStorageConfig;
#[test]
fn test_lexical_index_creation() {
let config = LexicalIndexConfig::default();
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let index = LexicalIndexFactory::create(storage, config).unwrap();
assert!(!index.is_closed());
}
#[test]
fn test_lexical_index_open() {
let config = LexicalIndexConfig::default();
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let index = LexicalIndexFactory::create(storage.clone(), config.clone()).unwrap();
index.close().unwrap();
let index = LexicalIndexFactory::open(storage, config).unwrap();
assert!(!index.is_closed());
}
#[test]
fn test_lexical_index_stats() {
let config = LexicalIndexConfig::default();
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let index = LexicalIndexFactory::create(storage, config).unwrap();
let stats = index.stats().unwrap();
assert_eq!(stats.doc_count, 0);
assert_eq!(stats.term_count, 0);
assert_eq!(stats.segment_count, 0);
assert_eq!(stats.deleted_count, 0);
assert!(stats.last_modified > 0);
}
#[test]
fn test_lexical_index_close() {
let config = LexicalIndexConfig::default();
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let index = LexicalIndexFactory::create(storage, config).unwrap();
assert!(!index.is_closed());
index.close().unwrap();
assert!(index.is_closed());
let result = index.stats();
assert!(result.is_err());
}
#[test]
fn test_lexical_index_config() {
let config = LexicalIndexConfig::default();
match config {
LexicalIndexConfig::Inverted(inverted) => {
assert_eq!(inverted.max_docs_per_segment, 1000000);
assert_eq!(inverted.write_buffer_size, 1024 * 1024);
assert!(!inverted.compress_stored_fields);
assert!(!inverted.store_term_vectors);
assert_eq!(inverted.merge_factor, 10);
assert_eq!(inverted.max_segments, 100);
}
}
}
#[test]
fn test_factory_create() {
let storage = Arc::new(MemoryStorage::new(MemoryStorageConfig::default()));
let config = LexicalIndexConfig::default();
let index = LexicalIndexFactory::create(storage, config).unwrap();
assert!(!index.is_closed());
}
}