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