From 91db6909d1339dbcb51a4c421f0b79966a423597 Mon Sep 17 00:00:00 2001 From: Eric Ridge Date: Fri, 20 Dec 2024 10:35:16 -0500 Subject: [PATCH] Add a `payload: &mut (dyn Any + '_)` argument to `Directory::save_meta()` (#17) --- src/directory/directory.rs | 8 ++++++- src/directory/managed_directory.rs | 10 +++++++-- src/index/segment_component.rs | 36 +++++++++++++++++++++++++++++- src/indexer/segment_updater.rs | 2 +- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/directory/directory.rs b/src/directory/directory.rs index 0d4a4b9a9..c57720455 100644 --- a/src/directory/directory.rs +++ b/src/directory/directory.rs @@ -1,3 +1,4 @@ +use std::any::Any; use std::collections::HashSet; use std::io::Write; use std::path::{Path, PathBuf}; @@ -248,7 +249,12 @@ pub trait Directory: DirectoryClone + fmt::Debug + Send + Sync + 'static { } /// Allows the directory to save IndexMeta, overriding the SegmentUpdater's default save_meta - fn save_metas(&self, _metas: &IndexMeta, _previous_metas: &IndexMeta) -> crate::Result<()> { + fn save_metas( + &self, + _metas: &IndexMeta, + _previous_metas: &IndexMeta, + _payload: &mut (dyn Any + '_), + ) -> crate::Result<()> { Err(crate::TantivyError::InternalError( "save_meta not implemented".to_string(), )) diff --git a/src/directory/managed_directory.rs b/src/directory/managed_directory.rs index 1afb746f1..c274ba074 100644 --- a/src/directory/managed_directory.rs +++ b/src/directory/managed_directory.rs @@ -1,3 +1,4 @@ +use std::any::Any; use std::collections::HashSet; use std::io::Write; use std::path::{Path, PathBuf}; @@ -337,8 +338,13 @@ impl Directory for ManagedDirectory { Ok(()) } - fn save_metas(&self, metas: &IndexMeta, previous_metas: &IndexMeta) -> crate::Result<()> { - self.directory.save_metas(metas, previous_metas) + fn save_metas( + &self, + metas: &IndexMeta, + previous_metas: &IndexMeta, + payload: &mut (dyn Any + '_), + ) -> crate::Result<()> { + self.directory.save_metas(metas, previous_metas, payload) } fn load_metas(&self, inventory: &SegmentMetaInventory) -> crate::Result { diff --git a/src/index/segment_component.rs b/src/index/segment_component.rs index 42ac1d178..6e44a4727 100644 --- a/src/index/segment_component.rs +++ b/src/index/segment_component.rs @@ -1,3 +1,4 @@ +use std::fmt::{Display, Formatter}; use std::slice; /// Enum describing each component of a tantivy segment. @@ -5,7 +6,7 @@ use std::slice; /// Each component is stored in its own file, /// using the pattern `segment_uuid`.`component_extension`, /// except the delete component that takes an `segment_uuid`.`delete_opstamp`.`component_extension` -#[derive(Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)] pub enum SegmentComponent { /// Postings (or inverted list). Sorted lists of document ids, associated with terms Postings, @@ -30,6 +31,39 @@ pub enum SegmentComponent { Delete, } +impl TryFrom<&str> for SegmentComponent { + type Error = String; + + fn try_from(value: &str) -> Result { + match value { + "idx" => Ok(SegmentComponent::Postings), + "pos" => Ok(SegmentComponent::Positions), + "term" => Ok(SegmentComponent::Terms), + "store" => Ok(SegmentComponent::Store), + "temp" => Ok(SegmentComponent::TempStore), + "fast" => Ok(SegmentComponent::FastFields), + "fieldnorm" => Ok(SegmentComponent::FieldNorms), + "del" => Ok(SegmentComponent::Delete), + other => Err(other.to_string()), + } + } +} + +impl Display for SegmentComponent { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + SegmentComponent::Postings => write!(f, "idx"), + SegmentComponent::Positions => write!(f, "pos"), + SegmentComponent::FastFields => write!(f, "fast"), + SegmentComponent::FieldNorms => write!(f, "fieldnorm"), + SegmentComponent::Terms => write!(f, "term"), + SegmentComponent::Store => write!(f, "store"), + SegmentComponent::TempStore => write!(f, "temp"), + SegmentComponent::Delete => write!(f, "del"), + } + } +} + impl SegmentComponent { /// Iterates through the components. pub fn iterator() -> slice::Iter<'static, SegmentComponent> { diff --git a/src/indexer/segment_updater.rs b/src/indexer/segment_updater.rs index fdf1b6b2b..dc4f189ed 100644 --- a/src/indexer/segment_updater.rs +++ b/src/indexer/segment_updater.rs @@ -42,7 +42,7 @@ pub(crate) fn save_metas( ) -> crate::Result<()> { info!("save metas"); - match directory.save_metas(metas, previous_metas) { + match directory.save_metas(metas, previous_metas, &mut ()) { Ok(_) => Ok(()), Err(crate::TantivyError::InternalError(_)) => { let mut buffer = serde_json::to_vec_pretty(metas)?;