/* File: col7a1/model/UploadBatch.java * Copyright: GBIC 2000-2010, all rights reserved * Date: August 11, 2010 * * generator: org.molgenis.generators.csv.CsvReaderGen 3.3.2-testing * * * THIS FILE HAS BEEN GENERATED, PLEASE DO NOT EDIT! */ package org.molgenis.chd7.csv; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.molgenis.framework.db.CsvToDatabase; import org.molgenis.framework.db.Database; import org.molgenis.framework.db.DatabaseException; import org.molgenis.framework.db.Database.DatabaseAction; import org.molgenis.util.CsvReader; import org.molgenis.util.Entity; import org.molgenis.util.Tuple; import org.molgenis.mutation.Mutation; import org.molgenis.mutation.service.MutationService; import org.molgenis.mutation.service.UploadService; import org.molgenis.mutation.vo.MutationSummaryVO; import org.molgenis.mutation.vo.MutationUploadVO; import org.molgenis.mutation.vo.ObservedValueVO; import org.molgenis.mutation.vo.PatientSummaryVO; import org.molgenis.core.Publication; import org.molgenis.core.service.PublicationService; import org.molgenis.core.vo.PublicationVO; //import col7a1.UploadBatch; import org.molgenis.services.PubmedService; import org.molgenis.services.pubmed.Author; import org.molgenis.services.pubmed.PubmedArticle; import org.molgenis.submission.Submission; /** * Reads UploadBatch from a delimited (csv) file, resolving xrefs to ids where * needed, that is the tricky bit ;-) */ public class UploadBatchCsvReader extends CsvToDatabase<Entity> { public static final transient Logger logger = Logger.getLogger(UploadBatchCsvReader.class); /** * Imports UploadBatch from tab/comma delimited File * * @param db * database to import into * @param reader * csv reader to load data from * @param defaults * to set default values for each row * @param dbAction * indicating wether to add,update,remove etc * @param missingValues * indicating what value in the csv is treated as 'null' (e.g. "" * or "NA") * @return number of elements imported */ public int importCsv(final Database db, CsvReader reader, final Tuple defaults, final DatabaseAction dbAction, final String missingValues) throws DatabaseException, IOException, Exception { // cache for entities of which xrefs couldn't be resolved (e.g. if there // is a self-refence) // these entities can be updated with their xrefs in a second round when // all entities are in the database // final List<UploadBatch> uploadBatchsMissingRefs = new // ArrayList<UploadBatch>(); // db.beginTx(); final UploadService uploadService = new UploadService(); uploadService.setDatabase(db); final MutationService mutationService = new MutationService(); mutationService.setDatabase(db); final PublicationService publicationService = new PublicationService(db); final PubmedService pubmedService = new PubmedService(); final Submission submission = new Submission(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); submission.setDate(dateFormat.format(new Date())); submission.setReleasedate(dateFormat.format(new Date())); submission.setIdentifier("S" + new Date()); List<Integer> submitters = new ArrayList<Integer>(); submitters.add(db.getLogin().getUserId()); submission.setSubmitters_Id(submitters); db.add(submission); // cache for objects to be imported from file (in batch) // TODO: Danny: Use or loose /* final List<PatientSummaryVO> patientList = */new ArrayList<PatientSummaryVO>(BATCH_SIZE); // wrapper to count final IntegerWrapper total = new IntegerWrapper(0); reader.setMissingValues(missingValues); Integer mutationIdentifier = uploadService.getMaxMutationIdentifier(); Integer patientIdentifier = uploadService.getMaxPatientIdentifier(); for (Tuple tuple : reader) { // for (String fieldName : tuple.getFields()) // System.out.println(">>> fieldName==" +fieldName); // parse object, setting defaults and values from file // if (lineNo > 5) return; PatientSummaryVO patientSummaryVO = new PatientSummaryVO(); patientSummaryVO.setSubmissionDate(submission.getDate()); patientSummaryVO.setPatientNumber(tuple.getString("ID CHARGE database")); patientSummaryVO.setPatientGender("unknown"); patientSummaryVO.setPatientEthnicity("unknown"); patientSummaryVO.setPatientAge("unknown"); patientSummaryVO.setPatientDeceased(tuple.getString("Deceased")); patientSummaryVO.setVariantSummaryVOList(new ArrayList<MutationSummaryVO>()); if (StringUtils.isNotEmpty(tuple.getString("CHD7 c"))) { MutationUploadVO mutationUploadVO = new MutationUploadVO(); mutationUploadVO.setGeneSymbol("CHD7"); mutationUploadVO.setMutation(new Mutation()); mutationUploadVO.getMutation().setCdna_Notation("c." + tuple.getString("CHD7 c")); mutationService.assignValuesFromNotation(mutationUploadVO); if (StringUtils.isNotEmpty(tuple.getString("CHD7 p"))) mutationUploadVO.getMutation().setAa_Notation( "p." + tuple.getString("CHD7 p")); // if (StringUtils.isNotEmpty(tuple.getString("Consequence_1"))) // mutationUploadVO.getMutation().setConsequence(ObjectUtils.toString(tuple.getString("Consequence_1"), // "")); mutationUploadVO.getMutation().setConsequence("Unknown"); mutationUploadVO.getMutation().setInheritance("dominant"); mutationIdentifier = mutationIdentifier + 1; mutationUploadVO.getMutation().setIdentifier("M" + mutationIdentifier); mutationUploadVO.getMutation().setName("M" + mutationIdentifier); mutationUploadVO.getMutation() .setPathogenicity(StringUtils.lowerCase(tuple.getString("Pathogenicity"))); mutationUploadVO.getMutation().setType(tuple.getString("Mutation type")); // Insert mutation if it does not exist already List<Mutation> results = db.query(Mutation.class) .equals(Mutation.CDNA_NOTATION, mutationUploadVO.getMutation().getCdna_Notation()).find(); if (results.size() != 1) { uploadService.insert(mutationUploadVO); System.out.println(">>>Inserted mutation: " + mutationUploadVO.getMutation().toString()); } MutationSummaryVO mutationSummaryVO = new MutationSummaryVO(); mutationSummaryVO.setCdnaNotation(mutationUploadVO.getMutation().getCdna_Notation()); patientSummaryVO.getVariantSummaryVOList().add(mutationSummaryVO); } // Second mutation is always null // Leave xref == null and add remark in mutation2remark patientSummaryVO.setVariantComment("NA"); patientSummaryVO.setPhenotypeId(null); patientSummaryVO.setPhenotypeMajor(tuple.getString("Phenotype")); patientSummaryVO.setPhenotypeSub(""); patientSummaryVO.setPatientConsent("no"); if (tuple.getString("Pubmed ID") != null) { List<PublicationVO> publicationVOs = new ArrayList<PublicationVO>(); String[] pubmeds = tuple.getString("PubMed ID").split("[,;]"); for (String pubmed : pubmeds) { pubmed = StringUtils.deleteWhitespace(pubmed); PublicationVO publicationVO = new PublicationVO(); publicationVO.setPubmedId(pubmed); // Insert publication if it does not exist already List<Publication> results = db.query(Publication.class).equals(Publication.NAME, pubmed).find(); if (results.size() < 1) { List<Integer> pubmedIdList = new ArrayList<Integer>(); pubmedIdList.add(Integer.valueOf(pubmed)); List<PubmedArticle> pubmedArticles = pubmedService.getPubmedArticlesForIds(pubmedIdList); // System.out.println(">>> pubmedService: ids==" + // pubmedIdList + ", result==" + pubmedArticles); for (PubmedArticle pubmedArticle : pubmedArticles) { // System.out.println(">>> pubmedArticle==" + // pubmedArticle.MedlineCitation.article.ArticleTitle); List<Author> authorList = pubmedArticle.MedlineCitation.article.Authors; List<String> authors = new ArrayList<String>(); for (Author author : authorList) authors.add(author.toInitials()); publicationVO.setAuthors(StringUtils.join(authors, "; ")); publicationVO.setName(pubmedArticle.MedlineCitation.PMID); publicationVO.setTitle(pubmedArticle.MedlineCitation.article.ArticleTitle); publicationService.insert(publicationVO); } } publicationVOs.add(publicationVO); } patientSummaryVO.setPublicationVOList(publicationVOs); patientSummaryVO.setPatientConsent("publication"); } patientIdentifier = patientIdentifier + 1; patientSummaryVO.setPatientIdentifier("P" + patientIdentifier); patientSummaryVO.setPatientName("P" + patientIdentifier); patientSummaryVO.setObservedValueVOList(new ArrayList<ObservedValueVO>()); ObservedValueVO observedValueVO; for (int i = 18;; i++) { // System.out.println(">>>i==" + i); String colName = tuple.getColName(i); // System.out.println(">>>colName==" + colName); if (colName == null) break; observedValueVO = new ObservedValueVO(); observedValueVO.setFeatureName(colName); observedValueVO.setTargetName(patientSummaryVO.getPatientIdentifier()); observedValueVO.setValue(ObjectUtils.toString(tuple.getString(colName), "unknown")); patientSummaryVO.getObservedValueVOList().add(observedValueVO); } uploadService.insert(patientSummaryVO); total.set(total.get() + 1); // patientList.add(patientSummaryVO); // // //add to db when batch size is reached // if(patientList.size() == BATCH_SIZE) // { // //resolve foreign keys and copy those entities that could not be // resolved to the missingRefs list // uploadBatchsMissingRefs.addAll(resolveForeignKeys(db, // uploadBatchList)); // // //update objects in the database using xref_label defined // secondary key(s) 'id' defined in xref_label // db.update(uploadBatchList,dbAction, "id"); // // //clear for next batch // uploadBatchList.clear(); // // //keep count // total.set(total.get() + BATCH_SIZE); // } } // db.commitTx(); // add remaining elements to the database // if(!uploadBatchList.isEmpty()) // { // //resolve foreign keys, again keeping track of those entities that // could not be solved // uploadBatchsMissingRefs.addAll(resolveForeignKeys(db, // uploadBatchList)); // //update objects in the database using xref_label defined secondary // key(s) 'id' defined in xref_label // db.update(uploadBatchList,dbAction, "id"); // } // // //second import round, try to resolve FK's for entities again as they // might have referred to entities in the imported list // List<UploadBatch> uploadBatchsStillMissingRefs = // resolveForeignKeys(db, uploadBatchsMissingRefs); // // //if there are still missing references, throw error and rollback // if(uploadBatchsStillMissingRefs.size() > 0){ // throw new // Exception("Import of 'UploadBatch' objects failed: attempting to resolve in-list references, but there are still UploadBatchs referring to UploadBatchs that are neither in the database nor in the list of to-be imported UploadBatchs. (the first one being: "+uploadBatchsStillMissingRefs.get(0)+")"); // } // //else update the entities in the database with the found references // and return total // else // { // db.update(uploadBatchsMissingRefs,DatabaseAction.UPDATE, "id"); // // //output count // total.set(total.get() + uploadBatchList.size()); // logger.info("imported "+total.get()+" uploadBatch from CSV"); // // return total.get(); // } return total.get(); } }