You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ka...@apache.org on 2021/05/15 11:06:21 UTC

[iotdb] branch f_index_dev updated: SQL: add index name in query. Zeppelin change

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

kangrong pushed a commit to branch f_index_dev
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/f_index_dev by this push:
     new d9c63b9  SQL: add index name in query. Zeppelin change
d9c63b9 is described below

commit d9c63b9bc7e37e083664361b1451586eb927a1b3
Author: kr11 <3095717866.com>
AuthorDate: Sat May 15 19:05:26 2021 +0800

    SQL: add index name in query. Zeppelin change
---
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4   |  2 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |  7 +++-
 .../apache/iotdb/db/index/it/DemoMMHHWindIT.java   |  2 +-
 .../apache/iotdb/db/index/it/DemoRTreeWindIT.java  |  2 +-
 .../apache/iotdb/db/index/it/MMHHIndexReadIT.java  |  2 +-
 .../iotdb/db/index/it/MMHHNoIndexReadIT.java       |  2 +-
 .../apache/iotdb/db/index/it/RTreeIndexReadIT.java |  2 +-
 .../iotdb/db/index/it/RTreeNoIndexReadIT.java      |  2 +-
 .../db/index/router/ProtoIndexRouterTest.java      | 25 ++++++--------
 .../iotdb/db/qp/logical/IndexLogicalPlanTest.java  | 38 ++++++++++++++++++++++
 .../apache/zeppelin/iotdb/IoTDBInterpreter.java    | 34 ++++++++++++++-----
 .../zeppelin/iotdb/IoTDBInterpreterTest.java       | 30 ++++++++++++++---
 12 files changed, 112 insertions(+), 36 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
index 140e8b6..7e109d3 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
@@ -356,7 +356,7 @@ topClause
     ;
 
 indexPredicateClause
-    : (suffixPath | fullPath) LIKE sequenceClause
+    : (suffixPath | fullPath) (indexName=ID)? LIKE sequenceClause
     | (suffixPath | fullPath) CONTAIN sequenceClause WITH TOLERANCE constant (CONCAT sequenceClause WITH TOLERANCE constant)*
     ;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index 67ff535..d422ac5 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -1308,7 +1308,12 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> {
         props = new HashMap<>();
       }
       props.put(PATTERN, parseSequence(ctx.sequenceClause(0)));
