package com.breakersoft.plow.thrift.dao.pgsql;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.breakersoft.plow.Project;
import com.breakersoft.plow.dao.AbstractDao;
import com.breakersoft.plow.thrift.FolderT;
import com.breakersoft.plow.thrift.TaskTotalsT;
import com.breakersoft.plow.thrift.dao.ThriftFolderDao;
import com.breakersoft.plow.util.JdbcUtils;
@Repository
@Transactional(readOnly=true)
public class ThriftFolderDaoImpl extends AbstractDao implements ThriftFolderDao {
private static final RowMapper<FolderT> MAPPER = new RowMapper<FolderT>() {
@Override
public FolderT mapRow(ResultSet rs, int rowNum) throws SQLException {
FolderT folder = new FolderT();
folder.setId(rs.getString("pk_folder"));
folder.setOrder(rs.getInt("int_order"));
folder.setName(rs.getString("str_name"));
folder.setMinCores(rs.getInt("int_cores_min"));
folder.setMaxCores(rs.getInt("int_cores_max"));
folder.setRunCores(rs.getInt("int_cores_run"));
folder.setRunProcs(rs.getInt("int_procs_run"));
return folder;
}
};
private static final RowMapper<TaskTotalsT> TOTALS_MAPPER = new RowMapper<TaskTotalsT>() {
@Override
public TaskTotalsT mapRow(ResultSet rs, int rowNum) throws SQLException {
return JdbcUtils.getTaskTotals(rs);
}
};
private static final String GET_TOTALS =
"SELECT " +
"folder.pk_folder,"+
"folder.int_order, "+
"SUM(job_count.int_total) AS int_total," +
"SUM(job_count.int_succeeded) AS int_succeeded, " +
"SUM(job_count.int_running) AS int_running, " +
"SUM(job_count.int_dead) AS int_dead," +
"SUM(job_count.int_eaten) AS int_eaten," +
"SUM(job_count.int_waiting) AS int_waiting,"+
"SUM(job_count.int_depend) AS int_depend " +
"FROM " +
"folder " +
"LEFT JOIN job ON folder.pk_folder = job.pk_folder " +
"LEFT JOIN job_count ON job.pk_job = job_count.pk_job ";
private static final String GET =
"SELECT " +
"folder.pk_folder,"+
"folder.str_name, "+
"folder.int_order, " +
"folder_dsp.int_cores_min,"+
"folder_dsp.int_cores_max,"+
"folder_dsp.int_cores_run, " +
"folder_dsp.int_procs_run " +
"FROM " +
"folder " +
"INNER JOIN folder_dsp ON folder.pk_folder = folder_dsp.pk_folder ";
private static final String GET_BY_ID =
GET + " WHERE folder.pk_folder=?";
private static final String GET_TOTALS_BY_ID =
GET_TOTALS + " WHERE folder.pk_folder=? GROUP BY folder.pk_folder, folder.int_order";
@Override
public FolderT get(UUID id){
FolderT folder = jdbc.queryForObject(GET_BY_ID, MAPPER, id);
folder.setTotals(jdbc.queryForObject(GET_TOTALS_BY_ID, TOTALS_MAPPER, id));
return folder;
}
private static final String GET_BY_PROJ =
GET + " WHERE folder.pk_project=? ORDER BY folder.int_order ASC";
private static final String GET_TOTALS_BY_PROJ =
GET_TOTALS + " WHERE folder.pk_project=? GROUP BY folder.pk_folder, folder.int_order ORDER BY folder.int_order ASC ";
@Override
public List<FolderT> getFolders(Project project) {
List<FolderT> result = jdbc.query(GET_BY_PROJ, MAPPER, project.getProjectId());
List<TaskTotalsT> totals = jdbc.query(GET_TOTALS_BY_PROJ, TOTALS_MAPPER, project.getProjectId());
for (int i=0; i<result.size(); i++) {
result.get(i).setTotals(totals.get(i));
}
return result;
}
}