Use account index to suggest user groups
Change-Id: I7fde306e8580e8e85e7eccc685b8d693faf6b43a
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java b/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
index 5274df9..0c67e27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/singleusergroup/SingleUserGroup.java
@@ -16,6 +16,7 @@
import static com.google.common.base.Preconditions.checkArgument;
+import com.google.common.base.Function;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -35,7 +36,11 @@
import com.google.gerrit.server.account.GroupBackend;
import com.google.gerrit.server.account.GroupMembership;
import com.google.gerrit.server.account.ListGroupMembership;
+import com.google.gerrit.server.index.account.AccountIndexCollection;
import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.query.QueryParseException;
+import com.google.gerrit.server.query.account.AccountQueryBuilder;
+import com.google.gerrit.server.query.account.AccountQueryProcessor;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.AbstractModule;
@@ -78,13 +83,23 @@
private final SchemaFactory<ReviewDb> schemaFactory;
private final AccountCache accountCache;
private final AccountControl.Factory accountControlFactory;
+ private final AccountIndexCollection accountIndexes;
+ private final AccountQueryBuilder queryBuilder;
+ private final AccountQueryProcessor queryProcessor;
+
@Inject
SingleUserGroup(SchemaFactory<ReviewDb> schemaFactory,
AccountCache accountCache,
- AccountControl.Factory accountControlFactory) {
+ AccountControl.Factory accountControlFactory,
+ AccountIndexCollection accountIndexes,
+ AccountQueryBuilder queryBuilder,
+ AccountQueryProcessor queryProcessor) {
this.schemaFactory = schemaFactory;
this.accountCache = accountCache;
this.accountControlFactory = accountControlFactory;
+ this.accountIndexes = accountIndexes;
+ this.queryBuilder = queryBuilder;
+ this.queryProcessor = queryProcessor;
}
@Override
@@ -148,6 +163,39 @@
public Collection<GroupReference> suggest(
String name,
@Nullable ProjectControl project) {
+ if (accountIndexes.getSearchIndex() != null) {
+ return suggestFromIndex(name);
+ }
+
+ return suggestFromDb(name);
+ }
+
+ private Collection<GroupReference> suggestFromIndex(String name) {
+ try {
+ return Lists
+ .transform(
+ queryProcessor
+ .setLimit(MAX)
+ .query(queryBuilder.defaultQuery(name)).entities(),
+ new Function<AccountState, GroupReference>() {
+ @Override
+ public GroupReference apply(AccountState state) {
+ AccountGroup.UUID uuid;
+ if (state.getUserName() != null) {
+ uuid = uuid(state.getUserName());
+ } else {
+ uuid = uuid(state.getAccount().getId());
+ }
+ return new GroupReference(uuid, nameOf(uuid, state));
+ }
+ });
+ } catch (OrmException | QueryParseException err) {
+ log.warn("Cannot suggest users", err);
+ return Collections.emptyList();
+ }
+ }
+
+ private Collection<GroupReference> suggestFromDb(String name) {
if (name.startsWith(NAME_PREFIX)) {
name = name.substring(NAME_PREFIX.length());
} else if (name.startsWith(ACCOUNT_PREFIX)) {