victor-db 0.1.1

A browser-optimized vector database
Documentation
use crate::memory::{Db, DirectoryHandle};

#[tokio::test]
async fn store_and_retrieve() {
    let embedding = vec![1.0, 2.0, 3.0];

    let mut victor = Db::new(DirectoryHandle::new());

    victor.write("hello", embedding.clone(), vec![]).await;

    let result = victor
        .find_nearest_neighbor(embedding, vec![])
        .await
        .unwrap()
        .content;

    assert_eq!(result, "hello".to_string());
}

#[tokio::test]
async fn store_two_and_retrieve() {
    let embedding_1 = vec![1.0, 2.0, 3.0];
    let embedding_2 = vec![-1.0, -2.0, -3.0];

    let mut victor = Db::new(DirectoryHandle::new());

    victor.write("hello", embedding_1.clone(), vec![]).await;
    victor.write("goodbye", embedding_2.clone(), vec![]).await;

    {
        let result = victor
            .find_nearest_neighbor(embedding_1, vec![])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "hello".to_string());
    }
    {
        let result = victor
            .find_nearest_neighbor(embedding_2, vec![])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "goodbye".to_string());
    }
}

#[tokio::test]
async fn store_two_and_retrieve_with_tags() {
    let embedding_1 = vec![1.0, 2.0, 3.0];
    let embedding_2 = vec![-1.0, -2.0, -3.0];

    let mut victor = Db::new(DirectoryHandle::new());

    victor
        .write("hello", embedding_1.clone(), vec!["greetings".to_string()])
        .await;
    victor
        .write("goodbye", embedding_2.clone(), vec!["goodbyes".to_string()])
        .await;

    {
        let result = victor
            .find_nearest_neighbor(embedding_1.clone(), vec![])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "hello".to_string());
    }
    {
        let result = victor
            .find_nearest_neighbor(embedding_2.clone(), vec![])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "goodbye".to_string());
    }

    {
        let result = victor
            .find_nearest_neighbor(embedding_1.clone(), vec!["goodbyes".to_string()])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "goodbye".to_string());
    }
    {
        let result = victor
            .find_nearest_neighbor(embedding_2, vec!["greetings".to_string()])
            .await
            .unwrap()
            .content;

        assert_eq!(result, "hello".to_string());
    }
    {
        let result = victor
            .find_nearest_neighbor(embedding_1, vec!["mysterious".to_string()])
            .await;

        assert_eq!(result, None);
    }
}

#[should_panic]
#[tokio::test]
async fn incompatible_size_panic() {
    let embedding_1 = vec![1.0, 2.0, 3.0];
    let embedding_2 = vec![1.0, 2.0, 3.0, 4.0];

    let mut victor = Db::new(DirectoryHandle::new());

    victor.write("hello", embedding_1, vec![]).await;
    victor.write("hello", embedding_2, vec![]).await;
}