You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by le...@apache.org on 2022/02/14 04:06:55 UTC

[iotdb] 21/32: for exp

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

leirui pushed a commit to branch research/M4-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit d7252fdfddfbd3d31683219dbe57ae91b63b8511
Author: Lei Rui <10...@qq.com>
AuthorDate: Mon Feb 7 11:28:50 2022 +0800

    for exp
---
 example/session/pom.xml                            |   6 +-
 .../org/apache/iotdb/queryExp/QueryFullGame.java   |  31 +++--
 .../apache/iotdb/queryExp/QueryFullGame_old.java   | 104 +++++++++++++++
 .../{QueryFullGameVaryTqe.java => QueryMF03.java}  |  45 ++++---
 .../{QueryFullGameVaryW.java => QueryRecTime.java} |  44 +++---
 .../iotdb/queryExp/QuerySyntheticData1VaryW.java   | 109 ---------------
 ...ntheticData1VaryTqe.java => QueryTianyuan.java} |  59 +++++----
 ...disorder-0delete-varyW-compare-loadDataOnly.png | Bin 51940 -> 0 bytes
 ...1-0disorder-0delete-varyW-compare-totalOnly.png | Bin 45421 -> 0 bytes
 .../synData1-0disorder-0delete-varyW-compare.png   | Bin 65501 -> 0 bytes
 .../synData1-0disorder-0delete-varyW-cpv.png       | Bin 48624 -> 0 bytes
 .../synData1-0disorder-0delete-varyW-mac.png       | Bin 38037 -> 0 bytes
 .../synData1-0disorder-0delete-varyW-moc.png       | Bin 49967 -> 0 bytes
 .../iotdb/writeData/ExtractDebs2012Data.java       |  71 +++++-----
 .../iotdb/writeData/ExtractFullGameData.java       |   3 +-
 ...ctDebs2012Data.java => ExtractRecTimeData.java} |  53 ++------
 .../{ExtractDebug.java => ExtractTianyuan.java}    |  25 ++--
 .../apache/iotdb/writeData/TestFullGameTmp.java    |  32 -----
 .../org/apache/iotdb/writeData/WriteFullGame.java  |  87 +++++++-----
 .../writeData/WriteFullGameDisorderedToIoTDB.java  | 104 +++++++--------
 .../WriteFullGameDisorderedWithDeletes.java        | 147 +++++++++++----------
 .../iotdb/writeData/WriteFullGameToIoTDB.java      | 108 +++++++--------
 .../{WriteFullGame.java => WriteFullGame_old.java} |   2 +-
 .../java/org/apache/iotdb/writeData/WriteMF03.java | 116 ++++++++++++++++
 .../org/apache/iotdb/writeData/WriteRecTime.java   | 114 ++++++++++++++++
 .../iotdb/writeData/WriteSyntheticData1.java       |  92 ++++++-------
 .../writeData/WriteSyntheticDataWithDeletes.java   | 127 +++++++++---------
 .../org/apache/iotdb/writeData/WriteTianyuan.java  | 114 ++++++++++++++++
 28 files changed, 968 insertions(+), 625 deletions(-)

diff --git a/example/session/pom.xml b/example/session/pom.xml
index b709546..8ea7d26 100644
--- a/example/session/pom.xml
+++ b/example/session/pom.xml
@@ -26,8 +26,8 @@
         <version>0.12.4</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>WriteFullGame</artifactId>
-    <name>WriteFullGame</name>
+    <artifactId>QueryRecTime</artifactId>
+    <name>QueryRecTime</name>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.7</maven.compiler.source>
@@ -61,7 +61,7 @@
                         <configuration>
                             <transformers>
                                 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>org.apache.iotdb.writeData.WriteFullGame</mainClass>
