diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java index 29b291850d..1d7198792f 100644 --- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java +++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneChangeIndex.java @@ -24,6 +24,7 @@ import static com.google.gerrit.server.index.change.ChangeField.PROJECT; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.CLOSED_STATUSES; import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES; +import com.google.common.base.Optional; import com.google.common.base.Throwables; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.FluentIterable; @@ -118,6 +119,7 @@ public class LuceneChangeIndex implements ChangeIndex { private static final String ADDED_FIELD = ChangeField.ADDED.getName(); private static final String APPROVAL_FIELD = ChangeField.APPROVAL.getName(); + private static final String ASSIGNEE_FIELD = ChangeField.ASSIGNEE.getName(); private static final String CHANGE_FIELD = ChangeField.CHANGE.getName(); private static final String DELETED_FIELD = ChangeField.DELETED.getName(); private static final String MERGEABLE_FIELD = ChangeField.MERGEABLE.getName(); @@ -477,6 +479,9 @@ public class LuceneChangeIndex implements ChangeIndex { if (fields.contains(REVIEWEDBY_FIELD)) { decodeReviewedBy(doc, cd); } + if(fields.contains(ASSIGNEE_FIELD)) { + decodeAssignee(doc, cd); + } if (fields.contains(HASHTAG_FIELD)) { decodeHashtags(doc, cd); } @@ -551,6 +556,18 @@ public class LuceneChangeIndex implements ChangeIndex { } } + private void decodeAssignee(Multimap doc, ChangeData cd) { + IndexableField af = Iterables.getFirst(doc.get(ASSIGNEE_FIELD), null); + Account.Id assignee = null; + if (af != null) { + int id = af.numericValue().intValue(); + if (id > 0) { + assignee = new Account.Id(id); + } + } + cd.setAssignee(Optional.fromNullable(assignee)); + } + private void decodeHashtags(Multimap doc, ChangeData cd) { Collection hashtag = doc.get(HASHTAG_FIELD); Set hashtags = Sets.newHashSetWithExpectedSize(hashtag.size()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java index 0369695f8b..0955a5aa11 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeField.java @@ -323,8 +323,8 @@ public class ChangeField { @Override public Integer get(ChangeData input, FillArgs args) throws OrmException { - Account.Id id = input.assignee(); - return id != null ? id.get() : NO_ASSIGNEE; + Optional id = input.assignee(); + return id.isPresent() ? id.get().get() : NO_ASSIGNEE; } }; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java index 9c50c27782..8c47c7e661 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/ChangeNotes.java @@ -56,6 +56,7 @@ import com.google.gerrit.server.project.NoSuchChangeException; import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.InternalChangeQuery; +import com.google.common.base.Optional; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; @@ -389,8 +390,8 @@ public class ChangeNotes extends AbstractChangeNotes { /** * @return an Account.Id of the user assigned to this change. */ - public Account.Id getAssignee() { - return state.assignee(); + public Optional getAssignee() { + return Optional.fromNullable(state.assignee()); } /** diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java index d18ee66356..b5bb0d58b5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ChangeControl.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.project; import static com.google.common.base.Preconditions.checkArgument; +import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.data.LabelType; @@ -354,10 +355,10 @@ public class ChangeControl { /** Is this user assigned to this change? */ public boolean isAssignee() { - Account.Id currentAssignee = notes.getAssignee(); - if (currentAssignee != null && getUser().isIdentifiedUser()) { + Optional currentAssignee = notes.getAssignee(); + if (currentAssignee.isPresent() && getUser().isIdentifiedUser()) { Account.Id id = getUser().getAccountId(); - return id.equals(currentAssignee); + return id.equals(currentAssignee.get()); } return false; } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java index 46d7e380a7..413cbcfaf3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java @@ -345,7 +345,7 @@ public class ChangeData { private Optional changedLines; private SubmitTypeRecord submitTypeRecord; private Boolean mergeable; - private Account.Id assignee; + private Optional assignee; private Set hashtags; private Set editsByUser; private Set reviewedBy; @@ -1163,16 +1163,20 @@ public class ChangeData { this.reviewedBy = reviewedBy; } - public Account.Id assignee() throws OrmException { + public Optional assignee() throws OrmException { if (assignee == null) { if (!lazyLoad) { - return null; + return Optional.absent(); } assignee = notes().getAssignee(); } return assignee; } + public void setAssignee(Optional assignee) { + this.assignee = assignee; + } + public Set hashtags() throws OrmException { if (hashtags == null) { if (!lazyLoad) { diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java index 7a1dbf7dbe..5aa3fc448a 100644 --- a/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java +++ b/gerrit-server/src/test/java/com/google/gerrit/server/notedb/ChangeNotesTest.java @@ -590,14 +590,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest { update.commit(); ChangeNotes notes = newNotes(c); - assertThat(notes.getAssignee()).isEqualTo(otherUserId); + assertThat(notes.getAssignee().get()).isEqualTo(otherUserId); update = newUpdate(c, changeOwner); update.setAssignee(changeOwner.getAccountId()); update.commit(); notes = newNotes(c); - assertThat(notes.getAssignee()).isEqualTo(changeOwner.getAccountId()); + assertThat(notes.getAssignee().get()).isEqualTo(changeOwner.getAccountId()); }