@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();
      }
    }
  }