package de.uni_luebeck.inb.krabbenhoeft.eQTL.server.processors;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.entities.ColumnForDataSetLayer;
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.ProcessingParameters;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.server.DataSetProcessor;
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 abstract class BaseProcessorImplementation implements DataSetProcessor {
public List<ColumnForDataSetLayer> getDataTypeAfterTransformation(List<ColumnForDataSetLayer> dataTypeBeforeTransformation) {
List<ColumnForDataSetLayer> columns = new ArrayList<ColumnForDataSetLayer>();
columns.addAll(dataTypeBeforeTransformation);
addNewColumns(columns);
return columns;
}
public abstract void addNewColumns(List<ColumnForDataSetLayer> columns);
public int getPreferredItemsPerProcessor() {
return 5 * 1000;
}
public int getPreferredNumberOfParallelRunningProcessors() {
return 20;
}
public DataSetProcessor.ProcessingResult process(final ProcessingParameters parameterObject) {
return new RunWithHibernate<DataSetProcessor.ProcessingResult>() {
public DataSetProcessor.ProcessingResult work(Transaction transaction, Session session) throws Exception {
final DataSetLayer sourceDataSetLayer = (DataSetLayer) session.load(DataSetLayer.class, parameterObject.getSourceDataSetLayerKey());
final DataSetLayer targetDataSetLayer = (DataSetLayer) session.load(DataSetLayer.class, parameterObject.getTargetDataSetLayerKey());
CassandraSession cassandra = new CassandraSession();
DataSetProcessor.ProcessingResult result = new DataSetProcessor.ProcessingResult();
final List<ColumnForDataSetLayer> origColumns = targetDataSetLayer.getColumns();
result.columnDefinitions = new ArrayList<ColumnForDataSetLayer>();
for (ColumnForDataSetLayer col : origColumns) {
result.columnDefinitions.add(new ColumnForDataSetLayer(col));
}
CreateAndModifyEntities modifier = new CreateAndModifyEntities(cassandra, sourceDataSetLayer, targetDataSetLayer, result.columnDefinitions);
final Iterator<HajoEntity> iterator = modifier.getEntitiesForProcessor(parameterObject.getSourceParallelBlockIdMin(), parameterObject.getSourceParallelBlockIdMax());
result.numberOfItemsEmitted = doWork(modifier, iterator);
final Logger log = Logger.getLogger(getClass().getName());
log.info("process: " + result.numberOfItemsEmitted);
cassandra.close();
return result;
}
}.run();
}
public abstract int doWork(CreateAndModifyEntities modifier, Iterator<HajoEntity> iterator);
}