You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ge...@apache.org on 2020/02/06 15:37:18 UTC

[incubator-iotdb] branch http created (now e499408)

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

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


      at e499408  fix test.

This branch includes the following new commits:

     new 7f00b75  refactor metrics and create http api
     new 262a316  add rest api.
     new b0f9b1c  update rest
     new e432503  Merge branch 'master' into http
     new e499408  fix test.

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 01/05: refactor metrics and create http api

Posted by ge...@apache.org.
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 7f00b75551c66d5d6bc76258d663e05dc8cf19d1
Author: zhutianci <zh...@gmail.com>
AuthorDate: Mon Feb 3 11:14:19 2020 +0800

    refactor metrics and create http api
---
 .../org/apache/iotdb/db/http/QueryServlet.java     | 44 ++++++++++
 .../java/org/apache/iotdb/db/http/TimeValues.java  | 47 +++++++++++
 .../apache/iotdb/db/http/service/HttpService.java  |  5 ++
 .../apache/iotdb/db/metrics/server/JettyUtil.java  | 20 ++---
 .../iotdb/db/metrics/server/MetricsSystem.java     | 22 ++---
 .../iotdb/db/metrics/server/QueryServlet.java      |  6 +-
 .../iotdb/db/metrics/server/ServerArgument.java    | 51 +++++-------
 .../iotdb/db/metrics/server/SqlArgument.java       |  6 +-
 .../apache/iotdb/db/metrics/sink/ConsoleSink.java  |  6 +-
 .../iotdb/db/metrics/sink/MetricsServletSink.java  |  4 +-
 .../org/apache/iotdb/db/metrics/sink/Sink.java     |  8 +-
 .../apache/iotdb/db/metrics/source/JvmSource.java  |  6 +-
 .../iotdb/db/metrics/source/MetricsSource.java     | 96 ++++++++--------------
 .../org/apache/iotdb/db/metrics/source/Source.java |  4 +-
 .../apache/iotdb/db/metrics/ui/MetricsPage.java    | 86 +++++++++----------
 .../apache/iotdb/db/metrics/ui/MetricsWebUI.java   | 16 +---
 .../apache/iotdb/db/service/MetricsService.java    |  2 +-
 17 files changed, 229 insertions(+), 200 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java b/server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java