+                                    <mainClass>org.apache.iotdb.queryExp.QueryRecTime</mainClass>
                                 </transformer>
                             </transformers>
                         </configuration>
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame.java
index c2411dd..a8fb254 100644
--- a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame.java
+++ b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame.java
@@ -14,11 +14,11 @@ public class QueryFullGame {
   //       => Don't change the sequence of the above six aggregates!
   // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
   // IntervalLength!
-  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
+  // * (3) NOTE the time unit of interval. Update for different datasets!
   private static final String queryFormat =
       "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s) "
           + "from %s "
-          + "group by ([%d, %d), %dns)";
+          + "group by ([%d, %d), %dns)"; // note this "ns" time precision
 
   private static final String queryFormat_UDF =
       "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and time<%4$d";
@@ -30,10 +30,12 @@ public class QueryFullGame {
     // fixed time series path
     String measurement = "s6";
     String device = "root.game";
-    // fixed tqs
-    long minTime = 0L;
-    // 实验自变量1:tqe
-    long maxTime = Long.parseLong(args[0]);
+    // used to bound tqs random position
+    long dataMinTime = 0;
+    long dataMaxTime = 617426057627L; // 617426057626+1
+
+    // 实验自变量1:[tqs,tqe) range length, i.e., tqe-tqs
+    long range = Long.parseLong(args[0]);
     // 实验自变量2:w数量
     int intervalNum = Integer.parseInt(args[1]);
     // 实验自变量3:方法
@@ -55,13 +57,24 @@ public class QueryFullGame {
       }
     }
 
+    long minTime;
+    long maxTime;
+    long interval;
+    if (range >= (dataMaxTime - dataMinTime)) {
+      minTime = dataMinTime;
+      interval = (long) Math.ceil((double) (dataMaxTime - dataMinTime) / intervalNum);
+    } else {
+      // randomize between [dataMinTime, dataMaxTime-range]
+      minTime =
+          (long) Math.ceil(dataMinTime + Math.random() * (dataMaxTime - range - dataMinTime + 1));
+      interval = (long) Math.ceil((double) range / intervalNum);
+    }
+    maxTime = minTime + interval * intervalNum;
+
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open(false);
     session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
 
-    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
-    maxTime = minTime + interval * intervalNum;
-
     String sql;
     if (approach == 1) { // MAC UDF
       sql =
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame_old.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame_old.java
new file mode 100644
index 0000000..a86d45a
--- /dev/null
+++ b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGame_old.java
@@ -0,0 +1,104 @@
+// package org.apache.iotdb.queryExp;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.session.SessionDataSet;
+// import org.apache.iotdb.tsfile.read.common.RowRecord;
+//
+// import org.apache.thrift.TException;
+//
+// public class QueryFullGame {
+//
+//  // * (1) min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s),
+// max_value(%s)
+//  //       => Don't change the sequence of the above six aggregates!
+//  // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
+//  // IntervalLength!
+//  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
+//  private static final String queryFormat =
+//      "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s),
+// max_value(%s) "
+//          + "from %s "
+//          + "group by ([%d, %d), %dns)";
+//
+//  private static final String queryFormat_UDF =
+//      "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and
+// time<%4$d";
+//
+//  public static Session session;
+//
+//  public static void main(String[] args)
+//      throws IoTDBConnectionException, StatementExecutionException, TException {
+//    // fixed time series path
+//    String measurement = "s6";
+//    String device = "root.game";
+//    // fixed tqs
+//    long minTime = 0L;
+//    // 实验自变量1:tqe
+//    long maxTime = Long.parseLong(args[0]);
+//    // 实验自变量2:w数量
+//    int intervalNum = Integer.parseInt(args[1]);
+//    // 实验自变量3:方法
+//    // 1: MAC, 2: MOC, 3: CPV
+//    int approach = Integer.parseInt(args[2]);
+//    if (approach != 1 && approach != 2 && approach != 3) {
+//      throw new TException("Wrong input parameter approach!");
+//    }
+//    if (approach != 1) {
+//      // MOC and CPV sql are the same sql: queryFormat.
+//      // Set the server parameter in iotdb-engine.properties: enable_CPV=true for CPV, false for
+//      // MOC.
+//      if (approach == 2) { // MOC
+//        System.out.println(
+//            "MAKE SURE you have set the enable_CPV as false in `iotdb-engine.properties` for
+// MOC!");
+//      } else { // CPV
+//        System.out.println(
+//            "MAKE SURE you have set the enable_CPV as true in `iotdb-engine.properties` for
+// CPV!");
+//      }
+//    }
+//
+//    session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//    session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
+//
+//    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
+//    maxTime = minTime + interval * intervalNum;
+//
+//    String sql;
+//    if (approach == 1) { // MAC UDF
+//      sql =
+//          String.format(queryFormat_UDF, measurement, device, minTime, maxTime, intervalNum); //
+// MAC
+//    } else {
+//      // MOC and CPV sql use the same sql queryFormat.
+//      sql =
+//          String.format(
+//              queryFormat,
+//              measurement,
+//              measurement,
+//              measurement,
+//              measurement,
+//              measurement,
+//              measurement,
+//              device,
+//              minTime,
+//              maxTime,
+//              interval);
+//    }
+//
+//    SessionDataSet dataSet;
+//    dataSet = session.executeQueryStatement(sql);
+//    while (dataSet.hasNext()) {
+//      RowRecord r = dataSet.next();
+//    }
+//    session.executeNonQueryStatement("clear cache");
+//    dataSet = session.executeFinish();
+//    String info = dataSet.getFinishResult();
+//    System.out.println(info);
+//    dataSet.closeOperationHandle();
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryTqe.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryMF03.java
similarity index 73%
rename from example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryTqe.java
rename to example/session/src/main/java/org/apache/iotdb/queryExp/QueryMF03.java
index af8f285..bc2d6b2 100644
--- a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryTqe.java
+++ b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryMF03.java
@@ -8,17 +8,17 @@ import org.apache.iotdb.tsfile.read.common.RowRecord;
 
 import org.apache.thrift.TException;
 
-public class QueryFullGameVaryTqe {
+public class QueryMF03 {
 
   // * (1) min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s)
   //       => Don't change the sequence of the above six aggregates!
   // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
   // IntervalLength!
-  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
+  // * (3) NOTE the time unit of interval. Update for different datasets!
   private static final String queryFormat =
       "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s) "
           + "from %s "
-          + "group by ([%d, %d), %dns)";
+          + "group by ([%d, %d), %dns)"; // note this "ns" time precision
 
   private static final String queryFormat_UDF =
       "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and time<%4$d";
@@ -28,17 +28,19 @@ public class QueryFullGameVaryTqe {
   public static void main(String[] args)
       throws IoTDBConnectionException, StatementExecutionException, TException {
     // fixed time series path
-    String measurement = "s6";
-    String device = "root.game";
-    // fixed interval num
-    int intervalNum = 50;
-    // fixed tqs
-    long minTime = 0L;
-    // 实验自变量1:tqe
-    long maxTime = Long.parseLong(args[0]);
-    // 实验自变量2:方法
+    String measurement = "mf03"; // [[update]]
+    String device = "root.debs2012"; // [[update]]
+    // used to bound tqs random position
+    long dataMinTime = 1329955200008812200L;
+    long dataMaxTime = 1329965999991045201L; // 617426057626+1
+
+    // 实验自变量1:[tqs,tqe) range length, i.e., tqe-tqs
+    long range = Long.parseLong(args[0]);
+    // 实验自变量2:w数量
+    int intervalNum = Integer.parseInt(args[1]);
+    // 实验自变量3:方法
     // 1: MAC, 2: MOC, 3: CPV
-    int approach = Integer.parseInt(args[1]);
+    int approach = Integer.parseInt(args[2]);
     if (approach != 1 && approach != 2 && approach != 3) {
       throw new TException("Wrong input parameter approach!");
     }
@@ -55,13 +57,24 @@ public class QueryFullGameVaryTqe {
       }
     }
 
+    long minTime;
+    long maxTime;
+    long interval;
+    if (range >= (dataMaxTime - dataMinTime)) {
+      minTime = dataMinTime;
+      interval = (long) Math.ceil((double) (dataMaxTime - dataMinTime) / intervalNum);
+    } else {
+      // randomize between [dataMinTime, dataMaxTime-range]
+      minTime =
+          (long) Math.ceil(dataMinTime + Math.random() * (dataMaxTime - range - dataMinTime + 1));
+      interval = (long) Math.ceil((double) range / intervalNum);
+    }
+    maxTime = minTime + interval * intervalNum;
+
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open(false);
     session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
 
-    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
-    maxTime = minTime + interval * intervalNum;
-
     String sql;
     if (approach == 1) { // MAC UDF
       sql =
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryW.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryRecTime.java
similarity index 73%
rename from example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryW.java
rename to example/session/src/main/java/org/apache/iotdb/queryExp/QueryRecTime.java
index 4758b82..78c225c 100644
--- a/example/session/src/main/java/org/apache/iotdb/queryExp/QueryFullGameVaryW.java
+++ b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryRecTime.java
@@ -8,17 +8,17 @@ import org.apache.iotdb.tsfile.read.common.RowRecord;
 
 import org.apache.thrift.TException;
 
-public class QueryFullGameVaryW {
+public class QueryRecTime {
 
   // * (1) min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s)
   //       => Don't change the sequence of the above six aggregates!
   // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
   // IntervalLength!
-  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
+  // * (3) NOTE the time unit of interval. Update for different datasets!
   private static final String queryFormat =
       "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s) "
           + "from %s "
-          + "group by ([%d, %d), %dns)";
+          + "group by ([%d, %d), %dms)"; // note this "ms" time precision
 
   private static final String queryFormat_UDF =
       "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and time<%4$d";
@@ -28,16 +28,19 @@ public class QueryFullGameVaryW {
   public static void main(String[] args)
       throws IoTDBConnectionException, StatementExecutionException, TException {
     // fixed time series path
-    String measurement = "s6";
-    String device = "root.game";
-    // fixed query total range
-    long minTime = 0L;
-    long maxTime = 4264605928301L; // unit:ns. Set in iotdb-engine.properties `timestamp_precision`.
-    // 实验自变量1:w数量
-    int intervalNum = Integer.parseInt(args[0]);
-    // 实验自变量2:方法
+    String measurement = "RecTime"; // [[update]]
+    String device = "root.sg1"; // [[update]]
+    // used to bound tqs random position
+    long dataMinTime = 1616194494000L; // [[update]]
+    long dataMaxTime = 1642656230001L; // 617426057626+1 // [[update]]
+
+    // 实验自变量1:[tqs,tqe) range length, i.e., tqe-tqs
+    long range = Long.parseLong(args[0]);
+    // 实验自变量2:w数量
+    int intervalNum = Integer.parseInt(args[1]);
+    // 实验自变量3:方法
     // 1: MAC, 2: MOC, 3: CPV
-    int approach = Integer.parseInt(args[1]);
+    int approach = Integer.parseInt(args[2]);
     if (approach != 1 && approach != 2 && approach != 3) {
       throw new TException("Wrong input parameter approach!");
     }
@@ -54,13 +57,24 @@ public class QueryFullGameVaryW {
       }
     }
 
+    long minTime;
+    long maxTime;
+    long interval;
+    if (range >= (dataMaxTime - dataMinTime)) {
+      minTime = dataMinTime;
+      interval = (long) Math.ceil((double) (dataMaxTime - dataMinTime) / intervalNum);
+    } else {
+      // randomize between [dataMinTime, dataMaxTime-range]
+      minTime =
+          (long) Math.ceil(dataMinTime + Math.random() * (dataMaxTime - range - dataMinTime + 1));
+      interval = (long) Math.ceil((double) range / intervalNum);
+    }
+    maxTime = minTime + interval * intervalNum;
+
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open(false);
     session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
 
-    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
-    maxTime = minTime + interval * intervalNum;
-
     String sql;
     if (approach == 1) { // MAC UDF
       sql =
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryW.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryW.java
deleted file mode 100644
index a57c9a8..0000000
--- a/example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryW.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.apache.iotdb.queryExp;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.session.SessionDataSet;
-import org.apache.iotdb.tsfile.read.common.RowRecord;
-
-import org.apache.thrift.TException;
-
-/**
- * !!!!!!!Before query data, make sure check the following server parameters:
- *
- * <p>system_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/system
- * data_dirs=/data3/ruilei/iotdb-server-0.12.4/synData1/data
- * wal_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/wal timestamp_precision=ms
- * unseq_tsfile_size=1073741824 # maximum size of unseq TsFile is 1024^3 Bytes
- * seq_tsfile_size=1073741824 # maximum size of seq TsFile is 1024^3 Bytes
- * avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
- * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
- * enable_unseq_compaction=false # unseq compaction is disabled
- */
-public class QuerySyntheticData1VaryW {
-
-  // * (1) min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s)
-  //       => Don't change the sequence of the above six aggregates!
-  // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
-  // IntervalLength!
-  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
-  private static final String queryFormat =
-      "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s) "
-          + "from %s "
-          + "group by ([%d, %d), %dms)";
-
-  private static final String queryFormat_UDF =
-      "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and time<%4$d";
-
-  public static Session session;
-
-  public static void main(String[] args)
-      throws IoTDBConnectionException, StatementExecutionException, TException {
-    // fix parameters for synthetic data1
-    String measurement = "s0";
-    String device = "root.vehicle.d0";
-    // fixed query total range
-    long minTime = 0L;
-    long maxTime = 10000000L; // unit:ms. Set in iotdb-engine.properties `timestamp_precision`.
-    // 实验自变量1:w数量
-    int intervalNum = Integer.parseInt(args[0]);
-    // 实验自变量2:方法
-    // 1: MAC, 2: MOC, 3: CPV
-    int approach = Integer.parseInt(args[1]);
-    if (approach != 1 && approach != 2 && approach != 3) {
-      throw new TException("Wrong input parameter approach!");
-    }
-    if (approach != 1) {
-      // MOC and CPV sql are the same sql: queryFormat.
-      // Set the server parameter in iotdb-engine.properties: enable_CPV=true for CPV, false for
-      // MOC.
-      if (approach == 2) { // MOC
-        System.out.println(
-            "MAKE SURE you have set the enable_CPV as false in `iotdb-engine.properties` for MOC!");
-      } else { // CPV
-        System.out.println(
-            "MAKE SURE you have set the enable_CPV as true in `iotdb-engine.properties` for CPV!");
-      }
-    }
-
-    session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-    session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
-
-    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
-    maxTime = minTime + interval * intervalNum;
-
-    String sql;
-    if (approach == 1) { // MAC UDF
-      sql =
-          String.format(queryFormat_UDF, measurement, device, minTime, maxTime, intervalNum); // MAC
-    } else {
-      // MOC and CPV sql use the same sql queryFormat.
-      sql =
-          String.format(
-              queryFormat,
-              measurement,
-              measurement,
-              measurement,
-              measurement,
-              measurement,
-              measurement,
-              device,
-              minTime,
-              maxTime,
-              interval);
-    }
-
-    SessionDataSet dataSet;
-    dataSet = session.executeQueryStatement(sql);
-    while (dataSet.hasNext()) {
-      RowRecord r = dataSet.next();
-    }
-    session.executeNonQueryStatement("clear cache");
-    dataSet = session.executeFinish();
-    String info = dataSet.getFinishResult();
-    System.out.println(info);
-    dataSet.closeOperationHandle();
-    session.close();
-  }
-}
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryTqe.java b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryTianyuan.java
similarity index 71%
rename from example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryTqe.java
rename to example/session/src/main/java/org/apache/iotdb/queryExp/QueryTianyuan.java
index baf1f02..4bf7bb9 100644
--- a/example/session/src/main/java/org/apache/iotdb/queryExp/QuerySyntheticData1VaryTqe.java
+++ b/example/session/src/main/java/org/apache/iotdb/queryExp/QueryTianyuan.java
@@ -8,29 +8,17 @@ import org.apache.iotdb.tsfile.read.common.RowRecord;
 
 import org.apache.thrift.TException;
 
-/**
- * !!!!!!!Before query data, make sure check the following server parameters:
- *
- * <p>system_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/system
- * data_dirs=/data3/ruilei/iotdb-server-0.12.4/synData1/data
- * wal_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/wal timestamp_precision=ms
- * unseq_tsfile_size=1073741824 # maximum size of unseq TsFile is 1024^3 Bytes
- * seq_tsfile_size=1073741824 # maximum size of seq TsFile is 1024^3 Bytes
- * avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
- * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
- * enable_unseq_compaction=false # unseq compaction is disabled
- */
-public class QuerySyntheticData1VaryTqe {
+public class QueryTianyuan {
 
   // * (1) min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s)
   //       => Don't change the sequence of the above six aggregates!
   // * (2) group by ([tqs,tqe),IntervalLength) => Make sure (tqe-tqs) is divisible by
   // IntervalLength!
-  // * (3) NOTE the time unit of interval. Update for different datasets!!!!!!!!!!!
+  // * (3) NOTE the time unit of interval. Update for different datasets!
   private static final String queryFormat =
       "select min_time(%s), max_time(%s), first_value(%s), last_value(%s), min_value(%s), max_value(%s) "
           + "from %s "
-          + "group by ([%d, %d), %dms)";
+          + "group by ([%d, %d), %dms)"; // note this "ms" time precision
 
   private static final String queryFormat_UDF =
       "select M4(%1$s,'tqs'='%3$d','tqe'='%4$d','w'='%5$d') from %2$s where time>=%3$d and time<%4$d";
@@ -39,18 +27,20 @@ public class QuerySyntheticData1VaryTqe {
 
   public static void main(String[] args)
       throws IoTDBConnectionException, StatementExecutionException, TException {
-    // fix parameters for synthetic data1
-    String measurement = "s0";
-    String device = "root.vehicle.d0";
-    // fixed interval num
-    int intervalNum = 20;
-    // fix tqs
-    long minTime = 0L;
-    // 实验自变量1:tqe
-    long maxTime = Long.parseLong(args[0]);
-    // 实验自变量2:方法
+    // fixed time series path
+    String measurement = "KOB_0002_00_67"; // [[update]]
+    String device = "root.kobelco.trans.03.1090001603.2401604"; // [[update]]
+    // used to bound tqs random position
+    long dataMinTime = 1616805035973L; // [[update]]
+    long dataMaxTime = 1627380839564L; // 1627380839563+1 // [[update]]
+
+    // 实验自变量1:[tqs,tqe) range length, i.e., tqe-tqs
+    long range = Long.parseLong(args[0]);
+    // 实验自变量2:w数量
+    int intervalNum = Integer.parseInt(args[1]);
+    // 实验自变量3:方法
     // 1: MAC, 2: MOC, 3: CPV
-    int approach = Integer.parseInt(args[1]);
+    int approach = Integer.parseInt(args[2]);
     if (approach != 1 && approach != 2 && approach != 3) {
       throw new TException("Wrong input parameter approach!");
     }
@@ -67,13 +57,24 @@ public class QuerySyntheticData1VaryTqe {
       }
     }
 
+    long minTime;
+    long maxTime;
+    long interval;
+    if (range >= (dataMaxTime - dataMinTime)) {
+      minTime = dataMinTime;
+      interval = (long) Math.ceil((double) (dataMaxTime - dataMinTime) / intervalNum);
+    } else {
+      // randomize between [dataMinTime, dataMaxTime-range]
+      minTime =
+          (long) Math.ceil(dataMinTime + Math.random() * (dataMaxTime - range - dataMinTime + 1));
+      interval = (long) Math.ceil((double) range / intervalNum);
+    }
+    maxTime = minTime + interval * intervalNum;
+
     session = new Session("127.0.0.1", 6667, "root", "root");
     session.open(false);
     session.setFetchSize(100000); // this is important. Set it big to avoid multiple fetch.
 
-    long interval = (long) Math.ceil((double) (maxTime - minTime) / intervalNum);
-    maxTime = minTime + interval * intervalNum;
-
     String sql;
     if (approach == 1) { // MAC UDF
       sql =
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-loadDataOnly.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-loadDataOnly.png
deleted file mode 100644
index f5eb05d..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-loadDataOnly.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-totalOnly.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-totalOnly.png
deleted file mode 100644
index a844ab1..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare-totalOnly.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare.png
deleted file mode 100644
index 3e9fa3e..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-compare.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-cpv.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-cpv.png
deleted file mode 100644
index 90813e0..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-cpv.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-mac.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-mac.png
deleted file mode 100644
index ec6beb5..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-mac.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-moc.png b/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-moc.png
deleted file mode 100644
index 911efec..0000000
Binary files a/example/session/src/main/java/org/apache/iotdb/queryExp/synData1VaryWExpFigures/synData1-0disorder-0delete-varyW-moc.png and /dev/null differ
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java
index d05cdec..54cbfa7 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java
@@ -13,17 +13,19 @@ import java.time.format.DateTimeParseException;
 
 public class ExtractDebs2012Data {
 
-  // java ExtractDebs2012Data /data3/raw_data/data/debs2012/allData.txt mf03-3h.csv 0 4 1329955200000000000 1329966000000000000
+  // java ExtractDebs2012Data /data3/raw_data/data/debs2012/allData.txt mf03-3h.csv 0 4
+  // 1329955200000000000 1329966000000000000
   public static void main(String[] args) throws IOException {
-//    String tmp = "2012-03-20T06:53:51.4554819+00:00";
-//    long timestamp = getInstantWithPrecision(tmp, "ns");
-//    System.out.println(timestamp);
+    //    String tmp = "2012-03-20T06:53:51.4554819+00:00";
+    //    long timestamp = getInstantWithPrecision(tmp, "ns");
+    //    System.out.println(timestamp);
 
     String inPath = args[0];
     String outPath = args[1];
     int timeIdx = Integer.parseInt(args[2]); // 0
     int valueIdx = Integer.parseInt(args[3]); // mf03: 4
-    // [1329955200000000000 Thursday, February 23, 2012 0:00:00~1329966000000000000 Thursday, February 23, 2012 3:00:00)
+    // [1329955200000000000 Thursday, February 23, 2012 0:00:00~1329966000000000000 Thursday,
+    // February 23, 2012 3:00:00)
     long startTime = Long.parseLong(args[4]);
     long endTime = Long.parseLong(args[5]);
 
@@ -60,34 +62,36 @@ public class ExtractDebs2012Data {
     printWriter.close();
   }
 
-//  private static long convertDatetimeStrToLong(String str, ZoneOffset offset, int depth)
-//      throws LogicalOperatorException {
-//
-//    String timestampPrecision = IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
-//
-//    if (depth >= 2) {
-//      throw new DateTimeException(
-//          String.format(
-//              "Failed to convert %s to millisecond, zone offset is %s, "
-//                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
-//              str, offset));
-//    }
-//    if (str.contains("Z")) {
-//      return convertDatetimeStrToLong(str.substring(0, str.indexOf('Z')) + "+00:00", offset, depth);
-//    } else if (str.length() == 10) {
-//      return convertDatetimeStrToLong(str + "T00:00:00", offset, depth);
-//    } else if (str.length() - str.lastIndexOf('+') != 6
-//        && str.length() - str.lastIndexOf('-') != 6) {
-//      return convertDatetimeStrToLong(str + offset, offset, depth + 1);
-//    } else if (str.contains("[") || str.contains("]")) {
-//      throw new DateTimeException(
-//          String.format(
-//              "%s with [time-region] at end is not supported now, "
-//                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
-//              str));
-//    }
-//    return getInstantWithPrecision(str, timestampPrecision);
-//  }
+  //  private static long convertDatetimeStrToLong(String str, ZoneOffset offset, int depth)
+  //      throws LogicalOperatorException {
+  //
+  //    String timestampPrecision =
+  // IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
+  //
+  //    if (depth >= 2) {
+  //      throw new DateTimeException(
+  //          String.format(
+  //              "Failed to convert %s to millisecond, zone offset is %s, "
+  //                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
+  //              str, offset));
+  //    }
+  //    if (str.contains("Z")) {
+  //      return convertDatetimeStrToLong(str.substring(0, str.indexOf('Z')) + "+00:00", offset,
+  // depth);
+  //    } else if (str.length() == 10) {
+  //      return convertDatetimeStrToLong(str + "T00:00:00", offset, depth);
+  //    } else if (str.length() - str.lastIndexOf('+') != 6
+  //        && str.length() - str.lastIndexOf('-') != 6) {
+  //      return convertDatetimeStrToLong(str + offset, offset, depth + 1);
+  //    } else if (str.contains("[") || str.contains("]")) {
+  //      throw new DateTimeException(
+  //          String.format(
+  //              "%s with [time-region] at end is not supported now, "
+  //                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
+  //              str));
+  //    }
+  //    return getInstantWithPrecision(str, timestampPrecision);
+  //  }
 
   private static long getInstantWithPrecision(String str, String timestampPrecision)
       throws IOException {
@@ -115,4 +119,3 @@ public class ExtractDebs2012Data {
     }
   }
 }
-
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractFullGameData.java b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractFullGameData.java
index 54fe62f..aa7e6c5 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractFullGameData.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractFullGameData.java
@@ -7,7 +7,8 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 
-// java ExtractFullGameData /data3/raw_data/data/full-game full-game-sid8-1000000 1 5 8 2000000 3200000
+// java ExtractFullGameData /data3/raw_data/data/full-game full-game-sid8-10min 1 5 8 2000000
+// 3200000
 public class ExtractFullGameData {
 
   // sid, ts, x, y, z, |v|, |a|, vx, vy, vz, ax, ay, az
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractRecTimeData.java
similarity index 56%
copy from example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java
copy to example/session/src/main/java/org/apache/iotdb/writeData/ExtractRecTimeData.java
index d05cdec..9fe43d1 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebs2012Data.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractRecTimeData.java
@@ -11,19 +11,19 @@ import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 
-public class ExtractDebs2012Data {
+public class ExtractRecTimeData {
 
-  // java ExtractDebs2012Data /data3/raw_data/data/debs2012/allData.txt mf03-3h.csv 0 4 1329955200000000000 1329966000000000000
+  // java D:\pythonPlotDoNotDeleteIt\drawRawData\RecTime\dump0.csv
+  // D:\pythonPlotDoNotDeleteIt\drawRawData\RecTime\dump1.csv 0 1 0 1644144767000
   public static void main(String[] args) throws IOException {
-//    String tmp = "2012-03-20T06:53:51.4554819+00:00";
-//    long timestamp = getInstantWithPrecision(tmp, "ns");
-//    System.out.println(timestamp);
+    //        String tmp = "2021-03-20T06:54:54.000+08:00";
+    //        long timestamp = getInstantWithPrecision(tmp, "ms");
+    //        System.out.println(timestamp);
 
     String inPath = args[0];
     String outPath = args[1];
     int timeIdx = Integer.parseInt(args[2]); // 0
     int valueIdx = Integer.parseInt(args[3]); // mf03: 4
-    // [1329955200000000000 Thursday, February 23, 2012 0:00:00~1329966000000000000 Thursday, February 23, 2012 3:00:00)
     long startTime = Long.parseLong(args[4]);
     long endTime = Long.parseLong(args[5]);
 
@@ -36,59 +36,31 @@ public class ExtractDebs2012Data {
     long lastTimestamp = -1;
 
     while ((line = reader.readLine()) != null) {
-      String[] split = line.split("\\s+");
+      String[] split = line.split(",");
       String timestampStr = split[timeIdx];
-      long timestamp = getInstantWithPrecision(timestampStr, "ns");
+      long timestamp = getInstantWithPrecision(timestampStr, "ms");
       if (timestamp >= endTime) {
         break;
       }
       if (timestamp < startTime) {
         continue;
       }
+      if (timestamp <= lastTimestamp) {
+        System.out.println("out-of-order! " + timestamp + "last: " + lastTimestamp);
+        continue;
+      }
       long value = Long.parseLong(split[valueIdx]);
       printWriter.print(timestamp);
       printWriter.print(",");
       printWriter.print(value);
       printWriter.println();
       cnt++;
-      if (timestamp < lastTimestamp) {
-        System.out.println("out-of-order! " + timestamp);
-      }
       lastTimestamp = timestamp;
     }
     reader.close();
     printWriter.close();
   }
 
-//  private static long convertDatetimeStrToLong(String str, ZoneOffset offset, int depth)
-//      throws LogicalOperatorException {
-//
-//    String timestampPrecision = IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
-//
-//    if (depth >= 2) {
-//      throw new DateTimeException(
-//          String.format(
-//              "Failed to convert %s to millisecond, zone offset is %s, "
-//                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
-//              str, offset));
-//    }
-//    if (str.contains("Z")) {
-//      return convertDatetimeStrToLong(str.substring(0, str.indexOf('Z')) + "+00:00", offset, depth);
-//    } else if (str.length() == 10) {
-//      return convertDatetimeStrToLong(str + "T00:00:00", offset, depth);
-//    } else if (str.length() - str.lastIndexOf('+') != 6
-//        && str.length() - str.lastIndexOf('-') != 6) {
-//      return convertDatetimeStrToLong(str + offset, offset, depth + 1);
-//    } else if (str.contains("[") || str.contains("]")) {
-//      throw new DateTimeException(
-//          String.format(
-//              "%s with [time-region] at end is not supported now, "
-//                  + "please input like 2011-12-03T10:15:30 or 2011-12-03T10:15:30+01:00",
-//              str));
-//    }
-//    return getInstantWithPrecision(str, timestampPrecision);
-//  }
-
   private static long getInstantWithPrecision(String str, String timestampPrecision)
       throws IOException {
     try {
@@ -115,4 +87,3 @@ public class ExtractDebs2012Data {
     }
   }
 }
-
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebug.java b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractTianyuan.java
similarity index 60%
rename from example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebug.java
rename to example/session/src/main/java/org/apache/iotdb/writeData/ExtractTianyuan.java
index 0bab58d..03ad103 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/ExtractDebug.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/ExtractTianyuan.java
@@ -7,16 +7,13 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintWriter;
 
-// java ExtractDebug _OutOfOrder1_maxdelay300000_mindelay0.data debug.csv 3 7
-// 16525359
-public class ExtractDebug {
+public class ExtractTianyuan {
 
   public static void main(String[] args) throws IOException {
     String inPath = args[0];
     String outPath = args[1];
-    int timeIdx = Integer.parseInt(args[2]); // 3
-    int valueIdx = Integer.parseInt(args[3]); // 7
-    int lineNum = Integer.parseInt(args[4]); // -1 means no constraint
+    int timeIdx = Integer.parseInt(args[2]); // 0
+    int valueIdx = Integer.parseInt(args[3]); // 1
 
     File f = new File(inPath);
     FileWriter fileWriter = new FileWriter(outPath);
@@ -24,23 +21,21 @@ public class ExtractDebug {
     BufferedReader reader = new BufferedReader(new FileReader(f));
     PrintWriter printWriter = new PrintWriter(fileWriter);
     int cnt = 0;
-    long minTime = -1;
-    while (((lineNum > 0 && cnt < lineNum) || lineNum < 0) && (line = reader.readLine()) != null) {
+    long lastTimestamp = -1;
+    while ((line = reader.readLine()) != null) {
       String[] split = line.split(",");
       long timestamp = Long.parseLong(split[timeIdx]);
-      if (minTime == -1) {
-        minTime = timestamp;
-        timestamp = 0;
-      } else {
-        timestamp = timestamp - minTime;
-      }
-      timestamp = (long) (timestamp / 1000);
       long value = Long.parseLong(split[valueIdx]);
+      if (timestamp <= lastTimestamp) {
+        System.out.println("out-of-order! " + timestamp + "last: " + lastTimestamp);
+        continue;
+      }
       printWriter.print(timestamp);
       printWriter.print(",");
       printWriter.print(value);
       printWriter.println();
       cnt++;
+      lastTimestamp = timestamp;
     }
     reader.close();
     printWriter.close();
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/TestFullGameTmp.java b/example/session/src/main/java/org/apache/iotdb/writeData/TestFullGameTmp.java
deleted file mode 100644
index dd481d5..0000000
--- a/example/session/src/main/java/org/apache/iotdb/writeData/TestFullGameTmp.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.iotdb.writeData;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class TestFullGameTmp {
-
-  public static void main(String[] args) throws IOException {
-    String path = args[0];
-    File f = new File(path);
-    String line = null;
-    BufferedReader reader = new BufferedReader(new FileReader(f));
-    long lastTimestamp = 0L;
-    int cnt = 0;
-    int totalcnt = 0;
-    while ((line = reader.readLine()) != null) {
-      String[] split = line.split(",");
-      long timestamp = Long.valueOf(split[3]);
-      totalcnt++;
-      if (timestamp < lastTimestamp) {
-        //        System.out.println("disordered!");
-        cnt++;
-      }
-      lastTimestamp = timestamp;
-    }
-    System.out.println("total disorder points=" + cnt);
-    System.out.println("total points=" + totalcnt);
-    System.out.println(cnt / totalcnt);
-  }
-}
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java
index ce37ba8..ad0e863 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java
@@ -12,31 +12,43 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Random;
 
 public class WriteFullGame {
 
   /** Before writing data, make sure check the server parameter configurations. */
   public static void main(String[] args)
       throws IoTDBConnectionException, StatementExecutionException, IOException {
-    String measurements = "s6";
-    String device = "root.game";
-
-    List<String> deletePaths = new ArrayList<>();
-    deletePaths.add(device + "." + measurements);
+    String measurements = "s6"; // [[update]]
+    String device = "root.game"; // [[update]]
+    long chunkAvgTimeLen = 5238417462L; // ns [[update]]
 
     // 实验自变量1:乱序数据源
     String filePath = args[0];
-    // 实验自变量2:每隔deleteFreq时间(本实验时间单位ms)就执行一次删除
-    long deleteFreq = Long.parseLong(args[1]); // 0 means no deletes
-    // 实验自变量3:每次删除的时间长度
-    long deleteLen = Long.parseLong(args[2]);
+    // 实验自变量2:delete percentage
+    int deletePercentage = Integer.parseInt(args[1]); // 0 means no deletes. 0-100
+    // 实验自变量3:每次删除的时间长度,用chunkAvgTimeLen的百分比表示
+    int deleteLenPercentage = Integer.parseInt(args[2]); // 0-100
     // 参数4:时间戳idx,从0开始
     int timeIdx = Integer.parseInt(args[3]);
     // 参数5:值idx,从0开始
     int valueIdx = Integer.parseInt(args[4]);
 
-    TSDataType tsDataType = TSDataType.INT64;
+    if (deletePercentage < 0 || deletePercentage > 100) {
+      throw new IOException("WRONG deletePercentage!");
+    }
+    if (deleteLenPercentage < 0 || deleteLenPercentage > 100) {
+      throw new IOException("WRONG deleteLenPercentage!");
+    }
+
+    int avgSeriesPointNumberThreshold = 10000; // fixed
+    int deletePeriod =
+        (int) Math.floor(100 * 1.0 / deletePercentage * avgSeriesPointNumberThreshold);
+    long deleteLen = (long) Math.floor(chunkAvgTimeLen * deleteLenPercentage * 1.0 / 100);
+
+    List<String> deletePaths = new ArrayList<>();
+    deletePaths.add(device + "." + measurements);
+
+    TSDataType tsDataType = TSDataType.INT64; // value types
 
     Session session = new Session("127.0.0.1", 6667, "root", "root");
     session.open(false);
@@ -44,17 +56,20 @@ public class WriteFullGame {
     // this is to make all following inserts unseq chunks
     session.insertRecord(
         device,
-        System.nanoTime(), // NOTE UPDATE TIME DATATYPE!
+        1644181628000000000L,
+        // NOTE UPDATE TIME DATATYPE! [[update]]. DONT USE System.nanoTime()!
         Collections.singletonList(measurements),
         Collections.singletonList(tsDataType), // NOTE UPDATE VALUE DATATYPE!
-        0L); // NOTE UPDATE VALUE DATATYPE!!!
+        0L); // NOTE UPDATE VALUE DATATYPE!
     session.executeNonQueryStatement("flush");
 
     long minTime = -1;
     File f = new File(filePath);
     String line = null;
     BufferedReader reader = new BufferedReader(new FileReader(f));
-    int lastDeleteIdx = -1;
+    long lastDeleteMinTime = Long.MAX_VALUE;
+    long lastDeleteMaxTime = Long.MIN_VALUE;
+    int cnt = 0;
     while ((line = reader.readLine()) != null) {
       String[] split = line.split(",");
       long timestamp = Long.parseLong(split[timeIdx]);
@@ -65,24 +80,6 @@ public class WriteFullGame {
         timestamp = timestamp - minTime;
       }
       timestamp = (long) (timestamp / 1000); // turn to ns. original time unit is ps. IoTDB only ns.
-
-      if (deleteFreq != 0) {
-        int idx = (int) Math.floor(timestamp * 1.0 / deleteFreq);
-        //        System.out.println(timestamp + "," + deleteFreq + "," + idx);
-        if (idx > 0 && idx != lastDeleteIdx) {
-          lastDeleteIdx = idx;
-          // [timestamp-deleteFreq, timestamp-1]内随机取一个删除时间起点
-          long min = timestamp - deleteFreq;
-          long max = timestamp - 1;
-          long deleteStartTime = min + (((long) (new Random().nextDouble() * (max - min))));
-          long deleteEndTime = deleteStartTime + deleteLen - 1;
-          session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
-
-          //          System.out.println("[[[[delete]]]]]" + deleteStartTime + "," + deleteEndTime);
-
-        }
-      }
-
       long value = Long.parseLong(split[valueIdx]);
       session.insertRecord(
           device,
@@ -90,6 +87,32 @@ public class WriteFullGame {
           Collections.singletonList(measurements),
           Collections.singletonList(tsDataType),
           value);
+      cnt++;
+
+      if (timestamp > lastDeleteMaxTime) {
+        lastDeleteMaxTime = timestamp;
+      }
+      if (timestamp < lastDeleteMinTime) {
+        lastDeleteMinTime = timestamp;
+      }
+
+      if (deletePercentage != 0) {
+        if (cnt >= deletePeriod) {
+          cnt = 0;
+          // randomize deleteStartTime in [lastMinTime, max(lastMaxTime-deleteLen,lastMinTime+1)]
+          long rightBound = Math.max(lastDeleteMaxTime - deleteLen, lastDeleteMinTime + 1);
+          long deleteStartTime =
+              (long)
+                  Math.ceil(
+                      lastDeleteMinTime + Math.random() * (rightBound - lastDeleteMinTime + 1));
+          long deleteEndTime = deleteStartTime + deleteLen - 1;
+          session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
+          System.out.println("[[[[delete]]]]]" + deleteStartTime + "," + deleteEndTime);
+
+          lastDeleteMinTime = Long.MAX_VALUE;
+          lastDeleteMaxTime = Long.MIN_VALUE;
+        }
+      }
     }
 
     session.executeNonQueryStatement("flush");
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedToIoTDB.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedToIoTDB.java
index e6e4774..d82416e 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedToIoTDB.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedToIoTDB.java
@@ -1,52 +1,52 @@
-package org.apache.iotdb.writeData;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Collections;
-
-public class WriteFullGameDisorderedToIoTDB {
-
-  public static void main(String[] args)
-      throws IOException, IoTDBConnectionException, StatementExecutionException {
-
-    String path = args[0];
-
-    String measurements = "s6";
-    String device = "root.game";
-
-    Session session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-
-    long minTime = -1;
-    File f = new File(path);
-    String line = null;
-    BufferedReader reader = new BufferedReader(new FileReader(f));
-    while ((line = reader.readLine()) != null) {
-      String[] split = line.split(",");
-      long timestamp = Long.valueOf(split[3]);
-      if (minTime == -1) {
-        minTime = timestamp;
-        timestamp = 0;
-      } else {
-        timestamp = timestamp - minTime;
-      }
-      timestamp = (long) (timestamp / 1000); // turn to ns
-      long value = Long.valueOf(split[7]);
-      session.insertRecord(
-          device,
-          timestamp,
-          Collections.singletonList(measurements),
-          Collections.singletonList(TSDataType.INT64),
-          value);
-    }
-    session.executeNonQueryStatement("flush");
-    session.close();
-  }
-}
+// package org.apache.iotdb.writeData;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//
+// import java.io.BufferedReader;
+// import java.io.File;
+// import java.io.FileReader;
+// import java.io.IOException;
+// import java.util.Collections;
+//
+// public class WriteFullGameDisorderedToIoTDB {
+//
+//  public static void main(String[] args)
+//      throws IOException, IoTDBConnectionException, StatementExecutionException {
+//
+//    String path = args[0];
+//
+//    String measurements = "s6";
+//    String device = "root.game";
+//
+//    Session session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//
+//    long minTime = -1;
+//    File f = new File(path);
+//    String line = null;
+//    BufferedReader reader = new BufferedReader(new FileReader(f));
+//    while ((line = reader.readLine()) != null) {
+//      String[] split = line.split(",");
+//      long timestamp = Long.valueOf(split[3]);
+//      if (minTime == -1) {
+//        minTime = timestamp;
+//        timestamp = 0;
+//      } else {
+//        timestamp = timestamp - minTime;
+//      }
+//      timestamp = (long) (timestamp / 1000); // turn to ns
+//      long value = Long.valueOf(split[7]);
+//      session.insertRecord(
+//          device,
+//          timestamp,
+//          Collections.singletonList(measurements),
+//          Collections.singletonList(TSDataType.INT64),
+//          value);
+//    }
+//    session.executeNonQueryStatement("flush");
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedWithDeletes.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedWithDeletes.java
index fa86a0b..1baa587 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedWithDeletes.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameDisorderedWithDeletes.java
@@ -1,73 +1,74 @@
-package org.apache.iotdb.writeData;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-public class WriteFullGameDisorderedWithDeletes {
-
-  /** Before writing data, make sure check the server parameter configurations. */
-  public static void main(String[] args)
-      throws IoTDBConnectionException, StatementExecutionException, IOException {
-    String measurements = "s6";
-    String device = "root.game";
-    List<String> deletePaths = new ArrayList<>();
-    deletePaths.add(device + "." + measurements);
-
-    // 实验自变量1:乱序数据源
-    String filePath = args[0];
-    // 实验自变量2:每隔deleteFreq时间(本实验时间单位ms)就执行一次删除
-    long deleteFreq = Long.parseLong(args[1]); // 0 means no deletes
-    // 实验自变量3:每次删除的时间长度
-    long deleteLen = Long.parseLong(args[2]);
-
-    Session session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-
-    long minTime = -1;
-    File f = new File(filePath);
-    String line = null;
-    BufferedReader reader = new BufferedReader(new FileReader(f));
-    while ((line = reader.readLine()) != null) {
-      String[] split = line.split(",");
-      long timestamp = Long.valueOf(split[3]);
-      if (minTime == -1) {
-        minTime = timestamp;
-        timestamp = 0;
-      } else {
-        timestamp = timestamp - minTime;
-      }
-      timestamp = (long) (timestamp / 1000); // turn to ns. original time unit is ps. IoTDB only ns.
-
-      if (deleteFreq != 0 && timestamp != 0 && timestamp % deleteFreq == 0) {
-        // [timestamp-deleteFreq, timestamp-1]内随机取一个删除时间起点
-        long min = timestamp - deleteFreq;
-        long max = timestamp - 1;
-        long deleteStartTime = min + (((long) (new Random().nextDouble() * (max - min))));
-        long deleteEndTime = deleteStartTime + deleteLen - 1;
-        session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
-      }
-
-      long value = Long.valueOf(split[7]);
-      session.insertRecord(
-          device,
-          timestamp,
-          Collections.singletonList(measurements),
-          Collections.singletonList(TSDataType.INT64),
-          value);
-    }
-
-    session.executeNonQueryStatement("flush");
-    session.close();
-  }
-}
+// package org.apache.iotdb.writeData;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//
+// import java.io.BufferedReader;
+// import java.io.File;
+// import java.io.FileReader;
+// import java.io.IOException;
+// import java.util.ArrayList;
+// import java.util.Collections;
+// import java.util.List;
+// import java.util.Random;
+//
+// public class WriteFullGameDisorderedWithDeletes {
+//
+//  /** Before writing data, make sure check the server parameter configurations. */
+//  public static void main(String[] args)
+//      throws IoTDBConnectionException, StatementExecutionException, IOException {
+//    String measurements = "s6";
+//    String device = "root.game";
+//    List<String> deletePaths = new ArrayList<>();
+//    deletePaths.add(device + "." + measurements);
+//
+//    // 实验自变量1:乱序数据源
+//    String filePath = args[0];
+//    // 实验自变量2:每隔deleteFreq时间(本实验时间单位ms)就执行一次删除
+//    long deleteFreq = Long.parseLong(args[1]); // 0 means no deletes
+//    // 实验自变量3:每次删除的时间长度
+//    long deleteLen = Long.parseLong(args[2]);
+//
+//    Session session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//
+//    long minTime = -1;
+//    File f = new File(filePath);
+//    String line = null;
+//    BufferedReader reader = new BufferedReader(new FileReader(f));
+//    while ((line = reader.readLine()) != null) {
+//      String[] split = line.split(",");
+//      long timestamp = Long.valueOf(split[3]);
+//      if (minTime == -1) {
+//        minTime = timestamp;
+//        timestamp = 0;
+//      } else {
+//        timestamp = timestamp - minTime;
+//      }
+//      timestamp = (long) (timestamp / 1000); // turn to ns. original time unit is ps. IoTDB only
+// ns.
+//
+//      if (deleteFreq != 0 && timestamp != 0 && timestamp % deleteFreq == 0) {
+//        // [timestamp-deleteFreq, timestamp-1]内随机取一个删除时间起点
+//        long min = timestamp - deleteFreq;
+//        long max = timestamp - 1;
+//        long deleteStartTime = min + (((long) (new Random().nextDouble() * (max - min))));
+//        long deleteEndTime = deleteStartTime + deleteLen - 1;
+//        session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
+//      }
+//
+//      long value = Long.valueOf(split[7]);
+//      session.insertRecord(
+//          device,
+//          timestamp,
+//          Collections.singletonList(measurements),
+//          Collections.singletonList(TSDataType.INT64),
+//          value);
+//    }
+//
+//    session.executeNonQueryStatement("flush");
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameToIoTDB.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameToIoTDB.java
index 8880ab7..4e73065 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameToIoTDB.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGameToIoTDB.java
@@ -1,54 +1,54 @@
-package org.apache.iotdb.writeData;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Collections;
-
-public class WriteFullGameToIoTDB {
-
-  public static void main(String[] args)
-      throws IOException, IoTDBConnectionException, StatementExecutionException {
-
-    //    String path = args[0];
-    String path = "/home/kyy/Documents/kdd/data/full-game.csv";
-    String measurements = "s6";
-
-    String device = "root.game";
-
-    Session session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-
-    long minTime = -1;
-
-    File f = new File(path);
-    String line = null;
-    BufferedReader reader = new BufferedReader(new FileReader(f));
-    while ((line = reader.readLine()) != null) {
-      String[] split = line.split(",");
-      long timestamp = Long.valueOf(split[1]);
-      if (minTime == -1) {
-        minTime = timestamp;
-        timestamp = 0;
-      } else {
-        timestamp = timestamp - minTime;
-      }
-      timestamp = (long) (timestamp / 1000);
-      long value = Long.valueOf(split[5]);
-      session.insertRecord(
-          device,
-          timestamp,
-          Collections.singletonList(measurements),
-          Collections.singletonList(TSDataType.INT64),
-          value);
-    }
-    session.executeNonQueryStatement("flush");
-    session.close();
-  }
-}
+// package org.apache.iotdb.writeData;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//
+// import java.io.BufferedReader;
+// import java.io.File;
+// import java.io.FileReader;
+// import java.io.IOException;
+// import java.util.Collections;
+//
+// public class WriteFullGameToIoTDB {
+//
+//  public static void main(String[] args)
+//      throws IOException, IoTDBConnectionException, StatementExecutionException {
+//
+//    //    String path = args[0];
+//    String path = "/home/kyy/Documents/kdd/data/full-game.csv";
+//    String measurements = "s6";
+//
+//    String device = "root.game";
+//
+//    Session session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//
+//    long minTime = -1;
+//
+//    File f = new File(path);
+//    String line = null;
+//    BufferedReader reader = new BufferedReader(new FileReader(f));
+//    while ((line = reader.readLine()) != null) {
+//      String[] split = line.split(",");
+//      long timestamp = Long.valueOf(split[1]);
+//      if (minTime == -1) {
+//        minTime = timestamp;
+//        timestamp = 0;
+//      } else {
+//        timestamp = timestamp - minTime;
+//      }
+//      timestamp = (long) (timestamp / 1000);
+//      long value = Long.valueOf(split[5]);
+//      session.insertRecord(
+//          device,
+//          timestamp,
+//          Collections.singletonList(measurements),
+//          Collections.singletonList(TSDataType.INT64),
+//          value);
+//    }
+//    session.executeNonQueryStatement("flush");
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame_old.java
similarity index 99%
copy from example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java
copy to example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame_old.java
index ce37ba8..d2ea08a 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteFullGame_old.java
@@ -14,7 +14,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 
-public class WriteFullGame {
+public class WriteFullGame_old {
 
   /** Before writing data, make sure check the server parameter configurations. */
   public static void main(String[] args)
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteMF03.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteMF03.java
new file mode 100644
index 0000000..0322554
--- /dev/null
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteMF03.java
@@ -0,0 +1,116 @@
+package org.apache.iotdb.writeData;
+
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.session.Session;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+// java -jar /data3/ruilei/rl/mf03_testspace/WriteMF03-0.12.4.jar
+// /data3/raw_data/rl/debs2012/mf03-3h-O_10_10 0 0 0 1 0
+public class WriteMF03 {
+
+  /** Before writing data, make sure check the server parameter configurations. */
+  public static void main(String[] args)
+      throws IoTDBConnectionException, StatementExecutionException, IOException {
+    String measurement = "mf03"; // [[update]]
+    String device = "root.debs2012"; // [[update]]
+
+    // 实验自变量1:乱序数据源
+    String filePath = args[0];
+    // 实验自变量2:delete percentage
+    int deletePercentage = Integer.parseInt(args[1]); // 0 means no deletes. 0-100
+    // 实验自变量3:每次删除的时间长度,用chunkAvgTimeLen的百分比表示
+    int deleteLenPercentage = Integer.parseInt(args[2]); // 0-100
+    // 参数4:时间戳idx,从0开始
+    int timeIdx = Integer.parseInt(args[3]);
+    // 参数5:值idx,从0开始
+    int valueIdx = Integer.parseInt(args[4]);
+    // 参数6:chunkAvgTimeLen
+    long chunkAvgTimeLen = Long.parseLong(args[5]);
+
+    if (deletePercentage < 0 || deletePercentage > 100) {
+      throw new IOException("WRONG deletePercentage!");
+    }
+    if (deleteLenPercentage < 0 || deleteLenPercentage > 100) {
+      throw new IOException("WRONG deleteLenPercentage!");
+    }
+
+    int avgSeriesPointNumberThreshold = 10000; // fixed
+    int deletePeriod =
+        (int) Math.floor(100 * 1.0 / deletePercentage * avgSeriesPointNumberThreshold);
+    long deleteLen = (long) Math.floor(chunkAvgTimeLen * deleteLenPercentage * 1.0 / 100);
+
+    List<String> deletePaths = new ArrayList<>();
+    deletePaths.add(device + "." + measurement);
+
+    TSDataType tsDataType = TSDataType.INT64; // value types
+
+    Session session = new Session("127.0.0.1", 6667, "root", "root");
+    session.open(false);
+
+    // this is to make all following inserts unseq chunks
+    session.insertRecord(
+        device,
+        1644181628000000000L, // ns
+        // NOTE UPDATE TIME DATATYPE! [[update]]. DONT USE System.nanoTime()!
+        Collections.singletonList(measurement),
+        Collections.singletonList(tsDataType), // NOTE UPDATE VALUE DATATYPE!
+        0L); // NOTE UPDATE VALUE DATATYPE!
+    session.executeNonQueryStatement("flush");
+
+    File f = new File(filePath);
+    String line = null;
+    BufferedReader reader = new BufferedReader(new FileReader(f));
+    long lastDeleteMinTime = Long.MAX_VALUE;
+    long lastDeleteMaxTime = Long.MIN_VALUE;
+    int cnt = 0;
+    while ((line = reader.readLine()) != null) {
+      String[] split = line.split(",");
+      long timestamp = Long.parseLong(split[timeIdx]);
+      long value = Long.parseLong(split[valueIdx]);
+      session.insertRecord(
+          device,
+          timestamp,
+          Collections.singletonList(measurement),
+          Collections.singletonList(tsDataType),
+          value);
+      cnt++;
+
+      if (timestamp > lastDeleteMaxTime) {
+        lastDeleteMaxTime = timestamp;
+      }
+      if (timestamp < lastDeleteMinTime) {
+        lastDeleteMinTime = timestamp;
+      }
+
+      if (deletePercentage != 0) {
+        if (cnt >= deletePeriod) {
+          cnt = 0;
+          // randomize deleteStartTime in [lastMinTime, max(lastMaxTime-deleteLen,lastMinTime+1)]
+          long rightBound = Math.max(lastDeleteMaxTime - deleteLen, lastDeleteMinTime + 1);
+          long deleteStartTime =
+              (long)
+                  Math.ceil(
+                      lastDeleteMinTime + Math.random() * (rightBound - lastDeleteMinTime + 1));
+          long deleteEndTime = deleteStartTime + deleteLen - 1;
+          session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
+          System.out.println("[[[[delete]]]]]" + deleteStartTime + "," + deleteEndTime);
+
+          lastDeleteMinTime = Long.MAX_VALUE;
+          lastDeleteMaxTime = Long.MIN_VALUE;
+        }
+      }
+    }
+
+    session.executeNonQueryStatement("flush");
+    session.close();
+  }
+}
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteRecTime.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteRecTime.java
new file mode 100644
index 0000000..b49224b
--- /dev/null
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteRecTime.java
@@ -0,0 +1,114 @@
+package org.apache.iotdb.writeData;
+
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.session.Session;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class WriteRecTime {
+
+  /** Before writing data, make sure check the server parameter configurations. */
+  public static void main(String[] args)
+      throws IoTDBConnectionException, StatementExecutionException, IOException {
+    String measurement = "RecTime"; // [[update]]
+    String device = "root.sg1"; // [[update]]
+
+    // 实验自变量1:乱序数据源
+    String filePath = args[0];
+    // 实验自变量2:delete percentage
+    int deletePercentage = Integer.parseInt(args[1]); // 0 means no deletes. 0-100
+    // 实验自变量3:每次删除的时间长度,用chunkAvgTimeLen的百分比表示
+    int deleteLenPercentage = Integer.parseInt(args[2]); // 0-100
+    // 参数4:时间戳idx,从0开始
+    int timeIdx = Integer.parseInt(args[3]);
+    // 参数5:值idx,从0开始
+    int valueIdx = Integer.parseInt(args[4]);
+    // 参数6:chunkAvgTimeLen
+    long chunkAvgTimeLen = Long.parseLong(args[5]);
+
+    if (deletePercentage < 0 || deletePercentage > 100) {
+      throw new IOException("WRONG deletePercentage!");
+    }
+    if (deleteLenPercentage < 0 || deleteLenPercentage > 100) {
+      throw new IOException("WRONG deleteLenPercentage!");
+    }
+
+    int avgSeriesPointNumberThreshold = 10000; // fixed
+    int deletePeriod =
+        (int) Math.floor(100 * 1.0 / deletePercentage * avgSeriesPointNumberThreshold);
+    long deleteLen = (long) Math.floor(chunkAvgTimeLen * deleteLenPercentage * 1.0 / 100);
+
+    List<String> deletePaths = new ArrayList<>();
+    deletePaths.add(device + "." + measurement);
+
+    TSDataType tsDataType = TSDataType.INT64; // value types
+
+    Session session = new Session("127.0.0.1", 6667, "root", "root");
+    session.open(false);
+
+    // this is to make all following inserts unseq chunks
+    session.insertRecord(
+        device,
+        1644181628000L, // ms
+        // NOTE UPDATE TIME DATATYPE! [[update]]. DONT USE System.nanoTime()!
+        Collections.singletonList(measurement),
+        Collections.singletonList(tsDataType), // NOTE UPDATE VALUE DATATYPE!
+        0L); // NOTE UPDATE VALUE DATATYPE!
+    session.executeNonQueryStatement("flush");
+
+    File f = new File(filePath);
+    String line = null;
+    BufferedReader reader = new BufferedReader(new FileReader(f));
+    long lastDeleteMinTime = Long.MAX_VALUE;
+    long lastDeleteMaxTime = Long.MIN_VALUE;
+    int cnt = 0;
+    while ((line = reader.readLine()) != null) {
+      String[] split = line.split(",");
+      long timestamp = Long.parseLong(split[timeIdx]);
+      long value = Long.parseLong(split[valueIdx]);
+      session.insertRecord(
+          device,
+          timestamp,
+          Collections.singletonList(measurement),
+          Collections.singletonList(tsDataType),
+          value);
+      cnt++;
+
+      if (timestamp > lastDeleteMaxTime) {
+        lastDeleteMaxTime = timestamp;
+      }
+      if (timestamp < lastDeleteMinTime) {
+        lastDeleteMinTime = timestamp;
+      }
+
+      if (deletePercentage != 0) {
+        if (cnt >= deletePeriod) {
+          cnt = 0;
+          // randomize deleteStartTime in [lastMinTime, max(lastMaxTime-deleteLen,lastMinTime+1)]
+          long rightBound = Math.max(lastDeleteMaxTime - deleteLen, lastDeleteMinTime + 1);
+          long deleteStartTime =
+              (long)
+                  Math.ceil(
+                      lastDeleteMinTime + Math.random() * (rightBound - lastDeleteMinTime + 1));
+          long deleteEndTime = deleteStartTime + deleteLen - 1;
+          session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
+          System.out.println("[[[[delete]]]]]" + deleteStartTime + "," + deleteEndTime);
+
+          lastDeleteMinTime = Long.MAX_VALUE;
+          lastDeleteMaxTime = Long.MIN_VALUE;
+        }
+      }
+    }
+
+    session.executeNonQueryStatement("flush");
+    session.close();
+  }
+}
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticData1.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticData1.java
index e72acc3..fbc9664 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticData1.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticData1.java
@@ -1,46 +1,46 @@
-package org.apache.iotdb.writeData;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.util.Collections;
-
-public class WriteSyntheticData1 {
-
-  /**
-   * !!!!!!!Before writing data, make sure check the following server parameters:
-   *
-   * <p>system_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/system
-   * data_dirs=/data3/ruilei/iotdb-server-0.12.4/synData1/data
-   * wal_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/wal timestamp_precision=ms
-   * unseq_tsfile_size=1073741824 # maximum size of unseq TsFile is 1024^3 Bytes
-   * seq_tsfile_size=1073741824 # maximum size of seq TsFile is 1024^3 Bytes
-   * avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
-   * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
-   * enable_unseq_compaction=false # unseq compaction is disabled
-   */
-  public static final String device = "root.vehicle.d0";
-
-  public static final String measurements = "s0";
-
-  public static void main(String[] args)
-      throws IoTDBConnectionException, StatementExecutionException {
-
-    Session session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-
-    for (long timestamp = 0; timestamp < 10000000; timestamp++) {
-      double value = Math.random();
-      session.insertRecord(
-          device,
-          timestamp,
-          Collections.singletonList(measurements),
-          Collections.singletonList(TSDataType.DOUBLE),
-          value);
-    }
-    session.executeNonQueryStatement("flush");
-    session.close();
-  }
-}
+// package org.apache.iotdb.writeData;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//
+// import java.util.Collections;
+//
+// public class WriteSyntheticData1 {
+//
+//  /**
+//   * !!!!!!!Before writing data, make sure check the following server parameters:
+//   *
+//   * <p>system_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/system
+//   * data_dirs=/data3/ruilei/iotdb-server-0.12.4/synData1/data
+//   * wal_dir=/data3/ruilei/iotdb-server-0.12.4/synData1/wal timestamp_precision=ms
+//   * unseq_tsfile_size=1073741824 # maximum size of unseq TsFile is 1024^3 Bytes
+//   * seq_tsfile_size=1073741824 # maximum size of seq TsFile is 1024^3 Bytes
+//   * avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
+//   * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
+//   * enable_unseq_compaction=false # unseq compaction is disabled
+//   */
+//  public static final String device = "root.vehicle.d0";
+//
+//  public static final String measurements = "s0";
+//
+//  public static void main(String[] args)
+//      throws IoTDBConnectionException, StatementExecutionException {
+//
+//    Session session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//
+//    for (long timestamp = 0; timestamp < 10000000; timestamp++) {
+//      double value = Math.random();
+//      session.insertRecord(
+//          device,
+//          timestamp,
+//          Collections.singletonList(measurements),
+//          Collections.singletonList(TSDataType.DOUBLE),
+//          value);
+//    }
+//    session.executeNonQueryStatement("flush");
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticDataWithDeletes.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticDataWithDeletes.java
index 2a24c6d..3a6f918 100644
--- a/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticDataWithDeletes.java
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteSyntheticDataWithDeletes.java
@@ -1,63 +1,64 @@
-package org.apache.iotdb.writeData;
-
-import org.apache.iotdb.rpc.IoTDBConnectionException;
-import org.apache.iotdb.rpc.StatementExecutionException;
-import org.apache.iotdb.session.Session;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-public class WriteSyntheticDataWithDeletes {
-
-  /**
-   * !!!!!!!Before writing data, make sure check the following server parameters:
-   *
-   * <p>system_dir data_dirs wal_dir timestamp_precision=ms unseq_tsfile_size=1073741824 # maximum
-   * size of unseq TsFile is 1024^3 Bytes seq_tsfile_size=1073741824 # maximum size of seq TsFile is
-   * 1024^3 Bytes avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
-   * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
-   * enable_unseq_compaction=false # unseq compaction is disabled
-   */
-  public static final String device = "root.vehicle.d0";
-
-  public static final String measurements = "s0";
-
-  public static void main(String[] args)
-      throws IoTDBConnectionException, StatementExecutionException {
-    // 实验自变量1:每隔deleteFreq时间(本实验时间单位ms)就执行一次删除
-    long deleteFreq = Long.parseLong(args[0]);
-    // 实验自变量2:每次删除的时间长度
-    long deleteLen = Long.parseLong(args[1]);
-
-    Session session = new Session("127.0.0.1", 6667, "root", "root");
-    session.open(false);
-
-    List<String> paths = new ArrayList<>();
-    paths.add(device + "." + measurements);
-
-    for (long timestamp = 0; timestamp < 10000000; timestamp++) {
-      if (timestamp != 0 && timestamp % deleteFreq == 0) {
-        // [timestamp-deleteFreq, timestamp-1]内随机取一个删除时间起点
-        long min = timestamp - deleteFreq;
-        long max = timestamp - 1;
-        long deleteStartTime = min + (((long) (new Random().nextDouble() * (max - min))));
-        // delete length 5000ms, half the time length of a chunk
-        long deleteEndTime = deleteStartTime + deleteLen;
-        session.deleteData(paths, deleteStartTime, deleteEndTime);
-      }
-
-      double value = Math.random();
-      session.insertRecord(
-          device,
-          timestamp,
-          Collections.singletonList(measurements),
-          Collections.singletonList(TSDataType.DOUBLE),
-          value);
-    }
-    session.executeNonQueryStatement("flush");
-    session.close();
-  }
-}
+// package org.apache.iotdb.writeData;
+//
+// import org.apache.iotdb.rpc.IoTDBConnectionException;
+// import org.apache.iotdb.rpc.StatementExecutionException;
+// import org.apache.iotdb.session.Session;
+// import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//
+// import java.util.ArrayList;
+// import java.util.Collections;
+// import java.util.List;
+// import java.util.Random;
+//
+// public class WriteSyntheticDataWithDeletes {
+//
+//  /**
+//   * !!!!!!!Before writing data, make sure check the following server parameters:
+//   *
+//   * <p>system_dir data_dirs wal_dir timestamp_precision=ms unseq_tsfile_size=1073741824 # maximum
+//   * size of unseq TsFile is 1024^3 Bytes seq_tsfile_size=1073741824 # maximum size of seq TsFile
+// is
+//   * 1024^3 Bytes avg_series_point_number_threshold=10000 # each chunk contains 10000 data points
+//   * compaction_strategy=NO_COMPACTION # compaction between levels is disabled
+//   * enable_unseq_compaction=false # unseq compaction is disabled
+//   */
+//  public static final String device = "root.vehicle.d0";
+//
+//  public static final String measurements = "s0";
+//
+//  public static void main(String[] args)
+//      throws IoTDBConnectionException, StatementExecutionException {
+//    // 实验自变量1:每隔deleteFreq时间(本实验时间单位ms)就执行一次删除
+//    long deleteFreq = Long.parseLong(args[0]);
+//    // 实验自变量2:每次删除的时间长度
+//    long deleteLen = Long.parseLong(args[1]);
+//
+//    Session session = new Session("127.0.0.1", 6667, "root", "root");
+//    session.open(false);
+//
+//    List<String> paths = new ArrayList<>();
+//    paths.add(device + "." + measurements);
+//
+//    for (long timestamp = 0; timestamp < 10000000; timestamp++) {
+//      if (timestamp != 0 && timestamp % deleteFreq == 0) {
+//        // [timestamp-deleteFreq, timestamp-1]内随机取一个删除时间起点
+//        long min = timestamp - deleteFreq;
+//        long max = timestamp - 1;
+//        long deleteStartTime = min + (((long) (new Random().nextDouble() * (max - min))));
+//        // delete length 5000ms, half the time length of a chunk
+//        long deleteEndTime = deleteStartTime + deleteLen;
+//        session.deleteData(paths, deleteStartTime, deleteEndTime);
+//      }
+//
+//      double value = Math.random();
+//      session.insertRecord(
+//          device,
+//          timestamp,
+//          Collections.singletonList(measurements),
+//          Collections.singletonList(TSDataType.DOUBLE),
+//          value);
+//    }
+//    session.executeNonQueryStatement("flush");
+//    session.close();
+//  }
+// }
diff --git a/example/session/src/main/java/org/apache/iotdb/writeData/WriteTianyuan.java b/example/session/src/main/java/org/apache/iotdb/writeData/WriteTianyuan.java
new file mode 100644
index 0000000..8c4dff3
--- /dev/null
+++ b/example/session/src/main/java/org/apache/iotdb/writeData/WriteTianyuan.java
@@ -0,0 +1,114 @@
+package org.apache.iotdb.writeData;
+
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.session.Session;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class WriteTianyuan {
+
+  /** Before writing data, make sure check the server parameter configurations. */
+  public static void main(String[] args)
+      throws IoTDBConnectionException, StatementExecutionException, IOException {
+    String measurement = "KOB_0002_00_67"; // [[update]]
+    String device = "root.kobelco.trans.03.1090001603.2401604"; // [[update]]
+
+    // 实验自变量1:乱序数据源
+    String filePath = args[0];
+    // 实验自变量2:delete percentage
+    int deletePercentage = Integer.parseInt(args[1]); // 0 means no deletes. 0-100
+    // 实验自变量3:每次删除的时间长度,用chunkAvgTimeLen的百分比表示
+    int deleteLenPercentage = Integer.parseInt(args[2]); // 0-100
+    // 参数4:时间戳idx,从0开始
+    int timeIdx = Integer.parseInt(args[3]);
+    // 参数5:值idx,从0开始
+    int valueIdx = Integer.parseInt(args[4]);
+    // 参数6:chunkAvgTimeLen
+    long chunkAvgTimeLen = Long.parseLong(args[5]);
+
+    if (deletePercentage < 0 || deletePercentage > 100) {
+      throw new IOException("WRONG deletePercentage!");
+    }
+    if (deleteLenPercentage < 0 || deleteLenPercentage > 100) {
+      throw new IOException("WRONG deleteLenPercentage!");
+    }
+
+    int avgSeriesPointNumberThreshold = 10000; // fixed
+    int deletePeriod =
+        (int) Math.floor(100 * 1.0 / deletePercentage * avgSeriesPointNumberThreshold);
+    long deleteLen = (long) Math.floor(chunkAvgTimeLen * deleteLenPercentage * 1.0 / 100);
+
+    List<String> deletePaths = new ArrayList<>();
+    deletePaths.add(device + "." + measurement);
+
+    TSDataType tsDataType = TSDataType.INT64; // value types
+
+    Session session = new Session("127.0.0.1", 6667, "root", "root");
+    session.open(false);
+
+    // this is to make all following inserts unseq chunks
+    session.insertRecord(
+        device,
+        1644181628000L, // ms
+        // NOTE UPDATE TIME DATATYPE! [[update]]. DONT USE System.nanoTime()!
+        Collections.singletonList(measurement),
+        Collections.singletonList(tsDataType), // NOTE UPDATE VALUE DATATYPE!
+        0L); // NOTE UPDATE VALUE DATATYPE!
+    session.executeNonQueryStatement("flush");
+
+    File f = new File(filePath);
+    String line = null;
+    BufferedReader reader = new BufferedReader(new FileReader(f));
+    long lastDeleteMinTime = Long.MAX_VALUE;
+    long lastDeleteMaxTime = Long.MIN_VALUE;
+    int cnt = 0;
+    while ((line = reader.readLine()) != null) {
+      String[] split = line.split(",");
+      long timestamp = Long.parseLong(split[timeIdx]);
+      long value = Long.parseLong(split[valueIdx]);
+      session.insertRecord(
+          device,
+          timestamp,
+          Collections.singletonList(measurement),
+          Collections.singletonList(tsDataType),
+          value);
+      cnt++;
+
+      if (timestamp > lastDeleteMaxTime) {
+        lastDeleteMaxTime = timestamp;
+      }
+      if (timestamp < lastDeleteMinTime) {
+        lastDeleteMinTime = timestamp;
+      }
+
+      if (deletePercentage != 0) {
+        if (cnt >= deletePeriod) {
+          cnt = 0;
+          // randomize deleteStartTime in [lastMinTime, max(lastMaxTime-deleteLen,lastMinTime+1)]
+          long rightBound = Math.max(lastDeleteMaxTime - deleteLen, lastDeleteMinTime + 1);
+          long deleteStartTime =
+              (long)
+                  Math.ceil(
+                      lastDeleteMinTime + Math.random() * (rightBound - lastDeleteMinTime + 1));
+          long deleteEndTime = deleteStartTime + deleteLen - 1;
+          session.deleteData(deletePaths, deleteStartTime, deleteEndTime);
+          System.out.println("[[[[delete]]]]]" + deleteStartTime + "," + deleteEndTime);
+
+          lastDeleteMinTime = Long.MAX_VALUE;
+          lastDeleteMaxTime = Long.MIN_VALUE;
+        }
+      }
+    }
+
+    session.executeNonQueryStatement("flush");
+    session.close();
+  }
+}