-      queryOp.setIndexType(IndexType.ANY_FOR_QUERY);
+      if (ctx.indexName != null) {
+        IndexType indexType = IndexType.valueOf(ctx.indexName.getText());
+        queryOp.setIndexType(indexType);
+      } else {
+        queryOp.setIndexType(IndexType.ANY_FOR_QUERY);
+      }
     } else if (ctx.CONTAIN() != null) {
       // subsequence matching case
       List<double[]> compositePattern = new ArrayList<>();
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
index aa2815e..1e5d493 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/DemoMMHHWindIT.java
@@ -222,7 +222,7 @@ public class DemoMMHHWindIT {
   }
 
   private void checkReads(boolean assertResult) throws ClassNotFoundException {
-    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE (%s)";
+    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed MMHH LIKE (%s)";
     String q1Line =
         "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
             + "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
index d5bd877..6395c80 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/DemoRTreeWindIT.java
@@ -195,7 +195,7 @@ public class DemoRTreeWindIT {
   }
 
   private void checkReads(boolean assertResult) throws ClassNotFoundException {
-    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed LIKE (%s)";
+    String template = "SELECT TOP 3 speed FROM root.wind2.* WHERE speed RTREE_PAA LIKE (%s)";
     String q1Line =
         "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
             + "20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,20.0,"
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
index b5bb460..8e9f63c 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHIndexReadIT.java
@@ -153,7 +153,7 @@ public class MMHHIndexReadIT {
 
       String querySQL =
           String.format(
-              "SELECT TOP 2 direction FROM root.wind2.* WHERE direction LIKE (%s)",
+              "SELECT TOP 2 direction FROM root.wind2.* WHERE direction MMHH LIKE (%s)",
               getArrayRange(121, 121 + wholeDim));
 
       System.out.println(querySQL);
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHNoIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHNoIndexReadIT.java
index d9ec8a8..f911f2b 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/MMHHNoIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/MMHHNoIndexReadIT.java
@@ -141,7 +141,7 @@ public class MMHHNoIndexReadIT {
 
       String querySQL =
           String.format(
-              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction LIKE (%s)",
+              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction MMHH LIKE (%s)",
               getArrayRange(121, 121 + wholeDim));
 
       System.out.println(querySQL);
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/RTreeIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/RTreeIndexReadIT.java
index c1ada01..3ca9524 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/RTreeIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/RTreeIndexReadIT.java
@@ -139,7 +139,7 @@ public class RTreeIndexReadIT {
 
       String querySQL =
           String.format(
-              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction LIKE (%s)",
+              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction RTREE_PAA LIKE (%s)",
               getArrayRange(121, 121 + wholeDim));
 
       System.out.println(querySQL);
diff --git a/server/src/test/java/org/apache/iotdb/db/index/it/RTreeNoIndexReadIT.java b/server/src/test/java/org/apache/iotdb/db/index/it/RTreeNoIndexReadIT.java
index 0e06e7e..749100b 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/it/RTreeNoIndexReadIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/it/RTreeNoIndexReadIT.java
@@ -126,7 +126,7 @@ public class RTreeNoIndexReadIT {
 
       String querySQL =
           String.format(
-              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction LIKE (%s)",
+              "SELECT TOP 5 direction FROM root.wind2.* WHERE direction RTREE_PAA LIKE (%s)",
               getArrayRange(121, 121 + wholeDim));
 
       System.out.println(querySQL);
diff --git a/server/src/test/java/org/apache/iotdb/db/index/router/ProtoIndexRouterTest.java b/server/src/test/java/org/apache/iotdb/db/index/router/ProtoIndexRouterTest.java
index 5322e33..86b577b 100644
--- a/server/src/test/java/org/apache/iotdb/db/index/router/ProtoIndexRouterTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/index/router/ProtoIndexRouterTest.java
@@ -138,9 +138,8 @@ public class ProtoIndexRouterTest {
     //    System.out.println(router.toString());
     Assert.assertEquals(
         "<{NO_INDEX=[type: NO_INDEX, time: 10, props: {PAA_DIM=10}], RTREE_PAA=[type: RTREE_PAA, time: 5, props: {PAA_DIM=5}]}\n"
-            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEAR\n"
-            + "RNode{LB=[3.4028235E38, 3.4028235E38, 3.4028235E38, 3.4028235E38], UB=[-3.4028235E38, -3.4028235E38, -3.4028235E38, -3.4028235E38], leaf=true}\n"
-            + "}>\n"
+            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEARinner:0,leaf:1,item:0;\n"
+            + " calc size: 52=4*3+2+(#inner(0)+#leaf(1)) * (2*dim(4)*4+2+4) + #item(0) * (dim(4)*4 + 2 + 8)}>\n"
             + "<{ELB_INDEX=[type: ELB_INDEX, time: 0, props: {INDEX_SLIDE_STEP=8, INDEX_WINDOW_RANGE=4}]}\n"
             + "root.wind1.azq01.speed: {ELB_INDEX=[]}>\n",
         router.toString());
@@ -149,9 +148,8 @@ public class ProtoIndexRouterTest {
         (ProtoIndexRouter) router.getRouterByStorageGroup(storageGroupFull);
     Assert.assertEquals(
         "<{NO_INDEX=[type: NO_INDEX, time: 10, props: {PAA_DIM=10}], RTREE_PAA=[type: RTREE_PAA, time: 5, props: {PAA_DIM=5}]}\n"
-            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEAR\n"
-            + "RNode{LB=[3.4028235E38, 3.4028235E38, 3.4028235E38, 3.4028235E38], UB=[-3.4028235E38, -3.4028235E38, -3.4028235E38, -3.4028235E38], leaf=true}\n"
-            + "}>\n",
+            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEARinner:0,leaf:1,item:0;\n"
+            + " calc size: 52=4*3+2+(#inner(0)+#leaf(1)) * (2*dim(4)*4+2+4) + #item(0) * (dim(4)*4 + 2 + 8)}>\n",
         sgRouters.toString());
     //    System.out.println(sgRouters.toString());
 
@@ -160,9 +158,8 @@ public class ProtoIndexRouterTest {
     //    System.out.println(router.toString());
     Assert.assertEquals(
         "<{NO_INDEX=[type: NO_INDEX, time: 10, props: {PAA_DIM=10}], RTREE_PAA=[type: RTREE_PAA, time: 5, props: {PAA_DIM=5}]}\n"
-            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEAR\n"
-            + "RNode{LB=[3.4028235E38, 3.4028235E38, 3.4028235E38, 3.4028235E38], UB=[-3.4028235E38, -3.4028235E38, -3.4028235E38, -3.4028235E38], leaf=true}\n"
-            + "}>\n"
+            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEARinner:0,leaf:1,item:0;\n"
+            + " calc size: 52=4*3+2+(#inner(0)+#leaf(1)) * (2*dim(4)*4+2+4) + #item(0) * (dim(4)*4 + 2 + 8)}>\n"
             + "<{ELB_INDEX=[type: ELB_INDEX, time: 0, props: {INDEX_SLIDE_STEP=8, INDEX_WINDOW_RANGE=4}]}\n"
             + "root.wind1.azq01.speed: {ELB_INDEX=[]}>\n",
         router.toString());
@@ -173,9 +170,8 @@ public class ProtoIndexRouterTest {
     newRouter.deserializeAndReload(fakeCreateFunc);
     Assert.assertEquals(
         "<{NO_INDEX=[type: NO_INDEX, time: 10, props: {PAA_DIM=10}], RTREE_PAA=[type: RTREE_PAA, time: 5, props: {PAA_DIM=5}]}\n"
-            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEAR\n"
-            + "RNode{LB=[3.4028235E38, 3.4028235E38, 3.4028235E38, 3.4028235E38], UB=[-3.4028235E38, -3.4028235E38, -3.4028235E38, -3.4028235E38], leaf=true}\n"
-            + "}>\n"
+            + "root.wind2.*.direction: {NO_INDEX=NO_INDEX, RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEARinner:0,leaf:1,item:0;\n"
+            + " calc size: 52=4*3+2+(#inner(0)+#leaf(1)) * (2*dim(4)*4+2+4) + #item(0) * (dim(4)*4 + 2 + 8)}>\n"
             + "<{ELB_INDEX=[type: ELB_INDEX, time: 0, props: {INDEX_SLIDE_STEP=8, INDEX_WINDOW_RANGE=4}]}\n"
             + "root.wind1.azq01.speed: {ELB_INDEX=[]}>\n",
         newRouter.toString());
@@ -184,9 +180,8 @@ public class ProtoIndexRouterTest {
     newRouter.removeIndexFromRouter(new PartialPath(index_full), NO_INDEX);
     Assert.assertEquals(
         "<{RTREE_PAA=[type: RTREE_PAA, time: 5, props: {PAA_DIM=5}]}\n"
-            + "root.wind2.*.direction: {RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEAR\n"
-            + "RNode{LB=[3.4028235E38, 3.4028235E38, 3.4028235E38, 3.4028235E38], UB=[-3.4028235E38, -3.4028235E38, -3.4028235E38, -3.4028235E38], leaf=true}\n"
-            + "}>\n"
+            + "root.wind2.*.direction: {RTREE_PAA=nMax:50,nMin:2,dim:4,seedsPicker:LINEARinner:0,leaf:1,item:0;\n"
+            + " calc size: 52=4*3+2+(#inner(0)+#leaf(1)) * (2*dim(4)*4+2+4) + #item(0) * (dim(4)*4 + 2 + 8)}>\n"
             + "<{ELB_INDEX=[type: ELB_INDEX, time: 0, props: {INDEX_SLIDE_STEP=8, INDEX_WINDOW_RANGE=4}]}\n"
             + "root.wind1.azq01.speed: {ELB_INDEX=[]}>\n",
         newRouter.toString());
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/logical/IndexLogicalPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/logical/IndexLogicalPlanTest.java
index 1e09934..87ae2e8 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/logical/IndexLogicalPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/logical/IndexLogicalPlanTest.java
@@ -119,6 +119,44 @@ public class IndexLogicalPlanTest {
     Assert.assertEquals("Glu", queryOperator.getSelectedPaths().get(0).getFullPath());
     Assert.assertEquals(
         "root.Ery.*", queryOperator.getFromOperator().getPrefixPaths().get(0).getFullPath());
+    Assert.assertEquals(IndexType.ANY_FOR_QUERY, queryOperator.getIndexType());
+    Assert.assertEquals(2, queryOperator.getProps().size());
+    Assert.assertEquals(2, (int) queryOperator.getProps().get(TOP_K));
+    Assert.assertEquals(
+        "[0.0, 120.0, 20.0, 80.0, 120.0, 100.0, 80.0, 0.0]",
+        Arrays.toString((double[]) queryOperator.getProps().get(PATTERN)));
+  }
+
+  @Test
+  public void testParseQueryIndexWholeMatching2() {
+    String sqlStr =
+        "SELECT TOP 2 Glu FROM root.Ery.* WHERE Glu MMHH LIKE (0, 120, 20, 80, 120, 100, 80, 0)";
+    Operator op = generator.generate(sqlStr, ZoneId.systemDefault());
+    Assert.assertEquals(QueryOperator.class, op.getClass());
+    QueryOperator queryOperator = (QueryOperator) op;
+    Assert.assertEquals(OperatorType.QUERY, queryOperator.getType());
+    Assert.assertEquals("Glu", queryOperator.getSelectedPaths().get(0).getFullPath());
+    Assert.assertEquals(
+        "root.Ery.*", queryOperator.getFromOperator().getPrefixPaths().get(0).getFullPath());
+    Assert.assertEquals(IndexType.MMHH, queryOperator.getIndexType());
+    Assert.assertEquals(2, queryOperator.getProps().size());
+    Assert.assertEquals(2, (int) queryOperator.getProps().get(TOP_K));
+    Assert.assertEquals(
+        "[0.0, 120.0, 20.0, 80.0, 120.0, 100.0, 80.0, 0.0]",
+        Arrays.toString((double[]) queryOperator.getProps().get(PATTERN)));
+  }
+
+  @Test
+  public void testParseQueryIndexWholeMatching3() {
+    String sqlStr =
+        "SELECT TOP 2 Glu FROM root.Ery.* WHERE Glu RTREE_PAA LIKE (0, 120, 20, 80, 120, 100, 80, 0)";
+    Operator op = generator.generate(sqlStr, ZoneId.systemDefault());
+    Assert.assertEquals(QueryOperator.class, op.getClass());
+    QueryOperator queryOperator = (QueryOperator) op;
+    Assert.assertEquals(OperatorType.QUERY, queryOperator.getType());
+    Assert.assertEquals("Glu", queryOperator.getSelectedPaths().get(0).getFullPath());
+    Assert.assertEquals(
+        "root.Ery.*", queryOperator.getFromOperator().getPrefixPaths().get(0).getFullPath());
     Assert.assertEquals(IndexType.RTREE_PAA, queryOperator.getIndexType());
     Assert.assertEquals(2, queryOperator.getProps().size());
     Assert.assertEquals(2, (int) queryOperator.getProps().get(TOP_K));
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/iotdb/IoTDBInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/iotdb/IoTDBInterpreter.java
index 6c3cbd2..bf3e55e 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/iotdb/IoTDBInterpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/iotdb/IoTDBInterpreter.java
@@ -90,9 +90,9 @@ public class IoTDBInterpreter extends AbstractInterpreter {
   private static final String HELP = "help";
   private static final String IMPORT_CMD = "import";
   private static final String LOAD = "load";
-  private static final String SELECT_SERIES = "select series";
+  private static final String DRAW_SERIES = "draw series";
   static final String SET_TIMESTAMP_DISPLAY = "set time_display_type";
-  static final String SET_QUERY_TIMEOUT = "set query_time_timeout";
+  static final String SET_QUERY_TIMEOUT = "set query_timeout";
   private static final String SET_MAX_DISPLAY_NUM = "set max_display_num";
   private static final String SHOW_TIMESTAMP_DISPLAY = "show time_display_type";
   private static final String SET_TIME_ZONE = "set time_zone";
@@ -234,17 +234,33 @@ public class IoTDBInterpreter extends AbstractInterpreter {
     if (nonSupportCommandSet.contains(specialCmd)) {
       return new InterpreterResult(Code.ERROR, "Not supported in Zeppelin: " + specialCmd);
     }
-    if (specialCmd.startsWith(SELECT_SERIES.toLowerCase())) {
+    if (specialCmd.startsWith(DRAW_SERIES.toLowerCase())) {
       // no query db. draw and return
-      String line = cmd.substring(SELECT_SERIES.length(), cmd.length() - 1).trim();
-      String[] series = line.substring(1, line.length() - 1).split(",");
+      InterpreterResult interpreterResult = new InterpreterResult(Code.SUCCESS);
+      String line = cmd.substring(DRAW_SERIES.length(), cmd.length() - 1).trim();
+      String[] segments = line.substring(1, line.length() - 1).split("-");
       StringBuilder stringBuilder = new StringBuilder();
-      stringBuilder.append("Time").append(TAB).append("Value");
+      stringBuilder.append("Time");
+      for (int i = 0; i < segments.length; i++) {
+        stringBuilder.append(TAB).append("Segment-").append(i);
+      }
       stringBuilder.append(NEWLINE);
-      for (int i = 0; i < series.length; i++) {
-        stringBuilder.append(i).append(TAB).append(series[i].trim()).append(NEWLINE);
+      int idx = 0;
+      for (int segIdx = 0; segIdx < segments.length; segIdx++) {
+        String[] series = segments[segIdx].split(",");
+        for (String s : series) {
+          // insert time
+          stringBuilder.append(idx++);
+          for (int pre = 0; pre < segIdx; pre++) {
+            stringBuilder.append(TAB).append(NULL_ITEM);
+          }
+          stringBuilder.append(TAB).append(s.trim());
+          for (int after = segIdx + 1; after < segments.length; after++) {
+            stringBuilder.append(TAB).append(NULL_ITEM);
+          }
+          stringBuilder.append(NEWLINE);
+        }
       }
-      InterpreterResult interpreterResult = new InterpreterResult(Code.SUCCESS);
       interpreterResult.add(Type.TABLE, stringBuilder.toString());
       return interpreterResult;
     }
diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/iotdb/IoTDBInterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/iotdb/IoTDBInterpreterTest.java
index 7330e47..2c904b6 100644
--- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/iotdb/IoTDBInterpreterTest.java
+++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/iotdb/IoTDBInterpreterTest.java
@@ -468,14 +468,36 @@ public class IoTDBInterpreterTest {
   }
 
   @Test
-  public void testSelectSeries() {
+  public void testDrawSeries() {
     InterpreterResult actual =
-        interpreter.internalInterpret("SELECT SERIES (1.2,3.2, 18239. ,3.3))", null);
-    String gt = "user\n" + "root\n" + "user1";
+        interpreter.internalInterpret("DRAW SERIES (1.2,3.2, 18239. ,3.3))", null);
     System.out.println(actual.message().get(0).getData());
     Assert.assertNotNull(actual);
     Assert.assertEquals(Code.SUCCESS, actual.code());
 
-    //    Assert.assertEquals(gt, actual.message().get(0).getData());
+    Assert.assertEquals(
+        "Time\tSegment-0\n" + "0\t1.2\n" + "1\t3.2\n" + "2\t18239.\n" + "3\t3.3\n",
+        actual.message().get(0).getData());
+
+    actual =
+        interpreter.internalInterpret(
+            "DRAW SERIES (1.2,3.2, 18239. -3.3,2,0.12,1 - 95,8,1.0))", null);
+    System.out.println(actual.message().get(0).getData());
+    Assert.assertNotNull(actual);
+    Assert.assertEquals(Code.SUCCESS, actual.code());
+
+    Assert.assertEquals(
+        "Time\tSegment-0\tSegment-1\tSegment-2\n"
+            + "0\t1.2\tnull\tnull\n"
+            + "1\t3.2\tnull\tnull\n"
+            + "2\t18239.\tnull\tnull\n"
+            + "3\tnull\t3.3\tnull\n"
+            + "4\tnull\t2\tnull\n"
+            + "5\tnull\t0.12\tnull\n"
+            + "6\tnull\t1\tnull\n"
+            + "7\tnull\tnull\t95\n"
+            + "8\tnull\tnull\t8\n"
+            + "9\tnull\tnull\t1.0\n",
+        actual.message().get(0).getData());
   }
 }