package de.uni_luebeck.inb.krabbenhoeft.eQTL.application; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.restlet.resource.ClientResource; import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.rest.CreateNewDataSetParameter; import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.rest.DataImporter; import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.rest.DataSetLine; import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.rest.InsertIntoDataSetParameter; public class ImportCSV { private static DataImporter connectToServer() { ClientResource cr = new ClientResource("http://127.0.0.1:8888/restlet/FAKEFAKE/data_import"); DataImporter dataImporter = cr.wrap(DataImporter.class); return dataImporter; } public static void main(String[] args) throws IOException { final DataImporter dataImporter = connectToServer(); final String[] dataSets = dataImporter.getDataSetNames(); System.out.println("getDataSets() = {"); for (String string : dataSets) { System.out.println(string); } System.out.println("}"); Integer key = dataImporter.createNewDataSet(new CreateNewDataSetParameter("test", new String[] { "sex", "AUC", "severity" })); System.out.println("new key: " + key); // http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?tool=portal&db=nuccore&dopt=xml&sendto=on&log$=seqview&extrafeat=976&maxplex=0&val=NM_011660.2 // SELECT Locus, Trait, LOD, Sex, AUC, Severity FROM `qtl` WHERE 1 // select Locus, Trait, LOD, Sex, AUC, Severity, chromosome, // cMorgan_Min, cMorgan_Max, cMorgan_Peak, Accession from qtl inner join // IlluminaMouseChip ON ProbeId = trait BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("input.csv"))); String line; Set<LocusPos> locusPositions = new HashSet<LocusPos>(); Set<TraitAndAccession> traits = new HashSet<TraitAndAccession>(); Set<Double> scores = new HashSet<Double>(); Set<String> covariateValues = new HashSet<String>(); while ((line = bufferedReader.readLine()) != null) { String[] parts = line.split(","); LocusPos locusPos = new LocusPos(); locusPos.name = parts[0]; locusPos.chromosome = parts[6]; locusPos.min = Double.parseDouble(parts[7]); locusPos.max = Double.parseDouble(parts[8]); locusPos.peak = Double.parseDouble(parts[9]); locusPositions.add(locusPos); TraitAndAccession traitAndAccession = new TraitAndAccession(); traitAndAccession.trait = parts[1]; traitAndAccession.accession = parts[10]; traits.add(traitAndAccession); scores.add(Double.parseDouble(parts[2])); covariateValues.add(parts[3]); covariateValues.add(parts[4]); covariateValues.add(parts[5]); } Double[] scoreArr = scores.toArray(new Double[0]); String[] covArr = covariateValues.toArray(new String[0]); Random random = new Random(); int numberEmitted = 0; final int expectItems = locusPositions.size() * traits.size(); System.out.println("Expecting: " + expectItems); int lastFlushId = 1; List<DataSetLine> dataSetLines = new ArrayList<DataSetLine>(); for (LocusPos locusPos : locusPositions) { for (TraitAndAccession traitAndAccession : traits) { DataSetLine dataSetLine = new DataSetLine(); dataSetLine.chromosome = locusPos.chromosome; final String auc = covArr[random.nextInt(covArr.length)]; final String severity = covArr[random.nextInt(covArr.length)]; final String sex = covArr[random.nextInt(covArr.length)]; dataSetLine.covariates = new String[] { "AUC=" + auc, "severity=" + severity, "sex=" + sex }; dataSetLine.geneBankDnaId = traitAndAccession.accession; dataSetLine.locusId = locusPos.name; dataSetLine.lodScore = scoreArr[random.nextInt(scoreArr.length)] + random.nextDouble(); dataSetLine.positionMax = locusPos.max; dataSetLine.positionMin = locusPos.min; dataSetLine.positionPeak = locusPos.peak; dataSetLine.traitId = traitAndAccession.trait; dataSetLines.add(dataSetLine); numberEmitted++; if (dataSetLines.size() >= 5000) { final InsertIntoDataSetParameter parameters = new InsertIntoDataSetParameter(key, dataSetLines.toArray(new DataSetLine[0]), lastFlushId, false); lastFlushId += dataSetLines.size(); storeWithRetry(dataImporter, parameters); dataSetLines.clear(); System.out.println("Emitted so far: " + numberEmitted + " = " + ((double) numberEmitted * 100.0 / (double) expectItems) + "%"); } } } // try { // executorService.shutdown(); // executorService.awaitTermination(1, TimeUnit.DAYS); // Thread.sleep(5000); // } catch (InterruptedException e) { // e.printStackTrace(); // } storeWithRetry(dataImporter, new InsertIntoDataSetParameter(key, dataSetLines.toArray(new DataSetLine[0]), lastFlushId, true)); bufferedReader.close(); } private static void storeWithRetry(final DataImporter dataImporter, final InsertIntoDataSetParameter parameters) { dataImporter.insertIntoDataSet(parameters); } private static ExecutorService executorService = Executors.newFixedThreadPool(10); private static ThreadLocal<DataImporter> threadLocalDataImporter = new ThreadLocal<DataImporter>(); @SuppressWarnings("unused") private static void uploadAsynchronous(final InsertIntoDataSetParameter parameters) { executorService.execute(new Runnable() { public void run() { DataImporter dataImporter = threadLocalDataImporter.get(); if (dataImporter == null) { dataImporter = connectToServer(); threadLocalDataImporter.set(dataImporter); } storeWithRetry(dataImporter, parameters); System.out.println("Done: " + parameters.toString()); } }); } }