From 138468da3aabfcb6b6febc43f6d287e179f19ca9 Mon Sep 17 00:00:00 2001 From: Kishan Goli Date: Fri, 15 May 2026 13:19:17 -0700 Subject: [PATCH 1/2] abstract engine away from flatindex --- src/api/handlers.rs | 1 - src/engine.rs | 9 +++++---- src/state.rs | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/api/handlers.rs b/src/api/handlers.rs index 8f49e88..cd9b94b 100644 --- a/src/api/handlers.rs +++ b/src/api/handlers.rs @@ -2,7 +2,6 @@ use axum::{extract::State, Json}; use crate::{ api::response::{bad_request, ApiError, ApiResult}, - engine::VectorEngine, models::{ DeleteRequest, InsertRequest, MessageResponse, SearchRequest, SearchResponse, }, diff --git a/src/engine.rs b/src/engine.rs index cfacc0c..95fb00c 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -4,6 +4,7 @@ pub trait VectorEngine { fn insert(&mut self, id: String, vector: Vec); fn search(&self, query: Vec, k: usize) -> Vec; fn delete(&mut self, id: &str); + fn dimension(&self) -> Option; } #[derive(Default)] @@ -15,10 +16,6 @@ impl FlatIndex { pub fn new() -> Self { Self::default() } - - pub fn dimension(&self) -> Option { - self.vectors.first().map(|(_, vector)| vector.len()) - } } impl VectorEngine for FlatIndex { @@ -45,6 +42,10 @@ impl VectorEngine for FlatIndex { fn delete(&mut self, id: &str) { self.vectors.retain(|(stored_id, _)| stored_id != id); } + + fn dimension(&self) -> Option { + self.vectors.first().map(|(_, vector)| vector.len()) + } } fn cosine_similarity(left: &[f32], right: &[f32]) -> f32 { diff --git a/src/state.rs b/src/state.rs index ac3c248..9dd4b03 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,16 +1,16 @@ use std::sync::{Arc, Mutex}; -use crate::engine::FlatIndex; +use crate::engine::{FlatIndex, VectorEngine}; #[derive(Clone)] pub struct AppState { - pub engine: Arc>, + pub engine: Arc>>, } impl AppState { pub fn new() -> Self { Self { - engine: Arc::new(Mutex::new(FlatIndex::new())), + engine: Arc::new(Mutex::new(Box::new(FlatIndex::new()))), } } } From cf47132e73671f0d92b33afd28c47e4b5198dcb4 Mon Sep 17 00:00:00 2001 From: Kishan Goli Date: Fri, 15 May 2026 13:45:37 -0700 Subject: [PATCH 2/2] shell out c++ ffi --- Cargo.lock | 23 +++++++++++++++++++++++ Cargo.toml | 3 +++ build.rs | 8 ++++++++ native/include/vector_engine_ffi.h | 13 +++++++++++++ native/src/vector_engine_ffi.cpp | 11 +++++++++++ 5 files changed, 58 insertions(+) create mode 100644 build.rs create mode 100644 native/include/vector_engine_ffi.h create mode 100644 native/src/vector_engine_ffi.cpp diff --git a/Cargo.lock b/Cargo.lock index e8cd33c..a5089b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,6 +72,16 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +[[package]] +name = "cc" +version = "1.2.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +dependencies = [ + "find-msvc-tools", + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -88,6 +98,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -412,6 +428,12 @@ dependencies = [ "serde", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -548,6 +570,7 @@ name = "vectordb" version = "0.1.0" dependencies = [ "axum", + "cc", "serde", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 6165d87..ebcece7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,6 @@ edition = "2021" axum = "0.8" serde = { version = "1", features = ["derive"] } tokio = { version = "1", features = ["full"] } + +[build-dependencies] +cc = "1" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..33265f1 --- /dev/null +++ b/build.rs @@ -0,0 +1,8 @@ +fn main() { + cc::Build::new() + .cpp(true) + .file("native/src/vector_engine_ffi.cpp") + .include("native/include") + .std("c++17") + .compile("vector_engine_ffi"); +} diff --git a/native/include/vector_engine_ffi.h b/native/include/vector_engine_ffi.h new file mode 100644 index 0000000..f1996df --- /dev/null +++ b/native/include/vector_engine_ffi.h @@ -0,0 +1,13 @@ +#ifndef VECTOR_ENGINE_FFI_H +#define VECTOR_ENGINE_FFI_H + +struct NativeVectorEngine; + +extern "C" { + +NativeVectorEngine* native_vector_engine_new(); +void native_vector_engine_free(NativeVectorEngine* engine); + +} + +#endif diff --git a/native/src/vector_engine_ffi.cpp b/native/src/vector_engine_ffi.cpp new file mode 100644 index 0000000..138bfeb --- /dev/null +++ b/native/src/vector_engine_ffi.cpp @@ -0,0 +1,11 @@ +#include "vector_engine_ffi.h" + +struct NativeVectorEngine {}; + +extern "C" NativeVectorEngine* native_vector_engine_new() { + return new NativeVectorEngine(); +} + +extern "C" void native_vector_engine_free(NativeVectorEngine* engine) { + delete engine; +}