package org.openmrs.module.reporting.data.visit.evaluator;
import org.openmrs.Cohort;
import org.openmrs.Visit;
import org.openmrs.annotation.Handler;
import org.openmrs.api.context.Context;
import org.openmrs.module.reporting.data.patient.EvaluatedPatientData;
import org.openmrs.module.reporting.data.patient.service.PatientDataService;
import org.openmrs.module.reporting.data.visit.EvaluatedVisitData;
import org.openmrs.module.reporting.data.visit.definition.PatientToVisitDataDefinition;
import org.openmrs.module.reporting.data.visit.definition.VisitDataDefinition;
import org.openmrs.module.reporting.evaluation.EvaluationContext;
import org.openmrs.module.reporting.evaluation.EvaluationException;
import org.openmrs.module.reporting.evaluation.querybuilder.HqlQueryBuilder;
import org.openmrs.module.reporting.evaluation.service.EvaluationService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Map;
/**
* Evaluates a PatientToVisitDataDefinition to produce a VisitData
*/
@Handler(supports=PatientToVisitDataDefinition.class, order=50)
public class PatientToVisitDataEvaluator implements VisitDataEvaluator {
@Autowired
EvaluationService evaluationService;
/**
* @see org.openmrs.module.reporting.data.visit.evaluator.VisitDataEvaluator#evaluate(org.openmrs.module.reporting.data.visit.definition.VisitDataDefinition, org.openmrs.module.reporting.evaluation.EvaluationContext)
* @should return patient data for each visit in the passed cohort
*/
@Override
public EvaluatedVisitData evaluate(VisitDataDefinition definition, EvaluationContext context) throws EvaluationException {
EvaluatedVisitData c = new EvaluatedVisitData(definition, context);
// create a map of visit ids -> patient ids
HqlQueryBuilder q = new HqlQueryBuilder();
q.select("v.visitId", "v.patient.patientId");
q.from(Visit.class, "v");
q.whereVisitIn("v.visitId", context);
Map<Integer, Integer> convertedIds = evaluationService.evaluateToMap(q, Integer.class, Integer.class, context);
if (!convertedIds.keySet().isEmpty()) {
// Create a new (patient) evaluation context using the retrieved ids
EvaluationContext patientEvaluationContext = new EvaluationContext();
patientEvaluationContext.setBaseCohort(new Cohort(convertedIds.values()));
// evaluate the joined definition via this patient context
PatientToVisitDataDefinition def = (PatientToVisitDataDefinition) definition;
EvaluatedPatientData pd = Context.getService(PatientDataService.class).evaluate(def.getJoinedDefinition(), patientEvaluationContext);
// now create the result set by mapping the results in the patient data set to visit ids
for (Integer encId : convertedIds.keySet()) {
c.addData(encId, pd.getData().get(convertedIds.get(encId)));
}
}
return c;
}
}