Add Preloader statistics to query outputs

Change-Id: Ie0ca5a3581c1063b8cbbde8f6d8c64b2f3ffe9fe
diff --git a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
index b240c3b..1de4c76 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/Preloader.java
@@ -29,9 +29,17 @@
 
 /** Use to pre-load a task definition with values from its preload-task definition. */
 public class Preloader {
+  public static class Statistics {
+    protected long hits;
+    protected long misses;
+    protected long preloaded;
+  }
+
   protected final TaskConfigFactory taskConfigFactory;
   protected final Map<TaskExpressionKey, Optional<Task>> optionalTaskByExpression = new HashMap<>();
 
+  protected Statistics statistics;
+
   @Inject
   public Preloader(TaskConfigFactory taskConfigFactory) {
     this.taskConfigFactory = taskConfigFactory;
@@ -68,9 +76,15 @@
       throws ConfigInvalidException, IOException {
     Optional<Task> task = optionalTaskByExpression.get(expression.key);
     if (task == null) {
+      if (statistics != null) {
+        statistics.misses++;
+      }
       task = preloadOptionalTask(expression);
       optionalTaskByExpression.put(expression.key, task);
     }
+    if (statistics != null) {
+      statistics.hits++;
+    }
     return task;
   }
 
@@ -83,6 +97,9 @@
   public Task preload(Task definition) throws ConfigInvalidException, IOException {
     String expression = definition.preloadTask;
     if (expression != null) {
+      if (statistics != null) {
+        statistics.preloaded++;
+      }
       Optional<Task> preloadFrom =
           getOptionalTask(new TaskExpression(definition.file(), expression));
       if (preloadFrom.isPresent()) {
@@ -195,4 +212,12 @@
     extended.putAll(map);
     return extended;
   }
+
+  public void initStatistics() {
+    statistics = new Statistics();
+  }
+
+  public Statistics getStatistics() {
+    return statistics;
+  }
 }
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 0c6a05c..e683034 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/task/TaskAttributeFactory.java
@@ -55,6 +55,7 @@
     public long numberOfNodes;
     public long numberOfTaskPluginAttributes;
     public PredicateCache.Statistics predicateCache;
+    public Preloader.Statistics preloader;
   }
 
   public static class TaskAttribute {
@@ -317,6 +318,7 @@
     if (options.includeStatistics) {
       statistics = new Statistics();
       predicateCache.initStatistics();
+      definitions.preloader.initStatistics();
     }
   }
 
@@ -326,6 +328,7 @@
       statistics.numberOfTaskPluginAttributes =
           pluginInfosByChange.values().stream().filter(tpa -> tpa != null).count();
       statistics.predicateCache = predicateCache.getStatistics();
+      statistics.preloader = definitions.preloader.getStatistics();
     }
     return statistics;
   }