forked from openmrs/openmrs-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
HibernatePersonDAO.java
802 lines (698 loc) · 30.8 KB
/
HibernatePersonDAO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.api.db.hibernate;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.type.StringType;
import org.openmrs.Person;
import org.openmrs.PersonAddress;
import org.openmrs.PersonAttribute;
import org.openmrs.PersonAttributeType;
import org.openmrs.PersonName;
import org.openmrs.Relationship;
import org.openmrs.RelationshipType;
import org.openmrs.api.context.Context;
import org.openmrs.api.db.DAOException;
import org.openmrs.api.db.PersonDAO;
import org.openmrs.api.db.hibernate.search.LuceneQuery;
import org.openmrs.collection.ListPart;
import org.openmrs.person.PersonMergeLog;
import org.openmrs.util.OpenmrsConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Hibernate specific Person database methods. <br>
* <br>
* This class should not be used directly. All database calls should go through the Service layer. <br>
* <br>
* Proper use: <code>
* PersonService ps = Context.getPersonService();
* ps.getPeople("name", false);
* </code>
*
* @see org.openmrs.api.db.PersonDAO
* @see org.openmrs.api.PersonService
* @see org.openmrs.api.context.Context
*/
public class HibernatePersonDAO implements PersonDAO {
private static final Logger log = LoggerFactory.getLogger(HibernatePersonDAO.class);
/**
* Hibernate session factory
*/
private SessionFactory sessionFactory;
/**
* Set session factory
*
* @param sessionFactory
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
private ListPart<Object[]> temp_OutSource_Operation(String name) {
PersonLuceneQuery personLuceneQuery = new PersonLuceneQuery(sessionFactory);
String query = LuceneQuery.escapeQuery(name);
int maxResults = HibernatePersonDAO.getMaximumSearchResults();
LuceneQuery<PersonName> luceneQuery = personLuceneQuery.getSoundexPersonNameQuery(query, 0, true, "M");;
//getSoundexPersonNameQuery(query,birthyear, false, gender);
LinkedHashSet<Person> lhs = new LinkedHashSet<>();
List<PersonName> persons = luceneQuery.list();
ListPart<Object[]> names2 = luceneQuery.listPartProjection(0, maxResults, "person.personId");
return names2;
}
/**
* @see org.openmrs.api.PersonService#getSimilarPeople(java.lang.String, java.lang.Integer,
* java.lang.String, java.lang.String)
* @see org.openmrs.api.db.PersonDAO#getSimilarPeople(String name, Integer birthyear, String
* gender)
*/
@Override
@SuppressWarnings("unchecked")
public Set<Person> getSimilarPeople(String name, Integer birthyear, String gender) throws DAOException {
if (birthyear == null) {
birthyear = 0;
}
name = name.replaceAll(" ", " ");
name = name.replace(", ", " ");
String[] names = name.split(" ");
StringBuilder q = new StringBuilder(
"select p from Person p left join p.names as pname where p.personVoided = false and pname.voided = false and ");
if (names.length == 1) {
temp_OutSource_Operation(name);
//q.append("(").append(" soundex(pname.givenName) = soundex(:n1)").append(
// " or soundex(pname.middleName) = soundex(:n1)").append(" or soundex(pname.familyName) = soundex(:n1) ")
// .append(" or soundex(pname.familyName2) = soundex(:n1) ").append(")");
} else if (names.length == 2) {
q.append("(").append(" case").append(" when pname.givenName is null then 1").append(
" when pname.givenName = '' then 1").append(" when soundex(pname.givenName) = soundex(:n1) then 4")
.append(" when soundex(pname.givenName) = soundex(:n2) then 3").append(" else 0 ").append(" end")
.append(" + ").append(" case").append(" when pname.middleName is null then 1").append(
" when pname.middleName = '' then 1").append(
" when soundex(pname.middleName) = soundex(:n1) then 3").append(
" when soundex(pname.middleName) = soundex(:n2) then 4").append(" else 0 ").append(" end").append(
" + ").append(" case").append(" when pname.familyName is null then 1").append(
" when pname.familyName = '' then 1").append(
" when soundex(pname.familyName) = soundex(:n1) then 3").append(
" when soundex(pname.familyName) = soundex(:n2) then 4").append(" else 0 ").append(" end").append(
" +").append(" case").append(" when pname.familyName2 is null then 1").append(
" when pname.familyName2 = '' then 1").append(
" when soundex(pname.familyName2) = soundex(:n1) then 3").append(
" when soundex(pname.familyName2) = soundex(:n2) then 4").append(" else 0 ").append(" end")
.append(") > 6");
} else if (names.length == 3) {
q.append("(").append(" case").append(" when pname.givenName is null then 0").append(
" when soundex(pname.givenName) = soundex(:n1) then 3").append(
" when soundex(pname.givenName) = soundex(:n2) then 2").append(
" when soundex(pname.givenName) = soundex(:n3) then 1").append(" else 0 ").append(" end").append(" + ")
.append(" case").append(" when pname.middleName is null then 0").append(
" when soundex(pname.middleName) = soundex(:n1) then 2").append(
" when soundex(pname.middleName) = soundex(:n2) then 3").append(
" when soundex(pname.middleName) = soundex(:n3) then 1").append(" else 0").append(" end").append(
" + ").append(" case").append(" when pname.familyName is null then 0").append(
" when soundex(pname.familyName) = soundex(:n1) then 1").append(
" when soundex(pname.familyName) = soundex(:n2) then 2").append(
" when soundex(pname.familyName) = soundex(:n3) then 3").append(" else 0").append(" end").append(
" +").append(" case").append(" when pname.familyName2 is null then 0").append(
" when soundex(pname.familyName2) = soundex(:n1) then 1").append(
" when soundex(pname.familyName2) = soundex(:n2) then 2").append(
" when soundex(pname.familyName2) = soundex(:n3) then 3").append(" else 0").append(" end").append(
") >= 5");
} else {
// This is simply an alternative method of name matching which scales better
// for large names, although it is hard to imagine getting names with more than
// six or so tokens. This can be easily updated to attain more desirable
// results; it is just a working alternative to throwing an exception.
q.append("(").append(" case").append(" when pname.givenName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.givenName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.middleName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.middleName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.familyName is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.familyName) = soundex(:n").append(i + 1).append(") then 1");
}
q.append(" else 0").append(" end").append(")").append("+").append("(").append(" case").append(
" when pname.familyName2 is null then 0");
for (int i = 0; i < names.length; i++) {
q.append(" when soundex(pname.familyName2) = soundex(:n").append(i + 1).append(") then 1");
}
// if most of the names have at least a hit somewhere
q.append(" else 0").append(" end").append(") >= ").append((int) (names.length * .75));
}
String birthdayMatch = " (year(p.birthdate) between " + (birthyear - 1) + " and " + (birthyear + 1)
+ " or p.birthdate is null) ";
String genderMatch = " (p.gender = :gender or p.gender = '') ";
if (birthyear != 0 && gender != null) {
q.append(" and (").append(birthdayMatch).append("and ").append(genderMatch).append(") ");
} else if (birthyear != 0) {
q.append(" and ").append(birthdayMatch);
} else if (gender != null) {
q.append(" and ").append(genderMatch);
}
q.append(" order by pname.givenName asc,").append(" pname.middleName asc,").append(" pname.familyName asc,").append(
" pname.familyName2 asc");
String qStr = q.toString();
Query query = sessionFactory.getCurrentSession().createQuery(qStr);
for (int nameIndex = 0; nameIndex < names.length; nameIndex++) {
query.setString("n" + (nameIndex + 1), names[nameIndex]);
}
if (qStr.contains(":gender")) {
query.setString("gender", gender);
}
return new LinkedHashSet<Person>(query.list());
}
/**
* @see org.openmrs.api.db.PersonDAO#getPeople(java.lang.String, java.lang.Boolean)
* @should get no one by null
* @should get every one by empty string
* @should get no one by non-existing attribute
* @should get no one by non-searchable attribute
* @should get no one by voided attribute
* @should get one person by attribute
* @should get one person by random case attribute
* @should get one person by searching for a mix of attribute and voided attribute
* @should get multiple people by single attribute
* @should get multiple people by multiple attributes
* @should get no one by non-existing name
* @should get one person by name
* @should get one person by random case name
* @should get multiple people by single name
* @should get multiple people by multiple names
* @should get no one by non-existing name and non-existing attribute
* @should get no one by non-existing name and non-searchable attribute
* @should get no one by non-existing name and voided attribute
* @should get one person by name and attribute
* @should get one person by name and voided attribute
* @should get multiple people by name and attribute
* @should get one person by given name
* @should get multiple people by given name
* @should get one person by middle name
* @should get multiple people by middle name
* @should get one person by family name
* @should get multiple people by family name
* @should get one person by family name2
* @should get multiple people by family name2
* @should get one person by multiple name parts
* @should get multiple people by multiple name parts
* @should get no one by voided name
* @should not get voided person
* @should not get dead person
* @should get single dead person
* @should get multiple dead people
*/
@Override
@SuppressWarnings("unchecked")
public List<Person> getPeople(String searchString, Boolean dead, Boolean voided) {
if (searchString == null) {
return new ArrayList<>();
}
int maxResults = HibernatePersonDAO.getMaximumSearchResults();
boolean includeVoided = (voided != null) ? voided : false;
if (StringUtils.isBlank(searchString)) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Person.class);
if (dead != null) {
criteria.add(Restrictions.eq("dead", dead));
}
if (!includeVoided) {
criteria.add(Restrictions.eq("personVoided", false));
}
criteria.setMaxResults(maxResults);
return criteria.list();
}
String query = LuceneQuery.escapeQuery(searchString);
PersonLuceneQuery personLuceneQuery = new PersonLuceneQuery(sessionFactory);
LuceneQuery<PersonName> nameQuery = personLuceneQuery.getPersonNameQueryWithOrParser(query, includeVoided);
if (dead != null) {
nameQuery.include("person.dead", dead);
}
List<Person> people = new ArrayList<>();
ListPart<Object[]> names = nameQuery.listPartProjection(0, maxResults, "person.personId");
names.getList().forEach(name -> people.add(getPerson((Integer) name[0])));
LuceneQuery<PersonAttribute> attributeQuery = personLuceneQuery.getPersonAttributeQueryWithOrParser(query, includeVoided, nameQuery);
ListPart<Object[]> attributes = attributeQuery.listPartProjection(0, maxResults, "person.personId");
attributes.getList().forEach(attribute -> people.add(getPerson((Integer) attribute[0])));
return people;
}
@Override
public List<Person> getPeople(String searchString, Boolean dead) {
return getPeople(searchString, dead, null);
}
/**
* Fetch the max results value from the global properties table
*
* @return Integer value for the person search max results global property
*/
public static Integer getMaximumSearchResults() {
try {
return Integer.valueOf(Context.getAdministrationService().getGlobalProperty(
OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS,
String.valueOf(OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE)));
}
catch (Exception e) {
log.warn("Unable to convert the global property " + OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS
+ "to a valid integer. Returning the default "
+ OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE);
}
return OpenmrsConstants.GLOBAL_PROPERTY_PERSON_SEARCH_MAX_RESULTS_DEFAULT_VALUE;
}
/**
* @see org.openmrs.api.PersonService#getPerson(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPerson(java.lang.Integer)
*/
@Override
public Person getPerson(Integer personId) {
return (Person) sessionFactory.getCurrentSession().get(Person.class, personId);
}
/**
* @see org.openmrs.api.PersonService#deletePersonAttributeType(org.openmrs.PersonAttributeType)
* @see org.openmrs.api.db.PersonDAO#deletePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public void deletePersonAttributeType(PersonAttributeType type) {
sessionFactory.getCurrentSession().delete(type);
}
/**
* @see org.openmrs.api.PersonService#savePersonAttributeType(org.openmrs.PersonAttributeType)
* @see org.openmrs.api.db.PersonDAO#savePersonAttributeType(org.openmrs.PersonAttributeType)
*/
@Override
public PersonAttributeType savePersonAttributeType(PersonAttributeType type) {
sessionFactory.getCurrentSession().saveOrUpdate(type);
return type;
}
/**
* @see org.openmrs.api.PersonService#getPersonAttributeType(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeType(java.lang.Integer)
*/
@Override
public PersonAttributeType getPersonAttributeType(Integer typeId) {
return (PersonAttributeType) sessionFactory.getCurrentSession().get(PersonAttributeType.class, typeId);
}
/**
* @see org.openmrs.api.PersonService#getPersonAttribute(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getPersonAttribute(java.lang.Integer)
*/
@Override
public PersonAttribute getPersonAttribute(Integer id) {
return (PersonAttribute) sessionFactory.getCurrentSession().get(PersonAttribute.class, id);
}
/**
* @see org.openmrs.api.PersonService#getAllPersonAttributeTypes(boolean)
* @see org.openmrs.api.db.PersonDAO#getAllPersonAttributeTypes(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonAttributeType> getAllPersonAttributeTypes(boolean includeRetired) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(PersonAttributeType.class, "r");
if (!includeRetired) {
criteria.add(Restrictions.eq("retired", false));
}
criteria.addOrder(Order.asc("sortWeight"));
return criteria.list();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeTypes(java.lang.String, java.lang.String,
* java.lang.Integer, java.lang.Boolean)
*/
@Override
// TODO - PersonServiceTest fails here
@SuppressWarnings("unchecked")
public List<PersonAttributeType> getPersonAttributeTypes(String exactName, String format, Integer foreignKey,
Boolean searchable) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(PersonAttributeType.class, "r");
if (exactName != null) {
criteria.add(Restrictions.eq("name", exactName));
}
if (format != null) {
criteria.add(Restrictions.eq("format", format));
}
if (foreignKey != null) {
criteria.add(Restrictions.eq("foreignKey", foreignKey));
}
if (searchable != null) {
criteria.add(Restrictions.eq("searchable", searchable));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationship(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getRelationship(java.lang.Integer)
*/
@Override
public Relationship getRelationship(Integer relationshipId) throws DAOException {
return (Relationship) sessionFactory.getCurrentSession()
.get(Relationship.class, relationshipId);
}
/**
* @see org.openmrs.api.PersonService#getAllRelationships(boolean)
* @see org.openmrs.api.db.PersonDAO#getAllRelationships(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getAllRelationships(boolean includeVoided) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (!includeVoided) {
criteria.add(Restrictions.eq("voided", false));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (fromPerson != null) {
criteria.add(Restrictions.eq("personA", fromPerson));
}
if (toPerson != null) {
criteria.add(Restrictions.eq("personB", toPerson));
}
if (relType != null) {
criteria.add(Restrictions.eq("relationshipType", relType));
}
criteria.add(Restrictions.eq("voided", false));
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date, java.util.Date)
* @see org.openmrs.api.db.PersonDAO#getRelationships(org.openmrs.Person, org.openmrs.Person,
* org.openmrs.RelationshipType, java.util.Date, java.util.Date)
*/
@Override
@SuppressWarnings("unchecked")
public List<Relationship> getRelationships(Person fromPerson, Person toPerson, RelationshipType relType,
Date startEffectiveDate, Date endEffectiveDate) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Relationship.class, "r");
if (fromPerson != null) {
criteria.add(Restrictions.eq("personA", fromPerson));
}
if (toPerson != null) {
criteria.add(Restrictions.eq("personB", toPerson));
}
if (relType != null) {
criteria.add(Restrictions.eq("relationshipType", relType));
}
if (startEffectiveDate != null) {
criteria.add(Restrictions.disjunction().add(
Restrictions.and(Restrictions.le("startDate", startEffectiveDate), Restrictions.ge("endDate",
startEffectiveDate))).add(
Restrictions.and(Restrictions.le("startDate", startEffectiveDate), Restrictions.isNull("endDate"))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.ge("endDate", startEffectiveDate))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.isNull("endDate"))));
}
if (endEffectiveDate != null) {
criteria.add(Restrictions.disjunction().add(
Restrictions.and(Restrictions.le("startDate", endEffectiveDate), Restrictions
.ge("endDate", endEffectiveDate))).add(
Restrictions.and(Restrictions.le("startDate", endEffectiveDate), Restrictions.isNull("endDate"))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.ge("endDate", endEffectiveDate))).add(
Restrictions.and(Restrictions.isNull("startDate"), Restrictions.isNull("endDate"))));
}
criteria.add(Restrictions.eq("voided", false));
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#getRelationshipType(java.lang.Integer)
* @see org.openmrs.api.db.PersonDAO#getRelationshipType(java.lang.Integer)
*/
@Override
public RelationshipType getRelationshipType(Integer relationshipTypeId) throws DAOException {
return (RelationshipType) sessionFactory.getCurrentSession().get(
RelationshipType.class, relationshipTypeId);
}
/**
* @see org.openmrs.api.PersonService#getRelationshipTypes(java.lang.String, java.lang.Boolean)
* @see org.openmrs.api.db.PersonDAO#getRelationshipTypes(java.lang.String, java.lang.Boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<RelationshipType> getRelationshipTypes(String relationshipTypeName, Boolean preferred) throws DAOException {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(RelationshipType.class);
criteria.add(Restrictions.sqlRestriction("CONCAT(a_Is_To_B, CONCAT('/', b_Is_To_A)) like (?)", relationshipTypeName,
new StringType()));
if (preferred != null) {
criteria.add(Restrictions.eq("preferred", preferred));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#saveRelationshipType(org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#saveRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public RelationshipType saveRelationshipType(RelationshipType relationshipType) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(relationshipType);
return relationshipType;
}
/**
* @see org.openmrs.api.PersonService#deleteRelationshipType(org.openmrs.RelationshipType)
* @see org.openmrs.api.db.PersonDAO#deleteRelationshipType(org.openmrs.RelationshipType)
*/
@Override
public void deleteRelationshipType(RelationshipType relationshipType) throws DAOException {
sessionFactory.getCurrentSession().delete(relationshipType);
}
/**
* @see org.openmrs.api.PersonService#purgePerson(org.openmrs.Person)
* @see org.openmrs.api.db.PersonDAO#deletePerson(org.openmrs.Person)
*/
@Override
public void deletePerson(Person person) throws DAOException {
HibernatePersonDAO.deletePersonAndAttributes(sessionFactory, person);
}
/**
* @see org.openmrs.api.PersonService#savePerson(org.openmrs.Person)
* @see org.openmrs.api.db.PersonDAO#savePerson(org.openmrs.Person)
*/
@Override
public Person savePerson(Person person) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(person);
return person;
}
/**
* @see org.openmrs.api.PersonService#saveRelationship(org.openmrs.Relationship)
* @see org.openmrs.api.db.PersonDAO#saveRelationship(org.openmrs.Relationship)
*/
@Override
public Relationship saveRelationship(Relationship relationship) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(relationship);
return relationship;
}
/**
* @see org.openmrs.api.PersonService#purgeRelationship(org.openmrs.Relationship)
* @see org.openmrs.api.db.PersonDAO#deleteRelationship(org.openmrs.Relationship)
*/
@Override
public void deleteRelationship(Relationship relationship) throws DAOException {
sessionFactory.getCurrentSession().delete(relationship);
}
/**
* Used by deletePerson, deletePatient, and deleteUser to remove all properties of a person
* before deleting them.
*
* @param sessionFactory the session factory from which to pull the current session
* @param person the person to delete
*/
public static void deletePersonAndAttributes(SessionFactory sessionFactory, Person person) {
// delete properties and fields so hibernate can't complain
for (PersonAddress address : person.getAddresses()) {
if (address.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(address);
} else {
sessionFactory.getCurrentSession().delete(address);
}
}
person.setAddresses(null);
for (PersonAttribute attribute : person.getAttributes()) {
if (attribute.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(attribute);
} else {
sessionFactory.getCurrentSession().delete(attribute);
}
}
person.setAttributes(null);
for (PersonName name : person.getNames()) {
if (name.getDateCreated() == null) {
sessionFactory.getCurrentSession().evict(name);
} else {
sessionFactory.getCurrentSession().delete(name);
}
}
person.setNames(null);
// finally, just tell hibernate to delete our object
sessionFactory.getCurrentSession().delete(person);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonAttributeTypeByUuid(java.lang.String)
*/
@Override
public PersonAttributeType getPersonAttributeTypeByUuid(String uuid) {
return (PersonAttributeType) sessionFactory.getCurrentSession().createQuery(
"from PersonAttributeType pat where pat.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getSavedPersonAttributeTypeName(org.openmrs.PersonAttributeType)
*/
@Override
public String getSavedPersonAttributeTypeName(PersonAttributeType personAttributeType) {
SQLQuery sql = sessionFactory.getCurrentSession().createSQLQuery(
"select name from person_attribute_type where person_attribute_type_id = :personAttributeTypeId");
sql.setInteger("personAttributeTypeId", personAttributeType.getId());
return (String) sql.uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonByUuid(java.lang.String)
*/
@Override
public Person getPersonByUuid(String uuid) {
return (Person) sessionFactory.getCurrentSession().createQuery("from Person p where p.uuid = :uuid").setString(
"uuid", uuid).uniqueResult();
}
@Override
public PersonAddress getPersonAddressByUuid(String uuid) {
return (PersonAddress) sessionFactory.getCurrentSession().createQuery("from PersonAddress p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#savePersonMergeLog(PersonMergeLog)
*/
@Override
public PersonMergeLog savePersonMergeLog(PersonMergeLog personMergeLog) throws DAOException {
sessionFactory.getCurrentSession().saveOrUpdate(personMergeLog);
return personMergeLog;
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonMergeLog(java.lang.Integer)
*/
@Override
public PersonMergeLog getPersonMergeLog(Integer id) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().get(PersonMergeLog.class, id);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonMergeLogByUuid(String)
*/
@Override
public PersonMergeLog getPersonMergeLogByUuid(String uuid) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().createQuery("from PersonMergeLog p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getWinningPersonMergeLogs(org.openmrs.Person)
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonMergeLog> getWinningPersonMergeLogs(Person person) throws DAOException {
return (List<PersonMergeLog>) sessionFactory.getCurrentSession().createQuery(
"from PersonMergeLog p where p.winner.id = :winnerId").setInteger("winnerId", person.getId()).list();
}
/**
* @see org.openmrs.api.db.PersonDAO#getLosingPersonMergeLogs(org.openmrs.Person)
*/
@Override
public PersonMergeLog getLosingPersonMergeLogs(Person person) throws DAOException {
return (PersonMergeLog) sessionFactory.getCurrentSession().createQuery(
"from PersonMergeLog p where p.loser.id = :loserId").setInteger("loserId", person.getId()).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getAllPersonMergeLogs()
*/
@Override
@SuppressWarnings("unchecked")
public List<PersonMergeLog> getAllPersonMergeLogs() throws DAOException {
return (List<PersonMergeLog>) sessionFactory.getCurrentSession().createQuery("from PersonMergeLog p").list();
}
@Override
public PersonAttribute getPersonAttributeByUuid(String uuid) {
return (PersonAttribute) sessionFactory.getCurrentSession().createQuery(
"from PersonAttribute p where p.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonName(Integer)
*/
@Override
public PersonName getPersonName(Integer personNameId) {
return (PersonName) sessionFactory.getCurrentSession().get(PersonName.class, personNameId);
}
/**
* @see org.openmrs.api.db.PersonDAO#getPersonNameByUuid(String)
*/
@Override
public PersonName getPersonNameByUuid(String uuid) {
return (PersonName) sessionFactory.getCurrentSession().createQuery("from PersonName p where p.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getRelationshipByUuid(java.lang.String)
*/
@Override
public Relationship getRelationshipByUuid(String uuid) {
return (Relationship) sessionFactory.getCurrentSession().createQuery("from Relationship r where r.uuid = :uuid")
.setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getRelationshipTypeByUuid(java.lang.String)
*/
@Override
public RelationshipType getRelationshipTypeByUuid(String uuid) {
return (RelationshipType) sessionFactory.getCurrentSession().createQuery(
"from RelationshipType rt where rt.uuid = :uuid").setString("uuid", uuid).uniqueResult();
}
/**
* @see org.openmrs.api.db.PersonDAO#getAllRelationshipTypes(boolean)
*/
@Override
@SuppressWarnings("unchecked")
public List<RelationshipType> getAllRelationshipTypes(boolean includeRetired) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(RelationshipType.class);
criteria.addOrder(Order.asc("weight"));
if (!includeRetired) {
criteria.add(Restrictions.eq("retired", false));
}
return criteria.list();
}
/**
* @see org.openmrs.api.PersonService#savePersonName(org.openmrs.PersonName)
* @see org.openmrs.api.db.PersonDAO#savePersonName(org.openmrs.PersonName)
*/
@Override
public PersonName savePersonName(PersonName personName) {
sessionFactory.getCurrentSession().saveOrUpdate(personName);
return personName;
}
/**
* @see org.openmrs.api.PersonService#savePersonAddress(org.openmrs.PersonAddress)
* @see org.openmrs.api.db.PersonDAO#savePersonAddress(org.openmrs.PersonAddress)
*/
@Override
public PersonAddress savePersonAddress(PersonAddress personAddress) {
sessionFactory.getCurrentSession().saveOrUpdate(personAddress);
return personAddress;
}
}