Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[client-v2] Add ability to pass query parameter to queryAll and queryRecords methods. #1979

Merged
merged 1 commit into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 48 additions & 12 deletions client-v2/src/main/java/com/clickhouse/client/api/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -1731,36 +1731,53 @@ public CompletableFuture<QueryResponse> query(String sqlQuery, Map<String, Objec

return runAsyncOperation(responseSupplier, settings.getAllSettings());
}
public CompletableFuture<QueryResponse> query(String sqlQuery, Map<String, Object> queryParams) {
return query(sqlQuery, queryParams, null);
}

/**
* <p>Queries data in one of descriptive format and creates a reader out of the response stream.</p>
* <p>Format is selected internally so is ignored when passed in settings. If query contains format
* statement then it may cause incompatibility error.</p>
*
* @param sqlQuery
* @return
* @param sqlQuery - SQL statement
* @return - a promise to a result
*/
public CompletableFuture<Records> queryRecords(String sqlQuery) {
return queryRecords(sqlQuery, null);
return queryRecords(sqlQuery, null, null);
}

/**
* <p>Queries data in one of descriptive format and creates a reader out of the response stream.</p>
* <p>Format is selected internally so is ignored when passed in settings. If query contains format
* statement then it may cause incompatibility error.</p>
*
* @param sqlQuery
* @param settings
* @return
* @param sqlQuery - SQL statement
* @param settings - operation settings
* @return - a promise to a result
*/
public CompletableFuture<Records> queryRecords(String sqlQuery, QuerySettings settings) {
return queryRecords(sqlQuery, null, settings);
}

