store: convert more callers to use RELS index
Convert remaining Vec users to index-based access: - memory.rs: MemoryNode::from_store uses Store::neighbors() - graph.rs: orphan detection uses for_each_relation - local.rs: normalize_strengths uses for_each_relation + set_link_strength Add Store::neighbors() method and index::get_offsets_for_uuid(). Cleanup: - for_each_relation: build both uuid↔key maps in one pass - cap_degree: consolidate key/uuid/degree collection Remaining Vec uses: admin.rs (fsck, dedup), capnp.rs (load path). Co-Authored-By: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
5fe51fbfda
commit
5832e57970
8 changed files with 109 additions and 81 deletions
|
|
@ -96,6 +96,32 @@ impl Store {
|
|||
index::all_keys(db)
|
||||
}
|
||||
|
||||
/// Get neighbors of a node: (key, strength) pairs.
|
||||
pub fn neighbors(&self, key: &str) -> Result<Vec<(String, f32)>> {
|
||||
let db = self.db.as_ref()
|
||||
.ok_or_else(|| anyhow::anyhow!("store not loaded"))?;
|
||||
|
||||
let uuid = match index::get_uuid_for_key(db, key)? {
|
||||
Some(u) => u,
|
||||
None => return Ok(Vec::new()),
|
||||
};
|
||||
|
||||
let edges = index::edges_for_node(db, &uuid)?;
|
||||
let mut neighbors = Vec::new();
|
||||
|
||||
for (other_uuid, strength, _, _) in edges {
|
||||
// Look up key for other_uuid
|
||||
let offsets = index::get_offsets_for_uuid(db, &other_uuid)?;
|
||||
if offsets.is_empty() { continue; }
|
||||
match capnp::read_node_at_offset(offsets[0]) {
|
||||
Ok(n) if !n.deleted => neighbors.push((n.key, strength)),
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
|
||||
Ok(neighbors)
|
||||
}
|
||||
|
||||
/// Remove a node from the index (used after appending a tombstone).
|
||||
pub fn remove_from_index(&self, key: &str, uuid: &[u8; 16]) -> Result<()> {
|
||||
if let Some(db) = self.db.as_ref() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue