Skip to content

Commit e5d453c

Browse files
committed
completed list of options and settings for request
1 parent 9cfa4e8 commit e5d453c

File tree

3 files changed

+144
-39
lines changed

3 files changed

+144
-39
lines changed

client-v2/src/main/java/com/clickhouse/client/api/Client.java

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ public Future<InsertResponse> insert(String tableName,
149149
public Future<QueryResponse> query(String sqlQuery, Map<String, Object> qparams, QuerySettings settings) {
150150
ClickHouseClient client = createClient();
151151
ClickHouseRequest<?> request = client.read(getServerNode());
152+
request.options(SettingsConverter.toRequestOptions(settings.getAllSettings()));
152153
request.settings(SettingsConverter.toRequestSettings(settings.getAllSettings()));
153154
request.query(sqlQuery, settings.getQueryID());
154155
request.format(ClickHouseFormat.valueOf(settings.getFormat()));
@@ -188,33 +189,24 @@ public static Set<String> getCompressAlgorithms() {
188189
return COMPRESS_ALGORITHMS;
189190
}
190191

191-
private static final Set<String> OUTPUT_FORMATS = ValidationUtils.whiteList("Native", "JSON", "JSONCompact",
192-
"TabSeparated", "TabSeparatedRaw", "TabSeparatedWithNames", "TabSeparatedWithNamesAndTypes", "Pretty",
193-
"PrettyCompact", "PrettyCompactMonoBlock", "PrettyNoEscapes", "PrettySpace", "PrettySpaceNoEscapes",
194-
"PrettyCompactSpace", "PrettyCompactSpaceNoEscapes", "PrettyNoEscapesAndQuoting",
195-
"PrettySpaceNoEscapesAndQuoting", "PrettyCompactNoEscapesAndQuoting",
196-
"PrettyCompactSpaceNoEscapesAndQuoting", "PrettyNoEscapesAndQuotingMonoBlock",
197-
"PrettySpaceNoEscapesAndQuotingMonoBlock", "PrettyCompactNoEscapesAndQuotingMonoBlock",
198-
"PrettyCompactSpaceNoEscapesAndQuotingMonoBlock", "PrettyNoEscapesAndQuotingSpace",
199-
"PrettySpaceNoEscapesAndQuotingSpace", "PrettyCompactNoEscapesAndQuotingSpace",
200-
"PrettyCompactSpaceNoEscapesAndQuotingSpace", "PrettyNoEscapesAndQuotingSpaceMonoBlock",
201-
"PrettySpaceNoEscapesAndQuotingSpaceMonoBlock", "PrettyCompactNoEscapesAndQuotingSpaceMonoBlock",
202-
"PrettyCompactSpaceNoEscapesAndQuotingSpaceMonoBlock", "PrettyNoEscapesAndQuotingSpaceWithEscapes",
203-
"PrettySpaceNoEscapesAndQuotingSpaceWithEscapes", "PrettyCompactNoEscapesAndQuotingSpaceWithEscapes",
204-
"PrettyCompactSpaceNoEscapesAndQuotingSpaceWithEscapes",
205-
"PrettyNoEscapesAndQuotingSpaceWithEscapesMonoBlock",
206-
"PrettySpaceNoEscapesAndQuotingSpaceWithEscapesMonoBlock",
207-
"PrettyCompactNoEscapesAndQuotingSpaceWithEscapesMonoBlock",
208-
"PrettyCompactSpaceNoEscapesAndQuotingSpaceWithEscapesMonoBlock",
209-
"PrettyNoEscapesAndQuotingSpaceWithEscapesAndNulls",
210-
"PrettySpaceNoEscapesAndQuotingSpaceWithEscapesAndNulls",
211-
"PrettyCompactNoEscapesAndQuotingSpaceWithEscapesAndNulls",
212-
"PrettyCompactSpaceNoEscapesAndQuotingSpaceWithEscapesAndNulls",
213-
"PrettyNoEscapesAndQuotingSpaceWithEscapesAndNullsMonoBlock",
214-
"PrettySpaceNoEscapesAndQuotingSpaceWithEscapesAndNullsMonoBlock",
215-
"PrettyCompactNoEscapesAndQuotingSpaceWithEscapesAndNull");
192+
private static final Set<String> OUTPUT_FORMATS = createFormatWhitelist("output");
193+
194+
private static final Set<String> INPUT_FORMATS = createFormatWhitelist("input");
216195

217196
public static Set<String> getOutputFormats() {
218197
return OUTPUT_FORMATS;
219198
}
199+
200+
private static Set<String> createFormatWhitelist(String shouldSupport) {
201+
Set<String> formats = new HashSet<>();
202+
boolean supportOutput = "output".equals(shouldSupport);
203+
boolean supportInput = "input".equals(shouldSupport);
204+
boolean supportBoth = "both".equals(shouldSupport);
205+
for (ClickHouseFormat format : ClickHouseFormat.values()) {
206+
if ((supportOutput && format.supportsOutput()) || (supportInput && format.supportsInput()) || (supportBoth)) {
207+
formats.add(format.name());
208+
}
209+
}
210+
return Collections.unmodifiableSet(formats);
211+
}
220212
}
Lines changed: 126 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package com.clickhouse.client.api.internal;
22

3+
import com.clickhouse.client.config.ClickHouseClientOption;
4+
import com.clickhouse.client.http.config.ClickHouseHttpOption;
5+
import com.clickhouse.config.ClickHouseOption;
6+
37
import java.io.Serializable;
8+
import java.util.Arrays;
49
import java.util.Collection;
10+
import java.util.Collections;
511
import java.util.HashMap;
12+
import java.util.HashSet;
613
import java.util.Map;
14+
import java.util.Set;
715
import java.util.regex.Pattern;
816

917
public class SettingsConverter {
@@ -12,35 +20,140 @@ public static Map<String, Serializable> toRequestSettings(Map<String, Object> se
1220
Map<String, Serializable> requestSettings = new HashMap<>();
1321

1422
for (Map.Entry<String, Object> entry : settings.entrySet()) {
23+
if (!REQUEST_SETTINGS.contains(entry.getKey())) {
24+
continue;
25+
}
26+
1527
if (entry.getValue() instanceof Map<?,?>) {
1628
Map<String, String> map = (Map<String, String>) entry.getValue();
17-
StringBuilder sb = new StringBuilder();
18-
for (Map.Entry<String, String> e : map.entrySet()) {
19-
sb.append(escape(e.getKey())).append('=').append(escape(e.getValue())).append(',');
20-
}
21-
requestSettings.put(entry.getKey(), sb.substring(0, sb.length() - 1));
29+
requestSettings.put(entry.getKey(), convertMapToStringValue(map));
2230
} else if (entry.getValue() instanceof Collection<?>) {
2331
Collection<?> collection = (Collection<?>) entry.getValue();
24-
StringBuilder sb = new StringBuilder();
25-
for (Object value : collection) {
26-
sb.append(escape(value.toString())).append(',');
27-
}
28-
requestSettings.put(entry.getKey(), sb.substring(0, sb.length() - 1));
32+
requestSettings.put(entry.getKey(), convertCollectionToStringValue(collection));
2933
} else {
30-
if (entry.getKey().equals("format")) {
31-
continue;
32-
}
3334
requestSettings.put(entry.getKey(), (Serializable) entry.getValue());
3435
}
3536
}
3637

3738
return requestSettings;
3839
}
3940

41+
public static Map<ClickHouseOption, Serializable> toRequestOptions(Map<String, Object> settings) {
42+
Map<ClickHouseOption, Serializable> requestOptions = new HashMap<>();
43+
44+
for (Map.Entry<String, Object> entry : settings.entrySet()) {
45+
if (!REQUEST_OPTIONS.containsKey(entry.getKey())) {
46+
continue;
47+
}
48+
49+
ClickHouseOption option = REQUEST_OPTIONS.get(entry.getKey());
50+
if (entry.getValue() instanceof Map<?,?>) {
51+
Map<String, String> map = (Map<String, String>) entry.getValue();
52+
requestOptions.put(option, convertMapToStringValue(map));
53+
} else if (entry.getValue() instanceof Collection<?>) {
54+
Collection<?> collection = (Collection<?>) entry.getValue();
55+
requestOptions.put(option, convertCollectionToStringValue(collection));
56+
} else {
57+
requestOptions.put(option, (Serializable) entry.getValue());
58+
}
59+
}
60+
61+
return requestOptions;
62+
}
63+
64+
private static String convertMapToStringValue(Map<String, String> map) {
65+
StringBuilder sb = new StringBuilder();
66+
for (Map.Entry<String, String> e : map.entrySet()) {
67+
sb.append(escape(e.getKey())).append('=').append(escape(e.getValue())).append(',');
68+
}
69+
sb.setLength(sb.length() - 1);
70+
return sb.toString();
71+
}
4072

73+
private static String convertCollectionToStringValue(Collection<?> collection) {
74+
StringBuilder sb = new StringBuilder();
75+
for (Object value : collection) {
76+
sb.append(escape(value.toString())).append(',');
77+
}
78+
sb.setLength(sb.length() - 1);
79+
return sb.toString();
80+
}
4181
private static final Pattern ESCAPE_PATTERN = Pattern.compile("[,'\\\"=\\t\\n]{1}");
4282

4383
public static String escape(String value) {
4484
return ESCAPE_PATTERN.matcher(value).replaceAll("\\\\$0");
4585
}
86+
87+
private static final Map<String, ClickHouseOption> REQUEST_OPTIONS = createMapOfRequestOptions();
88+
private static final Set<String> REQUEST_SETTINGS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
89+
ClickHouseClientOption.MAX_EXECUTION_TIME.getKey(),
90+
ClickHouseClientOption.MAX_RESULT_ROWS.getKey(),
91+
"extremes",
92+
"role"
93+
)));
94+
95+
public static Map<String, ClickHouseOption> createMapOfRequestOptions() {
96+
Map<String, ClickHouseOption> map = new HashMap<>();
97+
98+
Arrays.asList(ClickHouseClientOption.FORMAT,
99+
ClickHouseClientOption.MAX_EXECUTION_TIME,
100+
ClickHouseHttpOption.CUSTOM_PARAMS,
101+
ClickHouseClientOption.AUTO_DISCOVERY,
102+
ClickHouseClientOption.CUSTOM_SETTINGS,
103+
ClickHouseClientOption.CUSTOM_SOCKET_FACTORY,
104+
ClickHouseClientOption.CUSTOM_SOCKET_FACTORY_OPTIONS,
105+
ClickHouseClientOption.CLIENT_NAME,
106+
ClickHouseClientOption.DECOMPRESS,
107+
ClickHouseClientOption.DECOMPRESS_ALGORITHM,
108+
ClickHouseClientOption.DECOMPRESS_LEVEL,
109+
ClickHouseClientOption.COMPRESS,
110+
ClickHouseClientOption.COMPRESS_ALGORITHM,
111+
ClickHouseClientOption.COMPRESS_LEVEL,
112+
ClickHouseClientOption.CONNECTION_TIMEOUT,
113+
ClickHouseClientOption.DATABASE,
114+
ClickHouseClientOption.MAX_BUFFER_SIZE,
115+
ClickHouseClientOption.BUFFER_SIZE,
116+
ClickHouseClientOption.BUFFER_QUEUE_VARIATION,
117+
ClickHouseClientOption.READ_BUFFER_SIZE,
118+
ClickHouseClientOption.WRITE_BUFFER_SIZE,
119+
ClickHouseClientOption.REQUEST_CHUNK_SIZE,
120+
ClickHouseClientOption.REQUEST_BUFFERING,
121+
ClickHouseClientOption.RESPONSE_BUFFERING,
122+
ClickHouseClientOption.MAX_MAPPER_CACHE,
123+
ClickHouseClientOption.MAX_QUEUED_BUFFERS,
124+
ClickHouseClientOption.MAX_QUEUED_REQUESTS,
125+
ClickHouseClientOption.MAX_RESULT_ROWS,
126+
ClickHouseClientOption.MAX_THREADS_PER_CLIENT,
127+
ClickHouseClientOption.PRODUCT_NAME,
128+
ClickHouseClientOption.NODE_CHECK_INTERVAL,
129+
ClickHouseClientOption.FAILOVER,
130+
ClickHouseClientOption.RETRY,
131+
ClickHouseClientOption.REPEAT_ON_SESSION_LOCK,
132+
ClickHouseClientOption.REUSE_VALUE_WRAPPER,
133+
ClickHouseClientOption.SERVER_TIME_ZONE,
134+
ClickHouseClientOption.SERVER_VERSION,
135+
ClickHouseClientOption.SESSION_TIMEOUT,
136+
ClickHouseClientOption.SESSION_CHECK,
137+
ClickHouseClientOption.SOCKET_TIMEOUT,
138+
ClickHouseClientOption.SSL,
139+
ClickHouseClientOption.SSL_MODE,
140+
ClickHouseClientOption.SSL_ROOT_CERTIFICATE,
141+
ClickHouseClientOption.SSL_CERTIFICATE,
142+
ClickHouseClientOption.SSL_KEY,
143+
ClickHouseClientOption.KEY_STORE_TYPE,
144+
ClickHouseClientOption.TRUST_STORE,
145+
ClickHouseClientOption.KEY_STORE_PASSWORD,
146+
ClickHouseClientOption.TRANSACTION_TIMEOUT,
147+
ClickHouseClientOption.WIDEN_UNSIGNED_TYPES,
148+
ClickHouseClientOption.USE_BINARY_STRING,
149+
ClickHouseClientOption.USE_BLOCKING_QUEUE,
150+
ClickHouseClientOption.USE_COMPILATION,
151+
ClickHouseClientOption.USE_OBJECTS_IN_ARRAYS,
152+
ClickHouseClientOption.USE_SERVER_TIME_ZONE,
153+
ClickHouseClientOption.USE_SERVER_TIME_ZONE_FOR_DATES,
154+
ClickHouseClientOption.USE_TIME_ZONE)
155+
.forEach(option -> map.put(option.getKey(), option));
156+
157+
return Collections.unmodifiableMap(map);
158+
}
46159
}

client-v2/src/test/java/com/clickhouse/client/query/QueryTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void setUp() {
5050
public void testSimpleSelectTableFormat() {
5151
prepareDataSet();
5252
QuerySettings settings = new QuerySettings()
53-
.setFormat("TabSeparated");
53+
.setFormat("JSON");
5454

5555
Map<String, Object> qparams = new HashMap<>();
5656
qparams.put("param1", "value1");

0 commit comments

Comments
 (0)