From 4e16fb7bbe19efb1c5d7b2c3e0a376f65609594c Mon Sep 17 00:00:00 2001
From: serebrserg <serebrserg@yandex-team.ru>
Date: Mon, 28 Mar 2016 19:21:21 +0300
Subject: [PATCH] METR-20494: add CHQueryParam enum

---
 .../copypaste/CHConnectionSettings.java       | 76 +++++++---------
 .../clickhouse/copypaste/CHQueryParam.java    | 45 +++++++---
 .../copypaste/HttpConnectionProperties.java   | 89 +++++++++++--------
 3 files changed, 117 insertions(+), 93 deletions(-)

diff --git a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHConnectionSettings.java b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHConnectionSettings.java
index d8173e50..33c5e0e4 100644
--- a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHConnectionSettings.java
+++ b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHConnectionSettings.java
@@ -4,58 +4,50 @@ package ru.yandex.metrika.clickhouse.copypaste;
  * @author serebrserg
  * @since 24.03.16
  */
-class CHConnectionSettings {
-    static final String PROFILE_SETTING = "profile";
-    static final String PROFILE_SETTING_DEFAULT = null;
+public enum CHConnectionSettings {
 
-    static final String COMPRESS_SETTING = "compress";
-    static final boolean COMPRESS_SETTING_DEFAULT = true;
-
-    static final String ASYNC_SETTING = "async";
-    static final boolean ASYNC_SETTING_DEFAULT = false;
-
-    static final String MAX_THREADS_SETTING = "maxThreads";
-    static final Integer MAX_THREADS_SETTING_DEFAULT = null;
-
-    static final String MAX_BLOCK_SIZE_SETTING = "maxBlockSize";
-    static final Integer MAX_BLOCK_SIZE_SETTING_DEFAULT = null;
-
-    static final String BUFFER_SIZE_SETTING = "bufferSize";
-    static final int BUFFER_SIZE_SETTING_DEFAULT = 65536;
-
-    static final String APACHE_BUFFER_SIZE_SETTING = "apacheBufferSize";
-    static final int APACHE_BUFFER_SIZE_SETTING_DEFAULT = 65536;
-
-    static final String SOCKET_TIMEOUT_SETTING = "socketTimeout";
-    static final int SOCKET_TIMEOUT_SETTING_DEFAULT = 30000;
-
-    static final String CONNECTION_TIMEOUT_SETTING = "connectionTimeout";
-    static final int CONNECTION_TIMEOUT_SETTING_DEFAULT = 50;
-
-    static final String USER_SETTING = "user";
-    static final String USER_SETTING_DEFAULT = null;
+    ASYNC("async", false),
+    BUFFER_SIZE("buffer_size", 65536),
+    APACHE_BUFFER_SIZE("apache_buffer_size", 65536),
+    SOCKET_TIMEOUT("socket_timeout", 30000),
+    CONNECTION_TIMEOUT("connection_timeout", 50),
 
     /*
     * это таймаут на передачу данных.
     * Число socketTimeout + dataTransferTimeout отправляется в clickhouse в параметре max_execution_time
     * После чего кликхаус сам останавливает запрос если время его выполнения превышает max_execution_time
     * */
-    static final String DATA_TRANSFER_TIMEOUT_SETTING = "dataTransferTimeout";
-    static final int DATA_TRANSFER_TIMEOUT_SETTING_DEFAULT = 10000;
+    DATA_TRANSFER_TIMEOUT( "dataTransferTimeout", 10000),
+
 
-    static final String KEEP_ALIVE_TIMEOUT_SETTING = "keepAliveTimeout";
-    static final int KEEP_ALIVE_TIMEOUT_SETTING_DEFAULT = 30 * 100;
+    KEEP_ALIVE_TIMEOUT("keepAliveTimeout", 30 * 100),
 
     /**
      * Для ConnectionManager'а
      */
-    static final String TIME_TO_LIVE_MILLIS_SETTING = "timeToLiveMillis";
-    static final int TIME_TO_LIVE_MILLIS_SETTING_DEFAULT = 60*1000;
-
-    static final String DEFAULT_MAX_PER_ROUTE_SETTING = "defaultMaxPerRoute";
-    static final int DEFAULT_MAX_PER_ROUTE_SETTING_DEFAULT = 500;
-
-    static final String MAX_TOTAL_SETTING = "maxTotal";
-    static final int MAX_TOTAL_SETTING_DEFAULT = 1000;
-
+    TIME_TO_LIVE_MILLIS("timeToLiveMillis", 60*1000),
+    DEFAULT_MAX_PER_ROUTE("defaultMaxPerRoute", 500),
+    MAX_TOTAL("maxTotal", 10000);
+
+    private final String key;
+    private final Object defaultValue;
+    private final Class clazz;
+
+    CHConnectionSettings(String key, Object defaultValue) {
+        this.key = key;
+        this.defaultValue = defaultValue;
+        this.clazz = defaultValue.getClass();
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public Object getDefaultValue() {
+        return defaultValue;
+    }
+
+    public Class getClazz() {
+        return clazz;
+    }
 }
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java
index 02482b58..5240afb5 100644
--- a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java
+++ b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java
@@ -5,12 +5,12 @@ package ru.yandex.metrika.clickhouse.copypaste;
  * @since 25.03.16
  */
 public enum CHQueryParam {
-    MAX_PARALLEL_REPLICAS,
+    MAX_PARALLEL_REPLICAS("max_parallel_replicas", null, String.class),
     /**
      * Каким образом вычислять TOTALS при наличии HAVING, а также при наличии max_rows_to_group_by и group_by_overflow_mode = 'any'
      * https://clickhouse.yandex-team.ru/#%D0%9C%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%20WITH%20TOTALS
      */
-    TOTALS_MODE,
+    TOTALS_MODE("totals_mode", null, String.class),
     /**
      * keyed - значит в параметре запроса передаётся "ключ" quota_key,
      и квота считается по отдельности для каждого значения ключа.
@@ -18,50 +18,71 @@ public enum CHQueryParam {
      и тогда квота будет считаться для каждого логина по отдельности.
      Имеет смысл использовать только если quota_key передаётся не пользователем, а программой.
      */
-    QUOTA_KEY,
+    QUOTA_KEY("quota_key", null, String.class),
     /**
      * Меньше значение - больше приоритет
      */
-    PRIORITY,
+    PRIORITY("priority", null, Integer.class),
     /**
      * БД по умолчанию.
      */
-    DATABASE,
+    DATABASE("database", "default", String.class),
     /**
      *  сервер будет сжимать отправляемые вам данные
      */
-    COMPRESS,
+    COMPRESS("compress", true, Boolean.class),
     /**
      * Вы можете получить в дополнение к результату также минимальные и максимальные значения по столбцам результата.
      * Для этого, выставите настройку extremes в 1. Минимумы и максимумы считаются для числовых типов, дат, дат-с-временем.
      * Для остальных столбцов, будут выведены значения по умолчанию.
      */
-    EXTREMES,
+    EXTREMES("extremes", "0", String.class),
     /**
      * Максимальное количество потоков обработки запроса
      * https://clickhouse.yandex-team.ru/#max_threads
      */
-    MAX_THREADS,
+    MAX_THREADS("max_threads", null, Integer.class),
     /**
      * Максимальное время выполнения запроса в секундах.
      * https://clickhouse.yandex-team.ru/#max_execution_time
      */
-    MAX_EXECUTION_TIME,
+    MAX_EXECUTION_TIME("max_execution_time", null, Integer.class),
     /**
      *  это рекомендация, какого размера блоки (в количестве строк) загружать из таблицы.
      * https://clickhouse.yandex-team.ru/#max_block_size
      */
-    MAX_BLOCK_SIZE,
+    MAX_BLOCK_SIZE("max_block_size", null, Integer.class),
     /**
      * Профили настроек - это множество настроек, сгруппированных под одним именем.
      * Для каждого пользователя ClickHouse указывается некоторый профиль.
      */
-    PROFILE,
+    PROFILE("profile", null, String.class),
     /**
      *  имя пользователя, по умолчанию - default.
      */
-    USER;
+    USER("user", null, String.class);
 
+    private final String key;
+    private final Object defaultValue;
+    private final Class clazz;
+
+    CHQueryParam(String key, Object defaultValue, Class clazz) {
+        this.key = key;
+        this.defaultValue = defaultValue;
+        this.clazz = clazz;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public Object getDefaultValue() {
+        return defaultValue;
+    }
+
+    public Class getClazz() {
+        return clazz;
+    }
 
     @Override
     public String toString() {
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/HttpConnectionProperties.java b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/HttpConnectionProperties.java
index 8870cadb..c1491ebf 100644
--- a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/HttpConnectionProperties.java
+++ b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/HttpConnectionProperties.java
@@ -3,6 +3,7 @@ package ru.yandex.metrika.clickhouse.copypaste;
 import java.util.Properties;
 
 import static ru.yandex.metrika.clickhouse.copypaste.CHConnectionSettings.*;
+import static ru.yandex.metrika.clickhouse.copypaste.CHQueryParam.*;
 /**
  * User: hamilkar
  * Date: 10/17/13
@@ -17,79 +18,89 @@ public class HttpConnectionProperties {
      * На стороне clickhouse сделаны ограничения на запросы.
      * https://svn.yandex.ru/websvn/wsvn/conv/trunk/metrica/src/dbms/src/Server/config.conf
      */
-    private String profile = PROFILE_SETTING_DEFAULT;
-    private boolean compress = COMPRESS_SETTING_DEFAULT;
+    private String profile;
+    private boolean compress;
     // asynchronous=0&max_threads=1
-    private boolean async = ASYNC_SETTING_DEFAULT;
-    private Integer maxThreads = MAX_THREADS_SETTING_DEFAULT;
-    private Integer maxBlockSize = MAX_BLOCK_SIZE_SETTING_DEFAULT;
+    private boolean async;
+    private Integer maxThreads;
+    private Integer maxBlockSize;
 
-    private int bufferSize = BUFFER_SIZE_SETTING_DEFAULT;
-    private int apacheBufferSize = APACHE_BUFFER_SIZE_SETTING_DEFAULT;
+    private int bufferSize;
+    private int apacheBufferSize;
 
     //настройки для демонов
-    private int socketTimeout = SOCKET_TIMEOUT_SETTING_DEFAULT;
-    private int connectionTimeout = CONNECTION_TIMEOUT_SETTING_DEFAULT;
+    private int socketTimeout;
+    private int connectionTimeout;
 
     //METR-9568: параметр user для определения профиля настроек(?).
-    private String user = USER_SETTING_DEFAULT;
+    private String user;
 
     /*
     * это таймаут на передачу данных.
     * Число socketTimeout + dataTransferTimeout отправляется в clickhouse в параметре max_execution_time
     * После чего кликхаус сам останавливает запрос если время его выполнения превышает max_execution_time
     * */
-    private int dataTransferTimeout = DATA_TRANSFER_TIMEOUT_SETTING_DEFAULT;
-    private int keepAliveTimeout = KEEP_ALIVE_TIMEOUT_SETTING_DEFAULT;
+    private int dataTransferTimeout;
+    private int keepAliveTimeout;
 
     /**
      * Для ConnectionManager'а
      */
-    private int timeToLiveMillis = TIME_TO_LIVE_MILLIS_SETTING_DEFAULT;
-    private int defaultMaxPerRoute = DEFAULT_MAX_PER_ROUTE_SETTING_DEFAULT;
-    private int maxTotal = MAX_TOTAL_SETTING_DEFAULT;
+    private int timeToLiveMillis;
+    private int defaultMaxPerRoute;
+    private int maxTotal;
 
     public HttpConnectionProperties() {
+        this(new Properties());
     }
 
     public HttpConnectionProperties(Properties info) {
-        this.profile = getSetting(info, PROFILE_SETTING, PROFILE_SETTING_DEFAULT);
-        this.compress = getSetting(info, COMPRESS_SETTING, COMPRESS_SETTING_DEFAULT);
-        this.async = getSetting(info, ASYNC_SETTING, ASYNC_SETTING_DEFAULT);
-        this.maxThreads = getSetting(info, MAX_THREADS_SETTING, MAX_THREADS_SETTING_DEFAULT);
-        this.maxBlockSize = getSetting(info, MAX_BLOCK_SIZE_SETTING, MAX_BLOCK_SIZE_SETTING_DEFAULT);
+        this.profile = getSetting(info, PROFILE);
+        this.compress = getSetting(info, COMPRESS);
+        this.async = getSetting(info, ASYNC);
+        this.maxThreads = getSetting(info, MAX_THREADS);
+        this.maxBlockSize = getSetting(info, MAX_BLOCK_SIZE);
 
-        this.bufferSize = getSetting(info, BUFFER_SIZE_SETTING, BUFFER_SIZE_SETTING_DEFAULT);
-        this.apacheBufferSize = getSetting(info, APACHE_BUFFER_SIZE_SETTING,APACHE_BUFFER_SIZE_SETTING_DEFAULT);
+        this.bufferSize = getSetting(info, BUFFER_SIZE);
+        this.apacheBufferSize = getSetting(info, APACHE_BUFFER_SIZE);
 
-        this.socketTimeout = getSetting(info, SOCKET_TIMEOUT_SETTING, SOCKET_TIMEOUT_SETTING_DEFAULT);
-        this.connectionTimeout = getSetting(info, CONNECTION_TIMEOUT_SETTING, CONNECTION_TIMEOUT_SETTING_DEFAULT);
+        this.socketTimeout = getSetting(info, SOCKET_TIMEOUT);
+        this.connectionTimeout = getSetting(info, CONNECTION_TIMEOUT);
 
-        this.user = getSetting(info, USER_SETTING, USER_SETTING_DEFAULT);
+        this.user = getSetting(info, USER);
 
-        this.dataTransferTimeout = getSetting(info, DATA_TRANSFER_TIMEOUT_SETTING, DATA_TRANSFER_TIMEOUT_SETTING_DEFAULT);
-        this.keepAliveTimeout = getSetting(info, KEEP_ALIVE_TIMEOUT_SETTING, KEEP_ALIVE_TIMEOUT_SETTING_DEFAULT);
+        this.dataTransferTimeout = getSetting(info, DATA_TRANSFER_TIMEOUT);
+        this.keepAliveTimeout = getSetting(info, KEEP_ALIVE_TIMEOUT);
 
-        this.timeToLiveMillis = getSetting(info, TIME_TO_LIVE_MILLIS_SETTING, TIME_TO_LIVE_MILLIS_SETTING_DEFAULT);
-        this.defaultMaxPerRoute = getSetting(info, DEFAULT_MAX_PER_ROUTE_SETTING, DEFAULT_MAX_PER_ROUTE_SETTING_DEFAULT);
-        this.maxTotal = getSetting(info, MAX_TOTAL_SETTING, MAX_TOTAL_SETTING_DEFAULT);
+        this.timeToLiveMillis = getSetting(info, TIME_TO_LIVE_MILLIS);
+        this.defaultMaxPerRoute = getSetting(info, DEFAULT_MAX_PER_ROUTE);
+        this.maxTotal = getSetting(info, MAX_TOTAL);
+    }
+
+
+    private <T> T getSetting(Properties info, CHQueryParam param){
+        return getSetting(info, param.getKey(), param.getDefaultValue(), param.getClazz());
+    }
+
+    private <T> T getSetting(Properties info, CHConnectionSettings settings){
+        return getSetting(info, settings.getKey(), settings.getDefaultValue(), settings.getClazz());
     }
 
     @SuppressWarnings("unchecked")
-    private <T> T getSetting(Properties info, String key, T defaultValue){
+    private <T> T getSetting(Properties info, String key, Object defaultValue, Class clazz){
         Object val = info.get(key);
         if (val == null)
-            return defaultValue;
-        if ((defaultValue.getClass() == int.class || defaultValue.getClass() == Integer.class) && val instanceof String) {
-            return (T) defaultValue.getClass().cast(Integer.valueOf((String) val));
+            return (T)defaultValue;
+        if ((clazz == int.class || clazz == Integer.class) && val instanceof String) {
+            return (T) clazz.cast(Integer.valueOf((String) val));
         }
-        if ((defaultValue.getClass() == long.class || defaultValue.getClass() == Long.class) && val instanceof String) {
-            return (T) defaultValue.getClass().cast(Long.valueOf((String) val));
+        if ((clazz == long.class || clazz == Long.class) && val instanceof String) {
+            return (T) clazz.cast(Long.valueOf((String) val));
         }
-        if ((defaultValue.getClass() == boolean.class || defaultValue.getClass() == Boolean.class) && val instanceof String) {
-            return (T) defaultValue.getClass().cast(Boolean.valueOf((String) val));
+        if ((clazz == boolean.class || clazz == Boolean.class) && val instanceof String) {
+            return (T) clazz.cast(Boolean.valueOf((String) val));
         }
-        return (T) defaultValue.getClass().cast(val);
+        return (T) clazz.cast(val);
     }
 
 
-- 
GitLab