use iqdb::{DistanceMetric, Iqdb, Payload, Record, RecordId, Result, Vector};
fn main() -> Result<()> {
let db = Iqdb::open_in_memory();
db.upsert(record(1, [1.0, 0.0, 0.0], &[("topic", "rust")]))?;
db.upsert(record(2, [0.0, 1.0, 0.0], &[("topic", "python")]))?;
db.upsert(record(3, [0.0, 0.0, 1.0], &[("topic", "go")]))?;
println!("stored {} records", db.len());
if let Some(rec) = db.get(RecordId::new(2))? {
let topic = rec
.payload()
.and_then(|p| p.get("topic"))
.and_then(iqdb::PayloadValue::as_text)
.unwrap_or("?");
println!("id=2 → topic={topic}");
}
let r1 = db
.get(RecordId::new(1))?
.ok_or(iqdb::Error::InvalidConfig("missing seed record"))?;
for id in [2_u64, 3] {
if let Some(other) = db.get(RecordId::new(id))? {
let l2 = DistanceMetric::L2.distance(r1.vector(), other.vector())?;
let cos = DistanceMetric::Cosine.distance(r1.vector(), other.vector())?;
println!("dist(1,{id}) → L2={l2:.4} cosine={cos:.4}");
}
}
let removed = db.delete(RecordId::new(3))?;
println!("delete(3) → removed={removed}, len={}", db.len());
db.close()?;
Ok(())
}
fn record(id: u64, components: [f32; 3], meta: &[(&str, &str)]) -> Record {
let vector = Vector::new(components.to_vec()).expect("finite components");
if meta.is_empty() {
Record::new(RecordId::new(id), vector)
} else {
let mut payload = Payload::new();
for (k, v) in meta {
let _ = payload.insert(*k, *v);
}
Record::with_payload(RecordId::new(id), vector, payload)
}
}