diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java index f58845ef1e..7e999571bf 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/ChangeRebuilderImpl.java @@ -300,7 +300,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { // We will rebuild all events, except for draft comments, in buckets based // on author and timestamp. List events = new ArrayList<>(); - Multimap draftCommentEvents = + Multimap draftCommentEvents = ArrayListMultimap.create(); events.addAll(getHashtagsEvents(change, manager)); @@ -325,11 +325,13 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { patchSetEvents.put(ps.getId(), pse); events.add(pse); for (PatchLineComment c : getPatchLineComments(bundle, ps)) { - PatchLineCommentEvent e = - new PatchLineCommentEvent(c, change, ps, patchListCache); if (c.getStatus() == Status.PUBLISHED) { + CommentEvent e = + new CommentEvent(c, change, ps, patchListCache); events.add(e.addDep(pse)); } else { + DraftCommentEvent e = + new DraftCommentEvent(c, change, ps, patchListCache); draftCommentEvents.put(c.getAuthor(), e); } } @@ -376,9 +378,9 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } flushEventsToUpdate(manager, el, change); - EventList plcel = new EventList<>(); + EventList plcel = new EventList<>(); for (Account.Id author : draftCommentEvents.keys()) { - for (PatchLineCommentEvent e : + for (DraftCommentEvent e : Ordering.natural().sortedCopy(draftCommentEvents.get(author))) { if (!plcel.canAdd(e)) { flushEventsToDraftUpdate(manager, plcel, change); @@ -490,7 +492,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { } private void flushEventsToDraftUpdate(NoteDbUpdateManager manager, - EventList events, Change change) + EventList events, Change change) throws OrmException { if (events.isEmpty()) { return; @@ -501,7 +503,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder { newAuthorIdent(events), events.getWhen()); update.setPatchSetId(events.getPatchSetId()); - for (PatchLineCommentEvent e : events) { + for (DraftCommentEvent e : events) { e.applyDraft(update); } manager.add(update); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java new file mode 100644 index 0000000000..a2f436d3a7 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/CommentEvent.java @@ -0,0 +1,56 @@ +// 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.server.PatchLineCommentsUtil.setCommentRevId; + +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.client.PatchLineComment; +import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gerrit.server.PatchLineCommentsUtil; +import com.google.gerrit.server.notedb.ChangeUpdate; +import com.google.gerrit.server.patch.PatchListCache; +import com.google.gwtorm.server.OrmException; + +class CommentEvent extends Event { + public final PatchLineComment c; + private final Change change; + private final PatchSet ps; + private final PatchListCache cache; + + CommentEvent(PatchLineComment c, Change change, PatchSet ps, + PatchListCache cache) { + super(PatchLineCommentsUtil.getCommentPsId(c), c.getAuthor(), + c.getWrittenOn(), change.getCreatedOn(), c.getTag()); + this.c = c; + this.change = change; + this.ps = ps; + this.cache = cache; + } + + @Override + boolean uniquePerUpdate() { + return false; + } + + @Override + void apply(ChangeUpdate update) throws OrmException { + checkUpdate(update); + if (c.getRevId() == null) { + setCommentRevId(c, cache, change, ps); + } + update.putComment(c); + } +} diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchLineCommentEvent.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java similarity index 85% rename from gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchLineCommentEvent.java rename to gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java index 8d962bea8b..7d9387572e 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/PatchLineCommentEvent.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/rebuild/DraftCommentEvent.java @@ -25,13 +25,13 @@ import com.google.gerrit.server.notedb.ChangeUpdate; import com.google.gerrit.server.patch.PatchListCache; import com.google.gwtorm.server.OrmException; -class PatchLineCommentEvent extends Event { +class DraftCommentEvent extends Event { public final PatchLineComment c; private final Change change; private final PatchSet ps; private final PatchListCache cache; - PatchLineCommentEvent(PatchLineComment c, Change change, PatchSet ps, + DraftCommentEvent(PatchLineComment c, Change change, PatchSet ps, PatchListCache cache) { super(PatchLineCommentsUtil.getCommentPsId(c), c.getAuthor(), c.getWrittenOn(), change.getCreatedOn(), c.getTag()); @@ -47,12 +47,8 @@ class PatchLineCommentEvent extends Event { } @Override - void apply(ChangeUpdate update) throws OrmException { - checkUpdate(update); - if (c.getRevId() == null) { - setCommentRevId(c, cache, change, ps); - } - update.putComment(c); + void apply(ChangeUpdate update) { + throw new UnsupportedOperationException(); } void applyDraft(ChangeDraftUpdate draftUpdate) throws OrmException {