From c6d901d799b05dbc68a881c3cfa40b5ed494feed Mon Sep 17 00:00:00 2001 From: holger krekel Date: Thu, 31 Mar 2022 10:32:32 +0200 Subject: [PATCH] first iteration of faster sorting --- CHANGELOG.md | 1 + src/chat.rs | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b2e7a606..02ee2ea20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - start ephemeral timer when seen status is synchronized via IMAP #3122 - do not delete duplicate messages on IMAP immediately to accidentally deleting the last copy #3138 +- speed up loading of chat messages #3171 ### Changes - add more SMTP logging #3093 diff --git a/src/chat.rs b/src/chat.rs index 848985bd2..27ad888ba 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2241,26 +2241,34 @@ pub async fn get_chat_msgs( }; Ok(( - row.get::<_, MsgId>("id")?, row.get::<_, i64>("timestamp")?, + row.get::<_, MsgId>("id")?, !is_info_msg, )) } } else { |row: &rusqlite::Row| { Ok(( - row.get::<_, MsgId>("id")?, row.get::<_, i64>("timestamp")?, + row.get::<_, MsgId>("id")?, false, )) } }; let process_rows = |rows: rusqlite::MappedRows<_>| { + // It is faster to sort here rather than + // let sqlite execute an ORDER BY clause. + let mut sorted_rows = Vec::new(); + for row in rows { + let (ts, curr_id, exclude_message): (i64, MsgId, bool) = row?; + sorted_rows.push((ts, curr_id, exclude_message)); + } + sorted_rows.sort_unstable(); + let mut ret = Vec::new(); let mut last_day = 0; let cnv_to_local = dc_gm2local_offset(); - for row in rows { - let (curr_id, ts, exclude_message): (MsgId, i64, bool) = row?; + for (ts, curr_id, exclude_message) in sorted_rows { if let Some(marker_id) = marker1before { if curr_id == marker_id { ret.push(ChatItem::Marker1); @@ -2296,8 +2304,7 @@ pub async fn get_chat_msgs( m.param GLOB \"*S=*\" OR m.from_id == ? OR m.to_id == ? - ) - ORDER BY m.timestamp, m.id;", + );", paramsv![chat_id, DC_CONTACT_ID_INFO, DC_CONTACT_ID_INFO], process_row, process_rows, @@ -2307,11 +2314,10 @@ pub async fn get_chat_msgs( context .sql .query_map( - "SELECT m.id AS id, m.timestamp AS timestamp + "SELECT m.id as id, m.timestamp as timestamp FROM msgs m WHERE m.chat_id=? - AND m.hidden=0 - ORDER BY m.timestamp, m.id;", + AND m.hidden=0;", paramsv![chat_id], process_row, process_rows,