ru.yandex.clickhouse.jdbcbridge.core.QueryParameters Maven / Gradle / Ivy
/**
* Copyright 2019-2021, Zhichun Wu
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.yandex.clickhouse.jdbcbridge.core;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import io.vertx.core.json.JsonObject;
/**
* This class defines parameters can be used along with query, to change
* behaviour of query exuection and result normalization.
*
* @since 2.0
*/
public class QueryParameters {
public static final String PARAM_BATCH_SIZE = "batch_size";
public static final String PARAM_CUSTOM_COLUMNS = "custom_columns";
public static final String PARAM_DATASOURCE_COLUMN = "datasource_column";
public static final String PARAM_FETCH_SIZE = "fetch_size";
public static final String PARAM_MAX_ROWS = "max_rows";
public static final String PARAM_MUTATION = "mutation";
public static final String PARAM_NO_CACHE = "no_cache";
public static final String PARAM_NULL_AS_DEFAULT = "null_as_default";
public static final String PARAM_OFFSET = "offset";
public static final String PARAM_POSITION = "position";
public static final String PARAM_TIMEOUT = "timeout";
public static final String PARAM_USE_DATETIME = "use_datetime";
public static final String PARAM_DEBUG = "debug";
public static final int DEFAULT_BATCH_SIZE = 100;
public static final int DEFAULT_FETCH_SIZE = 1000;
public static final int DEFAULT_MAX_ROWS = 0;
public static final int DEFAULT_OFFSET = 0;
public static final int DEFAULT_POSITION = 0;
public static final int DEFAULT_TIMEOUT = -1;
private final TypedParameter batchSize;
private final TypedParameter customColumns;
private final TypedParameter datasourceColumn;
private final TypedParameter fetchSize;
private final TypedParameter maxRows;
private final TypedParameter mutation;
private final TypedParameter noCache;
private final TypedParameter nullAsDefault;
private final TypedParameter offset;
private final TypedParameter position;
private final TypedParameter timeout;
private final TypedParameter debug;
private final Map> params = new TreeMap<>();
public QueryParameters() {
Utils.addTypedParameter(params,
this.batchSize = new TypedParameter<>(Integer.class, PARAM_BATCH_SIZE, DEFAULT_BATCH_SIZE));
Utils.addTypedParameter(params,
this.customColumns = new TypedParameter<>(Boolean.class, PARAM_CUSTOM_COLUMNS, false));
Utils.addTypedParameter(params,
this.datasourceColumn = new TypedParameter<>(Boolean.class, PARAM_DATASOURCE_COLUMN, false));
Utils.addTypedParameter(params,
this.fetchSize = new TypedParameter<>(Integer.class, PARAM_FETCH_SIZE, DEFAULT_FETCH_SIZE));
Utils.addTypedParameter(params,
this.maxRows = new TypedParameter<>(Integer.class, PARAM_MAX_ROWS, DEFAULT_MAX_ROWS));
Utils.addTypedParameter(params, this.mutation = new TypedParameter<>(Boolean.class, PARAM_MUTATION, false));
Utils.addTypedParameter(params, this.noCache = new TypedParameter<>(Boolean.class, PARAM_NO_CACHE, false));
Utils.addTypedParameter(params,
this.nullAsDefault = new TypedParameter<>(Boolean.class, PARAM_NULL_AS_DEFAULT, false));
Utils.addTypedParameter(params,
this.offset = new TypedParameter<>(Integer.class, PARAM_OFFSET, DEFAULT_OFFSET));
Utils.addTypedParameter(params,
this.position = new TypedParameter<>(Integer.class, PARAM_POSITION, DEFAULT_POSITION));
Utils.addTypedParameter(params,
this.timeout = new TypedParameter<>(Integer.class, PARAM_TIMEOUT, DEFAULT_TIMEOUT));
Utils.addTypedParameter(params, this.debug = new TypedParameter<>(Boolean.class, PARAM_DEBUG, false));
}
public QueryParameters(String uri) {
this();
merge(uri);
}
public QueryParameters(JsonObject... params) {
this();
for (JsonObject parameters : params) {
merge(parameters);
}
}
public QueryParameters merge(QueryParameters p) {
if (p != null) {
for (TypedParameter> tp : p.params.values()) {
TypedParameter> x = this.params.get(tp.getName());
if (x == null) {
this.params.put(tp.getName(), tp);
} else if (x.getType() == tp.getType()) {
x.merge(tp.getValue());
}
}
}
return this;
}
public QueryParameters merge(JsonObject p) {
if (p != null) {
HashSet names = new HashSet<>(p.fieldNames());
for (TypedParameter> tp : this.params.values()) {
names.remove(tp.getName());
if (!PARAM_DEBUG.equals(tp.getName())) {
tp.merge(p);
}
}
for (String name : names) {
String value = Objects.toString(p.getValue(name));
this.params.put(name, new TypedParameter<>(String.class, name, value, value));
}
}
return this;
}
public QueryParameters merge(String uri) {
int index = uri == null ? -1 : uri.indexOf('?');
if (index >= 0 && uri.length() > index) {
String query = uri.substring(index + 1);
for (String param : Utils.splitByChar(query, '&')) {
index = param.indexOf('=');
if (index > 0) {
String key = param.substring(0, index);
String value = param.substring(index + 1);
TypedParameter> p = this.params.get(key);
if (p != null) {
p.merge(value);
} else {
this.params.put(key, new TypedParameter(String.class, key, value, value));
}
} else {
TypedParameter> p = this.params.get(param);
if (p != null && p.getDefaultValue() instanceof Boolean) {
p.merge(Boolean.TRUE.toString());
}
}
}
}
return this;
}
public int getBatchSize() {
return this.batchSize.getValue();
}
public int getFetchSize() {
return this.fetchSize.getValue();
}
public int getMaxRows() {
return this.maxRows.getValue();
}
public boolean isMutation() {
return this.mutation.getValue();
}
public boolean doNotUseCache() {
return this.noCache.getValue();
}
public boolean nullAsDefault() {
return this.nullAsDefault.getValue();
}
public int getOffset() {
return this.offset.getValue();
}
public int getPosition() {
return this.position.getValue();
}
public int getTimeout() {
return this.timeout.getValue();
}
public boolean showDatasourceColumn() {
return this.datasourceColumn.getValue();
}
public boolean showCustomColumns() {
return this.customColumns.getValue();
}
public boolean isDebug() {
return this.debug.getValue();
}
@SuppressWarnings("unchecked")
public T getParameterDefaultValue(String key, Class type) {
return ((TypedParameter) this.params.get(key)).getDefaultValue();
}
@SuppressWarnings("unchecked")
public T getParameterValue(String key, Class type) {
return ((TypedParameter) this.params.get(key)).getValue();
}
public Map asVariables() {
Map map = new HashMap(this.params.size());
for (TypedParameter> tp : this.params.values()) {
Object value = tp.getValue();
if (value instanceof String) {
map.put(tp.getName(), (String) value);
}
}
return map;
}
public String toQueryString() {
StringBuilder sb = new StringBuilder();
for (TypedParameter> p : this.params.values()) {
sb.append('&').append(p.toKeyValuePairString());
}
if (sb.length() > 0) {
sb.deleteCharAt(0);
}
return sb.toString();
}
public JsonObject toJson() {
JsonObject obj = new JsonObject();
for (Map.Entry> p : this.params.entrySet()) {
obj.put(p.getKey(), String.valueOf(p.getValue().getValue()));
}
return obj;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy