This is an automated email from the ASF dual-hosted git repository.

adamsaghy pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 6eba33758 [FINERACT-1678] Exclude loan IDs from execution context
6eba33758 is described below

commit 6eba33758beb69fffaa8bbc03fe6de990fbfb4ce
Author: taskain7 <[email protected]>
AuthorDate: Wed Apr 12 06:55:50 2023 +0200

    [FINERACT-1678] Exclude loan IDs from execution context
---
 .../fineract/cob/loan/ApplyLoanLockTasklet.java    |  5 ++--
 .../apache/fineract/cob/loan/LoanCOBConstant.java  |  2 ++
 .../cob/loan/LoanCOBManagerConfiguration.java      |  4 +--
 .../fineract/cob/loan/LoanCOBPartitioner.java      | 33 +++++++++-------------
 .../fineract/cob/loan/LoanIdParameterTasklet.java  |  5 ++--
 .../apache/fineract/cob/loan/LoanItemReader.java   |  7 +++--
 .../loanaccount/domain/LoanRepository.java         |  9 +++---
 .../loan/ApplyLoanLockTaskletStepDefinitions.java  |  2 +-
 .../loan/LoanCOBPartitionerStepDefinitions.java    |  3 +-
 .../cob/loan/LoanItemReaderStepDefinitions.java    |  4 +--
 10 files changed, 35 insertions(+), 39 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
