Project

General

Profile

Download (8.61 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.UuidAndTitleCache;
38
import eu.etaxonomy.cdm.persistence.query.MatchMode;
39
import eu.etaxonomy.cdm.persistence.query.OrderHint;
40

    
41

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

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

    
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;
54
	}
55

    
56
	@Override
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
 	    	return crit.list();
63
		} else {
64
			AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(Institution.class,auditEvent.getRevisionNumber());
65
			query.add(AuditEntity.property("code").eq(code));
66
			return query.getResultList();
67
		}
68
	}
69

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

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

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

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

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

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

    
140

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

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

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

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

    
155
		return list;
156
	}
157

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

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

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

    
176

    
177
	@Override
178
    public List<UuidAndTitleCache<AgentBase>> getUuidAndAbbrevTitleCache(Class clazz, Integer limit, String pattern){
179
        Session session = getSession();
180

    
181
        clazz = clazz == null? type : clazz;
182
        String clazzString = " FROM " + type.getSimpleName();
183

    
184
        Query query = null;
185

    
186
        if (pattern != null){
187
            String whereClause = " WHERE nomenclaturalTitle LIKE :pattern";
188
            if (pattern.startsWith("*")){
189
                whereClause += " OR titleCache LIKE :pattern";
190
            }
191

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

    
204
        return getUuidAndAbbrevTitleCache(query);
205
    }
206

    
207
	@Override
208
    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) {
209
        Set<String> params = new HashSet<>();
210
        params.add("titleCache");
211
        params.add("nomenclaturalTitle");
212

    
213
	    return findByParam(clazz, params, queryString, matchmode, criterion, pageSize, pageNumber, orderHints, propertyPaths);
214
    }
215
}
    (1-1/1)