@Override public void execute(Database database) throws CustomChangeException { JdbcConnection connection = (JdbcConnection) database.getConnection(); try { Set<String> uniqueFrequencies = DatabaseUtil.getUniqueNonNullColumnValues( "frequency_text", "drug_order", String.class, connection.getUnderlyingConnection()); migrateFrequenciesToCodedValue(connection, uniqueFrequencies); } catch (Exception e) { throw new CustomChangeException(e); } }
private void migrateFrequenciesToCodedValue( JdbcConnection connection, Set<String> uniqueFrequencies) throws CustomChangeException, SQLException, DatabaseException { PreparedStatement updateDrugOrderStatement = null; Boolean autoCommit = null; try { autoCommit = connection.getAutoCommit(); connection.setAutoCommit(false); updateDrugOrderStatement = connection.prepareStatement( "update drug_order set frequency = ? where frequency_text = ?"); for (String frequency : uniqueFrequencies) { Integer conceptIdForFrequency = UpgradeUtil.getConceptIdForUnits(frequency); if (conceptIdForFrequency == null) { throw new CustomChangeException("No concept mapping found for frequency: " + frequency); } Integer orderFrequencyId = UpgradeUtil.getOrderFrequencyIdForConceptId( connection.getUnderlyingConnection(), conceptIdForFrequency); if (orderFrequencyId == null) { throw new CustomChangeException( "No order frequency found for concept " + conceptIdForFrequency); } updateDrugOrderStatement.setInt(1, orderFrequencyId); updateDrugOrderStatement.setString(2, frequency); updateDrugOrderStatement.executeUpdate(); updateDrugOrderStatement.clearParameters(); } connection.commit(); } catch (DatabaseException e) { handleError(connection, e); } catch (SQLException e) { handleError(connection, e); } finally { if (autoCommit != null) { connection.setAutoCommit(autoCommit); } if (updateDrugOrderStatement != null) { updateDrugOrderStatement.close(); } } }
private void insertUniqueFrequencies(JdbcConnection connection, Set<String> uniqueFrequencies) throws CustomChangeException, SQLException, DatabaseException { PreparedStatement insertOrderFrequencyStatement = null; Boolean autoCommit = null; try { autoCommit = connection.getAutoCommit(); connection.setAutoCommit(false); insertOrderFrequencyStatement = connection.prepareStatement( "insert into order_frequency " + "(concept_id, creator, date_created, retired, uuid) values (?, ?, ?, ?, ?)"); Date date = new Date(new java.util.Date().getTime()); for (String frequency : uniqueFrequencies) { if (StringUtils.isBlank(frequency)) { continue; } Integer conceptIdForFrequency = UpgradeUtil.getConceptIdForUnits(frequency); if (conceptIdForFrequency == null) { throw new CustomChangeException("No concept mapping found for frequency: " + frequency); } Integer orderFrequencyId = UpgradeUtil.getOrderFrequencyIdForConceptId( connection.getUnderlyingConnection(), conceptIdForFrequency); if (orderFrequencyId != null) { // a single concept is mapped to more than one text or there is an order frequency already continue; } // Generating UUID for order frequency. Generated UUIDs will be the same if concepts UUIDs // are the same. String uuid = UpgradeUtil.getConceptUuid(connection.getUnderlyingConnection(), conceptIdForFrequency); uuid += "-6925ebb0-7c69-11e3-baa7-0800200c9a66"; // Adding random value for order frequency uuid = UUID.nameUUIDFromBytes(uuid.getBytes()).toString(); insertOrderFrequencyStatement.setInt(1, conceptIdForFrequency); insertOrderFrequencyStatement.setInt(2, 1); insertOrderFrequencyStatement.setDate(3, date); insertOrderFrequencyStatement.setBoolean(4, false); insertOrderFrequencyStatement.setString(5, uuid); insertOrderFrequencyStatement.executeUpdate(); insertOrderFrequencyStatement.clearParameters(); } connection.commit(); } catch (DatabaseException e) { handleError(connection, e); } catch (SQLException e) { handleError(connection, e); } finally { if (autoCommit != null) { connection.setAutoCommit(autoCommit); } if (insertOrderFrequencyStatement != null) { insertOrderFrequencyStatement.close(); } } }