@@ -139,20 +139,21 @@ public class Client implements AutoCloseable {
139139 private String dbUser ;
140140 private String serverVersion ;
141141 private Object metricsRegistry ;
142- private int retries ;
142+ private final int retries ;
143143 private LZ4Factory lz4Factory = null ;
144+ private final Supplier <String > queryIdGenerator ;
144145
145146 private Client (Set <String > endpoints , Map <String ,String > configuration ,
146- ExecutorService sharedOperationExecutor , ColumnToMethodMatchingStrategy columnToMethodMatchingStrategy ) {
147- this (endpoints , configuration , sharedOperationExecutor , columnToMethodMatchingStrategy , null );
147+ ExecutorService sharedOperationExecutor , ColumnToMethodMatchingStrategy columnToMethodMatchingStrategy , Object metricRegistry , Supplier < String > queryIdGenerator ) {
148+ this (endpoints , configuration , sharedOperationExecutor , columnToMethodMatchingStrategy , null , metricRegistry , queryIdGenerator );
148149 }
149150
150151 private Client (Set <String > endpoints , Map <String ,String > configuration ,
151- ExecutorService sharedOperationExecutor , ColumnToMethodMatchingStrategy columnToMethodMatchingStrategy , Object metricsRegistry ) {
152- // Simple initialization
152+ ExecutorService sharedOperationExecutor , ColumnToMethodMatchingStrategy columnToMethodMatchingStrategy , Object metricsRegistry , Object metricRegistry , Supplier <String > queryIdGenerator ) {
153153 this .configuration = ClientConfigProperties .parseConfigMap (configuration );
154154 this .readOnlyConfig = Collections .unmodifiableMap (configuration );
155155 this .metricsRegistry = metricsRegistry ;
156+ this .queryIdGenerator = queryIdGenerator ;
156157
157158 // Serialization
158159 this .pojoSerDe = new POJOSerDe (columnToMethodMatchingStrategy );
@@ -267,6 +268,8 @@ public static class Builder {
267268 private ExecutorService sharedOperationExecutor = null ;
268269 private ColumnToMethodMatchingStrategy columnToMethodMatchingStrategy ;
269270 private Object metricRegistry = null ;
271+ private Supplier <String > queryIdGenerator ;
272+
270273 public Builder () {
271274 this .endpoints = new HashSet <>();
272275 this .configuration = new HashMap <>();
@@ -1048,6 +1051,16 @@ public Builder sslSocketSNI(String sni) {
10481051 return this ;
10491052 }
10501053
1054+ /**
1055+ * Sets query id generator. Will be used when operation settings (InsertSettings, QuerySettings) do not have query id set.
1056+ * @param supplier
1057+ * @return
1058+ */
1059+ public Builder queryIdGenerator (Supplier <String > supplier ) {
1060+ this .queryIdGenerator = supplier ;
1061+ return this ;
1062+ }
1063+
10511064 public Client build () {
10521065 // check if endpoint are empty. so can not initiate client
10531066 if (this .endpoints .isEmpty ()) {
@@ -1106,7 +1119,7 @@ public Client build() {
11061119 }
11071120
11081121 return new Client (this .endpoints , this .configuration , this .sharedOperationExecutor ,
1109- this .columnToMethodMatchingStrategy , this .metricRegistry );
1122+ this .columnToMethodMatchingStrategy , this .metricRegistry , this . queryIdGenerator );
11101123 }
11111124 }
11121125
@@ -1245,6 +1258,9 @@ public CompletableFuture<InsertResponse> insert(String tableName, List<?> data,
12451258 final int maxRetries = retry == null ? 0 : retry ;
12461259
12471260 requestSettings .setOption (ClientConfigProperties .INPUT_OUTPUT_FORMAT .getKey (), format );
1261+ if (requestSettings .getQueryId () == null && queryIdGenerator != null ) {
1262+ requestSettings .setQueryId (queryIdGenerator .get ());
1263+ }
12481264 Supplier <InsertResponse > supplier = () -> {
12491265 long startTime = System .nanoTime ();
12501266 // Selecting some node
@@ -1462,6 +1478,9 @@ public CompletableFuture<InsertResponse> insert(String tableName,
14621478 }
14631479 sqlStmt .append (" FORMAT " ).append (format .name ());
14641480 requestSettings .serverSetting (ClickHouseHttpProto .QPARAM_QUERY_STMT , sqlStmt .toString ());
1481+ if (requestSettings .getQueryId () == null && queryIdGenerator != null ) {
1482+ requestSettings .setQueryId (queryIdGenerator .get ());
1483+ }
14651484 responseSupplier = () -> {
14661485 long startTime = System .nanoTime ();
14671486 // Selecting some node
@@ -1587,6 +1606,9 @@ public CompletableFuture<QueryResponse> query(String sqlQuery, Map<String, Objec
15871606 if (queryParams != null ) {
15881607 requestSettings .setOption (HttpAPIClientHelper .KEY_STATEMENT_PARAMS , queryParams );
15891608 }
1609+ if (requestSettings .getQueryId () == null && queryIdGenerator != null ) {
1610+ requestSettings .setQueryId (queryIdGenerator .get ());
1611+ }
15901612 responseSupplier = () -> {
15911613 long startTime = System .nanoTime ();
15921614 // Selecting some node
0 commit comments