Skip to content

Commit fa23d9b

Browse files
zhiheng123ZhangJian He
andauthored
feat: add query method of jdk http client (#11)
Signed-off-by: zhiheng123 <[email protected]> Co-authored-by: ZhangJian He <[email protected]>
1 parent 17a657e commit fa23d9b

File tree

13 files changed

+209
-6
lines changed

13 files changed

+209
-6
lines changed

opengemini-client-api/src/main/java/io/opengemini/client/api/Address.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package io.opengemini.client.api;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
46
import lombok.Setter;
57

68
/**
79
* Address configuration for providing service.
810
*/
911
@Getter
1012
@Setter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
1115
public class Address {
1216
/**
1317
* Host service ip or domain.

opengemini-client-api/src/main/java/io/opengemini/client/api/BaseConfiguration.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.opengemini.client.api;
22

3-
43
import lombok.AllArgsConstructor;
54
import lombok.Getter;
65
import lombok.NoArgsConstructor;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,29 @@
11
package io.opengemini.client.api;
22

3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@AllArgsConstructor
8+
@Getter
9+
@Setter
310
public class Query {
11+
/*
12+
* the query command
13+
*/
14+
private String command;
15+
16+
/*
17+
* the database name of the query command using
18+
*/
19+
private String database;
20+
21+
/*
22+
* the rp name of the query command using
23+
*/
24+
private String retentionPolicy;
25+
26+
public Query(String command){
27+
this.command = command;
28+
};
429
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
11
package io.opengemini.client.api;
22

3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import lombok.ToString;
6+
7+
import java.util.List;
8+
9+
@Getter
10+
@Setter
11+
@ToString
312
public class QueryResult {
13+
private List<SeriesResult> results;
14+
15+
private String error;
416
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.opengemini.client.api;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import lombok.ToString;
6+
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
@Getter
11+
@Setter
12+
@ToString
13+
public class Series {
14+
private String name;
15+
16+
private Map<String, String> tags;
17+
18+
private List<String> columns;
19+
20+
private List<List<Object>> values;
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.opengemini.client.api;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
import lombok.ToString;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Setter
12+
@ToString
13+
@JsonIgnoreProperties({"statement_id"})
14+
public class SeriesResult {
15+
private List<Series> series;
16+
17+
private String error;
18+
}

opengemini-client-api/src/main/java/io/opengemini/client/api/TlsConfig.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.opengemini.client.api;
22

3-
43
import lombok.AllArgsConstructor;
54
import lombok.Getter;
65
import lombok.NoArgsConstructor;
@@ -12,7 +11,6 @@
1211
@NoArgsConstructor
1312
@AllArgsConstructor
1413
public class TlsConfig {
15-
1614
public String keyStorePath;
1715

1816
@ToString.Exclude

opengemini-client-jdk/src/main/java/io/opengemini/client/jdk/OpenGeminiJdkClient.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
package io.opengemini.client.jdk;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import io.opengemini.client.api.Address;
5+
import io.opengemini.client.api.OpenGeminiException;
6+
import io.opengemini.client.api.Query;
7+
import io.opengemini.client.api.QueryResult;
48
import io.opengemini.client.api.SslContextUtil;
59
import io.opengemini.client.api.TlsConfig;
10+
import io.opengemini.client.jdk.common.OpenGeminiCommon;
611

12+
import java.net.URI;
13+
import java.net.URISyntaxException;
14+
import java.net.URLEncoder;
715
import java.net.http.HttpClient;
16+
import java.net.http.HttpRequest;
17+
import java.net.http.HttpResponse;
18+
import java.nio.charset.StandardCharsets;
819
import java.util.ArrayList;
920
import java.util.List;
21+
import java.util.concurrent.CompletableFuture;
22+
import java.util.concurrent.atomic.AtomicInteger;
1023

1124
public class OpenGeminiJdkClient {
1225

@@ -16,6 +29,8 @@ public class OpenGeminiJdkClient {
1629

1730
private final HttpClient client;
1831

32+
private final AtomicInteger prevIndex = new AtomicInteger(0);
33+
1934
public OpenGeminiJdkClient(Configuration conf) {
2035
this.conf = conf;
2136
HttpClient.Builder builder = HttpClient.newBuilder()
@@ -38,4 +53,49 @@ public OpenGeminiJdkClient(Configuration conf) {
3853
}
3954
this.client = builder.build();
4055
}
56+
57+
public String encodeUtf8(String str) {
58+
return URLEncoder.encode(str, StandardCharsets.UTF_8);
59+
}
60+
61+
private URI buildUri(String url, String command) throws URISyntaxException {
62+
// avoid multi-thread conflict, realize simple round-robin
63+
int idx = prevIndex.addAndGet(1);
64+
idx = idx % this.conf.getAddresses().size();
65+
66+
return buildUri(idx, url, command);
67+
}
68+
69+
private URI buildUri(int index, String url, String command) throws URISyntaxException {
70+
StringBuilder sb = new StringBuilder(this.serverUrls.get(index))
71+
.append(url)
72+
.append("?q=")
73+
.append(encodeUtf8(command));
74+
75+
return new URI(sb.toString());
76+
}
77+
78+
public CompletableFuture<QueryResult> query(Query query) throws URISyntaxException {
79+
HttpRequest request = HttpRequest.newBuilder()
80+
.uri(buildUri("/query", query.getCommand()))
81+
.GET()
82+
.build();
83+
84+
return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenCompose(response ->{
85+
CompletableFuture<QueryResult> failedFuture = new CompletableFuture<>();
86+
if (response.statusCode() >= 200 && response.statusCode() < 300) {
87+
try {
88+
QueryResult body = OpenGeminiCommon.converJson2Bean(response.body(), QueryResult.class);
89+
failedFuture.complete(body);
90+
} catch (JsonProcessingException e) {
91+
failedFuture.completeExceptionally(e);
92+
}
93+
return failedFuture;
94+
}
95+
96+
failedFuture.completeExceptionally(new OpenGeminiException("http error: " + response.body(),
97+
response.statusCode()));
98+
return failedFuture;
99+
});
100+
}
41101
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.opengemini.client.jdk.common;
2+
3+
import com.fasterxml.jackson.core.JsonProcessingException;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
6+
public class OpenGeminiCommon {
7+
private static final ObjectMapper objectMapper = new ObjectMapper();
8+
public static <T> T converJson2Bean(String json, Class<T> cls) throws JsonProcessingException {
9+
return objectMapper.readValue(json, cls);
10+
}
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package io.opengemini.client.jdk.common;

0 commit comments

Comments
 (0)