package com.breakersoft.plow.thrift.dao.pgsql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.breakersoft.plow.dao.AbstractDao;
import com.breakersoft.plow.thrift.FolderT;
import com.breakersoft.plow.thrift.JobState;
import com.breakersoft.plow.thrift.JobStatsT;
import com.breakersoft.plow.thrift.JobT;
import com.breakersoft.plow.thrift.TaskTotalsT;
import com.breakersoft.plow.thrift.dao.ThriftJobBoardDao;
import com.breakersoft.plow.util.JdbcUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@Repository
@Transactional(readOnly=true)
public class ThriftJobBoardImpl extends AbstractDao implements ThriftJobBoardDao {
private static final String GET_JOBS =
"SELECT " +
"job.pk_job,"+
"job.pk_folder," +
"job.str_name,"+
"job.bool_paused,"+
"job.int_uid,"+
"job.str_username,"+
"job.int_state,"+
"job.time_started,"+
"job.time_stopped,"+
"job_dsp.int_cores_max,"+
"job_dsp.int_cores_min,"+
"job_dsp.int_cores_run, " +
"job_dsp.int_procs_run, " +
"job_count.int_total, "+
"job_count.int_succeeded,"+
"job_count.int_running,"+
"job_count.int_dead,"+
"job_count.int_eaten,"+
"job_count.int_waiting,"+
"job_count.int_depend, "+
"job_stat.int_ram_high, "+
"job_stat.flt_cores_high, "+
"job_stat.int_core_time_high, "+
"job_stat.int_total_core_time_success, "+
"job_stat.int_total_core_time_fail, "+
"job_stat.int_clock_time_high "+
"FROM " +
"job " +
"INNER JOIN " +
"job_dsp ON job.pk_job = job_dsp.pk_job " +
"INNER JOIN " +
"job_count ON job.pk_job = job_count.pk_job " +
"INNER JOIN " +
"job_stat ON job.pk_job = job_stat.pk_job " +
"WHERE " +
"job.int_state = ? " +
"AND " +
"job.pk_project = ?";
private static final String GET_FOLDERS =
"SELECT " +
"folder.pk_folder,"+
"folder.str_name, "+
"folder.int_order, " +
"folder_dsp.int_cores_max, " +
"folder_dsp.int_cores_min, " +
"folder_dsp.int_cores_run, " +
"folder_dsp.int_procs_run " +
"FROM " +
"folder " +
"INNER JOIN folder_dsp ON folder.pk_folder = folder_dsp.pk_folder " +
"WHERE " +
"folder.pk_project = ? " +
"ORDER BY " +
"int_order ASC ";
@Override
public List<FolderT> getJobBoard(UUID projectId) {
final List<FolderT> result = Lists.newArrayList();
final Map<String, FolderT> folders = Maps.newHashMap();
jdbc.query(GET_FOLDERS, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
// Empty folder
FolderT folder = new FolderT();
folder.setId(rs.getString("pk_folder"));
folder.setOrder(rs.getInt("int_order"));
folder.setName(rs.getString("str_name"));
folder.setJobs(new ArrayList<JobT>());
folder.setTotals(new TaskTotalsT());
folder.setMaxCores(rs.getInt("int_cores_max"));
folder.setMinCores(rs.getInt("int_cores_min"));
folder.setRunCores(rs.getInt("int_cores_run"));
folder.setRunProcs(rs.getInt("int_procs_run"));
result.add(folder);
folders.put(folder.getId(), folder);
}
}, projectId);
jdbc.query(GET_JOBS, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
final FolderT folder = folders.get(rs.getString("pk_folder"));
JobStatsT stats = new JobStatsT();
stats.highRam = rs.getInt("int_ram_high");
stats.highCores = rs.getDouble("flt_cores_high");
stats.highCoreTime = rs.getInt("int_core_time_high");
stats.totalSuccessCoreTime = rs.getLong("int_total_core_time_success");
stats.totalFailCoreTime = rs.getLong("int_total_core_time_fail");
stats.highClockTime = rs.getLong("int_clock_time_high");
stats.totalCoreTime = stats.totalSuccessCoreTime + stats.totalFailCoreTime;
final JobT job = new JobT();
job.id = rs.getString("pk_job");
job.setFolderId(rs.getString("pk_folder"));
job.setName(rs.getString("str_name"));
job.setUid(rs.getInt("int_uid"));
job.setUsername(rs.getString("str_username"));
job.setPaused(rs.getBoolean("bool_paused"));
job.setRunCores(rs.getInt("int_cores_run"));
job.setRunProcs(rs.getInt("int_procs_run"));
job.setMaxCores(rs.getInt("int_cores_max"));
job.setMinCores(rs.getInt("int_cores_min"));
job.setStartTime(rs.getLong("time_started"));
job.setStopTime(rs.getLong("time_stopped"));
job.setState(JobState.findByValue(rs.getInt("int_state")));
job.setTotals(JdbcUtils.getTaskTotals(rs));
job.setStats(stats);
folder.totals.deadTaskCount += job.totals.deadTaskCount;
folder.totals.dependTaskCount += job.totals.dependTaskCount;
folder.totals.eatenTaskCount += job.totals.eatenTaskCount;
folder.totals.runningTaskCount += job.totals.runningTaskCount;
folder.totals.succeededTaskCount += job.totals.succeededTaskCount;
folder.totals.totalTaskCount += job.totals.totalTaskCount;
folder.totals.waitingTaskCount += job.totals.waitingTaskCount;
folder.jobs.add(job);
}
}, JobState.RUNNING.ordinal(), projectId);
Collections.sort(result, new Comparator<FolderT>() {
@Override
public int compare(FolderT o1, FolderT o2) {
return o1.name.compareTo(o2.name);
}
});
return result;
}
}