diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index 17f52dce30..63ec45c174 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.primitives.Ints; +import com.google.gerrit.common.data.GroupDescription; import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.common.data.SubmitRecord; import com.google.gerrit.common.errors.NotSignedInException; @@ -742,23 +743,8 @@ public class ChangeQueryBuilder extends QueryBuilder { } } - // expand a group predicate into multiple user predicates if (group != null) { - Set allMembers = - args.listMembers - .get() - .setRecursive(true) - .apply(group) - .stream() - .map(a -> new Account.Id(a._accountId)) - .collect(toSet()); - int maxTerms = args.indexConfig.maxTerms(); - if (allMembers.size() > maxTerms) { - // limit the number of query terms otherwise Gerrit will barf - accounts = ImmutableSet.copyOf(Iterables.limit(allMembers, maxTerms)); - } else { - accounts = allMembers; - } + accounts = getMembers(group); } // If the vote piece looks like Code-Review=NEED with a valid non-numeric @@ -923,12 +909,24 @@ public class ChangeQueryBuilder extends QueryBuilder { } @Operator - public Predicate ownerin(String group) throws QueryParseException { + public Predicate ownerin(String group) throws QueryParseException, OrmException { GroupReference g = GroupBackends.findBestSuggestion(args.groupBackend, group); if (g == null) { throw error("Group " + group + " not found"); } - return new OwnerinPredicate(args.userFactory, g.getUUID()); + + AccountGroup.UUID groupId = g.getUUID(); + GroupDescription.Basic groupDescription = args.groupBackend.get(groupId); + if (!(groupDescription instanceof GroupDescription.Internal)) { + return new OwnerinPredicate(args.userFactory, groupId); + } + + Set accounts = getMembers(groupId); + List p = Lists.newArrayListWithCapacity(accounts.size()); + for (Account.Id id : accounts) { + p.add(new OwnerPredicate(id)); + } + return Predicate.or(p); } @Operator @@ -1134,6 +1132,26 @@ public class ChangeQueryBuilder extends QueryBuilder { return Predicate.or(predicates); } + private Set getMembers(AccountGroup.UUID g) throws OrmException { + Set accounts; + Set allMembers = + args.listMembers + .get() + .setRecursive(true) + .apply(g) + .stream() + .map(a -> new Account.Id(a._accountId)) + .collect(toSet()); + int maxTerms = args.indexConfig.maxTerms(); + if (allMembers.size() > maxTerms) { + // limit the number of query terms otherwise Gerrit will barf + accounts = ImmutableSet.copyOf(Iterables.limit(allMembers, maxTerms)); + } else { + accounts = allMembers; + } + return accounts; + } + private Set parseAccount(String who) throws QueryParseException, OrmException { if ("self".equals(who)) { return Collections.singleton(self());