Downloads Documentation Community Contribute Demo






Show Sidebar
Login | Register

Changeset 5093

Show
Ignore:
Timestamp:
07/30/08 15:44:36 (5 months ago)
Author:
tmdugan
Message:

-- openmrs logic-api-refactoring

* added a fix for FIRST/LAST for cohorts. Before it was pulling the last/first value across all patients instead of per patient

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openmrs/branches/logic-api-refactoring/src/api/org/openmrs/logic/db/hibernate/HibernateLogicObsDAO.java

    r4979 r5093  
    1717import java.util.Calendar; 
    1818import java.util.Date; 
     19import java.util.HashMap; 
    1920import java.util.List; 
    2021 
     
    312313    // Helper function, converts logic service's criteria into Hibernate's 
    313314        // criteria 
    314         private Criteria logicToHibernate(LogicCriteria logicCriteria) { 
     315        private List<Obs> logicToHibernate(LogicCriteria logicCriteria,Cohort who) { 
    315316                Criteria criteria = sessionFactory.getCurrentSession() 
    316317                                                  .createCriteria(Obs.class); 
     
    322323                // if there is any 
    323324                if (operator == Operator.LAST) { 
    324                         criteria.addOrder(Order.desc("obsDatetime")).setMaxResults(1)
     325                        criteria.addOrder(Order.desc("obsDatetime"))
    325326                        if(logicCriteria.getRightOperand() instanceof LogicCriteria) 
    326327                        { 
     
    329330 
    330331                } else if (operator == Operator.FIRST) { 
    331                         criteria.addOrder(Order.asc("obsDatetime")).setMaxResults(1)
     332                        criteria.addOrder(Order.asc("obsDatetime"))
    332333                        if(logicCriteria.getRightOperand() instanceof LogicCriteria) 
    333334                        { 
     
    347348                } 
    348349 
    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; 
    350375        } 
    351376 
     
    357382    public List<Obs> getObservations(Cohort who, LogicCriteria logicCriteria) { 
    358383        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); 
    367385    } 
    368386