Project

General

Profile

Download (11.3 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
 	    	@SuppressWarnings("unchecked")
64
            List<Institution> result = crit.list();
65
 	    	return result;
66
		} else {
67
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(Institution.class,auditEvent.getRevisionNumber());
68
			query.add(AuditEntity.property("code").eq(code));
69
			@SuppressWarnings("unchecked")
70
            List<Institution> result = query.getResultList();
71
			return result;
72
		}
73
	}
74

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

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

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

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

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

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

    
145

    
146
	@Override
147
	public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {
148
		List<UuidAndTitleCache<Team>> list = new ArrayList<>();
149
		Session session = getSession();
150

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

    
153
		@SuppressWarnings("unchecked")
154
        List<Object[]> result = query.list();
155

    
156
		for(Object[] object : result){
157
			list.add(new UuidAndTitleCache<>(Team.class, (UUID) object[0], (Integer)object[1], (String) object[2]));
158
		}
159

    
160
		return list;
161
	}
162

    
163
	@Override
164
	public <T extends AgentBase> List<UuidAndTitleCache<T>> getUuidAndTitleCache(Class<T> clazz){
165
	    Query query = getSession().createQuery("SELECT uuid, id, titleCache FROM " + clazz.getSimpleName());
166
	    return getUuidAndTitleCache(query);
167
	}
168

    
169
	@Override
170
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getUuidAndTitleCacheWithCollector(Class<T> clazz, Integer limit, String pattern){
171
	    Session session = getSession();
172

    
173
        clazz = (clazz == null)? (Class)type : clazz;
174
        String clazzString = " FROM " + clazz.getSimpleName();
175

    
176
        Query query = null;
177

    
178
        if (pattern != null){
179
            String whereClause = " WHERE collectorTitleCache LIKE :pattern "
180
                     + " OR titleCache LIKE :pattern "
181
                     + " OR nomenclaturalTitleCache like :pattern ";
182

    
183
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
184
            pattern = pattern + "%";
185
            pattern = pattern.replace("*", "%");
186
            pattern = pattern.replace("?", "_");
187
            query.setParameter("pattern", pattern);
188
        } else {
189
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
190
        }
191
        if (limit != null){
192
            query.setMaxResults(limit);
193
        }
194

    
195
        return getTeamOrPersonUuidAndTitleCache(query);
196
	}
197

    
198
	@Override
199
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getTeamOrPersonUuidAndTitleCache(Class<T> clazz, Integer limit, String pattern){
200
        Session session = getSession();
201

    
202
        clazz = (clazz == null)? (Class)type : clazz;
203
        String clazzString = " FROM " + clazz.getSimpleName();
204

    
205
        Query query = null;
206

    
207
        if (pattern != null){
208
            String whereClause = " WHERE titleCache LIKE :pattern";
209

    
210
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
211
            pattern = pattern + "%";
212
            pattern = pattern.replace("*", "%");
213
            pattern = pattern.replace("?", "_");
214
            query.setParameter("pattern", pattern);
215
        } else {
216
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
217
        }
218
        if (limit != null){
219
            query.setMaxResults(limit);
220
        }
221

    
222
        return getTeamOrPersonUuidAndTitleCache(query);
223
    }
224

    
225

    
226
	@Override
227
    public <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getUuidAndAbbrevTitleCache(Class<T> clazz, Integer limit, String pattern){
228
        Session session = getSession();
229

    
230
        clazz = (clazz == null)? (Class)type : clazz;
231
        String clazzString = " FROM " + clazz.getSimpleName();
232

    
233
        Query query = null;
234

    
235
        if (pattern != null){
236
            String whereClause = " WHERE nomenclaturalTitleCache LIKE :pattern";
237
            if (pattern.startsWith("*")){
238
                whereClause += " OR titleCache LIKE :pattern";
239
                whereClause += " OR collectorTitleCache LIKE :pattern";
240
            }
241

    
242
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString  + whereClause);
243
            pattern = pattern + "%";
244
            pattern = pattern.replace("*", "%");
245
            pattern = pattern.replace("?", "_");
246
            query.setParameter("pattern", pattern);
247
        } else {
248
            query = session.createQuery("SELECT DISTINCT uuid, id, nomenclaturalTitleCache, titleCache, collectorTitleCache " + clazzString);
249
        }
250
        if (limit != null){
251
            query.setMaxResults(limit);
252
        }
253

    
254
        return getTeamOrPersonUuidAndTitleCache(query);
255
    }
256

    
257
	@Override
258
    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) {
259
        Set<String> params = new HashSet<>();
260
        params.add("titleCache");
261
        params.add("nomenclaturalTitleCache");
262
        params.add("collectorTitleCache");
263

    
264
	    return findByParam(clazz, params, queryString, matchmode, criterion, pageSize, pageNumber, orderHints, propertyPaths);
265
    }
266

    
267
    protected <T extends AgentBase> List<TeamOrPersonUuidAndTitleCache<T>> getTeamOrPersonUuidAndTitleCache(Query query){
268
        List<TeamOrPersonUuidAndTitleCache<T>> list = new ArrayList<>();
269

    
270
        @SuppressWarnings("unchecked")
271
        List<Object> result = query.list();
272

    
273
        for(Object obj : result){
274
          Object[] object = (Object[])obj;
275
          list.add(new TeamOrPersonUuidAndTitleCache((UUID) object[0],(Integer) object[1], (String) object[3], (String) object[2], (String) object[4]));
276
        }
277
        return list;
278
    }
279
}
    (1-1/1)