Search topic with ChangeIndex

Change-Id: I51c65482ab31956fbadb2a7520ef571e7ad9c6c4
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 3cfad48c..e84948b 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
@@ -353,7 +353,10 @@
         if (f.isRepeatable()) {
           add(result, f, (Iterable<?>) f.get(cd, fillArgs));
         } else {
-          add(result, f, Collections.singleton(f.get(cd, fillArgs)));
+          Object val = f.get(cd, fillArgs);
+          if (val != null) {
+            add(result, f, Collections.singleton(val));
+          }
         }
       }
       return result;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
index b96b480..f46aa9e 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/PutTopic.java
@@ -27,6 +27,7 @@
 import com.google.gerrit.server.ChangeUtil;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.change.PutTopic.Input;
+import com.google.gerrit.server.index.ChangeIndexer;
 import com.google.gerrit.server.project.ChangeControl;
 import com.google.gwtorm.server.AtomicUpdate;
 import com.google.inject.Inject;
@@ -36,6 +37,7 @@
 
 class PutTopic implements RestModifyView<ChangeResource, Input> {
   private final Provider<ReviewDb> dbProvider;
+  private final ChangeIndexer indexer;
 
   static class Input {
     @DefaultInput
@@ -44,8 +46,9 @@
   }
 
   @Inject
-  PutTopic(Provider<ReviewDb> dbProvider) {
+  PutTopic(Provider<ReviewDb> dbProvider, ChangeIndexer indexer) {
     this.dbProvider = dbProvider;
+    this.indexer = indexer;
   }
 
   @Override
@@ -88,7 +91,7 @@
       }
       cmsg.setMessage(msgBuf.toString());
 
-      db.changes().atomicUpdate(change.getId(),
+      change = db.changes().atomicUpdate(change.getId(),
         new AtomicUpdate<Change>() {
           @Override
           public Change update(Change change) {
@@ -97,6 +100,7 @@
           }
         });
       db.changeMessages().insert(Collections.singleton(cmsg));
+      indexer.index(change);
     }
     return Strings.isNullOrEmpty(newTopicName)
         ? Response.none()
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 2b548ef..328c20a 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
@@ -84,6 +84,17 @@
         }
       };
 
+  /** Topic, a short annotation on the branch. */
+  public static final FieldDef<ChangeData, String> TOPIC =
+      new FieldDef.Single<ChangeData, String>(
+          ChangeQueryBuilder.FIELD_TOPIC, FieldType.EXACT, false) {
+        @Override
+        public String get(ChangeData input, FillArgs args)
+            throws OrmException {
+          return input.change(args.db).getTopic();
+        }
+      };
+
   /** List of filenames modified in the current patch set. */
   public static final FieldDef<ChangeData, Iterable<String>> FILE =
       new FieldDef.Repeatable<ChangeData, String>(
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
index 8d58376..9393fe1 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/TopicPredicate.java
@@ -16,15 +16,16 @@
 
 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.gwtorm.server.OrmException;
 import com.google.inject.Provider;
 
-class TopicPredicate extends OperatorPredicate<ChangeData> {
+class TopicPredicate extends IndexPredicate<ChangeData> {
   private final Provider<ReviewDb> dbProvider;
 
   TopicPredicate(Provider<ReviewDb> dbProvider, String topic) {
-    super(ChangeQueryBuilder.FIELD_TOPIC, topic);
+    super(ChangeField.TOPIC, topic);
     this.dbProvider = dbProvider;
   }