package org.ohdsi.webapi.cohortanalysis; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ohdsi.sql.SqlSplit; import org.ohdsi.webapi.cohortresults.CohortResultsAnalysisRunner; import org.ohdsi.webapi.cohortresults.VisualizationDataRepository; import org.ohdsi.webapi.service.CohortAnalysisService; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; public class CohortAnalysisTasklet implements Tasklet { private static final Log log = LogFactory.getLog(CohortAnalysisTasklet.class); private final CohortAnalysisTask task; private final JdbcTemplate jdbcTemplate; private final TransactionTemplate transactionTemplate; private final CohortResultsAnalysisRunner analysisRunner; public CohortAnalysisTasklet(CohortAnalysisTask task, final JdbcTemplate jdbcTemplate, final TransactionTemplate transactionTemplate, String sourceDialect, VisualizationDataRepository visualizationDataRepository) { this.task = task; this.jdbcTemplate = jdbcTemplate; this.transactionTemplate = transactionTemplate; this.analysisRunner = new CohortResultsAnalysisRunner(sourceDialect, visualizationDataRepository); } @Override public RepeatStatus execute(final StepContribution contribution, final ChunkContext chunkContext) throws Exception { try { final int[] ret = this.transactionTemplate.execute(new TransactionCallback<int[]>() { @Override public int[] doInTransaction(final TransactionStatus status) { String cohortSql = CohortAnalysisService.getCohortAnalysisSql(task); String[] stmts = null; if (cohortSql != null) { if (log.isDebugEnabled()) { stmts = SqlSplit.splitSql(cohortSql); for (int x = 0; x < stmts.length; x++) { log.debug(String.format("Split SQL %s : %s", x, stmts[x])); } } } return CohortAnalysisTasklet.this.jdbcTemplate.batchUpdate(stmts); } }); log.debug("Update count: " + ret.length); log.debug("warm up visualizations"); final int count = this.analysisRunner.warmupData(jdbcTemplate, task); log.debug("warmed up " + count + " visualizations"); } catch (final TransactionException e) { log.error(e.getMessage(), e); throw e;//FAIL job status } return RepeatStatus.FINISHED; } };