ruve-db 0.1.1

A hybrid vector and full-text search database with HNSW approximate nearest-neighbour indexing and BM25
Documentation
use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Debug, Serialize, Deserialize)]
pub struct Record {
    pub id: String,
    pub vector: Vec<f32>,
    pub metadata: Option<String>,
}

impl Record {
    pub fn new(vector: Vec<f32>, metadata: Option<String>, id: Option<String>) -> Self {
        Record {
            id: match id {
                Some(id) => id,
                _ => Uuid::now_v7().to_string()
            },
            vector,
            metadata
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn auto_generates_uuid_when_no_id_given() {
        let r = Record::new(vec![1.0], None, None);
        assert!(!r.id.is_empty());
    }

    #[test]
    fn uses_custom_id_when_provided() {
        let r = Record::new(vec![1.0], None, Some("my-key".to_string()));
        assert_eq!(r.id, "my-key");
    }

    #[test]
    fn two_auto_generated_ids_are_distinct() {
        let r1 = Record::new(vec![1.0], None, None);
        let r2 = Record::new(vec![1.0], None, None);
        assert_ne!(r1.id, r2.id);
    }

    #[test]
    fn metadata_and_vector_are_stored() {
        let r = Record::new(vec![1.0, 2.0], Some("hello".to_string()), None);
        assert_eq!(r.vector, vec![1.0, 2.0]);
        assert_eq!(r.metadata.as_deref(), Some("hello"));
    }
}