diff options
5 files changed, 45 insertions, 15 deletions
diff --git a/java/com/google/gerrit/server/query/change/ChangePredicates.java b/java/com/google/gerrit/server/query/change/ChangePredicates.java index 6d4d74dadd..14e40bdf85 100644 --- a/java/com/google/gerrit/server/query/change/ChangePredicates.java +++ b/java/com/google/gerrit/server/query/change/ChangePredicates.java @@ -23,10 +23,12 @@ import com.google.gerrit.entities.PatchSet; import com.google.gerrit.entities.Project; import com.google.gerrit.git.ObjectIds; import com.google.gerrit.index.query.Predicate; +import com.google.gerrit.index.query.QueryParseException; import com.google.gerrit.server.DraftCommentsReader; import com.google.gerrit.server.StarredChangesUtil; import com.google.gerrit.server.change.HashtagsUtil; import com.google.gerrit.server.index.change.ChangeField; +import com.google.inject.ImplementedBy; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -61,12 +63,25 @@ public class ChangePredicates { return new ChangeIndexPredicate(ChangeField.COMMENTBY_SPEC, id.toString()); } + @ImplementedBy(IndexEditByPredicateProvider.class) + public interface EditByPredicateProvider { + + /** + * Returns a predicate that matches changes where the provided {@link + * com.google.gerrit.entities.Account.Id} has a pending change edit. + */ + Predicate<ChangeData> editBy(Account.Id id) throws QueryParseException; + } + /** - * Returns a predicate that matches changes where the provided {@link - * com.google.gerrit.entities.Account.Id} has a pending change edit. + * A default implementation of {@link EditByPredicateProvider}, based on th {@link + * ChangeField#EDITBY_SPEC} index field. */ - public static Predicate<ChangeData> editBy(Account.Id id) { - return new ChangeIndexPredicate(ChangeField.EDITBY_SPEC, id.toString()); + public static class IndexEditByPredicateProvider implements EditByPredicateProvider { + @Override + public Predicate<ChangeData> editBy(Account.Id id) { + return new ChangeIndexPredicate(ChangeField.EDITBY_SPEC, id.toString()); + } } /** diff --git a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java index b3fa087f18..f8a4a9909e 100644 --- a/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java +++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java @@ -89,6 +89,7 @@ import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.plugincontext.PluginSetContext; import com.google.gerrit.server.project.ChildProjects; import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.query.change.ChangePredicates.EditByPredicateProvider; import com.google.gerrit.server.query.change.PredicateArgs.ValOp; import com.google.gerrit.server.rules.SubmitRule; import com.google.gerrit.server.submit.SubmitDryRun; @@ -284,6 +285,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil private final Provider<CurrentUser> self; + private final EditByPredicateProvider editByPredicateProvider; + @Inject @VisibleForTesting public Arguments( @@ -318,7 +321,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil ExperimentFeatures experimentFeatures, HasOperandAliasConfig hasOperandAliasConfig, ChangeIsVisibleToPredicate.Factory changeIsVisbleToPredicateFactory, - PluginSetContext<SubmitRule> submitRules) { + PluginSetContext<SubmitRule> submitRules, + EditByPredicateProvider editByPredicateProvider) { this( queryProvider, rewriter, @@ -352,7 +356,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil experimentFeatures, hasOperandAliasConfig, changeIsVisbleToPredicateFactory, - submitRules); + submitRules, + editByPredicateProvider); } private Arguments( @@ -388,7 +393,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil ExperimentFeatures experimentFeatures, HasOperandAliasConfig hasOperandAliasConfig, ChangeIsVisibleToPredicate.Factory changeIsVisbleToPredicateFactory, - PluginSetContext<SubmitRule> submitRules) { + PluginSetContext<SubmitRule> submitRules, + EditByPredicateProvider editByPredicateProvider) { this.queryProvider = queryProvider; this.rewriter = rewriter; this.opFactories = opFactories; @@ -422,6 +428,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil this.experimentFeatures = experimentFeatures; this.hasOperandAliasConfig = hasOperandAliasConfig; this.submitRules = submitRules; + this.editByPredicateProvider = editByPredicateProvider; } public Arguments asUser(CurrentUser otherUser) { @@ -458,7 +465,8 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil experimentFeatures, hasOperandAliasConfig, changeIsVisbleToPredicateFactory, - submitRules); + submitRules, + editByPredicateProvider); } Arguments asUser(Account.Id otherId) { @@ -646,7 +654,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil } if ("edit".equalsIgnoreCase(value)) { - return ChangePredicates.editBy(self()); + return this.args.editByPredicateProvider.editBy(self()); } if ("attention".equalsIgnoreCase(value)) { @@ -1847,7 +1855,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData, ChangeQueryBuil } /** Returns {@link com.google.gerrit.entities.Account.Id} of the identified calling user. */ - public Account.Id self() throws QueryParseException { + private Account.Id self() throws QueryParseException { return args.getIdentifiedUser().getAccountId(); } diff --git a/java/com/google/gerrit/server/query/change/InternalChangeQuery.java b/java/com/google/gerrit/server/query/change/InternalChangeQuery.java index 3e471fbcc0..5993c76914 100644 --- a/java/com/google/gerrit/server/query/change/InternalChangeQuery.java +++ b/java/com/google/gerrit/server/query/change/InternalChangeQuery.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.gerrit.index.query.Predicate.and; import static com.google.gerrit.index.query.Predicate.not; import static com.google.gerrit.index.query.Predicate.or; +import static com.google.gerrit.server.query.change.ChangePredicates.EditByPredicateProvider; import static com.google.gerrit.server.query.change.ChangeStatusPredicate.open; import com.google.common.annotations.VisibleForTesting; @@ -35,6 +36,7 @@ import com.google.gerrit.entities.RefNames; import com.google.gerrit.index.IndexConfig; import com.google.gerrit.index.query.InternalQuery; import com.google.gerrit.index.query.Predicate; +import com.google.gerrit.index.query.QueryParseException; import com.google.gerrit.server.index.change.ChangeField; import com.google.gerrit.server.index.change.ChangeIndexCollection; import com.google.gerrit.server.notedb.ChangeNotes; @@ -75,8 +77,8 @@ public class InternalChangeQuery extends InternalQuery<ChangeData, InternalChang return ChangeStatusPredicate.forStatus(status); } - private static Predicate<ChangeData> editBy(Account.Id accountId) { - return ChangePredicates.editBy(accountId); + private Predicate<ChangeData> editBy(Account.Id accountId) throws QueryParseException { + return editByPredicateProvider.editBy(accountId); } private static Predicate<ChangeData> commit(String id) { @@ -85,6 +87,7 @@ public class InternalChangeQuery extends InternalQuery<ChangeData, InternalChang private final ChangeData.Factory changeDataFactory; private final ChangeNotes.Factory notesFactory; + private final EditByPredicateProvider editByPredicateProvider; @Inject InternalChangeQuery( @@ -92,10 +95,12 @@ public class InternalChangeQuery extends InternalQuery<ChangeData, InternalChang ChangeIndexCollection indexes, IndexConfig indexConfig, ChangeData.Factory changeDataFactory, - ChangeNotes.Factory notesFactory) { + ChangeNotes.Factory notesFactory, + EditByPredicateProvider editByPredicateProvider) { super(queryProcessor, indexes, indexConfig); this.changeDataFactory = changeDataFactory; this.notesFactory = notesFactory; + this.editByPredicateProvider = editByPredicateProvider; } public List<ChangeData> byKey(Change.Key key) { @@ -221,7 +226,7 @@ public class InternalChangeQuery extends InternalQuery<ChangeData, InternalChang return query(and(ChangePredicates.exactTopic(topic), open())); } - public List<ChangeData> byOpenEditByUser(Account.Id accountId) { + public List<ChangeData> byOpenEditByUser(Account.Id accountId) throws QueryParseException { return query(editBy(accountId)); } diff --git a/java/com/google/gerrit/server/restapi/account/DeleteAccount.java b/java/com/google/gerrit/server/restapi/account/DeleteAccount.java index 9b4c0a6657..0831ff99b3 100644 --- a/java/com/google/gerrit/server/restapi/account/DeleteAccount.java +++ b/java/com/google/gerrit/server/restapi/account/DeleteAccount.java @@ -26,6 +26,7 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.gpg.PublicKeyStoreUtil; +import com.google.gerrit.index.query.QueryParseException; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.GerritPersonIdent; import com.google.gerrit.server.IdentifiedUser; @@ -166,7 +167,7 @@ public class DeleteAccount implements RestModifyView<AccountResource, Input> { } } - private void deleteChangeEdits(Account.Id accountId) throws IOException { + private void deleteChangeEdits(Account.Id accountId) throws IOException, QueryParseException { // Note: in case of a stale index, the results of this query might be incomplete. List<ChangeData> changesWithEdits = queryProvider.get().byOpenEditByUser(accountId); diff --git a/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java index ea8e0a74b3..90a9b9d631 100644 --- a/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java +++ b/javatests/com/google/gerrit/server/index/change/FakeQueryBuilder.java @@ -59,6 +59,7 @@ public class FakeQueryBuilder extends ChangeQueryBuilder { null, null, null, + null, null)); } |