Project

General

Profile

Download (8.71 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.List;
14
import java.util.UUID;
15

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

    
25
import eu.etaxonomy.cdm.model.agent.Address;
26
import eu.etaxonomy.cdm.model.agent.AgentBase;
27
import eu.etaxonomy.cdm.model.agent.Institution;
28
import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
29
import eu.etaxonomy.cdm.model.agent.Person;
30
import eu.etaxonomy.cdm.model.agent.Team;
31
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
32
import eu.etaxonomy.cdm.model.view.AuditEvent;
33
import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;
34
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase;
35
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
36

    
37

    
38
@Repository
39
public class AgentDaoImpl extends IdentifiableDaoBase<AgentBase> implements IAgentDao{
40

    
41
	@SuppressWarnings("unused")
42
	private static final Logger logger = Logger.getLogger(AgentDaoImpl.class);
43

    
44
	public AgentDaoImpl() {
45
		super(AgentBase.class);
46
		indexedClasses = new Class[3];
47
		indexedClasses[0] = Institution.class;
48
		indexedClasses[1] = Person.class;
49
		indexedClasses[2] = Team.class;
50
	}
51

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

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

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

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

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

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

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

    
136

    
137
	@Override
138
	public List<UuidAndTitleCache<Team>> getTeamUuidAndNomenclaturalTitle() {
139
		List<UuidAndTitleCache<Team>> list = new ArrayList<>();
140
		Session session = getSession();
141

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

    
144
		@SuppressWarnings("unchecked")
145
        List<Object[]> result = query.list();
146

    
147
		for(Object[] object : result){
148
			list.add(new UuidAndTitleCache<>(Team.class, (UUID) object[0], (Integer)object[1], (String) object[2]));
149
		}
150

    
151
		return list;
152
	}
153

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

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

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

    
172

    
173
	@Override
174
    public List<UuidAndTitleCache<AgentBase>> getUuidAndAbbrevTitleCache(Class clazz, Integer limit, String pattern){
175
        Session session = getSession();
176
        String clazzString = "";
177
        if (clazz == null){
178
            clazzString = "";
179
        }else if (clazz.equals(Team.class)){
180
            clazzString = "dtype = 'Team'";
181
        } else if (clazz.equals(Person.class)){
182
            clazzString = "dtype = 'Person'";
183
        }  else if (clazz.equals(Institution.class)){
184
            clazzString = "dtype = 'Institution'";
185
        } else if (clazz.equals(TeamOrPersonBase.class)){
186
            clazzString = "dtype != 'Institution'";
187
        }
188

    
189
        Query query = null;
190
        String whereClause = " WHERE ";
191
        if (pattern != null){
192
            whereClause += "nomenclaturalTitle LIKE :pattern";
193
            if (pattern.startsWith("*")){
194
                whereClause += " OR titleCache LIKE :pattern";
195
            }
196
            if (clazzString != ""){
197
                whereClause += " AND " + clazzString;
198
            }
199

    
200

    
201
            query = session.createQuery("SELECT uuid, id, nomenclaturalTitle, titleCache FROM " + type.getSimpleName()  + whereClause);
202

    
203

    
204
            pattern = pattern + "%";
205
            pattern = pattern.replace("*", "%");
206
            pattern = pattern.replace("?", "_");
207
            query.setParameter("pattern", pattern);
208
        } else {
209
            if (clazzString != ""){
210
                query = session.createQuery("SELECT uuid, id, nomenclaturalTitle, titleCache FROM " + type.getSimpleName() + " WHERE " + clazzString);
211
            } else{
212
                query = session.createQuery("SELECT uuid, id, nomenclaturalTitle, titleCache FROM " + type.getSimpleName());
213
            }
214
        }
215
        if (limit != null){
216
           query.setMaxResults(limit);
217
        }
218

    
219
        return getUuidAndAbbrevTitleCache(query);
220
    }
221

    
222

    
223
}
    (1-1/1)