Files: bugfix and optimization

This commit is contained in:
pavelbannov 2020-11-25 18:40:23 +03:00
parent 4a1023808c
commit ed22ffb326
5 changed files with 42 additions and 29 deletions

View File

@ -61,7 +61,6 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> --> </PackageReference> -->
<PackageReference Include="MySql.Data" Version="8.0.21" /> <PackageReference Include="MySql.Data" Version="8.0.21" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NLog" Version="4.7.5" /> <PackageReference Include="NLog" Version="4.7.5" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
<PackageReference Include="NUnit" Version="3.12.0" /> <PackageReference Include="NUnit" Version="3.12.0" />

View File

@ -123,13 +123,18 @@ namespace ASC.Files.Core.Data
public File<int> GetFile(int fileId) public File<int> GetFile(int fileId)
{ {
var query = GetFileQuery(r => r.Id == fileId && r.CurrentVersion).AsNoTracking(); var query = GetFileQuery(r => r.Id == fileId && r.CurrentVersion).AsNoTracking();
return ToFile(FromQueryWithShared(query).SingleOrDefault()); return ToFile(
FromQueryWithShared(query)
.Take(1)
.SingleOrDefault());
} }
public File<int> GetFile(int fileId, int fileVersion) public File<int> GetFile(int fileId, int fileVersion)
{ {
var query = GetFileQuery(r => r.Id == fileId && r.Version == fileVersion).AsNoTracking(); var query = GetFileQuery(r => r.Id == fileId && r.Version == fileVersion).AsNoTracking();
return ToFile(FromQueryWithShared(query).SingleOrDefault()); return ToFile(FromQueryWithShared(query)
.Take(1)
.SingleOrDefault());
} }
public File<int> GetFile(int parentId, string title) public File<int> GetFile(int parentId, string title)
@ -1328,9 +1333,11 @@ namespace ASC.Files.Core.Data
.Where(x => x.tree.FolderId == r.FolderId) .Where(x => x.tree.FolderId == r.FolderId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault(), .FirstOrDefault(),
Shared = Shared =
FilesDbContext.Security FilesDbContext.Security
.Where(x=> x.TenantId == TenantID)
.Where(x => x.EntryType == FileEntryType.File) .Where(x => x.EntryType == FileEntryType.File)
.Where(x => x.EntryId == r.Id.ToString()) .Where(x => x.EntryId == r.Id.ToString())
.Any() .Any()
@ -1349,6 +1356,7 @@ namespace ASC.Files.Core.Data
.Where(x => x.tree.FolderId == r.FolderId) .Where(x => x.tree.FolderId == r.FolderId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault(), .FirstOrDefault(),
Shared = true Shared = true
}); });

View File

