Downloads Documentation Community Contribute Demo






Show Sidebar
Login | Register
Show
Ignore:
Timestamp:
07/21/07 08:29:23 (1 year ago)
Author:
vmitrovic
Message:

Logic service - An almost-complete LogicCriteria -> Criteria conversion solution. Still not tested because of Spring issues.

Files:

Legend:

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

    r1931 r2051  
    11package org.openmrs.api.db.hibernate; 
    22 
     3import java.util.ArrayList; 
    34import java.util.Date; 
    45import java.util.HashSet; 
     
    1213import org.hibernate.Query; 
    1314import org.hibernate.SessionFactory; 
     15import org.hibernate.criterion.Criterion; 
    1416import org.hibernate.criterion.Expression; 
     17import org.hibernate.criterion.Order; 
    1518import org.hibernate.criterion.Restrictions; 
    1619import org.openmrs.Concept; 
     
    1922import org.openmrs.MimeType; 
    2023import org.openmrs.Obs; 
     24import org.openmrs.Patient; 
    2125import org.openmrs.Person; 
    2226import org.openmrs.api.ObsService; 
     
    2428import org.openmrs.api.db.DAOException; 
    2529import org.openmrs.api.db.ObsDAO; 
     30import org.openmrs.logic.LogicCriteria; 
     31import org.openmrs.reporting.PatientSet; 
    2632import org.openmrs.util.OpenmrsUtil; 
    2733 
     
    187193    } 
    188194 
     195    // Helper function, converts logic service's criteria into Hibernate's 
     196    // criteria 
     197    public Criteria logicToHibernate(LogicCriteria logicCriteria, 
     198            boolean notOperator) { 
     199        Criteria criteria = sessionFactory.getCurrentSession().createCriteria( 
     200                Obs.class); 
     201 
     202        while (logicCriteria != null) { 
     203            if (logicCriteria.getOperator() == null) { 
     204                // there's a concept string inside the right operand 
     205                Concept concept = Context.getConceptService() 
     206                        .getConceptByIdOrName(logicCriteria.getRootToken()); 
     207                Criterion c = Restrictions.eq("concept", concept); 
     208 
     209                if (notOperator) 
     210                    c = Restrictions.not(c); 
     211                criteria.add(c); 
     212            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Before) { 
     213                Criterion c = Restrictions.lt("obsDateTime", logicCriteria 
     214                        .getRightOperand()); 
     215 
     216                if (notOperator) 
     217                    c = Restrictions.not(c); 
     218                criteria.add(c); 
     219            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.After) { 
     220                Criterion c = Restrictions.gt("obsDateTime", logicCriteria 
     221                        .getRightOperand()); 
     222 
     223                if (notOperator) 
     224                    c = Restrictions.not(c); 
     225                criteria.add(c); 
     226            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.And) { 
     227                // TODO handle AND operator 
     228            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Or) { 
     229                // TODO handle OR operator 
     230            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Not) { 
     231                notOperator = !notOperator; 
     232            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Contains) { 
     233                // TODO handle CONTAINS operator 
     234            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Equals) { 
     235                Criterion c = null; 
     236                if (logicCriteria.getRightOperand() instanceof Float 
     237                        || logicCriteria.getRightOperand() instanceof Integer) 
     238                    c = Restrictions.eq("valueNumeric", logicCriteria 
     239                            .getRightOperand()); 
     240                else if (logicCriteria.getRightOperand() instanceof String) 
     241                    c = Restrictions.eq("valueText", logicCriteria 
     242                            .getRightOperand()); 
     243                else if (logicCriteria.getRightOperand() instanceof Date) 
     244                    c = Restrictions.eq("obsDateTime", logicCriteria 
     245                            .getRightOperand()); 
     246                else if (logicCriteria.getRightOperand() instanceof Concept) 
     247                    c = Restrictions.eq("concept", logicCriteria 
     248                            .getRightOperand()); 
     249                else 
     250                    log.error("Invalid operand value for EQUALS operation"); 
     251 
     252                if (notOperator) 
     253                    c = Restrictions.not(c); 
     254                criteria.add(c); 
     255            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.LessThan) { 
     256                Criterion c = null; 
     257                if (logicCriteria.getRightOperand() instanceof Float 
     258                        || logicCriteria.getRightOperand() instanceof Integer) 
     259                    c = Restrictions.lt("valueNumeric", logicCriteria 
     260                            .getRightOperand()); 
     261                else if (logicCriteria.getRightOperand() instanceof String) 
     262                    c = Restrictions.lt("valueText", logicCriteria 
     263                            .getRightOperand()); 
     264                else if (logicCriteria.getRightOperand() instanceof Date) 
     265                    c = Restrictions.lt("obsDateTime", logicCriteria 
     266                            .getRightOperand()); 
     267                else 
     268                    log.error("Invalid operand value for LESS THAN operation"); 
     269 
     270                if (notOperator) 
     271                    c = Restrictions.not(c); 
     272                criteria.add(c); 
     273            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.GreaterThan) { 
     274                Criterion c = null; 
     275                if (logicCriteria.getRightOperand() instanceof Float 
     276                        || logicCriteria.getRightOperand() instanceof Integer) 
     277                    c = Restrictions.gt("valueNumeric", logicCriteria 
     278                            .getRightOperand()); 
     279                else if (logicCriteria.getRightOperand() instanceof String) 
     280                    c = Restrictions.gt("valueText", logicCriteria 
     281                            .getRightOperand()); 
     282                else if (logicCriteria.getRightOperand() instanceof Date) 
     283                    c = Restrictions.gt("obsDateTime", logicCriteria 
     284                            .getRightOperand()); 
     285                else 
     286                    log.error("Invalid operand value for LESS THAN operation"); 
     287 
     288                if (notOperator) 
     289                    c = Restrictions.not(c); 
     290                criteria.add(c); 
     291            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Last) { 
     292                // TODO think of a solution for a NOT LAST case (is it needed at 
     293                // all?) 
     294                criteria.addOrder(Order.asc("obsDateTime")).setMaxResults(1); 
     295            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Exists) { 
     296                // TODO handle EXISTS operator 
     297            } else if (logicCriteria.getOperator() instanceof org.openmrs.logic.op.Within) { 
     298                // TODO handle WITHIN operator 
     299            } 
     300 
     301            logicCriteria = (LogicCriteria) logicCriteria.getLeftOperand(); 
     302        } 
     303 
     304        return criteria; 
     305    } 
     306 
     307    /** 
     308     * @see org.openmrs.api.db.ObsDAO#getObservations(org.openmrs.Person, 
     309     *      org.openmrs.logic.LogicCriteria) 
     310     */ 
     311    @SuppressWarnings("unchecked") 
     312    public List<Obs> getObservations(PatientSet who, LogicCriteria logicCriteria) { 
     313        Criteria criteria = logicToHibernate(logicCriteria, false); 
     314        List<Obs> results = new ArrayList<Obs>(); 
     315 
     316        for (Patient patient : who.getPatients()) { 
     317            // TODO possibly won't work - multiple "person" clauses 
     318            criteria.add(Restrictions.eq("person", patient)); 
     319            results.addAll(criteria.list()); 
     320        } 
     321 
     322        return results; 
     323    } 
     324 
    189325    /** 
    190326     * @see org.openmrs.api.db.ObsDAO#getLastNObservations(java.lang.Integer,