Add StopWatch to HitBooleanTable/MatchCache

Change-Id: Ibb104f91cb73034ae11c28b3644d80a588d58401
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java b/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
index 8271fb9..39365cb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/HitBooleanTable.java
@@ -27,6 +27,7 @@
     public long size;
     public int numberOfRows;
     public int numberOfColumns;
+    public long sumNanosecondsLoading;
   }
 
   protected Statistics statistics;
@@ -44,6 +45,13 @@
     return value;
   }
 
+  public StopWatch createLoadingStopWatch() {
+    if (statistics == null) {
+      return StopWatch.DISABLED;
+    }
+    return new StopWatch.Enabled().setNanosConsumer(ns -> statistics.sumNanosecondsLoading += ns);
+  }
+
   @Override
   public void initStatistics() {
     statistics = new Statistics();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
index 55cae12..b1dcda5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/MatchCache.java
@@ -16,6 +16,7 @@
 
 import com.google.gerrit.entities.Change;
 import com.google.gerrit.exceptions.StorageException;
+import com.google.gerrit.index.query.Matchable;
 import com.google.gerrit.index.query.QueryParseException;
 import com.google.gerrit.server.query.change.ChangeData;
 
@@ -36,6 +37,7 @@
     return null;
   }
 
+  @SuppressWarnings("try")
   public boolean match(ChangeData changeData, String query)
       throws StorageException, QueryParseException {
     if (query == null || "true".equalsIgnoreCase(query)) {
@@ -43,8 +45,11 @@
     }
     Boolean isMatched = resultByChangeByQuery.get(query, changeData.getId());
     if (isMatched == null) {
-      isMatched = predicateCache.getPredicate(query).asMatchable().match(changeData);
-      resultByChangeByQuery.put(query, changeData.getId(), isMatched);
+      Matchable<ChangeData> matchable = predicateCache.getPredicate(query).asMatchable();
+      try (StopWatch stopWatch = resultByChangeByQuery.createLoadingStopWatch()) {
+        isMatched = matchable.match(changeData);
+        resultByChangeByQuery.put(query, changeData.getId(), isMatched);
+      }
     }
     return isMatched;
   }