Get rid of more unnecessary intermediate collections

This commit is contained in:
Jonas Platte 2021-09-05 00:05:59 +02:00
parent 06b0c9267f
commit 910ad7fed1
No known key found for this signature in database
GPG key ID: CC154DE0E30B7C67

View file

@ -1396,49 +1396,46 @@ async fn upgrade_outlier_to_timeline_pdu(
}
if okay {
let fork_states: Vec<_> = extremity_sstatehashes
.into_iter()
.map(|(sstatehash, prev_event)| {
let mut leaf_state = db
let mut fork_states = Vec::with_capacity(extremity_sstatehashes.len());
let mut auth_chain_sets = Vec::with_capacity(extremity_sstatehashes.len());
for (sstatehash, prev_event) in extremity_sstatehashes {
let mut leaf_state: BTreeMap<_, _> = db
.rooms
.state_full_ids(sstatehash)
.map_err(|_| "Failed to ask db for room state.".to_owned())?;
if let Some(state_key) = &prev_event.state_key {
let shortstatekey = db
.rooms
.state_full_ids(sstatehash)
.map_err(|_| "Failed to ask db for room state.".to_owned())?;
.get_or_create_shortstatekey(&prev_event.kind, state_key, &db.globals)
.map_err(|_| "Failed to create shortstatekey.".to_owned())?;
leaf_state.insert(shortstatekey, Arc::new(prev_event.event_id.clone()));
// Now it's the state after the pdu
}
if let Some(state_key) = &prev_event.state_key {
let shortstatekey = db
.rooms
.get_or_create_shortstatekey(&prev_event.kind, state_key, &db.globals)
.map_err(|_| "Failed to create shortstatekey.".to_owned())?;
leaf_state.insert(shortstatekey, Arc::new(prev_event.event_id.clone()));
// Now it's the state after the pdu
}
let mut state = StateMap::with_capacity(leaf_state.len());
let mut starting_events = Vec::with_capacity(leaf_state.len());
leaf_state
.into_iter()
.map(|(k, id)| (db.rooms.get_statekey_from_short(k).map(|k| (k, id))))
.collect::<Result<StateMap<_>>>()
.map_err(|_| "Failed to get_statekey_from_short.".to_owned())
})
.collect::<StdResult<_, _>>()?;
for (k, id) in leaf_state {
let k = db
.rooms
.get_statekey_from_short(k)
.map_err(|_| "Failed to get_statekey_from_short.".to_owned())?;
state.insert(k, (*id).clone());
starting_events.push(id);
}
let mut auth_chain_sets = Vec::new();
for state in &fork_states {
auth_chain_sets.push(
get_auth_chain(
&room_id,
state.iter().map(|(_, id)| id.clone()).collect(),
db,
)
.map_err(|_| "Failed to load auth chain.".to_owned())?
.map(|event_id| (*event_id).clone())
.collect(),
get_auth_chain(&room_id, starting_events, db)
.map_err(|_| "Failed to load auth chain.".to_owned())?
.map(|event_id| (*event_id).clone())
.collect(),
);
}
let fork_states = &fork_states
.into_iter()
.map(|map| map.into_iter().map(|(k, id)| (k, (*id).clone())).collect())
.collect::<Vec<_>>();
fork_states.push(state);
}
state_at_incoming_event = match state_res::StateResolution::resolve(
&room_id,