Avoid unnecessary group visibility checks

The list-groups REST API call checked group visibility even for those
groups which are filtered out. In a system with 10-20K of groups
this can cause 30-60 seconds delay when checking if current user can
see a group.

Avoid unnecessary group visibility checks by moving it towards the end
of the loop. Therefore, group visibility is only checked for those
groups which are not filtered out.

Change-Id: Id5984049d0103fbbf656b704f672f01283844b64
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
index f3a2ea2..44e8a4d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
@@ -322,12 +322,6 @@
           continue;
         }
       }
-      if (!isAdmin) {
-        final GroupControl c = groupControlFactory.controlFor(group);
-        if (!c.isVisible()) {
-          continue;
-        }
-      }
       if (visibleToAll && !group.isVisibleToAll()) {
         continue;
       }
@@ -335,6 +329,12 @@
           && !groupsToInspect.contains(group.getGroupUUID())) {
         continue;
       }
+      if (!isAdmin) {
+        final GroupControl c = groupControlFactory.controlFor(group);
+        if (!c.isVisible()) {
+          continue;
+        }
+      }
       filteredGroups.add(group);
     }
     Collections.sort(filteredGroups, new GroupComparator());