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
This commit is contained in:
Shawn Pearce
2013-01-18 11:22:23 -08:00
parent f1b4c30305
commit 40c6517672

View File

@@ -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.ArrayListMultimap;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.google.gerrit.common.data.GroupDescription; import com.google.gerrit.common.data.GroupDescription;
@@ -128,26 +129,32 @@ public class UniversalGroupBackend implements GroupBackend {
return m.contains(uuid); return m.contains(uuid);
} }
@Override @Override
public boolean containsAnyOf(Iterable<AccountGroup.UUID> uuids) { public boolean containsAnyOf(Iterable<AccountGroup.UUID> uuids) {
Multimap<GroupMembership, AccountGroup.UUID> lookups = Multimap<GroupMembership, AccountGroup.UUID> lookups =
ArrayListMultimap.create(); ArrayListMultimap.create();
for (AccountGroup.UUID uuid : uuids) { for (AccountGroup.UUID uuid : uuids) {
GroupMembership m = membership(uuid); GroupMembership m = membership(uuid);
if (m == null) { if (m == null) {
log.warn("Unknown GroupMembership for UUID: " + uuid); log.warn("Unknown GroupMembership for UUID: " + uuid);
continue; continue;
} }
lookups.put(m, uuid); lookups.put(m, uuid);
} }
for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry : for (Map.Entry<GroupMembership, Collection<AccountGroup.UUID>> entry
lookups.asMap().entrySet()) { : lookups .asMap().entrySet()) {
if (entry.getKey().containsAnyOf(entry.getValue())) { GroupMembership m = entry.getKey();
return true; Collection<AccountGroup.UUID> ids = entry.getValue();
} if (ids.size() == 1) {
} if (m.contains(Iterables.getOnlyElement(ids))) {
return false; return true;
} }
} else if (m.containsAnyOf(ids)) {
return true;
}
}
return false;
}
@Override @Override
public Set<AccountGroup.UUID> getKnownGroups() { public Set<AccountGroup.UUID> getKnownGroups() {