Get assignee from ChangeIndex

Change-Id: Ib36dedb430900590cbdc8f444903ebfbd6b7437c
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 29b2918..1d71987 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.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 @@
 
   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 @@
     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 @@
     }
   }
 
+  private void decodeAssignee(Multimap<String, IndexableField> 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<String, IndexableField> doc, ChangeData cd) {
     Collection<IndexableField> hashtag = doc.get(HASHTAG_FIELD);
     Set<String> 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 0369695..0955a5a 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 @@
         @Override
         public Integer get(ChangeData input, FillArgs args)
             throws OrmException {
-          Account.Id id = input.assignee();
-          return id != null ? id.get() : NO_ASSIGNEE;
+          Optional<Account.Id> 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 9c50c27..8c47c7e 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.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 @@
   /**
    * @return an Account.Id of the user assigned to this change.
    */
-  public Account.Id getAssignee() {
-    return state.assignee();
+  public Optional<Account.Id> 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 d18ee66..b5bb0d5 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 @@
 
 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 @@
 
   /** Is this user assigned to this change? */
   public boolean isAssignee() {
-    Account.Id currentAssignee = notes.getAssignee();
-    if (currentAssignee != null && getUser().isIdentifiedUser()) {
+    Optional<Account.Id> 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 46d7e38..413cbcf 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 @@
   private Optional<ChangedLines> changedLines;
   private SubmitTypeRecord submitTypeRecord;
   private Boolean mergeable;
-  private Account.Id assignee;
+  private Optional<Account.Id> assignee;
   private Set<String> hashtags;
   private Set<Account.Id> editsByUser;
   private Set<Account.Id> reviewedBy;
@@ -1163,16 +1163,20 @@
     this.reviewedBy = reviewedBy;
   }
 
-  public Account.Id assignee() throws OrmException {
+  public Optional<Account.Id> assignee() throws OrmException {
     if (assignee == null) {
       if (!lazyLoad) {
-        return null;
+        return Optional.absent();
       }
       assignee = notes().getAssignee();
     }
     return assignee;
   }
 
+  public void setAssignee(Optional<Account.Id> assignee) {
+    this.assignee = assignee;
+  }
+
   public Set<String> 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 7a1dbf7..5aa3fc4 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 @@
     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());
 
   }