Changeset 5093
- Timestamp:
- 07/30/08 15:44:36 (5 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
openmrs/branches/logic-api-refactoring/src/api/org/openmrs/logic/db/hibernate/HibernateLogicObsDAO.java
r4979 r5093 17 17 import java.util.Calendar; 18 18 import java.util.Date; 19 import java.util.HashMap; 19 20 import java.util.List; 20 21 … … 312 313 // Helper function, converts logic service's criteria into Hibernate's 313 314 // criteria 314 private Criteria logicToHibernate(LogicCriteria logicCriteria) {315 private List<Obs> logicToHibernate(LogicCriteria logicCriteria,Cohort who) { 315 316 Criteria criteria = sessionFactory.getCurrentSession() 316 317 .createCriteria(Obs.class); … … 322 323 // if there is any 323 324 if (operator == Operator.LAST) { 324 criteria.addOrder(Order.desc("obsDatetime")) .setMaxResults(1);325 criteria.addOrder(Order.desc("obsDatetime")); 325 326 if(logicCriteria.getRightOperand() instanceof LogicCriteria) 326 327 { … … 329 330 330 331 } else if (operator == Operator.FIRST) { 331 criteria.addOrder(Order.asc("obsDatetime")) .setMaxResults(1);332 criteria.addOrder(Order.asc("obsDatetime")); 332 333 if(logicCriteria.getRightOperand() instanceof LogicCriteria) 333 334 { … … 347 348 } 348 349 349 return criteria; 350 List<Obs> results = new ArrayList<Obs>(); 351 352 criteria.add(Restrictions.eq("voided", false)); 353 criteria.add(Restrictions.in("person.personId", who.getMemberIds())); 354 results.addAll(criteria.list()); 355 356 //return a single result per patient for these operators 357 //I don't see an easy way to do this in hibernate so I am 358 //doing some postprocessing 359 if(operator == Operator.FIRST || operator == Operator.LAST){ 360 HashMap<Integer,Obs> singleResultMap = new HashMap<Integer,Obs>(); 361 362 for(Obs currResult:results){ 363 Integer currPersonId = currResult.getPersonId(); 364 Obs prevResult = singleResultMap.get(currPersonId); 365 if(prevResult == null){ 366 singleResultMap.put(currPersonId, currResult); 367 } 368 } 369 if(singleResultMap.values().size()>0){ 370 results.clear(); 371 results.addAll(singleResultMap.values()); 372 } 373 } 374 return results; 350 375 } 351 376 … … 357 382 public List<Obs> getObservations(Cohort who, LogicCriteria logicCriteria) { 358 383 log.debug("*** Reading observations ***"); 359 Criteria criteria = logicToHibernate(logicCriteria); 360 List<Obs> results = new ArrayList<Obs>(); 361 362 criteria.add(Restrictions.eq("voided", false)); 363 criteria.add(Restrictions.in("person.personId", who.getMemberIds())); 364 results.addAll(criteria.list()); 365 366 return results; 384 return logicToHibernate(logicCriteria,who); 367 385 } 368 386