From 5a5baf44e6b07eb55dd1e9d8510109518b77cd75 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 15 Jan 2015 09:48:05 +0100
Subject: [PATCH] OO-1391: fix query for count, add some count query in unit
 tests

---
 .../basesecurity/BaseSecurityManager.java     | 22 +++++++-----
 .../GetIdentitiesByPowerSearchTest.java       | 36 +++++++++++--------
 2 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index c72653c6f3f..bc0277b17c0 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -1370,7 +1370,7 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity {
 		boolean hasAuthProviders = (params.getAuthProviders() != null && params.getAuthProviders().length > 0);
 
 		// select identity and inner join with user to optimize query
-		StringBuilder sb = new StringBuilder();
+		StringBuilder sb = new StringBuilder(5000);
 		if (hasAuthProviders) {
 			// I know, it looks wrong but I need to do the join reversed since it is not possible to 
 			// do this query with a left join that starts with the identity using hibernate HQL. A left
@@ -1378,26 +1378,30 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity {
 			// providers (e.g. when searching for users that do not have any authentication providers at all!).
 			// It took my quite a while to make this work, so think twice before you change anything here!
 			if(count) {
-				sb = new StringBuilder("select count(distinct ident.key) from org.olat.basesecurity.AuthenticationImpl as auth right join auth.identity as ident ");			
+				sb.append("select count(distinct ident.key) from org.olat.basesecurity.AuthenticationImpl as auth  ")
+				  .append(" right join auth.identity as ident")
+				  .append(" inner join ident.user as user ");
 			} else {
-				sb = new StringBuilder("select distinct ident from org.olat.basesecurity.AuthenticationImpl as auth right join auth.identity as ident ");			
+				sb.append("select distinct ident from org.olat.basesecurity.AuthenticationImpl as auth ")
+				  .append(" right join auth.identity as ident")
+				  .append(" inner join fetch ident.user as user ");
 			}
 		} else {
 			if(count) {
-				sb = new StringBuilder("select count(distinct ident.key) from org.olat.core.id.Identity as ident ");
+				sb.append("select count(distinct ident.key) from org.olat.core.id.Identity as ident ")
+				  .append(" inner join ident.user as user ");
 			} else {
-				sb = new StringBuilder("select distinct ident from org.olat.core.id.Identity as ident ");
+				sb.append("select distinct ident from org.olat.core.id.Identity as ident ")
+				  .append(" inner join fetch ident.user as user ");
 			}
 		}
 		// In any case join with the user. Don't join-fetch user, this breaks the query
 		// because of the user fields (don't know exactly why this behaves like
 		// this)
-		sb.append(" inner join fetch ident.user as user ");
-		
+
 		if (hasGroups) {
 			// join over security group memberships
-	    sb.append(" ,org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi ");
-
+			sb.append(" ,org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi ");
 		}
 		if (hasPermissionOnResources) {
 			// join over policies
diff --git a/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java
index 3049c953a32..94c267242f6 100644
--- a/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java
+++ b/src/test/java/org/olat/basesecurity/GetIdentitiesByPowerSearchTest.java
@@ -40,7 +40,6 @@ import junit.framework.Assert;
 
 import org.junit.Test;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Roles;
 import org.olat.core.id.User;
@@ -94,7 +93,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		assertEquals("Number of all users != activeUsers + deletedUsers" , numberOfAllUsers, numberOfActiveUsers + numberOfDeletedUsers);
 		
 		// user attributes search test
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getIdentitiesByPowerSearch(ident.getName(), null, true, null, null, null, null, null, null, null, null);
 		assertTrue(results.size() == 1);
 		assertEquals("Wrong search result (search with username)" + ident.getName() + "' ",ident.getName() , results.get(0).getName());
@@ -290,14 +289,14 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		baseSecurityManager.addIdentityToSecurityGroup(ident, authors);
 		
 		// policy search test
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins);
 		PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
 		policies = baseSecurityManager.getPoliciesOfSecurityGroup(anonymous);
 		PermissionOnResourceable[] anonymousPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
 
 		// security group search test
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		SecurityGroup[] groups2 = {admins, authors};
 		SecurityGroup[] groups3 = {authors};
 
@@ -363,7 +362,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		SecurityGroup[] groups2 = { admins, authors };
 		
 		// policy search test
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		List<Policy> policies = baseSecurityManager.getPoliciesOfSecurityGroup(admins);
 		PermissionOnResourceable[] adminPermissions = convertPoliciesListToPermissionOnResourceArray(policies);
 				
@@ -400,7 +399,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 
 		Authentication auth = baseSecurityManager.findAuthentication(ident, BaseSecurityModule.getDefaultAuthProviderIdentifier());
 		baseSecurityManager.deleteAuthentication(auth);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 
 		// ultimate tests
 		//Identity ident = getOrCreateIdentity("anIdentity");
@@ -410,7 +409,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		cal.add(Calendar.DAY_OF_MONTH, -5);
 		Date before = cal.getTime();
 
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null, null, null, null);
 		Assert.assertTrue(results.isEmpty());
 		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch("groovy", null, true, groups1, adminPermissions, null, before, null);
@@ -471,11 +470,15 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		//check count before adding
 		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
 		int prevProviderNoneCount = results.size();
+		
+		long countResults = baseSecurityManager.countIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
+		Assert.assertEquals(results.size(), countResults);
+		
 		//add two new users with authProviderNone
 		String rnd = UUID.randomUUID().toString();
 		Identity authNoneOne = getOrCreateTestIdentityWithAuth("authNoneOne-" + rnd, null);
 		Identity authNoneTwo = getOrCreateTestIdentityWithAuth("authNoneTwo-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		
 		// special case: no auth provider
 		// test if 2 new users are found.
@@ -490,7 +493,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		
 		Identity authNoneThree = getOrCreateTestIdentityWithAuth("authNoneThree-" + rnd, null);
 		Identity authNoneFour = getOrCreateTestIdentityWithAuth("authNoneFour-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		
 		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
 		Assert.assertTrue(results.contains(authNoneThree));
@@ -503,7 +506,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		
 		getOrCreateTestIdentityWithAuth("authNoneFive-" + rnd, null);
 		getOrCreateTestIdentityWithAuth("authNoneSix-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null, null, null, null);
 		Assert.assertEquals("Wrong number of identities, search with (authProviderNone)", prevProviderNoneCount + 2, results.size());
 		
@@ -511,7 +514,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		prevProviderNoneCount = results.size();
 		getOrCreateTestIdentityWithAuth("authNoneSeven-" + rnd, null);
 		getOrCreateTestIdentityWithAuth("authNoneEight-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProviderNone, null, null);
 		Assert.assertEquals("Wrong number of visible identities, search with (authProviderNone)", prevProviderNoneCount + 2, results.size());
 		
@@ -522,7 +525,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		getOrCreateTestIdentityWithAuth("authTwelve-" + rnd, "Shib");
 		getOrCreateTestIdentityWithAuth("authThirteen-" + rnd, BaseSecurityModule.getDefaultAuthProviderIdentifier());
 		getOrCreateTestIdentityWithAuth("authForteen-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null, null, null, null);
 		Assert.assertTrue(results.size() - prevProviderNoneCount == 3);
 		
@@ -532,7 +535,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		getOrCreateTestIdentityWithAuth("authSixteen-" + rnd, "Shib");
 		getOrCreateTestIdentityWithAuth("authSeventeen-" + rnd, BaseSecurityModule.getDefaultAuthProviderIdentifier());
 		getOrCreateTestIdentityWithAuth("authEighteen-" + rnd, null);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 		results = baseSecurityManager.getVisibleIdentitiesByPowerSearch(null, null, true, null, null, authProvidersAll, null, null);
 		Assert.assertTrue(results.size() - prevProviderNoneCount == 3);
 	}
@@ -560,7 +563,7 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		twoPropUser.setProperty(UserConstants.LASTNAME, "prop");
 		Identity twoPropIdentity = baseSecurityManager.createAndPersistIdentityAndUser(twoUsername, null, twoPropUser, BaseSecurityModule.getDefaultAuthProviderIdentifier(), twoUsername, "ppp");
 		Assert.assertNotNull(twoPropIdentity);
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 
 		HashMap<String, String> userProperties = new HashMap<String, String>();
 		userProperties.put(UserConstants.FIRSTNAME, "one");
@@ -642,13 +645,16 @@ public class GetIdentitiesByPowerSearchTest extends OlatTestCase {
 		Assert.assertNotNull(identity);
 		
 		// commit
-		DBFactory.getInstance().closeSession();
+		dbInstance.commitAndCloseSession();
 
 		HashMap<String, String> userProperties = new HashMap<String, String>();
 		userProperties.put(UserConstants.FIRSTNAME, "multi");
 		List<Identity> results = baseSecurityManager.getIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
 		sysoutResults(results);
 		Assert.assertTrue(results.contains(identity));
+		
+		long countResults = baseSecurityManager.countIdentitiesByPowerSearch(null, userProperties, true, null, null, null, null, null, null, null, null);
+		Assert.assertEquals(results.size(), countResults);
 
 		userProperties = new HashMap<String, String>();
 		userProperties.put(UserConstants.FIRSTNAME, "multi");
-- 
GitLab