Skip to content

Commit

Permalink
bug: fix to JobExecutionDaoImpl to allow for both ms and pg sql
Browse files Browse the repository at this point in the history
  • Loading branch information
kibo-thomasphipps committed Apr 18, 2023
1 parent 26c7e95 commit 3396510
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 11 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ if (hasProperty("teamcity")) {
}
else {
// Manually insert the version numbers here when building outside of TeamCity
version = '1.0.23-SNAPSHOT'
version = '1.0.24-SNAPSHOT'
}

jar {
Expand Down
82 changes: 72 additions & 10 deletions src/main/java/com/mozu/jobs/dao/JobExecutionDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,77 @@
*/
package com.mozu.jobs.dao;

import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.batch.core.repository.dao.AbstractJdbcBatchMetadataDao;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.JdbcTemplate;

public class JobExecutionDaoImpl extends AbstractJdbcBatchMetadataDao implements JobExecutionDao {
private DataSource dataSource;
private Boolean isSql ;

public final String JOB_EXECUTION_BY_TENANT = "SELECT ex.JOB_EXECUTION_ID "
//sql queries
public final String JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY JOB_EXECUTION_ID DESC limit 20";
+ "ORDER BY JOB_EXECUTION_ID DESC";

public final String LAST_SUCCESSFUL_EXECUTION_DATE = "SELECT ex.START_TIME "
public final String LAST_SUCCESSFUL_EXECUTION_DATE_MS = "SELECT TOP 1 ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS = "SELECT TOP 1 ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param2 on param2.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param2.KEY_NAME = 'siteId' and param2.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";



public final String MULTI_JOB_EXECUTION_BY_TENANT_MS = "SELECT TOP 20 ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME in (%s) "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC";
//non sql queries

public final String JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY JOB_EXECUTION_ID DESC limit 20";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_PG = "SELECT ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? AND ex.EXIT_CODE = 'COMPLETED'"
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 1";

public final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE = "SELECT ex.START_TIME "
public final String LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG = "SELECT ex.START_TIME "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? AND ex.EXIT_CODE = 'COMPLETED'"
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param2 on param2.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param2.KEY_NAME = 'siteId' and param2.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME = ? "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 1";

public final String MULTI_JOB_EXECUTION_BY_TENANT = "SELECT ex.JOB_EXECUTION_ID "
public final String MULTI_JOB_EXECUTION_BY_TENANT_PG = "SELECT ex.JOB_EXECUTION_ID "
+ "from SpringBatch.BATCH_JOB_EXECUTION ex "
+ "JOIN SpringBatch.BATCH_JOB_EXECUTION_PARAMS param on param.JOB_EXECUTION_ID = ex.JOB_EXECUTION_ID AND param.KEY_NAME = 'tenantId' and param.LONG_VAL = ? "
+ "JOIN SpringBatch.BATCH_JOB_INSTANCE inst on inst.JOB_INSTANCE_ID = ex.JOB_INSTANCE_ID AND inst.JOB_NAME in (%s) "
+ "ORDER BY ex.JOB_EXECUTION_ID DESC limit 20";



public DataSource getDataSource() {
return dataSource;
}
Expand All @@ -56,16 +91,20 @@ public List<Long> getRecentJobExecutionIds(Long tenantId, List<String>jobNames)
}
jobStringBuffer.append("'").append(jobName).append("'");
}
String query = String.format(MULTI_JOB_EXECUTION_BY_TENANT, jobStringBuffer.toString());
String statement = isSqlServer(getJdbcTemplate()) ? MULTI_JOB_EXECUTION_BY_TENANT_MS : MULTI_JOB_EXECUTION_BY_TENANT_PG;
String query = String.format(statement, jobStringBuffer.toString());
return getJdbcTemplate().queryForList(query, Long.class, tenantId);
}

public List<Long> getRecentJobExecutionIds(Long tenantId, String jobName) {
return getJdbcTemplate().queryForList(JOB_EXECUTION_BY_TENANT, Long.class, tenantId, jobName);
String statement = isSqlServer(getJdbcTemplate()) ? JOB_EXECUTION_BY_TENANT_MS : JOB_EXECUTION_BY_TENANT_PG;

return getJdbcTemplate().queryForList(statement, Long.class, tenantId, jobName);
}

public Timestamp getLastExecutionDate(Long tenantId, String jobName) {
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(LAST_SUCCESSFUL_EXECUTION_DATE, Timestamp.class, tenantId, jobName);
String statement = isSqlServer(getJdbcTemplate()) ? LAST_SUCCESSFUL_EXECUTION_DATE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_PG;
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(statement, Timestamp.class, tenantId, jobName);
Timestamp lastRunTimestamp = null;
if (lastTimestamps.size() > 0) {
lastRunTimestamp = lastTimestamps.get(0);
Expand All @@ -75,11 +114,34 @@ public Timestamp getLastExecutionDate(Long tenantId, String jobName) {

@Override
public Timestamp getLastExecutionDate(Long tenantId, Long siteId, String jobName) {
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE, Timestamp.class, tenantId, siteId, jobName);

String statement = isSqlServer(getJdbcTemplate()) ? LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_MS : LAST_SUCCESSFUL_EXECUTION_DATE_BY_SITE_PG;
JdbcOperations jobOperation = getJdbcTemplate();
List<Timestamp> lastTimestamps = getJdbcTemplate().queryForList(statement, Timestamp.class, tenantId, siteId, jobName);
Timestamp lastRunTimestamp = null;
if (lastTimestamps.size() > 0) {
lastRunTimestamp = lastTimestamps.get(0);
}
return lastRunTimestamp;
}

private boolean isSqlServer (JdbcOperations jdbcOperations) {
if ( isSql == null) {
JdbcTemplate jdbcTemplate = (JdbcTemplate) jdbcOperations;
String dbProductName = null;
try {
DatabaseMetaData metaData = jdbcTemplate.getDataSource().getConnection().getMetaData();
dbProductName = metaData.getDatabaseProductName();
} catch (SQLException e) {
e.printStackTrace();
}

if (dbProductName != null) {
isSql = dbProductName.toLowerCase().contains("microsoft");
}else{
isSql = true;
}
}
return isSql;
}
}

0 comments on commit 3396510

Please sign in to comment.