QueryAccounts: Support parameter 'start'
The 'start' query parameter can be supplied to skip a number of accounts from the list. Change-Id: I31497d0db3ac6049a645fe2d29984797bd6cfcae Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
		@@ -49,6 +49,9 @@ returned.
 | 
			
		||||
  ]
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
The `S` or `start` query parameter can be supplied to skip a number
 | 
			
		||||
of accounts from the list.
 | 
			
		||||
 | 
			
		||||
[[suggest-account]]
 | 
			
		||||
To get account suggestions set the parameter `suggest` and provide the
 | 
			
		||||
typed substring as query `q`. If a result limit `n` is not specified,
 | 
			
		||||
 
 | 
			
		||||
@@ -140,6 +140,7 @@ public interface Accounts {
 | 
			
		||||
  abstract class QueryRequest {
 | 
			
		||||
    private String query;
 | 
			
		||||
    private int limit;
 | 
			
		||||
    private int start;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Executes query and returns a list of accounts.
 | 
			
		||||
@@ -165,6 +166,15 @@ public interface Accounts {
 | 
			
		||||
      return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set number of accounts to skip.
 | 
			
		||||
     * Optional; no accounts are skipped when not provided.
 | 
			
		||||
     */
 | 
			
		||||
    public QueryRequest withStart(int start) {
 | 
			
		||||
      this.start = start;
 | 
			
		||||
      return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getQuery() {
 | 
			
		||||
      return query;
 | 
			
		||||
    }
 | 
			
		||||
@@ -172,6 +182,10 @@ public interface Accounts {
 | 
			
		||||
    public int getLimit() {
 | 
			
		||||
      return limit;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getStart() {
 | 
			
		||||
      return start;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -63,6 +63,7 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
			
		||||
  private boolean suggest;
 | 
			
		||||
  private int suggestLimit = 10;
 | 
			
		||||
  private String query;
 | 
			
		||||
  private Integer start;
 | 
			
		||||
 | 
			
		||||
  @Option(name = "--suggest", metaVar = "SUGGEST", usage = "suggest users")
 | 
			
		||||
  public void setSuggest(boolean suggest) {
 | 
			
		||||
@@ -87,6 +88,12 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
			
		||||
    this.query = query;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Option(name = "--start", aliases = {"-S"}, metaVar = "CNT",
 | 
			
		||||
      usage = "Number of accounts to skip")
 | 
			
		||||
  public void setStart(int start) {
 | 
			
		||||
    this.start = start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Inject
 | 
			
		||||
  QueryAccounts(AccountControl.Factory accountControlFactory,
 | 
			
		||||
      AccountLoader.Factory accountLoaderFactory,
 | 
			
		||||
@@ -139,6 +146,9 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
			
		||||
      if (!suggest) {
 | 
			
		||||
        throw new MethodNotAllowedException();
 | 
			
		||||
      }
 | 
			
		||||
      if (start != null) {
 | 
			
		||||
        throw new MethodNotAllowedException("option start not allowed");
 | 
			
		||||
      }
 | 
			
		||||
      matches = queryFromDb();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -151,6 +161,10 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
			
		||||
      throw new MethodNotAllowedException("query disabled");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (start != null) {
 | 
			
		||||
      queryProcessor.setStart(start);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Map<Account.Id, AccountInfo> matches = new LinkedHashMap<>();
 | 
			
		||||
    try {
 | 
			
		||||
      Predicate<AccountState> queryPred;
 | 
			
		||||
 
 | 
			
		||||
@@ -123,6 +123,7 @@ public class AccountsImpl implements Accounts {
 | 
			
		||||
      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
 | 
			
		||||
      myQueryAccounts.setQuery(r.getQuery());
 | 
			
		||||
      myQueryAccounts.setLimit(r.getLimit());
 | 
			
		||||
      myQueryAccounts.setStart(r.getStart());
 | 
			
		||||
      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
 | 
			
		||||
    } catch (OrmException e) {
 | 
			
		||||
      throw new RestApiException("Cannot retrieve suggested accounts", e);
 | 
			
		||||
 
 | 
			
		||||
@@ -57,6 +57,6 @@ public class AccountQueryProcessor extends QueryProcessor<AccountState> {
 | 
			
		||||
  protected Predicate<AccountState> enforceVisibility(
 | 
			
		||||
      Predicate<AccountState> pred) {
 | 
			
		||||
    return new AndSource<>(pred,
 | 
			
		||||
        new AccountIsVisibleToPredicate(accountControlFactory.get()));
 | 
			
		||||
        new AccountIsVisibleToPredicate(accountControlFactory.get()), start);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -256,6 +256,17 @@ public abstract class AbstractQueryAccountsTest extends GerritServerTests {
 | 
			
		||||
    assertQuery(newQuery(domain).withLimit(2), user1, user2);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Test
 | 
			
		||||
  public void withStart() throws Exception {
 | 
			
		||||
    String domain = name("test.com");
 | 
			
		||||
    AccountInfo user1 = newAccountWithEmail("user1", "user1@" + domain);
 | 
			
		||||
    AccountInfo user2 = newAccountWithEmail("user2", "user2@" + domain);
 | 
			
		||||
    AccountInfo user3 = newAccountWithEmail("user3", "user3@" + domain);
 | 
			
		||||
 | 
			
		||||
    assertQuery(domain, user1, user2, user3);
 | 
			
		||||
    assertQuery(newQuery(domain).withStart(1), user2, user3);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected AccountInfo newAccount(String username) throws Exception {
 | 
			
		||||
    return newAccountWithEmail(username, null);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user