Use ChangeIndex.deleteAllForProject to delete efficiently from index

Instead of deleting changes on-by-one, use the deleteAllForProject which
deletes all changes of a project in one Lucene method call.

In addition, improve names of some methods to reflect their purpose
better.

Change-Id: I1bf173e5feadd4bc1183b77a2e3edd3141b91e13
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
index 2f3d047..b84a9c7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
@@ -27,7 +27,8 @@
 import com.google.gerrit.server.account.AccountsUpdate;
 import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
 import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.index.change.ChangeIndexer;
+import com.google.gerrit.server.index.change.ChangeIndex;
+import com.google.gerrit.server.index.change.ChangeIndexCollection;
 import com.google.gerrit.server.notedb.ChangeNotes;
 import com.google.gerrit.server.notedb.ChangeNotes.Factory.ChangeNotesResult;
 import com.google.gerrit.server.project.NoSuchChangeException;
@@ -42,7 +43,7 @@
   private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   private final StarredChangesWriter starredChangesWriter;
-  private final ChangeIndexer indexer;
+  private final ChangeIndexCollection indexes;
   private final Provider<InternalAccountQuery> accountQueryProvider;
   private final Provider<AccountsUpdate> accountsUpdateProvider;
   private final ChangeNotes.Factory schemaFactoryNoteDb;
@@ -51,13 +52,13 @@
   @Inject
   public DatabaseDeleteHandler(
       StarredChangesWriter starredChangesWriter,
-      ChangeIndexer indexer,
+      ChangeIndexCollection indexes,
       ChangeNotes.Factory schemaFactoryNoteDb,
       GitRepositoryManager repoManager,
       Provider<InternalAccountQuery> accountQueryProvider,
       @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
     this.starredChangesWriter = starredChangesWriter;
-    this.indexer = indexer;
+    this.indexes = indexes;
     this.accountQueryProvider = accountQueryProvider;
     this.accountsUpdateProvider = accountsUpdateProvider;
     this.schemaFactoryNoteDb = schemaFactoryNoteDb;
@@ -65,7 +66,9 @@
   }
 
   public void delete(Project project) throws IOException {
-    atomicDelete(project, getChangesListFromNoteDb(project));
+    deleteChangesFromIndex(project);
+    unstarChanges(getChangesListFromNoteDb(project));
+    deleteProjectWatches(project);
   }
 
   private List<Change.Id> getChangesListFromNoteDb(Project project) throws IOException {
@@ -81,23 +84,23 @@
     return changeIds;
   }
 
-  private void deleteChanges(List<Change.Id> changeIds) {
+  private void deleteChangesFromIndex(Project project) {
+    for (ChangeIndex i : indexes.getWriteIndexes()) {
+      i.deleteAllForProject(project.getNameKey());
+    }
+  }
 
+  private void unstarChanges(List<Change.Id> changeIds) {
     for (Change.Id id : changeIds) {
       try {
         starredChangesWriter.unstarAllForChangeDeletion(id);
       } catch (NoSuchChangeException | IOException e) {
         // we can ignore the exception during delete
       }
-      // Delete from the secondary index
-      indexer.delete(id);
     }
   }
 
-  public void atomicDelete(Project project, List<Change.Id> changeIds) {
-
-    deleteChanges(changeIds);
-
+  private void deleteProjectWatches(Project project) {
     for (AccountState a : accountQueryProvider.get().byWatchedProject(project.getNameKey())) {
       Account.Id accountId = a.account().id();
       for (ProjectWatchKey watchKey : a.projectWatches().keySet()) {