Project

General

Profile

Download (11.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
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.
8
*/
9

    
10
package eu.etaxonomy.cdm.persistence.dao.hibernate.agent;
11

    
12
import java.util.ArrayList;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
import org.apache.log4j.Logger;
19
import org.hibernate.Criteria;
20
import org.hibernate.Query;
21
import org.hibernate.Session;
22
import org.hibernate.criterion.Criterion;
23
import org.hibernate.criterion.Restrictions;
24
import org.hibernate.envers.query.AuditEntity;
25
import org.hibernate.envers.query.AuditQuery;
26
import org.springframework.stereotype.Repository;
27

    
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;
41

    
42

    
43
@Repository
44
public class AgentDaoImpl extends IdentifiableDaoBase<AgentBase> implements IAgentDao{
45

    
46
	@SuppressWarnings("unused")
47
	private static final Logger logger = Logger.getLogger(AgentDaoImpl.class);
48

    
49
	public AgentDaoImpl() {
50
		super(AgentBase.class);
51
		indexedClasses = new Class[3];
52
		indexedClasses[0] = Institution.class;
53
		indexedClasses[1] = Person.class;
54
		indexedClasses[2] = Team.class;
55
	}
56

    
57
	@Override
58
    public List<Institution> getInstitutionByCode(String code) {
59
		AuditEvent auditEvent = getAuditEventFromContext();
60
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
61
		    Criteria crit = getSession().createCriteria(Institution.class);
62
    		crit.add(Restrictions.eq("code", code));
63
 	    	return crit.list();
64
		} else {
65
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(Institution.class,auditEvent.getRevisionNumber());
66
			query.add(AuditEntity.property("code").eq(code));
67
			return query.getResultList();
68
		}
69
	}
70

    
71
	@Override
72
    public long countInstitutionalMemberships(Person person) {
73
		AuditEvent auditEvent = getAuditEventFromContext();
74
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
75
		    Query query = getSession().createQuery("select count(institutionalMembership) from InstitutionalMembership institutionalMembership where institutionalMembership.person = :person");
76
		    query.setParameter("person", person);
77
		    return (Long)query.uniqueResult();
78
		} else {
79
			AuditQuery query = makeAuditQuery(InstitutionalMembership.class, auditEvent);
80
			query.add(AuditEntity.relatedId("person").eq(person.getId()));
81
			query.addProjection(AuditEntity.id());
82
			return (Long)query.getSingleResult();
83
		}
84
	}
85

    
86
	@Override
87
    public long countMembers(Team team) {
88
		checkNotInPriorView("AgentDaoImpl.countMembers(Team team)");
89
		Query query = getSession().createQuery("select count(teamMember) from Team team join team.teamMembers teamMember where team = :team");
90
		query.setParameter("team", team);
91
		return (Long)query.uniqueResult();
92
	}
93

    
94
	@Override
95
    public List<InstitutionalMembership> getInstitutionalMemberships(Person person, Integer pageSize, Integer pageNumber) {
96
		AuditEvent auditEvent = getAuditEventFromContext();
97
		if(auditEvent.equals(AuditEvent.CURRENT_VIEW)) {
98
		    Query query = getSession().createQuery("select institutionalMembership from InstitutionalMembership institutionalMembership left join fetch institutionalMembership.institute where institutionalMembership.person = :person");
99
		    query.setParameter("person", person);
100
		    setPagingParameter(query, pageSize, pageNumber);
101
			return query.list();
102
		} else {
103
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(InstitutionalMembership.class,auditEvent.getRevisionNumber());
104
			query.add(AuditEntity.relatedId("person").eq(person.getId()));
105
			setPagingParameter(query, pageSize, pageNumber);
106
			return query.getResultList();
107
		}
108
	}
109

    
110
	@Override
111
    public List<Person> getMembers(Team team, Integer pageSize,	Integer pageNumber) {
112
		checkNotInPriorView("AgentDaoImpl.getMembers(Team team, Integer pageSize,	Integer pageNumber)");
113
		Query query = getSession().createQuery("select teamMember from Team team join team.teamMembers teamMember where team = :team order by sortindex");
114
		query.setParameter("team", team);
115
		//query.addOrder( Order.asc("sortindex") );
116
		setPagingParameter(query, pageSize, pageNumber);
117
		@SuppressWarnings("unchecked")
118
        List<Person> result = query.list();
119
		return result;
120
	}
121

    
122
	@Override
123
    public long countAddresses(AgentBase agent) {
124
		checkNotInPriorView("AgentDaoImpl.countAddresses(AgentBase agent)");
125
		Query query = getSession().createQuery("select count(address) from AgentBase agent join agent.contact.addresses address where agent = :agent");
126
		query.setParameter("agent", agent);
127
		return (Long)query.uniqueResult();
128
	}
129

    
130
	@Override
131
    public List<Address> getAddresses(AgentBase agent, Integer pageSize,Integer pageNumber) {
132
		checkNotInPriorView("AgentDaoImpl.getAddresses(AgentBase agent, Integer pageSize,Integer pageNumber)");
133
		Query query = getSession().createQuery("select address from AgentBase agent join agent.contact.addresses address where agent = :agent");
134
		query.setParameter("agent", agent);
135
		setPagingParameter(query, pageSize, pageNumber);
136
        @SuppressWarnings("unchecked")
137
        List<Address> result = query.list();
138
        return result;
139
	}
140

    
141

    
142
	@Override
