keycloak-aplcache

Details

diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java
index f49cf8e..57ec2ae 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmModel.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java
@@ -133,6 +133,8 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa
 
     public void setAutomaticRegistrationAfterSocialLogin(boolean automaticRegistrationAfterSocialLogin);
 
+    List<UserModel> searchForUser(String search);
+
     List<UserModel> searchForUserByAttributes(Map<String, String> attributes);
 
     OAuthClientModel addOAuthClient(String name);
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index faeea27..f3463c7 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -676,6 +676,16 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
+    public List<UserModel> searchForUser(String search) {
+        TypedQuery<UserEntity> query = em.createQuery("select u from UserEntity u where lower(u.loginName) like :search or lower(concat(u.firstName, ' ', u.lastName)) like :search or u.email like :search", UserEntity.class);
+        query.setParameter("search", "%" + search.toLowerCase() + "%");
+        List<UserEntity> results = query.getResultList();
+        List<UserModel> users = new ArrayList<UserModel>();
+        for (UserEntity entity : results) users.add(new UserAdapter(entity));
+        return users;
+    }
+
+    @Override
     public List<UserModel> searchForUserByAttributes(Map<String, String> attributes) {
         StringBuilder builder = new StringBuilder("select u from UserEntity u");
         boolean first = true;
diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
index 88bad1f..3767e65 100755
--- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
+++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java
@@ -36,6 +36,7 @@ import org.picketlink.idm.model.sample.Role;
 import org.picketlink.idm.model.sample.SampleModel;
 import org.picketlink.idm.model.sample.User;
 import org.picketlink.idm.query.IdentityQuery;
+import org.picketlink.idm.query.QueryParameter;
 import org.picketlink.idm.query.RelationshipQuery;
 
 import java.io.IOException;
@@ -877,6 +878,26 @@ public class RealmAdapter implements RealmModel {
     }
 
     @Override
+    public List<UserModel> searchForUser(String search) {
+        QueryParameter[] params = new QueryParameter[] { User.LOGIN_NAME, User.FIRST_NAME, User.LAST_NAME, User.EMAIL };
+
+        Map<String, User> users = new HashMap<String, User>();
+        for (QueryParameter p : params) {
+            IdentityQuery<User> query = getIdm().createIdentityQuery(User.class);
+            query.setParameter(p, search.toLowerCase());
+            for (User u : query.getResultList()) {
+                users.put(u.getLoginName(), u);
+            }
+        }
+
+        List<UserModel> userModels = new ArrayList<UserModel>();
+        for (User user : users.values()) {
+            userModels.add(new UserAdapter(user, idm));
+        }
+        return userModels;
+    }
+
+    @Override
     public List<UserModel> searchForUserByAttributes(Map<String, String> attributes) {
         IdentityQuery<User> query = getIdm().createIdentityQuery(User.class);
         for (Map.Entry<String, String> entry : attributes.entrySet()) {
diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
index 6c72da6..2b6aa61 100755
--- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java
@@ -350,49 +350,7 @@ public class RealmManager {
         if (searchString == null) {
             return Collections.emptyList();
         }
-
-        String search = searchString.trim();
-        if (search.contains(" ")) { //first and last name
-            String[] split = search.split(" ");
-            if (split.length != 2) {
-                return Collections.emptyList();
-            }
-            Map<String, String> attributes = new HashMap<String, String>();
-            attributes.put(UserModel.FIRST_NAME, split[0]);
-            attributes.put(UserModel.LAST_NAME, split[1]);
-            return realmModel.searchForUserByAttributes(attributes);
-        } else if (search.contains("@")) { // email
-            Map<String, String> attributes = new HashMap<String, String>();
-            attributes.put(UserModel.EMAIL, search);
-            return realmModel.searchForUserByAttributes(attributes);
-        } else { // username and lastname
-            Map<String, String> attributes = new HashMap<String, String>();
-            attributes.put(UserModel.LOGIN_NAME, search);
-            List<UserModel> usernameQuery = realmModel.searchForUserByAttributes(attributes);
-            attributes.clear();
-            attributes.put(UserModel.LAST_NAME, search);
-            List<UserModel> lastnameQuery = realmModel.searchForUserByAttributes(attributes);
-            if (usernameQuery.size() == 0) {
-                return lastnameQuery;
-            } else if (lastnameQuery.size() == 0) {
-                return usernameQuery;
-            }
-            List<UserModel> results = new ArrayList<UserModel>();
-            results.addAll(usernameQuery);
-            for (UserModel lastnameUser : lastnameQuery) {
-                boolean found = false;
-                for (UserModel usernameUser : usernameQuery) {
-                    if (usernameUser.getLoginName().equals(lastnameUser.getLoginName())) {
-                        found = true;
-                        break;
-                    }
-                }
-                if (!found) {
-                    results.add(lastnameUser);
-                }
-            }
-            return results;
-        }
+        return realmModel.searchForUser(searchString.trim());
     }
 
     public void addRequiredCredential(RealmModel newRealm, String requiredCred) {
diff --git a/services/src/test/java/org/keycloak/test/AdapterTest.java b/services/src/test/java/org/keycloak/test/AdapterTest.java
index 0ad0169..7c2d405 100755
--- a/services/src/test/java/org/keycloak/test/AdapterTest.java
+++ b/services/src/test/java/org/keycloak/test/AdapterTest.java
@@ -20,6 +20,8 @@ import org.keycloak.services.managers.RealmManager;
 import org.keycloak.test.common.AbstractKeycloakTest;
 import org.keycloak.test.common.SessionFactoryTestContext;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -233,6 +235,16 @@ public class AdapterTest extends AbstractKeycloakTest {
             user.setLastName("Burke");
             user.setFirstName("Bill");
             user.setEmail("bburke@redhat.com");
+
+            UserModel user2 = realmModel.addUser("doublefirst");
+            user2.setFirstName("Knut Ole");
+            user2.setLastName("Alver");
+            user2.setEmail("knut@redhat.com");
+
+            UserModel user3 = realmModel.addUser("doublelast");
+            user3.setFirstName("Ole");
+            user3.setLastName("Alver Veland");
+            user3.setEmail("knut@redhat.com");
         }
 
         RealmManager adapter = getRealmManager();
@@ -252,7 +264,7 @@ public class AdapterTest extends AbstractKeycloakTest {
         }
 
         {
-            List<UserModel> userModels = adapter.searchUsers("bil burk", realmModel);
+            List<UserModel> userModels = adapter.searchUsers("bill burk", realmModel);
             Assert.assertEquals(userModels.size(), 1);
             UserModel bburke = userModels.get(0);
             Assert.assertEquals(bburke.getFirstName(), "Bill");
@@ -260,6 +272,15 @@ public class AdapterTest extends AbstractKeycloakTest {
             Assert.assertEquals(bburke.getEmail(), "bburke@redhat.com");
         }
 
+        {
+            ArrayList<String> users = new ArrayList<String>();
+            for (UserModel u : adapter.searchUsers("ole alver", realmModel)) {
+                users.add(u.getLoginName());
+            }
+            String[] usernames = users.toArray(new String[users.size()]);
+            Arrays.sort(usernames);
+            Assert.assertArrayEquals(new String[] { "doublefirst", "doublelast"}, usernames);
+        }
 
         {
             List<UserModel> userModels = adapter.searchUsers("bburke@redhat.com", realmModel);