/*
* PatientView
*
* Copyright (c) Worth Solutions Limited 2004-2013
*
* This file is part of PatientView.
*
* PatientView is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
* PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with PatientView in a file
* titled COPYING. If not, see <http://www.gnu.org/licenses/>.
*
* @package PatientView
* @link http://www.patientview.org
* @author PatientView <info@patientview.org>
* @copyright Copyright (c) 2004-2013, Worth Solutions Limited
* @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0
*/
package org.patientview.radar.dao.impl;
import org.patientview.radar.dao.PathologyDao;
import org.patientview.radar.model.enums.KidneyTransplantedNative;
import org.patientview.radar.model.sequenced.Pathology;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PathologyDaoImpl extends BaseDaoImpl implements PathologyDao {
private static final Logger LOGGER = LoggerFactory.getLogger(PathologyDaoImpl.class);
private SimpleJdbcInsert pathologyInsert;
@Override
public void setDataSource(DataSource dataSource) {
// Call super
super.setDataSource(dataSource);
// Initialise a simple JDBC insert to be able to get the allocated ID
pathologyInsert = new SimpleJdbcInsert(dataSource).withTableName("tbl_pathology")
.usingGeneratedKeyColumns("pID")
.usingColumns(
"RADAR_NO", "BX_DATE", "NAT_TRANSP_KID", "LATERALITY_BX", "SAMPLE_LAB_NO", "PATHDIAG",
"GLOM_TOTAL_NO", "GLOM_GLOB_SCL", "GLOM_SEQ_SCL", "GLOM_CELL_CRES", "GLOM_FIB_CRES",
"GLOM_END_HYPER", "GLOM_FIN_NEC", "GLOM_ANY_OTH_FEAT", "TUB_ATROP_IF_EST", "TUB_ATROP_IF_MEAS",
"TUB_OTHER_FEAT", "INTER_INFLAM_INFIL", "ART_ABNORMAL", "IMM_HIST_FIND", "ELECT_MSCOPE_FIND",
"IMAGE_URL1", "IMAGE_URL2", "IMAGE_URL3", "IMAGE_URL4", "IMAGE_URL5", "PATH_TXT", "SEQ_NO"
);
}
public void savePathology(final Pathology pathology) {
Map<String, Object> pathologyMap = new HashMap<String, Object>() {
{
put("RADAR_NO", pathology.getRadarNumber());
put("BX_DATE", pathology.getBiopsyDate());
put("NAT_TRANSP_KID", pathology.getKidneyTransplantedNative() != null ?
pathology.getKidneyTransplantedNative().getId() : null);
put("LATERALITY_BX", pathology.getSide() != null ? pathology.getSide().getId() : null);
put("SAMPLE_LAB_NO", pathology.getSampleLabNumber());
put("PATHDIAG", null);
put("GLOM_TOTAL_NO", pathology.getTotalNumber());
put("GLOM_GLOB_SCL", pathology.getNumberSclerosed());
put("GLOM_SEQ_SCL", pathology.getNumberSegmentallySclerosed());
put("GLOM_CELL_CRES", pathology.getNumberCellularCrescents());
put("GLOM_FIB_CRES", pathology.getNumberFibrousCrescents());
put("GLOM_END_HYPER", pathology.getNumberEndocapillaryHypercelluarity());
put("GLOM_FIN_NEC", pathology.getNumberFibrinoidNecrosis());
put("GLOM_ANY_OTH_FEAT", pathology.getOtherFeature());
put("TUB_ATROP_IF_EST", pathology.getEstimatedTubules());
put("TUB_ATROP_IF_MEAS", pathology.getMeasuredTubules());
put("TUB_OTHER_FEAT", pathology.getTubulesOtherFeature());
put("INTER_INFLAM_INFIL", pathology.getInterstitalInflmatoryInfilitrate());
put("ART_ABNORMAL", pathology.getArterialAbnormalities());
put("IMM_HIST_FIND", pathology.getImmunohistologicalFindings());
put("ELECT_MSCOPE_FIND", pathology.getElectronMicroscopicFindings());
put("IMAGE_URL1", pathology.getImageUrl1());
put("IMAGE_URL2", pathology.getImageUrl2());
put("IMAGE_URL3", pathology.getImageUrl3());
put("IMAGE_URL4", pathology.getImageUrl4());
put("IMAGE_URL5", pathology.getImageUrl5());
put("PATH_TXT", pathology.getHistologicalSummary());
put("SEQ_NO", pathology.getSequenceNumber());
}
};
if (pathology.hasValidId()) {
pathologyMap.put("pID", pathology.getId());
namedParameterJdbcTemplate.update("UPDATE tbl_pathology " +
"SET RADAR_NO = :RADAR_NO, " +
"BX_DATE = :BX_DATE, " +
"NAT_TRANSP_KID = :NAT_TRANSP_KID, " +
"LATERALITY_BX = :LATERALITY_BX, " +
"SAMPLE_LAB_NO = :SAMPLE_LAB_NO, " +
"PATHDIAG = :PATHDIAG, " +
"GLOM_TOTAL_NO = :GLOM_TOTAL_NO, " +
"GLOM_GLOB_SCL = :GLOM_GLOB_SCL, " +
"GLOM_SEQ_SCL = :GLOM_SEQ_SCL, " +
"GLOM_CELL_CRES = :GLOM_CELL_CRES, " +
"GLOM_FIB_CRES = :GLOM_FIB_CRES, " +
"GLOM_END_HYPER = :GLOM_END_HYPER, " +
"GLOM_FIN_NEC = :GLOM_FIN_NEC, " +
"GLOM_ANY_OTH_FEAT = :GLOM_ANY_OTH_FEAT, " +
"TUB_ATROP_IF_EST = :TUB_ATROP_IF_EST, " +
"TUB_ATROP_IF_MEAS = :TUB_ATROP_IF_MEAS, " +
"TUB_OTHER_FEAT = :TUB_OTHER_FEAT, " +
"INTER_INFLAM_INFIL = :INTER_INFLAM_INFIL, " +
"ART_ABNORMAL = :ART_ABNORMAL, " +
"IMM_HIST_FIND = :IMM_HIST_FIND, " +
"ELECT_MSCOPE_FIND = :ELECT_MSCOPE_FIND, " +
"IMAGE_URL1 = :IMAGE_URL1, " +
"IMAGE_URL2 = :IMAGE_URL2, " +
"IMAGE_URL3 = :IMAGE_URL3, " +
"IMAGE_URL4 = :IMAGE_URL4, " +
"IMAGE_URL5 = :IMAGE_URL5, " +
"PATH_TXT = :PATH_TXT, " +
"SEQ_NO = :SEQ_NO " +
"WHERE pID = :pID;", pathologyMap);
} else {
Number id = pathologyInsert.executeAndReturnKey(pathologyMap);
pathology.setId(id.longValue());
}
}
public Pathology getPathology(long id) {
try {
return jdbcTemplate.queryForObject("SELECT * FROM tbl_Pathology WHERE pID = ?", new Object[]{id},
new PathologyRowMapper());
} catch (EmptyResultDataAccessException e) {
LOGGER.debug("No therapy object found with ID {}", id);
return null;
}
}
public List<Pathology> getPathologyByRadarNumber(long radarNumber) {
return jdbcTemplate.query("SELECT * FROM tbl_Pathology WHERE RADAR_NO = ?", new Object[]{radarNumber},
new PathologyRowMapper());
}
private class PathologyRowMapper implements RowMapper<Pathology> {
public Pathology mapRow(ResultSet resultSet, int i) throws SQLException {
// Construct a pathology object and set the fields
Pathology pathology = new Pathology();
pathology.setId(resultSet.getLong("pID"));
pathology.setRadarNumber(resultSet.getLong("RADAR_NO"));
pathology.setBiopsyDate(resultSet.getDate("BX_DATE"));
pathology.setSampleLabNumber(resultSet.getString("SAMPLE_LAB_NO"));
pathology.setTotalNumber(getIntegerWithNullCheck("GLOM_TOTAL_NO", resultSet));
pathology.setNumberSclerosed(getIntegerWithNullCheck("GLOM_GLOB_SCL", resultSet));
pathology.setNumberSegmentallySclerosed(getIntegerWithNullCheck("GLOM_SEQ_SCL", resultSet));
pathology.setNumberCellularCrescents(getIntegerWithNullCheck("GLOM_CELL_CRES", resultSet));
pathology.setNumberFibrousCrescents(getIntegerWithNullCheck("GLOM_FIB_CRES", resultSet));
pathology.setNumberEndocapillaryHypercelluarity(getIntegerWithNullCheck("GLOM_END_HYPER", resultSet));
pathology.setNumberFibrinoidNecrosis(getIntegerWithNullCheck("GLOM_FIN_NEC", resultSet));
pathology.setOtherFeature(resultSet.getString("GLOM_ANY_OTH_FEAT"));
pathology.setSequenceNumber(getIntegerWithNullCheck("SEQ_NO", resultSet));
pathology.setImageUrl1(resultSet.getString("IMAGE_URL1"));
pathology.setImageUrl2(resultSet.getString("IMAGE_URL2"));
pathology.setImageUrl3(resultSet.getString("IMAGE_URL3"));
pathology.setImageUrl4(resultSet.getString("IMAGE_URL4"));
pathology.setImageUrl5(resultSet.getString("IMAGE_URL5"));
pathology.setHistologicalSummary(resultSet.getString("PATH_TXT"));
// PATHDIAG not used in select but always seems to be set to 2 in the insert?
pathology.setEstimatedTubules(getDoubleWithNullCheck("TUB_ATROP_IF_EST", resultSet));
pathology.setMeasuredTubules(getDoubleWithNullCheck("TUB_ATROP_IF_MEAS", resultSet));
pathology.setTubulesOtherFeature(resultSet.getString("TUB_OTHER_FEAT"));
pathology.setElectronMicroscopicFindings(resultSet.getString("ELECT_MSCOPE_FIND"));
// NAT_TRANSP_KID
pathology.setKidneyTransplantedNative(BaseDaoImpl.<KidneyTransplantedNative>getEnumValue(
KidneyTransplantedNative.class, getIntegerWithNullCheck("NAT_TRANSP_KID", resultSet)));
// Side - LATERALITY_BX
pathology.setSide(
BaseDaoImpl.<Pathology.Side>getEnumValue(Pathology.Side.class,
getIntegerWithNullCheck("LATERALITY_BX", resultSet)));
pathology.setInterstitalInflmatoryInfilitrate(resultSet.getString("INTER_INFLAM_INFIL"));
pathology.setArterialAbnormalities(resultSet.getString("ART_ABNORMAL"));
pathology.setImmunohistologicalFindings(resultSet.getString("IMM_HIST_FIND"));
return pathology;
}
}
}