#![deny(warnings)]
#![deny(missing_docs)]
#![deny(unsafe_op_in_unsafe_fn)]
#![deny(unused_must_use)]
#![deny(unused_results)]
#![deny(clippy::unwrap_used)]
#![deny(clippy::expect_used)]
#![deny(clippy::todo)]
#![deny(clippy::unimplemented)]
#![deny(clippy::print_stdout)]
#![deny(clippy::print_stderr)]
#![deny(clippy::dbg_macro)]
#![deny(clippy::unreachable)]
#![deny(clippy::undocumented_unsafe_blocks)]
#![forbid(unsafe_code)]
#![cfg_attr(docsrs, feature(doc_cfg))]
mod cached;
mod config;
mod key;
mod ordered;
mod policy;
mod stats;
mod sync;
pub use crate::cached::CachedIndex;
pub use crate::config::{CacheConfig, EvictionPolicy};
pub use crate::stats::CacheStats;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
#[doc(hidden)]
pub mod doc_stub {
use std::sync::Arc;
use iqdb_index::{Index, IndexCore, IndexStats};
use iqdb_types::{DistanceMetric, Hit, IqdbError, Metadata, Result, SearchParams, VectorId};
pub struct DocStub {
ids: Vec<VectorId>,
}
#[must_use]
pub fn stub_index() -> DocStub {
DocStub {
ids: vec![VectorId::from(1u64)],
}
}
impl IndexCore for DocStub {
fn insert(&mut self, id: VectorId, _v: Arc<[f32]>, _m: Option<Metadata>) -> Result<()> {
self.ids.push(id);
Ok(())
}
fn delete(&mut self, id: &VectorId) -> Result<()> {
match self.ids.iter().position(|x| x == id) {
Some(pos) => {
let _removed = self.ids.remove(pos);
Ok(())
}
None => Err(IqdbError::NotFound),
}
}
fn search(&self, _q: &[f32], params: &SearchParams) -> Result<Vec<Hit>> {
Ok(self
.ids
.iter()
.take(params.k)
.map(|id| Hit::new(id.clone(), 0.0))
.collect())
}
fn len(&self) -> usize {
self.ids.len()
}
fn dim(&self) -> usize {
3
}
fn metric(&self) -> DistanceMetric {
DistanceMetric::Cosine
}
fn flush(&mut self) -> Result<()> {
Ok(())
}
fn stats(&self) -> IndexStats {
IndexStats {
n_vectors: self.ids.len(),
index_type: "doc_stub",
..IndexStats::default()
}
}
}
impl Index for DocStub {
type Config = ();
fn new(_dim: usize, _metric: DistanceMetric, _config: Self::Config) -> Result<Self> {
Ok(DocStub { ids: Vec::new() })
}
}
}