Set '_more_accounts' on last account of query result
If the number of accounts matching the query exceeds the limit the last account has a '_more_accounts: true' JSON field set. Change-Id: Icc8c34c37c72f7df00bb06c67602bea36a4ae09f Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
@@ -23,7 +23,7 @@ returned.
|
|||||||
|
|
||||||
.Request
|
.Request
|
||||||
----
|
----
|
||||||
GET /accounts/?q=name:John+email:example.com HTTP/1.0
|
GET /accounts/?q=name:John+email:example.com&n=2 HTTP/1.0
|
||||||
----
|
----
|
||||||
|
|
||||||
.Response
|
.Response
|
||||||
@@ -44,11 +44,16 @@ returned.
|
|||||||
"_account_id": 1001439,
|
"_account_id": 1001439,
|
||||||
"name": "John Smith",
|
"name": "John Smith",
|
||||||
"email": "john.smith@example.com",
|
"email": "john.smith@example.com",
|
||||||
"username": "jsmith"
|
"username": "jsmith",
|
||||||
|
"_more_accounts": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
----
|
----
|
||||||
|
|
||||||
|
If the number of accounts matching the query exceeds either the
|
||||||
|
internal limit or a supplied `n` query parameter, the last account
|
||||||
|
object has a `_more_accounts: true` JSON field set.
|
||||||
|
|
||||||
The `S` or `start` query parameter can be supplied to skip a number
|
The `S` or `start` query parameter can be supplied to skip a number
|
||||||
of accounts from the list.
|
of accounts from the list.
|
||||||
|
|
||||||
@@ -1938,20 +1943,23 @@ registered.
|
|||||||
The `AccountInfo` entity contains information about an account.
|
The `AccountInfo` entity contains information about an account.
|
||||||
|
|
||||||
[options="header",cols="1,^1,5"]
|
[options="header",cols="1,^1,5"]
|
||||||
|===========================
|
|=============================
|
||||||
|Field Name ||Description
|
|Field Name ||Description
|
||||||
|`_account_id` ||The numeric ID of the account.
|
|`_account_id` ||The numeric ID of the account.
|
||||||
|`name` |optional|The full name of the user. +
|
|`name` |optional|The full name of the user. +
|
||||||
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
||||||
account information] is requested.
|
account information] is requested.
|
||||||
|`email` |optional|
|
|`email` |optional|
|
||||||
The email address the user prefers to be contacted through. +
|
The email address the user prefers to be contacted through. +
|
||||||
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
||||||
account information] is requested.
|
account information] is requested.
|
||||||
|`username` |optional|The username of the user. +
|
|`username` |optional|The username of the user. +
|
||||||
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
Only set if link:rest-api-changes.html#detailed-accounts[detailed
|
||||||
account information] is requested.
|
account information] is requested.
|
||||||
|===========================
|
|`_more_accounts`|optional, not set if `false`|
|
||||||
|
Whether the query would deliver more results if not limited. +
|
||||||
|
Only set on the last account that is returned.
|
||||||
|
|=============================
|
||||||
|
|
||||||
[[account-input]]
|
[[account-input]]
|
||||||
=== AccountInput
|
=== AccountInput
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public class AccountInfo {
|
|||||||
public String email;
|
public String email;
|
||||||
public String username;
|
public String username;
|
||||||
public List<AvatarInfo> avatars;
|
public List<AvatarInfo> avatars;
|
||||||
|
public Boolean _moreAccounts;
|
||||||
|
|
||||||
public AccountInfo(Integer id) {
|
public AccountInfo(Integer id) {
|
||||||
this._accountId = id;
|
this._accountId = id;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
package com.google.gerrit.server.account;
|
package com.google.gerrit.server.account;
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.gerrit.extensions.common.AccountInfo;
|
import com.google.gerrit.extensions.common.AccountInfo;
|
||||||
import com.google.gerrit.extensions.restapi.BadRequestException;
|
import com.google.gerrit.extensions.restapi.BadRequestException;
|
||||||
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
|
||||||
@@ -39,7 +39,6 @@ import com.google.inject.Inject;
|
|||||||
import org.eclipse.jgit.lib.Config;
|
import org.eclipse.jgit.lib.Config;
|
||||||
import org.kohsuke.args4j.Option;
|
import org.kohsuke.args4j.Option;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
@@ -139,23 +138,20 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AccountIndex searchIndex = indexes.getSearchIndex();
|
AccountIndex searchIndex = indexes.getSearchIndex();
|
||||||
Collection<AccountInfo> matches;
|
|
||||||
if (searchIndex != null) {
|
if (searchIndex != null) {
|
||||||
matches = queryFromIndex();
|
return queryFromIndex();
|
||||||
} else {
|
|
||||||
if (!suggest) {
|
|
||||||
throw new MethodNotAllowedException();
|
|
||||||
}
|
|
||||||
if (start != null) {
|
|
||||||
throw new MethodNotAllowedException("option start not allowed");
|
|
||||||
}
|
|
||||||
matches = queryFromDb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return AccountInfoComparator.ORDER_NULLS_LAST.sortedCopy(matches);
|
if (!suggest) {
|
||||||
|
throw new MethodNotAllowedException();
|
||||||
|
}
|
||||||
|
if (start != null) {
|
||||||
|
throw new MethodNotAllowedException("option start not allowed");
|
||||||
|
}
|
||||||
|
return queryFromDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<AccountInfo> queryFromIndex()
|
public List<AccountInfo> queryFromIndex()
|
||||||
throws BadRequestException, MethodNotAllowedException, OrmException {
|
throws BadRequestException, MethodNotAllowedException, OrmException {
|
||||||
if (queryProcessor.isDisabled()) {
|
if (queryProcessor.isDisabled()) {
|
||||||
throw new MethodNotAllowedException("query disabled");
|
throw new MethodNotAllowedException("query disabled");
|
||||||
@@ -179,18 +175,24 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
|
|||||||
Account.Id id = accountState.getAccount().getId();
|
Account.Id id = accountState.getAccount().getId();
|
||||||
matches.put(id, accountLoader.get(id));
|
matches.put(id, accountLoader.get(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
accountLoader.fill();
|
||||||
|
|
||||||
|
List<AccountInfo> sorted =
|
||||||
|
AccountInfoComparator.ORDER_NULLS_LAST.sortedCopy(matches.values());
|
||||||
|
if (!sorted.isEmpty() && result.more()) {
|
||||||
|
sorted.get(sorted.size() - 1)._moreAccounts = true;
|
||||||
|
}
|
||||||
|
return sorted;
|
||||||
} catch (QueryParseException e) {
|
} catch (QueryParseException e) {
|
||||||
if (suggest) {
|
if (suggest) {
|
||||||
return ImmutableSet.of();
|
return ImmutableList.of();
|
||||||
}
|
}
|
||||||
throw new BadRequestException(e.getMessage());
|
throw new BadRequestException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
accountLoader.fill();
|
|
||||||
return matches.values();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<AccountInfo> queryFromDb() throws OrmException {
|
public List<AccountInfo> queryFromDb() throws OrmException {
|
||||||
String a = query;
|
String a = query;
|
||||||
String b = a + MAX_SUFFIX;
|
String b = a + MAX_SUFFIX;
|
||||||
|
|
||||||
@@ -223,7 +225,7 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return matches.values();
|
return AccountInfoComparator.ORDER_NULLS_LAST.sortedCopy(matches.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean addSuggestion(Map<Account.Id, AccountInfo> map, Account a) {
|
private boolean addSuggestion(Map<Account.Id, AccountInfo> map, Account a) {
|
||||||
|
|||||||
@@ -252,8 +252,11 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests {
|
|||||||
AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
|
AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
|
||||||
AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
|
AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
|
||||||
|
|
||||||
assertQuery(domain, user1, user2, user3);
|
List<AccountInfo> result = assertQuery(domain, user1, user2, user3);
|
||||||
assertQuery(newQuery(domain).withLimit(2), user1, user2);
|
assertThat(result.get(result.size() - 1)._moreAccounts).isNull();
|
||||||
|
|
||||||
|
result = assertQuery(newQuery(domain).withLimit(2), user1, user2);
|
||||||
|
assertThat(result.get(result.size() - 1)._moreAccounts).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user