package org.molgenis.gids.converters.phenoModelconverterandloader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.molgenis.datatable.model.CsvTable;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.framework.db.Query;
import org.molgenis.framework.db.QueryRule;
import org.molgenis.framework.db.QueryRule.Operator;
import org.molgenis.pheno.Individual;
import org.molgenis.pheno.ObservedValue;
import org.molgenis.util.Tuple;
public class CheckDOBandGender
{
private String dob = "";
private String gender = "";
private Database db;
public CheckDOBandGender(Database db) throws DatabaseException
{
this.db = db;
}
public List<Tuple> checkGenderAndDOB(CsvTable csvTable, String dobIdentifier, String genderIdentifier)
throws DatabaseException
{
List<Individual> availableIndividuals = db.find(Individual.class);
List<String> identifiersIndividual = new ArrayList<String>();
List<String> checkingFeatures = new ArrayList<String>();
checkingFeatures.add("gender");
checkingFeatures.add("date_of_birth");
List<Tuple> checkingTuple = new ArrayList<Tuple>();
// Get all the individuals that are available in the database, because
// we want to check
// whether the individual from input file already exists in the database
// based on gender and date of birth.
if (availableIndividuals != null)
{
for (Individual i : availableIndividuals)
{
identifiersIndividual.add(i.getName());
}
// Make a complex query to get all the values that were created for
// all
// individuals on the two
// variables "gender and date of birth"
Query<ObservedValue> query = db.query(ObservedValue.class);
query.addRules(new QueryRule(ObservedValue.TARGET_NAME, Operator.IN, identifiersIndividual));
query.addRules(new QueryRule(ObservedValue.FEATURE_NAME, Operator.IN, checkingFeatures));
Map<String, DOBandGender> hashMap = new HashMap<String, DOBandGender>();
// Loop through all the values and collect information on gender and
// date of birth for all individuals
// and store these information in the model "DOBandGender" that is
// created for each individual
for (ObservedValue ov : query.find())
{
String targetName = ov.getTarget_Name();
if (hashMap.containsKey(targetName))
{
if (hashMap.get(targetName).getGender() == null)
{
hashMap.get(targetName).setGender(ov.getValue());
}
else
{
hashMap.get(targetName).setDateOfBirth(ov.getValue());
}
}
else
{
DOBandGender checker = new DOBandGender(targetName);
checker.setGender(ov.getValue());
hashMap.put(targetName, checker);
}
}
//
List<DOBandGender> listOfValues = (List<DOBandGender>) hashMap.values();
// Read in the CscTupleTable to go through all the rows in the input
// file,
// compare the two data sources in terms of date of birth and gender
for (Tuple tuple : csvTable.getRows())
{
String genderValue = tuple.getString(genderIdentifier);
String dobValue = tuple.getString(dobIdentifier);
for (DOBandGender each : listOfValues)
{
if (dobValue.equals(each.getDateOfBirth()))
{
if (genderValue.equals(each.getGender()))
{
checkingTuple.add(tuple);
break;
}
}
}
}
}
return checkingTuple;
}
public void checkDOB(String dobValue, String genderValue) throws DatabaseException
{
List<ObservedValue> listOfValues = db.find(ObservedValue.class, new QueryRule(ObservedValue.FEATURE_NAME,
Operator.EQUALS, "date_of_birth"));
List<DOBandGender> allIndividualsInDB = new ArrayList<DOBandGender>();
for (ObservedValue o : listOfValues)
{
if (o.getFeature_Name().equals("date_of_birth"))
{
DOBandGender dog = new DOBandGender(o.getTarget_Name());
dog.setDateOfBirth(o.getValue());
if (o.getValue().equals(dobValue))
{
checkGender(o.getTarget_Name(), genderValue);
}
}
}
}
public void checkGender(String target, String gender) throws DatabaseException
{
List<ObservedValue> listOfValues = db.find(ObservedValue.class, new QueryRule(ObservedValue.TARGET_NAME,
Operator.EQUALS, target));
for (ObservedValue o : listOfValues)
{
if (o.getFeature_Name().equals("gender"))
{
if (o.getValue().equals(gender))
{
System.out.println(target + "! You guys look the same man!");
}
}
}
}
}