package org.celllife.idart.database;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import liquibase.change.custom.CustomSqlChange;
import liquibase.change.custom.CustomSqlRollback;
import liquibase.database.Database;
import liquibase.exception.CustomChangeException;
import liquibase.exception.RollbackImpossibleException;
import liquibase.exception.SetupException;
import liquibase.exception.UnsupportedChangeException;
import liquibase.exception.ValidationErrors;
import liquibase.resource.ResourceAccessor;
import liquibase.statement.SqlStatement;
import liquibase.statement.core.UpdateStatement;
import org.celllife.idart.database.hibernate.AtcCode;
import org.celllife.idart.database.hibernate.ChemicalCompound;
import org.celllife.idart.database.hibernate.ChemicalDrugStrength;
import org.celllife.idart.database.hibernate.Drug;
import org.celllife.idart.database.hibernate.util.HibernateUtil;
import org.hibernate.Session;
public class LinkDrugsToAtcCodes_3_8_9 implements CustomSqlChange, CustomSqlRollback {
@Override
public String getConfirmationMessage() {
return "Drugs mapped to ATC Codes";
}
@Override
public void setFileOpener(ResourceAccessor fileOpener) {
}
@Override
public void setUp() throws SetupException {
}
@Override
public ValidationErrors validate(Database arg0) {
return null;
}
@Override
public liquibase.statement.SqlStatement[] generateStatements(Database arg0)
throws CustomChangeException {
Session sess = HibernateUtil.getNewSession();
List<SqlStatement> statements = new ArrayList<SqlStatement>();
@SuppressWarnings("unchecked")
List<Drug> drugs = sess.createQuery("from Drug").list();
for (Drug drug : drugs) {
if (drug.getAtccode() != null){
continue;
}
Set<ChemicalCompound> ccs = new HashSet<ChemicalCompound>();
Set<ChemicalDrugStrength> cds = drug.getChemicalDrugStrengths();
for (ChemicalDrugStrength cd : cds) {
ccs.add(cd.getChemicalCompound());
}
Set<AtcCode> atccodes = drug.getAtccodes();
if (atccodes == null){
continue;
}
for (AtcCode atcCode : atccodes) {
if (atcCode.containsExactChemicalCompounds(ccs)){
statements.add(new UpdateStatement(null, "drug")
.addNewColumnValue("atccode_id", atcCode.getId())
.setWhereClause("id = " + drug.getId()));
break;
}
}
}
return statements.toArray(new SqlStatement[statements.size()]);
}
@Override
public SqlStatement[] generateRollbackStatements(Database arg0)
throws CustomChangeException, UnsupportedChangeException,
RollbackImpossibleException {
return new SqlStatement[] {
new UpdateStatement(null, "drug").addNewColumnValue("atccode_id", null)
};
}
}