@ -353,13 +353,13 @@ namespace ASC.Files.Core.Data
//full path to root //full path to root
var oldTree = FilesDbContext.Tree var oldTree = FilesDbContext.Tree
.Where(r => r.FolderId == (int)folder.ParentFolderID); .Where(r => r.FolderId == folder.ParentFolderID);
foreach (var o in oldTree) foreach (var o in oldTree)
{ {
var treeToAdd = new DbFolderTree var treeToAdd = new DbFolderTree
{ {
FolderId = (int)folder.ID, FolderId = folder.ID,
ParentId = o.ParentId, ParentId = o.ParentId,
Level = o.Level + 1 Level = o.Level + 1
}; };
@ -1050,6 +1050,7 @@ namespace ASC.Files.Core.Data
.Take(1) .Take(1)
.FirstOrDefault(), .FirstOrDefault(),
Shared = FilesDbContext.Security Shared = FilesDbContext.Security
.Where(x => x.TenantId == TenantID)
.Where(r => r.EntryType == FileEntryType.Folder) .Where(r => r.EntryType == FileEntryType.Folder)
.Where(x => x.EntryId == r.Id.ToString()) .Where(x => x.EntryId == r.Id.ToString())
.Any() .Any()

View File

@ -28,6 +28,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions;
using ASC.Common; using ASC.Common;
using ASC.Core; using ASC.Core;
@ -457,15 +458,15 @@ namespace ASC.Files.Core.Data
var shareQuery = var shareQuery =
new Func<IQueryable<TagLinkData>>(() => getBaseSqlQuery().Where( new Func<IQueryable<TagLinkData>>(() => getBaseSqlQuery().Where(
r => FilesDbContext.Security r => FilesDbContext.Security
.Where(a => a.TenantId == r.Link.TenantId) .Where(a => a.TenantId == TenantID)
.Where(a => a.EntryId == r.Link.EntryId) .Where(a => a.EntryId == r.Link.EntryId)
.Where(a => a.EntryType == r.Link.EntryType) .Where(a => a.EntryType == r.Link.EntryType)
.Any())); .Any()));
var tmpShareFileTags = var tmpShareFileTags =
shareQuery() shareQuery()
.Join(FilesDbContext.Files, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, file) => new { tagLink, file }) .Join(FilesDbContext.Files, r => Regex.IsMatch(r.Link.EntryId, "^[0-9]+$") ? Convert.ToInt32(r.Link.EntryId) : -1, f => f.Id, (tagLink, file) => new { tagLink, file })
.Where(r => r.file.TenantId == r.tagLink.Link.TenantId) .Where(r => r.file.TenantId == TenantID)
.Where(r => r.file.CreateBy != subject) .Where(r => r.file.CreateBy != subject)
.Where(r => r.tagLink.Link.EntryType == FileEntryType.File) .Where(r => r.tagLink.Link.EntryType == FileEntryType.File)
.Select(r => new .Select(r => new
@ -473,10 +474,11 @@ namespace ASC.Files.Core.Data
r.tagLink, r.tagLink,
root = FilesDbContext.Folders root = FilesDbContext.Folders
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(x => x.folder.TenantId == r.file.TenantId) .Where(x => x.folder.TenantId == TenantID)
.Where(x => x.tree.FolderId == r.file.FolderId) .Where(x => x.tree.FolderId == r.file.FolderId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault() .FirstOrDefault()
}) })
.Where(r => r.root.FolderType == FolderType.USER) .Where(r => r.root.FolderType == FolderType.USER)
@ -487,8 +489,8 @@ namespace ASC.Files.Core.Data
var tmpShareFolderTags = var tmpShareFolderTags =
shareQuery() shareQuery()
.Join(FilesDbContext.Folders, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, folder) => new { tagLink, folder }) .Join(FilesDbContext.Folders, r => Regex.IsMatch(r.Link.EntryId, "^[0-9]+$") ? Convert.ToInt32(r.Link.EntryId) : -1, f => f.Id, (tagLink, folder) => new { tagLink, folder })
.Where(r => r.folder.TenantId == r.tagLink.Link.TenantId) .Where(r => r.folder.TenantId == TenantID)
.Where(r => r.folder.CreateBy != subject) .Where(r => r.folder.CreateBy != subject)
.Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder)
.Select(r => new .Select(r => new
@ -496,10 +498,11 @@ namespace ASC.Files.Core.Data
r.tagLink, r.tagLink,
root = FilesDbContext.Folders root = FilesDbContext.Folders
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(x => x.folder.TenantId == r.folder.TenantId) .Where(x => x.folder.TenantId ==TenantID)
.Where(x => x.tree.FolderId == r.folder.ParentId) .Where(x => x.tree.FolderId == r.folder.ParentId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault() .FirstOrDefault()
}) })
.Where(r => r.root.FolderType == FolderType.USER) .Where(r => r.root.FolderType == FolderType.USER)
@ -531,15 +534,15 @@ namespace ASC.Files.Core.Data
var shareQuery = var shareQuery =
new Func<IQueryable<TagLinkData>>(() => getBaseSqlQuery().Where( new Func<IQueryable<TagLinkData>>(() => getBaseSqlQuery().Where(
r => FilesDbContext.Security r => FilesDbContext.Security
.Where(a => a.TenantId == r.Link.TenantId) .Where(a => a.TenantId == TenantID)
.Where(a => a.EntryId == r.Link.EntryId) .Where(a => a.EntryId == r.Link.EntryId)
.Where(a => a.EntryType == r.Link.EntryType) .Where(a => a.EntryType == r.Link.EntryType)
.Any())); .Any()));
var tmpShareFileTags = var tmpShareFileTags =
shareQuery() shareQuery()
.Join(FilesDbContext.Files, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, file) => new { tagLink, file }) .Join(FilesDbContext.Files, r => Regex.IsMatch(r.Link.EntryId, "^[0-9]+$") ? Convert.ToInt32(r.Link.EntryId) : -1, f => f.Id, (tagLink, file) => new { tagLink, file })
.Where(r => r.file.TenantId == r.tagLink.Link.TenantId) .Where(r => r.file.TenantId == TenantID)
.Where(r => r.file.CreateBy != subject) .Where(r => r.file.CreateBy != subject)
.Where(r => r.tagLink.Link.EntryType == FileEntryType.File) .Where(r => r.tagLink.Link.EntryType == FileEntryType.File)
.Select(r => new .Select(r => new
@ -547,10 +550,11 @@ namespace ASC.Files.Core.Data
r.tagLink, r.tagLink,
root = FilesDbContext.Folders root = FilesDbContext.Folders
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(x => x.folder.TenantId == r.file.TenantId) .Where(x => x.folder.TenantId == TenantID)
.Where(x => x.tree.FolderId == r.file.FolderId) .Where(x => x.tree.FolderId == r.file.FolderId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault() .FirstOrDefault()
}) })
.Where(r => r.root.FolderType == FolderType.Privacy) .Where(r => r.root.FolderType == FolderType.Privacy)
@ -561,8 +565,8 @@ namespace ASC.Files.Core.Data
var tmpShareFolderTags = var tmpShareFolderTags =
shareQuery() shareQuery()
.Join(FilesDbContext.Folders, r => r.Link.EntryId, f => f.Id.ToString(), (tagLink, folder) => new { tagLink, folder }) .Join(FilesDbContext.Folders, r => Regex.IsMatch(r.Link.EntryId, "^[0-9]+$") ? Convert.ToInt32(r.Link.EntryId) : -1, f => f.Id, (tagLink, folder) => new { tagLink, folder })
.Where(r => r.folder.TenantId == r.tagLink.Link.TenantId) .Where(r => r.folder.TenantId == TenantID)
.Where(r => r.folder.CreateBy != subject) .Where(r => r.folder.CreateBy != subject)
.Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder)
.Select(r => new .Select(r => new
@ -570,10 +574,11 @@ namespace ASC.Files.Core.Data
r.tagLink, r.tagLink,
root = FilesDbContext.Folders root = FilesDbContext.Folders
.Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree }) .Join(FilesDbContext.Tree, a => a.Id, b => b.ParentId, (folder, tree) => new { folder, tree })
.Where(x => x.folder.TenantId == r.folder.TenantId) .Where(x => x.folder.TenantId == TenantID)
.Where(x => x.tree.FolderId == r.folder.ParentId) .Where(x => x.tree.FolderId == r.folder.ParentId)
.OrderByDescending(r => r.tree.Level) .OrderByDescending(r => r.tree.Level)
.Select(r => r.folder) .Select(r => r.folder)
.Take(1)
.FirstOrDefault() .FirstOrDefault()
}) })
.Where(r => r.root.FolderType == FolderType.Privacy) .Where(r => r.root.FolderType == FolderType.Privacy)
@ -626,7 +631,7 @@ namespace ASC.Files.Core.Data
var newTagsForFiles = var newTagsForFiles =
getBaseSqlQuery() getBaseSqlQuery()
.Join(FilesDbContext.Files, r => r.Link.EntryId, r => r.Id.ToString(), (tagLink, file) => new { tagLink, file }) .Join(FilesDbContext.Files, r => Regex.IsMatch(r.Link.EntryId, "^[0-9]+$") ? Convert.ToInt32(r.Link.EntryId) : -1, r => r.Id, (tagLink, file) => new { tagLink, file })
.Where(r => r.file.TenantId == r.tagLink.Link.TenantId) .Where(r => r.file.TenantId == r.tagLink.Link.TenantId)
.Where(r => where.Any(a => r.file.FolderId.ToString() == a)) .Where(r => where.Any(a => r.file.FolderId.ToString() == a))
.Where(r => r.tagLink.Link.EntryType == FileEntryType.File) .Where(r => r.tagLink.Link.EntryType == FileEntryType.File)
@ -657,7 +662,7 @@ namespace ASC.Files.Core.Data
var newTagsForSBox = getBaseSqlQuery() var newTagsForSBox = getBaseSqlQuery()
.Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping }) .Join(FilesDbContext.ThirdpartyIdMapping, r => r.Link.EntryId, r => r.HashId, (tagLink, mapping) => new { tagLink, mapping })
.Where(r => r.mapping.TenantId == r.tagLink.Link.TenantId) .Where(r => r.mapping.TenantId == TenantID)
.Where(r => thirdpartyFolderIds.Any(a => r.mapping.Id == a)) .Where(r => thirdpartyFolderIds.Any(a => r.mapping.Id == a))
.Where(r => r.tagLink.Tag.Owner == subject) .Where(r => r.tagLink.Tag.Owner == subject)
.Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder) .Where(r => r.tagLink.Link.EntryType == FileEntryType.Folder)
@ -672,7 +677,7 @@ namespace ASC.Files.Core.Data
protected List<Tag> FromQuery(IQueryable<TagLinkData> dbFilesTags) protected List<Tag> FromQuery(IQueryable<TagLinkData> dbFilesTags)
{ {
return dbFilesTags return dbFilesTags
//.ToList() .ToList()
.Select(ToTag) .Select(ToTag)
.ToList(); .ToList();
} }

View File

@ -24,10 +24,10 @@ namespace ASC.Files.Core.EF
public string EntryId { get; set; } public string EntryId { get; set; }
[Column("create_by")] [Column("create_by")]
public Guid CreateBy { get; set; } public Guid? CreateBy { get; set; }
[Column("create_on")] [Column("create_on")]
public DateTime CreateOn { get; set; } public DateTime? CreateOn { get; set; }
[Column("tag_count")] [Column("tag_count")]
public int TagCount { get; set; } public int TagCount { get; set; }