event_graph: [bug fix] rewrite get_offspring() method

This commit is contained in:
Dastan-glitch
2023-08-31 04:51:55 +03:00
parent 6e45af3c5d
commit 7ed79b1365
2 changed files with 71 additions and 24 deletions

View File

@@ -239,26 +239,20 @@ where
}
/// Return all the offsprings (including branches if any) of a given EventID.
pub fn get_offspring(&self, event: &EventId) -> Result<Vec<Event<T>>> {
let mut offspring = vec![];
let mut event = *event;
let head = self.get_head_hash()?;
loop {
if event == head {
break
}
if let Some(ev) = self.event_map.get(&event) {
for child in ev.children.iter() {
let child = self.event_map.get(child).unwrap();
offspring.push(child.event.clone());
event = child.event.hash();
}
} else {
break
}
pub fn get_offspring(&self, event: &EventId, offspring: &mut Vec<Event<T>>) -> Result<()> {
let node = self.event_map.get(event).ok_or(Error::EventNotFound("child node".into()))?;
offspring.push(node.event.clone());
// is a leaf
if node.children.is_empty() {
return Ok(())
}
Ok(offspring)
for child in node.children.iter() {
self.get_offspring(child, offspring)?;
}
Ok(())
}
async fn reorganize(&mut self) -> Result<()> {
@@ -450,11 +444,10 @@ where
return Ok(self.current_root)
}
if self.event_map.get(&node_a).unwrap().children.len() > 1 {
let offsprings = self
.get_offspring(&node_a)?
.iter()
.map(|event| event.hash())
.collect::<Vec<EventId>>();
let mut offsprings = vec![];
self.get_offspring(&node_a, &mut offsprings)?;
let offsprings =
offsprings.iter().map(|event| event.hash()).collect::<Vec<EventId>>();
if offsprings.contains(&node_b) {
return Ok(node_a)
}
@@ -678,6 +671,59 @@ mod tests {
})
}
#[test]
fn offspring_test() -> Result<()> {
smol::block_on(async {
let events_queue = EventsQueue::new();
let mut model = Model::new(events_queue);
let root_id = model.current_root;
// event_node 1
// Fill this node with 100 events
let mut event_node_1_ids = vec![];
let mut id1 = root_id;
let timestamp = Timestamp::current_time().0 - 500;
for i in 0..100 {
let node = create_message(id1, Timestamp(timestamp + i));
id1 = node.hash();
model.add(node).await?;
event_node_1_ids.push(id1);
}
sleep(1).await;
// event_node 2
// Fill this node with 150 events
let mut id2 = root_id;
let timestamp = Timestamp::current_time().0 - 100;
for i in 0..150 {
let node = create_message(id2, Timestamp(timestamp + i));
id2 = node.hash();
model.add(node).await?;
}
sleep(1).await;
// event_node 3
// Fill this node with 75 events
let mut id3 = root_id;
let timestamp = Timestamp::current_time().0 + 150;
for i in 0..75 {
let node = create_message(id3, Timestamp(timestamp + i));
id3 = node.hash();
model.add(node).await?;
}
sleep(1).await;
let mut offspring = vec![];
model.get_offspring(&model.current_root, &mut offspring)?;
// root event + 100 + 150 + 75 = 326
assert_eq!(offspring.len(), 326_usize);
Ok(())
})
}
#[test]
fn save_load_model() -> Result<()> {
smol::block_on(async {

View File

@@ -216,7 +216,8 @@ where
continue
}
let children = model.get_offspring(leaf)?;
let mut children = vec![];
model.get_offspring(leaf, &mut children)?;
for child in children {
self.channel.send(&child).await?;