This is an automated email from the ASF dual-hosted git repository.

geniuspig pushed a commit to branch http
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit b0f9b1ce3ae699f5461110e17ea6c2d7173f6891
Author: zhutianci <[email protected]>
AuthorDate: Thu Feb 6 22:35:11 2020 +0800

    update rest
---
 server/pom.xml                                     |  15 +++
 .../iotdb/db/rest/controller/RestController.java   | 121 +++---------------
 .../apache/iotdb/db/rest/service/RestService.java  |  87 ++++++++++++-
 .../java/org/apache/iotdb/db/rest/RestTest.java    | 139 +++++++++++++++++++++
 4 files changed, 255 insertions(+), 107 deletions(-)

diff --git a/server/pom.xml b/server/pom.xml
index 180c31b..c10fef2 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -126,6 +126,21 @@
             <artifactId>jersey-container-servlet</artifactId>
             <version>2.30</version>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.inject</groupId>
+            <artifactId>jersey-hk2</artifactId>
+            <version>2.30</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>2.30</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-jackson</artifactId>
+            <version>2.30</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git 
a/server/src/main/java/org/apache/iotdb/db/rest/controller/RestController.java 
b/server/src/main/java/org/apache/iotdb/db/rest/controller/RestController.java
index c0ed5f8..80b7577 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/rest/controller/RestController.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/rest/controller/RestController.java
@@ -18,34 +18,22 @@
  */
 package org.apache.iotdb.db.rest.controller;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.sql.SQLException;
-import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.auth.authorizer.IAuthorizer;
 import org.apache.iotdb.db.auth.authorizer.LocalFileAuthorizer;
 import org.apache.iotdb.db.conf.IoTDBConstant;
-import org.apache.iotdb.db.exception.StorageEngineException;
-import org.apache.iotdb.db.exception.metadata.MetadataException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
-import org.apache.iotdb.db.exception.storageGroup.StorageGroupException;
-import org.apache.iotdb.db.rest.model.TimeValues;
 import org.apache.iotdb.db.rest.service.RestService;
