Changeset 5182
- Timestamp:
- 08/06/08 15:00:21 (5 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
openmrs-modules/patientmatching/src/org/regenstrief/linkage/io/OrderedOpenMRSReader.java
r5157 r5182 1 1 package org.regenstrief.linkage.io; 2 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 3 5 import java.util.ArrayList; 4 6 import java.util.Iterator; 5 7 import java.util.List; 6 8 9 import org.apache.commons.logging.Log; 10 import org.apache.commons.logging.LogFactory; 7 11 import org.hibernate.Query; 8 12 import org.hibernate.SessionFactory; 9 13 import org.openmrs.Patient; 10 14 import org.openmrs.PatientIdentifierType; 15 import org.openmrs.Person; 11 16 import org.openmrs.PersonAttributeType; 12 17 import org.openmrs.api.context.Context; … … 41 46 42 47 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()); 45 56 private SessionFactory sessionFactory; 46 57 … … 58 69 for(int i = 0; i < blocking_cols.length; i++){ 59 70 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 68 85 } 69 86 … … 124 141 Integer id = value_set.remove(0); 125 142 Patient p = Context.getPatientService().getPatient(id); 126 127 143 if(value_set.size() == 0){ 128 144 // removed last ID at this point in blocking values, need to increment iterators and refill … … 132 148 } 133 149 } 150 134 151 return PatientMatchingActivator.patientToRecord(p); 135 152 } … … 170 187 } 171 188 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"; 173 190 Query q = sessionFactory.getCurrentSession().createQuery(query_text); 174 191 ret = q.list(); … … 182 199 // something like 183 200 // 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"; 186 202 Query q = sessionFactory.getCurrentSession().createQuery(query_text); 203 q.setParameter("type", pat); 187 204 ret = q.list(); 188 205 } … … 193 210 if(pit != null){ 194 211 // 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"; 197 213 Query q = sessionFactory.getCurrentSession().createQuery(query_text); 214 q.setParameter("type", pit); 198 215 ret = q.list(); 199 216 } … … 208 225 // method strips the first 209 226 if(type_name.indexOf(ATTRIBUTE_PREFIX) != -1){ 210 return type_name. replaceFirst(ATTRIBUTE_PREFIX,"");227 return type_name.substring(ATTRIBUTE_PREFIX.length()); 211 228 } else if(type_name.indexOf(IDENT_PREFIX) != -1){ 212 return type_name. replaceFirst(IDENT_PREFIX, "");229 return type_name.substring(IDENT_PREFIX.length()); 213 230 } 214 231 return type_name; … … 236 253 } 237 254 238 query_text = "SELECT o .personIDFROM " + object_name + " o WHERE " + field + " =:value";255 query_text = "SELECT o FROM " + object_name + " o WHERE " + field + " =:value"; 239 256 Query q = sessionFactory.getCurrentSession().createQuery(query_text); 240 q.set Entity("value", value);241 ret = new ArrayList<Integer>();242 ret.addAll(q.list());257 q.setParameter("value", value); 258 ret = getIDs(q.list()); 259 243 260 } else { 244 261 if(demographic.indexOf(ATTRIBUTE_PREFIX) != -1){ … … 251 268 // select distinct value from person_attribute where person_attribute_type_id = <id> 252 269 int id = pat.getPersonAttributeTypeId(); 253 query_text = "SELECT DISTINCT p .personIDFROM PersonAttribute p WHERE p.value = :value";270 query_text = "SELECT DISTINCT p FROM PersonAttribute p WHERE p.value = :value"; 254 271 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()); 258 274 } 259 275 } else if(demographic.indexOf(IDENT_PREFIX) != -1){ … … 264 280 // HQL query to get all values 265 281 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"; 267 283 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()); 271 286 } 272 287 } … … 277 292 } 278 293 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 } 279 334 }