index 06a23060b..10a686a6e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/ApplyLoanLockTasklet.java
@@ -64,8 +64,9 @@ public class ApplyLoanLockTasklet implements Tasklet {
                 || (loanCOBParameter.getMinLoanId().equals(0L) && 
loanCOBParameter.getMaxLoanId().equals(0L))) {
             loanIds = Collections.emptyList();
         } else {
-            loanIds = new 
ArrayList<>(loanRepository.findAllNonClosedLoansBehindOrNullByMinAndMaxLoanId(loanCOBParameter.getMinLoanId(),
-                    loanCOBParameter.getMaxLoanId(), 
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE)));
+            loanIds = new 
ArrayList<>(loanRepository.findAllNonClosedLoansByLastClosedBusinessDateAndMinAndMaxLoanId(
+                    loanCOBParameter.getMinLoanId(), 
loanCOBParameter.getMaxLoanId(), ThreadLocalContextUtil
+                            
.getBusinessDateByType(BusinessDateType.COB_DATE).minusDays(LoanCOBConstant.NUMBER_OF_DAYS_BEHIND)));
         }
         List<List<Long>> loanIdPartitions = Lists.partition(loanIds, 
fineractProperties.getQuery().getInClauseParameterSizeLimit());
         List<LoanAccountLock> accountLocks = new ArrayList<>();
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java
index d7e5fedd7..fdd3647ce 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java
@@ -34,6 +34,8 @@ public final class LoanCOBConstant {
     public static final String LOAN_COB_PARTITIONER_STEP = "Loan COB partition 
- Step";
     public static final String LOAN_COB_CUSTOM_JOB_PARAMETER_KEY = 
"CUSTOM_JOB_PARAMETER_ID";
 
+    public static final Long NUMBER_OF_DAYS_BEHIND = 1L;
+
     private LoanCOBConstant() {
 
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
index bb944c509..ac086dca8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBManagerConfiguration.java
@@ -83,8 +83,8 @@ public class LoanCOBManagerConfiguration {
 
     @Bean
     @JobScope
-    public LoanCOBPartitioner 
partitioner(@Value("#{jobExecutionContext['loanIds']}") LoanCOBParameter 
minAndMaxLoanId) {
-        return new LoanCOBPartitioner(propertyService, cobBusinessStepService, 
jobOperator, jobExplorer, minAndMaxLoanId);
+    public LoanCOBPartitioner 
partitioner(@Value("#{jobExecutionContext['loanCobParameter']}") 
LoanCOBParameter loanCOBParameter) {
+        return new LoanCOBPartitioner(propertyService, cobBusinessStepService, 
jobOperator, jobExplorer, loanCOBParameter);
     }
 
     @Bean
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java
index 25733d7cd..cc8da931a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java
@@ -18,10 +18,13 @@
  */
 package org.apache.fineract.cob.loan;
 
+import com.google.common.collect.Lists;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.LongStream;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fineract.cob.COBBusinessStepService;
@@ -66,34 +69,24 @@ public class LoanCOBPartitioner implements Partitioner {
             stopJobExecution();
             return Map.of();
         }
-        int partitionIndex = 1;
-        createNewPartition(partitions, partitionIndex, cobBusinessSteps);
         if (!Objects.isNull(minAndMaxLoanId)) {
-            long remainingLoanIdCount = minAndMaxLoanId.getMaxLoanId() - 
minAndMaxLoanId.getMinLoanId() + 1;
-            long startLoanId = minAndMaxLoanId.getMinLoanId();
-            long endLoanId;
-            do {
-                String key = PARTITION_PREFIX + partitionIndex;
-                ExecutionContext executionContext = partitions.get(key);
-                if (remainingLoanIdCount > partitionSize) {
-                    endLoanId = startLoanId + partitionSize - 1;
-                    partitionIndex++;
-                    createNewPartition(partitions, partitionIndex, 
cobBusinessSteps);
-                } else {
-                    endLoanId = minAndMaxLoanId.getMaxLoanId();
-                }
-                executionContext.put(LoanCOBConstant.LOAN_COB_PARAMETER, new 
LoanCOBParameter(startLoanId, endLoanId));
-                startLoanId = startLoanId + partitionSize;
-                remainingLoanIdCount = minAndMaxLoanId.getMaxLoanId() - 
endLoanId;
-            } while (remainingLoanIdCount > 0);
+            List<Long> loanIdsInRange = 
LongStream.rangeClosed(minAndMaxLoanId.getMinLoanId(), 
minAndMaxLoanId.getMaxLoanId()).boxed()
+                    .toList();
+            List<List<Long>> loanIdPartitions = 
Lists.partition(loanIdsInRange, partitionSize);
+            for (int i = 0; i < loanIdPartitions.size(); i++) {
+                createNewPartition(partitions, i + 1, cobBusinessSteps, 
loanIdPartitions.get(i));
+            }
+        } else {
+            createNewPartition(partitions, 1, cobBusinessSteps, List.of(0L));
         }
         return partitions;
     }
 
     private void createNewPartition(Map<String, ExecutionContext> partitions, 
int partitionIndex,
-            Set<BusinessStepNameAndOrder> cobBusinessSteps) {
+            Set<BusinessStepNameAndOrder> cobBusinessSteps, List<Long> 
loanIds) {
         ExecutionContext executionContext = new ExecutionContext();
         executionContext.put(LoanCOBConstant.BUSINESS_STEPS, cobBusinessSteps);
+        executionContext.put(LoanCOBConstant.LOAN_COB_PARAMETER, new 
LoanCOBParameter(loanIds.get(0), loanIds.get(loanIds.size() - 1)));
         executionContext.put("partition", PARTITION_PREFIX + partitionIndex);
         partitions.put(PARTITION_PREFIX + partitionIndex, executionContext);
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanIdParameterTasklet.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanIdParameterTasklet.java
index a463503b9..78e73253e 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanIdParameterTasklet.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanIdParameterTasklet.java
@@ -32,8 +32,6 @@ import org.springframework.batch.repeat.RepeatStatus;
 @RequiredArgsConstructor
 public class LoanIdParameterTasklet implements Tasklet {
 
-    private static final Long NUMBER_OF_DAYS_BEHIND = 1L;
-
     private final RetrieveLoanIdService retrieveLoanIdService;
 
     @Override
@@ -41,7 +39,8 @@ public class LoanIdParameterTasklet implements Tasklet {
         String businessDateParameter = (String) 
contribution.getStepExecution().getJobExecution().getExecutionContext()
                 .get(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME);
         LocalDate businessDate = 
LocalDate.parse(Objects.requireNonNull(businessDateParameter));
-        LoanCOBParameter minAndMaxLoanId = 
retrieveLoanIdService.retrieveMinAndMaxLoanIdsNDaysBehind(NUMBER_OF_DAYS_BEHIND,
 businessDate);
+        LoanCOBParameter minAndMaxLoanId = 
retrieveLoanIdService.retrieveMinAndMaxLoanIdsNDaysBehind(LoanCOBConstant.NUMBER_OF_DAYS_BEHIND,
+                businessDate);
         if (Objects.isNull(minAndMaxLoanId)
                 || (Objects.isNull(minAndMaxLoanId.getMinLoanId()) && 
Objects.isNull(minAndMaxLoanId.getMaxLoanId()))) {
             
contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_COB_PARAMETER,
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java
 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java
index 8dd6b3b2d..8d9464b42 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java
@@ -40,7 +40,7 @@ public class LoanItemReader extends AbstractLoanItemReader {
     @BeforeStep
     @SuppressWarnings({ "unchecked" })
     public void beforeStep(@NotNull StepExecution stepExecution) {
-        ExecutionContext executionContext = 
stepExecution.getJobExecution().getExecutionContext();
+        ExecutionContext executionContext = 
stepExecution.getExecutionContext();
         LoanCOBParameter loanCOBParameter = (LoanCOBParameter) 
executionContext.get(LoanCOBConstant.LOAN_COB_PARAMETER);
         List<Long> loanIds;
         if (Objects.isNull(loanCOBParameter)
@@ -48,8 +48,9 @@ public class LoanItemReader extends AbstractLoanItemReader {
                 || (loanCOBParameter.getMinLoanId().equals(0L) && 
loanCOBParameter.getMaxLoanId().equals(0L))) {
             loanIds = Collections.emptyList();
         } else {
-            loanIds = 
loanRepository.findAllNonClosedLoansBehindOrNullByMinAndMaxLoanId(loanCOBParameter.getMinLoanId(),
-                    loanCOBParameter.getMaxLoanId(), 
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE));
+            loanIds = 
loanRepository.findAllNonClosedLoansByLastClosedBusinessDateAndMinAndMaxLoanId(loanCOBParameter.getMinLoanId(),
+                    loanCOBParameter.getMaxLoanId(), 
ThreadLocalContextUtil.getBusinessDateByType(BusinessDateType.COB_DATE)
+                            .minusDays(LoanCOBConstant.NUMBER_OF_DAYS_BEHIND));
         }
         setRemainingData(new ArrayList<>(loanIds));
     }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
index 7fdcc8707..de3de3bef 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepository.java
@@ -91,8 +91,7 @@ public interface LoanRepository extends JpaRepository<Loan, 
Long>, JpaSpecificat
     String FIND_ALL_NON_CLOSED_LOANS_BEHIND_OR_NULL_BY_LOAN_IDS = "select 
loan.id, loan.lastClosedBusinessDate from Loan loan where loan.id IN :loanIds 
and loan.loanStatus in (100,200,300,303,304) and (loan.lastClosedBusinessDate < 
:cobBusinessDate or "
             + "loan.lastClosedBusinessDate is null)";
 
-    String FIND_ALL_NON_CLOSED_LOANS_BEHIND_OR_NULL_BY_MIN_AND_MAX_LOAN_ID = 
"select loan.id from Loan loan where loan.id BETWEEN :minLoanId and :maxLoanId 
and loan.loanStatus in (100,200,300,303,304) and (loan.lastClosedBusinessDate < 
"
-            + ":cobBusinessDate or loan.lastClosedBusinessDate is null)";
+    String 
FIND_ALL_NON_CLOSED_LOANS_BY_LAST_CLOSED_BUSINESS_DATE_AND_MIN_AND_MAX_LOAN_ID 
= "select loan.id from Loan loan where loan.id BETWEEN :minLoanId and 
:maxLoanId and loan.loanStatus in (100,200,300,303,304) and (:cobBusinessDate = 
loan.lastClosedBusinessDate or loan.lastClosedBusinessDate is NULL)";
 
     String FIND_ALL_NON_CLOSED_LOANS_BEHIND_BY_LOAN_IDS = "select loan.id, 
loan.lastClosedBusinessDate from Loan loan where loan.id IN :loanIds and 
loan.loanStatus in (100,200,300,303,304) and loan.lastClosedBusinessDate < 
:cobBusinessDate";
 
@@ -207,9 +206,9 @@ public interface LoanRepository extends JpaRepository<Loan, 
Long>, JpaSpecificat
     List<LoanIdAndLastClosedBusinessDate> 
findAllNonClosedLoansBehindOrNullByLoanIds(@Param("cobBusinessDate") LocalDate 
cobBusinessDate,
             @Param("loanIds") List<Long> loanIds);
 
-    @Query(FIND_ALL_NON_CLOSED_LOANS_BEHIND_OR_NULL_BY_MIN_AND_MAX_LOAN_ID)
-    List<Long> 
findAllNonClosedLoansBehindOrNullByMinAndMaxLoanId(@Param("minLoanId") Long 
minLoanId, @Param("maxLoanId") Long maxLoanId,
-            @Param("cobBusinessDate") LocalDate cobBusinessDate);
+    
@Query(FIND_ALL_NON_CLOSED_LOANS_BY_LAST_CLOSED_BUSINESS_DATE_AND_MIN_AND_MAX_LOAN_ID)
+    List<Long> 
findAllNonClosedLoansByLastClosedBusinessDateAndMinAndMaxLoanId(@Param("minLoanId")
 Long minLoanId,
+            @Param("maxLoanId") Long maxLoanId, @Param("cobBusinessDate") 
LocalDate cobBusinessDate);
 
     @Query(FIND_OLDEST_COB_PROCESSED_LOAN)
     List<LoanIdAndLastClosedBusinessDate> 
findOldestCOBProcessedLoan(@Param("cobBusinessDate") LocalDate cobBusinessDate);
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
index 47165937e..7e9c7f641 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/ApplyLoanLockTaskletStepDefinitions.java
@@ -71,7 +71,7 @@ public class ApplyLoanLockTaskletStepDefinitions implements 
En {
             StepExecution stepExecution = new StepExecution("test", null);
             ExecutionContext executionContext = new ExecutionContext();
             executionContext.put(LoanCOBConstant.LOAN_COB_PARAMETER, new 
LoanCOBParameter(1L, 4L));
-            
lenient().when(this.loanRepository.findAllNonClosedLoansBehindOrNullByMinAndMaxLoanId(anyLong(),
 anyLong(), any()))
+            
lenient().when(this.loanRepository.findAllNonClosedLoansByLastClosedBusinessDateAndMinAndMaxLoanId(anyLong(),
 anyLong(), any()))
                     .thenReturn(List.of(1L, 2L, 3L, 4L));
             stepExecution.setExecutionContext(executionContext);
             this.stepContribution = new StepContribution(stepExecution);
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java
 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java
index 012dbd317..91b5fbb0f 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java
@@ -128,7 +128,8 @@ public class LoanCOBPartitionerStepDefinitions implements 
En {
                         
businessSteps.stream().findFirst().get().getStepName());
                 LoanCOBParameter loanCOBParameter = (LoanCOBParameter) 
resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1")
                         .get(LoanCOBConstant.LOAN_COB_PARAMETER);
-                assertEquals(null, loanCOBParameter);
+                assertEquals(0L, loanCOBParameter.getMinLoanId());
+                assertEquals(0L, loanCOBParameter.getMaxLoanId());
             }
         });
     }
diff --git 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java
 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java
index b35b0ec38..292a8e463 100644
--- 
a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java
+++ 
b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemReaderStepDefinitions.java
@@ -71,9 +71,9 @@ public class LoanItemReaderStepDefinitions implements En {
                 maxLoanId = splitAccounts.get(splitAccounts.size() - 1);
             }
             stepExecutionContext.put(LoanCOBConstant.LOAN_COB_PARAMETER, new 
LoanCOBParameter(minLoanId, maxLoanId));
-            jobExecution.setExecutionContext(stepExecutionContext);
+            stepExecution.setExecutionContext(stepExecutionContext);
 
-            
lenient().when(this.loanRepository.findAllNonClosedLoansBehindOrNullByMinAndMaxLoanId(anyLong(),
 anyLong(), any()))
+            
lenient().when(this.loanRepository.findAllNonClosedLoansByLastClosedBusinessDateAndMinAndMaxLoanId(anyLong(),
 anyLong(), any()))
                     .thenReturn(splitAccounts);
 
             HashMap<BusinessDateType, LocalDate> businessDates = new 
HashMap<>();

Reply via email to