Updated tables and added VirtualCorpusDao.
Change-Id: I48e4d077d1063262117637f71e11091f8eafa978
diff --git a/full/src/main/java/de/ids_mannheim/korap/constants/GroupMemberStatus.java b/full/src/main/java/de/ids_mannheim/korap/constants/GroupMemberStatus.java
new file mode 100644
index 0000000..39a2015
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/constants/GroupMemberStatus.java
@@ -0,0 +1,5 @@
+package de.ids_mannheim.korap.constants;
+
+public enum GroupMemberStatus {
+ ACTIVE, PENDING, DELETED;
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constants/UserGroupStatus.java b/full/src/main/java/de/ids_mannheim/korap/constants/UserGroupStatus.java
new file mode 100644
index 0000000..1cac9ec
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/constants/UserGroupStatus.java
@@ -0,0 +1,5 @@
+package de.ids_mannheim.korap.constants;
+
+public enum UserGroupStatus {
+ ACTIVE, DELETED, HIDDEN;
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusAccessStatus.java b/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusAccessStatus.java
new file mode 100644
index 0000000..530526a
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusAccessStatus.java
@@ -0,0 +1,6 @@
+package de.ids_mannheim.korap.constants;
+
+public enum VirtualCorpusAccessStatus {
+
+ ACTIVE, PENDING, DELETED, HIDDEN;
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusType.java b/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusType.java
new file mode 100644
index 0000000..db4a461
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/constants/VirtualCorpusType.java
@@ -0,0 +1,6 @@
+package de.ids_mannheim.korap.constants;
+
+public enum VirtualCorpusType {
+
+ PREDEFINED, PROJECT, PRIVATE, PUBLISHED;
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
index 366546e..b8cf357 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/AnnotationDao.java
@@ -71,7 +71,7 @@
// EM: Hibernate bug in join n:m (see AnnotationPair.values).
// There should not be any redundant AnnotationPair.
- // The redundancy can be alsp avoided with fetch=FetchType.EAGER
+ // The redundancy can be also avoided with fetch=FetchType.EAGER
// because Hibernate does 2 selects.
query.distinct(true);
query = query.select(annotationPair);
diff --git a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
new file mode 100644
index 0000000..74b5850
--- /dev/null
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
@@ -0,0 +1,101 @@
+package de.ids_mannheim.korap.dao;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.stereotype.Component;
+
+import de.ids_mannheim.korap.constants.GroupMemberStatus;
+import de.ids_mannheim.korap.constants.UserGroupStatus;
+import de.ids_mannheim.korap.constants.VirtualCorpusAccessStatus;
+import de.ids_mannheim.korap.entity.UserGroup;
+import de.ids_mannheim.korap.entity.VirtualCorpus;
+import de.ids_mannheim.korap.entity.VirtualCorpusAccessGroup;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+
+/** VirtualCorpusDao manages SQL queries regarding virtual corpora,
+ * e.g. retrieving and storing virtual corpora.
+ *
+ * @author margaretha
+ *
+ */
+@Component
+public class VirtualCorpusDao {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+
+ public void storeVirtualCorpus (VirtualCorpus virtualCorpus) {
+ entityManager.getTransaction().begin();
+ entityManager.persist(virtualCorpus);
+ entityManager.getTransaction().commit();
+ }
+
+
+ public VirtualCorpus retrieveVirtualCorpusById (int id)
+ throws KustvaktException {
+ if (id == 0) {
+ throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "id",
+ String.valueOf(id));
+ }
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery<VirtualCorpus> query =
+ criteriaBuilder.createQuery(VirtualCorpus.class);
+ Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
+ query.select(virtualCorpus);
+ query.where(criteriaBuilder.equal(virtualCorpus.get("id"), id));
+ Query q = entityManager.createQuery(query);
+ return (VirtualCorpus) q.getSingleResult();
+ }
+
+
+ public List<VirtualCorpus> retrieveVirtualCorpusByUser (String userId) {
+ CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ CriteriaQuery<VirtualCorpus> query =
+ criteriaBuilder.createQuery(VirtualCorpus.class);
+
+ Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
+ virtualCorpus.fetch("accessGroup");
+
+ Join<VirtualCorpus, VirtualCorpusAccessGroup> accessGroup =
+ virtualCorpus.join("accessGroup");
+
+ Predicate corpusStatus = criteriaBuilder.notEqual(
+ accessGroup.get("status"), VirtualCorpusAccessStatus.HIDDEN);
+ Predicate userGroupStatus = criteriaBuilder.notEqual(
+ accessGroup.get("userGroup").get("status"),
+ UserGroupStatus.DELETED);
+
+ Join<VirtualCorpusAccessGroup, UserGroup> userGroupMembers =
+ accessGroup.join("userGroup").join("members");
+
+ Predicate memberStatus = criteriaBuilder.equal(
+ userGroupMembers.get("status"), GroupMemberStatus.ACTIVE);
+
+ Predicate user =
+ criteriaBuilder.equal(userGroupMembers.get("userId"), userId);
+
+ query.select(virtualCorpus);
+ query.where(criteriaBuilder.and(corpusStatus, userGroupStatus,
+ memberStatus, user));
+ Query q = entityManager.createQuery(query);
+ return q.getResultList();
+ }
+
+
+ // EM: what is needed for admin?
+ public List<VirtualCorpus> retrieveVirtualCorpusByAdmin () {
+ return null;
+
+ }
+}
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/UserGroup.java b/full/src/main/java/de/ids_mannheim/korap/entity/UserGroup.java
index 7f29477..d51e00f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/UserGroup.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/UserGroup.java
@@ -4,6 +4,8 @@
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -11,6 +13,10 @@
import javax.persistence.OneToMany;
import javax.persistence.Table;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+
+import de.ids_mannheim.korap.constants.UserGroupStatus;
import lombok.Getter;
import lombok.Setter;
@@ -36,8 +42,12 @@
private String name;
@Column(name = "created_by")
private String createdBy;
+
+ @Enumerated(EnumType.STRING)
+ private UserGroupStatus status;
- @OneToMany(fetch = FetchType.LAZY)
+ @Fetch(FetchMode.SELECT)
+ @OneToMany(mappedBy="group")//, fetch = FetchType.LAZY)
List<UserGroupMember> members;
@OneToMany(mappedBy = "virtualCorpus", fetch = FetchType.LAZY)
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/UserGroupMember.java b/full/src/main/java/de/ids_mannheim/korap/entity/UserGroupMember.java
index 6abe32b..db705c4 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/UserGroupMember.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/UserGroupMember.java
@@ -4,6 +4,8 @@
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -16,6 +18,7 @@
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
+import de.ids_mannheim.korap.constants.GroupMemberStatus;
import lombok.Getter;
import lombok.Setter;
@@ -36,12 +39,14 @@
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "user_id")
- private int userId;
- private String status;
+ private String userId;
@Column(name = "created_by")
private String createdBy;
@Column(name = "deleted_by")
private String deletedBy;
+
+ @Enumerated(EnumType.STRING)
+ private GroupMemberStatus status;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpus.java b/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpus.java
index b100600..ff1d09a 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpus.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpus.java
@@ -4,12 +4,16 @@
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
+import de.ids_mannheim.korap.constants.VirtualCorpusType;
import lombok.Getter;
import lombok.Setter;
@@ -34,7 +38,8 @@
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
- private String type;
+ @Enumerated(EnumType.STRING)
+ private VirtualCorpusType type;
private String status;
private String description;
@Column(name = "required_access")
@@ -45,7 +50,7 @@
@Column(name = "created_by")
private String createdBy;
- @OneToMany(mappedBy = "userGroup")
+ @OneToMany(mappedBy = "userGroup", fetch=FetchType.LAZY)
List<VirtualCorpusAccessGroup> accessGroup;
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpusAccessGroup.java b/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpusAccessGroup.java
index eb1fcb1..76e49eb 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpusAccessGroup.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/VirtualCorpusAccessGroup.java
@@ -2,14 +2,17 @@
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
-import javax.persistence.Index;
+import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
+import de.ids_mannheim.korap.constants.VirtualCorpusAccessStatus;
import lombok.Getter;
import lombok.Setter;
@@ -24,14 +27,12 @@
@Setter
@Getter
@Entity
-@Table(name = "vc_access_group", indexes = {
- @Index(unique = true, columnList = "virtual_corpus_id, group_id") })
+@Table(name = "virtual_corpus_access")
public class VirtualCorpusAccessGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
- private String status;
@Column(name = "created_by")
private String createdBy;
@Column(name = "approved_by")
@@ -39,13 +40,16 @@
@Column(name = "deleted_by")
private String deletedBy;
- @ManyToOne
- @PrimaryKeyJoinColumn(name = "virtual_corpus_id",
+ @Enumerated(EnumType.STRING)
+ private VirtualCorpusAccessStatus status;
+
+ @ManyToOne(fetch=FetchType.LAZY)
+ @JoinColumn(name = "virtual_corpus_id",
referencedColumnName = "id")
private VirtualCorpus virtualCorpus;
- @ManyToOne
- @PrimaryKeyJoinColumn(name = "group_id", referencedColumnName = "id")
+ @ManyToOne(fetch=FetchType.LAZY)
+ @JoinColumn(name = "user_group_id", referencedColumnName = "id")
private UserGroup userGroup;