From 1cd7493bf397e311fcdfa667d0e142d323da4f62 Mon Sep 17 00:00:00 2001 From: David Edler Date: Tue, 24 May 2022 19:39:27 +0200 Subject: [PATCH 1/2] Fix performance on threaded view in large folders --- snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index fc1499462..7eeba720d 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -901,10 +901,12 @@ class MailClient $aUids = $this->GetUids($oParams->oCacher, '', $oMessageCollection->FolderName, $oMessageCollection->FolderHash, $bUseSortIfSupported, $oParams->sSort); // Remove all threaded UID's except the most recent of each thread + $threadedUids = []; foreach ($aAllThreads as $aMap) { unset($aMap[\array_key_last($aMap)]); - $aUids = \array_diff($aUids, $aMap); + $threadedUids = \array_merge($threadedUids, $aMap); } + $aUids = \array_diff($aUids, $threadedUids); } } else { $aUids = $this->GetUids($oParams->oCacher, '', From ca201c8dfe50c99d77cf150e398e339f9b1e41d0 Mon Sep 17 00:00:00 2001 From: David Edler Date: Tue, 24 May 2022 21:14:23 +0200 Subject: [PATCH 2/2] improve performance for searching with lots of threads --- .../app/libraries/MailSo/Mail/MailClient.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 7eeba720d..3fbec55da 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -918,15 +918,14 @@ class MailClient $aSearchedUids = $this->GetUids($oParams->oCacher, $sSearch, $oMessageCollection->FolderName, $oMessageCollection->FolderHash); if ($bUseThreads && !$oParams->iThreadUid) { - $aUids = \array_filter($aUids, function($iUid) use ($aSearchedUids, $aAllThreads) { - if (\in_array($iUid, $aSearchedUids)) { - return true; - } - foreach ($aAllThreads as $aMap) { - if (\in_array($iUid, $aMap) && \array_intersect($aSearchedUids, $aMap)) { - return true; + $matchingThreadUids = []; + foreach ($aAllThreads as $aMap) { + if (\array_intersect($aSearchedUids, $aMap)) { + $matchingThreadUids = \array_merge($matchingThreadUids, $aMap); } - } + } + $aUids = \array_filter($aUids, function($iUid) use ($aSearchedUids, $matchingThreadUids) { + return \in_array($iUid, $aSearchedUids) || \in_array($iUid, $matchingThreadUids); }); } else { $aUids = \array_filter($aUids, function($iUid) use ($aSearchedUids) {