package gov.nysenate.openleg.dao.bill.data;
import gov.nysenate.openleg.dao.base.SqlBaseDao;
import gov.nysenate.openleg.model.base.SessionYear;
import gov.nysenate.openleg.model.bill.ApprovalId;
import gov.nysenate.openleg.model.bill.ApprovalMessage;
import gov.nysenate.openleg.model.bill.BaseBillId;
import gov.nysenate.openleg.model.bill.BillId;
import gov.nysenate.openleg.model.sobi.SobiFragment;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
public class SqlApprovalDao extends SqlBaseDao implements ApprovalDao
{
/** {@inheritDoc} */
@Override
public ApprovalMessage getApprovalMessage(ApprovalId approvalId) throws DataAccessException {
MapSqlParameterSource params = getApprovalIdParams(approvalId);
return jdbcNamed.queryForObject(SqlApprovalQuery.SELECT_APPROVAL_BY_ID.getSql(schema()),
params, new ApprovalMessageRowMapper());
}
/** {@inheritDoc} */
@Override
public ApprovalMessage getApprovalMessage(BaseBillId baseBillId) throws DataAccessException {
MapSqlParameterSource params = getBaseBillIdParams(baseBillId);
return jdbcNamed.queryForObject(
SqlApprovalQuery.SELECT_APPROVAL_BY_BILL.getSql(schema()), params, new ApprovalMessageRowMapper());
}
/** {@inheritDoc} */
@Override
public List<ApprovalMessage> getApprovalMessages(int year) throws DataAccessException {
MapSqlParameterSource params = getYearParams(year);
return jdbcNamed.query(SqlApprovalQuery.SELECT_APPROVALS_BY_YEAR.getSql(schema()),
params, new ApprovalMessageRowMapper());
}
/** {@inheritDoc} */
@Override
public void updateApprovalMessage(ApprovalMessage approvalMessage, SobiFragment sobiFragment) {
MapSqlParameterSource params = getApprovalMessageParams(approvalMessage, sobiFragment);
if(jdbcNamed.update(SqlApprovalQuery.UPDATE_APPROVAL.getSql(schema()), params) == 0){
jdbcNamed.update(SqlApprovalQuery.INSERT_APPROVAL.getSql(schema()), params);
}
}
/** {@inheritDoc} */
@Override
public void deleteApprovalMessage(ApprovalId approvalId) {
MapSqlParameterSource params = getApprovalIdParams(approvalId);
jdbcNamed.update(SqlApprovalQuery.DELETE_APPROVAL_BY_ID.getSql(schema()), params);
}
/** {@inheritDoc} */
@Override
public void deleteApprovalMessage(BaseBillId baseBillId) {
MapSqlParameterSource params = getBaseBillIdParams(baseBillId);
jdbcNamed.update(SqlApprovalQuery.DELETE_APPROVAL_BY_BILL.getSql(schema()), params);
}
/** --- Row Mappers --- */
private class ApprovalMessageRowMapper implements RowMapper<ApprovalMessage>{
@Override
public ApprovalMessage mapRow(ResultSet rs, int rowNum) throws SQLException {
ApprovalMessage approvalMessage = new ApprovalMessage();
approvalMessage.setApprovalNumber(rs.getInt("approval_number"));
approvalMessage.setYear(rs.getInt("year"));
approvalMessage.setSession(new SessionYear(rs.getInt("bill_session_year")));
approvalMessage.setBillId(new BillId(
rs.getString("bill_print_no"), rs.getInt("bill_session_year"), rs.getString("bill_amend_version")));
approvalMessage.setChapter(rs.getInt("chapter"));
approvalMessage.setSigner(rs.getString("signer"));
approvalMessage.setMemoText(rs.getString("memo_text"));
return approvalMessage;
}
}
/** --- Param Mappers --- */
private MapSqlParameterSource getYearParams(int year){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("year", year);
return params;
}
private MapSqlParameterSource getApprovalIdParams(ApprovalId approvalId){
MapSqlParameterSource params = getYearParams(approvalId.getYear());
params.addValue("approvalNumber", approvalId.getApprovalNumber());
return params;
}
private MapSqlParameterSource getBaseBillIdParams(BaseBillId baseBillId){
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("billPrintNo", baseBillId.getBasePrintNo());
params.addValue("sessionYear", baseBillId.getSession().getYear());
return params;
}
private MapSqlParameterSource getApprovalMessageParams(ApprovalMessage approvalMessage, SobiFragment sobiFragment){
MapSqlParameterSource params = getApprovalIdParams(approvalMessage.getApprovalId());
params.addValue("billPrintNo", approvalMessage.getBillId().getBasePrintNo());
params.addValue("sessionYear", approvalMessage.getBillId().getSession().getYear());
params.addValue("billVersion", approvalMessage.getBillId().getVersion().getValue());
params.addValue("chapter", approvalMessage.getChapter());
params.addValue("signer", approvalMessage.getSigner());
params.addValue("memoText", approvalMessage.getMemoText());
addLastFragmentParam(sobiFragment, params);
return params;
}
}