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",