package org.molgenis.mutation.service; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.molgenis.core.Publication; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.mutation.Mutation; import org.molgenis.mutation.Patient; import org.molgenis.pheno.ObservedValue; import org.molgenis.submission.Submission; public class ExportService implements Serializable { private static final long serialVersionUID = 941152681943662622L; private Database db; public ExportService() { } public void setDatabase(Database db) { this.db = db; } public String exportCsv() throws DatabaseException { List<Patient> patients = this.db.query(Patient.class).equals(Patient.CONSENT, "publication") .sortASC(Patient.IDENTIFIER).find(); String result = ""; List<String> header = this.exportHeader(); result += StringUtils.join(header, ",") + "\n"; for (Patient patient : patients) { // System.out.println(">>> patient.submission==" + // patient.getSubmission_Id()); List<String> columns = this.exportRow(patient); result += StringUtils.join(columns, ",") + "\n"; } return result; } public String exportCsv(Date submissionDate) throws DatabaseException { List<Patient> patients = this.db.query(Patient.class).equals(Patient.CONSENT, "publication") .sortASC(Patient.IDENTIFIER).find(); String result = ""; List<String> header = this.exportHeader(); result += StringUtils.join(header, ",") + "\n"; for (Patient patient : patients) { Submission submission = this.db.findById(Submission.class, patient.getSubmission_Id()); if (submission.getDate().before(submissionDate)) continue; // System.out.println(">>> patient.submission==" + // patient.getSubmission_Id()); List<String> columns = this.exportRow(patient); result += StringUtils.join(columns, ",") + "\n"; } return result; } private List<String> exportHeader() { List<String> row = new ArrayList<String>(); row.add("Identifier"); row.add("Local patient number"); row.add("Patient Consent"); row.add("Phenotype major type"); row.add("Phenotype Subtype"); row.add("cDNA change_1"); row.add("RNA change_1"); row.add("Protein change_1"); row.add("Exon/Intron_1"); row.add("Consequence_1"); row.add("Inheritance_1"); row.add("cDNA change_2"); row.add("RNA change_2"); row.add("Protein change_2"); row.add("Exon/Intron_2"); row.add("Consequence_2"); row.add("Inheritance_2"); row.add("Reference"); // row.add("Blistering"); // row.add("Location"); // row.add("Hands"); // row.add("Feet"); // row.add("Arms"); // row.add("Legs"); // row.add("Proximal body flexures"); // row.add("Trunk"); // row.add("Mucosa"); // row.add("Skin atrophy"); // row.add("Milia"); // row.add("Nail dystrophy"); // row.add("Albopapuloid papules"); // row.add("Pruritic papules"); // row.add("Alopecia"); // row.add("Squamous cell carcinoma(s)"); // row.add("Revertant skin patch(es)"); // row.add("Mechanism"); // row.add("Flexion contractures"); // row.add("Pseudosyndactyly (hands)"); // row.add("Microstomia"); // row.add("Ankyloglossia"); // row.add("Swallowing difficulties/ dysphagia/ oesophagus strictures"); // row.add("Growth retardation"); // row.add("Anaemia"); // row.add("Renal failure"); // row.add("Dilated cardiomyopathy"); // row.add("Other"); return row; } private List<String> exportRow(Patient patient) throws DatabaseException { List<String> row = new ArrayList<String>(); row.add(patient.getIdentifier()); row.add(patient.getNumber()); row.add(patient.getConsent()); List<ObservedValue> phenotypes = this.db.query(ObservedValue.class) .equals(ObservedValue.TARGET, patient.getId()).find(); List<String> phenotypeNames = new ArrayList<String>(); for (ObservedValue phenotype : phenotypes) { phenotypeNames.add(phenotype.getValue()); } row.add(StringUtils.join(phenotypeNames, ", ")); List<Mutation> mutations = this.db.query(Mutation.class).in(Mutation.ID, patient.getMutations_Id()).find(); if (mutations.size() > 0) { Mutation mutation1 = mutations.get(0); row.add(mutation1.getCdna_Notation()); row.add("r.?"); row.add(mutation1.getAa_Notation()); row.add(mutation1.getExon_Name()); row.add(mutation1.getConsequence()); row.add(mutation1.getInheritance()); } else { row.add("NA"); row.add(""); row.add(""); row.add(""); row.add(""); row.add(""); } if (mutations.size() > 1) { Mutation mutation2 = mutations.get(1); row.add(mutation2.getCdna_Notation()); row.add("r.?"); row.add(mutation2.getAa_Notation()); row.add(mutation2.getExon_Name()); row.add(mutation2.getConsequence()); row.add(mutation2.getInheritance()); } else { row.add(patient.getMutation2remark()); row.add(""); row.add(""); row.add(""); row.add(""); row.add(""); } List<Publication> publications = this.db.query(Publication.class) .in(Publication.ID, patient.getPatientreferences_Id()).find(); List<String> publicationNames = new ArrayList<String>(); List<String> publicationPudmed = new ArrayList<String>(); for (Publication publication : publications) { publicationNames.add(publication.getName()); publicationPudmed.add(publication.getPubmedID_Name()); } row.add(StringUtils.join(publicationNames, ";")); row.add(StringUtils.join(publicationPudmed, ";")); // row.add(patient.getGender()); // row.add(patient.getAge()); // row.add(patient.getEthnicity()); // row.add(patient.getDeceased()); // row.add(patient.getDeath_Cause()); return row; } }