Introduce 'elasticsearch.codec' config

A new config 'elasticsearch.codec' is added which allows us to
set the codec during index creation time. It defaults to 'default'.
Based on Elasticsearch docs[1], the default codec offers the best
performance.

[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#_static_index_settings

Change-Id: I1861218d3498ee7cebca1084636a35c815b1c0e6
diff --git a/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java b/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
index e544d9f..2a5fcde 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
@@ -43,9 +43,11 @@
   static final String KEY_NUMBER_OF_SHARDS = "numberOfShards";
   static final String KEY_NUMBER_OF_REPLICAS = "numberOfReplicas";
   static final String KEY_MAX_RESULT_WINDOW = "maxResultWindow";
+  static final String KEY_CODEC = "codec";
   static final String KEY_CONNECT_TIMEOUT = "connectTimeout";
   static final String KEY_SOCKET_TIMEOUT = "socketTimeout";
 
+  static final String DEFAULT_CODEC = "default";
   static final String DEFAULT_PORT = "9200";
   static final String DEFAULT_USERNAME = "elastic";
   static final int DEFAULT_NUMBER_OF_SHARDS = 1;
@@ -62,6 +64,7 @@
   final int numberOfShards;
   final int numberOfReplicas;
   final int maxResultWindow;
+  final String codec;
   final int connectTimeout;
   final int socketTimeout;
   final String prefix;
@@ -82,6 +85,7 @@
         cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_NUMBER_OF_REPLICAS, DEFAULT_NUMBER_OF_REPLICAS);
     this.maxResultWindow =
         cfg.getInt(SECTION_ELASTICSEARCH, null, KEY_MAX_RESULT_WINDOW, DEFAULT_MAX_RESULT_WINDOW);
+    this.codec = firstNonNull(cfg.getString(SECTION_ELASTICSEARCH, null, KEY_CODEC), DEFAULT_CODEC);
     this.connectTimeout =
         (int)
             cfg.getTimeUnit(
diff --git a/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java b/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java
index 7ec0566..0059574 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/ElasticSetting.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.elasticsearch;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.gson.annotations.SerializedName;
 import java.util.Map;
 
 class ElasticSetting {
@@ -36,6 +37,7 @@
       properties.numberOfShards = config.getNumberOfShards();
       properties.numberOfReplicas = config.numberOfReplicas;
       properties.maxResultWindow = config.maxResultWindow;
+      properties.codec = config.codec;
       return properties;
     }
 
@@ -73,6 +75,9 @@
   }
 
   static class SettingProperties {
+    @SerializedName("index.codec")
+    String codec;
+
     Map<String, FieldProperties> analysis;
     Integer numberOfShards;
     Integer numberOfReplicas;
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index ad5d5d0..927d229 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -92,6 +92,13 @@
 
 Not set by default.
 
+### elasticsearch.codec
+
+Sets the codec to be used for the index data. For further information about supported codecs, please refer to the static index setting
+[index.codec](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#index-codec).
+
+Defaults to `default`.
+
 [Back to @PLUGIN@ documentation index][index]
 
 [index]: index.html