mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
event_graph: [bug fix] rewrite get_offspring() method
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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?;
|
||||
|
||||
Reference in New Issue
Block a user