From 455d5e2fbcdc99e2c8f1f4cebde814da223a7bf6 Mon Sep 17 00:00:00 2001 From: serebrserg <serebrserg@yandex-team.ru> Date: Mon, 28 Mar 2016 15:36:07 +0300 Subject: [PATCH] METR-20494: add CHQueryParam enum --- .../metrika/clickhouse/CHStatement.java | 7 +- .../metrika/clickhouse/CHStatementImpl.java | 35 +++++----- .../clickhouse/copypaste/CHQueryParam.java | 70 +++++++++++++++++++ 3 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java diff --git a/src/main/java/ru/yandex/metrika/clickhouse/CHStatement.java b/src/main/java/ru/yandex/metrika/clickhouse/CHStatement.java index d14364c7..54892ec0 100644 --- a/src/main/java/ru/yandex/metrika/clickhouse/CHStatement.java +++ b/src/main/java/ru/yandex/metrika/clickhouse/CHStatement.java @@ -1,5 +1,6 @@ package ru.yandex.metrika.clickhouse; +import ru.yandex.metrika.clickhouse.copypaste.CHQueryParam; import ru.yandex.metrika.clickhouse.copypaste.ClickhouseResponse; import java.io.InputStream; @@ -14,8 +15,8 @@ import java.util.Map; */ public interface CHStatement extends Statement { ClickhouseResponse executeQueryClickhouseResponse(String sql) throws SQLException; - ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<String, String> additionalDBParams) throws SQLException; - ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<String, String> additionalDBParams, boolean ignoreDatabase) throws SQLException; - ResultSet executeQuery(String sql, Map<String, String> additionalDBParams) throws SQLException; + ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<CHQueryParam, String> additionalDBParams) throws SQLException; + ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<CHQueryParam, String> additionalDBParams, boolean ignoreDatabase) throws SQLException; + ResultSet executeQuery(String sql, Map<CHQueryParam, String> additionalDBParams) throws SQLException; void sendStream(InputStream content, String table) throws SQLException; } diff --git a/src/main/java/ru/yandex/metrika/clickhouse/CHStatementImpl.java b/src/main/java/ru/yandex/metrika/clickhouse/CHStatementImpl.java index 0a98e0ff..6f366984 100644 --- a/src/main/java/ru/yandex/metrika/clickhouse/CHStatementImpl.java +++ b/src/main/java/ru/yandex/metrika/clickhouse/CHStatementImpl.java @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static ru.yandex.metrika.clickhouse.copypaste.CHQueryParam.*; /** * Created by jkee on 14.03.15. */ @@ -65,7 +66,7 @@ public class CHStatementImpl implements CHStatement { return executeQuery(sql, null); } - public ResultSet executeQuery(String sql, Map<String, String> additionalDBParams) throws SQLException { + public ResultSet executeQuery(String sql, Map<CHQueryParam, String> additionalDBParams) throws SQLException { InputStream is = getInputStream(sql, additionalDBParams, false); try { currentResult = new CHResultSet(properties.isCompress() @@ -84,11 +85,11 @@ public class CHStatementImpl implements CHStatement { return executeQueryClickhouseResponse(sql, null); } - public ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<String, String> additionalDBParams) throws SQLException { + public ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<CHQueryParam, String> additionalDBParams) throws SQLException { return executeQueryClickhouseResponse(sql, additionalDBParams, false); } - public ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<String, String> additionalDBParams, boolean ignoreDatabase) throws SQLException { + public ClickhouseResponse executeQueryClickhouseResponse(String sql, Map<CHQueryParam, String> additionalDBParams, boolean ignoreDatabase) throws SQLException { InputStream is = getInputStream(clickhousifySql(sql, "JSONCompact"), additionalDBParams, ignoreDatabase); try { byte[] bytes = null; @@ -381,20 +382,20 @@ public class CHStatementImpl implements CHStatement { } private InputStream getInputStream(String sql, - Map<String, String> additionalClickHouseDBParams, + Map<CHQueryParam, String> additionalClickHouseDBParams, boolean ignoreDatabase ) throws CHException { sql = clickhousifySql(sql); log.debug("Executing SQL: " + sql); URI uri = null; try { - Map<String, String> params = getParams(ignoreDatabase); + Map<CHQueryParam, String> params = getParams(ignoreDatabase); if (additionalClickHouseDBParams != null && !additionalClickHouseDBParams.isEmpty()) { params.putAll(additionalClickHouseDBParams); } List<String> paramPairs = new ArrayList<String>(); - for (Map.Entry<String, String> entry : params.entrySet()) { - paramPairs.add(entry.getKey() + '=' + entry.getValue()); + for (Map.Entry<CHQueryParam, String> entry : params.entrySet()) { + paramPairs.add(entry.getKey().toString() + '=' + entry.getValue()); } String query = CopypasteUtils.join(paramPairs, '&'); uri = new URI("http", null, source.getHost(), source.getPort(), @@ -471,31 +472,31 @@ public class CHStatementImpl implements CHStatement { } } - public Map<String, String> getParams(boolean ignoreDatabase) { - Map<String, String> params = new HashMap<String, String>(); + public Map<CHQueryParam, String> getParams(boolean ignoreDatabase) { + Map<CHQueryParam, String> params = new HashMap<CHQueryParam, String>(); //в clickhouse бывают таблички без базы (Ñ‚.е. в базе default) if (!CopypasteUtils.isBlank(source.getDatabase()) && !ignoreDatabase) { - params.put("database", source.getDatabase()); + params.put(DATABASE, source.getDatabase()); } if (properties.isCompress()) { - params.put("compress", "1"); + params.put(COMPRESS, "1"); } // нам вÑегда нужны min и max в ответе - params.put("extremes", "1"); + params.put(EXTREMES, "1"); if (CopypasteUtils.isBlank(properties.getProfile())) { if (properties.getMaxThreads() != null) - params.put("max_threads", String.valueOf(properties.getMaxThreads())); + params.put(MAX_THREADS, String.valueOf(properties.getMaxThreads())); // да, там в Ñекундах - params.put("max_execution_time", String.valueOf((properties.getSocketTimeout() + properties.getDataTransferTimeout()) / 1000)); + params.put(MAX_EXECUTION_TIME, String.valueOf((properties.getSocketTimeout() + properties.getDataTransferTimeout()) / 1000)); if (properties.getMaxBlockSize() != null) { - params.put("max_block_size", String.valueOf(properties.getMaxBlockSize())); + params.put(MAX_BLOCK_SIZE, String.valueOf(properties.getMaxBlockSize())); } } else { - params.put("profile", properties.getProfile()); + params.put(PROFILE, properties.getProfile()); } //в ÐºÐ»Ð¸ÐºÑ…Ð°ÑƒÑ Ð¸Ð½Ð¾Ð³Ð´Ð° бывает user if (properties.getUser() != null) { - params.put("user", properties.getUser()); + params.put(USER, properties.getUser()); } return params; } diff --git a/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java new file mode 100644 index 00000000..02482b58 --- /dev/null +++ b/src/main/java/ru/yandex/metrika/clickhouse/copypaste/CHQueryParam.java @@ -0,0 +1,70 @@ +package ru.yandex.metrika.clickhouse.copypaste; + +/** + * @author serebrserg + * @since 25.03.16 + */ +public enum CHQueryParam { + MAX_PARALLEL_REPLICAS, + /** + * Каким образом вычиÑлÑÑ‚ÑŒ 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, + /** + * keyed - значит в параметре запроÑа передаётÑÑ "ключ" quota_key, + и квота ÑчитаетÑÑ Ð¿Ð¾ отдельноÑти Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð°. + Ðапример, в качеÑтве ключа может передаватьÑÑ Ð»Ð¾Ð³Ð¸Ð½ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Метрике, + и тогда квота будет ÑчитатьÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ логина по отдельноÑти. + Имеет ÑмыÑл иÑпользовать только еÑли quota_key передаётÑÑ Ð½Ðµ пользователем, а программой. + */ + QUOTA_KEY, + /** + * Меньше значение - больше приоритет + */ + PRIORITY, + /** + * БД по умолчанию. + */ + DATABASE, + /** + * Ñервер будет Ñжимать отправлÑемые вам данные + */ + COMPRESS, + /** + * Ð’Ñ‹ можете получить в дополнение к результату также минимальные и макÑимальные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñтолбцам результата. + * Ð”Ð»Ñ Ñтого, выÑтавите наÑтройку extremes в 1. Минимумы и макÑимумы ÑчитаютÑÑ Ð´Ð»Ñ Ñ‡Ð¸Ñловых типов, дат, дат-Ñ-временем. + * Ð”Ð»Ñ Ð¾Ñтальных Ñтолбцов, будут выведены Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию. + */ + EXTREMES, + /** + * МакÑимальное количеÑтво потоков обработки запроÑа + * https://clickhouse.yandex-team.ru/#max_threads + */ + MAX_THREADS, + /** + * МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа в Ñекундах. + * https://clickhouse.yandex-team.ru/#max_execution_time + */ + MAX_EXECUTION_TIME, + /** + * Ñто рекомендациÑ, какого размера блоки (в количеÑтве Ñтрок) загружать из таблицы. + * https://clickhouse.yandex-team.ru/#max_block_size + */ + MAX_BLOCK_SIZE, + /** + * Профили наÑтроек - Ñто множеÑтво наÑтроек, Ñгруппированных под одним именем. + * Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ClickHouse указываетÑÑ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¹ профиль. + */ + PROFILE, + /** + * Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, по умолчанию - default. + */ + USER; + + + @Override + public String toString() { + return name().toLowerCase(); + } +} -- GitLab