Search improvements.

This commit is contained in:
Burak Kaan Köse
2026-02-12 18:57:55 +01:00
parent b01fa4e4ba
commit e936c431a2
4 changed files with 372 additions and 108 deletions
+75 -3
View File
@@ -230,6 +230,67 @@ public class MailService : BaseDatabaseService, IMailService
return (sql.ToString(), parameters.ToArray());
}
private static List<MailCopy> ApplyOptionsToPreFetchedMails(MailListInitializationOptions options)
{
var allowedFolderIds = options.Folders.Select(f => f.Id).ToHashSet();
IEnumerable<MailCopy> query = options.PreFetchMailCopies
.Where(m => m != null && allowedFolderIds.Contains(m.FolderId))
.GroupBy(m => m.UniqueId)
.Select(g => g.First());
switch (options.FilterType)
{
case FilterOptionType.Unread:
query = query.Where(m => !m.IsRead);
break;
case FilterOptionType.Flagged:
query = query.Where(m => m.IsFlagged);
break;
case FilterOptionType.Files:
query = query.Where(m => m.HasAttachments);
break;
}
if (options.IsFocusedOnly is bool isFocused)
{
query = query.Where(m => m.IsFocused == isFocused);
}
if (!string.IsNullOrWhiteSpace(options.SearchQuery))
{
var search = options.SearchQuery.Trim();
query = query.Where(m =>
(!string.IsNullOrEmpty(m.PreviewText) && m.PreviewText.Contains(search, StringComparison.OrdinalIgnoreCase))
|| (!string.IsNullOrEmpty(m.Subject) && m.Subject.Contains(search, StringComparison.OrdinalIgnoreCase))
|| (!string.IsNullOrEmpty(m.FromName) && m.FromName.Contains(search, StringComparison.OrdinalIgnoreCase))
|| (!string.IsNullOrEmpty(m.FromAddress) && m.FromAddress.Contains(search, StringComparison.OrdinalIgnoreCase)));
}
if (options.ExistingUniqueIds?.Any() ?? false)
{
query = query.Where(m => !options.ExistingUniqueIds.ContainsKey(m.UniqueId));
}
query = options.SortingOptionType switch
{
SortingOptionType.Sender => query.OrderBy(m => m.FromName).ThenByDescending(m => m.CreationDate),
_ => query.OrderByDescending(m => m.CreationDate)
};
if (options.Skip > 0)
{
query = query.Skip(options.Skip);
}
if (options.Take > 0)
{
query = query.Take(options.Take);
}
return query.ToList();
}
public async Task<List<MailCopy>> FetchMailsAsync(MailListInitializationOptions options, CancellationToken cancellationToken = default)
{
List<MailCopy> mails = null;
@@ -237,7 +298,7 @@ public class MailService : BaseDatabaseService, IMailService
// If user performs an online search, mail copies are passed to options.
if (options.PreFetchMailCopies != null)
{
mails = options.PreFetchMailCopies;
mails = ApplyOptionsToPreFetchedMails(options);
}
else
{
@@ -1163,12 +1224,23 @@ public class MailService : BaseDatabaseService, IMailService
public async Task<GmailArchiveComparisonResult> GetGmailArchiveComparisonResultAsync(Guid archiveFolderId, List<string> onlineArchiveMailIds)
{
onlineArchiveMailIds ??= [];
var localArchiveMails = await Connection.Table<MailCopy>()
.Where(a => a.FolderId == archiveFolderId)
.ToListAsync().ConfigureAwait(false);
var removedMails = localArchiveMails.Where(a => !onlineArchiveMailIds.Contains(a.Id)).Select(a => a.Id).Distinct().ToArray();
var addedMails = onlineArchiveMailIds.Where(a => !localArchiveMails.Select(b => b.Id).Contains(a)).Distinct().ToArray();
var onlineArchiveIdSet = onlineArchiveMailIds
.Where(a => !string.IsNullOrWhiteSpace(a))
.ToHashSet(StringComparer.Ordinal);
var localArchiveIdSet = localArchiveMails
.Select(a => a.Id)
.Where(a => !string.IsNullOrWhiteSpace(a))
.ToHashSet(StringComparer.Ordinal);
var removedMails = localArchiveIdSet.Except(onlineArchiveIdSet).ToArray();
var addedMails = onlineArchiveIdSet.Except(localArchiveIdSet).ToArray();
return new GmailArchiveComparisonResult(addedMails, removedMails);
}