adamsaghy commented on code in PR #3240:
URL: https://github.com/apache/fineract/pull/3240#discussion_r1222592563
##########
fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/domain/JobExecutionRepository.java:
##########
@@ -165,30 +154,80 @@ 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());
+ try {
+ if (databaseTypeResolver.isPostgreSQL()) {
+ return namedParameterJdbcTemplate.queryForObject("""
+ SELECT JSON ->> 'parameterValue' FROM
+ json_array_elements((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
+ ))) JSON WHERE JSON ->> 'parameterName' =
'BusinessDate';
Review Comment:
this should not be hardwired...
##########
fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/domain/JobExecutionRepository.java:
##########
@@ -165,30 +154,80 @@ 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());
+ try {
+ if (databaseTypeResolver.isPostgreSQL()) {
+ return namedParameterJdbcTemplate.queryForObject("""
+ SELECT JSON ->> 'parameterValue' FROM
+ json_array_elements((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
+ ))) JSON WHERE JSON ->> 'parameterName' =
'BusinessDate';
Review Comment:
this should not be hardcoded...
--
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]