You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2019/07/27 12:04:15 UTC

[incubator-iotdb] 02/02: add support for special float format, eg 2., .3 and .3e2

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

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

commit a4e1a7f11758585a00ee0e7995a966c16587069c
Author: RuiLei <ru...@gmail.com>
AuthorDate: Sat Jul 27 14:57:00 2019 +0800

    add support for special float format, eg 2., .3 and .3e2
---
 .../antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g |  26 ++-
 .../org/apache/iotdb/db/sql/parse/TSParser.g       |   7 +-
 .../apache/iotdb/db/qp/plan/PhysicalPlanTest.java  |  77 ++++++++
 .../org/apache/iotdb/db/sql/SQLParserTest.java     | 197 ++++++++++++++++++++-
 4 files changed, 295 insertions(+), 12 deletions(-)

diff --git a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
index 3dcc3b5..06ec5f6 100644
--- a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
+++ b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
@@ -158,17 +158,24 @@ PositiveInteger
 
 NegativeFloat
     :
-    '-' Digit+ DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
+    '-' Digit+
+    (
+      (DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?) => DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
+    |
+      (){$type=NegativeInteger;}
+    )
+    | '-' DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
     ;
 
 PositiveFloat
     :
-    '+' Digit+ DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
-    ;
-
-UnsignedInteger
-    :
-    Digit+
+    '+' Digit+
+    (
+      (DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?) => DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
+    |
+      (){$type=PositiveInteger;}
+    )
+    | '+' DOT Digit+ (('e' | 'E') ('+'|'-')? Digit+)?
     ;
 
 DoubleInScientificNotationSuffix
@@ -181,6 +188,11 @@ DoubleInScientificNotationSuffix
     )
     ;
 
+UnsignedInteger
+    :
+    Digit+
+    ;
+
 // 2017-11-1T00:15:00+08:00
 DATETIME
     :
diff --git a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
index 7a64c8d..e53c4fc 100644
--- a/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
+++ b/server/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
@@ -323,8 +323,13 @@ integer
 floatValue
     : PositiveFloat
     | NegativeFloat
-    | UnsignedInteger DOT UnsignedInteger -> ^(TOK_FLOAT_COMB UnsignedInteger DOT UnsignedInteger)
+    | PositiveInteger DOT -> PositiveInteger
+    | NegativeInteger DOT -> NegativeInteger
+    | (UnsignedInteger DOT UnsignedInteger)=>UnsignedInteger DOT UnsignedInteger -> ^(TOK_FLOAT_COMB UnsignedInteger DOT UnsignedInteger)
+    | UnsignedInteger DOT -> UnsignedInteger
+    | DOT UnsignedInteger -> ^(TOK_FLOAT_COMB DOT UnsignedInteger)
     | UnsignedInteger DoubleInScientificNotationSuffix -> ^(TOK_FLOAT_COMB UnsignedInteger DoubleInScientificNotationSuffix)
+    | DoubleInScientificNotationSuffix
     ;
 
 number
diff --git a/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java b/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
index 23abc81..ee27c55 100644
--- a/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/qp/plan/PhysicalPlanTest.java
@@ -364,4 +364,81 @@ public class PhysicalPlanTest {
         ValueFilter.gt(2.5e+2));
     assertEquals(expect.toString(), queryFilter.toString());
   }
+
+  @Test
+  public void testQueryFloat8()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > .2e2";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(0.2e+2));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat9()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > .2";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(0.2));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat10()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > 2.";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(2.0));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat11()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > +2.";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(2.0));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat12()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > -2.";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(-2.0));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat13()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > -.2";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(-0.2));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
+
+  @Test
+  public void testQueryFloat14()
+      throws QueryProcessorException, ArgsErrorException, MetadataErrorException {
+    String sqlStr = "SELECT s1 FROM root.vehicle.d1 WHERE s1 > -.2e2";
+    PhysicalPlan plan = processor.parseSQLToPhysicalPlan(sqlStr);
+    IExpression queryFilter = ((QueryPlan) plan).getExpression();
+    IExpression expect = new SingleSeriesExpression(new Path("root.vehicle.d1.s1"),
+        ValueFilter.gt(-20.0));
+    assertEquals(expect.toString(), queryFilter.toString());
+  }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/sql/SQLParserTest.java b/server/src/test/java/org/apache/iotdb/db/sql/SQLParserTest.java
index 0e3cae6..f0b6505 100644
--- a/server/src/test/java/org/apache/iotdb/db/sql/SQLParserTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/sql/SQLParserTest.java
@@ -636,6 +636,195 @@ public class SQLParserTest {
             "TOK_PATH", "device_1", "sensor_1",
             "TOK_PATH", "device_2", "sensor_2",
             "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            ".2e2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < .2e2");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query9() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "TOK_FLOAT_COMB", ".", "2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < .2");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query10() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < 2.");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query11() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "+2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < +2.");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query12() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "-2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < -2.");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query13() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "-.2"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < -.2");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query14() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
+            "TOK_WHERE",
+            "<",
+            "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1",
+            "-.2e10"
+        ));
+    ArrayList<String> rec = new ArrayList<>();
+    AstNode astTree = ParseGenerator.generateAST(
+        "SELECT device_1.sensor_1,device_2.sensor_2 FROM root.vehicle "
+            + "WHERE root.laptop.device_1.sensor_1 < -.2e10");
+    astTree = ParseUtils.findRootNonNullToken(astTree);
+    recursivePrintSon(astTree, rec);
+
+    int i = 0;
+    while (i <= rec.size() - 1) {
+      assertEquals(rec.get(i), ans.get(i));
+      i++;
+    }
+  }
+
+  @Test
+  public void query15() throws ParseException {
+    // template for test case
+    ArrayList<String> ans = new ArrayList<>(
+        Arrays.asList("TOK_QUERY", "TOK_SELECT",
+            "TOK_PATH", "device_1", "sensor_1",
+            "TOK_PATH", "device_2", "sensor_2",
+            "TOK_FROM", "TOK_PATH", "TOK_ROOT", "vehicle",
             "TOK_WHERE", "&&",
             "<", "TOK_PATH", "TOK_ROOT", "laptop", "device_1", "sensor_1", "-2.2E10",
             ">", "TOK_PATH", "time", "TOK_DATETIME", "now"));
@@ -654,7 +843,7 @@ public class SQLParserTest {
   }
 
   @Test
-  public void query9() throws ParseException {
+  public void query16() throws ParseException {
     // template for test case
     ArrayList<String> ans = new ArrayList<>(
         Arrays.asList("TOK_QUERY", "TOK_SELECT",
@@ -679,7 +868,7 @@ public class SQLParserTest {
   }
 
   @Test
-  public void query10() throws ParseException {
+  public void query17() throws ParseException {
     // template for test case
     ArrayList<String> ans = new ArrayList<>(
         Arrays.asList("TOK_QUERY", "TOK_SELECT",
@@ -703,7 +892,7 @@ public class SQLParserTest {
   }
 
   @Test
-  public void query11() throws ParseException {
+  public void query18() throws ParseException {
     // template for test case
     ArrayList<String> ans = new ArrayList<>(
         Arrays.asList("TOK_QUERY", "TOK_SELECT",
@@ -726,7 +915,7 @@ public class SQLParserTest {
   }
 
   @Test
-  public void query12() throws ParseException {
+  public void query19() throws ParseException {
     // template for test case
     ArrayList<String> ans = new ArrayList<>(
         Arrays.asList("TOK_QUERY", "TOK_SELECT",