/**
* <p>Queries data in one of descriptive format and creates a reader out of the response stream.</p>
* <p>Format is selected internally so is ignored when passed in settings. If query contains format
* statement then it may cause incompatibility error.</p>
* See {@link #query(String, Map, QuerySettings)} for parametrized queries.
* @param sqlQuery - SQL statement
* @param params - sql parameters
* @param settings - operation settings
* @return - a promise to a result
*/
public CompletableFuture<Records> queryRecords(String sqlQuery, Map<String, Object> params, QuerySettings settings) {
if (settings == null) {
settings = new QuerySettings();
}
settings.setFormat(ClickHouseFormat.RowBinaryWithNamesAndTypes);
settings.waitEndOfQuery(true); // we rely on the summery

return query(sqlQuery, settings).thenApply(response -> {
return query(sqlQuery, params, settings).thenApply(response -> {
try {

return new Records(response, newBinaryFormatReader(response));
Expand All @@ -1770,19 +1787,30 @@ public CompletableFuture<Records> queryRecords(String sqlQuery, QuerySettings se
});
}

public CompletableFuture<Records> queryRecords(String sqlQuery, Map<String, Object> params) {
return queryRecords(sqlQuery, params, null);
}

/**
* <p>Queries data in descriptive format and reads result to a collection.</p>
* <p>Use this method for queries that would return only a few records only because client
* will read whole dataset and convert it into a list of GenericRecord</p>
* @param sqlQuery - SQL query
*
* See {@link #query(String, Map, QuerySettings)} for parametrized queries.
* @param sqlQuery - SQL statement
* @param params - query parameters
* @param settings - operation settings
* @return - complete list of records
*/
public List<GenericRecord> queryAll(String sqlQuery, QuerySettings settings) {
public List<GenericRecord> queryAll(String sqlQuery, Map<String, Object> params, QuerySettings settings) {
if (settings == null) {
settings = new QuerySettings();
}
try {
int operationTimeout = getOperationTimeout();
settings.setFormat(ClickHouseFormat.RowBinaryWithNamesAndTypes)
.waitEndOfQuery(true);
try (QueryResponse response = operationTimeout == 0 ? query(sqlQuery, settings).get() :
try (QueryResponse response = operationTimeout == 0 ? query(sqlQuery, params, settings).get() :
query(sqlQuery, settings).get(operationTimeout, TimeUnit.MILLISECONDS)) {
List<GenericRecord> records = new ArrayList<>();
if (response.getResultRows() > 0) {
Expand All @@ -1791,7 +1819,7 @@ public List<GenericRecord> queryAll(String sqlQuery, QuerySettings settings) {

Map<String, Object> record;
while (reader.readRecord((record = new LinkedHashMap<>()))) {
records.add(new MapBackedRecord(record, reader.getSchema()));
records.add(new MapBackedRecord(record, reader.getConvertions(), reader.getSchema()));
}
}
return records;
Expand All @@ -1803,8 +1831,16 @@ public List<GenericRecord> queryAll(String sqlQuery, QuerySettings settings) {
}
}

public List<GenericRecord> queryAll(String sqlQuery, QuerySettings settings) {
return queryAll(sqlQuery, null, settings);
}

public List<GenericRecord> queryAll(String sqlQuery, Map<String, Object> params) {
return queryAll(sqlQuery, params, null);
}

public List<GenericRecord> queryAll(String sqlQuery) {
return queryAll(sqlQuery, new QuerySettings());
return queryAll(sqlQuery, null, (QuerySettings) null);
}

public <T> List<T> queryAll(String sqlQuery, Class<T> clazz, TableSchema schema) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.clickhouse.client.api.data_formats.internal;

import com.clickhouse.client.api.ClientException;
import com.clickhouse.client.api.ClientConfigProperties;
import com.clickhouse.client.api.ClientException;
import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader;
import com.clickhouse.client.api.internal.MapUtils;
import com.clickhouse.client.api.internal.ServerSettings;
Expand Down Expand Up @@ -235,7 +235,6 @@ protected void setSchema(TableSchema schema) {
for (int i = 0; i < columns.length; i++) {
ClickHouseColumn column = columns[i];

Map<NumberType, Function<Object, ?>> converters = new HashMap<>();
switch (column.getDataType()) {
case Int8:
case Int16:
Expand All @@ -257,21 +256,16 @@ protected void setSchema(TableSchema schema) {
case Decimal128:
case Decimal256:
case Bool:
converters.put(NumberType.Byte, SerializerUtils.NumberConverter::toByte);
converters.put(NumberType.Short, SerializerUtils.NumberConverter::toShort);
converters.put(NumberType.Int, SerializerUtils.NumberConverter::toInt);
converters.put(NumberType.Long, SerializerUtils.NumberConverter::toLong);
converters.put(NumberType.BigInteger, SerializerUtils.NumberConverter::toBigInteger);
converters.put(NumberType.BigDecimal, SerializerUtils.NumberConverter::toBigDecimal);
converters.put(NumberType.Float, SerializerUtils.NumberConverter::toFloat);
converters.put(NumberType.Double, SerializerUtils.NumberConverter::toDouble);
converters.put(NumberType.Boolean, SerializerUtils::convertToBoolean);
this.convertions[i] = NumberConverter.NUMBER_CONVERTERS;
break;
default:
this.convertions[i] = Collections.emptyMap();
}

this.convertions[i] = converters;
}
}

public Map[] getConvertions() {
return convertions;
}

@Override
Expand Down Expand Up @@ -302,7 +296,7 @@ public String getString(int index) {
return value.toString();
}

private <T> T readNumberValue(String colName, NumberType targetType) {
private <T> T readNumberValue(String colName, NumberConverter.NumberType targetType) {
int colIndex = schema.nameToIndex(colName);
Function<Object, Object> converter = (Function<Object, Object>) convertions[colIndex].get(targetType);
if (converter != null) {
Expand All @@ -320,47 +314,47 @@ private <T> T readNumberValue(String colName, NumberType targetType) {

@Override
public byte getByte(String colName) {
return readNumberValue(colName, NumberType.Byte);
return readNumberValue(colName, NumberConverter.NumberType.Byte);
}

@Override
public short getShort(String colName) {
return readNumberValue(colName, NumberType.Short);
return readNumberValue(colName, NumberConverter.NumberType.Short);
}

@Override
public int getInteger(String colName) {
return readNumberValue(colName, NumberType.Int);
return readNumberValue(colName, NumberConverter.NumberType.Int);
}

@Override
public long getLong(String colName) {
return readNumberValue(colName, NumberType.Long);
return readNumberValue(colName, NumberConverter.NumberType.Long);
}

@Override
public float getFloat(String colName) {
return readNumberValue(colName, NumberType.Float);
return readNumberValue(colName, NumberConverter.NumberType.Float);
}

@Override
public double getDouble(String colName) {
return readNumberValue(colName, NumberType.Double);
return readNumberValue(colName, NumberConverter.NumberType.Double);
}

@Override
public boolean getBoolean(String colName) {
return readNumberValue(colName, NumberType.Boolean);
return readNumberValue(colName, NumberConverter.NumberType.Boolean);
}

@Override
public BigInteger getBigInteger(String colName) {
return readNumberValue(colName, NumberType.BigInteger);
return readNumberValue(colName, NumberConverter.NumberType.BigInteger);
}

@Override
public BigDecimal getBigDecimal(String colName) {
return readNumberValue(colName, NumberType.BigDecimal);
return readNumberValue(colName, NumberConverter.NumberType.BigDecimal);
}

@Override
Expand Down Expand Up @@ -733,19 +727,4 @@ public ClickHouseBitmap getClickHouseBitmap(int index) {
public void close() throws Exception {
input.close();
}

private enum NumberType {
Byte("byte"), Short("short"), Int("int"), Long("long"), BigInteger("BigInteger"), Float("float"),
Double("double"), BigDecimal("BigDecimal"), Boolean("boolean");

private final String typeName;

NumberType(String typeName) {
this.typeName = typeName;
}

public String getTypeName() {
return typeName;
}
}
}
Loading
Loading