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

qiaojialin pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/develop by this push:
     new ccb72f93 Move examples module and rename common-api to common (#12)
ccb72f93 is described below

commit ccb72f93df480eab1728a3d8c1c1db6440fcf175
Author: Jackie Tien <[email protected]>
AuthorDate: Sat Jan 6 22:03:29 2024 +0800

    Move examples module and rename common-api to common (#12)
---
 .gitignore                                         |   8 +-
 {common-api => common}/pom.xml                     |   2 +-
 .../apache/tsfile/block/TsBlockBuilderStatus.java  |   0
 .../org/apache/tsfile/block/column/Column.java     |   0
 .../apache/tsfile/block/column/ColumnBuilder.java  |   0
 .../tsfile/block/column/ColumnBuilderStatus.java   |   0
 .../apache/tsfile/block/column/ColumnEncoding.java |   0
 .../java/org/apache/tsfile/enums/TSDataType.java   |   0
 .../main/java/org/apache/tsfile/utils/Binary.java  |   0
 .../java/org/apache/tsfile/utils/Constants.java    |   0
 .../org/apache/tsfile/utils/RamUsageEstimator.java |   0
 .../org/apache/tsfile/utils/TsPrimitiveType.java   |   0
 .../tsfile/write/UnSupportedDataTypeException.java |   0
 examples/pom.xml                                   |  77 ++++++++
 examples/readme.md                                 |  84 +++++++++
 .../src/main/java/org/apache/tsfile/Constant.java  |  18 +-
 .../org/apache/tsfile/TsFileForceAppendWrite.java  | 124 +++++++++++++
 .../main/java/org/apache/tsfile/TsFileRead.java    | 106 +++++++++++
 .../java/org/apache/tsfile/TsFileSequenceRead.java | 204 +++++++++++++++++++++
 .../tsfile/TsFileWriteAlignedWithTSRecord.java     |  95 ++++++++++
 .../tsfile/TsFileWriteAlignedWithTablet.java       | 149 +++++++++++++++
 .../org/apache/tsfile/TsFileWriteWithTSRecord.java |  94 ++++++++++
 .../org/apache/tsfile/TsFileWriteWithTablet.java   | 107 +++++++++++
 pom.xml                                            |   3 +-
 tsfile/pom.xml                                     |   2 +-
 25 files changed, 1061 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore
index fa2e3ec2..abe15d9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,11 @@
-/.idea/**
 /.mvn/.gradle-enterprise/gradle-enterprise-workspace-id
 /.mvn/wrapper/maven-wrapper.jar
 **/target/**
 /tsfile/test.tsfile
+
+# intellij IDE files
+**/*.iml
+**/.idea/
+**/*.log
+**/*.ipr
+**/*.iws
diff --git a/common-api/pom.xml b/common/pom.xml
similarity index 98%
rename from common-api/pom.xml
rename to common/pom.xml
index 45d6e1b0..6a384f67 100644
--- a/common-api/pom.xml
+++ b/common/pom.xml
@@ -26,7 +26,7 @@
         <artifactId>tsfile-parent</artifactId>
         <version>1.0.0-SNAPSHOT</version>
     </parent>
-    <artifactId>common-api</artifactId>
+    <artifactId>common</artifactId>
     <name>TsFile: Common API</name>
     <profiles>
         <profile>
diff --git 
a/common-api/src/main/java/org/apache/tsfile/block/TsBlockBuilderStatus.java 
b/common/src/main/java/org/apache/tsfile/block/TsBlockBuilderStatus.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/block/TsBlockBuilderStatus.java
rename to common/src/main/java/org/apache/tsfile/block/TsBlockBuilderStatus.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/block/column/Column.java 
b/common/src/main/java/org/apache/tsfile/block/column/Column.java
similarity index 100%
rename from common-api/src/main/java/org/apache/tsfile/block/column/Column.java
rename to common/src/main/java/org/apache/tsfile/block/column/Column.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/block/column/ColumnBuilder.java 
b/common/src/main/java/org/apache/tsfile/block/column/ColumnBuilder.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/block/column/ColumnBuilder.java
rename to common/src/main/java/org/apache/tsfile/block/column/ColumnBuilder.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/block/column/ColumnBuilderStatus.java
 b/common/src/main/java/org/apache/tsfile/block/column/ColumnBuilderStatus.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/block/column/ColumnBuilderStatus.java
rename to 
common/src/main/java/org/apache/tsfile/block/column/ColumnBuilderStatus.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/block/column/ColumnEncoding.java 
b/common/src/main/java/org/apache/tsfile/block/column/ColumnEncoding.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/block/column/ColumnEncoding.java
rename to 
common/src/main/java/org/apache/tsfile/block/column/ColumnEncoding.java
diff --git a/common-api/src/main/java/org/apache/tsfile/enums/TSDataType.java 
b/common/src/main/java/org/apache/tsfile/enums/TSDataType.java
similarity index 100%
rename from common-api/src/main/java/org/apache/tsfile/enums/TSDataType.java
rename to common/src/main/java/org/apache/tsfile/enums/TSDataType.java
diff --git a/common-api/src/main/java/org/apache/tsfile/utils/Binary.java 
b/common/src/main/java/org/apache/tsfile/utils/Binary.java
similarity index 100%
rename from common-api/src/main/java/org/apache/tsfile/utils/Binary.java
rename to common/src/main/java/org/apache/tsfile/utils/Binary.java
diff --git a/common-api/src/main/java/org/apache/tsfile/utils/Constants.java 
b/common/src/main/java/org/apache/tsfile/utils/Constants.java
similarity index 100%
rename from common-api/src/main/java/org/apache/tsfile/utils/Constants.java
rename to common/src/main/java/org/apache/tsfile/utils/Constants.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java 
b/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
rename to common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java 
b/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
similarity index 100%
rename from 
common-api/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
rename to common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
diff --git 
a/common-api/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
 
b/common/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
similarity index 100%
copy from 
common-api/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
copy to 
common/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
diff --git a/examples/pom.xml b/examples/pom.xml
new file mode 100644
index 00000000..ca7e9215
--- /dev/null
+++ b/examples/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.tsfile</groupId>
+        <artifactId>tsfile-parent</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>tsfile-examples</artifactId>
+    <packaging>pom</packaging>
+    <name>TSFile: Examples</name>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tsfile</groupId>
+            <artifactId>tsfile</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <configuration>
+                        <source>8</source>
+                        <target>8</target>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <id>check-dependencies</id>
+                            <goals>
+                                <goal>analyze-only</goal>
+                            </goals>
+                            <phase>verify</phase>
+                            <configuration>
+                                <skip>true</skip>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-enforcer-plugin</artifactId>
+                    <configuration>
+                        <!-- Managing the dependencies of all examples would 
not provide much, but be a lot of work -->
+                        <skip>true</skip>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/examples/readme.md b/examples/readme.md
new file mode 100644
index 00000000..d6907478
--- /dev/null
+++ b/examples/readme.md
@@ -0,0 +1,84 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+
+# Function
+```
+The example is to show how to write and read a TsFile File.
+```
+# Usage
+## Dependencies with Maven
+
+```
+<dependencies>
+    <dependency>
+        <groupId>org.apache.tsfile</groupId>
+        <artifactId>tsfile</artifactId>
+         <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+</dependencies>
+```
+
+
+## Run TsFileWrite.java
+
+
+  This class is to show how to write a TsFile. It provided two ways:
+  
+   The first one is using a JSON string for measurement(s). The JSON string is 
an array of JSON 
+   objects(schema). The object must include the *measurement_id*, *datatype*, 
*encoding*, and 
+   *compressor*. 
+   
+   An example JSON string is provided in the comments in 
+   the method
+   
+        public static void tsFileWriteWithJson() throws 
IOException,WriteProcessException
+   It uses this interface
+   
+        public void addMeasurementByJson(JSONObject measurement) throws 
WriteProcessException  
+   An alternative way is to add these measurements directly(manually) by the 
second interface: 
+   
+         public void addMeasurement(MeasurementSchema measurementSchema) 
throws WriteProcessException
+   
+   The method
+   
+         public static void tsFileWriteDirect() throws 
IOException,WriteProcessException
+   shows how to use that interface.
+   
+   Note that the measurements in the two methods are the same therefore there 
output TsFile should also be identical.
+
+
+  
+## Run TsFileRead.java
+
+ This class is to show how to read TsFile file named "testDirect.tsfile".
+ 
+ The TsFile file "testDirect.tsfile" is generated from class TsFileWrite.
+ 
+ It generates the same TsFile(testDirect.tsfile and testWithJson.tsfile) file 
by two different ways
+ 
+ Run TsFileWrite to generate the testDirect.tsfile first
+ 
+## Run TsFileSequenceRead.java
+
+  This class is to show the structure of a TsFile.
+
+### Notice 
+  For detail, please refer to 
https://github.com/apache/iotdb/blob/master/tsfile/README.md.
diff --git 
a/common-api/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
 b/examples/src/main/java/org/apache/tsfile/Constant.java
similarity index 69%
rename from 
common-api/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
rename to examples/src/main/java/org/apache/tsfile/Constant.java
index a7ab7dac..a6a5bc95 100644
--- 
a/common-api/src/main/java/org/apache/tsfile/write/UnSupportedDataTypeException.java
+++ b/examples/src/main/java/org/apache/tsfile/Constant.java
@@ -17,15 +17,17 @@
  * under the License.
  */
 
-package org.apache.tsfile.write;
+package org.apache.tsfile;
 
-public class UnSupportedDataTypeException extends RuntimeException {
+public class Constant {
 
-  public UnSupportedDataTypeException(String message) {
-    super("Unsupported dataType: " + message);
-  }
+  private Constant() {}
 
-  public UnSupportedDataTypeException(String message, Throwable e) {
-    super(message + e.getMessage());
-  }
+  static final String SENSOR_1 = "sensor_1";
+  static final String SENSOR_2 = "sensor_2";
+  static final String SENSOR_3 = "sensor_3";
+
+  static final String DEVICE_PREFIX = "device_";
+  static final String DEVICE_1 = "root.sg.device_1";
+  static final String DEVICE_2 = "root.sg.device_2";
 }
diff --git 
a/examples/src/main/java/org/apache/tsfile/TsFileForceAppendWrite.java 
b/examples/src/main/java/org/apache/tsfile/TsFileForceAppendWrite.java
new file mode 100644
index 00000000..4bea2092
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileForceAppendWrite.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.TSRecord;
+import org.apache.tsfile.write.record.datapoint.DataPoint;
+import org.apache.tsfile.write.record.datapoint.LongDataPoint;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+import org.apache.tsfile.write.writer.ForceAppendTsFileWriter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+public class TsFileForceAppendWrite {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(TsFileForceAppendWrite.class);
+
+  public static void main(String[] args) throws IOException {
+    String path = "test.tsfile";
+    File f = FSFactoryProducer.getFSFactory().getFile(path);
+    if (f.exists()) {
+      Files.delete(f.toPath());
+    }
+
+    try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
+
+      // add measurements into file schema
+      for (int i = 0; i < 4; i++) {
+        tsFileWriter.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+        tsFileWriter.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+        tsFileWriter.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
+      }
+
+      // construct TSRecord
+      for (int i = 0; i < 100; i++) {
+        TSRecord tsRecord = new TSRecord(i, Constant.DEVICE_PREFIX + (i % 4));
+        DataPoint dPoint1 = new LongDataPoint(Constant.SENSOR_1, i);
+        DataPoint dPoint2 = new LongDataPoint(Constant.SENSOR_2, i);
+        DataPoint dPoint3 = new LongDataPoint(Constant.SENSOR_3, i);
+        tsRecord.addTuple(dPoint1);
+        tsRecord.addTuple(dPoint2);
+        tsRecord.addTuple(dPoint3);
+
+        // write TSRecord
+        tsFileWriter.write(tsRecord);
+      }
+    } catch (Exception e) {
+      LOGGER.error("meet error in TsFileWrite ", e);
+    }
+
+    // open the closed file with ForceAppendTsFileWriter
+
+    try (ForceAppendTsFileWriter fwriter = new ForceAppendTsFileWriter(f)) {
+      fwriter.doTruncate();
+      write(fwriter);
+    } catch (Exception e) {
+      LOGGER.error("ForceAppendTsFileWriter truncate or write error ", e);
+    }
+  }
+
+  private static void write(ForceAppendTsFileWriter fwriter) {
+    try (TsFileWriter tsFileWriter1 = new TsFileWriter(fwriter)) {
+      // add measurements into file schema
+      for (int i = 0; i < 4; i++) {
+        tsFileWriter1.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+        tsFileWriter1.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+        tsFileWriter1.registerTimeseries(
+            new Path(Constant.DEVICE_PREFIX + i),
+            new MeasurementSchema(Constant.SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
+      }
+      // construct TSRecord
+      for (int i = 100; i < 120; i++) {
+        TSRecord tsRecord = new TSRecord(i, Constant.DEVICE_PREFIX + (i % 4));
+        DataPoint dPoint1 = new LongDataPoint(Constant.SENSOR_1, i);
+        DataPoint dPoint2 = new LongDataPoint(Constant.SENSOR_2, i);
+        DataPoint dPoint3 = new LongDataPoint(Constant.SENSOR_3, i);
+        tsRecord.addTuple(dPoint1);
+        tsRecord.addTuple(dPoint2);
+        tsRecord.addTuple(dPoint3);
+
+        // write TSRecord
+        tsFileWriter1.write(tsRecord);
+      }
+    } catch (Exception e) {
+      LOGGER.error("meet error in TsFileWrite ", e);
+    }
+  }
+}
diff --git a/examples/src/main/java/org/apache/tsfile/TsFileRead.java 
b/examples/src/main/java/org/apache/tsfile/TsFileRead.java
new file mode 100644
index 00000000..cb94e9b6
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileRead.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.read.TsFileReader;
+import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.read.expression.IExpression;
+import org.apache.tsfile.read.expression.QueryExpression;
+import org.apache.tsfile.read.expression.impl.BinaryExpression;
+import org.apache.tsfile.read.expression.impl.GlobalTimeExpression;
+import org.apache.tsfile.read.expression.impl.SingleSeriesExpression;
+import org.apache.tsfile.read.filter.factory.TimeFilterApi;
+import org.apache.tsfile.read.filter.factory.ValueFilterApi;
+import org.apache.tsfile.read.query.dataset.QueryDataSet;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import static org.apache.tsfile.Constant.DEVICE_1;
+import static org.apache.tsfile.Constant.SENSOR_1;
+import static org.apache.tsfile.Constant.SENSOR_2;
+import static org.apache.tsfile.Constant.SENSOR_3;
+
+/**
+ * The class is to show how to read TsFile file named "test.tsfile". The 
TsFile file "test.tsfile"
+ * is generated from class TsFileWriteWithTSRecord or TsFileWriteWithTablet. 
Run
+ * TsFileWriteWithTSRecord or TsFileWriteWithTablet to generate the 
test.tsfile first
+ */
+public class TsFileRead {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(TsFileRead.class);
+
+  private static void queryAndPrint(
+      ArrayList<Path> paths, TsFileReader readTsFile, IExpression statement) 
throws IOException {
+    QueryExpression queryExpression = QueryExpression.create(paths, statement);
+    QueryDataSet queryDataSet = readTsFile.query(queryExpression);
+    while (queryDataSet.hasNext()) {
+      String next = queryDataSet.next().toString();
+      LOGGER.info(next);
+    }
+    LOGGER.info("----------------");
+  }
+
+  public static void main(String[] args) throws IOException {
+
+    // file path
+    String path = "test.tsfile";
+
+    // create reader and get the readTsFile interface
+    try (TsFileSequenceReader reader = new TsFileSequenceReader(path);
+        TsFileReader readTsFile = new TsFileReader(reader)) {
+
+      // use these paths(all measurements) for all the queries
+      ArrayList<Path> paths = new ArrayList<>();
+      paths.add(new Path(DEVICE_1, SENSOR_1, true));
+      paths.add(new Path(DEVICE_1, SENSOR_2, true));
+      paths.add(new Path(DEVICE_1, SENSOR_3, true));
+
+      // no filter, should select 1 2 3 4 6 7 8
+      queryAndPrint(paths, readTsFile, null);
+
+      // time filter : 4 <= time <= 10, should select 4 6 7 8
+      IExpression timeFilter =
+          BinaryExpression.and(
+              new GlobalTimeExpression(TimeFilterApi.gtEq(4L)),
+              new GlobalTimeExpression(TimeFilterApi.ltEq(10L)));
+      queryAndPrint(paths, readTsFile, timeFilter);
+
+      // value filter : device_1.sensor_2 <= 20, should select 1 2 4 6 7
+      IExpression valueFilter =
+          new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_2, true), 
ValueFilterApi.ltEq(20L));
+      queryAndPrint(paths, readTsFile, valueFilter);
+
+      // time filter : 4 <= time <= 10, value filter : device_1.sensor_3 >= 
20, should select 4 7 8
+      timeFilter =
+          BinaryExpression.and(
+              new GlobalTimeExpression(TimeFilterApi.gtEq(4L)),
+              new GlobalTimeExpression(TimeFilterApi.ltEq(10L)));
+      valueFilter =
+          new SingleSeriesExpression(new Path(DEVICE_1, SENSOR_3, true), 
ValueFilterApi.gtEq(20L));
+      IExpression finalFilter = BinaryExpression.and(timeFilter, valueFilter);
+      queryAndPrint(paths, readTsFile, finalFilter);
+    }
+  }
+}
diff --git a/examples/src/main/java/org/apache/tsfile/TsFileSequenceRead.java 
b/examples/src/main/java/org/apache/tsfile/TsFileSequenceRead.java
new file mode 100644
index 00000000..132d1bb4
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileSequenceRead.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encoding.decoder.Decoder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.MetaMarker;
+import org.apache.tsfile.file.header.ChunkGroupHeader;
+import org.apache.tsfile.file.header.ChunkHeader;
+import org.apache.tsfile.file.header.PageHeader;
+import org.apache.tsfile.file.metadata.ChunkMetadata;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.TsFileSequenceReader;
+import org.apache.tsfile.read.common.BatchData;
+import org.apache.tsfile.read.reader.page.PageReader;
+import org.apache.tsfile.read.reader.page.TimePageReader;
+import org.apache.tsfile.read.reader.page.ValuePageReader;
+import org.apache.tsfile.utils.TsPrimitiveType;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/** This tool is used to read TsFile sequentially, including nonAligned or 
aligned timeseries. */
+public class TsFileSequenceRead {
+  // if you wanna print detailed datas in pages, then turn it true.
+  private static boolean printDetail = false;
+  public static final String POINT_IN_PAGE = "\t\tpoints in the page: ";
+
+  @SuppressWarnings({
+    "squid:S3776",
+    "squid:S106"
+  }) // Suppress high Cognitive Complexity and Standard outputs warning
+  public static void main(String[] args) throws IOException {
+    String filename = "test.tsfile";
+    if (args.length >= 1) {
+      filename = args[0];
+    }
+    try (TsFileSequenceReader reader = new TsFileSequenceReader(filename)) {
+      System.out.println(
+          "file length: " + 
FSFactoryProducer.getFSFactory().getFile(filename).length());
+      System.out.println("file magic head: " + reader.readHeadMagic());
+      System.out.println("file magic tail: " + reader.readTailMagic());
+      System.out.println("Level 1 metadata position: " + 
reader.getFileMetadataPos());
+      System.out.println("Level 1 metadata size: " + 
reader.getTsFileMetadataSize());
+      // Sequential reading of one ChunkGroup now follows this order:
+      // first the CHUNK_GROUP_HEADER, then SeriesChunks (headers and data) in 
one ChunkGroup
+      // Because we do not know how many chunks a ChunkGroup may have, we 
should read one byte (the
+      // marker) ahead and judge accordingly.
+      reader.position((long) TSFileConfig.MAGIC_STRING.getBytes().length + 1);
+      System.out.println("position: " + reader.position());
+      List<long[]> timeBatch = new ArrayList<>();
+      int pageIndex = 0;
+      byte marker;
+      while ((marker = reader.readMarker()) != MetaMarker.SEPARATOR) {
+        switch (marker) {
+          case MetaMarker.CHUNK_HEADER:
+          case MetaMarker.TIME_CHUNK_HEADER:
+          case MetaMarker.VALUE_CHUNK_HEADER:
+          case MetaMarker.ONLY_ONE_PAGE_CHUNK_HEADER:
+          case MetaMarker.ONLY_ONE_PAGE_TIME_CHUNK_HEADER:
+          case MetaMarker.ONLY_ONE_PAGE_VALUE_CHUNK_HEADER:
+            System.out.println("\t[Chunk]");
+            System.out.println("\tchunk type: " + marker);
+            System.out.println("\tposition: " + reader.position());
+            ChunkHeader header = reader.readChunkHeader(marker);
+            System.out.println("\tMeasurement: " + header.getMeasurementID());
+            if (header.getDataSize() == 0) {
+              // empty value chunk
+              System.out.println("\t-- Empty Chunk ");
+              break;
+            }
+            System.out.println(
+                "\tChunk Size: " + (header.getDataSize() + 
header.getSerializedSize()));
+            Decoder defaultTimeDecoder =
+                Decoder.getDecoderByType(
+                    
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder()),
+                    TSDataType.INT64);
+            Decoder valueDecoder =
+                Decoder.getDecoderByType(header.getEncodingType(), 
header.getDataType());
+            int dataSize = header.getDataSize();
+            pageIndex = 0;
+            if (header.getDataType() == TSDataType.VECTOR) {
+              timeBatch.clear();
+            }
+            while (dataSize > 0) {
+              valueDecoder.reset();
+              System.out.println(
+                  "\t\t[Page" + pageIndex + "]\n \t\tPage head position: " + 
reader.position());
+              PageHeader pageHeader =
+                  reader.readPageHeader(
+                      header.getDataType(),
+                      (header.getChunkType() & 0x3F) == 
MetaMarker.CHUNK_HEADER);
+              System.out.println("\t\tPage data position: " + 
reader.position());
+              ByteBuffer pageData = reader.readPage(pageHeader, 
header.getCompressionType());
+              System.out.println(
+                  "\t\tUncompressed page data size: " + 
pageHeader.getUncompressedSize());
+              System.out.println(
+                  "\t\tCompressed page data size: " + 
pageHeader.getCompressedSize());
+              if ((header.getChunkType() & TsFileConstant.TIME_COLUMN_MASK)
+                  == TsFileConstant.TIME_COLUMN_MASK) { // Time Chunk
+                TimePageReader timePageReader =
+                    new TimePageReader(pageHeader, pageData, 
defaultTimeDecoder);
+                timeBatch.add(timePageReader.getNextTimeBatch());
+                System.out.println(POINT_IN_PAGE + 
timeBatch.get(pageIndex).length);
+                if (printDetail) {
+                  for (int i = 0; i < timeBatch.get(pageIndex).length; i++) {
+                    System.out.println("\t\t\ttime: " + 
timeBatch.get(pageIndex)[i]);
+                  }
+                }
+              } else if ((header.getChunkType() & 
TsFileConstant.VALUE_COLUMN_MASK)
+                  == TsFileConstant.VALUE_COLUMN_MASK) { // Value Chunk
+                ValuePageReader valuePageReader =
+                    new ValuePageReader(pageHeader, pageData, 
header.getDataType(), valueDecoder);
+                TsPrimitiveType[] valueBatch =
+                    valuePageReader.nextValueBatch(timeBatch.get(pageIndex));
+                if (valueBatch.length == 0) {
+                  System.out.println("\t\t-- Empty Page ");
+                } else {
+                  System.out.println(POINT_IN_PAGE + valueBatch.length);
+                }
+                if (printDetail) {
+                  for (TsPrimitiveType batch : valueBatch) {
+                    System.out.println("\t\t\tvalue: " + batch);
+                  }
+                }
+              } else { // NonAligned Chunk
+                PageReader pageReader =
+                    new PageReader(
+                        pageData, header.getDataType(), valueDecoder, 
defaultTimeDecoder);
+                BatchData batchData = pageReader.getAllSatisfiedPageData();
+                if (header.getChunkType() == MetaMarker.CHUNK_HEADER) {
+                  System.out.println(POINT_IN_PAGE + 
pageHeader.getNumOfValues());
+                } else {
+                  System.out.println(POINT_IN_PAGE + batchData.length());
+                }
+                if (printDetail) {
+                  while (batchData.hasCurrent()) {
+                    System.out.println(
+                        "\t\t\ttime, value: "
+                            + batchData.currentTime()
+                            + ", "
+                            + batchData.currentValue());
+                    batchData.next();
+                  }
+                }
+              }
+              pageIndex++;
+              dataSize -= pageHeader.getSerializedPageSize();
+            }
+            break;
+          case MetaMarker.CHUNK_GROUP_HEADER:
+            System.out.println("[Chunk Group]");
+            System.out.println("Chunk Group Header position: " + 
reader.position());
+            ChunkGroupHeader chunkGroupHeader = reader.readChunkGroupHeader();
+            System.out.println("device: " + chunkGroupHeader.getDeviceID());
+            break;
+          case MetaMarker.OPERATION_INDEX_RANGE:
+            reader.readPlanIndex();
+            System.out.println("minPlanIndex: " + reader.getMinPlanIndex());
+            System.out.println("maxPlanIndex: " + reader.getMaxPlanIndex());
+            break;
+          default:
+            MetaMarker.handleUnexpectedMarker(marker);
+        }
+      }
+      System.out.println("[Metadata]");
+      for (String device : reader.getAllDevices()) {
+        Map<String, List<ChunkMetadata>> seriesMetaData = 
reader.readChunkMetadataInDevice(device);
+        System.out.printf(
+            "\t[Device]Device %s, Number of Measurements %d%n", device, 
seriesMetaData.size());
+        for (Map.Entry<String, List<ChunkMetadata>> serie : 
seriesMetaData.entrySet()) {
+          System.out.println("\t\tMeasurement:" + serie.getKey());
+          for (ChunkMetadata chunkMetadata : serie.getValue()) {
+            System.out.println("\t\tFile offset:" + 
chunkMetadata.getOffsetOfChunkHeader());
+          }
+        }
+      }
+    }
+  }
+}
diff --git 
a/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTSRecord.java 
b/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTSRecord.java
new file mode 100644
index 00000000..d218fc94
--- /dev/null
+++ 
b/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTSRecord.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.TSRecord;
+import org.apache.tsfile.write.record.datapoint.DataPoint;
+import org.apache.tsfile.write.record.datapoint.LongDataPoint;
+import org.apache.tsfile.write.schema.IMeasurementSchema;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TsFileWriteAlignedWithTSRecord {
+  private static final Logger logger =
+      LoggerFactory.getLogger(TsFileWriteAlignedWithTSRecord.class);
+
+  public static void main(String[] args) throws IOException {
+    File f = FSFactoryProducer.getFSFactory().getFile("alignedRecord.tsfile");
+    if (f.exists()) {
+      try {
+        Files.delete(f.toPath());
+      } catch (IOException e) {
+        throw new IOException("can not delete " + f.getAbsolutePath());
+      }
+    }
+
+    try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
+      List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+      measurementSchemas.add(
+          new MeasurementSchema(Constant.SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+      measurementSchemas.add(
+          new MeasurementSchema(Constant.SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+      measurementSchemas.add(
+          new MeasurementSchema(Constant.SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
+
+      // register timeseries
+      tsFileWriter.registerAlignedTimeseries(new Path(Constant.DEVICE_1), 
measurementSchemas);
+
+      // example1
+      writeAligned(tsFileWriter, Constant.DEVICE_1, measurementSchemas, 
1000000, 0, 0);
+    } catch (WriteProcessException e) {
+      logger.error("write TSRecord failed", e);
+    }
+  }
+
+  private static void writeAligned(
+      TsFileWriter tsFileWriter,
+      String deviceId,
+      List<MeasurementSchema> schemas,
+      long rowSize,
+      long startTime,
+      long startValue)
+      throws IOException, WriteProcessException {
+    for (long time = startTime; time < rowSize + startTime; time++) {
+      // construct TsRecord
+      TSRecord tsRecord = new TSRecord(time, deviceId);
+      for (IMeasurementSchema schema : schemas) {
+        DataPoint dPoint = new LongDataPoint(schema.getMeasurementId(), 
startValue++);
+        tsRecord.addTuple(dPoint);
+      }
+      // write
+      tsFileWriter.writeAligned(tsRecord);
+    }
+  }
+}
diff --git 
a/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTablet.java 
b/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTablet.java
new file mode 100644
index 00000000..d82acc62
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileWriteAlignedWithTablet.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.tsfile.Constant.DEVICE_1;
+import static org.apache.tsfile.Constant.DEVICE_2;
+import static org.apache.tsfile.Constant.SENSOR_1;
+import static org.apache.tsfile.Constant.SENSOR_2;
+import static org.apache.tsfile.Constant.SENSOR_3;
+
+public class TsFileWriteAlignedWithTablet {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(TsFileWriteAlignedWithTablet.class);
+
+  public static void main(String[] args) throws IOException {
+    File f = FSFactoryProducer.getFSFactory().getFile("alignedTablet.tsfile");
+    if (f.exists()) {
+      try {
+        Files.delete(f.toPath());
+      } catch (IOException e) {
+        throw new IOException("can not delete " + f.getAbsolutePath());
+      }
+    }
+
+    try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
+      List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+      measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.TEXT, 
TSEncoding.PLAIN));
+      measurementSchemas.add(new MeasurementSchema(SENSOR_3, TSDataType.TEXT, 
TSEncoding.PLAIN));
+
+      // register align timeseries
+      tsFileWriter.registerAlignedTimeseries(new Path(DEVICE_1), 
measurementSchemas);
+
+      // example 1
+      writeAlignedWithTablet(tsFileWriter, DEVICE_1, measurementSchemas, 
200000, 0, 0);
+
+      writeNonAlignedWithTablet(tsFileWriter); // write nonAligned timeseries
+    } catch (WriteProcessException e) {
+      LOGGER.error("write Tablet failed", e);
+    }
+  }
+
+  private static void writeAlignedWithTablet(
+      TsFileWriter tsFileWriter,
+      String deviceId,
+      List<MeasurementSchema> schemas,
+      long rowNum,
+      long startTime,
+      long startValue)
+      throws IOException, WriteProcessException {
+    Tablet tablet = new Tablet(deviceId, schemas);
+    long[] timestamps = tablet.timestamps;
+    Object[] values = tablet.values;
+    long sensorNum = schemas.size();
+
+    for (long r = 0; r < rowNum; r++, startValue++) {
+      int row = tablet.rowSize++;
+      timestamps[row] = startTime++;
+      for (int i = 0; i < sensorNum; i++) {
+        Binary[] textSensor = (Binary[]) values[i];
+        textSensor[row] = new Binary("testString.........", 
TSFileConfig.STRING_CHARSET);
+      }
+      // write
+      if (tablet.rowSize == tablet.getMaxRowNumber()) {
+        tsFileWriter.writeAligned(tablet);
+        tablet.reset();
+      }
+    }
+    // write
+    if (tablet.rowSize != 0) {
+      tsFileWriter.writeAligned(tablet);
+      tablet.reset();
+    }
+  }
+
+  private static void writeNonAlignedWithTablet(TsFileWriter tsFileWriter)
+      throws WriteProcessException, IOException {
+    // register nonAlign timeseries
+    tsFileWriter.registerTimeseries(
+        new Path(DEVICE_2), new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+    tsFileWriter.registerTimeseries(
+        new Path(DEVICE_2), new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+    // construct Tablet
+    List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+    measurementSchemas.add(new MeasurementSchema(SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+    measurementSchemas.add(new MeasurementSchema(SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+    Tablet tablet = new Tablet(DEVICE_2, measurementSchemas);
+    long[] timestamps = tablet.timestamps;
+    Object[] values = tablet.values;
+    int rowNum = 100;
+    int sensorNum = measurementSchemas.size();
+    long timestamp = 1;
+    long value = 1000000L;
+    for (int r = 0; r < rowNum; r++, value++) {
+      int row = tablet.rowSize++;
+      timestamps[row] = timestamp++;
+      for (int i = 0; i < sensorNum; i++) {
+        long[] sensor = (long[]) values[i];
+        sensor[row] = value;
+      }
+      // write
+      if (tablet.rowSize == tablet.getMaxRowNumber()) {
+        tsFileWriter.write(tablet);
+        tablet.reset();
+      }
+    }
+    // write
+    if (tablet.rowSize != 0) {
+      tsFileWriter.write(tablet);
+      tablet.reset();
+    }
+  }
+}
diff --git 
a/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTSRecord.java 
b/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTSRecord.java
new file mode 100644
index 00000000..3d0d7ff7
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTSRecord.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.TSRecord;
+import org.apache.tsfile.write.record.datapoint.DataPoint;
+import org.apache.tsfile.write.record.datapoint.LongDataPoint;
+import org.apache.tsfile.write.schema.IMeasurementSchema;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An example of writing data with TSRecord to TsFile It uses the interface: 
public void
+ * addMeasurement(MeasurementSchema measurementSchema) throws 
WriteProcessException
+ */
+public class TsFileWriteWithTSRecord {
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(TsFileWriteWithTSRecord.class);
+
+  public static void main(String[] args) {
+    try {
+      String path = "Record.tsfile";
+      File f = FSFactoryProducer.getFSFactory().getFile(path);
+      if (f.exists()) {
+        Files.delete(f.toPath());
+      }
+
+      try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
+        List<MeasurementSchema> schemas = new ArrayList<>();
+        schemas.add(new MeasurementSchema(Constant.SENSOR_1, TSDataType.INT64, 
TSEncoding.RLE));
+        schemas.add(new MeasurementSchema(Constant.SENSOR_2, TSDataType.INT64, 
TSEncoding.RLE));
+        schemas.add(new MeasurementSchema(Constant.SENSOR_3, TSDataType.INT64, 
TSEncoding.RLE));
+
+        // register timeseries
+        tsFileWriter.registerTimeseries(new Path(Constant.DEVICE_1), schemas);
+
+        // example1
+        write(tsFileWriter, Constant.DEVICE_1, schemas, 10000, 0, 0);
+      }
+    } catch (Exception e) {
+      LOGGER.error("TsFileWriteWithTSRecord meet error", e);
+    }
+  }
+
+  private static void write(
+      TsFileWriter tsFileWriter,
+      String deviceId,
+      List<MeasurementSchema> schemas,
+      long rowSize,
+      long startTime,
+      long startValue)
+      throws IOException, WriteProcessException {
+    for (long time = startTime; time < rowSize + startTime; time++) {
+      // construct TsRecord
+      TSRecord tsRecord = new TSRecord(time, deviceId);
+      for (IMeasurementSchema schema : schemas) {
+        DataPoint dPoint = new LongDataPoint(schema.getMeasurementId(), 
startValue++);
+        tsRecord.addTuple(dPoint);
+      }
+      // write
+      tsFileWriter.write(tsRecord);
+    }
+  }
+}
diff --git 
a/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTablet.java 
b/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTablet.java
new file mode 100644
index 00000000..2461f1da
--- /dev/null
+++ b/examples/src/main/java/org/apache/tsfile/TsFileWriteWithTablet.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tsfile;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.exception.write.WriteProcessException;
+import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.fileSystem.FSFactoryProducer;
+import org.apache.tsfile.read.common.Path;
+import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.write.TsFileWriter;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+/** An example of writing data with Tablet to TsFile */
+public class TsFileWriteWithTablet {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(TsFileWriteWithTablet.class);
+
+  public static void main(String[] args) {
+    try {
+      String path = "Tablet.tsfile";
+      File f = FSFactoryProducer.getFSFactory().getFile(path);
+      if (f.exists()) {
+        Files.delete(f.toPath());
+      }
+
+      try (TsFileWriter tsFileWriter = new TsFileWriter(f)) {
+        List<MeasurementSchema> measurementSchemas = new ArrayList<>();
+        measurementSchemas.add(
+            new MeasurementSchema(Constant.SENSOR_1, TSDataType.TEXT, 
TSEncoding.PLAIN));
+        measurementSchemas.add(
+            new MeasurementSchema(Constant.SENSOR_2, TSDataType.TEXT, 
TSEncoding.PLAIN));
+        measurementSchemas.add(
+            new MeasurementSchema(Constant.SENSOR_3, TSDataType.TEXT, 
TSEncoding.PLAIN));
+
+        // register nonAligned timeseries
+        tsFileWriter.registerTimeseries(new Path(Constant.DEVICE_1), 
measurementSchemas);
+
+        // example 1
+        writeWithTablet(tsFileWriter, Constant.DEVICE_1, measurementSchemas, 
10000, 0, 0);
+      }
+    } catch (Exception e) {
+      LOGGER.error("meet error in TsFileWrite with tablet", e);
+    }
+  }
+
+  private static void writeWithTablet(
+      TsFileWriter tsFileWriter,
+      String deviceId,
+      List<MeasurementSchema> schemas,
+      long rowNum,
+      long startTime,
+      long startValue)
+      throws IOException, WriteProcessException {
+    Tablet tablet = new Tablet(deviceId, schemas);
+    long[] timestamps = tablet.timestamps;
+    Object[] values = tablet.values;
+    long sensorNum = schemas.size();
+
+    for (long r = 0; r < rowNum; r++, startValue++) {
+      int row = tablet.rowSize++;
+      timestamps[row] = startTime++;
+      for (int i = 0; i < sensorNum; i++) {
+        Binary[] textSensor = (Binary[]) values[i];
+        textSensor[row] = new Binary("testString.........", 
TSFileConfig.STRING_CHARSET);
+      }
+      // write
+      if (tablet.rowSize == tablet.getMaxRowNumber()) {
+        tsFileWriter.write(tablet);
+        tablet.reset();
+      }
+    }
+    // write
+    if (tablet.rowSize != 0) {
+      tsFileWriter.write(tablet);
+      tablet.reset();
+    }
+  }
+}
diff --git a/pom.xml b/pom.xml
index 96637b8a..6ee08e6c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,8 +32,9 @@
     <packaging>pom</packaging>
     <name>Apache TsFile Project Parent POM</name>
     <modules>
-        <module>common-api</module>
+        <module>common</module>
         <module>tsfile</module>
+        <module>examples</module>
     </modules>
     <properties>
         <maven.compiler.source>1.8</maven.compiler.source>
diff --git a/tsfile/pom.xml b/tsfile/pom.xml
index 4c76fa89..8596c250 100644
--- a/tsfile/pom.xml
+++ b/tsfile/pom.xml
@@ -37,7 +37,7 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.tsfile</groupId>
-            <artifactId>common-api</artifactId>
+            <artifactId>common</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
         <dependency>

Reply via email to