omendb_core/
lib.rs

1#![feature(portable_simd)]
2// Allow retpoline cfg values from multiversion crate's target feature detection
3#![allow(unexpected_cfgs)]
4#![warn(clippy::pedantic)]
5#![allow(
6    // Naming
7    clippy::module_name_repetitions,
8    clippy::similar_names,
9    clippy::many_single_char_names, // FHT algorithm uses standard math notation (n, h, i, j, a, b)
10    // Casts - numeric conversions are validated at API boundaries
11    clippy::cast_possible_truncation,
12    clippy::cast_precision_loss,
13    clippy::cast_sign_loss,
14    clippy::cast_lossless,
15    // Documentation - errors/panics are clear from context
16    clippy::missing_errors_doc,
17    clippy::missing_panics_doc,
18    clippy::doc_markdown,              // Math notation in docs doesn't need backticks
19    // Design choices
20    clippy::unsafe_derive_deserialize, // Serde derive is safe, unsafe methods are for SIMD/RNG
21    clippy::too_many_lines,            // Complex functions (batch_insert, load_from_disk) are well-structured
22    clippy::needless_pass_by_value,    // Public API takes owned values for clarity and storage
23    clippy::inline_always,             // Hot path functions are intentionally force-inlined
24    clippy::items_after_statements,    // Local items near usage improve readability
25    clippy::ptr_as_ptr,                // Raw pointer casts in SIMD code are intentional
26    clippy::borrow_as_ptr,             // Borrowing as raw pointer is intentional in prefetch code
27    clippy::manual_let_else,           // Match pattern is clearer in some contexts
28    clippy::ref_as_ptr,                // Reference to raw pointer is intentional in prefetch code
29    clippy::needless_borrow            // Explicit borrows clarify ownership in some contexts
30)]
31
32//! Fast embedded vector database with HNSW indexing.
33//!
34//! # Quick Start
35//!
36//! ```rust
37//! use omendb::{Vector, VectorStore};
38//! use serde_json::json;
39//!
40//! // Create store (128-dimensional vectors)
41//! let mut store = VectorStore::new(128);
42//!
43//! // Insert vectors with metadata
44//! store.set("doc1".into(), Vector::new(vec![1.0; 128]), json!({"type": "article"})).unwrap();
45//! store.set("doc2".into(), Vector::new(vec![0.9; 128]), json!({"type": "note"})).unwrap();
46//!
47//! // Search
48//! let query = Vector::new(vec![1.0; 128]);
49//! let results = store.knn_search(&query, 2).unwrap();
50//! // results: [(0, 0.0), (1, 1.13)] - (index, distance)
51//!
52//! // Get by ID
53//! let (vec, metadata) = store.get("doc1").unwrap();
54//! ```
55//!
56//! # Filtered Search (ACORN-1)
57//!
58//! ```rust
59//! use omendb::{MetadataFilter, Vector, VectorStore};
60//! use serde_json::json;
61//!
62//! let mut store = VectorStore::new(64);
63//! store.set("a".into(), Vector::new(vec![0.1; 64]), json!({"year": 2024})).unwrap();
64//! store.set("b".into(), Vector::new(vec![0.2; 64]), json!({"year": 2023})).unwrap();
65//!
66//! let query = Vector::new(vec![0.1; 64]);
67//! let filter = MetadataFilter::Gte("year".into(), 2024.0);
68//! let results = store.knn_search_with_filter(&query, 10, &filter).unwrap();
69//! // Only returns vectors where year >= 2024
70//! ```
71//!
72//! # Persistence
73//!
74//! ```rust,no_run
75//! use omendb::VectorStore;
76//!
77//! // Open or create persistent store
78//! let mut store = VectorStore::open_with_dimensions("./vectors", 128).unwrap();
79//!
80//! // ... insert vectors ...
81//!
82//! // Save (also auto-saves on drop)
83//! store.flush().unwrap();
84//!
85//! // Reopen later
86//! let store = VectorStore::open("./vectors").unwrap();
87//! ```
88
89// Core modules
90pub mod compression;
91pub mod config;
92pub mod distance;
93pub mod omen;
94pub mod text;
95pub mod types;
96pub mod vector;
97
98#[cfg(feature = "ffi")]
99pub mod ffi;
100
101// Re-export core types
102pub use compression::{ADCTable, QuantizedVector, QueryPrep, RaBitQ, RaBitQParams, ScalarParams};
103pub use distance::{cosine_distance, dot_product, l2_distance, l2_distance_squared};
104pub use types::{
105    CompactionStats, CompressionTier, DistanceMetric, OmenDBError, Result, SearchResult,
106    StorageTier, VectorID,
107};
108pub use vector::{MetadataFilter, Vector, VectorStore, VectorStoreOptions};
109
110// Re-export storage types
111pub use config::StorageConfig;