Skip to content

Commit

Permalink
Rfx Reorder list's Where conditions to improve performance
Browse files Browse the repository at this point in the history
  • Loading branch information
jmcota committed Feb 4, 2022
1 parent 476b809 commit e70e3e9
Showing 1 changed file with 69 additions and 54 deletions.
123 changes: 69 additions & 54 deletions BalanceEngine/Domain/TrialBalanceHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ internal List<TrialBalanceEntry> CombineCurrencyTotalsAndPostingEntries(
foreach (var currencyEntry in summaryEntries
.Where(a => a.ItemType == TrialBalanceItemType.BalanceTotalCurrency)) {
var listSummaryByCurrency = trialBalance.Where(a => a.Ledger.Id == currencyEntry.Ledger.Id &&
a.Currency.Code == currencyEntry.Currency.Code).ToList();
a.Currency.Code == currencyEntry.Currency.Code).ToList();

if (listSummaryByCurrency.Count > 0) {
listSummaryByCurrency.Add(currencyEntry);
returnedEntries.AddRange(listSummaryByCurrency);
Expand Down Expand Up @@ -139,7 +139,7 @@ internal List<TrialBalanceEntry> CombineGroupEntriesAndPostingEntries(
a.Ledger.Id == totalGroupDebtorEntry.Ledger.Id &&
a.Currency.Id == totalGroupDebtorEntry.Currency.Id &&
a.Account.DebtorCreditor == DebtorCreditorType.Deudora).ToList();

debtorEntries.Add(totalGroupDebtorEntry);
returnedEntries.AddRange(debtorEntries);
}
Expand All @@ -151,7 +151,7 @@ internal List<TrialBalanceEntry> CombineGroupEntriesAndPostingEntries(
a.Ledger.Id == creditorEntry.Ledger.Id &&
a.Currency.Id == creditorEntry.Currency.Id &&
a.Account.DebtorCreditor == DebtorCreditorType.Acreedora).ToList();

creditorEntries.Add(creditorEntry);
returnedEntries.AddRange(creditorEntries);
}
Expand Down Expand Up @@ -413,7 +413,7 @@ internal List<TrialBalanceEntry> GenerateTotalSummaryConsolidated(
} else {
hash = $"{entry.GroupName}||{Sector.Empty.Code}||{entry.Ledger.Id}";
}

}

