hnsw indexing ops

main
Ziyang Hu 1 year ago
parent ef92dd62f4
commit f10cbfe019

@ -95,7 +95,7 @@ pub(crate) enum ColType {
Validity,
}
#[derive(Debug, Clone, Eq, PartialEq, serde_derive::Deserialize, serde_derive::Serialize)]
#[derive(Debug, Clone, Eq, PartialEq, Hash, serde_derive::Deserialize, serde_derive::Serialize)]
pub(crate) enum VecElementType {
F32,
F64,

@ -14,6 +14,7 @@ use miette::{ensure, miette, Diagnostic, Result};
use thiserror::Error;
use crate::data::program::InputProgram;
use crate::data::relation::VecElementType;
use crate::data::symb::Symbol;
use crate::data::value::{DataValue, ValidityTs};
use crate::parse::expr::build_expr;
@ -36,10 +37,38 @@ pub(crate) enum SysOp {
SetTriggers(Symbol, Vec<String>, Vec<String>, Vec<String>),
SetAccessLevel(Vec<Symbol>, AccessLevel),
CreateIndex(Symbol, Symbol, Vec<Symbol>),
CreateVectorIndex(Symbol, Symbol, Vec<Symbol>),
CreateVectorIndex(HnswIndexConfig),
RemoveIndex(Symbol, Symbol),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub(crate) struct HnswIndexConfig {
pub(crate) base_relation: Symbol,
pub(crate) index_name: Symbol,
pub(crate) vec_dim: usize,
pub(crate) dtype: VecElementType,
pub(crate) vec_fields: Vec<Symbol>,
pub(crate) tag_fields: Vec<Symbol>,
pub(crate) distance: HnswDistance,
pub(crate) ef_construction: usize,
pub(crate) max_elements: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(crate) enum HnswDistance {
L2,
InnerProduct,
Cosine,
}
pub(crate) struct HnswKnnQueryOptions {
k: usize,
ef: usize,
auto_diversity: bool,
min_separation: f64,
max_distance: f64,
}
#[derive(Debug, Diagnostic, Error)]
#[error("Cannot interpret {0} as process ID")]
#[diagnostic(code(parser::not_proc_id))]
@ -186,6 +215,9 @@ pub(crate) fn parse_sys(
}
}
Rule::list_fixed_rules => SysOp::ListFixedRules,
Rule::vec_idx_op => {
todo!("vec_idx_op")
}
rule => unreachable!("{:?}", rule),
})
}

@ -1157,7 +1157,7 @@ impl<'s, S: Storage<'s>> Db<S> {
vec![vec![DataValue::from(OK_STR)]],
))
}
SysOp::CreateVectorIndex(..) => {
SysOp::CreateVectorIndex(config) => {
todo!()
}
SysOp::RemoveIndex(rel_name, idx_name) => {

@ -757,3 +757,12 @@ fn test_vec_types() {
res.into_json()["rows"][0][1]
);
}
#[test]
fn test_vec_index() {
let db = DbInstance::new("mem", "", "").unwrap();
db.run_script(":create a {k: String => tags: [String], v: <F32; 8>}", Default::default())
.unwrap();
// db.run_script("::hnsw create a:vec {dim: 128, dtype: f32, fields: [v], tags: tags, distance: Cosine, ef_construction: 20, max_elements: 50}", Default::default())
// .unwrap();
}

Loading…
Cancel
Save