diff options
Diffstat (limited to 'java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java')
-rw-r--r-- | java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java b/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java new file mode 100644 index 0000000000..55d5a313ef --- /dev/null +++ b/java/com/google/gerrit/server/notedb/rebuild/FinalUpdatesEvent.java @@ -0,0 +1,101 @@ +// Copyright (C) 2016 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.server.notedb.rebuild; + +import static com.google.gerrit.reviewdb.server.ReviewDbUtil.intKeyOrdering; + +import com.google.common.base.MoreObjects.ToStringHelper; +import com.google.common.collect.ImmutableCollection; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gerrit.server.notedb.ChangeUpdate; +import com.google.gwtorm.server.OrmException; +import java.util.Objects; + +class FinalUpdatesEvent extends Event { + private final Change change; + private final Change noteDbChange; + private final ImmutableCollection<PatchSet> patchSets; + + FinalUpdatesEvent(Change change, Change noteDbChange, ImmutableCollection<PatchSet> patchSets) { + super( + change.currentPatchSetId(), + change.getOwner(), + change.getOwner(), + change.getLastUpdatedOn(), + change.getCreatedOn(), + null); + this.change = change; + this.noteDbChange = noteDbChange; + this.patchSets = patchSets; + } + + @Override + boolean uniquePerUpdate() { + return true; + } + + @SuppressWarnings("deprecation") + @Override + void apply(ChangeUpdate update) throws OrmException { + if (!Objects.equals(change.getTopic(), noteDbChange.getTopic())) { + update.setTopic(change.getTopic()); + } + if (!statusMatches()) { + // TODO(dborowitz): Stamp approximate approvals at this time. + update.fixStatus(change.getStatus()); + } + if (change.isPrivate() != noteDbChange.isPrivate()) { + update.setPrivate(change.isPrivate()); + } + if (change.isWorkInProgress() != noteDbChange.isWorkInProgress()) { + update.setWorkInProgress(change.isWorkInProgress()); + } + if (change.getSubmissionId() != null && noteDbChange.getSubmissionId() == null) { + update.setSubmissionId(change.getSubmissionId()); + } + if (!Objects.equals(change.getAssignee(), noteDbChange.getAssignee())) { + // TODO(dborowitz): Parse intermediate values out from messages. + update.setAssignee(change.getAssignee()); + } + if (!patchSets.isEmpty() && !highestNumberedPatchSetIsCurrent()) { + update.setCurrentPatchSet(); + } + if (!update.isEmpty()) { + update.setSubjectForCommit("Final NoteDb migration updates"); + } + } + + private boolean statusMatches() { + return Objects.equals(change.getStatus(), noteDbChange.getStatus()); + } + + private boolean highestNumberedPatchSetIsCurrent() { + PatchSet.Id max = patchSets.stream().map(PatchSet::getId).max(intKeyOrdering()).get(); + return max.equals(change.currentPatchSetId()); + } + + @Override + protected boolean isSubmit() { + return change.getStatus() == Change.Status.MERGED; + } + + @Override + protected void addToString(ToStringHelper helper) { + if (!statusMatches()) { + helper.add("status", change.getStatus()); + } + } +} |