Support to query groups by owner group name

Change-Id: If514ec35caafe6fb359f82ff43a9e8efc8f520f2
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin 2017-01-13 17:08:10 +01:00
parent 144a07d079
commit dad613ef3e
4 changed files with 55 additions and 27 deletions

View File

@ -49,9 +49,10 @@ name:'NAME'::
Matches groups that have the name 'NAME' (case-insensitive).
[[owner]]
owner:'UUID'::
owner:'OWNER'::
+
Matches groups that are owned by a group that has the UUID 'UUID'.
Matches groups that are owned by the group whose name best matches
'OWNER' or that has the UUID 'OWNER'.
[[uuid]]
uuid:'UUID'::

View File

@ -14,30 +14,14 @@
package com.google.gerrit.server.query.group;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.index.FieldDef;
import com.google.gerrit.server.index.IndexPredicate;
import com.google.gerrit.server.index.group.GroupField;
import com.google.gerrit.server.query.Predicate;
import java.util.List;
import java.util.Locale;
public class GroupPredicates {
public static Predicate<AccountGroup> defaultPredicate(String query) {
// Adapt the capacity of this list when adding more default predicates.
List<Predicate<AccountGroup>> preds = Lists.newArrayListWithCapacity(5);
preds.add(uuid(new AccountGroup.UUID(query)));
preds.add(name(query));
preds.add(inname(query));
if (!Strings.isNullOrEmpty(query)) {
preds.add(description(query));
}
preds.add(owner(query));
return Predicate.or(preds);
}
public static Predicate<AccountGroup> uuid(AccountGroup.UUID uuid) {
return new GroupPredicate(GroupField.UUID, GroupQueryBuilder.FIELD_UUID, uuid.get());
}
@ -57,8 +41,9 @@ public class GroupPredicates {
GroupField.NAME, GroupQueryBuilder.FIELD_NAME, name.toLowerCase(Locale.US));
}
public static Predicate<AccountGroup> owner(String owner) {
return new GroupPredicate(GroupField.OWNER_UUID, GroupQueryBuilder.FIELD_OWNER, owner);
public static Predicate<AccountGroup> owner(AccountGroup.UUID ownerUuid) {
return new GroupPredicate(
GroupField.OWNER_UUID, GroupQueryBuilder.FIELD_OWNER, ownerUuid.get());
}
public static Predicate<AccountGroup> isVisibleToAll() {

View File

@ -15,13 +15,19 @@
package com.google.gerrit.server.query.group;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
import com.google.gerrit.common.data.GroupReference;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupBackends;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.query.LimitPredicate;
import com.google.gerrit.server.query.Predicate;
import com.google.gerrit.server.query.QueryBuilder;
import com.google.gerrit.server.query.QueryParseException;
import com.google.inject.Inject;
import java.util.List;
/** Parses a query string meant to be applied to group objects. */
public class GroupQueryBuilder extends QueryBuilder<AccountGroup> {
@ -35,9 +41,23 @@ public class GroupQueryBuilder extends QueryBuilder<AccountGroup> {
private static final QueryBuilder.Definition<AccountGroup, GroupQueryBuilder> mydef =
new QueryBuilder.Definition<>(GroupQueryBuilder.class);
public static class Arguments {
final GroupCache groupCache;
final GroupBackend groupBackend;
@Inject
Arguments(GroupCache groupCache, GroupBackend groupBackend) {
this.groupCache = groupCache;
this.groupBackend = groupBackend;
}
}
private final Arguments args;
@Inject
GroupQueryBuilder() {
GroupQueryBuilder(Arguments args) {
super(mydef);
this.args = args;
}
@Operator
@ -68,8 +88,16 @@ public class GroupQueryBuilder extends QueryBuilder<AccountGroup> {
}
@Operator
public Predicate<AccountGroup> owner(String owner) {
return GroupPredicates.owner(owner);
public Predicate<AccountGroup> owner(String owner) throws QueryParseException {
AccountGroup group = args.groupCache.get(new AccountGroup.UUID(owner));
if (group != null) {
return GroupPredicates.owner(group.getGroupUUID());
}
GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, owner);
if (g == null) {
throw error("Group " + owner + " not found");
}
return GroupPredicates.owner(g.getUUID());
}
@Operator
@ -81,8 +109,21 @@ public class GroupQueryBuilder extends QueryBuilder<AccountGroup> {
}
@Override
protected Predicate<AccountGroup> defaultField(String query) {
return GroupPredicates.defaultPredicate(query);
protected Predicate<AccountGroup> defaultField(String query) throws QueryParseException {
// Adapt the capacity of this list when adding more default predicates.
List<Predicate<AccountGroup>> preds = Lists.newArrayListWithCapacity(5);
preds.add(uuid(query));
preds.add(name(query));
preds.add(inname(query));
if (!Strings.isNullOrEmpty(query)) {
preds.add(description(query));
}
try {
preds.add(owner(query));
} catch (QueryParseException e) {
// Skip.
}
return Predicate.or(preds);
}
@Operator

View File

@ -216,14 +216,15 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests {
@Test
public void byOwner() throws Exception {
assertQuery("owner:non-existing");
GroupInfo ownerGroup = createGroup(name("owner-group"));
GroupInfo group = createGroupWithOwner(name("group"), ownerGroup);
createGroup(name("group2"));
assertQuery("owner:" + group.id);
// ownerGroup owns itself
assertQuery("owner:" + ownerGroup.id, group, ownerGroup);
assertQuery("owner:" + ownerGroup.name, group, ownerGroup);
}
@Test