Downloads Documentation Community Contribute Demo






Show Sidebar
Login | Register

Changeset 5182

Show
Ignore:
Timestamp:
08/06/08 15:00:21 (5 months ago)
Author:
jegg
Message:

in patientmatching module, changed OrderedOpenMRSReader to HQL that seems to work for expected matching demographics. Blocking on more than 2 demographics is VERY slow, and while hopefully correct, it's not optimized at all

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • openmrs-modules/patientmatching/src/org/regenstrief/linkage/io/OrderedOpenMRSReader.java

    r5157 r5182  
    11package org.regenstrief.linkage.io; 
    22 
     3import java.lang.reflect.InvocationTargetException; 
     4import java.lang.reflect.Method; 
    35import java.util.ArrayList; 
    46import java.util.Iterator; 
    57import java.util.List; 
    68 
     9import org.apache.commons.logging.Log; 
     10import org.apache.commons.logging.LogFactory; 
    711import org.hibernate.Query; 
    812import org.hibernate.SessionFactory; 
    913import org.openmrs.Patient; 
    1014import org.openmrs.PatientIdentifierType; 
     15import org.openmrs.Person; 
    1116import org.openmrs.PersonAttributeType; 
    1217import org.openmrs.api.context.Context; 
     
    4146         
    4247        public final static String ATTRIBUTE_PREFIX = "(Attribute) "; 
    43         public final static String IDENT_PREFIX = "(Identifier)"; 
    44          
     48        public final static String IDENT_PREFIX = "(Identifier) "; 
     49        public final static String GET_ID_METHOD = "getPersonId"; 
     50        //public final static String GET_PATIENT_ID_METHOD = "getPatientId"; 
     51        public final static String GET_PERSON_METHOD = "getPerson"; 
     52        public final static String GET_PATIENT_METHOD = "getPatient"; 
     53         
     54         
     55        private Log log = LogFactory.getLog(this.getClass()); 
    4556        private SessionFactory sessionFactory; 
    4657         
     
    5869                for(int i = 0; i < blocking_cols.length; i++){ 
    5970                        List<Object> query_values = getDemographicValues(blocking_cols[i]); 
    60                         Iterator<Object> it = query_values.iterator(); 
    61                         List<Object> values = new ArrayList<Object>(); 
    62                         while(it.hasNext()){ 
    63                                 Object obj = it.next(); 
    64                                 values.add(obj); 
    65                         } 
    66                         blocking_values.add(values); 
    67                         values_iterators.add(values.iterator()); 
     71                        if(query_values == null){ 
     72                                log.warn("unable to get blocking values for " + blocking_cols[i]); 
     73                                 
     74                        } else { 
     75                                Iterator<Object> it = query_values.iterator(); 
     76                                List<Object> values = new ArrayList<Object>(); 
     77                                while(it.hasNext()){ 
     78                                        Object obj = it.next(); 
     79                                        values.add(obj); 
     80                                } 
     81                                blocking_values.add(values); 
     82                                values_iterators.add(values.iterator()); 
     83                        } 
     84                         
    6885                } 
    6986                 
     
    124141                        Integer id = value_set.remove(0); 
    125142                        Patient p = Context.getPatientService().getPatient(id); 
    126                          
    127143                        if(value_set.size() == 0){ 
    128144                                // removed last ID at this point in blocking values, need to increment iterators and refill 
     
    132148                                } 
    133149                        } 
     150                         
    134151                        return PatientMatchingActivator.patientToRecord(p); 
    135152                } 
     
    170187                        } 
    171188                         
    172                         query_text = "SELECT DISTINCT o." + field + " FROM " + object_name + " o"; 
     189                        query_text = "SELECT DISTINCT o." + field + " FROM " + object_name + " o where o." + field + " IS NOT NULL"; 
    173190                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
    174191                        ret = q.list(); 
     
    182199                                        // something like  
    183200                                        // select distinct value from person_attribute where person_attribute_type_id = <id> 
    184                                         int id = pat.getPersonAttributeTypeId(); 
    185                                         query_text = "SELECT DISTINCT p.value FROM PersonAttribute p WHERE p.attributeID = " + id; 
     201                                        query_text = "SELECT DISTINCT p.value FROM PersonAttribute p WHERE p.attributeType = :type AND p.value IS NOT NULL"; 
    186202                                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
     203                                        q.setParameter("type", pat); 
    187204                                        ret = q.list(); 
    188205                                } 
     
    193210                                if(pit != null){ 
    194211                                        // HQL query to get all values 
    195                                         int id = pit.getPatientIdentifierTypeId(); 
    196                                         query_text = "SELECT DISTINCT p.value FROM PatientIdentifier p WHERE p.typeID = " + id; 
     212                                        query_text = "SELECT DISTINCT p.identifier FROM PatientIdentifier p WHERE p.identifierType = :type AND p.identifier IS NOT NULL"; 
    197213                                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
     214                                        q.setParameter("type", pit); 
    198215                                        ret = q.list(); 
    199216                                } 
     
    208225                // method strips the first  
    209226                if(type_name.indexOf(ATTRIBUTE_PREFIX) != -1){ 
    210                         return type_name.replaceFirst(ATTRIBUTE_PREFIX,""); 
     227                        return type_name.substring(ATTRIBUTE_PREFIX.length()); 
    211228                } else if(type_name.indexOf(IDENT_PREFIX) != -1){ 
    212                         return type_name.replaceFirst(IDENT_PREFIX, ""); 
     229                        return type_name.substring(IDENT_PREFIX.length()); 
    213230                } 
    214231                return type_name; 
     
    236253                        } 
    237254                         
    238                         query_text = "SELECT o.personID FROM " + object_name + " o WHERE " + field + " =:value"; 
     255                        query_text = "SELECT o FROM " + object_name + " o WHERE " + field + " =:value"; 
    239256                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
    240                         q.setEntity("value", value); 
    241                         ret = new ArrayList<Integer>(); 
    242                         ret.addAll(q.list()); 
     257                        q.setParameter("value", value); 
     258                        ret = getIDs(q.list()); 
     259                         
    243260                } else { 
    244261                        if(demographic.indexOf(ATTRIBUTE_PREFIX) != -1){ 
     
    251268                                        // select distinct value from person_attribute where person_attribute_type_id = <id> 
    252269                                        int id = pat.getPersonAttributeTypeId(); 
    253                                         query_text = "SELECT DISTINCT p.personID FROM PersonAttribute p WHERE p.value = :value"; 
     270                                        query_text = "SELECT DISTINCT p FROM PersonAttribute p WHERE p.value = :value"; 
    254271                                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
    255                                         q.setEntity("value", value); 
    256                                         ret = new ArrayList<Integer>(); 
    257                                         ret.addAll(q.list()); 
     272                                        q.setParameter("value", value); 
     273                                        ret = getIDs(q.list()); 
    258274                                } 
    259275                        } else if(demographic.indexOf(IDENT_PREFIX) != -1){ 
     
    264280                                        // HQL query to get all values 
    265281                                        int id = pit.getPatientIdentifierTypeId(); 
    266                                         query_text = "SELECT DISTINCT p.personID FROM PatientIdentifier p WHERE p.value = :value"; 
     282                                        query_text = "SELECT DISTINCT p FROM PatientIdentifier p WHERE p.identifier = :value"; 
    267283                                        Query q = sessionFactory.getCurrentSession().createQuery(query_text); 
    268                                         q.setEntity("value", value); 
    269                                         ret = new ArrayList<Integer>(); 
    270                                         ret.addAll(q.list()); 
     284                                        q.setParameter("value", value); 
     285                                        ret = getIDs(q.list()); 
    271286                                } 
    272287                        } 
     
    277292        } 
    278293         
     294        /* 
     295         * Method checks for a method that returns the person ID, patient, or person 
     296         * of the object returned from a query and inserts the IDs into a list 
     297         */ 
     298        private List<Integer> getIDs(List<Object> openmrs_objects){ 
     299                List<Integer> ret = new ArrayList<Integer>(); 
     300                Iterator<Object> it = openmrs_objects.iterator(); 
     301                try{ 
     302                        while(it.hasNext()){ 
     303                                Object o = it.next(); 
     304                                 
     305                                Class cls = o.getClass(); 
     306                                Method[] methods = cls.getMethods(); 
     307                                for(int i = 0; i < methods.length; i++){ 
     308                                        Method m = methods[i]; 
     309                                        if(m.getName().equals(GET_ID_METHOD)){ 
     310                                                Integer id = (Integer)m.invoke(o, (Object[])null); 
     311                                                ret.add(id); 
     312                                                i = methods.length; 
     313                                        } else if(m.getName().equals(GET_PERSON_METHOD)){ 
     314                                                Person p = (Person)m.invoke(o, (Object[])null); 
     315                                                ret.add(p.getPersonId()); 
     316                                                i = methods.length; 
     317                                        } else if(m.getName().equals(GET_PATIENT_METHOD)){ 
     318                                                Patient p = (Patient)m.invoke(o, (Object[])null); 
     319                                                ret.add(p.getPatientId()); 
     320                                                i = methods.length; 
     321                                        } 
     322                                } 
     323                        } 
     324                } 
     325                catch(IllegalAccessException iae){ 
     326                        log.warn("exception reading OpenMRS DB:  " + iae.getMessage()); 
     327                } 
     328                catch(InvocationTargetException ite){ 
     329                        log.warn("exception reading OpenMRS DB:  " + ite.getMessage()); 
     330                } 
     331                 
     332                return ret; 
     333        } 
    279334}