Fix JMAP: Email/query total miscount when collapseThreads is enabled
This commit is contained in:
@@ -19,6 +19,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If
|
|||||||
- Default calendars and address books are not subscribed by default.
|
- Default calendars and address books are not subscribed by default.
|
||||||
- Unchanged immutable `id` property is rejected on `/set`.
|
- Unchanged immutable `id` property is rejected on `/set`.
|
||||||
- `filter: null` rejected as `notRequest` on `/query` and `/queryChanges`.
|
- `filter: null` rejected as `notRequest` on `/query` and `/queryChanges`.
|
||||||
|
- `Email/query` total miscount when `collapseThreads` is enabled.
|
||||||
- OIDC: Add default domain name to groups that are not email addresses.
|
- OIDC: Add default domain name to groups that are not email addresses.
|
||||||
- RocksDB: Enable blob garbage collection to reclaim disk space from deleted blobs.
|
- RocksDB: Enable blob garbage collection to reclaim disk space from deleted blobs.
|
||||||
|
|
||||||
|
|||||||
@@ -349,15 +349,30 @@ impl EmailQuery for Server {
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
let collapse_threads = request.arguments.collapse_threads.unwrap_or(false);
|
||||||
|
let total_results = if collapse_threads {
|
||||||
|
let mut seen_thread_ids = AHashSet::new();
|
||||||
|
results
|
||||||
|
.iter()
|
||||||
|
.filter_map(|document_id| {
|
||||||
|
cached_messages
|
||||||
|
.email_by_id(document_id)
|
||||||
|
.map(|email| email.thread_id)
|
||||||
|
})
|
||||||
|
.filter(|thread_id| seen_thread_ids.insert(*thread_id))
|
||||||
|
.count()
|
||||||
|
} else {
|
||||||
|
results.len()
|
||||||
|
};
|
||||||
|
|
||||||
let mut response = QueryResponseBuilder::new(
|
let mut response = QueryResponseBuilder::new(
|
||||||
results.len(),
|
total_results,
|
||||||
self.core.jmap.query_max_results,
|
self.core.jmap.query_max_results,
|
||||||
cached_messages.get_state(false),
|
cached_messages.get_state(false),
|
||||||
&request,
|
&request,
|
||||||
);
|
);
|
||||||
|
|
||||||
if !results.is_empty() {
|
if !results.is_empty() {
|
||||||
let collapse_threads = request.arguments.collapse_threads.unwrap_or(false);
|
|
||||||
let mut seen_thread_ids = AHashSet::new();
|
let mut seen_thread_ids = AHashSet::new();
|
||||||
|
|
||||||
for document_id in results {
|
for document_id in results {
|
||||||
|
|||||||
Reference in New Issue
Block a user