higher level hnsw removal

main
Ziyang Hu 1 year ago
parent becf49eefc
commit 2e84ce275d

@ -768,8 +768,31 @@ impl<'a> SessionTx<'a> {
}
Ok(true)
}
pub(crate) fn hnsw_remove(&mut self) -> Result<()> {
todo!()
pub(crate) fn hnsw_remove(
&mut self,
orig_table: &RelationHandle,
idx_table: &RelationHandle,
tuple: &[DataValue],
) -> Result<()> {
let mut prefix = vec![DataValue::from(0)];
prefix.extend_from_slice(&tuple[0..orig_table.metadata.keys.len()]);
let candidates: BTreeSet<_> = idx_table
.scan_prefix(self, &prefix)
.filter_map(|t| match t {
Ok(t) => Some({
(
t[1..orig_table.metadata.keys.len() + 1].to_vec(),
t[orig_table.metadata.keys.len() + 1].get_int().unwrap() as usize,
t[orig_table.metadata.keys.len() + 2].get_int().unwrap() as i32,
)
}),
Err(_) => None,
})
.collect();
for (tuple_key, idx, subidx) in candidates {
self.hnsw_remove_vec(&tuple_key, idx, subidx, orig_table, idx_table)?;
}
Ok(())
}
fn hnsw_remove_vec(
&mut self,
@ -840,7 +863,8 @@ impl<'a> SessionTx<'a> {
canary_key.push(DataValue::Null);
canary_key.push(DataValue::Null);
}
let canary_key_bytes = idx_table.encode_key_for_store(&canary_key, Default::default())?;
let canary_key_bytes =
idx_table.encode_key_for_store(&canary_key, Default::default())?;
if let Some(ep) = ep_res {
let ep = ep?;
let target_key_bytes = idx_table.encode_key_for_store(&ep, Default::default())?;
@ -851,7 +875,8 @@ impl<'a> SessionTx<'a> {
DataValue::Bytes(target_key_bytes),
DataValue::from(false),
];
let canary_value_bytes = idx_table.encode_val_only_for_store(&canary_value, Default::default())?;
let canary_value_bytes =
idx_table.encode_val_only_for_store(&canary_value, Default::default())?;
self.store_tx.put(&canary_key_bytes, &canary_value_bytes)?;
} else {
// HA! we have removed the last item in the index

Loading…
Cancel
Save