Set '_more_groups' on last group of query result

If the number of groups matching the query exceeds the limit the
last group has a '_more_groups: true' JSON field set.

Change-Id: I6f1fcda58813e2c7b5dc788d88b989c377afec7e
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin
2017-01-03 15:16:17 +01:00
parent fffc6ddc37
commit fadf363ef0
4 changed files with 21 additions and 5 deletions

View File

@@ -249,6 +249,10 @@ As result a list of link:#group-info[GroupInfo] entities is returned.
] ]
---- ----
If the number of groups matching the query exceeds either the internal
limit or a supplied `limit` query parameter, the last group object has
a `_more_groups: true` JSON field set.
[[group-query-limit]] [[group-query-limit]]
==== Group Limit ==== Group Limit
The `/groups/?query2=<query>` URL also accepts a limit integer in the The `/groups/?query2=<query>` URL also accepts a limit integer in the
@@ -1341,6 +1345,10 @@ permits users to apply to join the group, or manage their membership.
|`group_id` |only for internal groups|The numeric ID of the group. |`group_id` |only for internal groups|The numeric ID of the group.
|`owner` |only for internal groups|The name of the owner group. |`owner` |only for internal groups|The name of the owner group.
|`owner_id` |only for internal groups|The URL encoded UUID of the owner group. |`owner_id` |only for internal groups|The URL encoded UUID of the owner group.
|`_more_groups`|optional, only for internal groups, not set if `false`|
Whether the query would deliver more results if not limited. +
Only set on the last group that is returned by a
link:#query-groups[group query].
|`members` |optional, only for internal groups| |`members` |optional, only for internal groups|
A list of link:rest-api-accounts.html#account-info[AccountInfo] A list of link:rest-api-accounts.html#account-info[AccountInfo]
entities describing the direct members. + entities describing the direct members. +

View File

@@ -25,6 +25,7 @@ public class GroupInfo extends GroupBaseInfo {
public Integer groupId; public Integer groupId;
public String owner; public String owner;
public String ownerId; public String ownerId;
public Boolean _moreGroups;
// These fields are only supplied for internal groups, and only if requested. // These fields are only supplied for internal groups, and only if requested.
public List<AccountInfo> members; public List<AccountInfo> members;

View File

@@ -27,6 +27,7 @@ import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.server.index.group.GroupIndex; import com.google.gerrit.server.index.group.GroupIndex;
import com.google.gerrit.server.index.group.GroupIndexCollection; import com.google.gerrit.server.index.group.GroupIndexCollection;
import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.QueryParseException;
import com.google.gerrit.server.query.QueryResult;
import com.google.gerrit.server.query.group.GroupQueryBuilder; import com.google.gerrit.server.query.group.GroupQueryBuilder;
import com.google.gerrit.server.query.group.GroupQueryProcessor; import com.google.gerrit.server.query.group.GroupQueryProcessor;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
@@ -110,15 +111,19 @@ public class QueryGroups implements RestReadView<TopLevelResource> {
} }
try { try {
List<AccountGroup> result = QueryResult<AccountGroup> result =
queryProcessor.query(queryBuilder.parse(query)).entities(); queryProcessor.query(queryBuilder.parse(query));
List<AccountGroup> groups = result.entities();
ArrayList<GroupInfo> groupInfos = ArrayList<GroupInfo> groupInfos =
Lists.newArrayListWithCapacity(result.size()); Lists.newArrayListWithCapacity(groups.size());
json.addOptions(options); json.addOptions(options);
for (AccountGroup group : result) { for (AccountGroup group : groups) {
groupInfos.add(json.format(GroupDescriptions.forAccountGroup(group))); groupInfos.add(json.format(GroupDescriptions.forAccountGroup(group)));
} }
if (!groupInfos.isEmpty() && result.more()) {
groupInfos.get(groupInfos.size() - 1)._moreGroups = true;
}
return groupInfos; return groupInfos;
} catch (QueryParseException e) { } catch (QueryParseException e) {
throw new BadRequestException(e.getMessage()); throw new BadRequestException(e.getMessage());

View File

@@ -193,8 +193,10 @@ public abstract class AbstractQueryGroupsTest extends GerritServerTests {
String query = String query =
"uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id; "uuid:" + group1.id + " OR uuid:" + group2.id + " OR uuid:" + group3.id;
List<GroupInfo> result = assertQuery(query, group1, group2, group3); List<GroupInfo> result = assertQuery(query, group1, group2, group3);
assertThat(result.get(result.size() - 1)._moreGroups).isNull();
assertQuery(newQuery(query).withLimit(2), result.subList(0, 2)); result = assertQuery(newQuery(query).withLimit(2), result.subList(0, 2));
assertThat(result.get(result.size() - 1)._moreGroups).isTrue();
} }
@Test @Test