From 16d103e8e438fe26d25d601e29986110a6ac2e83 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 21 Aug 2018 15:49:42 +0200
Subject: [PATCH] OO-3286: limit the queries to the repository entries with
 lectures enabled

---
 .../olat/modules/lecture/LectureService.java  |  8 ++-
 .../lecture/manager/LectureBlockDAO.java      | 14 +++--
 .../lecture/manager/LectureBlockDAOTest.java  | 60 ++++++++++++++++---
 .../olat/restapi/LecturesBlocksRootTest.java  | 16 ++++-
 4 files changed, 82 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/olat/modules/lecture/LectureService.java b/src/main/java/org/olat/modules/lecture/LectureService.java
index 47e8db28553..f41f0640813 100644
--- a/src/main/java/org/olat/modules/lecture/LectureService.java
+++ b/src/main/java/org/olat/modules/lecture/LectureService.java
@@ -402,7 +402,9 @@ public interface LectureService {
 	public List<LectureBlock> getLectureBlocks(RepositoryEntryRef entry);
 	
 	/**
-	 * Search lecture blocks. It returns only lecture blocks with a teacher.
+	 * Search lecture blocks. It returns only lecture blocks with a teacher and
+	 * if the repository entry has the lectures enabled.
+	 * 
 	 * 
 	 * @param searchParams The search parameters
 	 * @return A list of lecture blocks
@@ -427,7 +429,9 @@ public interface LectureService {
 	public List<LectureBlockWithTeachers> getLectureBlocksWithTeachers(RepositoryEntryRef entry, IdentityRef teacher, LecturesBlockSearchParameters searchParams);
 
 	/**
-	 * The list of lecture blocks of a specific teacher
+	 * The list of lecture blocks of a specific teacher. The lecture blocks come
+	 * from repository entry where the lectures are enabled.
+	 * 
 	 * @param teacher The teacher to search with.
 	 * @return A list of lecture blocks.
 	 */
diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java
index 9fa718cfab6..3478e6c6c69 100644
--- a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java
+++ b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java
@@ -168,9 +168,12 @@ public class LectureBlockDAO {
 		  .append(" inner join block.teacherGroup tGroup")
 		  .append(" inner join tGroup.members membership")
 		  .append(" inner join fetch block.entry entry");
-		boolean where = false;
-		where = addSearchParametersToQuery(sb, where, searchParams);
-		
+		boolean where = addSearchParametersToQuery(sb, false, searchParams);
+		where = PersistenceHelper.appendAnd(sb, where);
+		sb.append(" exists (select config.key from lectureentryconfig config")
+		  .append("   where config.entry.key=entry.key and config.lectureEnabled=true")
+		  .append(" )");
+
 		TypedQuery<LectureBlock> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), LectureBlock.class);
 		addSearchParametersToQuery(query, searchParams);
@@ -185,7 +188,10 @@ public class LectureBlockDAO {
 		  .append(" inner join fetch block.entry entry")
 		  .append(" where membership.identity.key=:teacherKey");
 		addSearchParametersToQuery(sb, true, searchParams);
-		
+		sb.append(" and exists (select config.key from lectureentryconfig config")
+		  .append("   where config.entry.key=entry.key and config.lectureEnabled=true")
+		  .append(" )");
+
 		TypedQuery<LectureBlock> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), LectureBlock.class)
 				.setParameter("teacherKey", identityRef.getKey());
diff --git a/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java b/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java
index 39ee466c69f..b9b1ceeaa12 100644
--- a/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java
+++ b/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java
@@ -152,7 +152,7 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	public void searchLectureBlocks() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("lec-teacher-1");
 		Identity lectureManager = JunitTestHelper.createAndPersistIdentityAsRndUser("lec-manager-1");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
 		repositoryEntryRelationDao.addRole(lectureManager, entry, OrganisationRoles.lecturemanager.name());
 		LectureBlock lectureBlock = lectureBlockDao.createLectureBlock(entry);
 		lectureBlock.setStartDate(new Date());
@@ -171,6 +171,27 @@ public class LectureBlockDAOTest extends OlatTestCase {
 		Assert.assertEquals(lectureBlock, loadedBlock);
 	}
 	
+	@Test
+	public void searchLectureBlocks_lectureDisabled() {
+		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("lec-teacher-1");
+		Identity lectureManager = JunitTestHelper.createAndPersistIdentityAsRndUser("lec-manager-1");
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		repositoryEntryRelationDao.addRole(lectureManager, entry, OrganisationRoles.lecturemanager.name());
+		LectureBlock lectureBlock = lectureBlockDao.createLectureBlock(entry);
+		lectureBlock.setStartDate(new Date());
+		lectureBlock.setEndDate(new Date());
+		lectureBlock.setTitle("Hello lecture manager");
+		lectureBlock = lectureBlockDao.update(lectureBlock);
+		lectureService.addTeacher(lectureBlock, teacher);
+		dbInstance.commitAndCloseSession();
+
+		LecturesBlockSearchParameters searchParams = new LecturesBlockSearchParameters();
+		searchParams.setManager(lectureManager);
+		List<LectureBlock> blocks = lectureBlockDao.searchLectureBlocks(searchParams);
+		Assert.assertNotNull(blocks);
+		Assert.assertTrue(blocks.isEmpty());
+	}
+	
 	@Test
 	public void getLectureBlocks_all() {
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
@@ -190,10 +211,9 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	@Test
 	public void loadByTeachers() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-1");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
 		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
 		dbInstance.commitAndCloseSession();
-
 		lectureService.addTeacher(lectureBlock, teacher);
 		dbInstance.commitAndCloseSession();
 		
@@ -206,11 +226,27 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	}
 	
 	@Test
