From 180acafe94881d568945135aefdd1037fddf1769 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 19 Mar 2019 16:56:42 +0100
Subject: [PATCH] OO-3977: filter type in memory for some kind of resources
 queries

---
 .../RepositoryEntryAuthorViewResults.java     |  47 +++++
 .../olat/repository/RepositoryService.java    |   2 +-
 .../manager/RepositoryEntryAuthorQueries.java |  35 +++-
 .../manager/RepositoryServiceImpl.java        |   4 +-
 .../ui/author/AuthoringEntryDataSource.java   |   8 +-
 .../RepositoryEntryAuthorQueriesTest.java     | 184 +++++++++++-------
 6 files changed, 190 insertions(+), 90 deletions(-)
 create mode 100644 src/main/java/org/olat/repository/RepositoryEntryAuthorViewResults.java

diff --git a/src/main/java/org/olat/repository/RepositoryEntryAuthorViewResults.java b/src/main/java/org/olat/repository/RepositoryEntryAuthorViewResults.java
new file mode 100644
index 00000000000..24f1aa03005
--- /dev/null
+++ b/src/main/java/org/olat/repository/RepositoryEntryAuthorViewResults.java
@@ -0,0 +1,47 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.repository;
+
+import java.util.List;
+
+/**
+ * 
+ * Initial date: 19 mars 2019<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class RepositoryEntryAuthorViewResults {
+	
+	private final boolean complete;
+	private final List<RepositoryEntryAuthorView> views;
+	
+	public RepositoryEntryAuthorViewResults(List<RepositoryEntryAuthorView> views, boolean complete) {
+		this.views = views;
+		this.complete = complete;
+	}
+
+	public boolean isComplete() {
+		return complete;
+	}
+
+	public List<RepositoryEntryAuthorView> getViews() {
+		return views;
+	}
+}
diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java
index bbac9152fbe..2f5ba53065e 100644
--- a/src/main/java/org/olat/repository/RepositoryService.java
+++ b/src/main/java/org/olat/repository/RepositoryService.java
@@ -311,7 +311,7 @@ public interface RepositoryService {
 
 	public int countAuthorView(SearchAuthorRepositoryEntryViewParams params);
 
-	public List<RepositoryEntryAuthorView> searchAuthorView(SearchAuthorRepositoryEntryViewParams params, int firstResult, int maxResults);
+	public RepositoryEntryAuthorViewResults searchAuthorView(SearchAuthorRepositoryEntryViewParams params, int firstResult, int maxResults);
 	
 	
 	/**
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
index 4f3be232525..97cdb268715 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
@@ -41,6 +41,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.modules.lecture.LectureModule;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryAuthorView;
+import org.olat.repository.RepositoryEntryAuthorViewResults;
 import org.olat.repository.RepositoryEntryStatusEnum;
 import org.olat.repository.model.RepositoryEntryAuthorImpl;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams;
@@ -78,21 +79,31 @@ public class RepositoryEntryAuthorQueries {
 			log.error("No identity defined for query");
 			return 0;
 		}
-		
-		TypedQuery<Number> query = createViewQuery(params, Number.class);
+
+		TypedQuery<Number> query = createViewQuery(params, false, Number.class);
 		Number count = query.getSingleResult();
 		return count == null ? 0 : count.intValue();
 	}
 
-	public List<RepositoryEntryAuthorView> searchViews(SearchAuthorRepositoryEntryViewParams params, int firstResult, int maxResults) {
+	public RepositoryEntryAuthorViewResults searchViews(SearchAuthorRepositoryEntryViewParams params, int firstResult, int maxResults) {
 		if(params.getIdentity() == null) {
 			log.error("No identity defined for query");
-			return Collections.emptyList();
+			return new RepositoryEntryAuthorViewResults(Collections.emptyList(), true);
+		}
+		
+		List<String> inMemoryTypes = null;
+		if(params.isOwnedResourcesOnly() && params.isResourceTypesDefined()) {
+			maxResults = -1;
+			if(params.getResourceTypes().size() == 1) {
+				inMemoryTypes = Collections.singletonList(params.getResourceTypes().get(0));
+			} else {
+				inMemoryTypes = params.getResourceTypes();
+			}
 		}
 
-		TypedQuery<Object[]> query = createViewQuery(params, Object[].class);
+		TypedQuery<Object[]> query = createViewQuery(params, inMemoryTypes != null, Object[].class);
 		query.setFirstResult(firstResult);
-		if(maxResults > 0) {
+		if(maxResults > 0 && inMemoryTypes == null) {
 			query.setMaxResults(maxResults);
 		}
 		
@@ -100,6 +111,10 @@ public class RepositoryEntryAuthorQueries {
 		List<RepositoryEntryAuthorView> views = new ArrayList<>(objects.size());
 		for(Object[] object:objects) {
 			RepositoryEntry re = (RepositoryEntry)object[0];
+			if(inMemoryTypes != null &&!inMemoryTypes.contains(re.getOlatResource().getResourceableTypeName())) {
+				continue;
+			}
+			
 			Number numOfMarks = (Number)object[1];
 			boolean hasMarks = numOfMarks != null && numOfMarks.longValue() > 0;
 			Number numOffers = (Number)object[2];
@@ -125,10 +140,10 @@ public class RepositoryEntryAuthorQueries {
 			
 			views.add(new RepositoryEntryAuthorImpl(re, hasMarks, offers, references, deletedByName, lectureEnabled, rollCallEnabled));
 		}
-		return views;
+		return new RepositoryEntryAuthorViewResults(views, inMemoryTypes != null);
 	}
 
-	protected <T> TypedQuery<T> createViewQuery(SearchAuthorRepositoryEntryViewParams params,
+	protected <T> TypedQuery<T> createViewQuery(SearchAuthorRepositoryEntryViewParams params, boolean inMemoryTypes,
 			Class<T> type) {
 
 		IdentityRef identity = params.getIdentity();
@@ -188,7 +203,7 @@ public class RepositoryEntryAuthorQueries {
 			sb.append(" exists (select ref.key from references as ref where ref.target.key=res.key)");
 		}
 
-		if (params.isResourceTypesDefined()) {
+		if (params.isResourceTypesDefined() && !inMemoryTypes) {
 			sb.append(" and res.resName in (:resourcetypes)");
 		}
 		if(params.getMarked() != null && params.getMarked().booleanValue()) {
@@ -284,7 +299,7 @@ public class RepositoryEntryAuthorQueries {
 
 		TypedQuery<T> dbQuery = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), type);
-		if (params.isResourceTypesDefined()) {
+		if (params.isResourceTypesDefined() && !inMemoryTypes) {
 			dbQuery.setParameter("resourcetypes", resourceTypes);
 		}
 		if(id != null) {
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index ecff11dbf90..2417a52d1cd 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -79,7 +79,7 @@ import org.olat.modules.taxonomy.TaxonomyLevelRef;
 import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryAllowToLeaveOptions;
-import org.olat.repository.RepositoryEntryAuthorView;
+import org.olat.repository.RepositoryEntryAuthorViewResults;
 import org.olat.repository.RepositoryEntryDataDeletable;
 import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryEntryMyView;
@@ -815,7 +815,7 @@ public class RepositoryServiceImpl implements RepositoryService, OrganisationDat
 	}
 
 	@Override
-	public List<RepositoryEntryAuthorView> searchAuthorView(SearchAuthorRepositoryEntryViewParams params,
+	public RepositoryEntryAuthorViewResults searchAuthorView(SearchAuthorRepositoryEntryViewParams params,
 			int firstResult, int maxResults) {
 		return authorViewQueries.searchViews(params, firstResult, maxResults);
 	}
diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java
index cde39c10b06..bb38672b320 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java
@@ -32,13 +32,14 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DefaultResultInfos;
 import org.olat.core.commons.persistence.ResultInfos;
 import org.olat.core.commons.persistence.SortKey;
-import org.olat.core.commons.services.license.ResourceLicense;
 import org.olat.core.commons.services.license.LicenseService;
+import org.olat.core.commons.services.license.ResourceLicense;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataSourceDelegate;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.StringHelper;
 import org.olat.repository.RepositoryEntryAuthorView;
+import org.olat.repository.RepositoryEntryAuthorViewResults;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams.OrderBy;
@@ -128,10 +129,11 @@ public class AuthoringEntryDataSource implements FlexiTableDataSourceDelegate<Au
 			searchParams.setIdRefsAndTitle(null);
 		}
 		
-		List<RepositoryEntryAuthorView> views = repositoryService.searchAuthorView(searchParams, firstResult, maxResults);
+		RepositoryEntryAuthorViewResults viewResults = repositoryService.searchAuthorView(searchParams, firstResult, maxResults);
+		List<RepositoryEntryAuthorView> views = viewResults.getViews();
 		List<AuthoringEntryRow> rows = processViewModel(views);
 		ResultInfos<AuthoringEntryRow> results = new DefaultResultInfos<>(firstResult + rows.size(), -1, rows);
-		if(firstResult == 0 && views.size() < maxResults) {
+		if(viewResults.isComplete() || (firstResult == 0 && views.size() < maxResults)) {
 			count = Integer.valueOf(views.size() );
 		}
 		return results;
diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java
index 18ff7774087..598a39712b1 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java
@@ -30,6 +30,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryAuthorView;
+import org.olat.repository.RepositoryEntryAuthorViewResults;
 import org.olat.repository.RepositoryEntryStatusEnum;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams;
@@ -70,8 +71,9 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 			= new SearchAuthorRepositoryEntryViewParams(id, roles);
 		params.setMarked(Boolean.TRUE);
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
-		Assert.assertNotNull(views);
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
+		Assert.assertNotNull(results);
+		Assert.assertNotNull(results.getViews());
 	}
 	
 	@Test
@@ -83,8 +85,9 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 			= new SearchAuthorRepositoryEntryViewParams(id, null);
 		params.setMarked(Boolean.TRUE);
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
-		Assert.assertNotNull(views);
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
+		Assert.assertNotNull(results);
+		Assert.assertNotNull(results.getViews());
 	}
 	
 	@Test
@@ -97,8 +100,9 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 			= new SearchAuthorRepositoryEntryViewParams(id, roles);
 		params.setDeleted(true);
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
-		Assert.assertNotNull(views);
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
+		Assert.assertNotNull(results);
+		Assert.assertNotNull(results.getViews());
 	}
 	
 	/**
@@ -117,9 +121,9 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(reOwner, views));
-		Assert.assertFalse(contains(reNotOwner, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(reOwner, results));
+		Assert.assertFalse(contains(reNotOwner, results));
 	}
 	
 	/**
@@ -147,12 +151,12 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(reOwner, views));
-		Assert.assertFalse(contains(reNotOwner, views));
-		Assert.assertTrue(contains(reNotOwnerButCopy, views));
-		Assert.assertTrue(contains(reNotOwnerButReference, views));
-		Assert.assertTrue(contains(reNotOwnerButDownload, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(reOwner, results));
+		Assert.assertFalse(contains(reNotOwner, results));
+		Assert.assertTrue(contains(reNotOwnerButCopy, results));
+		Assert.assertTrue(contains(reNotOwnerButReference, results));
+		Assert.assertTrue(contains(reNotOwnerButDownload, results));
 	}
 	
 	/**
@@ -174,10 +178,10 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 		params.setIdAndRefs(reOwner.getKey().toString());
 
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(reOwner, views));
-		Assert.assertFalse(contains(reNotOwner, views));
-		Assert.assertFalse(contains(reNotOwnerButCopy, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(reOwner, results));
+		Assert.assertFalse(contains(reNotOwner, results));
+		Assert.assertFalse(contains(reNotOwnerButCopy, results));
 	}
 	
 	/**
@@ -215,14 +219,14 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertFalse(contains(rePreparation, views));
-		Assert.assertTrue(contains(reReview, views));
-		Assert.assertTrue(contains(reCoachPublished, views));
-		Assert.assertTrue(contains(rePublished, views));
-		Assert.assertTrue(contains(reClosed, views));
-		Assert.assertFalse(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertFalse(contains(rePreparation, results));
+		Assert.assertTrue(contains(reReview, results));
+		Assert.assertTrue(contains(reCoachPublished, results));
+		Assert.assertTrue(contains(rePublished, results));
+		Assert.assertTrue(contains(reClosed, results));
+		Assert.assertFalse(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
 	}
 	
 	/**
@@ -253,14 +257,14 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertFalse(contains(rePreparation, views));
-		Assert.assertFalse(contains(reReview, views));
-		Assert.assertFalse(contains(reCoachPublished, views));
-		Assert.assertTrue(contains(rePublished, views));
-		Assert.assertTrue(contains(reClosed, views));
-		Assert.assertFalse(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertFalse(contains(rePreparation, results));
+		Assert.assertFalse(contains(reReview, results));
+		Assert.assertFalse(contains(reCoachPublished, results));
+		Assert.assertTrue(contains(rePublished, results));
+		Assert.assertTrue(contains(reClosed, results));
+		Assert.assertFalse(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
 	}
 	
 	/**
@@ -300,14 +304,14 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		params.setDeleted(true);
 		params.setOwnedResourcesOnly(true);
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertFalse(contains(rePreparation, views));
-		Assert.assertFalse(contains(reReview, views));
-		Assert.assertFalse(contains(reCoachPublished, views));
-		Assert.assertFalse(contains(rePublished, views));
-		Assert.assertFalse(contains(reClosed, views));
-		Assert.assertTrue(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertFalse(contains(rePreparation, results));
+		Assert.assertFalse(contains(reReview, results));
+		Assert.assertFalse(contains(reCoachPublished, results));
+		Assert.assertFalse(contains(rePublished, results));
+		Assert.assertFalse(contains(reClosed, results));
+		Assert.assertTrue(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
 	}
 	
 	/**
@@ -337,14 +341,41 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(rePreparation, views));
-		Assert.assertTrue(contains(reReview, views));
-		Assert.assertTrue(contains(reCoachPublished, views));
-		Assert.assertTrue(contains(rePublished, views));
-		Assert.assertTrue(contains(reClosed, views));
-		Assert.assertFalse(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(rePreparation, results));
+		Assert.assertTrue(contains(reReview, results));
+		Assert.assertTrue(contains(reCoachPublished, results));
+		Assert.assertTrue(contains(rePublished, results));
+		Assert.assertTrue(contains(reClosed, results));
+		Assert.assertFalse(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
+	}
+	
+	/**
+	 * Check the visibility of entries with different status as an author.
+	 */
+	@Test
+	public void searchViews_status_asOwner() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndLearnResourceManager("view-4-");
+		
+		// a set of entries with every possible status
+		RepositoryEntry reOwned = JunitTestHelper.createAndPersistRepositoryEntry(true);
+		reOwned = repositoryManager.setAccess(reOwned, RepositoryEntryStatusEnum.preparation, true, true);
+		repositoryEntryRelationDao.addRole(id, reOwned, GroupRoles.owner.name());
+		RepositoryEntry reOwned2 = JunitTestHelper.createAndPersistRepositoryEntry(true);
+		reOwned2 = repositoryManager.setAccess(reOwned2, RepositoryEntryStatusEnum.preparation, true, true);
+		repositoryEntryRelationDao.addRole(id, reOwned2, GroupRoles.owner.name());
+		dbInstance.commitAndCloseSession();
+		
+		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
+		params.setOwnedResourcesOnly(true);
+		params.addResourceTypes(reOwned.getOlatResource().getResourceableTypeName());
+		params.addResourceTypes(reOwned2.getOlatResource().getResourceableTypeName());
+		
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, 1);
+		Assert.assertTrue(contains(reOwned, results));
+		Assert.assertEquals(2, results.getViews().size());
+		Assert.assertTrue(results.isComplete());
 	}
 	
 	/**
@@ -374,14 +405,14 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.administratorRoles());
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(rePreparation, views));
-		Assert.assertTrue(contains(reReview, views));
-		Assert.assertTrue(contains(reCoachPublished, views));
-		Assert.assertTrue(contains(rePublished, views));
-		Assert.assertTrue(contains(reClosed, views));
-		Assert.assertFalse(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(rePreparation, results));
+		Assert.assertTrue(contains(reReview, results));
+		Assert.assertTrue(contains(reCoachPublished, results));
+		Assert.assertTrue(contains(rePublished, results));
+		Assert.assertTrue(contains(reClosed, results));
+		Assert.assertFalse(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
 	}
 	
 	/**
@@ -412,14 +443,14 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.administratorRoles());
 		params.setDeleted(true);
 		
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertFalse(contains(rePreparation, views));
-		Assert.assertFalse(contains(reReview, views));
-		Assert.assertFalse(contains(reCoachPublished, views));
-		Assert.assertFalse(contains(rePublished, views));
-		Assert.assertFalse(contains(reClosed, views));
-		Assert.assertTrue(contains(reTrash, views));
-		Assert.assertFalse(contains(reDeleted, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertFalse(contains(rePreparation, results));
+		Assert.assertFalse(contains(reReview, results));
+		Assert.assertFalse(contains(reCoachPublished, results));
+		Assert.assertFalse(contains(rePublished, results));
+		Assert.assertFalse(contains(reClosed, results));
+		Assert.assertTrue(contains(reTrash, results));
+		Assert.assertFalse(contains(reDeleted, results));
 	}
 	
 	/**
@@ -436,8 +467,8 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		SearchAuthorRepositoryEntryViewParams params = new SearchAuthorRepositoryEntryViewParams(id, Roles.authorRoles());
 		params.setOwnedResourcesOnly(true);
 
-		List<RepositoryEntryAuthorView> views = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
-		Assert.assertTrue(contains(reOwner, views));
+		RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1);
+		Assert.assertTrue(contains(reOwner, results));
 	}
 	
 	@Test
@@ -453,15 +484,20 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase {
 		for(OrderBy orderBy:OrderBy.values()) {
 			params.setOrderBy(orderBy);
 			params.setOrderByAsc(true);
-			List<RepositoryEntryAuthorView> viewAsc = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
-			Assert.assertNotNull(viewAsc);
+			RepositoryEntryAuthorViewResults resultsAsc = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
+			Assert.assertNotNull(resultsAsc);
+			Assert.assertNotNull(resultsAsc.getViews());
 			params.setOrderByAsc(false);
-			List<RepositoryEntryAuthorView> viewDesc = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
-			Assert.assertNotNull(viewDesc);
+			RepositoryEntryAuthorViewResults resultsDesc = repositoryEntryAuthorViewQueries.searchViews(params, 0, 10);
+			Assert.assertNotNull(resultsDesc);
+			Assert.assertNotNull(resultsDesc.getViews());
 		}
 	}
 	
-	private final boolean contains(RepositoryEntry re, List<RepositoryEntryAuthorView> views) {
+	private final boolean contains(RepositoryEntry re, RepositoryEntryAuthorViewResults results) {
+		if(results == null || results.getViews() == null) return false;
+		
+		List<RepositoryEntryAuthorView> views = results.getViews();
 		for(RepositoryEntryAuthorView view:views) {
 			if(re.getKey().equals(view.getKey())) {
 				return true;
-- 
GitLab