SelectAppService performans güçlendir
This commit is contained in:
parent
2aa5e99da2
commit
948ab358e4
2 changed files with 69 additions and 62 deletions
|
|
@ -7,6 +7,7 @@ using Erp.Platform.OrganizationUnits;
|
||||||
using Erp.Platform.Queries;
|
using Erp.Platform.Queries;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Volo.Abp;
|
using Volo.Abp;
|
||||||
|
using Volo.Abp.Uow;
|
||||||
using static Erp.Platform.PlatformConsts;
|
using static Erp.Platform.PlatformConsts;
|
||||||
|
|
||||||
namespace Erp.Platform.ListForms.Administration;
|
namespace Erp.Platform.ListForms.Administration;
|
||||||
|
|
@ -50,6 +51,7 @@ public class ListFormQueryPreviewAppService : PlatformAppService
|
||||||
this.dynamicDataManager = dynamicDataManager;
|
this.dynamicDataManager = dynamicDataManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[UnitOfWork]
|
||||||
public async Task<string> GetListFormSelectQueryAsync(string listFormCode)
|
public async Task<string> GetListFormSelectQueryAsync(string listFormCode)
|
||||||
{
|
{
|
||||||
//Izin logic process
|
//Izin logic process
|
||||||
|
|
@ -62,18 +64,21 @@ public class ListFormQueryPreviewAppService : PlatformAppService
|
||||||
|
|
||||||
//kullaniciya ait ListFormField verilerini al
|
//kullaniciya ait ListFormField verilerini al
|
||||||
var fields = await listFormFieldManager.GetUserListFormFields(listFormCode);
|
var fields = await listFormFieldManager.GetUserListFormFields(listFormCode);
|
||||||
fields = fields.Where(a => a.CanRead).ToList();
|
|
||||||
|
// Performans: Filtrelemeyi Where ile yap, tek seferde ToList() çağır
|
||||||
|
var readableFields = fields.Where(a => a.CanRead).ToList();
|
||||||
|
|
||||||
//kullaniciya ait Server Customization verilerini al
|
//kullaniciya ait Server Customization verilerini al
|
||||||
var customizations = await listFormCustomizationManager.GetUsersServerCustomizations(listFormCode);
|
var customizations = await listFormCustomizationManager.GetUsersServerCustomizations(listFormCode);
|
||||||
|
|
||||||
var (_, _, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
var (_, _, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
||||||
|
|
||||||
selectQueryManager.PrepareQueries(listForm, fields, dataSourceType, customizations);
|
selectQueryManager.PrepareQueries(listForm, readableFields, dataSourceType, customizations);
|
||||||
|
|
||||||
return selectQueryManager.SelectQuery;
|
return selectQueryManager.SelectQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[UnitOfWork]
|
||||||
public async Task<string> GetListFormDataQueryAsync(string listFormCode, OperationEnum op)
|
public async Task<string> GetListFormDataQueryAsync(string listFormCode, OperationEnum op)
|
||||||
{
|
{
|
||||||
var authType = op switch
|
var authType = op switch
|
||||||
|
|
|
||||||
|
|
@ -162,18 +162,17 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(queryParams.Group) && !string.IsNullOrEmpty(selectQueryManager.GroupQuery))
|
if (!string.IsNullOrEmpty(queryParams.Group) && !string.IsNullOrEmpty(selectQueryManager.GroupQuery))
|
||||||
{
|
{
|
||||||
//Console.WriteLine("===");
|
|
||||||
//Console.WriteLine(selectQueryManager.GroupQuery);
|
|
||||||
var data = await dynamicDataRepository.QueryAsync(selectQueryManager.GroupQuery, connectionString, param);
|
var data = await dynamicDataRepository.QueryAsync(selectQueryManager.GroupQuery, connectionString, param);
|
||||||
List<(string, int, List<dynamic>)> groups = [];
|
var dataQueryable = data.AsQueryable();
|
||||||
|
|
||||||
|
var groups = new List<(string, int, List<dynamic>)>(selectQueryManager.GroupTuples.Count);
|
||||||
for (int i = 0; i < selectQueryManager.GroupTuples.Count; i++)
|
for (int i = 0; i < selectQueryManager.GroupTuples.Count; i++)
|
||||||
{
|
{
|
||||||
var groupTuple = selectQueryManager.GroupTuples[i];
|
var groupTuple = selectQueryManager.GroupTuples[i];
|
||||||
// var selectExpr = string.Join(",", selectQueryManager.GroupTuples.Take(i + 1).Select(a => $"{a.SelectExpr} as {a.SelectExpr}"));
|
var group = dataQueryable.GroupBy($"{groupTuple.SelectExpr}_Key").ToDynamicList();
|
||||||
var group = data.AsQueryable().GroupBy($"{groupTuple.SelectExpr}_Key").ToDynamicList();
|
|
||||||
groups.Add((groupTuple.SelectExpr, groupTuple.Index, group));
|
groups.Add((groupTuple.SelectExpr, groupTuple.Index, group));
|
||||||
}
|
}
|
||||||
var items = SetGroupItems(groups, groups.First().Item3, 0);
|
var items = SetGroupItems(groups, groups[0].Item3, 0);
|
||||||
|
|
||||||
result.GroupCount = input.RequireGroupCount ? items.Count : -1;
|
result.GroupCount = input.RequireGroupCount ? items.Count : -1;
|
||||||
result.Data = items;
|
result.Data = items;
|
||||||
|
|
@ -231,13 +230,16 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
|
||||||
if (!listForm.WidgetsJson.IsNullOrWhiteSpace())
|
if (!listForm.WidgetsJson.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
var widgetList = JsonSerializer.Deserialize<WidgetEditDto[]>(listForm.WidgetsJson) ?? [];
|
var widgetList = JsonSerializer.Deserialize<WidgetEditDto[]>(listForm.WidgetsJson) ?? [];
|
||||||
foreach (var widget in widgetList.Where(w => w.IsActive))
|
var activeWidgets = widgetList.Where(w => w.IsActive && !string.IsNullOrWhiteSpace(w.SqlQuery)).ToList();
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(widget.SqlQuery))
|
|
||||||
{
|
|
||||||
|
|
||||||
|
if (activeWidgets.Count == 0)
|
||||||
|
return Widgets;
|
||||||
|
|
||||||
|
// DataSource connection'ı bir kez al (performans)
|
||||||
var (dynamicDataRepository, connectionString, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
var (dynamicDataRepository, connectionString, dataSourceType) = await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
||||||
|
|
||||||
|
foreach (var widget in activeWidgets)
|
||||||
|
{
|
||||||
var w = new WidgetDto
|
var w = new WidgetDto
|
||||||
{
|
{
|
||||||
ColGap = widget.ColGap,
|
ColGap = widget.ColGap,
|
||||||
|
|
@ -264,13 +266,11 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Widgets.Add(w);
|
Widgets.Add(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return Widgets;
|
return Widgets;
|
||||||
}
|
}
|
||||||
|
|
@ -308,31 +308,34 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
|
||||||
var queryParameters = httpContextAccessor.HttpContext.Request.Query.ToDictionary(x => x.Key, x => x.Value);
|
var queryParameters = httpContextAccessor.HttpContext.Request.Query.ToDictionary(x => x.Key, x => x.Value);
|
||||||
var defaultFields = await defaultValueManager.GenerateDefaultValuesAsync(listForm, Enums.OperationEnum.Select, queryParameters: queryParameters);
|
var defaultFields = await defaultValueManager.GenerateDefaultValuesAsync(listForm, Enums.OperationEnum.Select, queryParameters: queryParameters);
|
||||||
|
|
||||||
|
// Performans: Dictionary ile hızlı lookup
|
||||||
|
var columnFormatsDict = result.ColumnFormats.ToDictionary(c => c.FieldName, c => c);
|
||||||
foreach (var field in defaultFields)
|
foreach (var field in defaultFields)
|
||||||
{
|
{
|
||||||
if (result.ColumnFormats.Any(a => a.FieldName == field.Key))
|
if (columnFormatsDict.TryGetValue(field.Key, out var columnFormat))
|
||||||
{
|
{
|
||||||
result.ColumnFormats.FirstOrDefault(a => a.FieldName == field.Key).DefaultValue = field.Value;
|
columnFormat.DefaultValue = field.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!listForm.ExtraFilterJson.IsNullOrWhiteSpace())
|
if (!listForm.ExtraFilterJson.IsNullOrWhiteSpace())
|
||||||
{
|
{
|
||||||
var extraFilterList = JsonSerializer.Deserialize<ExtraFilterEditDto[]>(listForm.ExtraFilterJson) ?? [];
|
var extraFilterList = JsonSerializer.Deserialize<ExtraFilterEditDto[]>(listForm.ExtraFilterJson) ?? [];
|
||||||
foreach (var extraFilter in extraFilterList)
|
var activeFilters = extraFilterList.Where(f => !string.IsNullOrWhiteSpace(f.SqlQuery)).ToList();
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(extraFilter.SqlQuery))
|
if (activeFilters.Count > 0)
|
||||||
{
|
{
|
||||||
|
// DataSource connection'ı bir kez al (performans)
|
||||||
var (dynamicDataRepository, connectionString, dataSourceType) =
|
var (dynamicDataRepository, connectionString, dataSourceType) =
|
||||||
await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
await dynamicDataManager.GetAsync(listForm.IsTenant, listForm.DataSourceCode);
|
||||||
|
|
||||||
var items = await dynamicDataRepository.QueryAsync(extraFilter.SqlQuery, connectionString);
|
// Dictionary ile hızlı lookup
|
||||||
if (items != null)
|
var filtersDict = result.GridOptions.ExtraFilterDto.ToDictionary(f => f.FieldName, f => f);
|
||||||
{
|
|
||||||
var filters = result.GridOptions.ExtraFilterDto.ToList();
|
|
||||||
var filter = filters.FirstOrDefault(a => a.FieldName == extraFilter.FieldName);
|
|
||||||
|
|
||||||
if (filter != null)
|
foreach (var extraFilter in activeFilters)
|
||||||
|
{
|
||||||
|
var items = await dynamicDataRepository.QueryAsync(extraFilter.SqlQuery, connectionString);
|
||||||
|
if (items != null && filtersDict.TryGetValue(extraFilter.FieldName, out var filter))
|
||||||
{
|
{
|
||||||
var newItems = new List<ExtraFilterItemsDto>();
|
var newItems = new List<ExtraFilterItemsDto>();
|
||||||
|
|
||||||
|
|
@ -350,11 +353,10 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe
|
||||||
|
|
||||||
filter.Items = newItems;
|
filter.Items = newItems;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 🔑 yeniden atıyoruz ki setter çalışsın
|
// 🔑 yeniden atıyoruz ki setter çalışsın
|
||||||
result.GridOptions.ExtraFilterDto = filters.ToArray();
|
result.GridOptions.ExtraFilterDto = filtersDict.Values.ToArray();
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue