Skip to content

Commit 4eb0e06

Browse files
Lexert19Lexert19
authored andcommitted
Support Time-Zone header and add examples for REST API
1 parent a678291 commit 4eb0e06

File tree

9 files changed

+219
-83
lines changed

9 files changed

+219
-83
lines changed

example/rest-java-example/src/main/java/org/apache/iotdb/HttpExample.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public static void main(String[] args) {
5353
httpExample.ping();
5454
httpExample.insertTablet();
5555
httpExample.query();
56+
httpExample.queryWithTimeZone();
5657
}
5758

5859
public void ping() {
@@ -138,4 +139,29 @@ public void query() {
138139
}
139140
}
140141
}
142+
143+
public void queryWithTimeZone() {
144+
CloseableHttpClient httpClient = SSLClient.getInstance().getHttpClient();
145+
CloseableHttpResponse response = null;
146+
try {
147+
HttpPost httpPost = getHttpPost("http://127.0.0.1:18080/rest/v1/query");
148+
String sql = "{\"sql\":\"select * from root.sg25 where time <= 2026-03-28T00:00:00\"}";
149+
httpPost.setEntity(new StringEntity(sql, Charset.defaultCharset()));
150+
response = httpClient.execute(httpPost);
151+
HttpEntity responseEntity = response.getEntity();
152+
String message = EntityUtils.toString(responseEntity, UTF8);
153+
ObjectMapper mapper = new ObjectMapper();
154+
LOGGER.info("message with time zone = {}", mapper.readValue(message, Map.class));
155+
} catch (IOException e) {
156+
LOGGER.error("The query with time zone rest api failed", e);
157+
} finally {
158+
try {
159+
if (response != null) {
160+
response.close();
161+
}
162+
} catch (IOException e) {
163+
LOGGER.error("Response close error", e);
164+
}
165+
}
166+
}
141167
}

example/rest-java-example/src/main/java/org/apache/iotdb/HttpsExample.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public static void main(String[] args) {
5252
httpsExample.pingHttps();
5353
httpsExample.insertTablet();
5454
httpsExample.query();
55+
httpsExample.queryWithTimeZone();
5556
}
5657

5758
public void pingHttps() {
@@ -138,4 +139,30 @@ public void query() {
138139
}
139140
}
140141
}
142+
143+
public void queryWithTimeZone() {
144+
CloseableHttpClient httpClient = SSLClient.getInstance().getHttpClient();
145+
CloseableHttpResponse response = null;
146+
try {
147+
HttpPost httpPost = getHttpPost("https://127.0.0.1:18080/rest/v1/query");
148+
httpPost.addHeader("Time-Zone", "+05:00");
149+
String sql = "{\"sql\":\"select * from root.sg25 where time <= 2026-03-28T00:00:00\"}";
150+
httpPost.setEntity(new StringEntity(sql, Charset.defaultCharset()));
151+
response = httpClient.execute(httpPost);
152+
HttpEntity responseEntity = response.getEntity();
153+
String message = EntityUtils.toString(responseEntity, UTF8);
154+
ObjectMapper mapper = new ObjectMapper();
155+
LOGGER.info("message with time zone = {}", mapper.readValue(message, Map.class));
156+
} catch (IOException e) {
157+
LOGGER.error("Https query with time zone rest api failed", e);
158+
} finally {
159+
try {
160+
if (response != null) {
161+
response.close();
162+
}
163+
} catch (IOException e) {
164+
LOGGER.error("Response close error", e);
165+
}
166+
}
167+
}
141168
}

example/rest-java-example/src/main/java/org/apache/iotdb/TableHttpExample.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
import org.apache.http.entity.StringEntity;
2828
import org.apache.http.impl.client.CloseableHttpClient;
2929
import org.apache.http.util.EntityUtils;
30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
3032

3133
import java.io.IOException;
3234
import java.nio.charset.Charset;
3335
import java.nio.charset.StandardCharsets;
3436
import java.util.Base64;
3537

