blob: 22042a7d12fe623d65dbfa0c634277eb2e9b86c2 [file] [log] [blame]
margaretha1f106f62017-10-18 22:27:30 +02001package de.ids_mannheim.korap.dao;
2
margarethaf6d5a822017-10-19 19:51:20 +02003import java.util.HashSet;
margaretha1f106f62017-10-18 22:27:30 +02004import java.util.List;
margarethaf6d5a822017-10-19 19:51:20 +02005import java.util.Set;
margaretha1f106f62017-10-18 22:27:30 +02006
7import javax.persistence.EntityManager;
margarethaf6d5a822017-10-19 19:51:20 +02008import javax.persistence.NoResultException;
margaretha1f106f62017-10-18 22:27:30 +02009import javax.persistence.PersistenceContext;
10import javax.persistence.Query;
11import javax.persistence.criteria.CriteriaBuilder;
12import javax.persistence.criteria.CriteriaQuery;
13import javax.persistence.criteria.Join;
14import javax.persistence.criteria.Predicate;
15import javax.persistence.criteria.Root;
16
17import org.springframework.stereotype.Component;
margarethaf6d5a822017-10-19 19:51:20 +020018import org.springframework.transaction.annotation.Transactional;
margaretha1f106f62017-10-18 22:27:30 +020019
20import de.ids_mannheim.korap.constants.GroupMemberStatus;
21import de.ids_mannheim.korap.constants.UserGroupStatus;
22import de.ids_mannheim.korap.constants.VirtualCorpusAccessStatus;
margarethaf6d5a822017-10-19 19:51:20 +020023import de.ids_mannheim.korap.constants.VirtualCorpusType;
margaretha1f106f62017-10-18 22:27:30 +020024import de.ids_mannheim.korap.entity.UserGroup;
25import de.ids_mannheim.korap.entity.VirtualCorpus;
26import de.ids_mannheim.korap.entity.VirtualCorpusAccessGroup;
27import de.ids_mannheim.korap.exceptions.KustvaktException;
28import de.ids_mannheim.korap.exceptions.StatusCodes;
29
30/** VirtualCorpusDao manages SQL queries regarding virtual corpora,
31 * e.g. retrieving and storing virtual corpora.
32 *
33 * @author margaretha
34 *
35 */
margaretha318fec32017-10-24 12:11:58 +020036@Transactional
margaretha1f106f62017-10-18 22:27:30 +020037@Component
38public class VirtualCorpusDao {
39
40 @PersistenceContext
41 private EntityManager entityManager;
margarethabf11d8d2017-10-24 19:31:44 +020042
margaretha1f106f62017-10-18 22:27:30 +020043 public void storeVirtualCorpus (VirtualCorpus virtualCorpus) {
margaretha1f106f62017-10-18 22:27:30 +020044 entityManager.persist(virtualCorpus);
margaretha1f106f62017-10-18 22:27:30 +020045 }
46
margarethaf6d5a822017-10-19 19:51:20 +020047 public void deleteVirtualCorpus (int id) throws KustvaktException {
48 VirtualCorpus vc = retrieveVCById(id);
49 entityManager.remove(vc);
50 }
51
margarethaf6d5a822017-10-19 19:51:20 +020052 public List<VirtualCorpus> retrieveVCByType (VirtualCorpusType type)
margaretha1f106f62017-10-18 22:27:30 +020053 throws KustvaktException {
margarethaf6d5a822017-10-19 19:51:20 +020054 if (type == null) {
55 throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "type",
56 "null");
57 }
58 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
59 CriteriaQuery<VirtualCorpus> query =
60 criteriaBuilder.createQuery(VirtualCorpus.class);
61 Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
62 query.select(virtualCorpus);
63 query.where(criteriaBuilder.equal(virtualCorpus.get("type"), type));
64 Query q = entityManager.createQuery(query);
65 return q.getResultList();
66 }
67
68
69 public VirtualCorpus retrieveVCById (int id) throws KustvaktException {
margaretha1f106f62017-10-18 22:27:30 +020070 if (id == 0) {
71 throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "id",
72 String.valueOf(id));
73 }
74 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
75 CriteriaQuery<VirtualCorpus> query =
76 criteriaBuilder.createQuery(VirtualCorpus.class);
77 Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
78 query.select(virtualCorpus);
79 query.where(criteriaBuilder.equal(virtualCorpus.get("id"), id));
margarethaf6d5a822017-10-19 19:51:20 +020080
81 VirtualCorpus vc = null;
82 try {
83 Query q = entityManager.createQuery(query);
84 vc = (VirtualCorpus) q.getSingleResult();
85 }
86 catch (NoResultException e) {
87 throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
88 "No result found for query: retrieve virtual corpus by id "
89 + id,
90 String.valueOf(id), e);
91 }
92 return vc;
margaretha1f106f62017-10-18 22:27:30 +020093 }
94
95
margarethaf6d5a822017-10-19 19:51:20 +020096 public List<VirtualCorpus> retrievePrivateVC (String userId)
97 throws KustvaktException {
98 if (userId == null || userId.isEmpty()) {
99 throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
100 userId);
101 }
102 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
margaretha1f106f62017-10-18 22:27:30 +0200103 CriteriaQuery<VirtualCorpus> query =
margarethaf6d5a822017-10-19 19:51:20 +0200104 builder.createQuery(VirtualCorpus.class);
margaretha1f106f62017-10-18 22:27:30 +0200105
106 Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
margarethaf6d5a822017-10-19 19:51:20 +0200107 query.select(virtualCorpus);
108 query.where(builder.equal(virtualCorpus.get("createdBy"), userId));
margaretha1f106f62017-10-18 22:27:30 +0200109
margarethaf6d5a822017-10-19 19:51:20 +0200110 Query q = entityManager.createQuery(query);
111 return q.getResultList();
112 }
113
114
115 public List<VirtualCorpus> retrieveGroupVCByUser (String userId)
116 throws KustvaktException {
117 if (userId == null || userId.isEmpty()) {
118 throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
119 userId);
120 }
121
122 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
123 CriteriaQuery<VirtualCorpus> query =
124 builder.createQuery(VirtualCorpus.class);
125
126 Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
margaretha1f106f62017-10-18 22:27:30 +0200127 Join<VirtualCorpus, VirtualCorpusAccessGroup> accessGroup =
128 virtualCorpus.join("accessGroup");
129
margarethabf11d8d2017-10-24 19:31:44 +0200130 Predicate corpusStatus = builder.and(
131 builder.notEqual(accessGroup.get("status"),
132 VirtualCorpusAccessStatus.HIDDEN),
133 builder.notEqual(accessGroup.get("status"),
134 VirtualCorpusAccessStatus.DELETED));
135
margarethaf6d5a822017-10-19 19:51:20 +0200136 Predicate userGroupStatus =
137 builder.notEqual(accessGroup.get("userGroup").get("status"),
138 UserGroupStatus.DELETED);
margaretha1f106f62017-10-18 22:27:30 +0200139 Join<VirtualCorpusAccessGroup, UserGroup> userGroupMembers =
140 accessGroup.join("userGroup").join("members");
margarethabf11d8d2017-10-24 19:31:44 +0200141
margarethaf6d5a822017-10-19 19:51:20 +0200142 Predicate memberStatus = builder.equal(userGroupMembers.get("status"),
143 GroupMemberStatus.ACTIVE);
margarethabf11d8d2017-10-24 19:31:44 +0200144
margarethaf6d5a822017-10-19 19:51:20 +0200145 Predicate user = builder.equal(userGroupMembers.get("userId"), userId);
margaretha1f106f62017-10-18 22:27:30 +0200146
147 query.select(virtualCorpus);
margarethaf6d5a822017-10-19 19:51:20 +0200148 query.where(
149 builder.and(corpusStatus, userGroupStatus, memberStatus, user));
150
margaretha1f106f62017-10-18 22:27:30 +0200151 Query q = entityManager.createQuery(query);
152 return q.getResultList();
153 }
154
155
margarethaf6d5a822017-10-19 19:51:20 +0200156 public Set<VirtualCorpus> retrieveVCByUser (String userId)
157 throws KustvaktException {
158 if (userId == null || userId.isEmpty()) {
159 throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
160 userId);
161 }
162 CriteriaBuilder builder = entityManager.getCriteriaBuilder();
163 CriteriaQuery<VirtualCorpus> query =
164 builder.createQuery(VirtualCorpus.class);
165
166 Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
167 Predicate predicate = builder.or(
168 builder.equal(virtualCorpus.get("createdBy"), userId),
169 builder.equal(virtualCorpus.get("type"),
170 VirtualCorpusType.PREDEFINED));
171
172
173 query.select(virtualCorpus);
174 query.where(predicate);
175 query.distinct(true);
176 Query q = entityManager.createQuery(query);
177
178 List<VirtualCorpus> vcList = q.getResultList();
179 List<VirtualCorpus> groupVC = retrieveGroupVCByUser(userId);
180 Set<VirtualCorpus> vcSet = new HashSet<VirtualCorpus>();
181 vcSet.addAll(vcList);
182 vcSet.addAll(groupVC);
183 return vcSet;
184 }
185
186
margaretha1f106f62017-10-18 22:27:30 +0200187 // EM: what is needed for admin?
188 public List<VirtualCorpus> retrieveVirtualCorpusByAdmin () {
189 return null;
190
191 }
192}