@Override public EncounterQueryResult evaluate(EncounterQuery definition, EvaluationContext context) throws EvaluationException { context = ObjectUtil.nvl(context, new EvaluationContext()); BasicEncounterQuery query = (BasicEncounterQuery) definition; EncounterQueryResult result = new EncounterQueryResult(query, context); if (context.getBaseCohort() != null && context.getBaseCohort().isEmpty()) { return result; } if (context instanceof EncounterEvaluationContext) { EncounterIdSet baseEncounters = ((EncounterEvaluationContext) context).getBaseEncounters(); if (baseEncounters != null && baseEncounters.getMemberIds().isEmpty()) { return result; } } HqlQueryBuilder q = new HqlQueryBuilder(); q.select("e.encounterId"); q.from(Encounter.class, "e"); q.whereIn("e.encounterType", query.getEncounterTypes()); q.whereIn("e.form", query.getForms()); q.whereGreaterOrEqualTo("e.encounterDatetime", query.getOnOrAfter()); q.whereLessOrEqualTo("e.encounterDatetime", query.getOnOrBefore()); q.whereIn("e.location", query.getLocationList()); q.whereEncounterIn("e.encounterId", context); if (query.getWhich() == null || query.getWhich() == TimeQualifier.ANY) { List<Integer> results = evaluationService.evaluateToList(q, Integer.class); result.getMemberIds().addAll(results); } else { q.innerJoin("e.patient", "p"); q.select("p.patientId"); if (query.getWhich() == TimeQualifier.LAST) { q.orderDesc("e.encounterDatetime"); } else { q.orderAsc("e.encounterDatetime"); } ListMap<Integer, Integer> foundEncountersForPatients = new ListMap<Integer, Integer>(); int maxNumPerPatient = ObjectUtil.nvl(query.getWhichNumber(), 1); for (Object[] row : evaluationService.evaluateToList(q)) { Integer encounterId = (Integer) row[0]; Integer patientId = (Integer) row[1]; foundEncountersForPatients.putInList(patientId, encounterId); if (foundEncountersForPatients.get(patientId).size() <= maxNumPerPatient) { result.add(encounterId); } } } return result; }
@Override public EncounterQueryResult evaluate(EncounterQuery definition, EvaluationContext context) throws EvaluationException { context = ObjectUtil.nvl(context, new EvaluationContext()); BasicEncounterQuery query = (BasicEncounterQuery) definition; EncounterQueryResult result = new EncounterQueryResult(query, context); Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Encounter.class); criteria.setProjection(Projections.id()); criteria.add(Restrictions.eq("voided", false)); if (query.getOnOrAfter() != null) { criteria.add(Restrictions.ge("encounterDatetime", query.getOnOrAfter())); } if (query.getOnOrBefore() != null) { criteria.add( Restrictions.le( "encounterDatetime", DateUtil.getEndOfDayIfTimeExcluded(query.getOnOrBefore()))); } if (context.getBaseCohort() != null) { if (context.getBaseCohort().size() == 0) { return result; } else { criteria.add(Restrictions.in("patient.id", context.getBaseCohort().getMemberIds())); } } if (context instanceof EncounterEvaluationContext) { EncounterIdSet baseEncounters = ((EncounterEvaluationContext) context).getBaseEncounters(); if (baseEncounters != null) { if (baseEncounters.getSize() == 0) { return result; } else { criteria.add(Restrictions.in("id", baseEncounters.getMemberIds())); } } } for (Integer encounterId : ((List<Integer>) criteria.list())) { result.add(encounterId); } return result; }