Merge branch 'release/5.44.0'
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / persistence / dao / hibernate / reference / OriginalSourceDaoImpl.java
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 package eu.etaxonomy.cdm.persistence.dao.hibernate.reference;
10
11 import java.util.HashMap;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.Set;
15
16 import org.apache.logging.log4j.LogManager;
17 import org.apache.logging.log4j.Logger;
18 import org.hibernate.Criteria;
19 import org.hibernate.Session;
20 import org.hibernate.criterion.Order;
21 import org.hibernate.criterion.Projections;
22 import org.hibernate.criterion.Restrictions;
23 import org.hibernate.query.Query;
24 import org.springframework.stereotype.Repository;
25
26 import eu.etaxonomy.cdm.common.CdmUtils;
27 import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
28 import eu.etaxonomy.cdm.model.common.SingleSourcedEntityBase;
29 import eu.etaxonomy.cdm.model.reference.ISourceable;
30 import eu.etaxonomy.cdm.model.reference.NamedSourceBase;
31 import eu.etaxonomy.cdm.model.reference.OriginalSourceBase;
32 import eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmEntityDaoBase;
33 import eu.etaxonomy.cdm.persistence.dao.reference.IOriginalSourceDao;
34 import eu.etaxonomy.cdm.persistence.query.OrderHint;
35
36 /**
37 * @author a.mueller
38 * @since 17.07.2008
39 */
40 @Repository
41 public class OriginalSourceDaoImpl
42 extends CdmEntityDaoBase<OriginalSourceBase>
43 implements IOriginalSourceDao {
44
45 @SuppressWarnings("unused")
46 private static final Logger logger = LogManager.getLogger();
47
48 public OriginalSourceDaoImpl() {
49 super(OriginalSourceBase.class);
50 }
51
52 @Override
53 public <S extends SingleSourcedEntityBase> S findSingleSourceBySourceId(Class<S> clazz, int sourceId){
54 if (clazz == null){
55 clazz = (Class)SingleSourcedEntityBase.class;
56 }
57 Query<S> q = getSession().createQuery(
58 "SELECT c " +
59 "FROM " + clazz.getName() + " AS c " +
60 "INNER JOIN c.source AS source " +
61 "WHERE source.id= :sourceId ", clazz
62 );
63 q.setParameter("sourceId", sourceId);
64
65 S result = q.uniqueResult();
66 return result;
67 }
68
69 @Override
70 public <S extends IdentifiableEntity> S findIdentifiableBySourceId(Class<S> clazz, int sourceId){
71 if (clazz == null){
72 clazz = (Class)IdentifiableEntity.class;
73 }
74 Query<S> q = getSession().createQuery(
75 "SELECT c " +
76 "FROM " + clazz.getName() + " AS c " +
77 "INNER JOIN c.sources AS source " +
78 "WHERE source.id= :sourceId ", clazz
79 );
80 q.setParameter("sourceId", sourceId);
81
82 S result = q.uniqueResult();
83 return result;
84 }
85
86 @Override
87 public <S extends ISourceable> Map<String, S> findOriginalSourcesByIdInSource(Class<S> clazz, Set<String> idInSourceSet, String idNamespace) {
88
89 Session session = getSession();
90 String idInSourceString = "";
91 for (String idInSource : idInSourceSet){
92 idInSourceString = CdmUtils.concat("','", idInSourceString, idInSource);
93 }
94 idInSourceString = "'"+ idInSourceString + "'";
95
96 Query<Object[]> q = session.createQuery(
97 "SELECT source.idInSource, c " +
98 "FROM " + clazz.getName() + " AS c " +
99 "INNER JOIN c.sources AS source " +
100 "WHERE source.idInSource IN ( " + idInSourceString + " )" +
101 " AND source.idNamespace = :idNamespace",
102 Object[].class
103 );
104 q.setParameter("idNamespace", idNamespace);
105 //TODO integrate reference in where
106
107 Map<String, S> result = new HashMap<>();
108
109 List<Object[]> list = q.list();
110 for (Object[] pair : list){
111 result.put((String)pair[0], (S)pair[1]);
112 }
113
114 return result;
115 }
116
117 @Override
118 public <S extends ISourceable> List<S> findOriginalSourceByIdInSource(Class<S> clazz, String idInSource, String idNamespace) {
119 Session session = getSession();
120 Query<S> q = session.createQuery(
121 "SELECT c FROM " + clazz.getSimpleName() + " as c " +
122 " INNER JOIN c.sources as source " +
123 "WHERE source.idInSource = :idInSource " +
124 " AND source.idNamespace = :idNamespace",
125 clazz
126 );
127 q.setParameter("idInSource", idInSource);
128 q.setParameter("idNamespace", idNamespace);
129 //TODO integrate reference in where
130
131 List<S> results = q.list();
132
133 return results;
134 }
135
136 @Override
137 public List<OriginalSourceBase> findOriginalSourceByIdInSource(String idInSource, String idNamespace) {
138 Session session = getSession();
139 Criteria crit = session.createCriteria(type);
140 crit.add(Restrictions.eq("idInSource", idInSource));
141 if (idNamespace == null){
142 crit.add(Restrictions.isNull("idNamespace"));
143 }else{
144 crit.add(Restrictions.eq("idNamespace", idNamespace));
145 }
146 crit.addOrder(Order.desc("created"));
147 @SuppressWarnings({ "unchecked"})
148 List<OriginalSourceBase> results = crit.list();
149
150 return results;
151 }
152
153 @Override
154 public <T extends NamedSourceBase> Long countWithNameUsedInSource(Class<T> clazz){
155
156 clazz = clazz != null? clazz : (Class<T>)NamedSourceBase.class;
157 Criteria crit = getSession().createCriteria(clazz);
158 //count
159 crit.setProjection(Projections.rowCount());
160 long result = (Long)crit.uniqueResult();
161
162 return result;
163 }
164
165
166 @Override
167 public <T extends NamedSourceBase> List<T> listWithNameUsedInSource(Class<T> clazz,
168 Integer pageSize, Integer pageNumber,List<OrderHint> orderHints, List<String> propertyPaths){
169
170 clazz = clazz != null? clazz : (Class<T>) NamedSourceBase.class;
171 Criteria crit = getSession().createCriteria(clazz);
172 crit.add(Restrictions.isNotNull("nameUsedInSource"));
173
174 crit.addOrder(Order.desc("created"));
175 @SuppressWarnings({ "unchecked" })
176 List<T> results = crit.list();
177
178 return results;
179 }
180 }