From 3c6d951b41303262e48e9392e54acd08f0f60b32 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Fri, 16 Nov 2018 14:12:31 +0100
Subject: [PATCH] OO-3304: Delete 	unappropriated report accesses

---
 .../manager/QualityReportAccessDAO.java       | 32 +++++++++++++++++
 .../quality/manager/QualityServiceImpl.java   |  1 +
 .../manager/QualityReportAccessDAOTest.java   | 35 +++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java b/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java
index ca8efe04d88..814150d75cb 100644
--- a/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java
+++ b/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java
@@ -127,6 +127,38 @@ class QualityReportAccessDAO {
 		}
 		query.executeUpdate();
 	}
+	
+	/**
+	 * Delete unappropriated report accesses. A report access is unappropriated, if
+	 * it has no access and the email should never be sent. Just a little
+	 * optimization.
+	 *
+	 * @param reference
+	 */
+	void deleteUnappropriated(QualityReportAccessReference reference) {
+		if (reference == null) return;
+		
+		QueryBuilder sb = new QueryBuilder(256);
+		sb.append("delete from qualityreportaccess as reportaccess");
+		sb.and().append("reportaccess.online = false");
+		sb.and().append("reportaccess.emailTrigger = '").append(EmailTrigger.never).append("'");
+		if (reference.getDataCollectionRef() != null) {
+			sb.and().append("reportaccess.dataCollection.key = :dataCollectionKey");
+		}
+		if (reference.getGeneratorRef() != null) {
+			sb.and().append("reportaccess.generator.key = :generatorKey");
+		}
+
+		Query query = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString());
+		if (reference.getDataCollectionRef() != null) {
+			query.setParameter("dataCollectionKey", reference.getDataCollectionRef().getKey());
+		}
+		if (reference.getGeneratorRef() != null) {
+			query.setParameter("generatorKey", reference.getGeneratorRef().getKey());
+		}
+		query.executeUpdate();
+	}
 
 	List<QualityReportAccess> load(QualityReportAccessSearchParams searchParams) {
 		QueryBuilder sb = new QueryBuilder();
diff --git a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
index aa7a9936e23..366fa0bc6d8 100644
--- a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
+++ b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java
@@ -277,6 +277,7 @@ public class QualityServiceImpl
 			QualityDataCollectionStatus previousStatus = dataCollection.getStatus();
 			updatedDataCollection = dataCollectionDao.updateDataCollectionStatus(dataCollection, status);
 			if (QualityDataCollectionStatus.FINISHED.equals(status) && !QualityDataCollectionStatus.FINISHED.equals(previousStatus)) {
+				reportAccessDao.deleteUnappropriated(of(updatedDataCollection));
 				sendReportAccessMails(dataCollection);
 			}
 			log.info("Status of quality data collection updated to " + status + ". " + updatedDataCollection.toString());
diff --git a/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java b/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java
index 84c39a78827..77b3a8effb7 100644
--- a/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java
+++ b/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java
@@ -226,6 +226,41 @@ public class QualityReportAccessDAOTest extends OlatTestCase {
 		assertThat(accessesOther).contains(reportAccessOther);
 	}
 	
+	@Test
+	public void shouldDeleteUnappropriate() {
+		QualityDataCollectionRef dc = qualityTestHelper.createDataCollection();
+		QualityReportAccess raAlways = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null);
+		raAlways.setEmailTrigger(EmailTrigger.insufficient);
+		sut.save(raAlways);
+		QualityReportAccess raOnline = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null);
+		raOnline.setOnline(true);
+		sut.save(raOnline);
+		QualityReportAccess raUnappropriated = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null);
+		raUnappropriated.setOnline(false);
+		raUnappropriated.setEmailTrigger(EmailTrigger.never);
+		sut.save(raUnappropriated);
+		QualityDataCollectionRef dcOther = qualityTestHelper.createDataCollection();
+		QualityReportAccess raUnappropriatedOther = sut.create(of(dcOther), QualityReportAccess.Type.TopicIdentity, null);
+		raUnappropriatedOther.setOnline(false);
+		raUnappropriatedOther.setEmailTrigger(EmailTrigger.never);
+		sut.save(raUnappropriatedOther);
+		dbInstance.commitAndCloseSession();
+		
+		sut.deleteUnappropriated(of(dc));
+		dbInstance.commitAndCloseSession();
+		
+		QualityReportAccessSearchParams searchParams = new QualityReportAccessSearchParams();
+		searchParams.setReference(of(dc));
+		List<QualityReportAccess> accesses = sut.load(searchParams);
+		assertThat(accesses)
+				.containsExactlyInAnyOrder(raOnline, raAlways)
+				.doesNotContain(raUnappropriated);
+		
+		searchParams.setReference(of(dcOther));
+		List<QualityReportAccess> accessesOther = sut.load(searchParams);
+		assertThat(accessesOther).containsExactly(raUnappropriatedOther);
+	}
+	
 	@Test
 	public void shouldFilterByDataCollection() {
 		QualityDataCollectionRef dc = qualityTestHelper.createDataCollection();
-- 
GitLab