-	public void loadByTeachers_searchString() {
+	public void loadByTeachers_lectureDisabled() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-1");
 		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
 		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
 		dbInstance.commitAndCloseSession();
+		lectureService.addTeacher(lectureBlock, teacher);
+		dbInstance.commitAndCloseSession();
+		
+		//search all
+		LecturesBlockSearchParameters searchParams = new LecturesBlockSearchParameters();
+		List<LectureBlock> blocks = lectureBlockDao.loadByTeacher(teacher, searchParams);
+		Assert.assertNotNull(blocks);
+		Assert.assertTrue(blocks.isEmpty());
+	}
+	
+	@Test
+	public void loadByTeachers_searchString() {
+		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-1");
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
+		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
+		dbInstance.commitAndCloseSession();
 
 		lectureService.addTeacher(lectureBlock, teacher);
 		dbInstance.commitAndCloseSession();
@@ -234,7 +270,7 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	@Test
 	public void loadByTeachers_startEndDates() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-1");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
 		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
 		dbInstance.commitAndCloseSession();
 
@@ -267,7 +303,7 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	@Test
 	public void loadByTeachers_startDate() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-3");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
 		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
 		dbInstance.commitAndCloseSession();
 
@@ -296,7 +332,7 @@ public class LectureBlockDAOTest extends OlatTestCase {
 	@Test
 	public void loadByTeachers_endDate() {
 		Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-3");
-		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		RepositoryEntry entry = createResourceWithLecturesEnabled();
 		LectureBlock lectureBlock = createMinimalLectureBlock(entry);
 		dbInstance.commitAndCloseSession();
 
@@ -559,6 +595,16 @@ public class LectureBlockDAOTest extends OlatTestCase {
 		Assert.assertNull(deletedBlock);
 	}
 	
+	private RepositoryEntry createResourceWithLecturesEnabled() {
+		RepositoryEntry entry = JunitTestHelper.createAndPersistRepositoryEntry();
+		dbInstance.commit();
+		RepositoryEntryLectureConfiguration config = lectureService.getRepositoryEntryLectureConfiguration(entry);
+		config.setLectureEnabled(true);
+		lectureService.updateRepositoryEntryLectureConfiguration(config);
+		dbInstance.commit();
+		return entry;
+	}
+	
 	private LectureBlock createMinimalLectureBlock(RepositoryEntry entry) {
 		LectureBlock lectureBlock = lectureBlockDao.createLectureBlock(entry);
 		Calendar cal = Calendar.getInstance();
diff --git a/src/test/java/org/olat/restapi/LecturesBlocksRootTest.java b/src/test/java/org/olat/restapi/LecturesBlocksRootTest.java
index 364d0254743..88d3bcecd32 100644
--- a/src/test/java/org/olat/restapi/LecturesBlocksRootTest.java
+++ b/src/test/java/org/olat/restapi/LecturesBlocksRootTest.java
@@ -39,6 +39,7 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.modules.lecture.LectureBlock;
 import org.olat.modules.lecture.LectureService;
+import org.olat.modules.lecture.RepositoryEntryLectureConfiguration;
 import org.olat.modules.lecture.restapi.LectureBlockVO;
 import org.olat.repository.RepositoryEntry;
 import org.olat.test.JunitTestHelper;
@@ -72,7 +73,7 @@ public class LecturesBlocksRootTest extends OlatJerseyTestCase {
 	throws IOException, URISyntaxException {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndAuthor("lect-root-all");
 		
-		RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author);
+		RepositoryEntry entry = deployCourseWithLecturesEnabled(author);
 		LectureBlock block = createLectureBlock(entry);
 		dbInstance.commit();
 		lectureService.addTeacher(block, author);
@@ -114,7 +115,7 @@ public class LecturesBlocksRootTest extends OlatJerseyTestCase {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndAuthor("lect-root-all");
 		Identity user = JunitTestHelper.createAndPersistIdentityAsRndAuthor("lect-root-hacker");
 		
-		RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author);
+		RepositoryEntry entry = deployCourseWithLecturesEnabled(author);
 		LectureBlock block = createLectureBlock(entry);
 		dbInstance.commit();
 		lectureService.addTeacher(block, author);
@@ -134,7 +135,7 @@ public class LecturesBlocksRootTest extends OlatJerseyTestCase {
 	public void getLecturesBlock_date()
 	throws IOException, URISyntaxException {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndAuthor("lect-root-1");
-		RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author);
+		RepositoryEntry entry = deployCourseWithLecturesEnabled(author);
 		LectureBlock block = createLectureBlock(entry);
 		dbInstance.commit();
 		lectureService.addTeacher(block, author);
@@ -165,6 +166,15 @@ public class LecturesBlocksRootTest extends OlatJerseyTestCase {
 		Assert.assertEquals(entry.getKey(), lectureBlockVo.getRepoEntryKey());
 	}
 	
+	private RepositoryEntry deployCourseWithLecturesEnabled(Identity author) {
+		RepositoryEntry entry = JunitTestHelper.deployBasicCourse(author);
+		RepositoryEntryLectureConfiguration config = lectureService.getRepositoryEntryLectureConfiguration(entry);
+		config.setLectureEnabled(true);
+		lectureService.updateRepositoryEntryLectureConfiguration(config);
+		dbInstance.commit();
+		return entry;
+	}
+	
 	private LectureBlock createLectureBlock(RepositoryEntry entry) {
 		LectureBlock lectureBlock = lectureService.createLectureBlock(entry);
 		lectureBlock.setStartDate(new Date());
-- 
GitLab