keycloak-developers

Merge branch 'feature/group-count-for-pagination' into

6/22/2017 10:44:52 AM

Details

diff --git a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/GroupsResource.java b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/GroupsResource.java
index ce6db74..2a4b40a 100755
--- a/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/GroupsResource.java
+++ b/integration/admin-client/src/main/java/org/keycloak/admin/client/resource/GroupsResource.java
@@ -68,6 +68,29 @@ public interface GroupsResource {
                                      @QueryParam("max") Integer max);
 
     /**
+     * Counts all groups.
+     * @return The number of groups.
+     */
+    @GET
+    @NoCache
+    @Path("/count")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    Response count();
+
+    /**
+     * Counts groups by name search.
+     * @param search max number of occurrences
+     * @return The number of group containing search therm.
+     */
+    @GET
+    @NoCache
+    @Path("/count")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    Response count(@QueryParam("search") String search);
+
+    /**
      * create or add a top level realm groupSet or create child.  This will update the group and set the parent if it exists.  Create it and set the parent
      * if the group doesn't exist.
      *
diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java
index d396463..5b99ff1 100755
--- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java
+++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmAdapter.java
@@ -1201,6 +1201,16 @@ public class RealmAdapter implements CachedRealmModel {
     }
 
     @Override
+    public Long getGroupsCount() {
+        return cacheSession.getGroupsCount(this);
+    }
+
+    @Override
+    public Long getGroupsCountByNameContaining(String search) {
+        return cacheSession.getGroupsCountByNameContaining(this, search);
+    }
+
+    @Override
     public List<GroupModel> getTopLevelGroups() {
         return cacheSession.getTopLevelGroups(this);
     }
diff --git a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
index 47267ad..6c65423 100755
--- a/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
+++ b/model/infinispan/src/main/java/org/keycloak/models/cache/infinispan/RealmCacheSession.java
@@ -842,6 +842,16 @@ public class RealmCacheSession implements CacheRealmProvider {
     }
 
     @Override
+    public Long getGroupsCount(RealmModel realm) {
+        return getDelegate().getGroupsCount(realm);
+    }
+
+    @Override
+    public Long getGroupsCountByNameContaining(RealmModel realm, String search) {
+        return getDelegate().getGroupsCountByNameContaining(realm, search);
+    }
+
+    @Override
     public List<GroupModel> getTopLevelGroups(RealmModel realm) {
         String cacheKey = getTopGroupsQueryCacheKey(realm.getId());
         boolean queryDB = invalidations.contains(cacheKey) || listInvalidations.contains(realm.getId());
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/GroupEntity.java b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/GroupEntity.java
index 77bc44d..1f7dc09 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/entities/GroupEntity.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/entities/GroupEntity.java
@@ -28,7 +28,9 @@ import java.util.Collection;
 @NamedQueries({
         @NamedQuery(name="getGroupIdsByParent", query="select u.id from GroupEntity u where u.parent = :parent"),
         @NamedQuery(name="getGroupIdsByNameContaining", query="select u.id from GroupEntity u where u.realm.id = :realm and u.name like concat('%',:search,'%') order by u.name ASC"),
-        @NamedQuery(name="getTopLevelGroupIds", query="select u.id from GroupEntity u where u.parent is null and u.realm.id = :realm")
+        @NamedQuery(name="getTopLevelGroupIds", query="select u.id from GroupEntity u where u.parent is null and u.realm.id = :realm"),
+        @NamedQuery(name="getGroupCount", query="select count(u) from GroupEntity u where u.realm.id = :realm"),
+        @NamedQuery(name="getGroupCountByNameContaining", query="select count(u) from GroupEntity u where u.realm.id = :realm and u.name like concat('%',:name,'%')")
 })
 @Entity
 @Table(name="KEYCLOAK_GROUP")
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
index 683f7a3..306f674 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java
@@ -323,6 +323,25 @@ public class JpaRealmProvider implements RealmProvider {
     }
 
     @Override
+    public Long getGroupsCount(RealmModel realm) {
+        Long count = em.createNamedQuery("getGroupCount", Long.class)
+                .setParameter("realm", realm.getId())
+                .getSingleResult();
+
+        return count;
+    }
+
+    @Override
+    public Long getGroupsCountByNameContaining(RealmModel realm, String search) {
+        Long count = em.createNamedQuery("getGroupCountByNameContaining", Long.class)
+                .setParameter("realm", realm.getId())
+                .setParameter("name", search)
+                .getSingleResult();
+
+        return count;
+    }
+
+    @Override
     public List<GroupModel> getTopLevelGroups(RealmModel realm) {
         RealmEntity ref = em.getReference(RealmEntity.class, realm.getId());
 
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 e53ef2f..a217af3 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
@@ -1675,6 +1675,16 @@ public class RealmAdapter implements RealmModel, JpaModel<RealmEntity> {
     }
 
     @Override
+    public Long getGroupsCount() {
+        return session.realms().getGroupsCount(this);
+    }
+
+    @Override
+    public Long getGroupsCountByNameContaining(String search) {
+        return session.realms().getGroupsCountByNameContaining(this, search);
+    }
+
+    @Override
     public List<GroupModel> getTopLevelGroups() {
         return session.realms().getTopLevelGroups(this);
     }
diff --git a/server-spi/src/main/java/org/keycloak/models/RealmModel.java b/server-spi/src/main/java/org/keycloak/models/RealmModel.java
index f90a9d7..133c247 100755
--- a/server-spi/src/main/java/org/keycloak/models/RealmModel.java
+++ b/server-spi/src/main/java/org/keycloak/models/RealmModel.java
@@ -397,6 +397,8 @@ public interface RealmModel extends RoleContainerModel {
 
     GroupModel getGroupById(String id);
     List<GroupModel> getGroups();
+    Long getGroupsCount();
+    Long getGroupsCountByNameContaining(String search);
     List<GroupModel> getTopLevelGroups();
     List<GroupModel> getTopLevelGroups(Integer first, Integer max);
     List<GroupModel> searchForGroupByName(String search, Integer first, Integer max);
diff --git a/server-spi/src/main/java/org/keycloak/models/RealmProvider.java b/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
index 3e1a1c9..72c11ad 100755
--- a/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
+++ b/server-spi/src/main/java/org/keycloak/models/RealmProvider.java
@@ -40,6 +40,10 @@ public interface RealmProvider extends Provider {
 
     List<GroupModel> getGroups(RealmModel realm);
 
+    Long getGroupsCount(RealmModel realm);
+
+    Long getGroupsCountByNameContaining(RealmModel realm, String search);
+
     List<GroupModel> getTopLevelGroups(RealmModel realm);
 
     List<GroupModel> getTopLevelGroups(RealmModel realm, Integer first, Integer max);
@@ -89,6 +93,8 @@ public interface RealmProvider extends Provider {
     ClientTemplateModel getClientTemplateById(String id, RealmModel realm);
     GroupModel getGroupById(String id, RealmModel realm);
 
+
+
     List<RealmModel> getRealms();
     boolean removeRealm(String id);
     void close();
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/GroupsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/GroupsResource.java
index 7c61fe9..e5b4676 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/GroupsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/GroupsResource.java
@@ -102,6 +102,25 @@ public class GroupsResource {
     }
 
     /**
+     * Returns the groups counts.
+     *
+     * @return
+     */
+    @GET
+    @NoCache
+    @Path("/count")
+    public Response getGroupCount(@QueryParam("search") String search) {
+        auth.requireView();
+        Long results;
+        if (Objects.nonNull(search)) {
+            results = realm.getGroupsCountByNameContaining(search);
+        } else {
+            results = realm.getGroupsCount();
+        }
+        return Response.ok(results).build();
+    }
+
+    /**
      * create or add a top level realm groupSet or create child.  This will update the group and set the parent if it exists.  Create it and set the parent
      * if the group doesn't exist.
      *