Files: EntryManager: optimized getting folder content

This commit is contained in:
Maksim Chegulov 2023-06-15 18:13:04 +03:00
parent 4535d8d7ac
commit 2db64a47e9

View File

@ -394,6 +394,11 @@ public class EntryManager
var entries = new List<FileEntry>();
searchInContent = searchInContent && filterType != FilterType.ByExtension && !Equals(parent.Id, _globalFolderHelper.FolderTrash);
if (parent.FolderType == FolderType.TRASH || string.IsNullOrEmpty(searchText))
{
withSubfolders = false;
}
if (parent.FolderType == FolderType.Projects && parent.Id.Equals(await _globalFolderHelper.FolderProjectsAsync))
{
@ -459,13 +464,39 @@ public class EntryManager
CalculateTotal();
}
else if (!parent.ProviderEntry)
{
var folderDao = _daoFactory.GetFolderDao<T>();
var fileDao = _daoFactory.GetFileDao<T>();
var allFoldersCountTask = folderDao.GetFoldersCountAsync(parent.Id, filterType, subjectGroup, subjectId, searchText, withSubfolders, excludeSubject);
var allFilesCountTask = fileDao.GetFilesCountAsync(parent.Id, filterType, subjectGroup, subjectId, searchText, withSubfolders, excludeSubject);
var folders = await folderDao.GetFoldersAsync(parent.Id, orderBy, filterType, subjectGroup, subjectId, searchText, withSubfolders, excludeSubject, from, count)
.ToListAsync();
var filesCount = count - folders.Count;
var filesOffset = folders.Count > 0 ? 0 : from - await allFoldersCountTask;
var files = await fileDao.GetFilesAsync(parent.Id, orderBy, filterType, subjectGroup, subjectId, searchText, searchInContent, withSubfolders, excludeSubject, filesOffset, filesCount)
.ToListAsync();
entries = new List<FileEntry>(count);
entries.AddRange(folders);
entries.AddRange(files);
var fileStatusTask = _entryStatusManager.SetFileStatusAsync(files);
var tagsNewTask = _fileMarker.SetTagsNewAsync(parent, entries);
var originsTask = SetOriginsAsync(parent, entries);
await Task.WhenAll(fileStatusTask, tagsNewTask, originsTask);
total = await allFoldersCountTask + await allFilesCountTask;
return (entries, total);
}
else
{
if (parent.FolderType == FolderType.TRASH)
{
withSubfolders = false;
}
var folders = _daoFactory.GetFolderDao<T>().GetFoldersAsync(parent.Id, orderBy, filterType, subjectGroup, subjectId, searchText, withSubfolders, excludeSubject);
var files = _daoFactory.GetFileDao<T>().GetFilesAsync(parent.Id, orderBy, filterType, subjectGroup, subjectId, searchText, searchInContent, withSubfolders, excludeSubject);
@ -493,11 +524,6 @@ public class EntryManager
entries.AddRange(items);
}
}
if (parent.FolderType == FolderType.TRASH)
{
entries = await GetWithOriginAsync(entries, roomId is int id ? id : default);
}
}
total = entries.Count;
@ -1863,10 +1889,13 @@ public class EntryManager
await tagDao.SaveTags(tag);
}
private async Task<List<FileEntry>> GetWithOriginAsync(List<FileEntry> entries, int filterRoomId)
private async Task SetOriginsAsync(IFolder parent, IEnumerable<FileEntry> entries)
{
var result = new List<FileEntry>(entries.Count);
var needFiltering = filterRoomId != default;
if (parent.FolderType != FolderType.TRASH || !entries.Any())
{
return;
}
var folderDao = _daoFactory.GetFolderDao<int>();
var originsData = await folderDao.GetOriginsDataAsync(entries.Cast<FileEntry<int>>().Select(e => e.Id)).ToListAsync();
@ -1881,22 +1910,15 @@ public class EntryManager
fileEntry.OriginRoomId = data.OriginRoom.Id;
fileEntry.OriginRoomTitle = data.OriginRoom.Title;
}
if (needFiltering && fileEntry.OriginRoomId != filterRoomId)
if (data?.OriginFolder == null)
{
continue;
}
if (data?.OriginFolder != null)
{
fileEntry.OriginId = data.OriginFolder.Id;
fileEntry.OriginTitle = data.OriginFolder.FolderType == FolderType.USER ? FilesUCResource.MyFiles : data.OriginFolder.Title;
}
result.Add(entry);
fileEntry.OriginId = data.OriginFolder.Id;
fileEntry.OriginTitle = data.OriginFolder.FolderType == FolderType.USER ? FilesUCResource.MyFiles : data.OriginFolder.Title;
}
return result;
}
//Long operation