blob: d341f38e208e5ececbb9de45e71111f37284f680 [file] [log] [blame]
margarethab097fb02021-02-22 19:28:33 +01001package de.ids_mannheim.korap.dao;
2
3import java.util.List;
4
margaretha6e796842023-08-17 15:10:45 +02005import jakarta.persistence.EntityManager;
6import jakarta.persistence.NoResultException;
7import jakarta.persistence.PersistenceContext;
8import jakarta.persistence.Query;
9import jakarta.persistence.TypedQuery;
10import jakarta.persistence.criteria.CriteriaBuilder;
11import jakarta.persistence.criteria.CriteriaQuery;
12import jakarta.persistence.criteria.Join;
13import jakarta.persistence.criteria.Predicate;
14import jakarta.persistence.criteria.Root;
margarethab097fb02021-02-22 19:28:33 +010015
16import org.springframework.stereotype.Repository;
17import org.springframework.transaction.annotation.Transactional;
18
19import de.ids_mannheim.korap.constant.QueryAccessStatus;
20import de.ids_mannheim.korap.entity.UserGroup;
21import de.ids_mannheim.korap.entity.UserGroup_;
22import de.ids_mannheim.korap.entity.QueryAccess;
23import de.ids_mannheim.korap.entity.QueryAccess_;
24import de.ids_mannheim.korap.entity.QueryDO;
25import de.ids_mannheim.korap.entity.QueryDO_;
26import de.ids_mannheim.korap.exceptions.KustvaktException;
27import de.ids_mannheim.korap.exceptions.StatusCodes;
28import de.ids_mannheim.korap.utils.ParameterChecker;
29
30/**
31 * Manages database queries and transactions regarding
32 * {@link QueryAccess} entity and its corresponding database
33 * table.
34 *
35 * @author margaretha
36 *
37 * @see QueryAccess
38 * @see Query
39 */
40@Transactional
41@Repository
42public class QueryAccessDao {
43
44 @PersistenceContext
45 private EntityManager entityManager;
46
47 public QueryAccess retrieveAccessById (int accessId)
48 throws KustvaktException {
49 ParameterChecker.checkIntegerValue(accessId, "accessId");
50
51 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
52 CriteriaQuery<QueryAccess> query =
53 builder.createQuery(QueryAccess.class);
54
55 Root<QueryAccess> access =
56 query.from(QueryAccess.class);
57 query.select(access);
58 query.where(
59 builder.equal(access.get(QueryAccess_.id), accessId));
60 Query q = entityManager.createQuery(query);
61 try{
62 return (QueryAccess) q.getSingleResult();
63 }
64 catch (NoResultException e) {
65 throw new KustvaktException(StatusCodes.NO_RESOURCE_FOUND,
66 "Query access is not found",
67 String.valueOf(accessId));
68 }
69 }
70
71 // for query-access admins
72 public List<QueryAccess> retrieveActiveAccessByQuery (int queryId)
73 throws KustvaktException {
74 ParameterChecker.checkIntegerValue(queryId, "queryId");
75
76 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
77 CriteriaQuery<QueryAccess> query =
78 builder.createQuery(QueryAccess.class);
79
80 Root<QueryAccess> access =
81 query.from(QueryAccess.class);
82 Join<QueryAccess, QueryDO> accessQuery =
83 access.join(QueryAccess_.query);
84
85 Predicate p = builder.and(
86 builder.equal(accessQuery.get(QueryDO_.id), queryId),
87 builder.equal(access.get(QueryAccess_.status),
88 QueryAccessStatus.ACTIVE));
89 query.select(access);
90 query.where(p);
91 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
92 return q.getResultList();
93 }
94
95 public List<QueryAccess> retrieveActiveAccessByQuery (String queryCreator,
96 String queryName) throws KustvaktException {
97 ParameterChecker.checkStringValue(queryCreator, "queryCreator");
98 ParameterChecker.checkStringValue(queryName, "queryName");
99
100 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
101 CriteriaQuery<QueryAccess> query =
102 builder.createQuery(QueryAccess.class);
103
104 Root<QueryAccess> access =
105 query.from(QueryAccess.class);
106 Join<QueryAccess, QueryDO> accessQuery =
107 access.join(QueryAccess_.query);
108
109 Predicate p = builder.and(
110 builder.equal(accessQuery.get(QueryDO_.name), queryName),
111 builder.equal(accessQuery.get(QueryDO_.createdBy), queryCreator),
112 builder.equal(access.get(QueryAccess_.status),
113 QueryAccessStatus.ACTIVE));
114 query.select(access);
115 query.where(p);
116 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
117 return q.getResultList();
118 }
119
120 public List<QueryAccess> retrieveAllAccess ()
121 throws KustvaktException {
122
123 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
124 CriteriaQuery<QueryAccess> query =
125 builder.createQuery(QueryAccess.class);
126 Root<QueryAccess> access =
127 query.from(QueryAccess.class);
128 query.select(access);
129 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
130 return q.getResultList();
131 }
132
133 public List<QueryAccess> retrieveAllAccessByQuery (String queryCreator,
134 String queryName) throws KustvaktException {
135 ParameterChecker.checkStringValue(queryCreator, "queryCreator");
136 ParameterChecker.checkStringValue(queryName, "queryName");
137
138 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
139 CriteriaQuery<QueryAccess> query =
140 builder.createQuery(QueryAccess.class);
141
142 Root<QueryAccess> access =
143 query.from(QueryAccess.class);
144 Join<QueryAccess, QueryDO> accessQuery =
145 access.join(QueryAccess_.query);
146
147 Predicate conditions = builder.and(
148 builder.equal(accessQuery.get(QueryDO_.createdBy),
149 queryCreator),
150 builder.equal(accessQuery.get(QueryDO_.name), queryName));
151 query.select(access);
152 query.where(conditions);
153 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
154 return q.getResultList();
155 }
156
157 public List<QueryAccess> retrieveAllAccessByGroup (int groupId)
158 throws KustvaktException {
159 ParameterChecker.checkIntegerValue(groupId, "groupId");
160
161 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
162 CriteriaQuery<QueryAccess> query =
163 builder.createQuery(QueryAccess.class);
164
165 Root<QueryAccess> access =
166 query.from(QueryAccess.class);
167 Join<QueryAccess, UserGroup> accessQuery =
168 access.join(QueryAccess_.userGroup);
169
170 query.select(access);
171 query.where(builder.equal(accessQuery.get(UserGroup_.id), groupId));
172 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
173 return q.getResultList();
174 }
175
176 public List<QueryAccess> retrieveActiveAccessByGroup (int groupId)
177 throws KustvaktException {
178 ParameterChecker.checkIntegerValue(groupId, "groupId");
179
180 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
181 CriteriaQuery<QueryAccess> query =
182 builder.createQuery(QueryAccess.class);
183
184 Root<QueryAccess> access =
185 query.from(QueryAccess.class);
186 Join<QueryAccess, UserGroup> accessQuery =
187 access.join(QueryAccess_.userGroup);
188
189 Predicate p =
190 builder.and(builder.equal(accessQuery.get(UserGroup_.id), groupId),
191 builder.equal(access.get(QueryAccess_.status),
192 QueryAccessStatus.ACTIVE));
193
194 query.select(access);
195 query.where(p);
196 TypedQuery<QueryAccess> q = entityManager.createQuery(query);
197 return q.getResultList();
198 }
199
200 /**
201 * Hidden accesses are only created for published or system query.
202 *
203 * Warn: The actual hidden accesses are not checked.
204 *
205 * @param queryId
206 * queryId
207 * @return true if there is a hidden access, false otherwise
208 * @throws KustvaktException
209 */
210 public QueryAccess retrieveHiddenAccess (int queryId)
211 throws KustvaktException {
212 ParameterChecker.checkIntegerValue(queryId, "queryId");
213
214 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
215 CriteriaQuery<QueryAccess> query =
216 builder.createQuery(QueryAccess.class);
217
218 Root<QueryAccess> access =
219 query.from(QueryAccess.class);
220 Join<QueryAccess, QueryDO> accessQuery =
221 access.join(QueryAccess_.query);
222
223 Predicate p = builder.and(
224 builder.equal(accessQuery.get(QueryDO_.id), queryId),
225 builder.equal(access.get(QueryAccess_.status),
226 QueryAccessStatus.HIDDEN)
227 // ,
228 // builder.notEqual(access.get(QueryAccess_.deletedBy),
229 // "NULL")
230 );
231
232 query.select(access);
233 query.where(p);
234
235 try {
236 Query q = entityManager.createQuery(query);
237 return (QueryAccess) q.getSingleResult();
238 }
239 catch (NoResultException e) {
240 return null;
241 }
242 }
243
244 public void createAccessToQuery (QueryDO query,
245 UserGroup userGroup, String createdBy,
246 QueryAccessStatus status) {
247 QueryAccess queryAccess = new QueryAccess();
248 queryAccess.setQuery(query);
249 queryAccess.setUserGroup(userGroup);
250 queryAccess.setCreatedBy(createdBy);
251 queryAccess.setStatus(status);
252 entityManager.persist(queryAccess);
253 }
254
255 public void deleteAccess (QueryAccess access, String deletedBy) {
256 // soft delete
257
258 // hard delete
259 if (!entityManager.contains(access)) {
260 access = entityManager.merge(access);
261 }
262 entityManager.remove(access);
263 }
264
265}