package org.molgenis.lifelinesresearchportal.plugins.loader.listeners;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.organization.Investigation;
import org.molgenis.pheno.Measurement;
import org.molgenis.protocol.Protocol;
import org.molgenis.util.Tuple;
import org.molgenis.util.TupleReader;
/**
* This listener creates Measurement for each field and Protocol for each table
* in VW_DICT
*
* TABNAAM GROEP VELDNR VELD -> Measurement.name VLDTYPE -> Measurement.dataType
* OMSCHR -> Measurement.description
*
* @author jorislops
*
*/
public class VwDictLoader extends ImportTupleLoader
{
private Map<String, Protocol> protocols = new LinkedHashMap<String, Protocol>();
private List<Measurement> measurements = new ArrayList<Measurement>();
private List<String> measurementNames = new ArrayList<String>();
private final Investigation investigation;
public VwDictLoader(Investigation investigation, String name, Database db)
{
super(name, db);
this.investigation = investigation;
}
public void load(TupleReader csvIterator) throws Exception
{
for (Tuple tuple : csvIterator)
{
// BEZOEK is skipped because we use VW_BEZOEK_PIVOT, where each
// subvisit has become a row
if (tuple.getString("TABNAAM") != null && !tuple.getString("TABNAAM").equals("")
&& !tuple.getString("TABNAAM").equals("BEZOEK"))
{
String protocolName = tuple.getString("TABNAAM");
// rename VW_BEZOEK_PIVOT to BEZOEK
if (protocolName.equals("VW_BEZOEK_PIVOT"))
{
protocolName = "BEZOEK";
}
// create new protocol if not yet known
Protocol p = protocols.get(protocolName);
if (p == null)
{
p = new Protocol();
p.setName(protocolName);
p.setInvestigation(investigation);
}
String measName = p.getName() + "_" + tuple.getString("VELD"); // temporarily
// prepend
// measurement
// name
// with
// table
// (protocol)
// name
if (tuple.getString("VELD") != null && !measurementNames.contains(measName))
{ // prevent duplicates
measurementNames.add(measName);
Measurement m = new Measurement();
m.setName(measName);
m.setInvestigation(investigation);
m.setDataType(convertDataType(tuple.getString("VLDTYPE")));
m.setDescription(tuple.getString("OMSCHR"));
measurements.add(m);
p.getFeatures_Name().add(m.getName()); // link to protocol
}
protocols.put(protocolName, p);
}
}
}
private String convertDataType(String string)
{
if (string == null) return "string";
if (string.startsWith("NUMMER")) return "int";
if (string.startsWith("DATUM")) return "datetime";
// else
return "string";
}
public void commit() throws DatabaseException
{
db.add(measurements);
List<Protocol> protocolList = new ArrayList<Protocol>(protocols.values());
db.add(protocolList);
for (Protocol p : protocolList)
protocols.put(p.getName(), p);
}
public Map<String, Protocol> getProtocols()
{
return protocols;
}
}