143
	public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {
144
		List<UuidAndTitleCache<Team>> list = new ArrayList<>();
145
		Session session = getSession();
146

    
147
		Query query = session.createQuery("select uuid, id, nomenclaturalTitleCache from " + type.getSimpleName() + " where dtype = 'Team'");
148

    
149
		@SuppressWarnings("unchecked")
150
        List<Object[]> result = query.list();
151

    
152
		for(Object[] object : result){
153
			list.add(new UuidAndTitleCache<>(Team.class, (UUID) object[0], (Integer)object[1], (String) object[2]));
154
		}
155

    
156
		return list;
157
	}
158

    
159
	@Override
160
    public List<UuidAndTitleCache<Person>> getPersonUuidAndTitleCache() {
161
		Query query = getSession().createQuery("select uuid, id, titleCache from " + type.getSimpleName() + " where dtype = 'Person'");
162
		return getUuidAndTitleCache(query);
163
	}
164

    
165
	@Override
166
	public List<UuidAndTitleCache<Team>> getTeamUuidAndTitleCache() {
167
		Query query = getSession().createQuery("select uuid, id, titleCache from " + type.getSimpleName() + " where dtype = 'Team'");
168
		return getUuidAndTitleCache(query);
169
	}
170

    
171

    
172

    
173
	@Override
174
	public List<UuidAndTitleCache<Institution>> getInstitutionUuidAndTitleCache(Integer limit, String pattern) {
175
		Query query = getSession().createQuery("select uuid, id, titleCache from " + type.getSimpleName() + " where dtype = 'Institution'");
176
		return getUuidAndTitleCache(query);
177
	}
178

    
179
	@Override
180
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getUuidAndTitleCacheWithCollector(Class<T> clazz, Integer limit, String pattern){
181
	    Session session = getSession();
182

    
183
        clazz = clazz == null? (Class)type : clazz;
184
        String clazzString = " FROM " + clazz.getSimpleName();
185

    
186
        Query query = null;
187

    
188
        if (pattern != null){
189
            String whereClause = " WHERE collectorTitleCache LIKE :pattern";
190
            whereClause += " OR titleCache LIKE :pattern";
191
            whereClause += " OR nomenclaturalTitleCache like :pattern";
192

    
193
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
194
            pattern = pattern + "%";
195
            pattern = pattern.replace("*", "%");
196
            pattern = pattern.replace("?", "_");
197
            query.setParameter("pattern", pattern);
198
        } else {
199
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
200
        }
201
        if (limit != null){
202
            query.setMaxResults(limit);
203
        }
204

    
205
        return getTeamOrPersonUuidAndTitleCache(query);
206
	}
207

    
208
	@Override
209
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getTeamOrPersonUuidAndTitleCache(Class<T> clazz, Integer limit, String pattern){
210
        Session session = getSession();
211

    
212
        clazz = clazz == null? (Class)type : clazz;
213
        String clazzString = " FROM " + clazz.getSimpleName();
214

    
215
        Query query = null;
216

    
217
        if (pattern != null){
218
            String whereClause = " WHERE titleCache LIKE :pattern";
219

    
220

    
221
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
222
            pattern = pattern + "%";
223
            pattern = pattern.replace("*", "%");
224
            pattern = pattern.replace("?", "_");
225
            query.setParameter("pattern", pattern);
226
        } else {
227
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
228
        }
229
        if (limit != null){
230
            query.setMaxResults(limit);
231
        }
232

    
233
        return getTeamOrPersonUuidAndTitleCache(query);
234
    }
235

    
236

    
237
	@Override
238
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getUuidAndAbbrevTitleCache(Class<T> clazz, Integer limit, String pattern){
239
        Session session = getSession();
240

    
241
        clazz = clazz == null? (Class)type : clazz;
242
        String clazzString = " FROM " + clazz.getSimpleName();
243

    
244
        Query query = null;
245

    
246
        if (pattern != null){
247
            String whereClause = " WHERE nomenclaturalTitleCache LIKE :pattern";
248
            if (pattern.startsWith("*")){
249
                whereClause += " OR titleCache LIKE :pattern";
250
                whereClause += " OR collectorTitleCache LIKE :pattern";
251
            }
252

    
253
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
254
            pattern = pattern + "%";
255
            pattern = pattern.replace("*", "%");
256
            pattern = pattern.replace("?", "_");
257
            query.setParameter("pattern", pattern);
258
        } else {
259
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
260
        }
261
        if (limit != null){
262
            query.setMaxResults(limit);
263
        }
264

    
265
        return getTeamOrPersonUuidAndTitleCache(query);
266
    }
267

    
268
	@Override
269
    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) {
270
        Set<String> params = new HashSet<>();
271
        params.add("titleCache");
272
        params.add("nomenclaturalTitleCache");
273
        params.add("collectorTitleCache");
274

    
275
	    return findByParam(clazz, params, queryString, matchmode, criterion, pageSize, pageNumber, orderHints, propertyPaths);
276
    }
277

    
278

    
279

    
280

    
281
    protected <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getTeamOrPersonUuidAndTitleCache(Query query){
282
        List<TeamOrPersonUuidAndTitleCache<T>> list = new ArrayList<>();
283

    
284

    
285
        List<Object> result = query.list();
286

    
287
        for(Object obj : result){
288
          Object[] object = (Object[])obj;
289
          list.add(new TeamOrPersonUuidAndTitleCache((UUID) object[0],(Integer) object[1], (String) object[3], (String) object[2], (String) object[4]));
290

    
291
        }
292
        return list;
293
    }
294
}
    (1-1/1)