From 40c6517672f53dfdf37e47159337d6867149e4a9 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Fri, 18 Jan 2013 11:22:23 -0800 Subject: [PATCH] Use contains() from containsAnyOf() for single groups Backend implementations might optimize contains() differently than containsAnyOf(). In the universal backend forward a single group lookup to contains(), allowing the implementation to always use the best method for the current call. Change-Id: I4673f62f4cc1d67746059964b8d47fefcccce976 --- .../server/account/UniversalGroupBackend.java | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java index 197496194f..1f670f6713 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/UniversalGroupBackend.java @@ -18,6 +18,7 @@ import static com.google.gerrit.server.account.GroupBackends.GROUP_REF_NAME_COMP import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.gerrit.common.data.GroupDescription; @@ -128,26 +129,32 @@ public class UniversalGroupBackend implements GroupBackend { return m.contains(uuid); } - @Override - public boolean containsAnyOf(Iterable uuids) { - Multimap lookups = - ArrayListMultimap.create(); - for (AccountGroup.UUID uuid : uuids) { - GroupMembership m = membership(uuid); - if (m == null) { - log.warn("Unknown GroupMembership for UUID: " + uuid); - continue; - } - lookups.put(m, uuid); - } - for (Map.Entry> entry : - lookups.asMap().entrySet()) { - if (entry.getKey().containsAnyOf(entry.getValue())) { - return true; - } - } - return false; - } + @Override + public boolean containsAnyOf(Iterable uuids) { + Multimap lookups = + ArrayListMultimap.create(); + for (AccountGroup.UUID uuid : uuids) { + GroupMembership m = membership(uuid); + if (m == null) { + log.warn("Unknown GroupMembership for UUID: " + uuid); + continue; + } + lookups.put(m, uuid); + } + for (Map.Entry> entry + : lookups .asMap().entrySet()) { + GroupMembership m = entry.getKey(); + Collection ids = entry.getValue(); + if (ids.size() == 1) { + if (m.contains(Iterables.getOnlyElement(ids))) { + return true; + } + } else if (m.containsAnyOf(ids)) { + return true; + } + } + return false; + } @Override public Set getKnownGroups() {