From 60ac9201cab1d23236f7aede48ff72a4c6d356a5 Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Wed, 22 May 2013 16:52:25 -0700 Subject: [PATCH] Index change status in the secondary index Change-Id: I4dd8a815c1886be4e955267b0d9d2e23d0e41a4b --- .../google/gerrit/server/change/Abandon.java | 7 ++++- .../google/gerrit/server/change/Restore.java | 7 ++++- .../google/gerrit/server/change/Submit.java | 7 ++++- .../server/changedetail/PublishDraft.java | 9 ++++++ .../server/changedetail/RebaseChange.java | 19 ++++++++---- .../com/google/gerrit/server/git/MergeOp.java | 8 ++++- .../gerrit/server/git/RebaseIfNecessary.java | 2 +- .../gerrit/server/git/ReceiveCommits.java | 31 ++++++++++++------- .../gerrit/server/git/SubmitStrategy.java | 6 +++- .../server/git/SubmitStrategyFactory.java | 8 +++-- .../gerrit/server/index/ChangeField.java | 13 ++++++++ .../query/change/ChangeStatusPredicate.java | 11 ++++--- 12 files changed, 97 insertions(+), 31 deletions(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java index f766297a6f..20e7681e9b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Abandon.java @@ -28,6 +28,7 @@ import com.google.gerrit.server.ApprovalsUtil; import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.change.Abandon.Input; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.AbandonedSender; import com.google.gerrit.server.mail.ReplyToChangeSender; import com.google.gerrit.server.project.ChangeControl; @@ -48,6 +49,7 @@ public class Abandon implements RestModifyView { private final AbandonedSender.Factory abandonedSenderFactory; private final Provider dbProvider; private final ChangeJson json; + private final ChangeIndexer indexer; public static class Input { @DefaultInput @@ -58,11 +60,13 @@ public class Abandon implements RestModifyView { Abandon(ChangeHooks hooks, AbandonedSender.Factory abandonedSenderFactory, Provider dbProvider, - ChangeJson json) { + ChangeJson json, + ChangeIndexer indexer) { this.hooks = hooks; this.abandonedSenderFactory = abandonedSenderFactory; this.dbProvider = dbProvider; this.json = json; + this.indexer = indexer; } @Override @@ -107,6 +111,7 @@ public class Abandon implements RestModifyView { db.rollback(); } + indexer.index(change); try { ReplyToChangeSender cm = abandonedSenderFactory.create(change); cm.setFrom(caller.getAccountId()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java index afb58f9f99..001ed032d2 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Restore.java @@ -28,6 +28,7 @@ import com.google.gerrit.server.ApprovalsUtil; import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.change.Restore.Input; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.ReplyToChangeSender; import com.google.gerrit.server.mail.RestoredSender; import com.google.gerrit.server.project.ChangeControl; @@ -48,6 +49,7 @@ public class Restore implements RestModifyView { private final RestoredSender.Factory restoredSenderFactory; private final Provider dbProvider; private final ChangeJson json; + private final ChangeIndexer indexer; public static class Input { @DefaultInput @@ -58,11 +60,13 @@ public class Restore implements RestModifyView { Restore(ChangeHooks hooks, RestoredSender.Factory restoredSenderFactory, Provider dbProvider, - ChangeJson json) { + ChangeJson json, + ChangeIndexer indexer) { this.hooks = hooks; this.restoredSenderFactory = restoredSenderFactory; this.dbProvider = dbProvider; this.json = json; + this.indexer = indexer; } @Override @@ -98,6 +102,7 @@ public class Restore implements RestModifyView { throw new ResourceConflictException("change is " + status(db.changes().get(req.getChange().getId()))); } + indexer.index(change); message = newMessage(input, caller, change); db.changeMessages().insert(Collections.singleton(message)); new ApprovalsUtil(db).syncChangeStatus(change); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java index 2b51b0a802..e236abbf23 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Submit.java @@ -36,6 +36,7 @@ import com.google.gerrit.server.ProjectUtil; import com.google.gerrit.server.change.Submit.Input; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.MergeQueue; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.project.ChangeControl; import com.google.gwtorm.server.AtomicUpdate; import com.google.gwtorm.server.OrmException; @@ -72,14 +73,17 @@ public class Submit implements RestModifyView { private final Provider dbProvider; private final GitRepositoryManager repoManager; private final MergeQueue mergeQueue; + private final ChangeIndexer indexer; @Inject Submit(Provider dbProvider, GitRepositoryManager repoManager, - MergeQueue mergeQueue) { + MergeQueue mergeQueue, + ChangeIndexer indexer) { this.dbProvider = dbProvider; this.repoManager = repoManager; this.mergeQueue = mergeQueue; + this.indexer = indexer; } @Override @@ -187,6 +191,7 @@ public class Submit implements RestModifyView { } finally { db.rollback(); } + indexer.index(change); return change; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/PublishDraft.java b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/PublishDraft.java index 22eae2d9fa..6ece448ed3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/PublishDraft.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/PublishDraft.java @@ -33,6 +33,7 @@ import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountResolver; import com.google.gerrit.server.git.GitRepositoryManager; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.CreateChangeSender; import com.google.gerrit.server.mail.MailUtil.MailRecipients; import com.google.gerrit.server.mail.ReplacePatchSetSender; @@ -40,6 +41,7 @@ import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.patch.PatchSetInfoNotAvailableException; import com.google.gerrit.server.project.ChangeControl; import com.google.gerrit.server.project.NoSuchChangeException; +import com.google.gerrit.server.util.RequestScopePropagator; import com.google.gwtorm.server.AtomicUpdate; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; @@ -75,6 +77,8 @@ public class PublishDraft implements Callable { private final AccountResolver accountResolver; private final CreateChangeSender.Factory createChangeSenderFactory; private final ReplacePatchSetSender.Factory replacePatchSetFactory; + private final ChangeIndexer indexer; + private final RequestScopePropagator requestScopePropagator; private final PatchSet.Id patchSetId; @@ -87,6 +91,8 @@ public class PublishDraft implements Callable { final AccountResolver accountResolver, final CreateChangeSender.Factory createChangeSenderFactory, final ReplacePatchSetSender.Factory replacePatchSetFactory, + final ChangeIndexer indexer, + final RequestScopePropagator requestScopePropagator, @Assisted final PatchSet.Id patchSetId) { this.changeControlFactory = changeControlFactory; this.db = db; @@ -97,6 +103,8 @@ public class PublishDraft implements Callable { this.accountResolver = accountResolver; this.createChangeSenderFactory = createChangeSenderFactory; this.replacePatchSetFactory = replacePatchSetFactory; + this.indexer = indexer; + this.requestScopePropagator = requestScopePropagator; this.patchSetId = patchSetId; } @@ -146,6 +154,7 @@ public class PublishDraft implements Callable { }); if (!updatedPatchSet.isDraft() || updatedChange.getStatus() == Change.Status.NEW) { + indexer.index(updatedChange, requestScopePropagator); hooks.doDraftPublishedHook(updatedChange, updatedPatchSet, db); sendNotifications(control.getChange().getStatus() == Change.Status.DRAFT, diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java index 3b43fb0bb3..0db801930d 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java @@ -35,6 +35,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.git.MergeUtil; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.RebasedPatchSetSender; import com.google.gerrit.server.mail.ReplacePatchSetSender; import com.google.gerrit.server.patch.PatchSetInfoFactory; @@ -75,6 +76,7 @@ public class RebaseChange { private final ChangeHookRunner hooks; private final MergeUtil.Factory mergeUtilFactory; private final ProjectCache projectCache; + private final ChangeIndexer indexer; @Inject RebaseChange(final ChangeControl.GenericFactory changeControlFactory, @@ -85,7 +87,8 @@ public class RebaseChange { final RebasedPatchSetSender.Factory rebasedPatchSetSenderFactory, final ChangeHookRunner hooks, final MergeUtil.Factory mergeUtilFactory, - final ProjectCache projectCache) { + final ProjectCache projectCache, + final ChangeIndexer changeIndexer) { this.changeControlFactory = changeControlFactory; this.patchSetInfoFactory = patchSetInfoFactory; this.db = db; @@ -96,6 +99,7 @@ public class RebaseChange { this.hooks = hooks; this.mergeUtilFactory = mergeUtilFactory; this.projectCache = projectCache; + this.indexer = changeIndexer; } /** @@ -156,10 +160,10 @@ public class RebaseChange { uploader.newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone()); - final PatchSet newPatchSet = - rebase(git, rw, inserter, patchSetId, change, uploader.getAccountId(), baseCommit, - mergeUtilFactory.create( - changeControl.getProjectControl().getProjectState(), true), committerIdent); + final PatchSet newPatchSet = rebase(git, rw, inserter, patchSetId, change, + uploader.getAccountId(), baseCommit, mergeUtilFactory.create( + changeControl.getProjectControl().getProjectState(), true), + committerIdent, indexer); final Set oldReviewers = Sets.newHashSet(); final Set oldCC = Sets.newHashSet(); @@ -301,6 +305,7 @@ public class RebaseChange { * @param uploader the user that creates the rebased patch set * @param baseCommit the commit that should be the new base * @param mergeUtil merge utilities for the destination project + * @param indexer helper for indexing the change * @return the new patch set which is based on the given base commit * @throws NoSuchChangeException thrown if the change to which the patch set * belongs does not exist or is not visible to the user @@ -311,7 +316,8 @@ public class RebaseChange { public PatchSet rebase(final Repository git, final RevWalk revWalk, final ObjectInserter inserter, final PatchSet.Id patchSetId, final Change chg, final Account.Id uploader, final RevCommit baseCommit, - final MergeUtil mergeUtil, PersonIdent committerIdent) throws NoSuchChangeException, + final MergeUtil mergeUtil, PersonIdent committerIdent, + final ChangeIndexer indexer) throws NoSuchChangeException, OrmException, IOException, InvalidChangeOperationException, PathConflictException { Change change = chg; @@ -383,6 +389,7 @@ public class RebaseChange { "Change %s was modified", change.getId())); } + indexer.index(change); ApprovalsUtil.copyLabels(db, projectCache.get(change.getProject()) .getLabelTypes(), patchSetId, change.currentPatchSetId()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java index a59a216417..bce3d37ea7 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java @@ -15,6 +15,7 @@ package com.google.gerrit.server.git; import static com.google.gerrit.server.git.MergeUtil.getSubmitter; + import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; @@ -43,6 +44,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.config.AllProjectsName; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.MergeFailSender; import com.google.gerrit.server.mail.MergedSender; import com.google.gerrit.server.patch.PatchSetInfoFactory; @@ -153,6 +155,7 @@ public class MergeOp { private final WorkQueue workQueue; private final RequestScopePropagator requestScopePropagator; private final AllProjectsName allProjectsName; + private final ChangeIndexer indexer; @Inject MergeOp(final GitRepositoryManager grm, final SchemaFactory sf, @@ -168,7 +171,8 @@ public class MergeOp { final SubmoduleOp.Factory subOpFactory, final WorkQueue workQueue, final RequestScopePropagator requestScopePropagator, - final AllProjectsName allProjectsName) { + final AllProjectsName allProjectsName, + final ChangeIndexer indexer) { repoManager = grm; schemaFactory = sf; labelNormalizer = fs; @@ -188,6 +192,7 @@ public class MergeOp { this.workQueue = workQueue; this.requestScopePropagator = requestScopePropagator; this.allProjectsName = allProjectsName; + this.indexer = indexer; destBranch = branch; toMerge = ArrayListMultimap.create(); potentiallyStillSubmittable = new ArrayList(); @@ -758,6 +763,7 @@ public class MergeOp { } catch (OrmException err) { log.warn("Error updating change status for " + c.getId(), err); } + indexer.index(c); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseIfNecessary.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseIfNecessary.java index 77c4863ad4..0518349717 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseIfNecessary.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/RebaseIfNecessary.java @@ -80,7 +80,7 @@ public class RebaseIfNecessary extends SubmitStrategy { rebaseChange.rebase(args.repo, args.rw, args.inserter, n.patchsetId, n.change, args.mergeUtil.getSubmitter(n.patchsetId).getAccountId(), - newMergeTip, args.mergeUtil, committerIdent); + newMergeTip, args.mergeUtil, committerIdent, args.indexer); List approvals = Lists.newArrayList(); for (PatchSetApproval a : args.mergeUtil.getApprovalsForCommit(n)) { approvals.add(new PatchSetApproval(newPatchSet.getId(), a)); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java index 25cc6d43aa..8e4ba0c914 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java @@ -74,6 +74,7 @@ import com.google.gerrit.server.git.MultiProgressMonitor.Task; import com.google.gerrit.server.git.validators.CommitValidationException; import com.google.gerrit.server.git.validators.CommitValidationMessage; import com.google.gerrit.server.git.validators.CommitValidators; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.mail.CreateChangeSender; import com.google.gerrit.server.mail.MailUtil.MailRecipients; import com.google.gerrit.server.mail.MergedSender; @@ -263,6 +264,7 @@ public class ReceiveCommits { private final WorkQueue workQueue; private final ListeningExecutorService changeUpdateExector; private final RequestScopePropagator requestScopePropagator; + private final ChangeIndexer indexer; private final SshInfo sshInfo; private final AllProjectsName allProjectsName; private final ReceiveConfig receiveConfig; @@ -323,6 +325,7 @@ public class ReceiveCommits { final WorkQueue workQueue, @ChangeUpdateExecutor ListeningExecutorService changeUpdateExector, final RequestScopePropagator requestScopePropagator, + final ChangeIndexer indexer, final SshInfo sshInfo, final AllProjectsName allProjectsName, ReceiveConfig config, @@ -353,6 +356,7 @@ public class ReceiveCommits { this.workQueue = workQueue; this.changeUpdateExector = changeUpdateExector; this.requestScopePropagator = requestScopePropagator; + this.indexer = indexer; this.sshInfo = sshInfo; this.allProjectsName = allProjectsName; this.receiveConfig = config; @@ -1905,6 +1909,7 @@ public class ReceiveCommits { if (cmd.getResult() == NOT_ATTEMPTED) { cmd.execute(rp); } + indexer.index(change, requestScopePropagator); gitRefUpdated.fire(project.getNameKey(), newPatchSet.getRefName(), ObjectId.zeroId(), newCommit); hooks.doPatchsetCreatedHook(change, newPatchSet, db); @@ -2207,7 +2212,7 @@ public class ReceiveCommits { private void markChangeMergedByPush(final ReviewDb db, final ReplaceRequest result) throws OrmException { - final Change change = result.change; + Change change = result.change; final String mergedIntoRef = result.mergedIntoRef; change.setCurrentPatchSet(result.info); @@ -2235,17 +2240,19 @@ public class ReceiveCommits { db.changeMessages().insert(Collections.singleton(msg)); - db.changes().atomicUpdate(change.getId(), new AtomicUpdate() { - @Override - public Change update(Change change) { - if (change.getStatus().isOpen()) { - change.setCurrentPatchSet(result.info); - change.setStatus(Change.Status.MERGED); - ChangeUtil.updated(change); - } - return change; - } - }); + change = db.changes().atomicUpdate( + change.getId(), new AtomicUpdate() { + @Override + public Change update(Change change) { + if (change.getStatus().isOpen()) { + change.setCurrentPatchSet(result.info); + change.setStatus(Change.Status.MERGED); + ChangeUtil.updated(change); + } + return change; + } + }); + indexer.index(change, requestScopePropagator); } private void sendMergedEmail(final ReplaceRequest result) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategy.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategy.java index 7c2ba8674f..9626e2378e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategy.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategy.java @@ -20,6 +20,7 @@ import com.google.gerrit.reviewdb.client.PatchSetApproval; import com.google.gerrit.reviewdb.client.Project.SubmitType; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.index.ChangeIndexer; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; @@ -55,13 +56,15 @@ public abstract class SubmitStrategy { protected final Set alreadyAccepted; protected final Branch.NameKey destBranch; protected final MergeUtil mergeUtil; + protected final ChangeIndexer indexer; protected final MergeSorter mergeSorter; Arguments(final IdentifiedUser.GenericFactory identifiedUserFactory, final PersonIdent myIdent, final ReviewDb db, final Repository repo, final RevWalk rw, final ObjectInserter inserter, final RevFlag canMergeFlag, final Set alreadyAccepted, - final Branch.NameKey destBranch, final MergeUtil mergeUtil) { + final Branch.NameKey destBranch, final MergeUtil mergeUtil, + final ChangeIndexer indexer) { this.identifiedUserFactory = identifiedUserFactory; this.myIdent = myIdent; this.db = db; @@ -73,6 +76,7 @@ public abstract class SubmitStrategy { this.alreadyAccepted = alreadyAccepted; this.destBranch = destBranch; this.mergeUtil = mergeUtil; + this.indexer = indexer; this.mergeSorter = new MergeSorter(rw, alreadyAccepted, canMergeFlag); } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategyFactory.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategyFactory.java index d43a756212..845139d844 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategyFactory.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmitStrategyFactory.java @@ -22,6 +22,7 @@ import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.changedetail.RebaseChange; import com.google.gerrit.server.config.CanonicalWebUrl; import com.google.gerrit.server.extensions.events.GitReferenceUpdated; +import com.google.gerrit.server.index.ChangeIndexer; import com.google.gerrit.server.patch.PatchSetInfoFactory; import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectCache; @@ -54,6 +55,7 @@ public class SubmitStrategyFactory { private final RebaseChange rebaseChange; private final ProjectCache projectCache; private final MergeUtil.Factory mergeUtilFactory; + private final ChangeIndexer indexer; @Inject SubmitStrategyFactory( @@ -63,7 +65,8 @@ public class SubmitStrategyFactory { @CanonicalWebUrl @Nullable final Provider urlProvider, final GitReferenceUpdated gitRefUpdated, final RebaseChange rebaseChange, final ProjectCache projectCache, - final MergeUtil.Factory mergeUtilFactory) { + final MergeUtil.Factory mergeUtilFactory, + final ChangeIndexer indexer) { this.identifiedUserFactory = identifiedUserFactory; this.myIdent = myIdent; this.patchSetInfoFactory = patchSetInfoFactory; @@ -71,6 +74,7 @@ public class SubmitStrategyFactory { this.rebaseChange = rebaseChange; this.projectCache = projectCache; this.mergeUtilFactory = mergeUtilFactory; + this.indexer = indexer; } public SubmitStrategy create(final SubmitType submitType, final ReviewDb db, @@ -82,7 +86,7 @@ public class SubmitStrategyFactory { final SubmitStrategy.Arguments args = new SubmitStrategy.Arguments(identifiedUserFactory, myIdent, db, repo, rw, inserter, canMergeFlag, alreadyAccepted, destBranch, - mergeUtilFactory.create(project)); + mergeUtilFactory.create(project), indexer); switch (submitType) { case CHERRY_PICK: return new CherryPick(args, patchSetInfoFactory, gitRefUpdated); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java index 602c59b9c1..e52f80d1ee 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeField.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; +import com.google.gerrit.server.query.change.ChangeStatusPredicate; import com.google.gwtorm.server.OrmException; import java.lang.reflect.Field; @@ -49,6 +50,18 @@ public class ChangeField { } }; + /** Change status string, in the same format as {@code status:}. */ + public static final FieldDef STATUS = + new FieldDef.Single(ChangeQueryBuilder.FIELD_STATUS, + FieldType.EXACT, false) { + @Override + public String get(ChangeData input, FillArgs args) + throws OrmException { + return ChangeStatusPredicate.VALUES.get( + input.change(args.db).getStatus()); + } + }; + /** List of filenames modified in the current patch set. */ public static final FieldDef> FILE = new FieldDef.Repeatable( diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java index cb64801676..6d08db078a 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeStatusPredicate.java @@ -19,7 +19,8 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.common.collect.ImmutableBiMap; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.server.query.OperatorPredicate; +import com.google.gerrit.server.index.ChangeField; +import com.google.gerrit.server.index.IndexPredicate; import com.google.gerrit.server.query.Predicate; import com.google.gwtorm.server.OrmException; import com.google.inject.Provider; @@ -34,8 +35,8 @@ import java.util.List; * status:} but may also be {@code is:} to help do-what-i-meanery for end-users * searching for changes. Either operator name has the same meaning. */ -final class ChangeStatusPredicate extends OperatorPredicate { - private static final ImmutableBiMap VALUES; +public final class ChangeStatusPredicate extends IndexPredicate { + public static final ImmutableBiMap VALUES; static { ImmutableBiMap.Builder values = @@ -70,14 +71,14 @@ final class ChangeStatusPredicate extends OperatorPredicate { private final Change.Status status; ChangeStatusPredicate(Provider dbProvider, String value) { - super(ChangeQueryBuilder.FIELD_STATUS, value); + super(ChangeField.STATUS, value); this.dbProvider = dbProvider; status = VALUES.inverse().get(value); checkArgument(status != null, "invalid change status: %s", value); } ChangeStatusPredicate(Provider dbProvider, Change.Status status) { - super(ChangeQueryBuilder.FIELD_STATUS, VALUES.get(status)); + super(ChangeField.STATUS, VALUES.get(status)); this.dbProvider = dbProvider; this.status = status; }