taskain7 commented on code in PR #3240:
URL: https://github.com/apache/fineract/pull/3240#discussion_r1222550197


##########
fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/domain/JobExecutionRepository.java:
##########
@@ -165,30 +170,85 @@ public void updateJobStatusToFailed(Long stuckJobId, 
String partitionerStepName)
                 """, Map.of("status", FAILED.name(), "jobExecutionId", 
stuckJobId));
     }
 
-    public List<Long> getRunningJobsIdsByExecutionParameter(String jobName, 
String jobCustomParamKeyName, String parameterKeyName,
+    public LocalDate getBusinessDateOfRunningJobByExecutionParameter(String 
jobName, String jobCustomParamKeyName, String parameterKeyName,
             String parameterValue) {
-        final StringBuilder sqlStatementBuilder = new StringBuilder();
-        String jsonString = gson.toJson(new JobParameterDTO(parameterKeyName, 
parameterValue));
-        sqlStatementBuilder.append(
-                "SELECT bje.JOB_EXECUTION_ID FROM BATCH_JOB_INSTANCE bji INNER 
JOIN BATCH_JOB_EXECUTION bje ON bji.JOB_INSTANCE_ID = bje.JOB_INSTANCE_ID INNER 
JOIN BATCH_JOB_EXECUTION_PARAMS bjep ON bje.JOB_EXECUTION_ID = 
bjep.JOB_EXECUTION_ID"
-                        + " WHERE bje.STATUS IN (:statuses) AND bji.JOB_NAME = 
:jobName AND bjep.PARAMETER_NAME = :jobCustomParamKeyName AND "
-                        + sqlGenerator.castInteger("bjep.PARAMETER_VALUE") + " 
IN (" + getSubQueryForCustomJobParameters()
-                        + ") AND bje.JOB_INSTANCE_ID NOT IN (SELECT 
bje.JOB_INSTANCE_ID FROM BATCH_JOB_INSTANCE bji INNER JOIN BATCH_JOB_EXECUTION 
bje ON bji.JOB_INSTANCE_ID = bje.JOB_INSTANCE_ID"
-                        + " WHERE bje.STATUS = :completedStatus AND 
bji.JOB_NAME = :jobName)");
-        return namedParameterJdbcTemplate.queryForList(
-                sqlStatementBuilder.toString(), Map.of("statuses", 
List.of(STARTED.name(), STARTING.name()), "jobName", jobName,
-                        "completedStatus", COMPLETED.name(), 
"jobCustomParamKeyName", jobCustomParamKeyName, "jsonString", jsonString),
-                Long.class);
-    }
-
-    private String getSubQueryForCustomJobParameters() {
-        if (databaseTypeResolver.isMySQL()) {
-            return "SELECT cjp.id FROM batch_custom_job_parameters cjp WHERE 
JSON_CONTAINS(cjp.parameter_json,:jsonString)";
-        } else if (databaseTypeResolver.isPostgreSQL()) {
-            return "SELECT cjp.id FROM (SELECT 
id,json_array_elements(parameter_json) AS json_data FROM 
batch_custom_job_parameters) AS cjp WHERE (cjp.json_data ::jsonb @> :jsonString 
::jsonb)";
-        } else {
-            throw new IllegalStateException("Database type is not supported 
for json query " + databaseTypeResolver.databaseType());
+        String businessDateInString;
+        try {
+            if (databaseTypeResolver.isPostgreSQL()) {
+                businessDateInString = 
namedParameterJdbcTemplate.queryForObject("""
+                        SELECT "parameterValue" FROM 
json_populate_recordset(null::record,
+                        (SELECT
+                            CJP.parameter_json
+                        FROM
+                            BATCH_JOB_INSTANCE BJI
+                                INNER JOIN BATCH_JOB_EXECUTION BJE ON 
BJI.JOB_INSTANCE_ID = BJE.JOB_INSTANCE_ID
+                                INNER JOIN BATCH_JOB_EXECUTION_PARAMS BJEP ON 
BJE.JOB_EXECUTION_ID = BJEP.JOB_EXECUTION_ID
+                                inner join batch_custom_job_parameters CJP ON 
cast(BJEP.parameter_value as bigint) = CJP.id
+                                AND BJEP.parameter_name = 
:jobCustomParamKeyName
+                                CROSS JOIN LATERAL 
json_array_elements(CJP.parameter_json) J
+                        WHERE
+                                    J ->> 'parameterName' = :parameterKeyName
+                          AND J ->> 'parameterValue' = :parameterValue
+                          AND BJE.STATUS IN (:statuses)
+                          AND BJI.JOB_NAME = :jobName
+                          AND BJE.JOB_INSTANCE_ID NOT IN (
+                            SELECT
+                                IBJE.JOB_INSTANCE_ID
+                            FROM
+                                BATCH_JOB_INSTANCE IBJI
+                                    INNER JOIN BATCH_JOB_EXECUTION IBJE ON 
IBJI.JOB_INSTANCE_ID = IBJE.JOB_INSTANCE_ID
+                            WHERE
+                                    IBJE.STATUS IN (:completedStatuses)
+                              AND IBJI.JOB_NAME = :jobName
+                        )) AS ("parameterName" varchar(100), "parameterValue" 
varchar(100)) where "parameterName" = 'BusinessDate';
+                        """,
+                        Map.of("jobCustomParamKeyName", jobCustomParamKeyName, 
"parameterKeyName", parameterKeyName, "parameterValue",
+                                parameterValue, "statuses", 
List.of(STARTED.name(), STARTING.name()), "completedStatuses",
+                                List.of(COMPLETED.name(), FAILED.name(), 
UNKNOWN.name()), "jobName", jobName),
+                        String.class);
+            } else if (databaseTypeResolver.isMySQL()) {
+                businessDateInString = 
namedParameterJdbcTemplate.queryForObject(
+                        """
+                                SELECT PARAMS.parameter_value FROM json_table(

Review Comment:
   ther is a WHERE clause at the very end of the query that filters for only 
the 'BusinessDate' parameter



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to