-import 
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
 import org.apache.iotdb.tsfile.utils.Pair;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,14 +50,16 @@ public class RestController {
 
   /**
    * http request to login IoTDB
-   * @param username username for login IoTDB
-   * @param password password for login IoTDB
    */
 
-  @Path("/login/{username}&&{password}")
+  @Path("/login")
   @POST
-  public void login(@PathParam("username") String username, 
@PathParam("password") String password)
+  @Consumes(MediaType.TEXT_PLAIN)
+  public void login(@Context HttpServletRequest request)
       throws AuthException {
+    JSONObject jsonObject = restService.getRequestBodyJson(request);
+    String username = (String)jsonObject.get("username");
+    String password = (String)jsonObject.get("password");
     logger.info("{}: receive http request from username {}", 
IoTDBConstant.GLOBAL_DB_NAME,
         username);
     IAuthorizer authorizer = LocalFileAuthorizer.getInstance();
@@ -85,18 +75,16 @@ public class RestController {
   /**
    *
    * @param request this request will be in json format.
-   * @param response this response will be in json format.
    * @return json in String
    */
   @Path("/query")
-  @GET
-  @Produces(MediaType.APPLICATION_JSON)
-  @Consumes(MediaType.APPLICATION_JSON)
-  public String query(HttpServletRequest request, HttpServletResponse 
response) {
+  @POST
+  @Produces(MediaType.TEXT_PLAIN)
+  @Consumes(MediaType.TEXT_PLAIN)
+  public String query(@Context HttpServletRequest request) {
     String targetStr = "target";
-    response.setStatus(200);
     try {
-      JSONObject jsonObject = getRequestBodyJson(request);
+      JSONObject jsonObject = restService.getRequestBodyJson(request);
       assert jsonObject != null;
       JSONObject range = (JSONObject) jsonObject.get("range");
       Pair<String, String> timeRange = new Pair<>((String) range.get("from"), 
(String) range.get("to"));
@@ -108,13 +96,13 @@ public class RestController {
           return "[]";
         }
         String target = (String) object.get(targetStr);
-        String type = getJsonType(jsonObject);
+        String type = restService.getJsonType(jsonObject);
         JSONObject obj = new JSONObject();
         obj.put("target", target);
         if (type.equals("table")) {
-          setJsonTable(obj, target, timeRange);
+          restService.setJsonTable(obj, target, timeRange);
         } else if (type.equals("timeserie")) {
-          setJsonTimeseries(obj, target, timeRange);
+          restService.setJsonTimeseries(obj, target, timeRange);
         }
         result.add(i, obj);
       }
@@ -125,83 +113,4 @@ public class RestController {
     }
     return null;
   }
-
-  /**
-   * get request body JSON.
-   *
-   * @param request http request
-   * @return request JSON
-   * @throws JSONException JSONException
-   */
-  private JSONObject getRequestBodyJson(HttpServletRequest request) throws 
JSONException {
-    try {
-      BufferedReader br = request.getReader();
-      StringBuilder sb = new StringBuilder();
-      String line;
-      while ((line = br.readLine()) != null) {
-        sb.append(line);
-      }
-      return JSON.parseObject(sb.toString());
-    } catch (IOException e) {
-      logger.error("getRequestBodyJson failed", e);
-    }
-    return null;
-  }
-
-  /**
-   * get JSON type of input JSON object.
-   *
-   * @param jsonObject JSON Object
-   * @return type (string)
-   * @throws JSONException JSONException
-   */
-  private String getJsonType(JSONObject jsonObject) throws JSONException {
-    JSONArray array = (JSONArray) jsonObject.get("targets"); // []
-    JSONObject object = (JSONObject) array.get(0); // {}
-    return (String) object.get("type");
-  }
-
-  private void setJsonTable(JSONObject obj, String target,
-      Pair<String, String> timeRange)
-      throws JSONException, StorageEngineException, 
QueryFilterOptimizationException,
-      MetadataException, IOException, StorageGroupException, SQLException, 
QueryProcessException, AuthException {
-    List<TimeValues> timeValues = restService.querySeries(target, timeRange);
-    JSONArray columns = new JSONArray();
-    JSONObject column = new JSONObject();
-    column.put("text", "Time");
-    column.put("type", "time");
-    columns.add(column);
-    column = new JSONObject();
-    column.put("text", "Number");
-    column.put("type", "number");
-    columns.add(column);
-    obj.put("columns", columns);
-    JSONArray values = new JSONArray();
-    for (TimeValues tv : timeValues) {
-      JSONArray value = new JSONArray();
-      value.add(tv.getTime());
-      value.add(tv.getValue());
-      values.add(value);
-    }
-    obj.put("values", values);
-  }
-
-  private void setJsonTimeseries(JSONObject obj, String target,
-      Pair<String, String> timeRange)
-      throws JSONException, StorageEngineException, 
QueryFilterOptimizationException,
-      MetadataException, IOException, StorageGroupException, SQLException, 
QueryProcessException, AuthException {
-    List<TimeValues> timeValues = restService.querySeries(target, timeRange);
-    logger.info("query size: {}", timeValues.size());
-    JSONArray dataPoints = new JSONArray();
-    for (TimeValues tv : timeValues) {
-      long time = tv.getTime();
-      String value = tv.getValue();
-      JSONArray jsonArray = new JSONArray();
-      jsonArray.add(value);
-      jsonArray.add(time);
-      dataPoints.add(jsonArray);
-    }
-    obj.put("datapoints", dataPoints);
-  }
-
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/rest/service/RestService.java 
b/server/src/main/java/org/apache/iotdb/db/rest/service/RestService.java
index 3843555..7cec82c 100644
--- a/server/src/main/java/org/apache/iotdb/db/rest/service/RestService.java
+++ b/server/src/main/java/org/apache/iotdb/db/rest/service/RestService.java
@@ -18,10 +18,17 @@
  */
 package org.apache.iotdb.db.rest.service;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
+import javax.servlet.http.HttpServletRequest;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -62,7 +69,7 @@ public class RestService {
   private String username;
 
 
-  public List<TimeValues> querySeries(String s, Pair<String, String> timeRange)
+  private List<TimeValues> querySeries(String s, Pair<String, String> 
timeRange)
       throws QueryProcessException, StorageGroupException, AuthException, 
MetadataException, QueryFilterOptimizationException, SQLException, 
StorageEngineException, IOException {
     String from = timeRange.left;
     String to = timeRange.right;
@@ -174,4 +181,82 @@ public class RestService {
   public void setUsername(String username) {
     this.username = username;
   }
+
+  /**
+   * get request body JSON.
+   *
+   * @param request http request
+   * @return request JSON
+   * @throws JSONException JSONException
+   */
+  public JSONObject getRequestBodyJson(HttpServletRequest request) throws 
JSONException {
+    try {
+      BufferedReader br = new BufferedReader(new 
InputStreamReader(request.getInputStream()));
+      StringBuilder sb = new StringBuilder();
+      String line;
+      while ((line = br.readLine()) != null) {
+        sb.append(line);
+      }
+      return JSON.parseObject(sb.toString());
+    } catch (IOException e) {
+      logger.error("getRequestBodyJson failed", e);
+    }
+    return null;
+  }
+
+  /**
+   * get JSON type of input JSON object.
+   *
+   * @param jsonObject JSON Object
+   * @return type (string)
+   * @throws JSONException JSONException
+   */
+  public String getJsonType(JSONObject jsonObject) throws JSONException {
+    JSONArray array = (JSONArray) jsonObject.get("targets"); // []
+    JSONObject object = (JSONObject) array.get(0); // {}
+    return (String) object.get("type");
+  }
+
+  public void setJsonTable(JSONObject obj, String target,
+      Pair<String, String> timeRange)
+      throws JSONException, StorageEngineException, 
QueryFilterOptimizationException,
+      MetadataException, IOException, StorageGroupException, SQLException, 
QueryProcessException, AuthException {
+    List<TimeValues> timeValues = querySeries(target, timeRange);
+    JSONArray columns = new JSONArray();
+    JSONObject column = new JSONObject();
+    column.put("text", "Time");
+    column.put("type", "time");
+    columns.add(column);
+    column = new JSONObject();
+    column.put("text", "Number");
+    column.put("type", "number");
+    columns.add(column);
+    obj.put("columns", columns);
+    JSONArray values = new JSONArray();
+    for (TimeValues tv : timeValues) {
+      JSONArray value = new JSONArray();
+      value.add(tv.getTime());
+      value.add(tv.getValue());
+      values.add(value);
+    }
+    obj.put("values", values);
+  }
+
+  public void setJsonTimeseries(JSONObject obj, String target,
+      Pair<String, String> timeRange)
+      throws JSONException, StorageEngineException, 
QueryFilterOptimizationException,
+      MetadataException, IOException, StorageGroupException, SQLException, 
QueryProcessException, AuthException {
+    List<TimeValues> timeValues = querySeries(target, timeRange);
+    logger.info("query size: {}", timeValues.size());
+    JSONArray dataPoints = new JSONArray();
+    for (TimeValues tv : timeValues) {
+      long time = tv.getTime();
+      String value = tv.getValue();
+      JSONArray jsonArray = new JSONArray();
+      jsonArray.add(value);
+      jsonArray.add(time);
+      dataPoints.add(jsonArray);
+    }
+    obj.put("datapoints", dataPoints);
+  }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/rest/RestTest.java 
b/server/src/test/java/org/apache/iotdb/db/rest/RestTest.java
new file mode 100644
index 0000000..4976364
--- /dev/null
+++ b/server/src/test/java/org/apache/iotdb/db/rest/RestTest.java
@@ -0,0 +1,139 @@
+package org.apache.iotdb.db.rest;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.Locale;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.Config;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RestTest {
+  private static final String REST_URI
+      = "http://localhost:8181/rest/query";;
+
+  private static String[] creationSqls = new String[]{
+      "SET STORAGE GROUP TO root.vehicle.d0",
+      "SET STORAGE GROUP TO root.vehicle.d1",
+
+      "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
+      "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=INT64, ENCODING=RLE",
+      "CREATE TIMESERIES root.vehicle.d0.s2 WITH DATATYPE=FLOAT, ENCODING=RLE",
+      "CREATE TIMESERIES root.vehicle.d0.s3 WITH DATATYPE=TEXT, 
ENCODING=PLAIN",
+      "CREATE TIMESERIES root.vehicle.d0.s4 WITH DATATYPE=BOOLEAN, 
ENCODING=PLAIN"
+  };
+  private static String[] dataSet2 = new String[]{
+      "SET STORAGE GROUP TO root.ln.wf01.wt01",
+      "CREATE TIMESERIES root.ln.wf01.wt01.status WITH DATATYPE=BOOLEAN, 
ENCODING=PLAIN",
+      "CREATE TIMESERIES root.ln.wf01.wt01.temperature WITH DATATYPE=FLOAT, 
ENCODING=PLAIN",
+      "CREATE TIMESERIES root.ln.wf01.wt01.hardware WITH DATATYPE=INT32, 
ENCODING=PLAIN",
+      "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) "
+          + "values(1, 1.1, false, 11)",
+      "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) "
+          + "values(2, 2.2, true, 22)",
+      "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) "
+          + "values(3, 3.3, false, 33 )",
+      "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) "
+          + "values(4, 4.4, false, 44)",
+      "INSERT INTO root.ln.wf01.wt01(timestamp,temperature,status, hardware) "
+          + "values(5, 5.5, false, 55)"
+  };
+
+  @Before
+  public void setUp() throws Exception {
+    EnvironmentUtils.closeStatMonitor();
+    EnvironmentUtils.envSetUp();
+    IoTDBDescriptor.getInstance().getConfig().setPartitionInterval(1000);
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    prepareData();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    IoTDBDescriptor.getInstance().getConfig().setPartitionInterval(86400);
+    EnvironmentUtils.cleanEnv();
+  }
+
+  private void prepareData() {
+    try (Connection connection = DriverManager
+        .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
+            "root");
+        Statement statement = connection.createStatement()) {
+
+      for (String sql : creationSqls) {
+        statement.execute(sql);
+      }
+
+      for (String sql : dataSet2) {
+        statement.execute(sql);
+      }
+
+      // prepare BufferWrite file
+      String insertTemplate = "INSERT INTO 
root.vehicle.d0(timestamp,s0,s1,s2,s3,s4)"
+          + " VALUES(%d,%d,%d,%f,%s,%s)";
+      for (int i = 5000; i < 7000; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "true"));
+      }
+      statement.execute("flush");
+      for (int i = 7500; i < 8500; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "false"));
+      }
+      statement.execute("flush");
+      // prepare Unseq-File
+      for (int i = 500; i < 1500; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "true"));
+      }
+      statement.execute("flush");
+      for (int i = 3000; i < 6500; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "false"));
+      }
+      statement.execute("merge");
+
+      // prepare BufferWrite cache
+      for (int i = 9000; i < 10000; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "true"));
+      }
+      // prepare Overflow cache
+      for (int i = 2000; i < 2500; i++) {
+        statement.execute(String
+            .format(Locale.ENGLISH, insertTemplate, i, i, i, (double) i, "\'" 
+ i + "\'", "false"));
+      }
+
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
+  @Test
+  public void testQuery() {
+    Client client = ClientBuilder.newClient();
+    String json = "{\n"
+        + "  \"range\": {\n"
+        + "    \"from\": \"1\",\n"
+        + "    \"to\": \"300\",\n"
+        + "  },\n"
+        + "  \n"
+        + "  \"targets\": [\n"
+        + "     { \"target\": \"root.ln.wf01.wt01\", \"type\": \"timeserie\" 
},\n"
+        + "  ]\n"
+        + "}";
+    Response response = client.target(REST_URI)
+        .request(MediaType.TEXT_PLAIN)
+        .post(Entity.entity(json, MediaType.TEXT_PLAIN));
+    String result = response.readEntity(String.class);
+    System.out.println(result);
+  }
+}

Reply via email to