package de.uni_luebeck.inb.krabbenhoeft.eQTL.server;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.restlet.resource.ServerResource;
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;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.Category;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.DataSet;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.DataSetLayer;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.HajoEntity;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer.ColumType;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.server.helpers.persistence.CassandraSession;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.server.helpers.persistence.CreateAndModifyEntities;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.server.helpers.persistence.RunWithHibernate;
public class DataImportResource extends ServerResource implements DataImporter {
public String[] getDataSetNames() {
return new RunWithHibernate<String[]>() {
public String[] work(Transaction transaction, Session session) throws Exception {
final List<DataSet> dataSets = DataSetHelpers.listMyDataSets(session, getCurrentUser());
final ArrayList<String> ret = new ArrayList<String>();
for (DataSet dataSet : dataSets) {
ret.add(dataSet.getName());
}
return ret.toArray(new String[0]);
}
}.run();
}
public Integer createNewDataSet(final CreateNewDataSetParameter parameterObject) {
return new RunWithHibernate<Integer>() {
public Integer work(Transaction transaction, Session session) throws Exception {
DataSet dataSet = DataSetHelpers.createDataSet(session, parameterObject.name, getCurrentUser());
List<ColumnForDataSetLayer> columns = new ArrayList<ColumnForDataSetLayer>();
columns.add(new ColumnForDataSetLayer("locusId", ColumType.Name));
columns.add(new ColumnForDataSetLayer("traitId", ColumType.Name));
final ColumnForDataSetLayer col = new ColumnForDataSetLayer("lodScore", ColumType.Numerical);
col.setIndexme(true);
columns.add(col);
for (String covariate : parameterObject.covariateNames) {
columns.add(new ColumnForDataSetLayer(covariate, ColumType.Category));
}
columns.add(new ColumnForDataSetLayer("chromosome", ColumType.Category));
columns.add(new ColumnForDataSetLayer("positionMin", ColumType.Numerical));
columns.add(new ColumnForDataSetLayer("positionPeak", ColumType.Numerical));
columns.add(new ColumnForDataSetLayer("positionMax", ColumType.Numerical));
columns.add(new ColumnForDataSetLayer("geneBankDnaId", ColumType.Name));
final DataSetLayer layer = DataSetHelpers.addLayerToDataSet(session, dataSet, columns, "Initial import");
return layer.getKey();
}
}.run();
}
public void insertIntoDataSet(final InsertIntoDataSetParameter parameterObject) {
new RunWithHibernate<Void>() {
public Void work(Transaction transaction, Session session) throws Exception {
final DataSetLayer dataSetLayer = (DataSetLayer) session.load(DataSetLayer.class, parameterObject.dataSetLayerKey);
CassandraSession cassandra = new CassandraSession();
CreateAndModifyEntities creator = new CreateAndModifyEntities(cassandra, null, dataSetLayer, dataSetLayer.getColumns());
final Iterator<HajoEntity> newEntityIterator = creator.getNewEntityIterator(parameterObject.linesIdStart);
for (DataSetLine dataSetLine : parameterObject.lines) {
HajoEntity addme = newEntityIterator.next();
addme.setName("locusId", dataSetLine.locusId);
addme.setName("traitId", dataSetLine.traitId);
addme.setNumerical("lodScore", dataSetLine.lodScore);
for (String cov : dataSetLine.covariates) {
String[] keyData = cov.split("=");
addme.setCategory(keyData[0], Category.wrap(keyData[1]));
}
addme.setCategory("chromosome", Category.wrap(dataSetLine.chromosome));
addme.setNumerical("positionMin", dataSetLine.positionMin);
addme.setNumerical("positionPeak", dataSetLine.positionPeak);
addme.setNumerical("positionMax", dataSetLine.positionMax);
addme.setName("geneBankDnaId", dataSetLine.geneBankDnaId);
creator.put(addme);
}
cassandra.close();
dataSetLayer.setNumberOfItems(dataSetLayer.getNumberOfItems() + parameterObject.lines.length);
if (parameterObject.lastUpload)
dataSetLayer.setCalculationComplete(true);
return null;
}
}.run();
}
}