CompileAsyncQuery: FactoryIndexerFolder

This commit is contained in:
Anton Suhorukov 2023-05-29 18:09:09 +03:00
parent dae2ca3be8
commit b849378a29

View File

@ -54,19 +54,11 @@ public class FactoryIndexerFolder : FactoryIndexer<DbFolder>
{
using var filesDbContext = _dbContextFactory.CreateDbContext();
var dataQuery = GetBaseQuery(filesDbContext, lastIndexed)
.OrderBy(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id);
var minid = Queries.GetMinId(filesDbContext, lastIndexed);
var minid = dataQuery.FirstOrDefault();
var maxid = Queries.GetMaxId(filesDbContext, lastIndexed);
dataQuery = GetBaseQuery(filesDbContext, lastIndexed)
.OrderByDescending(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id);
var maxid = dataQuery.FirstOrDefault();
var count = GetBaseQuery(filesDbContext, lastIndexed).Count();
var count = Queries.GetCount(filesDbContext, lastIndexed);
return new(count, maxid, minid);
}
@ -74,11 +66,7 @@ public class FactoryIndexerFolder : FactoryIndexer<DbFolder>
List<DbFolder> getData(long start, long stop, DateTime lastIndexed)
{
using var filesDbContext = _dbContextFactory.CreateDbContext();
return GetBaseQuery(filesDbContext, lastIndexed)
.Where(r => r.DbFolder.Id >= start && r.DbFolder.Id <= stop)
.Select(r => r.DbFolder)
.ToList();
return Queries.GetData(filesDbContext, lastIndexed, start, stop).ToList();
}
List<int> getIds(DateTime lastIndexed)
@ -90,13 +78,7 @@ public class FactoryIndexerFolder : FactoryIndexer<DbFolder>
while (true)
{
var dataQuery = GetBaseQuery(filesDbContext, lastIndexed)
.Where(r => r.DbFolder.Id >= start)
.OrderBy(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id)
.Skip(BaseIndexer<DbFolder>.QueryLimit);
var id = dataQuery.FirstOrDefault();
var id = Queries.GetId(filesDbContext, lastIndexed, start);
if (id != 0)
{
start = id;
@ -111,11 +93,6 @@ public class FactoryIndexerFolder : FactoryIndexer<DbFolder>
return result;
}
IQueryable<FolderTenant> GetBaseQuery(FilesDbContext filesDbContext, DateTime lastIndexed) => filesDbContext.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(filesDbContext.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active);
try
{
var j = 0;
@ -166,3 +143,55 @@ public static class FactoryIndexerFolderExtension
services.TryAdd<DbFolder>();
}
}
file static class Queries
{
public static readonly Func<FilesDbContext, DateTime, int> GetMinId = Microsoft.EntityFrameworkCore.EF.CompileQuery(
(FilesDbContext ctx, DateTime lastIndexed) =>
ctx.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(ctx.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active)
.OrderBy(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id)
.FirstOrDefault());
public static readonly Func<FilesDbContext, DateTime, int> GetMaxId = Microsoft.EntityFrameworkCore.EF.CompileQuery(
(FilesDbContext ctx, DateTime lastIndexed) =>
ctx.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(ctx.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active)
.OrderByDescending(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id)
.FirstOrDefault());
public static readonly Func<FilesDbContext, DateTime, int> GetCount = Microsoft.EntityFrameworkCore.EF.CompileQuery(
(FilesDbContext ctx, DateTime lastIndexed) =>
ctx.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(ctx.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active)
.Count());
public static readonly Func<FilesDbContext, DateTime, long, int> GetId = Microsoft.EntityFrameworkCore.EF.CompileQuery(
(FilesDbContext ctx, DateTime lastIndexed, long start) =>
ctx.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(ctx.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active)
.Where(r => r.DbFolder.Id >= start)
.OrderBy(r => r.DbFolder.Id)
.Select(r => r.DbFolder.Id)
.Skip(BaseIndexer<DbFolder>.QueryLimit)
.FirstOrDefault());
public static readonly Func<FilesDbContext, DateTime, long, long, IEnumerable<DbFolder>> GetData = Microsoft.EntityFrameworkCore.EF.CompileQuery(
(FilesDbContext ctx, DateTime lastIndexed, long start, long stop) =>
ctx.Folders
.Where(r => r.ModifiedOn >= lastIndexed)
.Join(ctx.Tenants, r => r.TenantId, r => r.Id, (f, t) => new FolderTenant { DbFolder = f, DbTenant = t })
.Where(r => r.DbTenant.Status == TenantStatus.Active)
.Where(r => r.DbFolder.Id >= start && r.DbFolder.Id <= stop)
.Select(r => r.DbFolder));
}