Add PredicateCache statistics to query outputs

Change-Id: Ie4f3c716b506cae4da3e46f04a7f747bafc4954c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
index 6540ad2..21d1ed3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/PredicateCache.java
@@ -39,6 +39,11 @@
 import org.eclipse.jgit.lib.Config;
 
 public class PredicateCache {
+  public static class Statistics {
+    protected long hits;
+    protected long misses;
+  }
+
   protected final ChangeQueryBuilder cqb;
   protected final Set<String> cacheableByBranchPredicateClassNames;
   protected final CurrentUser user;
@@ -46,6 +51,8 @@
   protected final Map<String, ThrowingProvider<Predicate<ChangeData>, QueryParseException>>
       predicatesByQuery = new HashMap<>();
 
+  protected Statistics statistics;
+
   @Inject
   public PredicateCache(
       @GerritServerConfig Config config,
@@ -60,6 +67,14 @@
                 config.getStringList(pluginName, "cacheable-predicates", "byBranch-className")));
   }
 
+  public void initStatistics() {
+    statistics = new Statistics();
+  }
+
+  public Statistics getStatistics() {
+    return statistics;
+  }
+
   public boolean matchWithExceptions(ChangeData c, String query)
       throws QueryParseException, StorageException {
     if ("true".equalsIgnoreCase(query)) {
@@ -72,8 +87,14 @@
     ThrowingProvider<Predicate<ChangeData>, QueryParseException> predProvider =
         predicatesByQuery.get(query);
     if (predProvider != null) {
+      if (statistics != null) {
+        statistics.hits++;
+      }
       return predProvider.get();
     }
+    if (statistics != null) {
+      statistics.misses++;
+    }
     // never seen 'query' before
     try {
       Predicate<ChangeData> pred = cqb.parse(query);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
index e77b97a..0c6a05c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
@@ -54,6 +54,7 @@
     public long numberOfChanges;
     public long numberOfNodes;
     public long numberOfTaskPluginAttributes;
+    public PredicateCache.Statistics predicateCache;
   }
 
   public static class TaskAttribute {
@@ -315,6 +316,7 @@
   public void initStatistics() {
     if (options.includeStatistics) {
       statistics = new Statistics();
+      predicateCache.initStatistics();
     }
   }
 
@@ -323,6 +325,7 @@
       statistics.numberOfChanges = pluginInfosByChange.size();
       statistics.numberOfTaskPluginAttributes =
           pluginInfosByChange.values().stream().filter(tpa -> tpa != null).count();
+      statistics.predicateCache = predicateCache.getStatistics();
     }
     return statistics;
   }