3638
public class TableHttpExample {
39+
private static final Logger LOGGER = LoggerFactory.getLogger(TableHttpExample.class);
3740

3841
private static final String UTF8 = "utf-8";
3942

@@ -50,6 +53,7 @@ public static void main(String[] args) {
5053
httpExample.nonQuery();
5154
httpExample.insertTablet();
5255
httpExample.query();
56+
httpExample.queryWithTimeZone();
5357
}
5458

5559
public void ping() {
@@ -220,4 +224,30 @@ public void query() {
220224
}
221225
}
222226
}
227+
228+
public void queryWithTimeZone() {
229+
CloseableHttpClient httpClient = SSLClient.getInstance().getHttpClient();
230+
CloseableHttpResponse response = null;
231+
try {
232+
HttpPost httpPost = getHttpPost("http://127.0.0.1:18080/rest/table/v1/query");
233+
httpPost.addHeader("Time-Zone", "+05:00");
234+
String sql =
235+
"{\"database\":\"test\",\"sql\":\"select * from sg211 where time <= 2026-03-28T00:00:00\"}";
236+
httpPost.setEntity(new StringEntity(sql, Charset.defaultCharset()));
237+
response = httpClient.execute(httpPost);
238+
HttpEntity responseEntity = response.getEntity();
239+
String message = EntityUtils.toString(responseEntity, UTF8);
240+
LOGGER.info("message with time zone = {}", JsonParser.parseString(message).getAsJsonObject());
241+
} catch (IOException e) {
242+
LOGGER.error("The query with time zone rest api failed", e);
243+
} finally {
244+
try {
245+
if (response != null) {
246+
response.close();
247+
}
248+
} catch (IOException e) {
249+
LOGGER.error("Response close error", e);
250+
}
251+
}
252+
}
223253
}

example/rest-java-example/src/main/java/org/apache/iotdb/TableHttpsExample.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
import org.apache.http.entity.StringEntity;
2828
import org.apache.http.impl.client.CloseableHttpClient;
2929
import org.apache.http.util.EntityUtils;
30+
import org.slf4j.Logger;
31+
import org.slf4j.LoggerFactory;
3032

3133
import java.io.IOException;
3234
import java.nio.charset.Charset;
3335
import java.nio.charset.StandardCharsets;
3436
import java.util.Base64;
3537

3638
public class TableHttpsExample {
39+
private static final Logger LOGGER = LoggerFactory.getLogger(TableHttpsExample.class);
3740

3841
private static final String UTF8 = "utf-8";
3942

@@ -50,6 +53,7 @@ public static void main(String[] args) {
5053
httpExample.nonQuery();
5154
httpExample.insertTablet();
5255
httpExample.query();
56+
httpExample.queryWithTimeZone();
5357
}
5458

5559
public void ping() {
@@ -220,4 +224,30 @@ public void query() {
220224
}
221225
}
222226
}
227+
228+
public void queryWithTimeZone() {
229+
CloseableHttpClient httpClient = SSLClient.getInstance().getHttpClient();
230+
CloseableHttpResponse response = null;
231+
try {
232+
HttpPost httpPost = getHttpPost("https://127.0.0.1:18080/rest/table/v1/query");
233+
httpPost.addHeader("Time-Zone", "+05:00");
234+
String sql =
235+
"{\"database\":\"test\",\"sql\":\"select * from sg211 where time <= 2026-03-28T00:00:00\"}";
236+
httpPost.setEntity(new StringEntity(sql, Charset.defaultCharset()));
237+
response = httpClient.execute(httpPost);
238+
HttpEntity responseEntity = response.getEntity();
239+
String message = EntityUtils.toString(responseEntity, UTF8);
240+
LOGGER.info("message with time zone = {}", JsonParser.parseString(message).getAsJsonObject());
241+
} catch (IOException e) {
242+
LOGGER.error("The query with time zone rest api failed", e);
243+
} finally {
244+
try {
245+
if (response != null) {
246+
response.close();
247+
}
248+
} catch (IOException e) {
249+
LOGGER.error("Response close error", e);
250+
}
251+
}
252+
}
223253
}

external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/filter/AuthorizationFilter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void filter(ContainerRequestContext containerRequestContext) throws IOExc
9090
return;
9191
}
9292

