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]]
 | 
					[[suggest-account]]
 | 
				
			||||||
To get account suggestions set the parameter `suggest` and provide the
 | 
					To get account suggestions set the parameter `suggest` and provide the
 | 
				
			||||||
typed substring as query `q`. If a result limit `n` is not specified,
 | 
					typed substring as query `q`. If a result limit `n` is not specified,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,6 +140,7 @@ public interface Accounts {
 | 
				
			|||||||
  abstract class QueryRequest {
 | 
					  abstract class QueryRequest {
 | 
				
			||||||
    private String query;
 | 
					    private String query;
 | 
				
			||||||
    private int limit;
 | 
					    private int limit;
 | 
				
			||||||
 | 
					    private int start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Executes query and returns a list of accounts.
 | 
					     * Executes query and returns a list of accounts.
 | 
				
			||||||
@@ -165,6 +166,15 @@ public interface Accounts {
 | 
				
			|||||||
      return this;
 | 
					      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() {
 | 
					    public String getQuery() {
 | 
				
			||||||
      return query;
 | 
					      return query;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -172,6 +182,10 @@ public interface Accounts {
 | 
				
			|||||||
    public int getLimit() {
 | 
					    public int getLimit() {
 | 
				
			||||||
      return limit;
 | 
					      return limit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public int getStart() {
 | 
				
			||||||
 | 
					      return start;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,7 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
				
			|||||||
  private boolean suggest;
 | 
					  private boolean suggest;
 | 
				
			||||||
  private int suggestLimit = 10;
 | 
					  private int suggestLimit = 10;
 | 
				
			||||||
  private String query;
 | 
					  private String query;
 | 
				
			||||||
 | 
					  private Integer start;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Option(name = "--suggest", metaVar = "SUGGEST", usage = "suggest users")
 | 
					  @Option(name = "--suggest", metaVar = "SUGGEST", usage = "suggest users")
 | 
				
			||||||
  public void setSuggest(boolean suggest) {
 | 
					  public void setSuggest(boolean suggest) {
 | 
				
			||||||
@@ -87,6 +88,12 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
				
			|||||||
    this.query = query;
 | 
					    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
 | 
					  @Inject
 | 
				
			||||||
  QueryAccounts(AccountControl.Factory accountControlFactory,
 | 
					  QueryAccounts(AccountControl.Factory accountControlFactory,
 | 
				
			||||||
      AccountLoader.Factory accountLoaderFactory,
 | 
					      AccountLoader.Factory accountLoaderFactory,
 | 
				
			||||||
@@ -139,6 +146,9 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
				
			|||||||
      if (!suggest) {
 | 
					      if (!suggest) {
 | 
				
			||||||
        throw new MethodNotAllowedException();
 | 
					        throw new MethodNotAllowedException();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      if (start != null) {
 | 
				
			||||||
 | 
					        throw new MethodNotAllowedException("option start not allowed");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      matches = queryFromDb();
 | 
					      matches = queryFromDb();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -151,6 +161,10 @@ public class QueryAccounts implements RestReadView<TopLevelResource> {
 | 
				
			|||||||
      throw new MethodNotAllowedException("query disabled");
 | 
					      throw new MethodNotAllowedException("query disabled");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (start != null) {
 | 
				
			||||||
 | 
					      queryProcessor.setStart(start);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Map<Account.Id, AccountInfo> matches = new LinkedHashMap<>();
 | 
					    Map<Account.Id, AccountInfo> matches = new LinkedHashMap<>();
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      Predicate<AccountState> queryPred;
 | 
					      Predicate<AccountState> queryPred;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -123,6 +123,7 @@ public class AccountsImpl implements Accounts {
 | 
				
			|||||||
      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
 | 
					      QueryAccounts myQueryAccounts = queryAccountsProvider.get();
 | 
				
			||||||
      myQueryAccounts.setQuery(r.getQuery());
 | 
					      myQueryAccounts.setQuery(r.getQuery());
 | 
				
			||||||
      myQueryAccounts.setLimit(r.getLimit());
 | 
					      myQueryAccounts.setLimit(r.getLimit());
 | 
				
			||||||
 | 
					      myQueryAccounts.setStart(r.getStart());
 | 
				
			||||||
      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
 | 
					      return myQueryAccounts.apply(TopLevelResource.INSTANCE);
 | 
				
			||||||
    } catch (OrmException e) {
 | 
					    } catch (OrmException e) {
 | 
				
			||||||
      throw new RestApiException("Cannot retrieve suggested accounts", e);
 | 
					      throw new RestApiException("Cannot retrieve suggested accounts", e);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,6 +57,6 @@ public class AccountQueryProcessor extends QueryProcessor<AccountState> {
 | 
				
			|||||||
  protected Predicate<AccountState> enforceVisibility(
 | 
					  protected Predicate<AccountState> enforceVisibility(
 | 
				
			||||||
      Predicate<AccountState> pred) {
 | 
					      Predicate<AccountState> pred) {
 | 
				
			||||||
    return new AndSource<>(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);
 | 
					    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 {
 | 
					  protected AccountInfo newAccount(String username) throws Exception {
 | 
				
			||||||
    return newAccountWithEmail(username, null);
 | 
					    return newAccountWithEmail(username, null);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user