public float getConfidence(Patient subject, MedicFormResponse mfr) { List<MedicFormFieldResponse> responses = formFieldResponseDao.getResponsesForFormResponse(mfr); float result = 0.0F; float total = 0.0F; for (MedicFormFieldResponse fieldResponse : responses) { // if it is mapped to a namefield, score it as a name if (fieldResponse.getField().getMapping() == PatientFieldMapping.NAMEFIELD) { result += getNameDistance(subject.getName(), fieldResponse.getValue()); total += 1.0F; // if it is mapped to an id field, score it as an ID } else if (fieldResponse.getField().getMapping() == PatientFieldMapping.IDFIELD) { result += getEditDistance(subject.getStringID(), fieldResponse.getValue()); total += 1.0F; // if it is mapped as a bday field, score it as a bday } else if (fieldResponse.getField().getMapping() == PatientFieldMapping.BIRTHDATEFIELD) { if (fieldResponse.getValue().length() <= 8) { result += getEditDistance( shortFormatter.format(subject.getBirthdate()), fieldResponse.getValue()); } else { result += getEditDistance( longFormatter.format(subject.getBirthdate()), fieldResponse.getValue()); } total += 1.0F; } } return (result / total) * 100; }
public List<Candidate> getCandidatesForResponse(MedicFormResponse response) { Log.info("Attempting to map response"); // get the CHW that submitted the form CommunityHealthWorker chw = (CommunityHealthWorker) response.getSubmitter(); // get the list of patients that the CHW cares for ArrayList<Patient> patients = (ArrayList<Patient>) patientDao.getPatientsForCHW(chw); ArrayList<Candidate> candidates = new ArrayList<Candidate>(); // iterate through all fields on the form, seeing if they are mapped to patient identifying // fields // e.g. Birthdate, Name, and Patient ID for (Patient patient : patients) { candidates.add(new Candidate(patient)); } List<MedicFormFieldResponse> responses = response.getResponses(); try { responses.get(0).getDateSubmitted(); } catch (Exception e) { responses = formFieldResponseDao.getResponsesForFormResponse(response); } for (MedicFormFieldResponse fieldResponse : responses) { // if it is mapped to a namefield, score it as a name if (fieldResponse.getField().getMapping() == PatientFieldMapping.NAMEFIELD) { for (Candidate c : candidates) { c.setNameScore( getNameDistance(c.getName().toLowerCase(), fieldResponse.getValue().toLowerCase())); } // if it is mapped to an id field, score it as an ID } else if (fieldResponse.getField().getMapping() == PatientFieldMapping.IDFIELD) { for (Candidate c : candidates) { c.setIdScore(getEditDistance(c.getStringID(), fieldResponse.getValue())); } // if it is mapped as a bday field, score it as a bday } else if (fieldResponse.getField().getMapping() == PatientFieldMapping.BIRTHDATEFIELD) { for (Candidate c : candidates) { if (fieldResponse.getValue().length() <= 8) { c.setBirthdateScore( getEditDistance( shortFormatter.format(c.getPatient().getBirthdate()), fieldResponse.getValue())); } else { c.setBirthdateScore( getEditDistance( longFormatter.format(c.getPatient().getBirthdate()), fieldResponse.getValue())); } } } } Collections.sort(candidates); return candidates.subList(0, 5); }