Skip to content

Commit 57dcd06

Browse files
authored
Merge pull request #5748
FINERACT-2583: Batch entity lookups in holiday office selection, provisioning criteria, and collateral assembly
2 parents 2f924b1 + 9073070 commit 57dcd06

5 files changed

Lines changed: 50 additions & 10 deletions

File tree

fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/service/HolidayWritePlatformServiceJpaRepositoryImpl.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import java.util.HashSet;
2828
import java.util.Map;
2929
import java.util.Set;
30+
import java.util.function.Function;
31+
import java.util.stream.Collectors;
3032
import lombok.RequiredArgsConstructor;
3133
import lombok.extern.slf4j.Slf4j;
3234
import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -44,7 +46,9 @@
4446
import org.apache.fineract.organisation.holiday.domain.HolidayRepositoryWrapper;
4547
import org.apache.fineract.organisation.holiday.exception.HolidayDateException;
4648
import org.apache.fineract.organisation.office.domain.Office;
49+
import org.apache.fineract.organisation.office.domain.OfficeRepository;
4750
import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
51+
import org.apache.fineract.organisation.office.exception.OfficeNotFoundException;
4852
import org.apache.fineract.organisation.workingdays.domain.WorkingDays;
4953
import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
5054
import org.apache.fineract.organisation.workingdays.service.WorkingDaysUtil;
@@ -61,6 +65,7 @@ public class HolidayWritePlatformServiceJpaRepositoryImpl implements HolidayWrit
6165
private final WorkingDaysRepositoryWrapper daysRepositoryWrapper;
6266
private final PlatformSecurityContext context;
6367
private final OfficeRepositoryWrapper officeRepositoryWrapper;
68+
private final OfficeRepository officeRepository;
6469
private final FromJsonHelper fromApiJsonHelper;
6570

6671
@Transactional
@@ -162,11 +167,21 @@ private Set<Office> getSelectedOffices(final JsonCommand command) {
162167
&& topLevelJsonElement.get(HolidayApiConstants.officesParamName).isJsonArray()) {
163168

164169
final JsonArray array = topLevelJsonElement.get(HolidayApiConstants.officesParamName).getAsJsonArray();
170+
Set<Long> officeIds = new HashSet<>(array.size());
171+
for (int i = 0; i < array.size(); i++) {
172+
officeIds.add(
173+
this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, array.get(i).getAsJsonObject()));
174+
}
175+
Map<Long, Office> officeMap = this.officeRepository.findAllById(officeIds).stream()
176+
.collect(Collectors.toMap(Office::getId, Function.identity()));
165177
offices = new HashSet<>(array.size());
166178
for (int i = 0; i < array.size(); i++) {
167-
final JsonObject officeElement = array.get(i).getAsJsonObject();
168-
final Long officeId = this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName, officeElement);
169-
final Office office = this.officeRepositoryWrapper.findOneWithNotFoundDetection(officeId);
179+
final Long officeId = this.fromApiJsonHelper.extractLongNamed(HolidayApiConstants.officeIdParamName,
180+
array.get(i).getAsJsonObject());
181+
final Office office = officeMap.get(officeId);
182+
if (office == null) {
183+
throw new OfficeNotFoundException(officeId);
184+
}
170185
offices.add(office);
171186
}
172187
}

fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/starter/OrganisationHolidayConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.fineract.organisation.holiday.service.HolidayReadPlatformServiceImpl;
2727
import org.apache.fineract.organisation.holiday.service.HolidayWritePlatformService;
2828
import org.apache.fineract.organisation.holiday.service.HolidayWritePlatformServiceJpaRepositoryImpl;
29+
import org.apache.fineract.organisation.office.domain.OfficeRepository;
2930
import org.apache.fineract.organisation.office.domain.OfficeRepositoryWrapper;
3031
import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
3132
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -46,8 +47,8 @@ public HolidayReadPlatformService holidayReadPlatformService(PlatformSecurityCon
4647
@ConditionalOnMissingBean(HolidayWritePlatformService.class)
4748
public HolidayWritePlatformService holidayWritePlatformService(HolidayDataValidator fromApiJsonDeserializer,
4849
HolidayRepositoryWrapper holidayRepository, PlatformSecurityContext context, OfficeRepositoryWrapper officeRepositoryWrapper,
49-
FromJsonHelper fromApiJsonHelper, WorkingDaysRepositoryWrapper daysRepositoryWrapper) {
50+
OfficeRepository officeRepository, FromJsonHelper fromApiJsonHelper, WorkingDaysRepositoryWrapper daysRepositoryWrapper) {
5051
return new HolidayWritePlatformServiceJpaRepositoryImpl(fromApiJsonDeserializer, holidayRepository, daysRepositoryWrapper, context,
51-
officeRepositoryWrapper, fromApiJsonHelper);
52+
officeRepositoryWrapper, officeRepository, fromApiJsonHelper);
5253
}
5354
}

fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/service/ProvisioningCriteriaAssembler.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
import java.util.HashSet;
2727
import java.util.List;
2828
import java.util.Locale;
29+
import java.util.Map;
2930
import java.util.Set;
31+
import java.util.function.Function;
32+
import java.util.stream.Collectors;
3033
import lombok.RequiredArgsConstructor;
3134
import org.apache.fineract.accounting.glaccount.domain.GLAccount;
3235
import org.apache.fineract.accounting.glaccount.domain.GLAccountRepository;
@@ -57,9 +60,14 @@ public List<LoanProduct> parseLoanProducts(final JsonElement jsonElement) {
5760
if (fromApiJsonHelper.parameterExists(ProvisioningCriteriaConstants.JSON_LOANPRODUCTS_PARAM, jsonElement)) {
5861
JsonArray jsonloanProducts = this.fromApiJsonHelper.extractJsonArrayNamed(ProvisioningCriteriaConstants.JSON_LOANPRODUCTS_PARAM,
5962
jsonElement);
63+
List<Long> productIds = new ArrayList<>(jsonloanProducts.size());
6064
for (JsonElement element : jsonloanProducts) {
61-
Long productId = this.fromApiJsonHelper.extractLongNamed("id", element.getAsJsonObject());
62-
loanProducts.add(loanProductRepository.findById(productId).orElse(null));
65+
productIds.add(this.fromApiJsonHelper.extractLongNamed("id", element.getAsJsonObject()));
66+
}
67+
Map<Long, LoanProduct> productMap = loanProductRepository.findAllById(productIds).stream()
68+
.collect(Collectors.toMap(LoanProduct::getId, Function.identity()));
69+
for (Long productId : productIds) {
70+
loanProducts.add(productMap.getOrDefault(productId, null));
6371
}
6472
} else {
6573
loanProducts = loanProductRepository.findAll();

fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/service/CollateralAssembler.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@
2424
import java.math.BigDecimal;
2525
import java.util.HashSet;
2626
import java.util.Locale;
27+
import java.util.Map;
2728
import java.util.Set;
29+
import java.util.function.Function;
30+
import java.util.stream.Collectors;
2831
import lombok.RequiredArgsConstructor;
2932
import org.apache.fineract.infrastructure.codes.domain.CodeValue;
33+
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepository;
3034
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrapper;
35+
import org.apache.fineract.infrastructure.codes.exception.CodeValueNotFoundException;
3136
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
3237
import org.apache.fineract.portfolio.collateral.domain.LoanCollateral;
3338
import org.apache.fineract.portfolio.collateral.domain.LoanCollateralRepository;
@@ -38,6 +43,7 @@ public class CollateralAssembler {
3843

3944
private final FromJsonHelper fromApiJsonHelper;
4045
private final CodeValueRepositoryWrapper codeValueRepository;
46+
private final CodeValueRepository codeValueRepositoryDirect;
4147
private final LoanCollateralRepository loanCollateralRepository;
4248

4349
public Set<LoanCollateral> fromParsedJson(final JsonElement element) {
@@ -50,13 +56,22 @@ public Set<LoanCollateral> fromParsedJson(final JsonElement element) {
5056
if (topLevelJsonElement.has("collateral") && topLevelJsonElement.get("collateral").isJsonArray()) {
5157
final JsonArray array = topLevelJsonElement.get("collateral").getAsJsonArray();
5258
final Locale locale = this.fromApiJsonHelper.extractLocaleParameter(topLevelJsonElement);
59+
Set<Long> collateralTypeIds = new HashSet<>();
60+
for (int i = 0; i < array.size(); i++) {
61+
collateralTypeIds.add(this.fromApiJsonHelper.extractLongNamed("type", array.get(i).getAsJsonObject()));
62+
}
63+
Map<Long, CodeValue> codeValueMap = this.codeValueRepositoryDirect.findAllById(collateralTypeIds).stream()
64+
.collect(Collectors.toMap(CodeValue::getId, Function.identity()));
5365
for (int i = 0; i < array.size(); i++) {
5466

5567
final JsonObject collateralItemElement = array.get(i).getAsJsonObject();
5668

5769
final Long id = this.fromApiJsonHelper.extractLongNamed("id", collateralItemElement);
5870
final Long collateralTypeId = this.fromApiJsonHelper.extractLongNamed("type", collateralItemElement);
59-
final CodeValue collateralType = this.codeValueRepository.findOneWithNotFoundDetection(collateralTypeId);
71+
final CodeValue collateralType = codeValueMap.get(collateralTypeId);
72+
if (collateralType == null) {
73+
throw new CodeValueNotFoundException(collateralTypeId);
74+
}
6075
final String description = this.fromApiJsonHelper.extractStringNamed("description", collateralItemElement);
6176
final BigDecimal value = this.fromApiJsonHelper.extractBigDecimalNamed("value", collateralItemElement, locale);
6277

fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/starter/CollateralConfiguration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.fineract.portfolio.collateral.starter;
2020

21+
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepository;
2122
import org.apache.fineract.infrastructure.codes.domain.CodeValueRepositoryWrapper;
2223
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
2324
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
@@ -40,8 +41,8 @@ public class CollateralConfiguration {
4041
@Bean
4142
@ConditionalOnMissingBean(CollateralAssembler.class)
4243
public CollateralAssembler collateralAssembler(FromJsonHelper fromApiJsonHelper, CodeValueRepositoryWrapper codeValueRepository,
43-
LoanCollateralRepository loanCollateralRepository) {
44-
return new CollateralAssembler(fromApiJsonHelper, codeValueRepository, loanCollateralRepository);
44+
CodeValueRepository codeValueRepositoryDirect, LoanCollateralRepository loanCollateralRepository) {
45+
return new CollateralAssembler(fromApiJsonHelper, codeValueRepository, codeValueRepositoryDirect, loanCollateralRepository);
4546
}
4647

4748
@Bean

0 commit comments

Comments
 (0)