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/11/29 08:19:51 UTC

[incubator-iotdb] branch master updated: [IOTDB-298] Refactor the "last" and "first" aggregators (#594)

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


The following commit(s) were added to refs/heads/master by this push:
     new 2785bd1  [IOTDB-298] Refactor the "last" and "first" aggregators (#594)
2785bd1 is described below

commit 2785bd157597cca70f201b4bb64aa32f146f776c
Author: Yi Tao <th...@163.com>
AuthorDate: Fri Nov 29 16:19:43 2019 +0800

    [IOTDB-298] Refactor the "last" and "first" aggregators (#594)
    
    * IOTDB-298 refactor: change aggregation function's name:last to last_value, first to first_value
---
 .../5-Operation Manual/4-SQL Reference.md          | 14 +++-
 .../5-Operation Manual/4-SQL Reference.md          | 18 +++--
 ...{FirstAggrFunc.java => FirstValueAggrFunc.java} |  4 +-
 .../{LastAggrFunc.java => LastValueAggrFunc.java}  |  4 +-
 .../db/query/executor/AggregateEngineExecutor.java |  6 +-
 .../iotdb/db/query/factory/AggreFuncFactory.java   | 12 ++--
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  4 +-
 .../org/apache/iotdb/db/integration/Constant.java  |  8 +--
 .../iotdb/db/integration/IOTDBGroupByIT.java       | 28 ++++----
 .../iotdb/db/integration/IoTDBAggregationIT.java   | 34 ++++-----
 .../integration/IoTDBAggregationLargeDataIT.java   | 80 +++++++++++-----------
 .../integration/IoTDBAggregationSmallDataIT.java   | 32 ++++-----
 .../tsfile/common/constant/StatisticConstant.java  |  4 +-
 13 files changed, 134 insertions(+), 114 deletions(-)

diff --git a/docs/Documentation-CHN/UserGuide/5-Operation Manual/4-SQL Reference.md b/docs/Documentation-CHN/UserGuide/5-Operation Manual/4-SQL Reference.md
index f45bf35..a8f74b3 100644
--- a/docs/Documentation-CHN/UserGuide/5-Operation Manual/4-SQL Reference.md	
+++ b/docs/Documentation-CHN/UserGuide/5-Operation Manual/4-SQL Reference.md	
@@ -495,11 +495,19 @@ Eg. SELECT COUNT(status), COUNT(temperature) FROM root.ln.wf01.wt01 WHERE root.l
 Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
 ```
 
-* FIRST
+* FIRST_VALUE
+原有的 `FIRST` 方法在 `v0.10.0` 版本更名为 `FIRST_VALUE`。
+```
+SELECT FIRST_VALUE (Path) (COMMA FIRST_VALUE (Path))* FROM <FromClause> [WHERE <WhereClause>]?
+Eg. SELECT FIRST_VALUE (status), FIRST_VALUE (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
+Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
+```
 
+* LAST_VALUE
+原有的 `LAST` 方法在 `v0.10.0` 版本更名为 `LAST_VALUE`。
 ```
-SELECT FIRST (Path) (COMMA FIRST (Path))* FROM <FromClause> [WHERE <WhereClause>]?
-Eg. SELECT FIRST (status), FIRST (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
+SELECT LAST_VALUE (Path) (COMMA LAST_VALUE (Path))* FROM <FromClause> [WHERE <WhereClause>]?
+Eg. SELECT LAST_VALUE (status), LAST_VALUE (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
 Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
 ```
 
diff --git a/docs/Documentation/UserGuide/5-Operation Manual/4-SQL Reference.md b/docs/Documentation/UserGuide/5-Operation Manual/4-SQL Reference.md
index 88982f1..ff98ea6 100644
--- a/docs/Documentation/UserGuide/5-Operation Manual/4-SQL Reference.md	
+++ b/docs/Documentation/UserGuide/5-Operation Manual/4-SQL Reference.md	
@@ -579,13 +579,23 @@ Eg. SELECT COUNT(status), COUNT(temperature) FROM root.ln.wf01.wt01 WHERE root.l
 Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
 ```
 
-* FIRST
+* FIRST_VALUE(Rename from `FIRST` at `V0.10.0`)
 
-The FIRST function returns the first point value of the choosen timeseries(one or more).
+The FIRST_VALUE function returns the first point value of the choosen timeseries(one or more).
 
 ```
-SELECT FIRST (Path) (COMMA FIRST (Path))* FROM <FromClause> [WHERE <WhereClause>]?
-Eg. SELECT FIRST (status), FIRST (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
+SELECT FIRST_VALUE (Path) (COMMA FIRST_VALUE (Path))* FROM <FromClause> [WHERE <WhereClause>]?
+Eg. SELECT FIRST_VALUE (status), FIRST_VALUE (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
+Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
+```
+
+* LAST_VALUE(Rename from `LAST` at `V0.10.0`)
+
+The LAST_VALUE function returns the last point value of the choosen timeseries(one or more).
+
+```
+SELECT LAST_VALUE (Path) (COMMA LAST_VALUE (Path))* FROM <FromClause> [WHERE <WhereClause>]?
+Eg. SELECT LAST_VALUE (status), LAST_VALUE (temperature) FROM root.ln.wf01.wt01 WHERE root.ln.wf01.wt01.temperature < 24
 Note: the statement needs to satisfy this constraint: <PrefixPath> + <Path> = <Timeseries>
 ```
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrFunc.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java
rename to server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrFunc.java
index 58b6069..25288ef 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstAggrFunc.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/FirstValueAggrFunc.java
@@ -29,9 +29,9 @@ import org.apache.iotdb.tsfile.file.header.PageHeader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
 
-public class FirstAggrFunc extends AggregateFunction {
+public class FirstValueAggrFunc extends AggregateFunction {
 
-  public FirstAggrFunc(TSDataType dataType) {
+  public FirstValueAggrFunc(TSDataType dataType) {
     super(dataType);
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrFunc.java
similarity index 97%
rename from server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java
rename to server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrFunc.java
index 7a4687b..ac51f37 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastAggrFunc.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/aggregation/impl/LastValueAggrFunc.java
@@ -29,9 +29,9 @@ import org.apache.iotdb.tsfile.file.header.PageHeader;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
 
-public class LastAggrFunc extends AggregateFunction {
+public class LastValueAggrFunc extends AggregateFunction {
 
-  public LastAggrFunc(TSDataType dataType) {
+  public LastValueAggrFunc(TSDataType dataType) {
     super(dataType);
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
index 8978cdc..e9e4bca 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregateEngineExecutor.java
@@ -30,7 +30,7 @@ import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.query.aggregation.AggreResultData;
 import org.apache.iotdb.db.query.aggregation.AggregateFunction;
-import org.apache.iotdb.db.query.aggregation.impl.LastAggrFunc;
+import org.apache.iotdb.db.query.aggregation.impl.LastValueAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.MaxTimeAggrFunc;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
@@ -105,7 +105,7 @@ public class AggregateEngineExecutor {
 
       // sequence reader for sealed tsfile, unsealed tsfile, memory
       IAggregateReader seqResourceIterateReader;
-      if (function instanceof MaxTimeAggrFunc || function instanceof LastAggrFunc) {
+      if (function instanceof MaxTimeAggrFunc || function instanceof LastValueAggrFunc) {
         seqResourceIterateReader = new SeqResourceIterateReader(queryDataSource.getSeriesPath(),
             queryDataSource.getSeqResources(), timeFilter, context, true);
       } else {
@@ -143,7 +143,7 @@ public class AggregateEngineExecutor {
   private AggreResultData aggregateWithoutValueFilter(AggregateFunction function,
       IAggregateReader sequenceReader, IPointReader unSequenceReader, Filter filter)
       throws IOException, QueryProcessException {
-    if (function instanceof MaxTimeAggrFunc || function instanceof LastAggrFunc) {
+    if (function instanceof MaxTimeAggrFunc || function instanceof LastValueAggrFunc) {
       return handleLastMaxTimeWithOutTimeGenerator(function, sequenceReader, unSequenceReader,
           filter);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java b/server/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
index aecb9a1..24f893a 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/factory/AggreFuncFactory.java
@@ -23,8 +23,8 @@ import org.apache.iotdb.db.exception.path.PathException;
 import org.apache.iotdb.db.query.aggregation.AggregateFunction;
 import org.apache.iotdb.db.query.aggregation.impl.AvgAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.CountAggrFunc;
-import org.apache.iotdb.db.query.aggregation.impl.FirstAggrFunc;
-import org.apache.iotdb.db.query.aggregation.impl.LastAggrFunc;
+import org.apache.iotdb.db.query.aggregation.impl.FirstValueAggrFunc;
+import org.apache.iotdb.db.query.aggregation.impl.LastValueAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.MaxTimeAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.MaxValueAggrFunc;
 import org.apache.iotdb.db.query.aggregation.impl.MinTimeAggrFunc;
@@ -66,12 +66,12 @@ public class AggreFuncFactory {
         return new CountAggrFunc();
       case StatisticConstant.AVG:
         return new AvgAggrFunc(dataType);
-      case StatisticConstant.FIRST:
-        return new FirstAggrFunc(dataType);
+      case StatisticConstant.FIRST_VALUE:
+        return new FirstValueAggrFunc(dataType);
       case StatisticConstant.SUM:
         return new SumAggrFunc(dataType);
-      case StatisticConstant.LAST:
-        return new LastAggrFunc(dataType);
+      case StatisticConstant.LAST_VALUE:
+        return new LastValueAggrFunc(dataType);
       default:
         throw new PathException(
             "aggregate does not support " + aggrFuncName + " function.");
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index b8a6583..1f113d8 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -182,8 +182,8 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         case StatisticConstant.MAX_TIME:
         case StatisticConstant.COUNT:
           return TSDataType.INT64;
-        case StatisticConstant.LAST:
-        case StatisticConstant.FIRST:
+        case StatisticConstant.LAST_VALUE:
+        case StatisticConstant.FIRST_VALUE:
         case StatisticConstant.MIN_VALUE:
         case StatisticConstant.MAX_VALUE:
           return getSeriesType(innerPath);
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/Constant.java b/server/src/test/java/org/apache/iotdb/db/integration/Constant.java
index da2b08a..c606d68 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/Constant.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/Constant.java
@@ -51,12 +51,12 @@ public class Constant {
 
   public static String insertTemplate = "insert into %s(timestamp%s) values(%d%s)";
 
-  public static String first(String path) {
-    return String.format("first(%s)", path);
+  public static String first_value(String path) {
+    return String.format("first_value(%s)", path);
   }
 
-  public static String last(String path) {
-    return String.format("last(%s)", path);
+  public static String last_value(String path) {
+    return String.format("last_value(%s)", path);
   }
 
   public static String sum(String path) {
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
index 6755b52..d54a1e0 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IOTDBGroupByIT.java
@@ -21,8 +21,8 @@ package org.apache.iotdb.db.integration;
 
 import static org.apache.iotdb.db.integration.Constant.avg;
 import static org.apache.iotdb.db.integration.Constant.count;
-import static org.apache.iotdb.db.integration.Constant.first;
-import static org.apache.iotdb.db.integration.Constant.last;
+import static org.apache.iotdb.db.integration.Constant.first_value;
+import static org.apache.iotdb.db.integration.Constant.last_value;
 import static org.apache.iotdb.db.integration.Constant.max_time;
 import static org.apache.iotdb.db.integration.Constant.max_value;
 import static org.apache.iotdb.db.integration.Constant.min_time;
@@ -306,7 +306,7 @@ public class IOTDBGroupByIT {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
       boolean hasResultSet = statement.execute(
-          "select last(temperature), first(temperature) from root.ln.wf01.wt01 where time > 3 "
+          "select last_value(temperature), first_value(temperature) from root.ln.wf01.wt01 where time > 3 "
               + "GROUP BY (20ms, 5,[2,30], [35,37], [50, 160], [310, 314])");
 
       Assert.assertTrue(hasResultSet);
@@ -315,8 +315,8 @@ public class IOTDBGroupByIT {
         cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
-              .getString(last("root.ln.wf01.wt01.temperature"))
-              + "," + resultSet.getString(first("root.ln.wf01.wt01.temperature"));
+              .getString(last_value("root.ln.wf01.wt01.temperature"))
+              + "," + resultSet.getString(first_value("root.ln.wf01.wt01.temperature"));
           Assert.assertEquals(retArray1[cnt], ans);
           cnt++;
         }
@@ -324,7 +324,7 @@ public class IOTDBGroupByIT {
       }
 
       hasResultSet = statement.execute(
-          "select first(temperature), last(temperature) from root.ln.wf01.wt01 "
+          "select first_value(temperature), last_value(temperature) from root.ln.wf01.wt01 "
               + "where temperature > 3 "
               + "GROUP BY (20ms, 5,[2,30], [35,37], [50, 160], [310, 314])");
 
@@ -333,8 +333,8 @@ public class IOTDBGroupByIT {
         cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
-              .getString(last("root.ln.wf01.wt01.temperature"))
-              + "," + resultSet.getString(first("root.ln.wf01.wt01.temperature"));
+              .getString(last_value("root.ln.wf01.wt01.temperature"))
+              + "," + resultSet.getString(first_value("root.ln.wf01.wt01.temperature"));
           Assert.assertEquals(retArray2[cnt], ans);
           cnt++;
         }
@@ -427,7 +427,7 @@ public class IOTDBGroupByIT {
         Statement statement = connection.createStatement()) {
 
       boolean hasResultSet = statement.execute(
-          "select last(temperature), first(temperature), sum(temperature) from "
+          "select last_value(temperature), first_value(temperature), sum(temperature) from "
               + "root.ln.wf01.wt01 where time > 3 "
               + "GROUP BY (80ms, 30,[50,100], [615, 650])");
 
@@ -436,8 +436,8 @@ public class IOTDBGroupByIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
-              .getString(last("root.ln.wf01.wt01.temperature"))
-              + "," + resultSet.getString(first("root.ln.wf01.wt01.temperature")) + ","
+              .getString(last_value("root.ln.wf01.wt01.temperature"))
+              + "," + resultSet.getString(first_value("root.ln.wf01.wt01.temperature")) + ","
               + resultSet.getString(sum("root.ln.wf01.wt01.temperature"));
           Assert.assertEquals(retArray1[cnt], ans);
           cnt++;
@@ -446,7 +446,7 @@ public class IOTDBGroupByIT {
       }
 
       hasResultSet = statement.execute(
-          "select first(temperature), last(temperature), sum(temperature) from "
+          "select first_value(temperature), last_value(temperature), sum(temperature) from "
               + "root.ln.wf01.wt01 where temperature > 3 "
               + "GROUP BY (80ms, 30,[50,100], [585,590], [615, 650])");
 
@@ -455,8 +455,8 @@ public class IOTDBGroupByIT {
         cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet
-              .getString(last("root.ln.wf01.wt01.temperature"))
-              + "," + resultSet.getString(first("root.ln.wf01.wt01.temperature")) + ","
+              .getString(last_value("root.ln.wf01.wt01.temperature"))
+              + "," + resultSet.getString(first_value("root.ln.wf01.wt01.temperature")) + ","
               + resultSet.getString(sum("root.ln.wf01.wt01.temperature"));
           Assert.assertEquals(retArray2[cnt], ans);
           cnt++;
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
index f9e0efa..6db444c 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
@@ -210,7 +210,7 @@ public class IoTDBAggregationIT {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
 
-      boolean hasResultSet = statement.execute("select first(s0),first(s1),first(s2),first(s3) " +
+      boolean hasResultSet = statement.execute("select first_value(s0),first_value(s1),first_value(s2),first_value(s3) " +
           "from root.vehicle.d0 where time >= 1500 and time <= 9000");
 
       Assert.assertTrue(hasResultSet);
@@ -219,24 +219,24 @@ public class IoTDBAggregationIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         cnt = 0;
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first(d0s0))
-              + "," + resultSet.getString(first(d0s1)) + "," + resultSet.getString(first(d0s2))
-              + "," + resultSet.getString(first(d0s3));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first_value(d0s0))
+              + "," + resultSet.getString(first_value(d0s1)) + "," + resultSet.getString(first_value(d0s2))
+              + "," + resultSet.getString(first_value(d0s3));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
         Assert.assertEquals(1, cnt);
       }
 
-      hasResultSet = statement.execute("select first(s0),first(s1),first(s2),first(s3) " +
+      hasResultSet = statement.execute("select first_value(s0),first_value(s1),first_value(s2),first_value(s3) " +
           "from root.vehicle.d0");
 
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first(d0s0))
-              + "," + resultSet.getString(first(d0s1)) + "," + resultSet.getString(first(d0s2))
-              + "," + resultSet.getString(first(d0s3));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first_value(d0s0))
+              + "," + resultSet.getString(first_value(d0s1)) + "," + resultSet.getString(first_value(d0s2))
+              + "," + resultSet.getString(first_value(d0s3));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
@@ -259,7 +259,7 @@ public class IoTDBAggregationIT {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
 
-      boolean hasResultSet = statement.execute("select last(s0),last(s2) " +
+      boolean hasResultSet = statement.execute("select last_value(s0),last_value(s2) " +
           "from root.vehicle.d0 where time >= 1500 and time < 9000");
 
       Assert.assertTrue(hasResultSet);
@@ -267,36 +267,36 @@ public class IoTDBAggregationIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         cnt = 0;
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last(d0s0))
-              + "," + resultSet.getString(last(d0s2));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last_value(d0s0))
+              + "," + resultSet.getString(last_value(d0s2));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
         Assert.assertEquals(1, cnt);
       }
 
-      hasResultSet = statement.execute("select last(s0),last(s2) " +
+      hasResultSet = statement.execute("select last_value(s0),last_value(s2) " +
           "from root.vehicle.d0 where time <= 1600");
 
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last(d0s0))
-              + "," + resultSet.getString(last(d0s2));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last_value(d0s0))
+              + "," + resultSet.getString(last_value(d0s2));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
         Assert.assertEquals(2, cnt);
       }
 
-      hasResultSet = statement.execute("select last(s0),last(s2) " +
+      hasResultSet = statement.execute("select last_value(s0),last_value(s2) " +
           "from root.vehicle.d0 where time <= 2200");
 
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last(d0s0))
-              + "," + resultSet.getString(last(d0s2));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last_value(d0s0))
+              + "," + resultSet.getString(last_value(d0s2));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationLargeDataIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationLargeDataIT.java
index badb1ee..e96dcbc 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationLargeDataIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationLargeDataIT.java
@@ -21,9 +21,11 @@ package org.apache.iotdb.db.integration;
 
 import static org.apache.iotdb.db.integration.Constant.avg;
 import static org.apache.iotdb.db.integration.Constant.count;
-import static org.apache.iotdb.db.integration.Constant.first;
+import static org.apache.iotdb.db.integration.Constant.first_value;
+import static org.apache.iotdb.db.integration.Constant.last_value;
 import static org.apache.iotdb.db.integration.Constant.max_time;
 import static org.apache.iotdb.db.integration.Constant.max_value;
+import static org.apache.iotdb.db.integration.Constant.min_time;
 import static org.apache.iotdb.db.integration.Constant.min_value;
 import static org.apache.iotdb.db.integration.Constant.sum;
 import static org.junit.Assert.fail;
@@ -131,7 +133,7 @@ public class IoTDBAggregationLargeDataIT {
 
     try (Connection connection = DriverManager.
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");) {
-      lastAggreWithSingleFilterTest();
+      lastValueAggreWithSingleFilterTest();
       avgAggreWithSingleFilterTest();
       sumAggreWithSingleFilterTest();
       firstAggreWithSingleFilterTest();
@@ -140,7 +142,7 @@ public class IoTDBAggregationLargeDataIT {
       minValueAggreWithSingleFilterTest();
       maxValueAggreWithSingleFilterTest();
 
-      lastAggreWithMultiFilterTest();
+      lastValueAggreWithMultiFilterTest();
       countAggreWithMultiFilterTest();
       minTimeAggreWithMultiFilterTest();
       maxTimeAggreWithMultiFilterTest();
@@ -152,7 +154,7 @@ public class IoTDBAggregationLargeDataIT {
     }
   }
 
-  private void lastAggreWithMultiFilterTest() throws SQLException {
+  private void lastValueAggreWithMultiFilterTest() throws SQLException {
     String[] retArray = new String[]{
         "0,9,39,63.0,E,true"
     };
@@ -161,18 +163,18 @@ public class IoTDBAggregationLargeDataIT {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
       boolean hasResultSet = statement.execute(
-          "select last(s0),last(s1),last(s2),last(s3),last(s4)" +
+          "select last_value(s0),last_value(s1),last_value(s2),last_value(s3),last_value(s4)" +
               " from root.vehicle.d0 where s1 >= 0");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," +
-              resultSet.getString(Constant.last(d0s0)) + "," + resultSet
-              .getString(Constant.last(d0s1))
-              + "," + resultSet.getString(Constant.last(d0s2)) + "," +
-              resultSet.getString(Constant.last(d0s3)) + "," + resultSet
-              .getString(Constant.last(d0s4));
+              resultSet.getString(last_value(d0s0)) + "," + resultSet
+              .getString(last_value(d0s1))
+              + "," + resultSet.getString(last_value(d0s2)) + "," +
+              resultSet.getString(last_value(d0s3)) + "," + resultSet
+              .getString(last_value(d0s4));
           // System.out.println("============ " + ans);
           Assert.assertEquals(ans, retArray[cnt]);
           cnt++;
@@ -185,7 +187,7 @@ public class IoTDBAggregationLargeDataIT {
     }
   }
 
-  private void lastAggreWithSingleFilterTest() throws SQLException {
+  private void lastValueAggreWithSingleFilterTest() throws SQLException {
     String[] retArray = new String[]{
         "0,9,39,63.0"
     };
@@ -193,16 +195,16 @@ public class IoTDBAggregationLargeDataIT {
     try (Connection connection = DriverManager.
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
-      boolean hasResultSet = statement.execute("select last(s0),last(s1),last(s2)" +
+      boolean hasResultSet = statement.execute("select last_value(s0),last_value(s1),last_value(s2)" +
           " from root.vehicle.d0 where s1 >= 0");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," +
-              resultSet.getString(Constant.last(d0s0)) + ","
-              + resultSet.getString(Constant.last(d0s1)) + "," +
-              resultSet.getString(Constant.last(d0s2));
+              resultSet.getString(last_value(d0s0)) + ","
+              + resultSet.getString(last_value(d0s1)) + "," +
+              resultSet.getString(last_value(d0s2));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
@@ -231,7 +233,7 @@ Statement statement = connection.createStatement()) {
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(sum(d0s0)) + ","
               + resultSet.getString(sum(d0s1)) + "," + Math
-              .round(resultSet.getDouble(Constant.sum(d0s2)));
+              .round(resultSet.getDouble(sum(d0s2)));
           Assert.assertEquals(ans, retArray[cnt]);
           cnt++;
         }
@@ -252,18 +254,18 @@ Statement statement = connection.createStatement()) {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
 
-      boolean hasResultSet = statement.execute("select first(s0),first(s1),first(s2),first(s3),"
-          + "first(s4) from root.vehicle.d0 where s1 >= 0");
+      boolean hasResultSet = statement.execute("select first_value(s0),first_value(s1),first_value(s2),first_value(s3),"
+          + "first_value(s4) from root.vehicle.d0 where s1 >= 0");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int cnt = 0;
         while (resultSet.next()) {
           String ans = resultSet.getString(TIMESTAMP_STR) + "," +
-              resultSet.getString(Constant.first(d0s0)) + ","
-              + resultSet.getString(Constant.first(d0s1)) + "," +
-              resultSet.getString(Constant.first(d0s2))
-              + "," + resultSet.getString(Constant.first(d0s3)) + "," +
-              resultSet.getString(Constant.first(d0s4));
+              resultSet.getString(first_value(d0s0)) + ","
+              + resultSet.getString(first_value(d0s1)) + "," +
+              resultSet.getString(first_value(d0s2))
+              + "," + resultSet.getString(first_value(d0s3)) + "," +
+              resultSet.getString(first_value(d0s4));
           Assert.assertEquals(ans, retArray[cnt]);
           cnt++;
         }
@@ -352,11 +354,11 @@ Statement statement = connection.createStatement()) {
       int cnt = 0;
       while (resultSet.next()) {
         String ans = resultSet.getString(TIMESTAMP_STR) + "," +
-            resultSet.getString(Constant.min_time(d0s0)) + "," +
-            resultSet.getString(Constant.min_time(d0s1)) + "," +
-            resultSet.getString(Constant.min_time(d0s2)) +
-            "," + resultSet.getString(Constant.min_time(d0s3)) +
-            "," + resultSet.getString(Constant.min_time(d0s4));
+            resultSet.getString(min_time(d0s0)) + "," +
+            resultSet.getString(min_time(d0s1)) + "," +
+            resultSet.getString(min_time(d0s2)) +
+            "," + resultSet.getString(min_time(d0s3)) +
+            "," + resultSet.getString(min_time(d0s4));
         Assert.assertEquals(ans, retArray[cnt]);
         cnt++;
       }
@@ -532,16 +534,16 @@ Statement statement = connection.createStatement()) {
         getConnection("jdbc:iotdb://127.0.0.1:6667/", "root", "root");
 Statement statement = connection.createStatement()) {
 
-      boolean hasResultSet = statement.execute("select first(s0),first(s1),first(s2),first(s3),"
-          + "first(s4) from root.vehicle.d0 where s1 >= 0 or s2 < 10");
+      boolean hasResultSet = statement.execute("select first_value(s0),first_value(s1),first_value(s2),first_value(s3),"
+          + "first_value(s4) from root.vehicle.d0 where s1 >= 0 or s2 < 10");
       Assert.assertTrue(hasResultSet);
       ResultSet resultSet = statement.getResultSet();
       int cnt = 0;
       while (resultSet.next()) {
-        String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first(d0s0))
-            + "," + resultSet.getString(first(d0s1)) + "," + resultSet.getString(first(d0s2))
-            + "," + resultSet.getString(first(d0s3)) + "," + resultSet.getString(first(d0s4));
-        //String ans = resultSet.getString(first(d0s3));
+        String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first_value(d0s0))
+            + "," + resultSet.getString(first_value(d0s1)) + "," + resultSet.getString(first_value(d0s2))
+            + "," + resultSet.getString(first_value(d0s3)) + "," + resultSet.getString(first_value(d0s4));
+        //String ans = resultSet.getString(first_value(d0s3));
         //System.out.println("!!!!!============ " + ans);
         Assert.assertEquals(retArray[cnt], ans);
         cnt++;
@@ -601,11 +603,11 @@ Statement statement = connection.createStatement()) {
       int cnt = 0;
       while (resultSet.next()) {
         String ans = resultSet.getString(TIMESTAMP_STR) + "," +
-            resultSet.getString(Constant.min_time(d0s0)) + "," +
-            resultSet.getString(Constant.min_time(d0s1)) + "," +
-            resultSet.getString(Constant.min_time(d0s2)) + "," +
-            resultSet.getString(Constant.min_time(d0s3)) + "," +
-            resultSet.getString(Constant.min_time(d0s4));
+            resultSet.getString(min_time(d0s0)) + "," +
+            resultSet.getString(min_time(d0s1)) + "," +
+            resultSet.getString(min_time(d0s2)) + "," +
+            resultSet.getString(min_time(d0s3)) + "," +
+            resultSet.getString(min_time(d0s4));
         // System.out.println("============ " + ans);
         Assert.assertEquals(ans, retArray[cnt]);
         cnt++;
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationSmallDataIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationSmallDataIT.java
index 3b6a453..959af04 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationSmallDataIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationSmallDataIT.java
@@ -21,8 +21,8 @@ package org.apache.iotdb.db.integration;
 
 import static org.apache.iotdb.db.integration.Constant.avg;
 import static org.apache.iotdb.db.integration.Constant.count;
-import static org.apache.iotdb.db.integration.Constant.first;
-import static org.apache.iotdb.db.integration.Constant.last;
+import static org.apache.iotdb.db.integration.Constant.first_value;
+import static org.apache.iotdb.db.integration.Constant.last_value;
 import static org.apache.iotdb.db.integration.Constant.max_time;
 import static org.apache.iotdb.db.integration.Constant.max_value;
 import static org.apache.iotdb.db.integration.Constant.min_time;
@@ -218,28 +218,28 @@ public class IoTDBAggregationSmallDataIT {
         Assert.assertEquals(2, cnt);
       }
 
-      //select first(d0.s0),first(d1.s1),first(d0.s3) from root.vehicle
+      //select first_value(d0.s0),first_value(d1.s1),first_value(d0.s3) from root.vehicle
       hasResultSet = statement.execute(
-          "select first(d0.s0),first(d1.s1),first(d0.s3) from root.vehicle");
+          "select first_value(d0.s0),first_value(d1.s1),first_value(d0.s3) from root.vehicle");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first(d0s0))
-              + "," + resultSet.getString(first(d1s1)) + "," + resultSet.getString(first(d0s3));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first_value(d0s0))
+              + "," + resultSet.getString(first_value(d1s1)) + "," + resultSet.getString(first_value(d0s3));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
         Assert.assertEquals(3, cnt);
       }
 
-      //select last(d0.s0),last(d1.s1),last(d0.s3) from root.vehicle
+      //select last_value(d0.s0),last_value(d1.s1),last_value(d0.s3) from root.vehicle
       hasResultSet = statement.execute(
-          "select last(d0.s0),last(d1.s1),last(d0.s3) from root.vehicle");
+          "select last_value(d0.s0),last_value(d1.s1),last_value(d0.s3) from root.vehicle");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
-          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last(d0s0))
-              + "," + resultSet.getString(last(d1s1)) + "," + resultSet.getString(last(d0s3));
+          String ans = resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last_value(d0s0))
+              + "," + resultSet.getString(last_value(d1s1)) + "," + resultSet.getString(last_value(d0s3));
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
         }
@@ -276,14 +276,14 @@ public class IoTDBAggregationSmallDataIT {
         Statement statement = connection.createStatement()) {
 
       boolean hasResultSet = statement.execute(
-          "select last(s0),last(s1) from root.vehicle.d0 where s2 >= 3.33");
+          "select last_value(s0),last_value(s1) from root.vehicle.d0 where s2 >= 3.33");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int cnt = 0;
         while (resultSet.next()) {
           String ans =
-              resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last(d0s0)) + ","
-                  + resultSet.getString(last(d0s1));
+              resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(last_value(d0s0)) + ","
+                  + resultSet.getString(last_value(d0s1));
           //System.out.println("!!!!!============ " + ans);
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
@@ -307,14 +307,14 @@ public class IoTDBAggregationSmallDataIT {
         Statement statement = connection.createStatement();) {
 
       boolean hasResultSet = statement.execute(
-          "select first(s0),first(s1) from root.vehicle.d0 where s2 >= 3.33");
+          "select first_value(s0),first_value(s1) from root.vehicle.d0 where s2 >= 3.33");
       Assert.assertTrue(hasResultSet);
       try (ResultSet resultSet = statement.getResultSet()) {
         int cnt = 0;
         while (resultSet.next()) {
           String ans =
-              resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first(d0s0)) + ","
-                  + resultSet.getString(first(d0s1));
+              resultSet.getString(TIMESTAMP_STR) + "," + resultSet.getString(first_value(d0s0)) + ","
+                  + resultSet.getString(first_value(d0s1));
           //System.out.println("!!!!!============ " + ans);
           Assert.assertEquals(retArray[cnt], ans);
           cnt++;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/StatisticConstant.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/StatisticConstant.java
index fb1c02a..f41cca4 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/StatisticConstant.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/common/constant/StatisticConstant.java
@@ -29,13 +29,13 @@ public class StatisticConstant {
 
   public static final String COUNT = "count";
 
-  public static final String FIRST = "first";
+  public static final String FIRST_VALUE = "first_value";
 
   public static final String AVG = "avg";
 
   public static final String SUM = "sum";
 
-  public static final String LAST = "last";
+  public static final String LAST_VALUE = "last_value";
 
   private StatisticConstant(){}
 }