Added VirtualCorpus DAO methods and tests.
Change-Id: Id178f922578fb5aa2516da9a485ea6a43eaea587
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
index 74b5850..03a042c 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dao/VirtualCorpusDao.java
@@ -1,8 +1,11 @@
package de.ids_mannheim.korap.dao;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
@@ -12,10 +15,12 @@
import javax.persistence.criteria.Root;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
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.constants.VirtualCorpusType;
import de.ids_mannheim.korap.entity.UserGroup;
import de.ids_mannheim.korap.entity.VirtualCorpus;
import de.ids_mannheim.korap.entity.VirtualCorpusAccessGroup;
@@ -35,15 +40,37 @@
private EntityManager entityManager;
+ @Transactional
public void storeVirtualCorpus (VirtualCorpus virtualCorpus) {
- entityManager.getTransaction().begin();
entityManager.persist(virtualCorpus);
- entityManager.getTransaction().commit();
}
- public VirtualCorpus retrieveVirtualCorpusById (int id)
+ @Transactional
+ public void deleteVirtualCorpus (int id) throws KustvaktException {
+ VirtualCorpus vc = retrieveVCById(id);
+ entityManager.remove(vc);
+ }
+
+
+ public List<VirtualCorpus> retrieveVCByType (VirtualCorpusType type)
throws KustvaktException {
+ if (type == null) {
+ throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "type",
+ "null");
+ }
+ 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("type"), type));
+ Query q = entityManager.createQuery(query);
+ return q.getResultList();
+ }
+
+
+ public VirtualCorpus retrieveVCById (int id) throws KustvaktException {
if (id == 0) {
throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "id",
String.valueOf(id));
@@ -54,45 +81,107 @@
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();
+
+ VirtualCorpus vc = null;
+ try {
+ Query q = entityManager.createQuery(query);
+ vc = (VirtualCorpus) q.getSingleResult();
+ }
+ catch (NoResultException e) {
+ throw new KustvaktException(StatusCodes.NO_RESULT_FOUND,
+ "No result found for query: retrieve virtual corpus by id "
+ + id,
+ String.valueOf(id), e);
+ }
+ return vc;
}
- public List<VirtualCorpus> retrieveVirtualCorpusByUser (String userId) {
- CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+ public List<VirtualCorpus> retrievePrivateVC (String userId)
+ throws KustvaktException {
+ if (userId == null || userId.isEmpty()) {
+ throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
+ userId);
+ }
+ CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<VirtualCorpus> query =
- criteriaBuilder.createQuery(VirtualCorpus.class);
+ builder.createQuery(VirtualCorpus.class);
Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
- virtualCorpus.fetch("accessGroup");
+ query.select(virtualCorpus);
+ query.where(builder.equal(virtualCorpus.get("createdBy"), userId));
+ Query q = entityManager.createQuery(query);
+ return q.getResultList();
+ }
+
+
+ public List<VirtualCorpus> retrieveGroupVCByUser (String userId)
+ throws KustvaktException {
+ if (userId == null || userId.isEmpty()) {
+ throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
+ userId);
+ }
+
+ CriteriaBuilder builder = entityManager.getCriteriaBuilder();
+ CriteriaQuery<VirtualCorpus> query =
+ builder.createQuery(VirtualCorpus.class);
+
+ Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
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);
-
+ Predicate corpusStatus = builder.notEqual(accessGroup.get("status"),
+ VirtualCorpusAccessStatus.HIDDEN);
+ Predicate userGroupStatus =
+ builder.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);
+ Predicate memberStatus = builder.equal(userGroupMembers.get("status"),
+ GroupMemberStatus.ACTIVE);
+ Predicate user = builder.equal(userGroupMembers.get("userId"), userId);
query.select(virtualCorpus);
- query.where(criteriaBuilder.and(corpusStatus, userGroupStatus,
- memberStatus, user));
+ query.where(
+ builder.and(corpusStatus, userGroupStatus, memberStatus, user));
+
Query q = entityManager.createQuery(query);
return q.getResultList();
}
+ public Set<VirtualCorpus> retrieveVCByUser (String userId)
+ throws KustvaktException {
+ if (userId == null || userId.isEmpty()) {
+ throw new KustvaktException(StatusCodes.MISSING_ARGUMENT, "userId",
+ userId);
+ }
+ CriteriaBuilder builder = entityManager.getCriteriaBuilder();
+ CriteriaQuery<VirtualCorpus> query =
+ builder.createQuery(VirtualCorpus.class);
+
+ Root<VirtualCorpus> virtualCorpus = query.from(VirtualCorpus.class);
+ Predicate predicate = builder.or(
+ builder.equal(virtualCorpus.get("createdBy"), userId),
+ builder.equal(virtualCorpus.get("type"),
+ VirtualCorpusType.PREDEFINED));
+
+
+ query.select(virtualCorpus);
+ query.where(predicate);
+ query.distinct(true);
+ Query q = entityManager.createQuery(query);
+
+ List<VirtualCorpus> vcList = q.getResultList();
+ List<VirtualCorpus> groupVC = retrieveGroupVCByUser(userId);
+ Set<VirtualCorpus> vcSet = new HashSet<VirtualCorpus>();
+ vcSet.addAll(vcList);
+ vcSet.addAll(groupVC);
+ return vcSet;
+ }
+
+
// 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 d51e00f..f6c2d81 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
@@ -50,7 +50,7 @@
@OneToMany(mappedBy="group")//, fetch = FetchType.LAZY)
List<UserGroupMember> members;
- @OneToMany(mappedBy = "virtualCorpus", fetch = FetchType.LAZY)
+ @OneToMany(mappedBy = "userGroup", fetch = FetchType.LAZY)
private List<VirtualCorpusAccessGroup> virtualCorpusAccessGroup;
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 ff1d09a..06b0a25 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
@@ -50,7 +50,7 @@
@Column(name = "created_by")
private String createdBy;
- @OneToMany(mappedBy = "userGroup", fetch=FetchType.LAZY)
+ @OneToMany(mappedBy = "virtualCorpus", fetch=FetchType.LAZY)
List<VirtualCorpusAccessGroup> accessGroup;
@@ -61,4 +61,20 @@
+ requiredAccess + ", collectionQuery= " + collectionQuery
+ ", definition= " + definition + ", createdBy= " + createdBy;
}
+
+ @Override
+ public int hashCode () {
+ int prime = 37;
+ int result = 1;
+ result = prime * result + id;
+ result = prime * result + name.hashCode();
+ result = prime * result + createdBy.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals (Object obj) {
+ VirtualCorpus vc = (VirtualCorpus) obj;
+ return (this.id == vc.getId()) ? true : false;
+ }
}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/service/full/AnnotationService.java b/full/src/main/java/de/ids_mannheim/korap/web/service/full/AnnotationService.java
index 5055e56..101bba1 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/service/full/AnnotationService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/service/full/AnnotationService.java
@@ -121,7 +121,7 @@
}
else if (codes.isEmpty()) {
throw KustvaktResponseHandler.throwit(new KustvaktException(
- StatusCodes.NO_VALUE_FOUND, "No result found.","codes:[]"));
+ StatusCodes.NO_RESULT_FOUND, "No result found.","codes:[]"));
}
List<AnnotationPair> annotationPairs = null;
@@ -164,7 +164,7 @@
}
else {
throw KustvaktResponseHandler.throwit(new KustvaktException(
- StatusCodes.NO_VALUE_FOUND, "No result found.",""));
+ StatusCodes.NO_RESULT_FOUND, "No result found.",""));
}
}
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/service/full/StatisticService.java b/full/src/main/java/de/ids_mannheim/korap/web/service/full/StatisticService.java
index cb76ca8..ee30523 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/service/full/StatisticService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/service/full/StatisticService.java
@@ -80,7 +80,7 @@
String stats = searchKrill.getStatistics(json);
if (stats.contains("-1"))
- throw KustvaktResponseHandler.throwit(StatusCodes.NO_VALUE_FOUND);
+ throw KustvaktResponseHandler.throwit(StatusCodes.NO_RESULT_FOUND);
jlog.debug("Stats: " + stats);
return Response.ok(stats).build();
}
diff --git a/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql b/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
index d558e47..44b49e3 100644
--- a/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
+++ b/full/src/main/resources/db/new-mysql/V1.1__create_virtual_corpus_tables.sql
@@ -2,7 +2,8 @@
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name varchar(100) NOT NULL,
status varchar(100) NOT NULL,
- created_by varchar(100) NOT NULL
+ created_by varchar(100) NOT NULL,
+ INDEX status_index(status)
);
CREATE TABLE IF NOT EXISTS user_group_member (
@@ -13,15 +14,15 @@
created_by varchar(100) NOT NULL,
deleted_by varchar(100) DEFAULT NULL,
UNIQUE INDEX unique_index (user_id,group_id),
+ INDEX status_index(status),
FOREIGN KEY (group_id)
REFERENCES user_group (id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS role (
- id varchar(100) NOT NULL,
- privilege varchar(100) NOT NULL,
- PRIMARY KEY (id)
+ id varchar(100) PRIMARY KEY NOT NULL,
+ privilege varchar(100) NOT NULL
);
CREATE TABLE IF NOT EXISTS group_member_role (
@@ -46,7 +47,9 @@
description varchar(255) DEFAULT NULL,
status varchar(100) DEFAULT NULL,
collection_query varchar(2000) NOT NULL,
- definition varchar(255) DEFAULT NULL
+ definition varchar(255) DEFAULT NULL,
+ INDEX owner_index (created_by),
+ INDEX type_index (type)
);
CREATE TABLE IF NOT EXISTS virtual_corpus_access (
@@ -58,6 +61,7 @@
approved_by varchar(100) DEFAULT NULL,
deleted_by varchar(100) DEFAULT NULL,
UNIQUE INDEX unique_index (virtual_corpus_id,user_group_id),
+ INDEX status_index(status),
FOREIGN KEY (user_group_id)
REFERENCES user_group (id)
ON DELETE CASCADE,
diff --git a/full/src/main/resources/db/new-mysql/V3.1__insert_virtual_corpus.sql b/full/src/main/resources/db/new-mysql/V3.1__insert_virtual_corpus.sql
index 1d1cc9b..442a39c 100644
--- a/full/src/main/resources/db/new-mysql/V3.1__insert_virtual_corpus.sql
+++ b/full/src/main/resources/db/new-mysql/V3.1__insert_virtual_corpus.sql
@@ -36,6 +36,11 @@
(SELECT id from user_group where name = "dory group"),
"DELETED","dory", "pearl";
+INSERT INTO user_group_member(user_id, group_id, status, created_by)
+ SELECT "pearl",
+ (SELECT id from user_group where name = "auto group"),
+ "ACTIVE","system";
+
-- virtual corpora
INSERT INTO virtual_corpus(name, type, required_access, created_by, description, status, collection_query)
@@ -79,6 +84,6 @@
-- Summary user VC Lists
-- dory: dory VC, group VC, system VC
--- nemo: group VC, published VC, system VC
+-- nemo: group VC, system VC
-- marlin: published VC, system VC
--- pearl: system VC
+-- pearl: system VC, published VC
diff --git a/full/src/main/resources/default-config.xml b/full/src/main/resources/default-config.xml
index c6cd7d2..869059b 100644
--- a/full/src/main/resources/default-config.xml
+++ b/full/src/main/resources/default-config.xml
@@ -97,12 +97,12 @@
<!-- to configure database for sqlite, mysql, etc. migrations -->
<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
- <property name="baselineOnMigrate" value="false" />
+ <property name="baselineOnMigrate" value="true" />
<!-- <property name="validateOnMigrate" value="false" /> -->
<!-- <property name="cleanOnValidationError" value="true" /> -->
<property name="locations" value="${jdbc.schemaPath}" />
- <!-- <property name="dataSource" ref="dataSource" /> -->
- <property name="dataSource" ref="sqliteDataSource" />
+ <property name="dataSource" ref="dataSource" />
+ <!-- <property name="dataSource" ref="sqliteDataSource" /> -->
</bean>