GenerateOrIncreaseEntries(totalSummaryConsolidated, entry, StandardAccount.Empty, Sector.Empty,
Expand Down Expand Up @@ -510,21 +510,24 @@ internal List<TrialBalanceEntry> GetSummaryByLevelAndSector(List<TrialBalanceEnt
if (_command.UseNewSectorizationModel) {
var summaryEntriesList = new List<TrialBalanceEntry>(summaryEntries);
foreach (var entry in summaryEntriesList) {

var entriesWithSummarySector = new List<TrialBalanceEntry>();
if (_command.TrialBalanceType == TrialBalanceType.AnaliticoDeCuentas ||

List<TrialBalanceEntry> entriesWithSummarySector;

if (_command.TrialBalanceType == TrialBalanceType.AnaliticoDeCuentas ||
_command.TrialBalanceType == TrialBalanceType.Balanza) {

entriesWithSummarySector = summaryEntries.Where(a => a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Account.Number == entry.Account.Number &&
a.DebtorCreditor == entry.DebtorCreditor).ToList();
entriesWithSummarySector = summaryEntries.Where(a => a.Account.Number == entry.Account.Number &&
a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.DebtorCreditor == entry.DebtorCreditor
).ToList();
} else {
entriesWithSummarySector = summaryEntries.Where(a => a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Account.Number == entry.Account.Number).ToList();
entriesWithSummarySector = summaryEntries.Where(a => a.Account.Number == entry.Account.Number &&
a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code
).ToList();
}

if (entry.Level > 1 &&
(entriesWithSummarySector.Count == 2 &&
entry.ItemType == TrialBalanceItemType.Summary) ||
Expand All @@ -541,26 +544,31 @@ internal List<TrialBalanceEntry> GetSummaryByLevelAndSector(List<TrialBalanceEnt

internal List<TrialBalanceEntry> GetSummaryEntriesAndSectorization(
List<TrialBalanceEntry> entriesList) {


var startTime = DateTime.Now;

var entriesMapped = GetEntriesMappedForSectorization(entriesList);

var hashEntries = new EmpiriaHashTable<TrialBalanceEntry>();
var checkSummaryEntries = new List<TrialBalanceEntry>(entriesMapped);
var returnedEntries = new List<TrialBalanceEntry>(entriesMapped);

if (_command.UseNewSectorizationModel) {
if (_command.WithSectorization) {
returnedEntries = GetSummaryEntriesWithSectorization(
hashEntries, checkSummaryEntries, returnedEntries);
} else {
returnedEntries = GetSummaryEntriesWithoutSectorization(
hashEntries, checkSummaryEntries, returnedEntries);
}
if (_command.UseNewSectorizationModel && _command.WithSectorization) {
returnedEntries = GetSummaryEntriesWithSectorization(
hashEntries, checkSummaryEntries, returnedEntries);
EmpiriaLog.Debug($"INNER GetSummaryEntriesWithSectorization(): {DateTime.Now.Subtract(startTime).TotalSeconds} seconds.");

} else if (_command.UseNewSectorizationModel && !_command.WithSectorization) {
returnedEntries = GetSummaryEntriesWithoutSectorization(
hashEntries, checkSummaryEntries, returnedEntries);
EmpiriaLog.Debug($"INNER GetSummaryEntriesWithoutSectorization(): {DateTime.Now.Subtract(startTime).TotalSeconds} seconds.");
}

returnedEntries = GetSummaryByLevelAndSector(returnedEntries.ToList());

return returnedEntries.ToList();
EmpiriaLog.Debug($"INNER GetSummaryByLevelAndSector(): {DateTime.Now.Subtract(startTime).TotalSeconds} seconds.");

return returnedEntries;
}


Expand All @@ -571,10 +579,11 @@ private List<TrialBalanceEntry> GetSummaryEntriesWithoutSectorization(
foreach (var entry in checkSummaryEntries) {

var sectorParent = entry.Sector.Parent;
var summaryEntry = returnedEntries.FirstOrDefault(a => a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Account.Number == entry.Account.Number &&
a.Sector.Code == "00");
var summaryEntry = returnedEntries.FirstOrDefault(a => a.Account.Number == entry.Account.Number &&
a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Sector.Code == "00");

if (summaryEntry != null && sectorParent.Code != "00" && entry.HasSector && entry.Level > 1) {
summaryEntry.InitialBalance += entry.InitialBalance;
summaryEntry.Debit += entry.Debit;
Expand All @@ -584,13 +593,14 @@ private List<TrialBalanceEntry> GetSummaryEntriesWithoutSectorization(
SummaryByEntry(hashEntries, entry, entry.Account, Sector.Empty, entry.ItemType);
}
}

if (hashEntries.Count > 0) {
foreach (var entry in hashEntries.ToFixedList().ToList()) {
var hashEntry = returnedEntries.FirstOrDefault(
a => a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Account.Number == entry.Account.Number &&
a.Sector.Code == entry.Sector.Code && a.Sector.Code == "00");
a => a.Account.Number == entry.Account.Number &&
a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Sector.Code == entry.Sector.Code && a.Sector.Code == "00");
if (hashEntry == null) {
returnedEntries.Add(entry);
}
Expand All @@ -606,11 +616,12 @@ private List<TrialBalanceEntry> GetSummaryEntriesWithSectorization(
List<TrialBalanceEntry> returnedEntries) {
foreach (var entry in checkSummaryEntries) {
var sectorParent = entry.Sector.Parent;
var summaryEntry = returnedEntries.FirstOrDefault(a => a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Account.Number == entry.Account.Number &&
a.Sector.Code == "00");
var summaryEntry = returnedEntries.FirstOrDefault(a => a.Account.Number == entry.Account.Number &&
a.Ledger.Number == entry.Ledger.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Sector.Code == "00");
if (summaryEntry != null && sectorParent.Code != "00" && entry.Level > 1) {

summaryEntry.InitialBalance += entry.InitialBalance;
summaryEntry.Debit += entry.Debit;
summaryEntry.Credit += entry.Credit;
Expand Down Expand Up @@ -675,7 +686,7 @@ internal List<TrialBalanceEntry> TrialBalanceWithSubledgerAccounts(List<TrialBal
returnedEntries = returnedEntries.Where(a => a.SubledgerNumberOfDigits == 0
//&& a.CurrentBalance != 0
).ToList();
}
}
if (_command.TrialBalanceType == TrialBalanceType.SaldosPorCuenta) {
returnedEntries = returnedEntries.Where(
a => a.ItemType != TrialBalanceItemType.BalanceTotalGroupDebtor &&
Expand All @@ -701,9 +712,10 @@ internal FixedList<TrialBalanceEntry> ValuateToExchangeRate(FixedList<TrialBalan

foreach (var entry in entries.Where(a => a.Currency.Code != "01")) {
var exchangeRate = exchangeRates.FirstOrDefault(a => a.FromCurrency.Code == commandPeriod.ValuateToCurrrencyUID &&
a.ToCurrency.Code == entry.Currency.Code);
a.ToCurrency.Code == entry.Currency.Code);

Assertion.AssertObject(exchangeRate, $"No hay tipo de cambio para la moneda {entry.Currency.FullName}.");
Assertion.AssertObject(exchangeRate, $"No se ha registrado el tipo de cambio para la " +
$"moneda {entry.Currency.FullName} en la fecha proporcionada.");

if (_command.TrialBalanceType == TrialBalanceType.BalanzaValorizadaComparativa) {
if (isSecondPeriod) {
Expand All @@ -727,8 +739,8 @@ internal FixedList<TrialBalanceEntry> ValuateToExchangeRate(FixedList<TrialBalan
private List<TrialBalanceEntry> AssignLastChangeDates(
FixedList<TrialBalanceEntry> entries,
EmpiriaHashTable<TrialBalanceEntry> summaryEntries) {
List<TrialBalanceEntry> summaryEntriesList =
new List<TrialBalanceEntry>(summaryEntries.ToFixedList().ToList());

var summaryEntriesList = new List<TrialBalanceEntry>(summaryEntries.Values);

foreach (var entry in entries) {
StandardAccount currentParent;
Expand All @@ -737,9 +749,9 @@ private List<TrialBalanceEntry> AssignLastChangeDates(
SetLastChangeDateToSubledgerAccounts(entry, summaryEntriesList);

LastChangeDateToSummaryEntries(entry, currentParent, summaryEntriesList);

}
return summaryEntriesList.ToList();

return summaryEntriesList;
}


Expand Down Expand Up @@ -772,9 +784,10 @@ private void GetDetailSummaryEntries(List<TrialBalanceEntry> detailSummaryEntrie

summaryEntries.TryGetValue(key, out detailsEntry);
if (detailsEntry != null) {
var existEntry = detailSummaryEntries.FirstOrDefault(a => a.Ledger.Id == detailsEntry.Ledger.Id &&
a.Currency.Id == detailsEntry.Currency.Id &&
var existEntry = detailSummaryEntries.FirstOrDefault(a =>
a.Account.Number == detailsEntry.Account.Number &&
a.Ledger.Id == detailsEntry.Ledger.Id &&
a.Currency.Id == detailsEntry.Currency.Id &&
a.Sector.Code == detailsEntry.Sector.Code);
if (existEntry == null) {
detailSummaryEntries.Add(detailsEntry);
Expand All @@ -785,6 +798,7 @@ private void GetDetailSummaryEntries(List<TrialBalanceEntry> detailSummaryEntrie

private void SetLastChangeDateToSubledgerAccounts(TrialBalanceEntry entry,
List<TrialBalanceEntry> trialBalance) {

var accountsList = trialBalance.Where(a => a.Account.Number == entry.Account.Number &&
a.Currency.Code == entry.Currency.Code &&
a.Sector.Code == entry.Sector.Code).ToList();
Expand All @@ -793,6 +807,7 @@ private void SetLastChangeDateToSubledgerAccounts(TrialBalanceEntry entry,
account.LastChangeDate = entry.LastChangeDate;
}
}

}


Expand Down Expand Up @@ -966,29 +981,29 @@ private void SummaryByGroupEntries(EmpiriaHashTable<TrialBalanceEntry> summaryEn
string hash;

if (balanceEntry.DebtorCreditor == DebtorCreditorType.Deudora) {

if (_command.TrialBalanceType == TrialBalanceType.SaldosPorCuenta &&
((_command.WithSubledgerAccount && _command.ShowCascadeBalances) ||
((_command.WithSubledgerAccount && _command.ShowCascadeBalances) ||
_command.ShowCascadeBalances)) {
hash = $"{balanceEntry.Ledger.Id}||{groupEntry.DebtorCreditor}||{groupEntry.Currency.Id}||{groupEntry.GroupNumber}";
} else {
hash = $"{groupEntry.DebtorCreditor}||{groupEntry.Currency.Id}||{groupEntry.GroupNumber}";
}


GenerateOrIncreaseEntries(summaryEntries, groupEntry, StandardAccount.Empty, Sector.Empty,
TrialBalanceItemType.BalanceTotalGroupDebtor, hash);

} else if (balanceEntry.DebtorCreditor == DebtorCreditorType.Acreedora) {

if (_command.TrialBalanceType == TrialBalanceType.SaldosPorCuenta &&
((_command.WithSubledgerAccount && _command.ShowCascadeBalances) ||
((_command.WithSubledgerAccount && _command.ShowCascadeBalances) ||
_command.ShowCascadeBalances)) {
hash = $"{balanceEntry.Ledger.Id}||{groupEntry.DebtorCreditor}||{groupEntry.Currency.Id}||{groupEntry.GroupNumber}";
hash = $"{balanceEntry.Ledger.Id}||{groupEntry.DebtorCreditor}||{groupEntry.Currency.Id}||{groupEntry.GroupNumber}";
} else {
hash = $"{groupEntry.DebtorCreditor}||{groupEntry.Currency.Id}||{groupEntry.GroupNumber}";
}

GenerateOrIncreaseEntries(summaryEntries, groupEntry, StandardAccount.Empty, Sector.Empty,
TrialBalanceItemType.BalanceTotalGroupCreditor, hash);
}
Expand Down

0 comments on commit e70e3e9

Please sign in to comment.