use std::borrow::Cow;
use std::fmt::Debug;
use std::path::{Path, PathBuf};
use crate::common::counter::hardware_counter::HardwareCounterCell;
use crate::common::storage_version::StorageVersion;
use crate::common::types::PointOffsetType;
use crate::common::universal_io::{Result, UniversalIoError};
use super::posting_list_common::PostingListIter;
use crate::sparse::SearchScratchArena;
use crate::sparse::common::sparse_vector::RemappedSparseVector;
use crate::sparse::common::types::DimOffset;
use crate::sparse::index::inverted_index::inverted_index_ram::InvertedIndexRam;
pub mod inverted_index_compressed_immutable_ram;
pub mod inverted_index_compressed_mmap;
pub mod inverted_index_ram;
pub mod inverted_index_ram_builder;
pub const INDEX_FILE_NAME: &str = "inverted_index.dat";
pub trait InvertedIndex: Sized + Debug + 'static {
type Iter<'a>: PostingListIter + Clone
where
Self: 'a;
type Version: StorageVersion;
fn is_on_disk(&self) -> bool;
fn open(path: &Path) -> Result<Self>;
fn save(&self, path: &Path) -> Result<()>;
fn get<'a>(
&'a self,
id: DimOffset,
arena: &'a SearchScratchArena,
hw_counter: &'a HardwareCounterCell,
) -> Result<Self::Iter<'a>>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn posting_list_len(&self, id: DimOffset, hw_counter: &HardwareCounterCell) -> Result<usize>;
fn files(path: &Path) -> Vec<PathBuf>;
fn immutable_files(path: &Path) -> Vec<PathBuf>;
fn remove(&mut self, id: PointOffsetType, old_vector: RemappedSparseVector);
fn upsert(
&mut self,
id: PointOffsetType,
vector: RemappedSparseVector,
old_vector: Option<RemappedSparseVector>,
);
fn from_ram_index<P: AsRef<Path>>(ram_index: Cow<InvertedIndexRam>, path: P) -> Result<Self>;
fn vector_count(&self) -> usize;
fn total_sparse_vectors_size(&self) -> usize;
fn max_index(&self) -> Option<DimOffset>;
}
pub(crate) fn out_of_bounds(id: DimOffset, len: usize) -> UniversalIoError {
UniversalIoError::Io(std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!("DimOffset {id} out of bounds. Index contains {len} posting lists."),
))
}
pub(crate) fn corrupted_index() -> UniversalIoError {
UniversalIoError::Io(std::io::Error::new(
std::io::ErrorKind::InvalidData,
"Sparse index is corrupted",
))
}