aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarLibravatar Konstantinos Koukas <[email protected]> 2023-08-07 15:43:29 +0300
committerLibravatarLibravatar Simon Ser <[email protected]> 2023-08-09 23:17:24 +0200
commit652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77 (patch)
tree8c9a7accfa76b1661c60a3a039519f24a4738a90
parenteecda9c0245b4c9af476624451dce24c38d6b96f (diff)
downloadalps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.tar.gz
alps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.tar.bz2
alps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.zip
plugins/base: sort search results by date
Implement server-side sorting of search results using the SORT extension to IMAP, if the server supports it. Otherwise, fall back to the unordered SEARCH command. Sort messages by sent date, in descending order.
-rw-r--r--plugins/base/imap.go26
1 files changed, 21 insertions, 5 deletions
diff --git a/plugins/base/imap.go b/plugins/base/imap.go
index 8ea88e9..c71f0d3 100644
--- a/plugins/base/imap.go
+++ b/plugins/base/imap.go
@@ -471,12 +471,28 @@ func searchMessages(conn *imapclient.Client, mboxName, query string, page, messa
return nil, 0, err
}
- criteria := PrepareSearch(query)
- data, err := conn.Search(criteria, nil).Wait()
- if err != nil {
- return nil, 0, fmt.Errorf("UID SEARCH failed: %v", err)
+ searchCriteria := PrepareSearch(query)
+
+ var nums []uint32
+ if !conn.Caps().Has(imap.CapSort) {
+ data, err := conn.Search(searchCriteria, nil).Wait()
+ if err != nil {
+ return nil, 0, fmt.Errorf("SEARCH failed: %v", err)
+ }
+ nums = data.AllNums()
+ } else {
+ sortOptions := &imapclient.SortOptions{
+ SearchCriteria: searchCriteria,
+ SortCriteria: []imapclient.SortCriterion{
+ {Key: imapclient.SortKeyDate, Reverse: true},
+ },
+ }
+ nums, err = conn.Sort(sortOptions).Wait()
+ if err != nil {
+ return nil, 0, fmt.Errorf("SORT failed: %v", err)
+ }
}
- nums := data.AllNums()
+
total = len(nums)
from := page * messagesPerPage