From 4a191a9ef13a99bb2b46172ce9ea695a92fe1019 Mon Sep 17 00:00:00 2001 From: simone Date: Thu, 9 Dec 2021 16:15:12 -0500 Subject: [PATCH 1/9] DDP-6034: - moving changes from PR into prod branch (https://github.com/broadinstitute/ddp-study-manager/pull/320) --- .../dsm/db/OncHistoryDetail.java | 98 +++++++++++++- .../org/broadinstitute/dsm/db/Tissue.java | 75 +++++++++-- .../org/broadinstitute/dsm/db/TissueSmId.java | 78 +++++++++++ .../dsm/db/dao/ddp/tissue/TissueSMIDDao.java | 127 ++++++++++++++++++ .../dsm/db/dao/ddp/tissue/TissueSmIdType.java | 22 +++ .../org/broadinstitute/dsm/model/Patch.java | 1 + .../broadinstitute/dsm/model/TissueList.java | 39 ++++-- .../BaseFilterParticipantList.java | 2 +- .../broadinstitute/dsm/route/PatchRoute.java | 6 + .../dsm/statics/DBConstants.java | 23 +++- .../broadinstitute/dsm/util/PatchUtil.java | 3 + .../liquibase/CMI/DDP-6034_SMIDS.xml | 57 ++++++++ src/main/resources/master-changelog.xml | 1 + 13 files changed, 509 insertions(+), 23 deletions(-) create mode 100644 src/main/java/org/broadinstitute/dsm/db/TissueSmId.java create mode 100644 src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java create mode 100644 src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSmIdType.java create mode 100644 src/main/resources/liquibase/CMI/DDP-6034_SMIDS.xml diff --git a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java index 9b187ba8b..9b2981dab 100644 --- a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java +++ b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java @@ -40,15 +40,17 @@ public class OncHistoryDetail { "oD.location_px, oD.histology, oD.accession_number, oD.facility, oD.phone, oD.fax, oD.notes, oD.additional_values_json, " + "oD.request, oD.fax_sent, oD.fax_sent_by, oD.fax_confirmed, oD.fax_sent_2, oD.fax_sent_2_by, oD.fax_confirmed_2, oD.fax_sent_3, " + "oD.fax_sent_3_by, oD.fax_confirmed_3, oD.tissue_received, oD.tissue_problem_option, oD.gender, oD.destruction_policy, oD.unable_obtain_tissue, " + - "tissue_id, t.notes, count_received, tissue_type, tissue_site, tumor_type, h_e, pathology_report, collaborator_sample_id, block_sent, scrolls_received, sk_id, sm_id, " + + "t.tissue_id, t.notes, count_received, tissue_type, tissue_site, tumor_type, h_e, pathology_report, collaborator_sample_id, block_sent, scrolls_received, sk_id, sm_id, " + "sent_gp, first_sm_id, additional_tissue_value_json, expected_return, return_date, return_fedex_id, shl_work_number, tumor_percentage, tissue_sequence, " + - " scrolls_count, uss_count, h_e_count, blocks_count " + + " scrolls_count, uss_count, h_e_count, blocks_count, p.ddp_participant_id, sm.sm_id_value, sm.sm_id_type_id, sm.sm_id_pk, sm.deleted, sm.tissue_id, smt.sm_id_type " + "FROM ddp_onc_history_detail oD " + "LEFT JOIN ddp_medical_record m on (oD.medical_record_id = m.medical_record_id AND NOT oD.deleted <=> 1 AND NOT m.deleted <=> 1) " + "LEFT JOIN ddp_institution inst on (inst.institution_id = m.institution_id) " + "LEFT JOIN ddp_participant p on (p.participant_id = inst.participant_id) " + "LEFT JOIN ddp_instance realm on (p.ddp_instance_id = realm.ddp_instance_id) " + "LEFT JOIN ddp_tissue t on (oD.onc_history_detail_id = t.onc_history_detail_id AND NOT t.deleted <=> 1) " + + "LEFT JOIN sm_id sm on (sm.tissue_id = t.tissue_id AND NOT sm.deleted <=> 1 ) " + + "LEFT JOIN sm_id_type smt on (smt.sm_id_type_id = sm.sm_id_type_id ) " + "WHERE realm.instance_name = ? "; private static final String SQL_CREATE_ONC_HISTORY = "INSERT INTO ddp_onc_history_detail SET medical_record_id = ?, request = ?, last_changed = ?, changed_by = ?"; private static final String SQL_SELECT_ONC_HISTORY = "SELECT onc_history_detail_id, medical_record_id, date_px, type_px, location_px, histology, accession_number, facility," + @@ -56,7 +58,7 @@ public class OncHistoryDetail { " tissue_received, gender, tissue_problem_option, destruction_policy FROM ddp_onc_history_detail WHERE NOT (deleted <=> 1)"; private static final String SQL_SELECT_TISSUE_RECEIVED = "SELECT tissue_received FROM ddp_onc_history_detail WHERE onc_history_detail_id = ?"; private static final String SQL_INSERT_ONC_HISTORY_DETAIL = "INSERT INTO ddp_onc_history_detail SET medical_record_id = ?, request = ?, last_changed = ?, changed_by = ?"; - public static final String SQL_ORDER_BY = " ORDER BY p.ddp_participant_id, inst.ddp_institution_id, oD.onc_history_detail_id ASC"; + public static final String SQL_ORDER_BY = " ORDER BY p.ddp_participant_id, inst.ddp_institution_id, oD.onc_history_detail_id, t.tissue_id ASC"; public static final String SQL_SELECT_ONC_HISTORY_LAST_CHANGED = "SELECT oD.last_changed FROM ddp_institution inst " + "LEFT JOIN ddp_participant as p on (p.participant_id = inst.participant_id) LEFT JOIN ddp_instance as ddp on (ddp.ddp_instance_id = p.ddp_instance_id) " + "LEFT JOIN ddp_medical_record as m on (m.institution_id = inst.institution_id AND NOT m.deleted <=> 1) LEFT JOIN ddp_onc_history_detail as oD on (m.medical_record_id = oD.medical_record_id) " + @@ -281,7 +283,12 @@ public static OncHistoryDetail getOncHistoryDetail(@NonNull ResultSet rs) throws rs.getString(DBConstants.DESTRUCTION_POLICY), rs.getBoolean(DBConstants.UNABLE_OBTAIN_TISSUE) ); - + try { + oncHistoryDetail.setParticipantId(rs.getString(DBConstants.DDP_PARTICIPANT_ID)); + } + catch (java.sql.SQLException e) { + oncHistoryDetail.setParticipantId(null); + } return oncHistoryDetail; } @@ -298,17 +305,97 @@ public static Map> getOncHistoryDetails(@NonNull public static Map> getOncHistoryDetails(@NonNull String realm, String queryAddition) { logger.info("Collection oncHistoryDetail information"); Map> oncHistory = new HashMap<>(); + HashMap tissues = new HashMap<>(); + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(DBUtil.getFinalQuery(SQL_SELECT_ONC_HISTORY_DETAIL, queryAddition) + SQL_ORDER_BY)) { + stmt.setString(1, realm); + try (ResultSet rs = stmt.executeQuery()) { + Map oncHistoryMap = new HashMap<>(); + while (rs.next()) { + String ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ID); + String oncHistoryDetailId = rs.getString(DBConstants.ONC_HISTORY_DETAIL_ID); + TissueSmId tissueSmId = Tissue.getSMIds(rs); + Tissue tissue; + if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { + tissue = tissues.get(tissueSmId.getTissueId()); + } + else { + tissue = Tissue.getTissue(rs); + } + if (tissueSmId != null) { + tissue.setSmIdBasedOnType(tissueSmId, rs); + } + tissues.put(tissue.getTissueId(), tissue); + + //check if oncHistoryDetails is already in map + List oncHistoryDataList = new ArrayList<>(); + if (oncHistory.containsKey(ddpParticipantId)) { + oncHistoryDataList = oncHistory.get(ddpParticipantId); + } + else { + oncHistory.put(ddpParticipantId, oncHistoryDataList); + oncHistoryMap = new HashMap<>(); + } + + OncHistoryDetail oncHistoryDetail = null; + if (oncHistoryMap.containsKey(oncHistoryDetailId)) { + oncHistoryDetail = oncHistoryMap.get(oncHistoryDetailId); + oncHistoryDetail.getTissues().removeIf(tissue1 -> tissue1.getTissueId() == tissue.getTissueId()); + oncHistoryDetail.addTissue(tissue); + } + else { + oncHistoryDetail = getOncHistoryDetail(rs); + oncHistoryDetail.addTissue(tissue); + oncHistoryDataList.add(oncHistoryDetail); + } + oncHistoryMap.put(oncHistoryDetailId, oncHistoryDetail); + } + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + if (results.resultException != null) { + throw new RuntimeException("Couldn't get list of oncHistories ", results.resultException); + } + + logger.info("Got " + oncHistory.size() + " participants oncHistories in DSM DB for " + realm); + return oncHistory; + } + + public static Map> getOncHistoryDetails(@NonNull String realm, String queryAddition, List values) { + logger.info("Collection oncHistoryDetail information"); + Map> oncHistory = new HashMap<>(); + HashMap tissues = new HashMap<>(); SimpleResult results = inTransaction((conn) -> { SimpleResult dbVals = new SimpleResult(); try (PreparedStatement stmt = conn.prepareStatement(DBUtil.getFinalQuery(SQL_SELECT_ONC_HISTORY_DETAIL, queryAddition) + SQL_ORDER_BY)) { stmt.setString(1, realm); + for (int i = 0; i < values.size(); i++) { + stmt.setString(i + 2, values.get(i)); + } try (ResultSet rs = stmt.executeQuery()) { Map oncHistoryMap = new HashMap<>(); while (rs.next()) { String ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ID); String oncHistoryDetailId = rs.getString(DBConstants.ONC_HISTORY_DETAIL_ID); - Tissue tissue = Tissue.getTissue(rs); + TissueSmId tissueSmId = Tissue.getSMIds(rs); + Tissue tissue; + if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { + tissue = tissues.get(tissueSmId.getTissueId()); + } + else { + tissue = Tissue.getTissue(rs); + } + if (tissueSmId != null) { + tissue.setSmIdBasedOnType(tissueSmId, rs); + } + tissues.put(tissue.getTissueId(), tissue); //check if oncHistoryDetails is already in map List oncHistoryDataList = new ArrayList<>(); @@ -323,6 +410,7 @@ public static Map> getOncHistoryDetails(@NonNull OncHistoryDetail oncHistoryDetail = null; if (oncHistoryMap.containsKey(oncHistoryDetailId)) { oncHistoryDetail = oncHistoryMap.get(oncHistoryDetailId); + oncHistoryDetail.getTissues().removeIf(tissue1 -> tissue.getTissueId() == tissue1.getTissueId()); oncHistoryDetail.addTissue(tissue); } else { diff --git a/src/main/java/org/broadinstitute/dsm/db/Tissue.java b/src/main/java/org/broadinstitute/dsm/db/Tissue.java index 2a5dad3b0..168a6ae37 100644 --- a/src/main/java/org/broadinstitute/dsm/db/Tissue.java +++ b/src/main/java/org/broadinstitute/dsm/db/Tissue.java @@ -13,6 +13,7 @@ import java.sql.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import static org.broadinstitute.ddp.db.TransactionWrapper.inTransaction; @@ -30,7 +31,9 @@ public class Tissue { private static final String SQL_SELECT_TISSUE = "SELECT tissue_id, onc_history_detail_id, notes, count_received, tissue_type, tissue_site, tumor_type, h_e, " + "pathology_report, collaborator_sample_id, block_sent, expected_return, return_date, return_fedex_id, scrolls_received, sk_id, sm_id, " + "scrolls_count, uss_count, blocks_count, h_e_count, first_sm_id, sent_gp, last_changed, changed_by, additional_tissue_value_json, shl_work_number, " + - "tumor_percentage, tissue_sequence FROM ddp_tissue t WHERE NOT (deleted <=> 1) AND onc_history_detail_id = ?"; + "tumor_percentage, tissue_sequence, sm.sm_id_value, sm.sm_id_type_id, sm.sm_id_pk, sm.deleted, sm.tissue_id FROM ddp_tissue t " + + "LEFT JOIN sm_id sm on (sm.tissue_id = t.tissue_id AND NOT sm.deleted <=> 1 AND NOT t.deleted <=> 1) " + + "WHERE NOT (deleted <=> 1) AND onc_history_detail_id = ?"; private static final String SQL_INSERT_TISSUE = "INSERT INTO ddp_tissue SET onc_history_detail_id = ?, last_changed = ?, changed_by = ?"; public static final String SQL_SELECT_TISSUE_LAST_CHANGED = "SELECT t.last_changed FROM ddp_institution inst " + "LEFT JOIN ddp_participant as p on (p.participant_id = inst.participant_id) LEFT JOIN ddp_instance as ddp on (ddp.ddp_instance_id = p.ddp_instance_id) " + @@ -123,6 +126,11 @@ public class Tissue { @ColumnName (DBConstants.H_E_COUNT) private Integer hECount; + private List ussSMID; + + private List scrollSMID; + + private List heSMID; public Tissue(String tissueId, String oncHistoryDetailId, String tNotes, Integer countReceived, String tissueType, @@ -130,7 +138,7 @@ public Tissue(String tissueId, String oncHistoryDetailId, String tNotes, Integer String blockSent, String scrollsReceived, String skId, String smId, String sentGp, String firstSmId, String additionalValues, String expectedReturn, String tissueReturnDate, String returnFedexId, String shlWorkNumber, String tumorPercentage, String sequenceResults, Integer scrollsCount, - Integer ussCount, Integer blocksCount, Integer hECount) { + Integer ussCount, Integer blocksCount, Integer hECount, List ussSMIDs, List scrollSMIDs, List heSMID) { this.tissueId = tissueId; this.oncHistoryDetailId = oncHistoryDetailId; this.tNotes = tNotes; @@ -158,11 +166,14 @@ public Tissue(String tissueId, String oncHistoryDetailId, String tNotes, Integer this.hECount = hECount; this.blocksCount = blocksCount; this.ussCount = ussCount; + this.scrollSMID = scrollSMIDs; + this.ussSMID = ussSMIDs; + this.heSMID = heSMID; } public static Tissue getTissue(@NonNull ResultSet rs) throws SQLException { Tissue tissue = new Tissue( - rs.getString(DBConstants.TISSUE_ID), + rs.getString("t." + DBConstants.TISSUE_ID), rs.getString(DBConstants.ONC_HISTORY_DETAIL_ID), rs.getString(DBConstants.DDP_TISSUE_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.NOTES), rs.getInt(DBConstants.COUNT_RECEIVED), @@ -188,19 +199,39 @@ public static Tissue getTissue(@NonNull ResultSet rs) throws SQLException { rs.getInt(DBConstants.SCROLLS_COUNT), rs.getInt(DBConstants.USS_COUNT), rs.getInt(DBConstants.BLOCKS_COUNT), - rs.getInt(DBConstants.H_E_COUNT)); + rs.getInt(DBConstants.H_E_COUNT), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>()); return tissue; } + + public static TissueSmId getSMIds(ResultSet rs) { + return TissueSmId.getSMIdsForTissueId(rs); + } + public static List getTissue(@NonNull Connection conn, @NonNull String oncHistoryDetailId) { - List tissue = new ArrayList<>(); + List tissueList = new ArrayList<>(); SimpleResult dbVals = new SimpleResult(); + HashMap tissues = new HashMap<>(); try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_TISSUE)) { stmt.setString(1, oncHistoryDetailId); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { - tissue.add(getTissue(rs)); + TissueSmId tissueSmId = getSMIds(rs); + Tissue tissue; + if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { + tissue = tissues.get(tissueSmId.getTissueId()); + } + else { + tissue = getTissue(rs); + } + if (tissueSmId != null) { + tissue.setSmIdBasedOnType(tissueSmId, rs); + } + tissues.put(tissue.tissueId, tissue); } } } @@ -211,9 +242,37 @@ public static List getTissue(@NonNull Connection conn, @NonNull String o if (dbVals.resultException != null) { throw new RuntimeException("Error getting tissue for oncHistoryDetails w/ id " + oncHistoryDetailId, dbVals.resultException); } + tissueList.addAll(tissues.values()); + logger.info("Found " + tissueList.size() + " tissue for oncHistoryDetails w/ id " + oncHistoryDetailId); + return tissueList; + } + + public void setSmIdBasedOnType(TissueSmId tissueSmId, ResultSet rs) { + if (tissueSmId == null || tissueSmId.getSmIdType() == null) { + return; + } + try { + String type = rs.getString(DBConstants.SM_ID_TYPE_TABLE_ALIAS + "." + DBConstants.SM_ID_TYPE); + switch (type.toLowerCase()) { + case "he": { + this.heSMID.add(tissueSmId); + break; + + } + case "uss": { + this.ussSMID.add(tissueSmId); + break; + } + case "scrolls": { + this.scrollSMID.add(tissueSmId); + break; + } + } + } + catch (SQLException throwables) { + throwables.printStackTrace(); + } - logger.info("Found " + tissue.size() + " tissue for oncHistoryDetails w/ id " + oncHistoryDetailId); - return tissue; } public static String createNewTissue(@NonNull String oncHistoryId, @NonNull String user) { diff --git a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java new file mode 100644 index 000000000..6079184ad --- /dev/null +++ b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java @@ -0,0 +1,78 @@ +package org.broadinstitute.dsm.db; + +import lombok.Data; +import org.broadinstitute.dsm.db.dao.ddp.tissue.TissueSMIDDao; +import org.broadinstitute.dsm.db.structure.ColumnName; +import org.broadinstitute.dsm.db.structure.TableName; +import org.broadinstitute.dsm.statics.DBConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@Data +@TableName ( + name = DBConstants.SM_ID_TABLE, + alias = DBConstants.SM_ID_TABLE_ALIAS, + primaryKey = DBConstants.SM_ID_PK, + columnPrefix = "") +public class TissueSmId { + + @ColumnName (DBConstants.SM_ID_VALUE) + private String smIdValue; + + @ColumnName (DBConstants.SM_ID_TYPE_ID) + private String smIdType; + + @ColumnName (DBConstants.SM_ID_TISSUE_ID) + private String tissueId; + + @ColumnName (DBConstants.SM_ID_PK) + private String smIdPk; + + @ColumnName (DBConstants.DELETED) + private Boolean deleted; + + public static String HE = "he"; + public static String USS = "uss"; + public static String SCROLLS = "scrolls"; + private static final Logger logger = LoggerFactory.getLogger(TissueSmId.class); + + public TissueSmId() { + } + + public TissueSmId(String smIdPk, String smIdType, String smIdValue, String tissueId) { + this.smIdPk = smIdPk; + this.smIdType = smIdType; + this.smIdValue = smIdValue; + this.tissueId = tissueId; + } + + + public static TissueSmId getSMIdsForTissueId(ResultSet rs) { + TissueSmId tissueSmId = null; + + try { + if (rs.getString(DBConstants.SM_ID_PK) == null) + return null; + tissueSmId = new TissueSmId( + rs.getString(DBConstants.SM_ID_PK), + rs.getString(DBConstants.SM_ID_TYPE_ID), + rs.getString(DBConstants.SM_ID_VALUE), + rs.getString("sm."+DBConstants.TISSUE_ID) + ); + if(tissueSmId!=null) + tissueSmId.setDeleted(rs.getBoolean("sm."+DBConstants.DELETED)); + } + catch (SQLException e) { + logger.error("problem getting tissue sm ids", e); + } + return tissueSmId; + } + + public String createNewSmId(String tissueId, String userId, String smIdType) { + String smIdId = new TissueSMIDDao().createNewSMIDForTissue(tissueId, userId, smIdType); + return smIdId; + } +} diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java new file mode 100644 index 000000000..4e3080e7b --- /dev/null +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java @@ -0,0 +1,127 @@ +package org.broadinstitute.dsm.db.dao.ddp.tissue; + +import org.broadinstitute.ddp.db.SimpleResult; +import org.broadinstitute.dsm.statics.DBConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.broadinstitute.ddp.db.TransactionWrapper.inTransaction; + +public class TissueSMIDDao { + private static final Logger logger = LoggerFactory.getLogger(TissueSMIDDao.class); + + public static final String SQL_GET_SM_ID_BASED_ON_TISSUE_ID=" SELECT * from sm_id sm where sm.tissue_id= ? and NOT sm.deleted <=> 1"; + public static final String SQL_TYPE_ID_FOR_TYPE="SELECT sm_id_type_id from sm_id_type where `sm_id_type` = ?"; + public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?"; + public static final String SQL_INSERT_SM_ID_WITH_VALUE = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?, sm_id_value = ?"; + + public String getTypeForName(String type) { + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(SQL_TYPE_ID_FOR_TYPE)) { + stmt.setString(1, type); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + dbVals.resultValue = rs.getString(DBConstants.SM_ID_TYPE_ID); + } + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + if (results.resultException != null) { + throw new RuntimeException("Error getting type ids for sm id " + type, results.resultException); + } + + return (String) results.resultValue; + } + + public String createNewSMIDForTissueWithValue(String tissueId, String userId, String smIdType, String smIdValue) { + String smIdtypeId = getTypeForName(smIdType); + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(SQL_INSERT_SM_ID_WITH_VALUE, Statement.RETURN_GENERATED_KEYS)) { + stmt.setString(1, tissueId); + stmt.setString(2, smIdtypeId); + stmt.setLong(3, System.currentTimeMillis()); + stmt.setString(4, userId); + stmt.setString(5, smIdValue); + int result = stmt.executeUpdate(); + if (result == 1) { + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + logger.info("Created new sm id for tissue w/ id " + tissueId); + dbVals.resultValue = rs.getString(1); + } + } + catch (Exception e) { + throw new RuntimeException("Error getting id of new sm id ", e); + } + } + else { + throw new RuntimeException("Error adding new sm id for tissue w/ id " + tissueId + " it was updating " + result + " rows"); + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + + + if (results.resultException != null) { + throw new RuntimeException("Error adding new sm id for tissue w/ id " + tissueId, results.resultException); + } + else { + return (String) results.resultValue; + } + } + + public String createNewSMIDForTissue(String tissueId, String userId, String smIdType) { + String smIdtypeId = getTypeForName(smIdType); + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(SQL_INSERT_SM_ID, Statement.RETURN_GENERATED_KEYS)) { + stmt.setString(1, tissueId); + stmt.setString(2, smIdtypeId); + stmt.setLong(3, System.currentTimeMillis()); + stmt.setString(4, userId); + int result = stmt.executeUpdate(); + if (result == 1) { + try (ResultSet rs = stmt.getGeneratedKeys()) { + if (rs.next()) { + logger.info("Created new sm id for tissue w/ id " + tissueId); + dbVals.resultValue = rs.getString(1); + } + } + catch (Exception e) { + throw new RuntimeException("Error getting id of new sm id ", e); + } + } + else { + throw new RuntimeException("Error adding new sm id for tissue w/ id " + tissueId + " it was updating " + result + " rows"); + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + if (results.resultException != null) { + throw new RuntimeException("Error adding new sm id for tissue w/ id " + tissueId, results.resultException); + } + else { + return (String) results.resultValue; + } + } +} diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSmIdType.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSmIdType.java new file mode 100644 index 000000000..f75b2632a --- /dev/null +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSmIdType.java @@ -0,0 +1,22 @@ +package org.broadinstitute.dsm.db.dao.ddp.tissue; + +import lombok.Data; +import org.broadinstitute.dsm.db.structure.ColumnName; +import org.broadinstitute.dsm.db.structure.TableName; +import org.broadinstitute.dsm.statics.DBConstants; + +@Data +@TableName ( + name = DBConstants.SM_ID_TYPE_TABLE, + alias = DBConstants.SM_ID_TYPE_TABLE_ALIAS, + primaryKey = DBConstants.SM_ID_TYPE_ID, + columnPrefix = "") +public class TissueSmIdType { + + @ColumnName (DBConstants.SM_ID_TYPE_ID) + private String smIdTypeId; + + @ColumnName (DBConstants.SM_ID_TYPE) + private String smIdType; + +} diff --git a/src/main/java/org/broadinstitute/dsm/model/Patch.java b/src/main/java/org/broadinstitute/dsm/model/Patch.java index e4e740a82..9197f3c16 100644 --- a/src/main/java/org/broadinstitute/dsm/model/Patch.java +++ b/src/main/java/org/broadinstitute/dsm/model/Patch.java @@ -31,6 +31,7 @@ public class Patch { public static final String ONC_HISTORY_ID = "oncHistoryDetailId"; public static final String PARTICIPANT_DATA_ID = "participantDataId"; public static final String DDP_PARTICIPANT_ID = "ddpParticipantId"; + public static final String TISSUEID = "tissueId"; private String id; private String parent; //for new added rows at oncHistoryDetails/tissue diff --git a/src/main/java/org/broadinstitute/dsm/model/TissueList.java b/src/main/java/org/broadinstitute/dsm/model/TissueList.java index dc563f780..71e8ed3a3 100644 --- a/src/main/java/org/broadinstitute/dsm/model/TissueList.java +++ b/src/main/java/org/broadinstitute/dsm/model/TissueList.java @@ -5,6 +5,7 @@ import org.broadinstitute.ddp.db.SimpleResult; import org.broadinstitute.dsm.db.OncHistoryDetail; import org.broadinstitute.dsm.db.Tissue; +import org.broadinstitute.dsm.db.TissueSmId; import org.broadinstitute.dsm.statics.DBConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,6 +13,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import static org.broadinstitute.ddp.db.TransactionWrapper.inTransaction; @@ -19,20 +21,23 @@ @Data public class TissueList { public static final Logger logger = LoggerFactory.getLogger(TissueList.class); - public static final String SQL_SELECT_ALL_ONC_HISTORY_TISSUE_FOR_REALM = "SELECT p.ddp_participant_id, p.participant_id, " + + public static final String SQL_SELECT_ALL_ONC_HISTORY_TISSUE_FOR_REALM = "SELECT p.ddp_participant_id," + "oD.onc_history_detail_id, oD.request, oD.deleted, oD.fax_sent, oD.tissue_received, oD.medical_record_id, oD.date_px, oD.type_px, " + "oD.location_px, oD.histology, oD.accession_number, oD.facility, oD.phone, oD.fax, oD.notes, oD.additional_values_json, " + "oD.request, oD.fax_sent, oD.fax_sent_by, oD.fax_confirmed, oD.fax_sent_2, oD.fax_sent_2_by, oD.fax_confirmed_2, oD.fax_sent_3, " + "oD.fax_sent_3_by, oD.fax_confirmed_3, oD.tissue_received, oD.tissue_problem_option, oD.additional_values_json, oD.gender, oD.destruction_policy, oD.unable_obtain_tissue," + - "tissue_id, t.notes, t.count_received, t.tissue_type, t.tissue_site, t.tumor_type, t.h_e, t.pathology_report, t.collaborator_sample_id, t.block_sent, t.scrolls_received, t.sk_id, t.sm_id, " + + "t.tissue_id, t.notes, t.count_received, t.tissue_type, t.tissue_site, t.tumor_type, t.h_e, t.pathology_report, t.collaborator_sample_id, t.block_sent, t.scrolls_received, t.sk_id, t.sm_id, " + "t.sent_gp, t.first_sm_id, t.additional_tissue_value_json, t.expected_return, t.return_date, t.return_fedex_id, t.shl_work_number, t.tumor_percentage, t.tissue_sequence, t.onc_history_detail_id, " + - "t.scrolls_count, t.h_e_count, t.uss_count, t.blocks_count " + + "t.scrolls_count, t.h_e_count, t.uss_count, t.blocks_count, sm.tissue_id, sm.sm_id_value, sm.sm_id_type_id, sm.sm_id_pk, sm.deleted, smt.sm_id_type " + "FROM ddp_participant p LEFT JOIN ddp_instance realm on (p.ddp_instance_id = realm.ddp_instance_id) " + "LEFT JOIN ddp_participant_exit ex on (p.ddp_participant_id = ex.ddp_participant_id AND p.ddp_instance_id = ex.ddp_instance_id) " + "LEFT JOIN ddp_institution inst on (p.participant_id = inst.participant_id) LEFT JOIN ddp_medical_record m on (m.institution_id = inst.institution_id AND NOT m.deleted <=> 1) " + "LEFT JOIN ddp_onc_history_detail oD on (m.medical_record_id = oD.medical_record_id AND NOT oD.deleted <=> 1) " + - "LEFT JOIN ddp_tissue t on (oD.onc_history_detail_id = t.onc_history_detail_id AND NOT t.deleted <=> 1) WHERE realm.instance_name = ? AND ex.ddp_participant_exit_id IS NULL AND oD.onc_history_detail_id IS NOT NULL"; - public static final String SQL_ORDER_BY_ONC_HISTORY = " ORDER BY oD.onc_history_detail_id "; + "LEFT JOIN ddp_tissue t on (oD.onc_history_detail_id = t.onc_history_detail_id AND NOT t.deleted <=> 1) " + + "LEFT JOIN sm_id sm on (sm.tissue_id = t.tissue_id AND NOT sm.deleted <=> 1 AND NOT t.deleted <=> 1) " + + "LEFT JOIN sm_id_type smt on (smt.sm_id_type_id = sm.sm_id_type_id ) " + + "WHERE realm.instance_name = ? AND ex.ddp_participant_exit_id IS NULL AND oD.onc_history_detail_id IS NOT NULL"; + public static final String SQL_ORDER_BY_ONC_HISTORY = " ORDER BY oD.onc_history_detail_id, t.tissue_id "; private OncHistoryDetail oncHistoryDetails; private Tissue tissue; @@ -53,6 +58,8 @@ public static List getAllTissueListsForRealmNoFilter(String realm) { public static List getAllTissueListsForRealm(String realm, String query) { List results = new ArrayList<>(); + HashMap tissues = new HashMap<>(); + HashMap oncHistoryDetailHashMap = new HashMap<>(); SimpleResult result = inTransaction((conn) -> { SimpleResult dbVals = new SimpleResult(); try (PreparedStatement stmt = conn.prepareStatement(query)) { @@ -62,11 +69,27 @@ public static List getAllTissueListsForRealm(String realm, String qu String ddpParticipantId = null; String participantId = null; while (rs.next()) { - oncHistory = OncHistoryDetail.getOncHistoryDetail(rs); ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.DDP_PARTICIPANT_ID); participantId = rs.getString(DBConstants.DDP_PARTICIPANT_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.PARTICIPANT_ID); - Tissue tissue = Tissue.getTissue(rs); - TissueList tissueList = new TissueList(oncHistory, null, ddpParticipantId, participantId); + TissueSmId tissueSmId = Tissue.getSMIds(rs); + Tissue tissue; + if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { + tissue = tissues.get(tissueSmId.getTissueId()); + } + else { + tissue = Tissue.getTissue(rs); + } + if (!oncHistoryDetailHashMap.containsKey(tissue.getOncHistoryDetailId())) { + oncHistory = OncHistoryDetail.getOncHistoryDetail(rs); + oncHistoryDetailHashMap.put(oncHistory.getOncHistoryDetailId(), oncHistory); + } + if (tissueSmId != null) { + tissue.setSmIdBasedOnType(tissueSmId, rs); + } + tissues.put(tissue.getTissueId(), tissue); + } + for (Tissue tissue : tissues.values()) { + TissueList tissueList = new TissueList(oncHistoryDetailHashMap.get(tissue.getOncHistoryDetailId()), null, ddpParticipantId, participantId); if (!tissue.isTDeleted() && StringUtils.isNotBlank(tissue.getTissueId())) { tissueList.setTissue(tissue); diff --git a/src/main/java/org/broadinstitute/dsm/model/filter/participant/BaseFilterParticipantList.java b/src/main/java/org/broadinstitute/dsm/model/filter/participant/BaseFilterParticipantList.java index c5d5f5330..00a455878 100644 --- a/src/main/java/org/broadinstitute/dsm/model/filter/participant/BaseFilterParticipantList.java +++ b/src/main/java/org/broadinstitute/dsm/model/filter/participant/BaseFilterParticipantList.java @@ -101,7 +101,7 @@ protected List filterParticipantList(Filter[] filters, Map map = new HashMap<>(); + map.put("smId", smIdPk); + return new Result(200, gson.toJson(map)); + } else if (Patch.PARTICIPANT_DATA_ID.equals(patch.getParent())) { String participantDataId = null; Map map = new HashMap<>(); diff --git a/src/main/java/org/broadinstitute/dsm/statics/DBConstants.java b/src/main/java/org/broadinstitute/dsm/statics/DBConstants.java index e6b2d91b7..20763fcb7 100644 --- a/src/main/java/org/broadinstitute/dsm/statics/DBConstants.java +++ b/src/main/java/org/broadinstitute/dsm/statics/DBConstants.java @@ -27,6 +27,7 @@ public class DBConstants { public static final String DDP_ONC_HISTORY_ALIAS = "o"; public static final String DDP_ONC_HISTORY_DETAIL_ALIAS = "oD"; public static final String DDP_TISSUE_ALIAS = "t"; + public static final String SM_ID_ALIAS = "sm"; public static final String DDP_KIT_REQUEST_ALIAS = "k"; public static final String DDP_ABSTRACTION_ALIAS = "a"; public static final String DRUG_ALIAS = "d"; @@ -46,6 +47,8 @@ public class DBConstants { public static final String CARRIER_USERNAME = "carrier_username"; public static final String CARRIER_PASSWORD= "carrier_password"; public static final String CARRIER_ACCESSKEY = "carrier_accesskey"; + public static final String BSP_COLLECTION = "bsp_collection"; + public static final String BSP_ORGANISM = "bsp_organism"; //kit request public static final String DSM_KIT_ID = "dsm_kit_id"; @@ -59,7 +62,10 @@ public class DBConstants { public static final String UPS_RETURN_STATUS = "ups_return_status"; public static final String UPS_TRACKING_DATE = "ups_tracking_date"; public static final String UPS_RETURN_DATE = "ups_return_date"; + public static final String SAMPLE_TYPE = "sample_type"; public static final String DDP_KIT_REQUEST_TABLE_ABBR = "req."; + public static final String BSP_MATERIAL_TYPE = "bsp_material_type"; + public static final String BSP_RECEPTABLE_TYPE = "bsp_receptacle_type"; @@ -242,6 +248,10 @@ public class DBConstants { public static final String SCROLLS_COUNT = "scrolls_count"; public static final String H_E_COUNT = "h_e_count"; public static final String BLOCKS_COUNT = "blocks_count"; + public static final String USS_SMIDS = "uss_sm_ids"; + public static final String SCROLL_SMIDS = "scrolls_sm_ids"; + public static final String HE_SMIDS = "he_sm_ids"; + //field_settings @@ -481,7 +491,18 @@ public class DBConstants { //access_user public static final String PHONE_NUMBER = "phone_number"; - + //sm_id table + public static final String SM_ID_TABLE = "sm_id"; + public static final String SM_ID_TABLE_ALIAS = "sm"; + public static final String SM_ID_PK = "sm_id_pk"; + public static final String SM_ID_TYPE_ID = "sm_id_type_id"; + public static final String SM_ID_VALUE = "sm_id_value"; + public static final String SM_ID_TISSUE_ID = "tissue_id"; + + //sm_id_type table + public static final String SM_ID_TYPE_TABLE = "sm_id_type"; + public static final String SM_ID_TYPE_TABLE_ALIAS = "smt"; + public static final String SM_ID_TYPE = "sm_id_type"; } diff --git a/src/main/java/org/broadinstitute/dsm/util/PatchUtil.java b/src/main/java/org/broadinstitute/dsm/util/PatchUtil.java index 7fc43c818..c02b39459 100644 --- a/src/main/java/org/broadinstitute/dsm/util/PatchUtil.java +++ b/src/main/java/org/broadinstitute/dsm/util/PatchUtil.java @@ -2,6 +2,7 @@ import org.apache.commons.lang3.StringUtils; import org.broadinstitute.dsm.db.*; +import org.broadinstitute.dsm.db.dao.ddp.tissue.TissueSmIdType; import org.broadinstitute.dsm.db.structure.ColumnName; import org.broadinstitute.dsm.db.structure.DBElement; import org.broadinstitute.dsm.db.structure.DbDateConversion; @@ -42,6 +43,8 @@ public PatchUtil() { getColumnNames(KitRequest.class); getColumnNames(Drug.class); getColumnNames(ParticipantData.class); + getColumnNames(TissueSmId.class); + getColumnNames(TissueSmIdType.class); logger.info("Loaded patch utils"); } diff --git a/src/main/resources/liquibase/CMI/DDP-6034_SMIDS.xml b/src/main/resources/liquibase/CMI/DDP-6034_SMIDS.xml new file mode 100644 index 000000000..929874c73 --- /dev/null +++ b/src/main/resources/liquibase/CMI/DDP-6034_SMIDS.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/master-changelog.xml b/src/main/resources/master-changelog.xml index e05e57877..0ec87f05d 100644 --- a/src/main/resources/master-changelog.xml +++ b/src/main/resources/master-changelog.xml @@ -75,4 +75,5 @@ + From 486e0db6f1690536612ef8eecc4aca03217bc189 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Thu, 9 Dec 2021 17:45:32 -0500 Subject: [PATCH 2/9] Changed the way of making onc history detail to be better readable --- .../dsm/db/OncHistoryDetail.java | 81 +++++++++---------- .../broadinstitute/dsm/model/TissueList.java | 4 +- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java index 9b2981dab..e9c668a7a 100644 --- a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java +++ b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java @@ -313,7 +313,6 @@ public static Map> getOncHistoryDetails(@NonNull try (ResultSet rs = stmt.executeQuery()) { Map oncHistoryMap = new HashMap<>(); while (rs.next()) { - String ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ID); String oncHistoryDetailId = rs.getString(DBConstants.ONC_HISTORY_DETAIL_ID); TissueSmId tissueSmId = Tissue.getSMIds(rs); Tissue tissue; @@ -328,29 +327,28 @@ public static Map> getOncHistoryDetails(@NonNull } tissues.put(tissue.getTissueId(), tissue); - //check if oncHistoryDetails is already in map - List oncHistoryDataList = new ArrayList<>(); - if (oncHistory.containsKey(ddpParticipantId)) { - oncHistoryDataList = oncHistory.get(ddpParticipantId); - } - else { - oncHistory.put(ddpParticipantId, oncHistoryDataList); - oncHistoryMap = new HashMap<>(); + if (!oncHistoryMap.containsKey(oncHistoryDetailId)) { + OncHistoryDetail oncHistoryDetail = getOncHistoryDetail(rs); + oncHistoryMap.put(oncHistoryDetailId, oncHistoryDetail); } - OncHistoryDetail oncHistoryDetail = null; - if (oncHistoryMap.containsKey(oncHistoryDetailId)) { - oncHistoryDetail = oncHistoryMap.get(oncHistoryDetailId); - oncHistoryDetail.getTissues().removeIf(tissue1 -> tissue1.getTissueId() == tissue.getTissueId()); - oncHistoryDetail.addTissue(tissue); - } - else { - oncHistoryDetail = getOncHistoryDetail(rs); - oncHistoryDetail.addTissue(tissue); - oncHistoryDataList.add(oncHistoryDetail); - } - oncHistoryMap.put(oncHistoryDetailId, oncHistoryDetail); } + //add tissues to their onc history + for (Tissue tissue : tissues.values()) { + String tissueOncHistoryDetailId = tissue.getOncHistoryDetailId(); + OncHistoryDetail oncHistoryDetail = oncHistoryMap.get(tissueOncHistoryDetailId); + oncHistoryDetail.getTissues().add(tissue); + }// add onchistories to their particiapnt + for (OncHistoryDetail oncHistoryDetail : oncHistoryMap.values()) { + //check if oncHistoryDetails is already in map + String ddpParticipantId = oncHistoryDetail.getParticipantId(); + List oncHistoryDataList = oncHistory.getOrDefault(ddpParticipantId, new ArrayList<>()); + oncHistoryDataList.add(oncHistoryDetail); + oncHistory.put(ddpParticipantId, oncHistoryDataList); + } + + } catch (Exception e){ + dbVals.resultException = e; } } catch (SQLException ex) { @@ -381,9 +379,7 @@ public static Map> getOncHistoryDetails(@NonNull try (ResultSet rs = stmt.executeQuery()) { Map oncHistoryMap = new HashMap<>(); while (rs.next()) { - String ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ID); String oncHistoryDetailId = rs.getString(DBConstants.ONC_HISTORY_DETAIL_ID); - TissueSmId tissueSmId = Tissue.getSMIds(rs); Tissue tissue; if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { @@ -397,29 +393,28 @@ public static Map> getOncHistoryDetails(@NonNull } tissues.put(tissue.getTissueId(), tissue); - //check if oncHistoryDetails is already in map - List oncHistoryDataList = new ArrayList<>(); - if (oncHistory.containsKey(ddpParticipantId)) { - oncHistoryDataList = oncHistory.get(ddpParticipantId); - } - else { - oncHistory.put(ddpParticipantId, oncHistoryDataList); - oncHistoryMap = new HashMap<>(); + if (!oncHistoryMap.containsKey(oncHistoryDetailId)) { + OncHistoryDetail oncHistoryDetail = getOncHistoryDetail(rs); + oncHistoryMap.put(oncHistoryDetailId, oncHistoryDetail); } - OncHistoryDetail oncHistoryDetail = null; - if (oncHistoryMap.containsKey(oncHistoryDetailId)) { - oncHistoryDetail = oncHistoryMap.get(oncHistoryDetailId); - oncHistoryDetail.getTissues().removeIf(tissue1 -> tissue.getTissueId() == tissue1.getTissueId()); - oncHistoryDetail.addTissue(tissue); - } - else { - oncHistoryDetail = getOncHistoryDetail(rs); - oncHistoryDetail.addTissue(tissue); - oncHistoryDataList.add(oncHistoryDetail); - } - oncHistoryMap.put(oncHistoryDetailId, oncHistoryDetail); } + //add tissues to their onc history + for (Tissue tissue : tissues.values()) { + String tissueOncHistoryDetailId = tissue.getOncHistoryDetailId(); + OncHistoryDetail oncHistoryDetail = oncHistoryMap.get(tissueOncHistoryDetailId); + oncHistoryDetail.getTissues().add(tissue); + }// add onchistories to their particiapnt + for (OncHistoryDetail oncHistoryDetail : oncHistoryMap.values()) { + //check if oncHistoryDetails is already in map + String ddpParticipantId = oncHistoryDetail.getParticipantId(); + List oncHistoryDataList = oncHistory.getOrDefault(ddpParticipantId, new ArrayList<>()); + oncHistoryDataList.add(oncHistoryDetail); + oncHistory.put(ddpParticipantId, oncHistoryDataList); + } + + } catch (Exception e){ + dbVals.resultException = e; } } catch (SQLException ex) { diff --git a/src/main/java/org/broadinstitute/dsm/model/TissueList.java b/src/main/java/org/broadinstitute/dsm/model/TissueList.java index 71e8ed3a3..53eb06a21 100644 --- a/src/main/java/org/broadinstitute/dsm/model/TissueList.java +++ b/src/main/java/org/broadinstitute/dsm/model/TissueList.java @@ -86,7 +86,9 @@ public static List getAllTissueListsForRealm(String realm, String qu if (tissueSmId != null) { tissue.setSmIdBasedOnType(tissueSmId, rs); } - tissues.put(tissue.getTissueId(), tissue); + if (tissue.getTissueId() != null) { + tissues.put(tissue.getTissueId(), tissue); + } } for (Tissue tissue : tissues.values()) { TissueList tissueList = new TissueList(oncHistoryDetailHashMap.get(tissue.getOncHistoryDetailId()), null, ddpParticipantId, participantId); From 9eecc10964d2f52e63ce89c6da3b73027876db70 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Thu, 9 Dec 2021 20:20:08 -0500 Subject: [PATCH 3/9] added unique constraint --- .../org/broadinstitute/dsm/db/TissueSmId.java | 4 +++ .../dsm/db/dao/ddp/tissue/TissueSMIDDao.java | 28 +++++++++++++++++++ .../broadinstitute/dsm/route/PatchRoute.java | 5 ++++ 3 files changed, 37 insertions(+) diff --git a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java index 6079184ad..1fb3cffb2 100644 --- a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java +++ b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java @@ -71,6 +71,10 @@ public static TissueSmId getSMIdsForTissueId(ResultSet rs) { return tissueSmId; } + public static boolean isUniqueSmId(String smIdValue) { + return new TissueSMIDDao().isUnique(smIdValue); + } + public String createNewSmId(String tissueId, String userId, String smIdType) { String smIdId = new TissueSMIDDao().createNewSMIDForTissue(tissueId, userId, smIdType); return smIdId; diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java index 4e3080e7b..f1807ab69 100644 --- a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java @@ -19,6 +19,7 @@ public class TissueSMIDDao { public static final String SQL_TYPE_ID_FOR_TYPE="SELECT sm_id_type_id from sm_id_type where `sm_id_type` = ?"; public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?"; public static final String SQL_INSERT_SM_ID_WITH_VALUE = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?, sm_id_value = ?"; + public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and Not deleted <=> 1"; public String getTypeForName(String type) { SimpleResult results = inTransaction((conn) -> { @@ -124,4 +125,31 @@ public String createNewSMIDForTissue(String tissueId, String userId, String smId return (String) results.resultValue; } } + + public boolean isUnique(String smIdValue) { + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_SM_ID_VALUE)) { + stmt.setString(1, smIdValue); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + dbVals.resultValue = false; + } + else{ + dbVals.resultValue = true; + } + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + if (results.resultException != null) { + throw new RuntimeException("Error getting values from sm_id table matching " + smIdValue, results.resultException); + } + + return (boolean) results.resultValue; + } } diff --git a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java index e075ec922..d07209cb8 100644 --- a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java +++ b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java @@ -146,6 +146,11 @@ else if (EventTypeDao.EVENT.equals(action.getType())) { } else { // mr changes + if(Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals("sm.smIdValue")){ + if(StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()))){ + return new Result(500, "Duplicate value"); + } + } DBElement dbElement = patchUtil.getColumnNameMap().get(patch.getNameValue().getName()); if (dbElement != null) { if (Patch.patch(patch.getId(), patch.getUser(), patch.getNameValue(), dbElement)) { From ac59f47b1a4d422acaf1d10a5a485f3dfdcdd7d2 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Thu, 9 Dec 2021 20:21:38 -0500 Subject: [PATCH 4/9] added unique constraint --- src/main/java/org/broadinstitute/dsm/route/PatchRoute.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java index d07209cb8..409cab1fd 100644 --- a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java +++ b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java @@ -146,8 +146,8 @@ else if (EventTypeDao.EVENT.equals(action.getType())) { } else { // mr changes - if(Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals("sm.smIdValue")){ - if(StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()))){ + if (Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals("sm.smIdValue")) { + if (StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()))) { return new Result(500, "Duplicate value"); } } From 79f39e44f6db96353df6e6bd35dfcfd0c7e8d6a4 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Thu, 9 Dec 2021 20:28:56 -0500 Subject: [PATCH 5/9] added constant string --- src/main/java/org/broadinstitute/dsm/model/Patch.java | 1 + src/main/java/org/broadinstitute/dsm/route/PatchRoute.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/broadinstitute/dsm/model/Patch.java b/src/main/java/org/broadinstitute/dsm/model/Patch.java index 9197f3c16..deae2ed87 100644 --- a/src/main/java/org/broadinstitute/dsm/model/Patch.java +++ b/src/main/java/org/broadinstitute/dsm/model/Patch.java @@ -32,6 +32,7 @@ public class Patch { public static final String PARTICIPANT_DATA_ID = "participantDataId"; public static final String DDP_PARTICIPANT_ID = "ddpParticipantId"; public static final String TISSUEID = "tissueId"; + public static final String SM_ID_VALUE = "sm.smIdValue"; private String id; private String parent; //for new added rows at oncHistoryDetails/tissue diff --git a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java index 409cab1fd..82653b2fc 100644 --- a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java +++ b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java @@ -146,7 +146,7 @@ else if (EventTypeDao.EVENT.equals(action.getType())) { } else { // mr changes - if (Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals("sm.smIdValue")) { + if (Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals(Patch.SM_ID_VALUE)) { if (StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()))) { return new Result(500, "Duplicate value"); } From 6819956cccb01dba3e02e49094fa969c6ef00f33 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Thu, 9 Dec 2021 23:03:52 -0500 Subject: [PATCH 6/9] fixed missed part --- src/main/java/org/broadinstitute/dsm/model/TissueList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/broadinstitute/dsm/model/TissueList.java b/src/main/java/org/broadinstitute/dsm/model/TissueList.java index 53eb06a21..5fb88e31c 100644 --- a/src/main/java/org/broadinstitute/dsm/model/TissueList.java +++ b/src/main/java/org/broadinstitute/dsm/model/TissueList.java @@ -21,7 +21,7 @@ @Data public class TissueList { public static final Logger logger = LoggerFactory.getLogger(TissueList.class); - public static final String SQL_SELECT_ALL_ONC_HISTORY_TISSUE_FOR_REALM = "SELECT p.ddp_participant_id," + + public static final String SQL_SELECT_ALL_ONC_HISTORY_TISSUE_FOR_REALM = "SELECT p.ddp_participant_id, p.participant_id, " + "oD.onc_history_detail_id, oD.request, oD.deleted, oD.fax_sent, oD.tissue_received, oD.medical_record_id, oD.date_px, oD.type_px, " + "oD.location_px, oD.histology, oD.accession_number, oD.facility, oD.phone, oD.fax, oD.notes, oD.additional_values_json, " + "oD.request, oD.fax_sent, oD.fax_sent_by, oD.fax_confirmed, oD.fax_sent_2, oD.fax_sent_2_by, oD.fax_confirmed_2, oD.fax_sent_3, " + From d3bd923b9d9d39324b60c038700991ba85cd0781 Mon Sep 17 00:00:00 2001 From: pegahtah Date: Tue, 14 Dec 2021 09:29:39 -0500 Subject: [PATCH 7/9] fixed bug in tissuelist display and in isUniqueSmId --- .../dsm/db/OncHistoryDetail.java | 22 ++++++++-------- .../org/broadinstitute/dsm/db/TissueSmId.java | 4 +-- .../dsm/db/dao/ddp/tissue/TissueSMIDDao.java | 5 ++-- .../broadinstitute/dsm/model/TissueList.java | 26 ++++++++++++------- .../broadinstitute/dsm/route/PatchRoute.java | 2 +- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java index e9c668a7a..a1945734b 100644 --- a/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java +++ b/src/main/java/org/broadinstitute/dsm/db/OncHistoryDetail.java @@ -36,7 +36,7 @@ public class OncHistoryDetail { private static final Logger logger = LoggerFactory.getLogger(OncHistoryDetail.class); - public static final String SQL_SELECT_ONC_HISTORY_DETAIL = "SELECT p.ddp_participant_id, oD.onc_history_detail_id, oD.request, oD.deleted, oD.fax_sent, oD.tissue_received, oD.medical_record_id, oD.date_px, oD.type_px, " + + public static final String SQL_SELECT_ONC_HISTORY_DETAIL = "SELECT p.ddp_participant_id, p.participant_id, oD.onc_history_detail_id, oD.request, oD.deleted, oD.fax_sent, oD.tissue_received, oD.medical_record_id, oD.date_px, oD.type_px, " + "oD.location_px, oD.histology, oD.accession_number, oD.facility, oD.phone, oD.fax, oD.notes, oD.additional_values_json, " + "oD.request, oD.fax_sent, oD.fax_sent_by, oD.fax_confirmed, oD.fax_sent_2, oD.fax_sent_2_by, oD.fax_confirmed_2, oD.fax_sent_3, " + "oD.fax_sent_3_by, oD.fax_confirmed_3, oD.tissue_received, oD.tissue_problem_option, oD.gender, oD.destruction_policy, oD.unable_obtain_tissue, " + @@ -172,6 +172,7 @@ public class OncHistoryDetail { private boolean unableToObtain; private String participantId; + private String ddpParticipantId; private List tissues; @@ -221,7 +222,7 @@ public OncHistoryDetail(String oncHistoryDetailId, String medicalRecordId, Strin String tFaxSent2, String tFaxSent2By, String tFaxConfirmed2, String tFaxSent3, String tFaxSent3By, String tFaxConfirmed3, String tissueReceived, String gender, String additionalValues, List tissues, - String tissueProblemOption, String destructionPolicy, boolean unableToObtain) { + String tissueProblemOption, String destructionPolicy, boolean unableToObtain, String participantId, String ddpParticipantId) { this.oncHistoryDetailId = oncHistoryDetailId; this.medicalRecordId = medicalRecordId; this.datePX = datePX; @@ -250,6 +251,8 @@ public OncHistoryDetail(String oncHistoryDetailId, String medicalRecordId, Strin this.tissueProblemOption = tissueProblemOption; this.destructionPolicy = destructionPolicy; this.unableToObtain = unableToObtain; + this.participantId = participantId; + this.ddpParticipantId = ddpParticipantId; } public static OncHistoryDetail getOncHistoryDetail(@NonNull ResultSet rs) throws SQLException { @@ -281,14 +284,11 @@ public static OncHistoryDetail getOncHistoryDetail(@NonNull ResultSet rs) throws rs.getString(DBConstants.DDP_ONC_HISTORY_DETAIL_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.ADDITIONAL_VALUES), tissues, rs.getString(DBConstants.TISSUE_PROBLEM_OPTION), rs.getString(DBConstants.DESTRUCTION_POLICY), - rs.getBoolean(DBConstants.UNABLE_OBTAIN_TISSUE) + rs.getBoolean(DBConstants.UNABLE_OBTAIN_TISSUE), + rs.getString(DBConstants.PARTICIPANT_ID), + rs.getString(DBConstants.DDP_PARTICIPANT_ID) ); - try { - oncHistoryDetail.setParticipantId(rs.getString(DBConstants.DDP_PARTICIPANT_ID)); - } - catch (java.sql.SQLException e) { - oncHistoryDetail.setParticipantId(null); - } + return oncHistoryDetail; } @@ -341,7 +341,7 @@ public static Map> getOncHistoryDetails(@NonNull }// add onchistories to their particiapnt for (OncHistoryDetail oncHistoryDetail : oncHistoryMap.values()) { //check if oncHistoryDetails is already in map - String ddpParticipantId = oncHistoryDetail.getParticipantId(); + String ddpParticipantId = oncHistoryDetail.getDdpParticipantId(); List oncHistoryDataList = oncHistory.getOrDefault(ddpParticipantId, new ArrayList<>()); oncHistoryDataList.add(oncHistoryDetail); oncHistory.put(ddpParticipantId, oncHistoryDataList); @@ -407,7 +407,7 @@ public static Map> getOncHistoryDetails(@NonNull }// add onchistories to their particiapnt for (OncHistoryDetail oncHistoryDetail : oncHistoryMap.values()) { //check if oncHistoryDetails is already in map - String ddpParticipantId = oncHistoryDetail.getParticipantId(); + String ddpParticipantId = oncHistoryDetail.getDdpParticipantId(); List oncHistoryDataList = oncHistory.getOrDefault(ddpParticipantId, new ArrayList<>()); oncHistoryDataList.add(oncHistoryDetail); oncHistory.put(ddpParticipantId, oncHistoryDataList); diff --git a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java index 1fb3cffb2..882611c82 100644 --- a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java +++ b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java @@ -71,8 +71,8 @@ public static TissueSmId getSMIdsForTissueId(ResultSet rs) { return tissueSmId; } - public static boolean isUniqueSmId(String smIdValue) { - return new TissueSMIDDao().isUnique(smIdValue); + public static boolean isUniqueSmId(String smIdValue, String id) { + return new TissueSMIDDao().isUnique(smIdValue, id); } public String createNewSmId(String tissueId, String userId, String smIdType) { diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java index f1807ab69..97b7d1df2 100644 --- a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java @@ -19,7 +19,7 @@ public class TissueSMIDDao { public static final String SQL_TYPE_ID_FOR_TYPE="SELECT sm_id_type_id from sm_id_type where `sm_id_type` = ?"; public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?"; public static final String SQL_INSERT_SM_ID_WITH_VALUE = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?, sm_id_value = ?"; - public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and Not deleted <=> 1"; + public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and NOT sm_id_pk = ? and Not deleted <=> 1"; public String getTypeForName(String type) { SimpleResult results = inTransaction((conn) -> { @@ -126,11 +126,12 @@ public String createNewSMIDForTissue(String tissueId, String userId, String smId } } - public boolean isUnique(String smIdValue) { + public boolean isUnique(String smIdValue, String smIdPk) { SimpleResult results = inTransaction((conn) -> { SimpleResult dbVals = new SimpleResult(); try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_SM_ID_VALUE)) { stmt.setString(1, smIdValue); + stmt.setString(2, smIdPk);// added to let updating try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { dbVals.resultValue = false; diff --git a/src/main/java/org/broadinstitute/dsm/model/TissueList.java b/src/main/java/org/broadinstitute/dsm/model/TissueList.java index 5fb88e31c..2782b0d14 100644 --- a/src/main/java/org/broadinstitute/dsm/model/TissueList.java +++ b/src/main/java/org/broadinstitute/dsm/model/TissueList.java @@ -66,11 +66,8 @@ public static List getAllTissueListsForRealm(String realm, String qu stmt.setString(1, realm); try (ResultSet rs = stmt.executeQuery()) { OncHistoryDetail oncHistory = null; - String ddpParticipantId = null; - String participantId = null; while (rs.next()) { - ddpParticipantId = rs.getString(DBConstants.DDP_PARTICIPANT_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.DDP_PARTICIPANT_ID); - participantId = rs.getString(DBConstants.DDP_PARTICIPANT_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.PARTICIPANT_ID); + String participantId = rs.getString(DBConstants.DDP_PARTICIPANT_ALIAS + DBConstants.ALIAS_DELIMITER + DBConstants.PARTICIPANT_ID); TissueSmId tissueSmId = Tissue.getSMIds(rs); Tissue tissue; if (tissueSmId != null && tissues.containsKey(tissueSmId.getTissueId())) { @@ -91,12 +88,23 @@ public static List getAllTissueListsForRealm(String realm, String qu } } for (Tissue tissue : tissues.values()) { - TissueList tissueList = new TissueList(oncHistoryDetailHashMap.get(tissue.getOncHistoryDetailId()), null, ddpParticipantId, participantId); - - if (!tissue.isTDeleted() && StringUtils.isNotBlank(tissue.getTissueId())) { - tissueList.setTissue(tissue); + String tissueOncHistoryDetailId = tissue.getOncHistoryDetailId(); + OncHistoryDetail oncHistoryDetail = oncHistoryDetailHashMap.get(tissueOncHistoryDetailId); + oncHistoryDetail.getTissues().add(tissue); + }// add onchistories to their particiapnt + for (OncHistoryDetail oncHistoryDetail : oncHistoryDetailHashMap.values()) { + if (oncHistoryDetail.getTissues() == null || oncHistoryDetail.getTissues().isEmpty()){ + TissueList tissueList = new TissueList(oncHistoryDetail, null, oncHistoryDetail.getDdpParticipantId(), oncHistoryDetail.getParticipantId()); + results.add(tissueList); + continue; + } + for (Tissue tissue : oncHistoryDetail.getTissues()) { + TissueList tissueList = new TissueList(oncHistoryDetail, null, oncHistoryDetail.getDdpParticipantId(), oncHistoryDetail.getParticipantId()); + if (!tissue.isTDeleted() && StringUtils.isNotBlank(tissue.getTissueId())) { + tissueList.setTissue(tissue); + } + results.add(tissueList); } - results.add(tissueList); } dbVals.resultValue = results; } diff --git a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java index 82653b2fc..e71cbc92e 100644 --- a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java +++ b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java @@ -147,7 +147,7 @@ else if (EventTypeDao.EVENT.equals(action.getType())) { else { // mr changes if (Patch.TISSUEID.equals(patch.getParent()) && patch.getNameValue().getName().equals(Patch.SM_ID_VALUE)) { - if (StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()))) { + if (StringUtils.isNotBlank(String.valueOf(patch.getNameValue().getValue())) && !TissueSmId.isUniqueSmId(String.valueOf(patch.getNameValue().getValue()), patch.getId())) { return new Result(500, "Duplicate value"); } } From ff3de768f0fbf3d274e5d459db7fc38d87a34e2a Mon Sep 17 00:00:00 2001 From: pegahtah Date: Wed, 15 Dec 2021 01:38:23 -0500 Subject: [PATCH 8/9] changed how we patch to avoid duplicates --- .../org/broadinstitute/dsm/db/TissueSmId.java | 38 +++++++++++++++---- .../dsm/db/dao/ddp/tissue/TissueSMIDDao.java | 35 +++++++++++++++-- .../broadinstitute/dsm/route/PatchRoute.java | 12 ++++-- 3 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java index 882611c82..fe533cc2b 100644 --- a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java +++ b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java @@ -1,15 +1,19 @@ package org.broadinstitute.dsm.db; import lombok.Data; +import lombok.NonNull; import org.broadinstitute.dsm.db.dao.ddp.tissue.TissueSMIDDao; import org.broadinstitute.dsm.db.structure.ColumnName; import org.broadinstitute.dsm.db.structure.TableName; +import org.broadinstitute.dsm.exception.DuplicateException; +import org.broadinstitute.dsm.model.NameValue; import org.broadinstitute.dsm.statics.DBConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; @Data @TableName ( @@ -54,16 +58,18 @@ public static TissueSmId getSMIdsForTissueId(ResultSet rs) { TissueSmId tissueSmId = null; try { - if (rs.getString(DBConstants.SM_ID_PK) == null) + if (rs.getString(DBConstants.SM_ID_PK) == null) { return null; + } tissueSmId = new TissueSmId( rs.getString(DBConstants.SM_ID_PK), rs.getString(DBConstants.SM_ID_TYPE_ID), rs.getString(DBConstants.SM_ID_VALUE), - rs.getString("sm."+DBConstants.TISSUE_ID) + rs.getString("sm." + DBConstants.TISSUE_ID) ); - if(tissueSmId!=null) - tissueSmId.setDeleted(rs.getBoolean("sm."+DBConstants.DELETED)); + if (tissueSmId != null) { + tissueSmId.setDeleted(rs.getBoolean("sm." + DBConstants.DELETED)); + } } catch (SQLException e) { logger.error("problem getting tissue sm ids", e); @@ -75,8 +81,26 @@ public static boolean isUniqueSmId(String smIdValue, String id) { return new TissueSMIDDao().isUnique(smIdValue, id); } - public String createNewSmId(String tissueId, String userId, String smIdType) { - String smIdId = new TissueSMIDDao().createNewSMIDForTissue(tissueId, userId, smIdType); - return smIdId; + public static boolean isUniqueSmId(String smIdValue) { + return new TissueSMIDDao().isUnique(smIdValue); + } + + public String createNewSmId(String tissueId, String userId, @NonNull List smIdDetails) { + String smIdType = null; + String smIdValue = null; + for (NameValue nameValue : smIdDetails) { + if (nameValue.getName().equals("smIdType")) { + smIdType = String.valueOf(nameValue.getValue()); + } + else if (nameValue.getName().equals("smIdValue")) { + smIdValue = String.valueOf(nameValue.getValue()); + } + } + if(this.isUniqueSmId(smIdValue)) { + String smIdId = new TissueSMIDDao().createNewSMIDForTissue(tissueId, userId, smIdType, smIdValue); + return smIdId; + } else{ + throw new DuplicateException("Duplicate value for sm id value"); + } } } diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java index 97b7d1df2..58d12de02 100644 --- a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java @@ -1,5 +1,6 @@ package org.broadinstitute.dsm.db.dao.ddp.tissue; +import lombok.NonNull; import org.broadinstitute.ddp.db.SimpleResult; import org.broadinstitute.dsm.statics.DBConstants; import org.slf4j.Logger; @@ -19,7 +20,8 @@ public class TissueSMIDDao { public static final String SQL_TYPE_ID_FOR_TYPE="SELECT sm_id_type_id from sm_id_type where `sm_id_type` = ?"; public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?"; public static final String SQL_INSERT_SM_ID_WITH_VALUE = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?, sm_id_value = ?"; - public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and NOT sm_id_pk = ? and Not deleted <=> 1"; + public static final String SQL_SELECT_SM_ID_VALUE_WITH_ID = "SELECT sm_id_value from sm_id where sm_id_value = ? and NOT sm_id_pk = ? and Not deleted <=> 1"; + public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and Not deleted <=> 1"; public String getTypeForName(String type) { SimpleResult results = inTransaction((conn) -> { @@ -87,7 +89,7 @@ public String createNewSMIDForTissueWithValue(String tissueId, String userId, St } } - public String createNewSMIDForTissue(String tissueId, String userId, String smIdType) { + public String createNewSMIDForTissue(String tissueId, String userId, @NonNull String smIdType, @NonNull String smIdValue) { String smIdtypeId = getTypeForName(smIdType); SimpleResult results = inTransaction((conn) -> { SimpleResult dbVals = new SimpleResult(); @@ -129,7 +131,7 @@ public String createNewSMIDForTissue(String tissueId, String userId, String smId public boolean isUnique(String smIdValue, String smIdPk) { SimpleResult results = inTransaction((conn) -> { SimpleResult dbVals = new SimpleResult(); - try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_SM_ID_VALUE)) { + try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_SM_ID_VALUE_WITH_ID)) { stmt.setString(1, smIdValue); stmt.setString(2, smIdPk);// added to let updating try (ResultSet rs = stmt.executeQuery()) { @@ -153,4 +155,31 @@ public boolean isUnique(String smIdValue, String smIdPk) { return (boolean) results.resultValue; } + + public boolean isUnique(String smIdValue) { + SimpleResult results = inTransaction((conn) -> { + SimpleResult dbVals = new SimpleResult(); + try (PreparedStatement stmt = conn.prepareStatement(SQL_SELECT_SM_ID_VALUE)) { + stmt.setString(1, smIdValue); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + dbVals.resultValue = false; + } + else{ + dbVals.resultValue = true; + } + } + } + catch (SQLException ex) { + dbVals.resultException = ex; + } + return dbVals; + }); + + if (results.resultException != null) { + throw new RuntimeException("Error getting values from sm_id table matching " + smIdValue, results.resultException); + } + + return (boolean) results.resultValue; + } } diff --git a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java index e71cbc92e..be328e644 100644 --- a/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java +++ b/src/main/java/org/broadinstitute/dsm/route/PatchRoute.java @@ -298,10 +298,14 @@ else if (Patch.ONC_HISTORY_ID.equals(patch.getParent())) { } } else if (Patch.TISSUEID.equals(patch.getParent())) { - String smIdPk = new TissueSmId().createNewSmId(patch.getParentId(), patch.getUser(), (String) patch.getNameValue().getValue()); - Map map = new HashMap<>(); - map.put("smId", smIdPk); - return new Result(200, gson.toJson(map)); + try { + String smIdPk = new TissueSmId().createNewSmId(patch.getParentId(), patch.getUser(), patch.getNameValues()); + Map map = new HashMap<>(); + map.put("smId", smIdPk); + return new Result(200, gson.toJson(map)); + }catch (DuplicateException e) { + return new Result(500, "Duplicate value"); + } } else if (Patch.PARTICIPANT_DATA_ID.equals(patch.getParent())) { String participantDataId = null; From 567cbfba20963c6c3ebd9c636d9bf65ac714371d Mon Sep 17 00:00:00 2001 From: pegahtah Date: Wed, 15 Dec 2021 13:51:57 -0500 Subject: [PATCH 9/9] fixed bug --- src/main/java/org/broadinstitute/dsm/db/TissueSmId.java | 7 ++++--- .../dsm/db/dao/ddp/tissue/TissueSMIDDao.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java index fe533cc2b..8fd133465 100644 --- a/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java +++ b/src/main/java/org/broadinstitute/dsm/db/TissueSmId.java @@ -2,6 +2,7 @@ import lombok.Data; import lombok.NonNull; +import org.apache.commons.lang3.StringUtils; import org.broadinstitute.dsm.db.dao.ddp.tissue.TissueSMIDDao; import org.broadinstitute.dsm.db.structure.ColumnName; import org.broadinstitute.dsm.db.structure.TableName; @@ -85,7 +86,7 @@ public static boolean isUniqueSmId(String smIdValue) { return new TissueSMIDDao().isUnique(smIdValue); } - public String createNewSmId(String tissueId, String userId, @NonNull List smIdDetails) { + public String createNewSmId(@NonNull String tissueId, String userId, @NonNull List smIdDetails) { String smIdType = null; String smIdValue = null; for (NameValue nameValue : smIdDetails) { @@ -96,11 +97,11 @@ else if (nameValue.getName().equals("smIdValue")) { smIdValue = String.valueOf(nameValue.getValue()); } } - if(this.isUniqueSmId(smIdValue)) { + if(StringUtils.isNotBlank(smIdValue) && this.isUniqueSmId(smIdValue)) { String smIdId = new TissueSMIDDao().createNewSMIDForTissue(tissueId, userId, smIdType, smIdValue); return smIdId; } else{ - throw new DuplicateException("Duplicate value for sm id value"); + throw new DuplicateException("Duplicate or blank value for sm id value "+smIdValue); } } } diff --git a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java index 58d12de02..20221df8a 100644 --- a/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java +++ b/src/main/java/org/broadinstitute/dsm/db/dao/ddp/tissue/TissueSMIDDao.java @@ -18,7 +18,7 @@ public class TissueSMIDDao { public static final String SQL_GET_SM_ID_BASED_ON_TISSUE_ID=" SELECT * from sm_id sm where sm.tissue_id= ? and NOT sm.deleted <=> 1"; public static final String SQL_TYPE_ID_FOR_TYPE="SELECT sm_id_type_id from sm_id_type where `sm_id_type` = ?"; - public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?"; + public static final String SQL_INSERT_SM_ID = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, sm_id_value=?, last_changed = ?, changed_by = ?"; public static final String SQL_INSERT_SM_ID_WITH_VALUE = "INSERT INTO sm_id SET tissue_id = ?, sm_id_type_id = ?, last_changed = ?, changed_by = ?, sm_id_value = ?"; public static final String SQL_SELECT_SM_ID_VALUE_WITH_ID = "SELECT sm_id_value from sm_id where sm_id_value = ? and NOT sm_id_pk = ? and Not deleted <=> 1"; public static final String SQL_SELECT_SM_ID_VALUE = "SELECT sm_id_value from sm_id where sm_id_value = ? and Not deleted <=> 1"; @@ -96,8 +96,9 @@ public String createNewSMIDForTissue(String tissueId, String userId, @NonNull St try (PreparedStatement stmt = conn.prepareStatement(SQL_INSERT_SM_ID, Statement.RETURN_GENERATED_KEYS)) { stmt.setString(1, tissueId); stmt.setString(2, smIdtypeId); - stmt.setLong(3, System.currentTimeMillis()); - stmt.setString(4, userId); + stmt.setString(3, smIdValue); + stmt.setLong(4, System.currentTimeMillis()); + stmt.setString(5, userId); int result = stmt.executeUpdate(); if (result == 1) { try (ResultSet rs = stmt.getGeneratedKeys()) {