From 91506155a0f248bb82591c61b57b0acba90c2457 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 10 Nov 2015 11:19:13 +0100
Subject: [PATCH] OO-1616: fix my courses as guest

---
 .../RepositoryEntryMyCourseQueries.java       | 35 +++++++++++++++----
 .../OverviewRepositoryListController.java     |  2 +-
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
index ba043803854..48b762218b9 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryMyCourseQueries.java
@@ -150,6 +150,7 @@ public class RepositoryEntryMyCourseQueries {
 		Identity identity = params.getIdentity();
 		List<String> resourceTypes = params.getResourceTypes();
 
+		boolean needIdentityKey = false;
 		boolean count = Number.class.equals(type);
 		boolean oracle = "oracle".equals(dbInstance.getDbVendor());
 		StringBuilder sb = new StringBuilder();
@@ -164,6 +165,7 @@ public class RepositoryEntryMyCourseQueries {
 			if(params.getMarked() != null && params.getMarked().booleanValue()) {
 				sb.append(" 1 as marks,");
 			} else {
+				needIdentityKey = true;
 				sb.append(" (select count(mark.key) from ").append(MarkImpl.class.getName()).append(" as mark ")
 				  .append("   where mark.creator.key=:identityKey and mark.resId=v.key and mark.resName='RepositoryEntry'")
 				  .append(" ) as marks,");
@@ -173,16 +175,18 @@ public class RepositoryEntryMyCourseQueries {
 			  //TODO validity
 			  .append(" ) as offers, ");
 			if(repositoryModule.isRatingEnabled()) {
+				needIdentityKey = true;
 				sb.append(" (select rating.rating from userrating as rating")
 				  .append("   where rating.resId=v.key and rating.creator.key=:identityKey and rating.resName='RepositoryEntry'")
 				  .append(" ) as myrating");
 			} else {
 				sb.append(" 0 as myrating");
 			}
+			needIdentityKey = true;
 			sb.append(" ,(select eff.key from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff")
 			  .append("    where eff.resource=res and eff.identity.key=:identityKey")
 			  .append(" ) as effKey");
-			appendOrderByInSelect(params, sb);
+			needIdentityKey |= appendOrderByInSelect(params, sb);
 			sb.append(" from repositoryentry as v")
 			  .append(" inner join ").append(oracle ? "" : "fetch").append(" v.olatResource as res");
 			if(repositoryModule.isRatingEnabled() || repositoryModule.isCommentEnabled()) {
@@ -194,14 +198,14 @@ public class RepositoryEntryMyCourseQueries {
 		//efficiency statements
 
 		sb.append(" where ");
-		appendMyViewAccessSubSelect(sb, roles, params.getFilters(), params.isMembershipMandatory());
+		needIdentityKey |= appendMyViewAccessSubSelect(sb, roles, params.getFilters(), params.isMembershipMandatory());
 		if(params.getRepoEntryKeys() != null && params.getRepoEntryKeys().size() > 0) {
 			sb.append(" and v.key in (:repoEntryKeys) ");
 		}
 		
 		if(params.getFilters() != null) {
 			for(Filter filter:params.getFilters()) {
-				appendFiltersInWhereClause(filter, sb);
+				needIdentityKey |= appendFiltersInWhereClause(filter, sb);
 			}
 		}
 		
@@ -327,11 +331,15 @@ public class RepositoryEntryMyCourseQueries {
 		if (StringHelper.containsNonWhitespace(author)) { // fuzzy author search
 			dbQuery.setParameter("author", author);
 		}
-		dbQuery.setParameter("identityKey", identity.getKey());
+		if(needIdentityKey) {
+			dbQuery.setParameter("identityKey", identity.getKey());
+		}
 		return dbQuery;
 	}
 	
-	private void appendMyViewAccessSubSelect(StringBuilder sb, Roles roles, List<Filter> filters, boolean membershipMandatory) {
+	private boolean appendMyViewAccessSubSelect(StringBuilder sb, Roles roles, List<Filter> filters, boolean membershipMandatory) {
+		boolean needIdentityKey = false;
+		
 		sb.append("(v.access >= ");
 		if (roles.isAuthor()) {
 			sb.append(RepositoryEntry.ACC_OWNERS_AUTHORS);
@@ -362,6 +370,7 @@ public class RepositoryEntryMyCourseQueries {
 			sb.append(")");
 		} else {
 			if(inRoles.length() == 0 && !membershipMandatory) {
+				needIdentityKey = true;
 				//sub select are very quick
 				sb.append(" or (")
 				  .append("  v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true")
@@ -375,6 +384,7 @@ public class RepositoryEntryMyCourseQueries {
 				if(inRoles.length() == 0) {
 					inRoles.append("'").append(GroupRoles.owner.name()).append("','").append(GroupRoles.coach.name()).append("','").append(GroupRoles.participant.name()).append("'");
 				}
+				needIdentityKey = true;
 				//make sure that in all case the role is mandatory
 				sb.append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
 				  .append(" and v.key in (select rel.entry.key from repoentrytogroup as rel, bgroupmember as membership")
@@ -383,9 +393,11 @@ public class RepositoryEntryMyCourseQueries {
 				  .append(" )");
 			}
 		}
+		return needIdentityKey;
 	}
 	
-	private void appendFiltersInWhereClause(Filter filter, StringBuilder sb) {
+	private boolean appendFiltersInWhereClause(Filter filter, StringBuilder sb) {
+		boolean needIdentityKey = false;
 		switch(filter) {
 			case showAll: break;
 			case currentCourses:
@@ -398,41 +410,49 @@ public class RepositoryEntryMyCourseQueries {
 				sb.append(" and lifecycle.validTo<=:now");
 				break;
 			case passed:
+				needIdentityKey = true;
 				sb.append(" and exists (select eff2.key from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff2")
 				  .append("    where eff2.resource=res and eff2.identity.key=:identityKey and eff2.passed=true")
 				  .append(" )");
 				break;
 			case notPassed:
+				needIdentityKey = true;
 				sb.append(" and exists (select eff3.key from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff3")
 				  .append("    where eff3.resource=res and eff3.identity.key=:identityKey and eff3.passed=false")
 				  .append(" )");
 				break;
 			case withoutPassedInfos:
+				needIdentityKey = true;
 				sb.append(" and exists (select eff4.key from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff4")
 				  .append("    where eff4.resource=res and eff4.identity.key=:identityKey and eff4.passed is null")
 				  .append(" )");
 				break;
 			default: {}
 		}
+		return needIdentityKey;
 	}
 	
 
-	private void appendOrderByInSelect(SearchMyRepositoryEntryViewParams params, StringBuilder sb) {
+	private boolean appendOrderByInSelect(SearchMyRepositoryEntryViewParams params, StringBuilder sb) {
+		boolean needIdentityKey = false;
 		OrderBy orderBy = params.getOrderBy();
 		if(orderBy != null) {
 			switch(orderBy) {
 				case automatic://need lastVisited
 				case lastVisited:
+					needIdentityKey = true;
 					sb.append(" ,(select infos2.recentLaunch from usercourseinfos as infos2")
 					  .append("    where infos2.resource=res and infos2.identity.key=:identityKey")
 					  .append(" ) as recentLaunch");
 					break;
 				case passed:
+					needIdentityKey = true;
 					sb.append(" ,(select eff3.passed from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff3")
 					  .append("    where eff3.resource=res and eff3.identity.key=:identityKey")
 					  .append(" ) as passed");
 					break;
 				case score:
+					needIdentityKey = true;
 					sb.append(" ,(select eff4.score from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as eff4")
 					  .append("    where eff4.resource=res and eff4.identity.key=:identityKey")
 					  .append(" ) as score");
@@ -440,6 +460,7 @@ public class RepositoryEntryMyCourseQueries {
 				default: //do nothing
 			}
 		}
+		return needIdentityKey;
 	}
 	
 	private void appendOrderBy(OrderBy orderBy, boolean asc, StringBuilder sb) {
diff --git a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
index 6b5fbe5796d..877cb324edb 100644
--- a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
@@ -123,7 +123,7 @@ public class OverviewRepositoryListController extends BasicController implements
 		if(entries == null || entries.isEmpty()) {
 			if(currentCtrl == null) {
 				if(isGuestOnly) {
-					 doOpenMyCourses(ureq);
+					doOpenMyCourses(ureq);
 					segmentView.select(myCourseLink);
 				} else {
 					boolean markEmpty = doOpenMark(ureq).isEmpty();
-- 
GitLab