93-
ZoneId zoneId = parseTimeZone(containerRequestContext);
93+
ZoneId zoneId = resolveTimeZone(containerRequestContext);
9494
if (zoneId == null) {
9595
return;
9696
}
@@ -155,13 +155,13 @@ private User checkLogin(
155155
}
156156

157157
/**
158-
* Parses the X-TimeZone header from the request.
158+
* Resolves the Time-Zone header from the request.
159159
*
160160
* @param requestContext the incoming HTTP request
161-
* @return the parsed ZoneId, or {@code null} if the header is invalid (the request is aborted)
161+
* @return the resolved ZoneId, or {@code null} if the header is invalid (the request is aborted)
162162
*/
163-
private ZoneId parseTimeZone(ContainerRequestContext requestContext) {
164-
String timeZoneHeader = requestContext.getHeaderString("X-TimeZone");
163+
private ZoneId resolveTimeZone(ContainerRequestContext requestContext) {
164+
String timeZoneHeader = requestContext.getHeaderString("Time-Zone");
165165
if (timeZoneHeader == null || timeZoneHeader.isEmpty()) {
166166
return ZoneId.systemDefault();
167167
}

external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/impl/RestApiServiceImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import javax.ws.rs.core.Response;
5252
import javax.ws.rs.core.SecurityContext;
5353

54-
import java.time.ZoneId;
5554
import java.util.List;
5655
import java.util.Optional;
5756

@@ -287,7 +286,8 @@ private Statement createStatement(
287286
}
288287

289288
clientSession.setSqlDialect(IClientSession.SqlDialect.TABLE);
290-
return relationSqlParser.createStatement(sql.getSql(), ZoneId.systemDefault(), clientSession);
289+
return relationSqlParser.createStatement(
290+
sql.getSql(), clientSession.getZoneId(), clientSession);
291291
}
292292

293293
private Response validateStatement(Statement statement, boolean userQuery) {

external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/impl/GrafanaApiServiceImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ public Response variables(SQL sql, SecurityContext securityContext) {
9191
try {
9292
RequestValidationHandler.validateSQL(sql);
9393

94-
Statement statement =
95-
StatementGenerator.createStatement(sql.getSql(), ZoneId.systemDefault());
94+
ZoneId zoneId = SESSION_MANAGER.getCurrSession().getZoneId();
95+
Statement statement = StatementGenerator.createStatement(sql.getSql(), zoneId);
9696
if (!(statement instanceof ShowStatement) && !(statement instanceof QueryStatement)) {
9797
return Response.ok()
9898
.entity(
@@ -168,7 +168,8 @@ public Response expression(ExpressionRequest expressionRequest, SecurityContext
168168
sql += " " + expressionRequest.getControl();
169169
}
170170

171-
Statement statement = StatementGenerator.createStatement(sql, ZoneId.systemDefault());
171+
ZoneId zoneId = SESSION_MANAGER.getCurrSession().getZoneId();
172+
Statement statement = StatementGenerator.createStatement(sql, zoneId);
172173

173174
Response response = authorizationHandler.checkAuthority(securityContext, statement);
174175
if (response != null) {

external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/impl/RestApiServiceImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ public Response executeNonQueryStatement(SQL sql, SecurityContext securityContex
8787
Statement statement = null;
8888
try {
8989
RequestValidationHandler.validateSQL(sql);
90-
statement = StatementGenerator.createStatement(sql.getSql(), ZoneId.systemDefault());
90+
ZoneId zoneId = SESSION_MANAGER.getCurrSession().getZoneId();
91+
statement = StatementGenerator.createStatement(sql.getSql(), zoneId);
9192
if (statement == null) {
9293
return Response.ok()
9394
.entity(
@@ -177,7 +178,8 @@ public Response executeQueryStatement(SQL sql, SecurityContext securityContext)
177178
Statement statement = null;
178179
try {
179180
RequestValidationHandler.validateSQL(sql);
180-
statement = StatementGenerator.createStatement(sql.getSql(), ZoneId.systemDefault());
181+
ZoneId zoneId = SESSION_MANAGER.getCurrSession().getZoneId();
182+
statement = StatementGenerator.createStatement(sql.getSql(), zoneId);
181183
if (statement == null) {
182184
return Response.ok()
183185
.entity(

0 commit comments

Comments
 (0)