package se.cambio.cds.util;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import se.cambio.cds.model.instance.ArchetypeReference;
import se.cambio.cds.model.instance.ElementInstance;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class EHRDataFilterUtil {
public static Set<ArchetypeReference> filterEHRData(String ehrId, DateTime ehrDate, Collection<ArchetypeReference> queryARs, Collection<ElementInstance> elementInstances){
Set<ArchetypeReference> ehrIdARs = new HashSet<ArchetypeReference>();
if (elementInstances==null){
Logger.getLogger(EHRDataFilterUtil.class).warn("No ehrData found for ehrId '"+ehrId+"'");
}else{
//We iterate through archetype references instead of
Set<ArchetypeReference> auxEHRIdsARs = new HashSet<ArchetypeReference>();
for (ElementInstance elementInstance: elementInstances){
auxEHRIdsARs.add(elementInstance.getArchetypeReference());
}
for (ArchetypeReference archetypeReference: auxEHRIdsARs){
//If using time series comparison filter elements outside the range
boolean useAR = true;
if (ehrDate!=null){
DateTime dateTime = DateTimeARFinder.getDateTime(archetypeReference);
//DateFormat df2 = DateFormat.getDateTimeInstance();
//Logger.getLogger(DashboardFetchPageExecutionThread.class).debug("Comparing '"+ehrId+"' with ehr date '"+df2.format(ehrDate.toDate())+"' to date '"+(dateTime==null?"null":df2.format(dateTime.toDate()))+"' eiId = '"+elementInstance.getId()+"'");
if (dateTime==null || dateTime.isAfter(ehrDate)){
useAR = false;
DateFormat df = DateFormat.getDateTimeInstance();
if (dateTime==null){
Logger.getLogger(EHRDataFilterUtil.class).warn("Date time for ehrId "+ehrId+" with AR "+archetypeReference.getIdArchetype()+" is null!");
}else{
Logger.getLogger(EHRDataFilterUtil.class).debug(df.format(dateTime.toDate())+" after "+df.format(ehrDate.toDate()));
}
}
}
if (useAR){
ehrIdARs.add(archetypeReference);
}
}
//Fill missing data
Calendar date = Calendar.getInstance();
if (ehrDate!=null){
date = ehrDate.toGregorianCalendar();
}
PredicateFilterUtil.filterByPredicates(queryARs, ehrIdARs, date);
}
return ehrIdARs;
}
}