use std::io;
use std::sync::Arc;
use crate::document::Document;
use crate::index::config::IndexWriterConfig;
use crate::index::pipeline::coordinator::IndexCoordinator;
use crate::index::pipeline::default_worker_factory::DefaultWorkerFactory;
use crate::index::pipeline::id_generator::RandomIdGenerator;
use crate::index::segment::FlushedSegment;
use crate::store::SharedDirectory;
pub struct IndexWriter {
coordinator: IndexCoordinator,
directory: SharedDirectory,
}
impl IndexWriter {
pub fn new(config: IndexWriterConfig, directory: SharedDirectory) -> Self {
let factory = Arc::new(DefaultWorkerFactory::new(
Arc::clone(&directory),
Arc::clone(config.get_analyzer_factory()),
));
let coordinator = IndexCoordinator::new(
&config,
Box::new(RandomIdGenerator),
Arc::clone(&directory),
factory,
);
Self {
coordinator,
directory,
}
}
pub fn directory(&self) -> &SharedDirectory {
&self.directory
}
pub fn add_document(&self, mut doc: Document) -> io::Result<()> {
log::debug!("add_document: {} fields", doc.fields().len());
self.coordinator.add_document(doc)
}
pub fn commit(self) -> io::Result<Vec<FlushedSegment>> {
self.coordinator.shutdown()
}
}