2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
9 package eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.agent
;
11 import java
.util
.ArrayList
;
12 import java
.util
.HashSet
;
13 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import org
.apache
.logging
.log4j
.LogManager
;
18 import org
.apache
.logging
.log4j
.Logger
;
19 import org
.hibernate
.Criteria
;
20 import org
.hibernate
.Session
;
21 import org
.hibernate
.criterion
.Criterion
;
22 import org
.hibernate
.criterion
.Restrictions
;
23 import org
.hibernate
.envers
.query
.AuditEntity
;
24 import org
.hibernate
.envers
.query
.AuditQuery
;
25 import org
.hibernate
.query
.Query
;
26 import org
.springframework
.stereotype
.Repository
;
28 import eu
.etaxonomy
.cdm
.model
.agent
.Address
;
29 import eu
.etaxonomy
.cdm
.model
.agent
.AgentBase
;
30 import eu
.etaxonomy
.cdm
.model
.agent
.Institution
;
31 import eu
.etaxonomy
.cdm
.model
.agent
.InstitutionalMembership
;
32 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
33 import eu
.etaxonomy
.cdm
.model
.agent
.Team
;
34 import eu
.etaxonomy
.cdm
.model
.view
.AuditEvent
;
35 import eu
.etaxonomy
.cdm
.persistence
.dao
.agent
.IAgentDao
;
36 import eu
.etaxonomy
.cdm
.persistence
.dao
.hibernate
.common
.IdentifiableDaoBase
;
37 import eu
.etaxonomy
.cdm
.persistence
.dto
.TeamOrPersonUuidAndTitleCache
;
38 import eu
.etaxonomy
.cdm
.persistence
.dto
.UuidAndTitleCache
;
39 import eu
.etaxonomy
.cdm
.persistence
.query
.MatchMode
;
40 import eu
.etaxonomy
.cdm
.persistence
.query
.OrderHint
;
43 public class AgentDaoImpl
extends IdentifiableDaoBase
<AgentBase
> implements IAgentDao
{
45 @SuppressWarnings("unused")
46 private static final Logger logger
= LogManager
.getLogger();
48 public AgentDaoImpl() {
49 super(AgentBase
.class);
50 indexedClasses
= new Class
[3];
51 indexedClasses
[0] = Institution
.class;
52 indexedClasses
[1] = Person
.class;
53 indexedClasses
[2] = Team
.class;
57 public List
<Institution
> getInstitutionByCode(String code
) {
58 AuditEvent auditEvent
= getAuditEventFromContext();
59 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
60 Criteria crit
= getSession().createCriteria(Institution
.class);
61 crit
.add(Restrictions
.eq("code", code
));
62 @SuppressWarnings("unchecked")
63 List
<Institution
> result
= crit
.list();
66 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(Institution
.class,auditEvent
.getRevisionNumber());
67 query
.add(AuditEntity
.property("code").eq(code
));
68 @SuppressWarnings("unchecked")
69 List
<Institution
> result
= query
.getResultList();
75 public long countInstitutionalMemberships(Person person
) {
76 AuditEvent auditEvent
= getAuditEventFromContext();
77 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
78 Query
<Long
> query
= getSession().createQuery("select count(institutionalMembership) from InstitutionalMembership institutionalMembership where institutionalMembership.person = :person", Long
.class);
79 query
.setParameter("person", person
);
80 return query
.uniqueResult();
82 AuditQuery query
= makeAuditQuery(InstitutionalMembership
.class, auditEvent
);
83 query
.add(AuditEntity
.relatedId("person").eq(person
.getId()));
84 query
.addProjection(AuditEntity
.id());
85 return (Long
)query
.getSingleResult();
90 public long countMembers(Team team
) {
91 checkNotInPriorView("AgentDaoImpl.countMembers(Team team)");
92 Query
<Long
> query
= getSession().createQuery("select count(teamMember) from Team team join team.teamMembers teamMember where team = :team", Long
.class);
93 query
.setParameter("team", team
);
94 return query
.uniqueResult();
98 public List
<InstitutionalMembership
> getInstitutionalMemberships(Person person
, Integer pageSize
, Integer pageNumber
) {
99 AuditEvent auditEvent
= getAuditEventFromContext();
100 if(auditEvent
.equals(AuditEvent
.CURRENT_VIEW
)) {
101 Query
<InstitutionalMembership
> query
= getSession().createQuery("select institutionalMembership from InstitutionalMembership institutionalMembership left join fetch institutionalMembership.institute where institutionalMembership.person = :person", InstitutionalMembership
.class);
102 query
.setParameter("person", person
);
103 addPageSizeAndNumber(query
, pageSize
, pageNumber
);
106 AuditQuery query
= getAuditReader().createQuery().forEntitiesAtRevision(InstitutionalMembership
.class,auditEvent
.getRevisionNumber());
107 query
.add(AuditEntity
.relatedId("person").eq(person
.getId()));
108 addPageSizeAndNumber(query
, pageSize
, pageNumber
);
109 return query
.getResultList();
114 public List
<Person
> getMembers(Team team
, Integer pageSize
, Integer pageNumber
) {
115 checkNotInPriorView("AgentDaoImpl.getMembers(Team team, Integer pageSize, Integer pageNumber)");
116 Query
<Person
> query
= getSession().createQuery("select teamMember from Team team join team.teamMembers teamMember where team = :team order by sortindex", Person
.class);
117 query
.setParameter("team", team
);
118 //query.addOrder( Order.asc("sortindex") );
119 addPageSizeAndNumber(query
, pageSize
, pageNumber
);
120 List
<Person
> result
= query
.list();
125 public long countAddresses(AgentBase agent
) {
126 checkNotInPriorView("AgentDaoImpl.countAddresses(AgentBase agent)");
127 Query
<Long
> query
= getSession().createQuery("select count(address) from AgentBase agent join agent.contact.addresses address where agent = :agent", Long
.class);
128 query
.setParameter("agent", agent
);
129 return query
.uniqueResult();
133 public List
<Address
> getAddresses(AgentBase agent
, Integer pageSize
,Integer pageNumber
) {
134 checkNotInPriorView("AgentDaoImpl.getAddresses(AgentBase agent, Integer pageSize,Integer pageNumber)");
135 Query
<Address
> query
= getSession().createQuery("select address from AgentBase agent join agent.contact.addresses address where agent = :agent", Address
.class);
136 query
.setParameter("agent", agent
);
137 addPageSizeAndNumber(query
, pageSize
, pageNumber
);
138 List
<Address
> result
= query
.list();
143 public List
<UuidAndTitleCache
<Team
>> getTeamUuidAndNomenclaturalTitle() {
144 List
<UuidAndTitleCache
<Team
>> list
= new ArrayList
<>();
145 Session session
= getSession();
147 Query
<Object
[]> query
= session
.createQuery("select uuid, id, nomenclaturalTitleCache from " + type
.getSimpleName() + " where dtype = 'Team'", Object
[].class);
149 List
<Object
[]> result
= query
.list();
151 for(Object
[] object
: result
){
152 list
.add(new UuidAndTitleCache
<>(Team
.class, (UUID
) object
[0], (Integer
)object
[1], (String
) object
[2]));
158 public <T
extends AgentBase
> List
<TeamOrPersonUuidAndTitleCache
<T
>> getUuidAndTitleCacheWithCollector(Class
<T
> clazz
, Integer limit
, String pattern
){
159 Session session
= getSession();
161 clazz
= (clazz
== null)?
(Class
)type
: clazz
;
162 String clazzString
= " FROM " + clazz
.getSimpleName();
164 Query
<Object
[]> query
= null;
166 if (pattern
!= null){
167 String whereClause
= " WHERE collectorTitleCache LIKE :pattern "
168 + " OR titleCache LIKE :pattern "
169 + " OR nomenclaturalTitleCache like :pattern ";
171 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
+ whereClause
, Object
[].class);
172 pattern
= pattern
+ "%";
173 pattern
= pattern
.replace("*", "%");
174 pattern
= pattern
.replace("?", "_");
175 query
.setParameter("pattern", pattern
);
177 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
, Object
[].class);
180 query
.setMaxResults(limit
);
183 return getTeamOrPersonUuidAndTitleCache(query
);
187 public <T
extends AgentBase
> List
<TeamOrPersonUuidAndTitleCache
<T
>> getTeamOrPersonUuidAndTitleCache(Class
<T
> clazz
, Integer limit
, String pattern
){
188 Session session
= getSession();
190 clazz
= (clazz
== null)?
(Class
)type
: clazz
;
191 String clazzString
= " FROM " + clazz
.getSimpleName();
193 Query
<Object
[]> query
= null;
195 if (pattern
!= null){
196 String whereClause
= " WHERE titleCache LIKE :pattern";
198 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
+ whereClause
, Object
[].class);
199 pattern
= pattern
+ "%";
200 pattern
= pattern
.replace("*", "%");
201 pattern
= pattern
.replace("?", "_");
202 query
.setParameter("pattern", pattern
);
204 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
, Object
[].class);
207 query
.setMaxResults(limit
);
210 return getTeamOrPersonUuidAndTitleCache(query
);
214 public <T
extends AgentBase
> List
<TeamOrPersonUuidAndTitleCache
<T
>> getUuidAndAbbrevTitleCache(Class
<T
> clazz
, Integer limit
, String pattern
){
215 Session session
= getSession();
217 clazz
= (clazz
== null)?
(Class
)type
: clazz
;
218 String clazzString
= " FROM " + clazz
.getSimpleName();
220 Query
<Object
[]> query
= null;
222 if (pattern
!= null){
223 String whereClause
= " WHERE nomenclaturalTitleCache LIKE :pattern";
224 if (pattern
.startsWith("*")){
225 whereClause
+= " OR titleCache LIKE :pattern";
226 whereClause
+= " OR collectorTitleCache LIKE :pattern";
229 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
+ whereClause
, Object
[].class);
230 pattern
= pattern
+ "%";
231 pattern
= pattern
.replace("*", "%");
232 pattern
= pattern
.replace("?", "_");
233 query
.setParameter("pattern", pattern
);
235 query
= session
.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString
, Object
[].class);
238 query
.setMaxResults(limit
);
241 return getTeamOrPersonUuidAndTitleCache(query
);
245 public <T
extends AgentBase
<?
>> List
<T
> findByTitleAndAbbrevTitle(Class
<T
> clazz
, String queryString
, MatchMode matchmode
, List
<Criterion
> criterion
, Integer pageSize
, Integer pageNumber
, List
<OrderHint
> orderHints
, List
<String
> propertyPaths
) {
246 Set
<String
> params
= new HashSet
<>();
247 params
.add("titleCache");
248 params
.add("nomenclaturalTitleCache");
249 params
.add("collectorTitleCache");
251 return findByParam(clazz
, params
, queryString
, matchmode
, criterion
, pageSize
, pageNumber
, orderHints
, propertyPaths
);
254 protected <T
extends AgentBase
> List
<TeamOrPersonUuidAndTitleCache
<T
>> getTeamOrPersonUuidAndTitleCache(Query
<Object
[]> query
){
255 List
<TeamOrPersonUuidAndTitleCache
<T
>> list
= new ArrayList
<>();
257 List
<Object
[]> result
= query
.list();
259 for(Object
[] object
: result
){
260 list
.add(new TeamOrPersonUuidAndTitleCache((UUID
) object
[0],(Integer
) object
[1], (String
) object
[3], (String
) object
[2], (String
) object
[4]));