new file mode 100644
index 0000000..d042663
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.http;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class QueryServlet extends HttpServlet {
+
+  @Override
+  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException {
+    PrintWriter out = resp.getWriter();
+    resp.setContentType("application/json");
+    resp.setCharacterEncoding("UTF-8");
+
+  }
+
+  @Override
+  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+      throws ServletException, IOException {
+    super.doPost(req, resp);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/http/TimeValues.java b/server/src/main/java/org/apache/iotdb/db/http/TimeValues.java
new file mode 100644
index 0000000..8c7059d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/http/TimeValues.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.http;
+
+public class TimeValues {
+
+  private long time;
+  private String value;
+
+  @Override
+  public String toString() {
+    return "TimeValues{" + "time=" + time + ", values=" + value + '}';
+  }
+
+  public long getTime() {
+    return time;
+  }
+
+  public void setTime(long time) {
+    this.time = time;
+  }
+
+  public String getValue() {
+    return value;
+  }
+
+  public void setValue(String value) {
+    this.value = value;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java b/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java
new file mode 100644
index 0000000..87ba8ee
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java
@@ -0,0 +1,5 @@
+package org.apache.iotdb.db.http.service;
+
+public class HttpService {
+
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
index f4d82f9..ab2cff1 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -14,11 +14,13 @@
  */
 package org.apache.iotdb.db.metrics.server;
 
+import com.codahale.metrics.MetricRegistry;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.URL;
 import java.util.List;
-import javax.servlet.ServletException;
+import java.util.Objects;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -28,8 +30,6 @@ import org.eclipse.jetty.server.handler.ErrorHandler;
 import org.eclipse.jetty.servlet.DefaultServlet;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.servlet.ServletHolder;
-import com.codahale.metrics.MetricRegistry;
-import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class JettyUtil {
 
@@ -41,7 +41,7 @@ public class JettyUtil {
       MetricRegistry mr = metricRegistry;
 
       @Override
-      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
         resp.setContentType("text/html;charset=utf-8");
         resp.setStatus(HttpServletResponse.SC_OK);
         PrintWriter out = resp.getWriter();
@@ -52,19 +52,19 @@ public class JettyUtil {
 
       @Override
       public void doPost(HttpServletRequest req, HttpServletResponse resp)
-          throws ServletException, IOException {
+          throws IOException {
         doGet(req, resp);
       }
     };
     
-    return createServletHandler("/json", httpServlet);
+    return createServletHandler("/json", httpServlet, "/");
   }
 
-  public static ServletContextHandler createServletHandler(String path, HttpServlet servlet) {
+  public static ServletContextHandler createServletHandler(String path, HttpServlet servlet, String pathSpec) {
     ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
     ServletHolder holder = new ServletHolder(servlet);
     contextHandler.setContextPath(path);
-    contextHandler.addServlet(holder, "/");
+    contextHandler.addServlet(holder, pathSpec);
     return contextHandler;
   }
 
@@ -73,7 +73,7 @@ public class JettyUtil {
     URL res = JettyUtil.class.getClassLoader().getResource("iotdb/ui/static");
     HttpServlet servlet = new DefaultServlet();
     ServletHolder holder = new ServletHolder(servlet);
-    holder.setInitParameter("resourceBase", res.toString());
+    holder.setInitParameter("resourceBase", Objects.requireNonNull(res).toString());
     contextHandler.setContextPath("/static");
     contextHandler.addServlet(holder, "/");
     return contextHandler;
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
index 7e6e04d..7872b14 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -36,14 +36,6 @@ public class MetricsSystem {
     this.serverArgument = serverArgument;
   }
 
-  public ServerArgument getServerArgument() {
-    return serverArgument;
-  }
-
-  public void setServerArgument(ServerArgument serverArgument) {
-    this.serverArgument = serverArgument;
-  }
-
   public MetricRegistry getMetricRegistry() {
     return metricRegistry;
   }
@@ -55,23 +47,19 @@ public class MetricsSystem {
   public void start() {
     registerSource();
     registerSinks();
-    sinks.forEach(sink -> sink.start());
+    sinks.forEach(Sink::start);
   }
 
   public void stop() {
-    sinks.forEach(sink -> sink.stop());
-  }
-
-  public void report() {
-    sinks.forEach(sink -> sink.report());
+    sinks.forEach(Sink::stop);
   }
 
-  public void registerSource() {
+  private void registerSource() {
     MetricsSource source = new MetricsSource(serverArgument, metricRegistry);
     source.registerInfo();
     sources.add(source);
   }
 
-  public void registerSinks() {}
+  private void registerSinks() {}
 
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/QueryServlet.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/QueryServlet.java
index 7a3812c..0788364 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/QueryServlet.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/QueryServlet.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -28,16 +28,16 @@ public class QueryServlet extends HttpServlet {
 
   private static final long serialVersionUID = 1L;
 
-  private List<SqlArgument> list = TSServiceImpl.sqlArgumentsList;
   private MetricsPage page;
 
   public QueryServlet(MetricsPage page) {
     this.page = page;
+    List<SqlArgument> list = TSServiceImpl.sqlArgumentsList;
     this.page.setList(list);
   }
 
   @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     resp.setContentType("text/html;charset=utf-8");
     req.setCharacterEncoding("utf-8");
     resp.setStatus(HttpServletResponse.SC_OK);
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/ServerArgument.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/ServerArgument.java
index 30f8b02..a4c9389 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/ServerArgument.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/ServerArgument.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -23,6 +23,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.StringTokenizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,7 +67,7 @@ public class ServerArgument {
     } catch (UnknownHostException e) {
       logger.error("The host is unknow", e);
     }
-    return ia.getHostName();
+    return Objects.requireNonNull(ia).getHostName();
   }
 
   private String osName() {
@@ -75,8 +76,7 @@ public class ServerArgument {
 
   private int totalCores() {
     OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-    int freeCores = osmxb.getAvailableProcessors();
-    return freeCores;
+    return osmxb.getAvailableProcessors();
   }
 
   private long totalMemory() {
@@ -93,20 +93,17 @@ public class ServerArgument {
 
   private long totalPhysicalMemory() {
     OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-    long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / 1024 / 1024;
-    return totalMemorySize;
+    return osmxb.getTotalPhysicalMemorySize() / 1024 / 1024;
   }
 
   private long usedPhysicalMemory() {
     OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-    long usedMemorySize = (osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) / 1024 / 1024;
-    return usedMemorySize;
+    return (osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) / 1024 / 1024;
   }
 
   private long freePhysicalMemory() {
     OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
-    long freeMemorySize = osmxb.getFreePhysicalMemorySize() / 1024 / 1024;
-    return freeMemorySize;
+    return osmxb.getFreePhysicalMemorySize() / 1024 / 1024;
   }
 
   public int getPort() {
@@ -156,9 +153,9 @@ public class ServerArgument {
   public int getCpuRatio() {
     String osName = System.getProperty("os.name").toLowerCase();
     cpuRatio = 0;
-    if (osName.indexOf("windows") >= 0) {
+    if (osName.contains("windows")) {
       cpuRatio = getCpuRatioForWindows();
-    } else if (osName.indexOf("linux") >= 0) {
+    } else if (osName.contains("linux")) {
       cpuRatio = getCpuRateForLinux();
     } else {
       cpuRatio = 500;
@@ -175,16 +172,12 @@ public class ServerArgument {
       long[] c0 = readLinuxCpu();
       Thread.sleep(CPUTIME);
       long[] c1 = readLinuxCpu();
-      if (c0 != null && c1 != null) {
-        long idleCpuTime = c1[0] - c0[0];
-        long totalCpuTime = c1[1] - c0[1];
-        if (totalCpuTime == 0) {
-          return 100;
-        }
-        return (int)(100 * (1 - (double)idleCpuTime / totalCpuTime));
-      } else {
-        return 0;
+      long idleCpuTime = c1[0] - c0[0];
+      long totalCpuTime = c1[1] - c0[1];
+      if (totalCpuTime == 0) {
+        return 100;
       }
+      return (int)(100 * (1 - (double)idleCpuTime / totalCpuTime));
     } catch (Exception e) {
       logger.error("Get CPU Ratio failed", e);
       return 0;
@@ -243,7 +236,7 @@ public class ServerArgument {
         continue;
       }
       String cmd = line.substring(cmdidx, kmtidx).trim();
-      if (cmd.indexOf("wmic.exe") >= 0) {
+      if (cmd.contains("wmic.exe")) {
         continue;
       }
       String caption = line.substring(capidx, cmdidx).trim();
@@ -256,24 +249,24 @@ public class ServerArgument {
       if (caption.equals("System Idle Process") || caption.equals("System")) {
         if (s1.length() > 0) {
           if (!digitS1.get(0).equals("") && digitS1.get(0) != null) {
-            idletime += Long.valueOf(digitS1.get(0)).longValue();
+            idletime += Long.parseLong(digitS1.get(0));
           }
         }
         if (s2.length() > 0) {
           if (!digitS2.get(0).equals("") && digitS2.get(0) != null) {
-            idletime += Long.valueOf(digitS2.get(0)).longValue();
+            idletime += Long.parseLong(digitS2.get(0));
           }
         }
         continue;
       }
       if (s1.length() > 0) {
         if (!digitS1.get(0).equals("") && digitS1.get(0) != null) {
-          kneltime += Long.valueOf(digitS1.get(0)).longValue();
+          kneltime += Long.parseLong(digitS1.get(0));
         }
       }
       if (s2.length() > 0) {
         if (!digitS2.get(0).equals("") && digitS2.get(0) != null) {
-          kneltime += Long.valueOf(digitS2.get(0)).longValue();
+          kneltime += Long.parseLong(digitS2.get(0));
         }
       }
     }
@@ -288,15 +281,15 @@ public class ServerArgument {
    */
   private long[] readLinuxCpu() throws Exception {
     long[] retn = new long[2];
-    BufferedReader buffer = null;
+    BufferedReader buffer;
     long idleCpuTime = 0;
     long totalCpuTime = 0;
     buffer = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/stat")));
-    String line = null;
+    String line;
     while ((line = buffer.readLine()) != null) {
       if (line.startsWith("cpu")) {
         StringTokenizer tokenizer = new StringTokenizer(line);
-        List<String> temp = new ArrayList<String>();
+        List<String> temp = new ArrayList<>();
         while (tokenizer.hasMoreElements()) {
           temp.add(tokenizer.nextToken());
         }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/SqlArgument.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/SqlArgument.java
index 5a294e3..ea7a276 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/SqlArgument.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/SqlArgument.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -39,10 +39,6 @@ public class SqlArgument {
     return TSExecuteStatementResp;
   }
 
-  public void setTSExecuteStatementResp(TSExecuteStatementResp tSExecuteStatementResp) {
-    TSExecuteStatementResp = tSExecuteStatementResp;
-  }
-
   public long getStartTime() {
     return startTime;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/sink/ConsoleSink.java b/server/src/main/java/org/apache/iotdb/db/metrics/sink/ConsoleSink.java
index 7450a0a..1fa5f39 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/sink/ConsoleSink.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/sink/ConsoleSink.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -20,11 +20,9 @@ import com.codahale.metrics.MetricRegistry;
 
 public class ConsoleSink implements Sink {
 
-  public MetricRegistry registry;
-  public ConsoleReporter reporter;
+  private ConsoleReporter reporter;
 
   public ConsoleSink(MetricRegistry registry) {
-    this.registry = registry;
     this.reporter = ConsoleReporter.forRegistry(registry).convertDurationsTo(TimeUnit.MILLISECONDS)
         .convertRatesTo(TimeUnit.SECONDS).build();
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java b/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java
index a0528ac..c88e447 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 public class MetricsServletSink implements Sink {
 
-  public MetricRegistry registry;
+  private MetricRegistry registry;
 
   public MetricsServletSink(MetricRegistry registry) {
     this.registry = registry;
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/sink/Sink.java b/server/src/main/java/org/apache/iotdb/db/metrics/sink/Sink.java
index d610c31..374bde4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/sink/Sink.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/sink/Sink.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -16,10 +16,10 @@ package org.apache.iotdb.db.metrics.sink;
 
 public interface Sink {
 
-  public void start();
+  void start();
 
-  public void stop();
+  void stop();
 
-  public void report();
+  void report();
 
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/source/JvmSource.java b/server/src/main/java/org/apache/iotdb/db/metrics/source/JvmSource.java
index 0b13fe6..d34f816 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/source/JvmSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/source/JvmSource.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -22,8 +22,8 @@ import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
 
 public class JvmSource implements Source {
 
-  public String sourceName = "jvm";
-  public MetricRegistry metricRegistry;
+  private String sourceName = "jvm";
+  private MetricRegistry metricRegistry;
 
   public JvmSource(MetricRegistry metricRegistry) {
     this.metricRegistry = metricRegistry;
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/source/MetricsSource.java b/server/src/main/java/org/apache/iotdb/db/metrics/source/MetricsSource.java
index 7eb911e..73ee743 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/source/MetricsSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/source/MetricsSource.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -20,9 +20,9 @@ import com.codahale.metrics.MetricRegistry;
 
 public class MetricsSource implements Source {
 
-  public String sourceName = "iot-metrics";
-  public MetricRegistry metricRegistry;
-  public ServerArgument serverArgument;
+  private String sourceName = "iot-metrics";
+  private MetricRegistry metricRegistry;
+  private ServerArgument serverArgument;
 
   public MetricsSource(ServerArgument serverArgument, MetricRegistry metricRegistry) {
     this.serverArgument = serverArgument;
@@ -31,65 +31,35 @@ public class MetricsSource implements Source {
 
   public void registerInfo() {
 
-    metricRegistry.register(MetricRegistry.name(sourceName, "host"), new Gauge<String>() {
-      public String getValue() {
-        return serverArgument.getHost();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "port"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getPort();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "cores"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getCores();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "cpu_ratio"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getCpuRatio();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "total_memory"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getTotalMemory();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "max_memory"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getMaxMemory();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "free_memory"), new Gauge<Integer>() {
-      public Integer getValue() {
-        return (int) serverArgument.getFreeMemory();
-      }
-    });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "totalPhysical_memory"), new Gauge<Integer>() {
-          public Integer getValue() {
-            return (int) serverArgument.getTotalPhysicalMemory();
-          }
-        });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "freePhysical_memory"), new Gauge<Integer>() {
-          public Integer getValue() {
-            return (int) serverArgument.getFreePhysicalMemory();
-          }
-        });
-
-    metricRegistry.register(MetricRegistry.name(sourceName, "usedPhysical_memory"), new Gauge<Integer>() {
-          public Integer getValue() {
-            return (int) serverArgument.getUsedPhysicalMemory();
-          }
-        });
+    metricRegistry.register(MetricRegistry.name(sourceName, "host"),
+        (Gauge<String>) () -> serverArgument.getHost());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "port"),
+        (Gauge<Integer>) () -> (int) serverArgument.getPort());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "cores"),
+        (Gauge<Integer>) () -> (int) serverArgument.getCores());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "cpu_ratio"),
+        (Gauge<Integer>) () -> (int) serverArgument.getCpuRatio());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "total_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getTotalMemory());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "max_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getMaxMemory());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "free_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getFreeMemory());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "totalPhysical_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getTotalPhysicalMemory());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "freePhysical_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getFreePhysicalMemory());
+
+    metricRegistry.register(MetricRegistry.name(sourceName, "usedPhysical_memory"),
+        (Gauge<Integer>) () -> (int) serverArgument.getUsedPhysicalMemory());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/source/Source.java b/server/src/main/java/org/apache/iotdb/db/metrics/source/Source.java
index 536b3db..a1f2663 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/source/Source.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/source/Source.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -16,6 +16,6 @@ package org.apache.iotdb.db.metrics.source;
 
 public interface Source {
 
-  public String sourceName();
+  String sourceName();
 
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
index 6380150..33506c7 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsPage.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -22,6 +22,7 @@ import java.net.URL;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.metrics.server.SqlArgument;
 import org.apache.iotdb.service.rpc.thrift.TSExecuteStatementResp;
@@ -43,54 +44,59 @@ public class MetricsPage {
     this.list = list;
   }
 
-  public MetricsPage(MetricRegistry metricRegistry) {
+  MetricsPage(MetricRegistry metricRegistry) {
     this.mr = metricRegistry;
   }
 
   public String render() {
-    String html = "";
-    String tmpStr = "";
+    StringBuilder html = new StringBuilder();
+    String tmpStr;
     try {
       URL resource = MetricsPage.class.getClassLoader().getResource("iotdb/ui/static/index.html");
-      InputStream is = resource.openStream();
+      InputStream is = Objects.requireNonNull(resource).openStream();
       BufferedReader br = new BufferedReader(new InputStreamReader(is));
       while ((tmpStr = br.readLine()) != null) {
-        html += tmpStr;
+        html.append(tmpStr);
       }
       is.close();
     } catch (IOException e) {
       logger.error("Response page failed", e);
     }
-    html = html.replace("{version}", IoTDBConstant.VERSION);
+    html = new StringBuilder(html.toString().replace("{version}", IoTDBConstant.VERSION));
     
-    html = html.replace("{server}", mr.getGauges().get("iot-metrics.host").getValue() + ":"
-        + mr.getGauges().get("iot-metrics.port").getValue());
+    html = new StringBuilder(
+        html.toString().replace("{server}", mr.getGauges().get("iot-metrics.host").getValue() + ":"
+            + mr.getGauges().get("iot-metrics.port").getValue()));
     
     int cpuRatio = (int)mr.getGauges().get("iot-metrics.cpu_ratio").getValue();
     String os = System.getProperty("os.name");
     if(cpuRatio != 500) {
-      html = html.replace("{cpu}", mr.getGauges().get("iot-metrics.cores").getValue() + " Total, "
-          + cpuRatio + "% CPU Ratio");
+      html = new StringBuilder(html.toString()
+          .replace("{cpu}", mr.getGauges().get("iot-metrics.cores").getValue() + " Total, "
+              + cpuRatio + "% CPU Ratio"));
     } else {
-      html = html.replace("{cpu}", mr.getGauges().get("iot-metrics.cores").getValue() + " Total  "
-          + "<font color=\"red\">can't get the cpu ratio,because this OS:["+os+"] is not support</font>");
+      html = new StringBuilder(html.toString()
+          .replace("{cpu}", mr.getGauges().get("iot-metrics.cores").getValue() + " Total  "
+              + "<font color=\"red\">can't get the cpu ratio,because this OS:[" + os
+              + "] is not support</font>"));
     }
     
-    html = html.replace("{jvm_mem}",mr.getGauges().get("iot-metrics.max_memory").getValue() + "  "
-        + mr.getGauges().get("iot-metrics.total_memory").getValue() + "  "
-        + mr.getGauges().get("iot-metrics.free_memory").getValue() + " (Max/Total/Free)MB");
+    html = new StringBuilder(html.toString()
+        .replace("{jvm_mem}", mr.getGauges().get("iot-metrics.max_memory").getValue() + "  "
+            + mr.getGauges().get("iot-metrics.total_memory").getValue() + "  "
+            + mr.getGauges().get("iot-metrics.free_memory").getValue() + " (Max/Total/Free)MB"));
     
-    html = html.replace("{host_mem}",String.format("%.0f",
+    html = new StringBuilder(html.toString().replace("{host_mem}", String.format("%.0f",
         ((int) mr.getGauges().get("iot-metrics.totalPhysical_memory").getValue() / 1024.0))
-        + " GB Total,  "+ String.format("%.1f",
+        + " GB Total,  " + String.format("%.1f",
         ((int) mr.getGauges().get("iot-metrics.usedPhysical_memory").getValue() / 1024.0))
-        + " GB Used");
+        + " GB Used"));
     
-    html = html.replace("{sql_table}", sqlRow());
-    return html;
+    html = new StringBuilder(html.toString().replace("{sql_table}", sqlRow()));
+    return html.toString();
   }
 
-  public StringBuilder sqlRow() {
+  private StringBuilder sqlRow() {
     StringBuilder table = new StringBuilder();
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:SSS");
     SqlArgument sqlArgument;
@@ -113,27 +119,21 @@ public class MetricsPage {
         status = "FAILED";
       }
 
-      table.append(
-          "<tr>"
-          + "<td>" + resp.getOperationType() + "</td>"
-          + "<td>" + sdf.format(new Date(sqlArgument.getStartTime())) + "</td>"
-          + "<td>" + sdf.format(new Date(sqlArgument.getEndTime())) + "</td>"
-          + "<td>" + (int) (sqlArgument.getEndTime() - sqlArgument.getStartTime()) + " ms</td>"
-          + "<td class=\"sql\">" + sqlArgument.getStatement() + "</td>"
-          + "<td>" + status + "</td>"
-          + "<td>" + (errMsg.equals("") ? "== Parsed Physical Plan ==" : errMsg)
-          +   "<span class=\"expand-details\" onclick=\"this.parentNode.querySelector('.stacktrace-details').classList.toggle('collapsed')\">+ details</span>"
-          +   "<div class=\"stacktrace-details collapsed\">"
-          +     "<pre>"
-          +       "Physical Plan: " + sqlArgument.getPlan().getClass().getSimpleName()
-          +       "</br>===========================</br>"
-          +       "OperatorType: " + sqlArgument.getPlan().getOperatorType()
-          +       "</br>===========================</br>"
-          +       "Path: " + sqlArgument.getPlan().getPaths().toString()
-          +     "</pre>"
-          +   "</div>"
-          + "</td>"
-          +"</tr>");
+      table.append("<tr>" + "<td>").append(resp.getOperationType()).append("</td>").append("<td>")
+          .append(sdf.format(new Date(sqlArgument.getStartTime()))).append("</td>").append("<td>")
+          .append(sdf.format(new Date(sqlArgument.getEndTime()))).append("</td>").append("<td>")
+          .append((int) (sqlArgument.getEndTime() - sqlArgument.getStartTime())).append(" ms</td>")
+          .append("<td class=\"sql\">").append(sqlArgument.getStatement()).append("</td>")
+          .append("<td>").append(status).append("</td>").append("<td>")
+          .append(errMsg.equals("") ? "== Parsed Physical Plan ==" : errMsg).append(
+          "<span class=\"expand-details\" onclick=\"this.parentNode.querySelector('.stacktrace-details').classList.toggle('collapsed')\">+ details</span>")
+          .append("<div class=\"stacktrace-details collapsed\">").append("<pre>")
+          .append("Physical Plan: ").append(sqlArgument.getPlan().getClass().getSimpleName())
+          .append("</br>===========================</br>").append("OperatorType: ")
+          .append(sqlArgument.getPlan().getOperatorType())
+          .append("</br>===========================</br>").append("Path: ")
+          .append(sqlArgument.getPlan().getPaths().toString()).append("</pre>").append("</div>")
+          .append("</td>").append("</tr>");
     }
     return table;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
index f761dbe..fb52267 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
  * agreements. See the NOTICE file distributed with this work for additional information regarding
  * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
@@ -31,27 +31,15 @@ public class MetricsWebUI {
     this.metricRegistry = metricRegistry;
   }
 
-  public MetricRegistry getMetricRegistry() {
-    return metricRegistry;
-  }
-
-  public void setMetricRegistry(MetricRegistry metricRegistry) {
-    this.metricRegistry = metricRegistry;
-  }
-
   public List<ServletContextHandler> getHandlers() {
     return handlers;
   }
 
-  public void setHandlers(List<ServletContextHandler> handlers) {
-    this.handlers = handlers;
-  }
-
   public void initialize() {
     MetricsPage masterPage = new MetricsPage(metricRegistry);
     QueryServlet queryServlet = new QueryServlet(masterPage);
     ServletContextHandler staticHandler = JettyUtil.createStaticHandler();
-    ServletContextHandler queryHandler = JettyUtil.createServletHandler("/",queryServlet);
+    ServletContextHandler queryHandler = JettyUtil.createServletHandler("/",queryServlet, "/");
     handlers.add(staticHandler);
     handlers.add(queryHandler);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
index e3c9ff5..e2b6e22 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
@@ -172,7 +172,7 @@ public class MetricsService implements MetricsServiceMBean, IService {
 
     private Server server;
 
-    public MetricsServiceThread(Server server) {
+    MetricsServiceThread(Server server) {
       this.server = server;
     }
 


[incubator-iotdb] 04/05: Merge branch 'master' into http

Posted by ge...@apache.org.
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 e4325030bae5c576bcc5e71bde724ee348e0b21c
Merge: b0f9b1c f461ba2
Author: zhutianci <zh...@gmail.com>
AuthorDate: Thu Feb 6 22:35:47 2020 +0800

    Merge branch 'master' into http

 .travis.yml                                        |   2 +-
 README.md                                          |   2 +-
 .../org/apache/iotdb/client/AbstractClient.java    |  25 ++-
 docs/{ => Community}/Community-History&Vision.md   |   0
 docs/{ => Community}/Community-Powered By.md       |   0
 .../Community-Project Committers.md                |   0
 docs/{ => Development}/Development-Chinese.md      |  21 +++
 docs/{ => Development}/Development-Contributing.md |   3 +
 docs/{ => Development}/Development-Document.md     |   3 +
 docs/{ => Development}/Development-IDE.md          |   0
 docs/{ => Development}/Development-VoteRelease.md  |   0
 .../SystemDesign/0-Architecture/1-Architecture.md  |  55 ++++++
 .../1-TsFile/1-TsFile.md}                          |  11 +-
 .../1-TsFile/2-Format.md}                          |   7 +-
 .../SystemDesign/1-TsFile/3-Write.md               |  65 +++++++
 .../SystemDesign/1-TsFile/4-Read.md}               |   7 +-
 .../SystemDesign/2-QueryEngine/1-QueryEngine.md    |  64 +++++++
 .../SystemDesign/2-QueryEngine/2-Planner.md        |  63 +++++++
 .../SystemDesign/2-QueryEngine/3-PlanExecutor.md}  |   6 +-
 .../3-SchemaManager/1-SchemaManager.md}            |   6 +-
 .../4-StorageEngine/1-StorageEngine.md             |  92 ++++++++++
 .../SystemDesign/4-StorageEngine/2-WAL.md}         |   6 +-
 .../SystemDesign/4-StorageEngine/3-FlushManager.md |  84 +++++++++
 .../4-StorageEngine/4-MergeManager.md}             |   6 +-
 .../SystemDesign/5-DataQuery/1-DataQuery.md        |  67 +++++++
 .../6-Tools/1-Sync.md}                             |   6 +-
 .../SystemDesign/7-Connector/2-Hive-TsFile.md      | 114 ++++++++++++
 .../1-DDL (Data Definition Language).md            |   8 +-
 .../5-Operation Manual/4-SQL Reference.md          |  13 +-
 .../2-Files.md => 8-Architecture/1-Files.md}       |   0
 .../2-Writing Data on HDFS.md}                     |   0
 .../3-Shared Nothing Cluster.md}                   |   0
 .../0-Content.md}                                  |  28 ++-
 .../SystemDesign/1-TsFile/1-TsFile.md}             |  10 +-
 .../1-TsFile/2-Format.md}                          |   6 +-
 .../SystemDesign/1-TsFile/3-Write.md}              |   4 +-
 .../SystemDesign/1-TsFile/4-Read.md}               |   4 +-
 .../{Developers => SystemDesign}/release.adoc      |   0
 docs/Documentation/UserGuide/0-Content.md          |   9 +-
 .../1-DDL (Data Definition Language).md            |   9 +-
 .../5-Operation Manual/4-SQL Reference.md          |  18 +-
 .../2-Files.md => 8-Architecture/1-Files.md}       |   0
 .../2-Writing Data on HDFS.md}                     |   0
 .../3-Shared Nothing Cluster.md}                   |   0
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |  75 ++++----
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |  46 +++--
 pom.xml                                            |   4 +
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     |  16 +-
 .../db/conf/adapter/IoTDBConfigDynamicAdapter.java |   4 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |   2 +
 .../db/qp/executor/IQueryProcessExecutor.java      |   2 -
 .../org/apache/iotdb/db/qp/logical/Operator.java   |   2 +-
 .../db/qp/logical/crud/BasicFunctionOperator.java  |  62 ++-----
 .../iotdb/db/qp/logical/crud/FilterOperator.java   |  11 +-
 .../iotdb/db/qp/logical/crud/FunctionOperator.java |   7 +
 .../iotdb/db/qp/logical/crud/InOperator.java       | 200 +++++++++++++++++++++
 .../iotdb/db/qp/strategy/LogicalGenerator.java     |  86 ++++++---
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   2 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |   6 +-
 .../qp/strategy/optimizer/DnfFilterOptimizer.java  |   2 +-
 .../db/qp/strategy/optimizer/IFilterOptimizer.java |   3 +-
 .../qp/strategy/optimizer/RemoveNotOptimizer.java  |  15 +-
 .../groupby/GroupByWithValueFilterDataSet.java     |   3 +-
 .../groupby/GroupByWithoutValueFilterDataSet.java  |   1 -
 .../receiver/recover/ISyncReceiverLogAnalyzer.java |   1 -
 .../iotdb/db/sync/sender/transfer/SyncClient.java  |   7 +-
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     | 134 +++++++++++++-
 .../org/apache/iotdb/db/qp/QueryProcessorTest.java |   4 +
 .../iotdb/db/qp/plan/LogicalPlanSmallTest.java     |  12 ++
 .../apache/iotdb/db/qp/plan/PhysicalPlanTest.java  | 114 ++++++++----
 .../read/expression/impl/GlobalTimeExpression.java |   2 +-
 .../expression/impl/SingleSeriesExpression.java    |   2 +-
 .../iotdb/tsfile/read/filter/GroupByFilter.java    |   2 +-
 .../iotdb/tsfile/read/filter/TimeFilter.java       |  16 ++
 .../iotdb/tsfile/read/filter/ValueFilter.java      |  16 ++
 .../tsfile/read/filter/basic/BinaryFilter.java     |   2 +-
 .../iotdb/tsfile/read/filter/basic/Filter.java     |   2 +-
 .../tsfile/read/filter/basic/UnaryFilter.java      |   3 +-
 .../tsfile/read/filter/factory/FilterFactory.java  |   2 -
 .../read/filter/factory/FilterSerializeId.java     |   2 +-
 .../tsfile/read/filter/operator/AndFilter.java     |   4 +-
 .../iotdb/tsfile/read/filter/operator/Eq.java      |   6 +-
 .../iotdb/tsfile/read/filter/operator/Gt.java      |  13 +-
 .../iotdb/tsfile/read/filter/operator/GtEq.java    |  13 +-
 .../filter/operator/{NotFilter.java => In.java}    |  92 +++++-----
 .../iotdb/tsfile/read/filter/operator/Lt.java      |  13 +-
 .../iotdb/tsfile/read/filter/operator/LtEq.java    |  13 +-
 .../iotdb/tsfile/read/filter/operator/NotEq.java   |  13 +-
 .../tsfile/read/filter/operator/NotFilter.java     |   4 +-
 .../tsfile/read/filter/operator/OrFilter.java      |   4 +-
 90 files changed, 1480 insertions(+), 389 deletions(-)


[incubator-iotdb] 03/05: update rest

Posted by ge...@apache.org.
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 <zh...@gmail.com>
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);
+  }
+}


[incubator-iotdb] 02/05: add rest api.

Posted by ge...@apache.org.
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 262a3168c337d5f912782a27cc14754889ad548d
Author: zhutianci <zh...@gmail.com>
AuthorDate: Thu Feb 6 11:05:02 2020 +0800

    add rest api.
---
 server/pom.xml                                     |   5 +
 .../apache/iotdb/db/http/service/HttpService.java  |   5 -
 .../apache/iotdb/db/metrics/server/JettyUtil.java  |  25 +--
 .../iotdb/db/metrics/server/MetricsSystem.java     |  11 +-
 ...etricsServletSink.java => JsonServletSink.java} |  92 ++++-----
 .../apache/iotdb/db/metrics/ui/MetricsWebUI.java   |  25 ++-
 .../org/apache/iotdb/db/qp/QueryProcessor.java     |   6 +
 .../iotdb/db/rest/controller/RestController.java   | 207 +++++++++++++++++++++
 .../iotdb/db/{http => rest/model}/TimeValues.java  |   2 +-
 .../apache/iotdb/db/rest/service/RestService.java  | 177 ++++++++++++++++++
 .../QueryServlet.java => rest/util/RestUtil.java}  |  35 ++--
 .../apache/iotdb/db/service/MetricsService.java    |   7 +-
 .../src/main/resources/iotdb/ui/static/index.html  |   4 +-
 13 files changed, 487 insertions(+), 114 deletions(-)

diff --git a/server/pom.xml b/server/pom.xml
index b231975..180c31b 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -121,6 +121,11 @@
             <artifactId>stream</artifactId>
             <version>2.9.5</version>
         </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-servlet</artifactId>
+            <version>2.30</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java b/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java
deleted file mode 100644
index 87ba8ee..0000000
--- a/server/src/main/java/org/apache/iotdb/db/http/service/HttpService.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.apache.iotdb.db.http.service;
-
-public class HttpService {
-
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
index ab2cff1..ce3a38d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/JettyUtil.java
@@ -33,7 +33,7 @@ import org.eclipse.jetty.servlet.ServletHolder;
 
 public class JettyUtil {
 
-  public static ServletContextHandler createMetricsServletHandler(ObjectMapper mapper,MetricRegistry metricRegistry) {
+  public static ServletHolder createJsonServletHolder(ObjectMapper mapper,MetricRegistry metricRegistry) {
     HttpServlet httpServlet = new HttpServlet() {
       private static final long serialVersionUID = 1L;
 
@@ -56,27 +56,14 @@ public class JettyUtil {
         doGet(req, resp);
       }
     };
-    
-    return createServletHandler("/json", httpServlet, "/");
-  }
 
-  public static ServletContextHandler createServletHandler(String path, HttpServlet servlet, String pathSpec) {
-    ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    ServletHolder holder = new ServletHolder(servlet);
-    contextHandler.setContextPath(path);
-    contextHandler.addServlet(holder, pathSpec);
-    return contextHandler;
+    return new ServletHolder(httpServlet);
   }
 
-  public static ServletContextHandler createStaticHandler() {
-    ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
-    URL res = JettyUtil.class.getClassLoader().getResource("iotdb/ui/static");
-    HttpServlet servlet = new DefaultServlet();
-    ServletHolder holder = new ServletHolder(servlet);
-    holder.setInitParameter("resourceBase", Objects.requireNonNull(res).toString());
-    contextHandler.setContextPath("/static");
-    contextHandler.addServlet(holder, "/");
-    return contextHandler;
+  public static ServletHolder createStaticServletHolder() {
+    ServletHolder holder = new ServletHolder("static", DefaultServlet.class);
+    holder.setInitParameter("dirAllowed", "true");
+    return holder;
   }
 
   public static Server getJettyServer(List<ServletContextHandler> handlers, int port) {
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java b/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
index 7872b14..cfc726a 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/server/MetricsSystem.java
@@ -15,12 +15,12 @@
 package org.apache.iotdb.db.metrics.server;
 
 import java.util.ArrayList;
-import org.apache.iotdb.db.metrics.sink.MetricsServletSink;
+import org.apache.iotdb.db.metrics.sink.JsonServletSink;
 import org.apache.iotdb.db.metrics.sink.Sink;
 import org.apache.iotdb.db.metrics.source.MetricsSource;
 import org.apache.iotdb.db.metrics.source.Source;
-import org.eclipse.jetty.servlet.ServletContextHandler;
 import com.codahale.metrics.MetricRegistry;
+import org.eclipse.jetty.servlet.ServletHolder;
 
 public class MetricsSystem {
 
@@ -40,8 +40,11 @@ public class MetricsSystem {
     return metricRegistry;
   }
 
-  public ServletContextHandler getServletHandlers() {
-    return new MetricsServletSink(metricRegistry).getHandler();
+  /**
+   * to get a json Servlet Holder
+   */
+  public ServletHolder getServletHolder() {
+    return new JsonServletSink(metricRegistry).getHolder();
   }
 
   public void start() {
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java b/server/src/main/java/org/apache/iotdb/db/metrics/sink/JsonServletSink.java
similarity index 81%
rename from server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java
rename to server/src/main/java/org/apache/iotdb/db/metrics/sink/JsonServletSink.java
index c88e447..16003e5 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/sink/MetricsServletSink.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/sink/JsonServletSink.java
@@ -1,46 +1,46 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.iotdb.db.metrics.sink;
-
-import java.util.concurrent.TimeUnit;
-import org.apache.iotdb.db.metrics.server.JettyUtil;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import com.codahale.metrics.MetricRegistry;
-import com.codahale.metrics.json.MetricsModule;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-public class MetricsServletSink implements Sink {
-
-  private MetricRegistry registry;
-
-  public MetricsServletSink(MetricRegistry registry) {
-    this.registry = registry;
-  }
-
-  public ServletContextHandler getHandler() {
-    ObjectMapper mapper = new ObjectMapper()
-        .registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, false));
-    return JettyUtil.createMetricsServletHandler(mapper, registry);
-  }
-
-  @Override
-  public void start() {}
-
-  @Override
-  public void stop() {}
-
-  @Override
-  public void report() {}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.iotdb.db.metrics.sink;
+
+import java.util.concurrent.TimeUnit;
+import org.apache.iotdb.db.metrics.server.JettyUtil;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.json.MetricsModule;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+public class JsonServletSink implements Sink {
+
+  private MetricRegistry registry;
+
+  public JsonServletSink(MetricRegistry registry) {
+    this.registry = registry;
+  }
+
+  public ServletHolder getHolder() {
+    ObjectMapper mapper = new ObjectMapper()
+        .registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.MILLISECONDS, false));
+    return JettyUtil.createJsonServletHolder(mapper, registry);
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {}
+
+  @Override
+  public void report() {}
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
index fb52267..31395ef 100644
--- a/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
+++ b/server/src/main/java/org/apache/iotdb/db/metrics/ui/MetricsWebUI.java
@@ -14,37 +14,34 @@
  */
 package org.apache.iotdb.db.metrics.ui;
 
-import java.util.ArrayList;
-import java.util.List;
 import org.apache.iotdb.db.metrics.server.JettyUtil;
 import org.apache.iotdb.db.metrics.server.QueryServlet;
-import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import com.codahale.metrics.MetricRegistry;
+import org.eclipse.jetty.servlet.ServletHolder;
 
 public class MetricsWebUI {
 
-  private List<ServletContextHandler> handlers = new ArrayList<>();
+  private ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
   private MetricRegistry metricRegistry;
 
   public MetricsWebUI(MetricRegistry metricRegistry) {
     this.metricRegistry = metricRegistry;
   }
 
-  public List<ServletContextHandler> getHandlers() {
-    return handlers;
-  }
-
   public void initialize() {
     MetricsPage masterPage = new MetricsPage(metricRegistry);
     QueryServlet queryServlet = new QueryServlet(masterPage);
-    ServletContextHandler staticHandler = JettyUtil.createStaticHandler();
-    ServletContextHandler queryHandler = JettyUtil.createServletHandler("/",queryServlet, "/");
-    handlers.add(staticHandler);
-    handlers.add(queryHandler);
+    handler.setContextPath("/metrics");
+    handler.setResourceBase(
+        String.valueOf(MetricsWebUI.class.getClassLoader().getResource("iotdb/ui/static")));
+    ServletHolder queryServletHolder = new ServletHolder(queryServlet);
+    handler.addServlet(queryServletHolder, "/query");
+    ServletHolder staticServletHolder = JettyUtil.createStaticServletHolder();
+    handler.addServlet(staticServletHolder, "/");
   }
 
-  public Server getServer(int port) {
-    return JettyUtil.getJettyServer(handlers, port);
+  public ServletContextHandler getHandler() {
+    return handler;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
index 69c0156..cb624fa 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/QueryProcessor.java
@@ -68,6 +68,12 @@ public class QueryProcessor {
     return physicalGenerator.transformToPhysicalPlan(operator);
   }
 
+  public PhysicalPlan logicalPlanToPhysicalPlan(Operator operator) throws QueryProcessException {
+    operator = logicalOptimize(operator, executor);
+    PhysicalGenerator physicalGenerator = new PhysicalGenerator(executor);
+    return physicalGenerator.transformToPhysicalPlan(operator);
+  }
+
 
   /**
    * given an unoptimized logical operator tree and return a optimized result.
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
new file mode 100644
index 0000000..c0ed5f8
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/rest/controller/RestController.java
@@ -0,0 +1,207 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+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.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;
+
+/**
+ * It’s used for mapping http request.
+ */
+
+@Path("/")
+public class RestController {
+
+  private static final Logger logger = LoggerFactory.getLogger(RestController.class);
+  private RestService restService = new RestService();
+
+  /**
+   * http request to login IoTDB
+   * @param username username for login IoTDB
+   * @param password password for login IoTDB
+   */
+
+  @Path("/login/{username}&&{password}")
+  @POST
+  public void login(@PathParam("username") String username, @PathParam("password") String password)
+      throws AuthException {
+    logger.info("{}: receive http request from username {}", IoTDBConstant.GLOBAL_DB_NAME,
+        username);
+    IAuthorizer authorizer = LocalFileAuthorizer.getInstance();
+    boolean status = authorizer.login(username, password);
+    if (status) {
+      restService.setUsername(username);
+      logger.info("{}: Login successfully. User : {}", IoTDBConstant.GLOBAL_DB_NAME, username);
+    } else {
+      throw new AuthException("Wrong login password");
+    }
+  }
+
+  /**
+   *
+   * @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) {
+    String targetStr = "target";
+    response.setStatus(200);
+    try {
+      JSONObject jsonObject = 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"));
+      JSONArray array = (JSONArray) jsonObject.get("targets"); // []
+      JSONArray result = new JSONArray();
+      for (int i = 0; i < array.size(); i++) {
+        JSONObject object = (JSONObject) array.get(i); // {}
+        if (!object.containsKey(targetStr)) {
+          return "[]";
+        }
+        String target = (String) object.get(targetStr);
+        String type = getJsonType(jsonObject);
+        JSONObject obj = new JSONObject();
+        obj.put("target", target);
+        if (type.equals("table")) {
+          setJsonTable(obj, target, timeRange);
+        } else if (type.equals("timeserie")) {
+          setJsonTimeseries(obj, target, timeRange);
+        }
+        result.add(i, obj);
+      }
+      logger.info("query finished");
+      return result.toString();
+    } catch (Exception e) {
+      logger.error("/query failed", e);
+    }
+    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/http/TimeValues.java b/server/src/main/java/org/apache/iotdb/db/rest/model/TimeValues.java
similarity index 96%
rename from server/src/main/java/org/apache/iotdb/db/http/TimeValues.java
rename to server/src/main/java/org/apache/iotdb/db/rest/model/TimeValues.java
index 8c7059d..49290b0 100644
--- a/server/src/main/java/org/apache/iotdb/db/http/TimeValues.java
+++ b/server/src/main/java/org/apache/iotdb/db/rest/model/TimeValues.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.http;
+package org.apache.iotdb.db.rest.model;
 
 public class TimeValues {
 
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
new file mode 100644
index 0000000..3843555
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/rest/service/RestService.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.rest.service;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.iotdb.db.auth.AuthException;
+import org.apache.iotdb.db.auth.AuthorityChecker;
+import org.apache.iotdb.db.conf.IoTDBConstant;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.exception.path.PathException;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
+import org.apache.iotdb.db.exception.runtime.SQLParserException;
+import org.apache.iotdb.db.exception.storageGroup.StorageGroupException;
+import org.apache.iotdb.db.metadata.MManager;
+import org.apache.iotdb.db.qp.QueryProcessor;
+import org.apache.iotdb.db.qp.constant.DatetimeUtils;
+import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
+import org.apache.iotdb.db.qp.logical.crud.BasicFunctionOperator;
+import org.apache.iotdb.db.qp.logical.crud.FilterOperator;
+import org.apache.iotdb.db.qp.logical.crud.FromOperator;
+import org.apache.iotdb.db.qp.logical.crud.QueryOperator;
+import org.apache.iotdb.db.qp.logical.crud.SelectOperator;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.db.qp.physical.crud.QueryPlan;
+import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.control.QueryResourceManager;
+import org.apache.iotdb.db.rest.model.TimeValues;
+import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
+import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
+import org.apache.iotdb.tsfile.utils.Pair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RestService {
+
+  protected QueryProcessor processor = new QueryProcessor(new QueryProcessExecutor());
+  private static final Logger logger = LoggerFactory.getLogger(RestService.class);
+  private static final String INFO_NOT_LOGIN = "{}: Not login.";
+  private String username;
+
+
+  public 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;
+    String suffixPath = s.substring(s.lastIndexOf('.') + 1);
+    String prefixPath = s.substring(0, s.lastIndexOf('.'));
+    String sql = "SELECT " + suffixPath + " FROM root."
+        + prefixPath + " WHERE time > " + from + " and time < " + to;
+    logger.info(sql);
+    QueryOperator queryOperator = generateOperator(suffixPath, prefixPath, timeRange);
+    QueryPlan plan = (QueryPlan) processor.logicalPlanToPhysicalPlan(queryOperator);
+    List<Path> paths = plan.getPaths();
+    if (!checkLogin()) {
+      logger.info(INFO_NOT_LOGIN, IoTDBConstant.GLOBAL_DB_NAME);
+    }
+
+    // check seriesPath exists
+    if (paths.isEmpty()) {
+      throw new PathException("The path doesn't exist");
+    }
+
+    // check file level set
+    try {
+      checkFileLevelSet(paths);
+    } catch (StorageGroupException e) {
+      logger.error("meet error while checking file level.", e);
+      throw new StorageGroupException(e.getMessage());
+    }
+
+    // check permissions
+    if (!checkAuthorization(paths, plan)) {
+      throw new AuthException("Don't have permissions");
+    }
+
+    QueryContext context = new QueryContext(QueryResourceManager.getInstance().assignQueryId(true));
+    QueryDataSet queryDataSet = processor.getExecutor().processQuery(plan, context);
+    String[] args;
+    List<TimeValues> list = new ArrayList<>();
+    while(queryDataSet.hasNext()) {
+      TimeValues timeValues = new TimeValues();
+      args = queryDataSet.next().toString().split("\t");
+      timeValues.setTime(Long.parseLong(args[1]));
+      timeValues.setValue(args[0]);
+      list.add(timeValues);
+    }
+    return list;
+  }
+
+  private boolean checkLogin() {
+    return username != null;
+  }
+
+  private boolean checkAuthorization(List<Path> paths, PhysicalPlan plan) throws AuthException {
+    return AuthorityChecker.check(username, paths, plan.getOperatorType(), null);
+  }
+
+  private void checkFileLevelSet(List<Path> paths) throws StorageGroupException {
+    MManager.getInstance().checkFileLevel(paths);
+  }
+
+
+  /**
+   * generate select statement operator
+   */
+  private QueryOperator generateOperator(String suffixPath, String prefixPath, Pair<String, String> timeRange) {
+    FilterOperator binaryOp = new FilterOperator(SQLConstant.KW_AND);
+    binaryOp.addChildOperator(
+        new BasicFunctionOperator(SQLConstant.GREATERTHAN,
+            new Path(SQLConstant.RESERVED_TIME),
+            String.valueOf(parseTimeFormat(timeRange.left))
+        )
+    );
+    binaryOp.addChildOperator(
+        new BasicFunctionOperator(SQLConstant.LESSTHAN,
+            new Path(SQLConstant.RESERVED_TIME),
+            String.valueOf(parseTimeFormat(timeRange.right))
+        )
+    );
+    QueryOperator queryOp = new QueryOperator(SQLConstant.TOK_QUERY);
+    SelectOperator selectOp = new SelectOperator(SQLConstant.TOK_SELECT);
+    selectOp.addSelectPath(new Path(suffixPath));
+    FromOperator fromOp = new FromOperator(SQLConstant.TOK_FROM);
+    fromOp.addPrefixTablePath(new Path(prefixPath));
+    queryOp.setFilterOperator(binaryOp);
+    queryOp.setSelectOperator(selectOp);
+    queryOp.setFromOperator(fromOp);
+    return queryOp;
+  }
+
+  /**
+   * function for parsing time format.
+   */
+  private long parseTimeFormat(String timestampStr) throws SQLParserException {
+    if (timestampStr == null || timestampStr.trim().equals("")) {
+      throw new SQLParserException("input timestamp cannot be empty");
+    }
+    if (timestampStr.equalsIgnoreCase(SQLConstant.NOW_FUNC)) {
+      return System.currentTimeMillis();
+    }
+    try {
+      return DatetimeUtils.convertDatetimeStrToLong(timestampStr, IoTDBDescriptor.getInstance().getConfig().getZoneID());
+    } catch (Exception e) {
+      throw new SQLParserException(String
+          .format("Input time format %s error. "
+              + "Input like yyyy-MM-dd HH:mm:ss, yyyy-MM-ddTHH:mm:ss or "
+              + "refer to user document for more info.", timestampStr));
+    }
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java b/server/src/main/java/org/apache/iotdb/db/rest/util/RestUtil.java
similarity index 52%
rename from server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java
rename to server/src/main/java/org/apache/iotdb/db/rest/util/RestUtil.java
index d042663..5c0b4aa 100644
--- a/server/src/main/java/org/apache/iotdb/db/http/QueryServlet.java
+++ b/server/src/main/java/org/apache/iotdb/db/rest/util/RestUtil.java
@@ -16,29 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.db.http;
+package org.apache.iotdb.db.rest.util;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.glassfish.jersey.servlet.ServletContainer;
 
-public class QueryServlet extends HttpServlet {
+public class RestUtil {
+  public static ServletContextHandler getRestContextHandler() {
+    ServletContextHandler ctx =
+        new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
 
-  @Override
-  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
-      throws ServletException, IOException {
-    PrintWriter out = resp.getWriter();
-    resp.setContentType("application/json");
-    resp.setCharacterEncoding("UTF-8");
-
-  }
-
-  @Override
-  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
-      throws ServletException, IOException {
-    super.doPost(req, resp);
+    ctx.setContextPath("/rest");
+    ServletHolder serHol = ctx.addServlet(ServletContainer.class, "/*");
+    serHol.setInitParameter("jersey.config.server.provider.packages",
+        "org.apache.iotdb.db.rest.controller");
+    serHol.setInitOrder(1);
+    return ctx;
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
index e2b6e22..cc8d544 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.SocketAddress;
+import java.util.Arrays;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
@@ -30,9 +31,11 @@ import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StartupException;
+import org.apache.iotdb.db.metrics.server.JettyUtil;
 import org.apache.iotdb.db.metrics.server.MetricsSystem;
 import org.apache.iotdb.db.metrics.server.ServerArgument;
 import org.apache.iotdb.db.metrics.ui.MetricsWebUI;
+import org.apache.iotdb.db.rest.util.RestUtil;
 import org.eclipse.jetty.server.Server;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,9 +88,9 @@ public class MetricsService implements MetricsServiceMBean, IService {
     int port = getMetricsPort();
     MetricsSystem metricsSystem = new MetricsSystem(new ServerArgument(port));
     MetricsWebUI metricsWebUI = new MetricsWebUI(metricsSystem.getMetricRegistry());
-    metricsWebUI.getHandlers().add(metricsSystem.getServletHandlers());
+    metricsWebUI.getHandler().addServlet(metricsSystem.getServletHolder(), "/json");
     metricsWebUI.initialize();
-    server = metricsWebUI.getServer(port);
+    server = JettyUtil.getJettyServer(Arrays.asList(metricsWebUI.getHandler(), RestUtil.getRestContextHandler()), 8181);
     metricsSystem.start();
     try {
       executorService.execute(new MetricsServiceThread(server));
diff --git a/server/src/main/resources/iotdb/ui/static/index.html b/server/src/main/resources/iotdb/ui/static/index.html
index 68e7881..6b85ced 100644
--- a/server/src/main/resources/iotdb/ui/static/index.html
+++ b/server/src/main/resources/iotdb/ui/static/index.html
@@ -18,7 +18,7 @@ limitations under the License.
 <html>
 <head>
 <meta http-equiv="Content-type" content="text/html; charset=utf-8">
-<link rel="stylesheet" href="/static/webui.css" type="text/css">
+<link rel="stylesheet" href="webui.css" type="text/css">
 <title>IotDB Metrics Server</title>
 </head>
 <body>
@@ -27,7 +27,7 @@ limitations under the License.
             <div class="brand">
                 <h3 style="vertical-align: middle; display: inline-block;">
                     <a href="" style="text-decoration: none">
-                        <img src="/static/iotdb-logo.png">
+                        <img src="iotdb-logo.png">
                         <span class="version" style="margin-right: 15px;">{version}</span>
                     </a>
                     IOTDB Metrics Server


[incubator-iotdb] 05/05: fix test.

Posted by ge...@apache.org.
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 e4994088728ed5e8133f2cf819d22f7382df4df9
Author: zhutianci <zh...@gmail.com>
AuthorDate: Thu Feb 6 23:36:55 2020 +0800

    fix test.
---
 .../iotdb/db/rest/controller/RestController.java   |  4 +-
 .../apache/iotdb/db/rest/service/RestService.java  | 64 ++++++++++++++++------
 .../java/org/apache/iotdb/db/rest/RestTest.java    | 20 +++++--
 3 files changed, 64 insertions(+), 24 deletions(-)

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 80b7577..fec0822 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
@@ -21,9 +21,7 @@ package org.apache.iotdb.db.rest.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 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.Produces;
@@ -46,7 +44,7 @@ import org.slf4j.LoggerFactory;
 public class RestController {
 
   private static final Logger logger = LoggerFactory.getLogger(RestController.class);
-  private RestService restService = new RestService();
+  private RestService restService = RestService.getInstance();
 
   /**
    * http request to login IoTDB
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 7cec82c..9d4329b 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
@@ -29,6 +29,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.iotdb.db.auth.AuthException;
 import org.apache.iotdb.db.auth.AuthorityChecker;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -75,7 +76,7 @@ public class RestService {
     String to = timeRange.right;
     String suffixPath = s.substring(s.lastIndexOf('.') + 1);
     String prefixPath = s.substring(0, s.lastIndexOf('.'));
-    String sql = "SELECT " + suffixPath + " FROM root."
+    String sql = "SELECT " + suffixPath + " FROM"
         + prefixPath + " WHERE time > " + from + " and time < " + to;
     logger.info(sql);
     QueryOperator queryOperator = generateOperator(suffixPath, prefixPath, timeRange);
@@ -110,8 +111,8 @@ public class RestService {
     while(queryDataSet.hasNext()) {
       TimeValues timeValues = new TimeValues();
       args = queryDataSet.next().toString().split("\t");
-      timeValues.setTime(Long.parseLong(args[1]));
-      timeValues.setValue(args[0]);
+      timeValues.setTime(Long.parseLong(args[0]));
+      timeValues.setValue(args[1]);
       list.add(timeValues);
     }
     return list;
@@ -135,18 +136,41 @@ public class RestService {
    */
   private QueryOperator generateOperator(String suffixPath, String prefixPath, Pair<String, String> timeRange) {
     FilterOperator binaryOp = new FilterOperator(SQLConstant.KW_AND);
-    binaryOp.addChildOperator(
-        new BasicFunctionOperator(SQLConstant.GREATERTHAN,
-            new Path(SQLConstant.RESERVED_TIME),
-            String.valueOf(parseTimeFormat(timeRange.left))
-        )
-    );
-    binaryOp.addChildOperator(
-        new BasicFunctionOperator(SQLConstant.LESSTHAN,
-            new Path(SQLConstant.RESERVED_TIME),
-            String.valueOf(parseTimeFormat(timeRange.right))
-        )
-    );
+    long timeLeft;
+    long timeRight;
+    if(!NumberUtils.isDigits(timeRange.left)) {
+      timeLeft = parseTimeFormat(timeRange.left);
+      binaryOp.addChildOperator(
+          new BasicFunctionOperator(SQLConstant.GREATERTHAN,
+              new Path(SQLConstant.RESERVED_TIME),
+              String.valueOf(timeLeft)
+          )
+      );
+    } else {
+      binaryOp.addChildOperator(
+          new BasicFunctionOperator(SQLConstant.GREATERTHAN,
+              new Path(SQLConstant.RESERVED_TIME),
+              timeRange.left
+          )
+      );
+    }
+
+    if(!NumberUtils.isDigits(timeRange.right)) {
+      timeRight = parseTimeFormat(timeRange.right);
+      binaryOp.addChildOperator(
+          new BasicFunctionOperator(SQLConstant.LESSTHAN,
+              new Path(SQLConstant.RESERVED_TIME),
+              String.valueOf(timeRight)
+          )
+      );
+    } else {
+      binaryOp.addChildOperator(
+          new BasicFunctionOperator(SQLConstant.LESSTHAN,
+              new Path(SQLConstant.RESERVED_TIME),
+              timeRange.right
+          )
+      );
+    }
     QueryOperator queryOp = new QueryOperator(SQLConstant.TOK_QUERY);
     SelectOperator selectOp = new SelectOperator(SQLConstant.TOK_SELECT);
     selectOp.addSelectPath(new Path(suffixPath));
@@ -253,10 +277,18 @@ public class RestService {
       long time = tv.getTime();
       String value = tv.getValue();
       JSONArray jsonArray = new JSONArray();
-      jsonArray.add(value);
       jsonArray.add(time);
+      jsonArray.add(value);
       dataPoints.add(jsonArray);
     }
     obj.put("datapoints", dataPoints);
   }
+
+  public static RestService getInstance() {
+    return RestServiceHolder.INSTANCE;
+  }
+
+  private static class RestServiceHolder {
+    private static final RestService INSTANCE = new RestService();
+  }
 }
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
index 4976364..013af85 100644
--- a/server/src/test/java/org/apache/iotdb/db/rest/RestTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/rest/RestTest.java
@@ -13,6 +13,7 @@ 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.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -20,6 +21,9 @@ public class RestTest {
   private static final String REST_URI
       = "http://localhost:8181/rest/query";
 
+  private static final String LOGIN
+      = "http://localhost:8181/rest/login";
+
   private static String[] creationSqls = new String[]{
       "SET STORAGE GROUP TO root.vehicle.d0",
       "SET STORAGE GROUP TO root.vehicle.d1",
@@ -120,20 +124,26 @@ public class RestTest {
   @Test
   public void testQuery() {
     Client client = ClientBuilder.newClient();
-    String json = "{\n"
+    String json1 = "{\n"
         + "  \"range\": {\n"
-        + "    \"from\": \"1\",\n"
+        + "    \"from\": \"0\",\n"
         + "    \"to\": \"300\",\n"
         + "  },\n"
         + "  \n"
         + "  \"targets\": [\n"
-        + "     { \"target\": \"root.ln.wf01.wt01\", \"type\": \"timeserie\" },\n"
+        + "     { \"target\": \"root.ln.wf01.wt01.temperature\", \"type\": \"timeserie\" },\n"
         + "  ]\n"
         + "}";
+
+    String json2 = "{username : \"root\", password : \"root\"}";
+    client.target(LOGIN)
+        .request(MediaType.TEXT_PLAIN)
+        .post(Entity.entity(json2, MediaType.TEXT_PLAIN));
     Response response = client.target(REST_URI)
         .request(MediaType.TEXT_PLAIN)
-        .post(Entity.entity(json, MediaType.TEXT_PLAIN));
+        .post(Entity.entity(json1, MediaType.TEXT_PLAIN));
     String result = response.readEntity(String.class);
-    System.out.println(result);
+    Assert.assertEquals("[{\"datapoints\":[[1,\"1.1\"],[2,\"2.2\"],[3,\"3.3\"],[4,\"4.4\"],[5,\"5.5\"]],\"target\":\"root.ln.wf01.wt01.temperature\"}]"
+        , result);
   }
 }