From 5379dd1e36c36ffa1e1d073c3bba3ca99a2d26b0 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Mon, 29 Aug 2022 14:19:58 +0800 Subject: [PATCH] Revert "doc: restructure" This reverts commit 4f556a61f1fc9af9e2c19ec76f3db731c5103c4e. --- docs/en/04-concept/_category_.yml | 1 - docs/en/04-concept/index.md | 175 ------------------ docs/en/04-concept/supertable.webp | Bin 33420 -> 0 bytes .../{05-get-started.md => 04-get-started.md} | 0 .../01-connect/01-python.md | 0 .../01-connect/02-java.md | 0 .../01-connect/03-go.md | 0 .../01-connect/04-rust.md | 0 .../01-connect/05-node.md | 0 .../01-connect/09-rest-api.md | 0 .../01-connect/_category_.yml | 0 .../02-model.md | 0 .../{12-stream.md => 05-develop/04-stream.md} | 0 .../{15-programming => 05-develop}/index.md | 0 .../index.md | 0 docs/en/{11-tmq.md => 09-data-out/02-tmq.md} | 7 + docs/en/09-data-out/_sub_c.mdx | 3 + docs/en/09-data-out/_sub_cs.mdx | 3 + docs/en/09-data-out/_sub_go.mdx | 3 + docs/en/09-data-out/_sub_java.mdx | 11 ++ docs/en/09-data-out/_sub_node.mdx | 3 + docs/en/09-data-out/_sub_python.mdx | 3 + docs/en/09-data-out/_sub_rust.mdx | 3 + .../01-data-type.md | 0 .../02-database.md | 0 .../{17-taos-sql => 12-taos-sql}/03-table.md | 0 .../{17-taos-sql => 12-taos-sql}/04-stable.md | 0 .../{17-taos-sql => 12-taos-sql}/05-insert.md | 0 .../{17-taos-sql => 12-taos-sql}/06-select.md | 0 .../08-delete-data.mdx | 0 .../10-function.md | 0 .../12-distinguished.md | 0 .../en/{17-taos-sql => 12-taos-sql}/13-tmq.md | 0 .../{17-taos-sql => 12-taos-sql}/14-stream.md | 0 .../16-operators.md | 0 .../{17-taos-sql => 12-taos-sql}/17-json.md | 0 .../{17-taos-sql => 12-taos-sql}/18-escape.md | 0 .../{17-taos-sql => 12-taos-sql}/19-limit.md | 0 .../20-keywords.md | 0 .../en/{17-taos-sql => 12-taos-sql}/26-udf.md | 0 .../{17-taos-sql => 12-taos-sql}/27-index.md | 0 .../_category_.yml | 0 docs/en/{17-taos-sql => 12-taos-sql}/index.md | 0 .../timewindow-1.webp | Bin .../timewindow-2.webp | Bin .../timewindow-3.webp | Bin .../01-python.md | 0 .../03-connector => 15-connector}/02-java.md | 0 .../03-connector => 15-connector}/03-go.md | 0 .../03-connector => 15-connector}/04-rust.md | 0 .../03-connector => 15-connector}/05-node.md | 0 .../09-rest-api.md | 0 .../03-connector => 15-connector}/index.md | 0 docs/en/{19-tools => 17-tools}/01-cli.md | 0 .../03-taosbenchmark.md | 0 docs/en/{19-tools => 17-tools}/index.md | 0 56 files changed, 36 insertions(+), 176 deletions(-) delete mode 100644 docs/en/04-concept/_category_.yml delete mode 100644 docs/en/04-concept/index.md delete mode 100644 docs/en/04-concept/supertable.webp rename docs/en/{05-get-started.md => 04-get-started.md} (100%) rename docs/en/{15-programming => 05-develop}/01-connect/01-python.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/02-java.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/03-go.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/04-rust.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/05-node.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/09-rest-api.md (100%) rename docs/en/{15-programming => 05-develop}/01-connect/_category_.yml (100%) rename docs/en/{15-programming => 05-develop}/02-model.md (100%) rename docs/en/{12-stream.md => 05-develop/04-stream.md} (100%) rename docs/en/{15-programming => 05-develop}/index.md (100%) rename docs/en/{13-replication => 06-replication}/index.md (100%) rename docs/en/{11-tmq.md => 09-data-out/02-tmq.md} (96%) create mode 100644 docs/en/09-data-out/_sub_c.mdx create mode 100644 docs/en/09-data-out/_sub_cs.mdx create mode 100644 docs/en/09-data-out/_sub_go.mdx create mode 100644 docs/en/09-data-out/_sub_java.mdx create mode 100644 docs/en/09-data-out/_sub_node.mdx create mode 100644 docs/en/09-data-out/_sub_python.mdx create mode 100644 docs/en/09-data-out/_sub_rust.mdx rename docs/en/{17-taos-sql => 12-taos-sql}/01-data-type.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/02-database.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/03-table.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/04-stable.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/05-insert.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/06-select.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/08-delete-data.mdx (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/10-function.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/12-distinguished.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/13-tmq.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/14-stream.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/16-operators.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/17-json.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/18-escape.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/19-limit.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/20-keywords.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/26-udf.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/27-index.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/_category_.yml (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/index.md (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/timewindow-1.webp (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/timewindow-2.webp (100%) rename docs/en/{17-taos-sql => 12-taos-sql}/timewindow-3.webp (100%) rename docs/en/{15-programming/03-connector => 15-connector}/01-python.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/02-java.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/03-go.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/04-rust.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/05-node.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/09-rest-api.md (100%) rename docs/en/{15-programming/03-connector => 15-connector}/index.md (100%) rename docs/en/{19-tools => 17-tools}/01-cli.md (100%) rename docs/en/{19-tools => 17-tools}/03-taosbenchmark.md (100%) rename docs/en/{19-tools => 17-tools}/index.md (100%) diff --git a/docs/en/04-concept/_category_.yml b/docs/en/04-concept/_category_.yml deleted file mode 100644 index 12c659a926..0000000000 --- a/docs/en/04-concept/_category_.yml +++ /dev/null @@ -1 +0,0 @@ -label: Concepts \ No newline at end of file diff --git a/docs/en/04-concept/index.md b/docs/en/04-concept/index.md deleted file mode 100644 index 5a9c55fdd6..0000000000 --- a/docs/en/04-concept/index.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Concepts ---- - -In order to explain the basic concepts and provide some sample code, the TDengine documentation smart meters as a typical time series use case. We assume the following: 1. Each smart meter collects three metrics i.e. current, voltage, and phase; 2. There are multiple smart meters; 3. Each meter has static attributes like location and group ID. Based on this, collected data will look similar to the following table: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Device IDTime StampCollected MetricsTags
Device IDTime StampcurrentvoltagephaselocationgroupId
d1001153854868500010.32190.31California.SanFrancisco2
d1002153854868400010.22200.23California.SanFrancisco3
d1003153854868650011.52210.35California.LosAngeles3
d1004153854868550013.42230.29California.LosAngeles2
d1001153854869500012.62180.33California.SanFrancisco2
d1004153854869660011.82210.28California.LosAngeles2
d1002153854869665010.32180.25California.SanFrancisco3
d1001153854869680012.32210.31California.SanFrancisco2
-Table 1: Smart meter example data -
- -Each row contains the device ID, time stamp, collected metrics (current, voltage, phase as above), and static tags (location and groupId in Table 1) associated with the devices. Each smart meter generates a row (measurement) in a pre-defined time interval or triggered by an external event. The device produces a sequence of measurements with associated time stamps. - -## Metric - -Metric refers to the physical quantity collected by sensors, equipment or other types of data collection devices, such as current, voltage, temperature, pressure, GPS position, etc., which change with time, and the data type can be integer, float, Boolean, or strings. As time goes by, the amount of collected metric data stored increases. In the smart meters example, current, voltage and phase are the metrics. - -## Label/Tag - -Label/Tag refers to the static properties of sensors, equipment or other types of data collection devices, which do not change with time, such as device model, color, fixed location of the device, etc. The data type can be any type. Although static, TDengine allows users to add, delete or update tag values at any time. Unlike the collected metric data, the amount of tag data stored does not change over time. In the meters example, `location` and `groupid` are the tags. - -## Data Collection Point - -Data Collection Point (DCP) refers to hardware or software that collects metrics based on preset time periods or triggered by events. A data collection point can collect one or multiple metrics, but these metrics are collected at the same time and have the same time stamp. For some complex equipment, there are often multiple data collection points, and the sampling rate of each collection point may be different, and fully independent. For example, for a car, there could be a data collection point to collect GPS position metrics, a data collection point to collect engine status metrics, and a data collection point to collect the environment metrics inside the car. So in this example the car would have three data collection points. In the smart meters example, d1001, d1002, d1003, and d1004 are the data collection points. - -## Table - -Since time-series data is most likely to be structured data, TDengine adopts the traditional relational database model to process them with a short learning curve. You need to create a database, create tables, then insert data points and execute queries to explore the data. - -To make full use of time-series data characteristics, TDengine adopts a strategy of "**One Table for One Data Collection Point**". TDengine requires the user to create a table for each data collection point (DCP) to store collected time-series data. For example, if there are over 10 million smart meters, it means 10 million tables should be created. For the table above, 4 tables should be created for devices D1001, D1002, D1003, and D1004 to store the data collected. This design has several benefits: - -1. Since the metric data from different DCP are fully independent, the data source of each DCP is unique, and a table has only one writer. In this way, data points can be written in a lock-free manner, and the writing speed can be greatly improved. -2. For a DCP, the metric data generated by DCP is ordered by timestamp, so the write operation can be implemented by simple appending, which further greatly improves the data writing speed. -3. The metric data from a DCP is continuously stored, block by block. If you read data for a period of time, it can greatly reduce random read operations and improve read and query performance by orders of magnitude. -4. Inside a data block for a DCP, columnar storage is used, and different compression algorithms are used for different data types. Metrics generally don't vary as significantly between themselves over a time range as compared to other metrics, which allows for a higher compression rate. - -If the metric data of multiple DCPs are traditionally written into a single table, due to uncontrollable network delays, the timing of the data from different DCPs arriving at the server cannot be guaranteed, write operations must be protected by locks, and metric data from one DCP cannot be guaranteed to be continuously stored together. ** One table for one data collection point can ensure the best performance of insert and query of a single data collection point to the greatest possible extent.** - -TDengine suggests using DCP ID as the table name (like D1001 in the above table). Each DCP may collect one or multiple metrics (like the current, voltage, phase as above). Each metric has a corresponding column in the table. The data type for a column can be int, float, string and others. In addition, the first column in the table must be a timestamp. TDengine uses the time stamp as the index, and won’t build the index on any metrics stored. Column wise storage is used. - -Complex devices, such as connected cars, may have multiple DCPs. In this case, multiple tables are created for a single device, one table per DCP. - -## Super Table (STable) - -The design of one table for one data collection point will require a huge number of tables, which is difficult to manage. Furthermore, applications often need to take aggregation operations among DCPs, thus aggregation operations will become complicated. To support aggregation over multiple tables efficiently, the STable(Super Table) concept is introduced by TDengine. - -STable is a template for a type of data collection point. A STable contains a set of data collection points (tables) that have the same schema or data structure, but with different static attributes (tags). To describe a STable, in addition to defining the table structure of the metrics, it is also necessary to define the schema of its tags. The data type of tags can be int, float, string, and there can be multiple tags, which can be added, deleted, or modified afterward. If the whole system has N different types of data collection points, N STables need to be established. - -In the design of TDengine, **a table is used to represent a specific data collection point, and STable is used to represent a set of data collection points of the same type**. In the smart meters example, we can create a super table named `meters`. - -## Subtable - -When creating a table for a specific data collection point, the user can use a STable as a template and specify the tag values of this specific DCP to create it. ** The table created by using a STable as the template is called subtable** in TDengine. The difference between regular table and subtable is: - -1. Subtable is a table, all SQL commands applied on a regular table can be applied on subtable. -2. Subtable is a table with extensions, it has static tags (labels), and these tags can be added, deleted, and updated after it is created. But a regular table does not have tags. -3. A subtable belongs to only one STable, but a STable may have many subtables. Regular tables do not belong to a STable. -4. A regular table can not be converted into a subtable, and vice versa. - -The relationship between a STable and the subtables created based on this STable is as follows: - -1. A STable contains multiple subtables with the same metric schema but with different tag values. -2. The schema of metrics or labels cannot be adjusted through subtables, and it can only be changed via STable. Changes to the schema of a STable takes effect immediately for all associated subtables. -3. STable defines only one template and does not store any data or label information by itself. Therefore, data cannot be written to a STable, only to subtables. - -Queries can be executed on both a table (subtable) and a STable. For a query on a STable, TDengine will treat the data in all its subtables as a whole data set for processing. TDengine will first find the subtables that meet the tag filter conditions, then scan the time-series data of these subtables to perform aggregation operation, which reduces the number of data sets to be scanned which in turn greatly improves the performance of data aggregation across multiple DCPs. In essence, querying a supertable is a very efficient aggregate query on multiple DCPs of the same type. - -In TDengine, it is recommended to use a subtable instead of a regular table for a DCP. In the smart meters example, we can create subtables like d1001, d1002, d1003, and d1004 under super table meters. - -To better understand the data model using metri, tags, super table and subtable, please refer to the diagram below which demonstrates the data model of the smart meters example. ![Meters Data Model Diagram](./supertable.webp) - -## Database - -A database is a collection of tables. TDengine allows a running instance to have multiple databases, and each database can be configured with different storage policies. The [characteristics of time-series data](https://www.taosdata.com/blog/2019/07/09/86.html) from different data collection points may be different. Characteristics include collection frequency, retention policy and others which determine how you create and configure the database. For e.g. days to keep, number of replicas, data block size, whether data updates are allowed and other configurable parameters would be determined by the characteristics of your data and your business requirements. In order for TDengine to work with maximum efficiency in various scenarios, TDengine recommends that STables with different data characteristics be created in different databases. - -In a database, there can be one or more STables, but a STable belongs to only one database. All tables owned by a STable are stored in only one database. - -## FQDN & End Point - -FQDN (Fully Qualified Domain Name) is the full domain name of a specific computer or host on the Internet. FQDN consists of two parts: hostname and domain name. For example, the FQDN of a mail server might be mail.tdengine.com. The hostname is mail, and the host is located in the domain name tdengine.com. DNS (Domain Name System) is responsible for translating FQDN into IP. For systems without DNS, it can be solved by configuring the hosts file. - -Each node of a TDengine cluster is uniquely identified by an End Point, which consists of an FQDN and a Port, such as h1.tdengine.com:6030. In this way, when the IP changes, we can still use the FQDN to dynamically find the node without changing any configuration of the cluster. In addition, FQDN is used to facilitate unified access to the same cluster from the Intranet and the Internet. - -TDengine does not recommend using an IP address to access the cluster. FQDN is recommended for cluster management. diff --git a/docs/en/04-concept/supertable.webp b/docs/en/04-concept/supertable.webp deleted file mode 100644 index 764b8f3de7ee92a103b2fcd0e75c03773af5ee37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33420 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 R`h(d2t?>V!QQ{7-{|8DPdy4=7 diff --git a/docs/en/05-get-started.md b/docs/en/04-get-started.md similarity index 100% rename from docs/en/05-get-started.md rename to docs/en/04-get-started.md diff --git a/docs/en/15-programming/01-connect/01-python.md b/docs/en/05-develop/01-connect/01-python.md similarity index 100% rename from docs/en/15-programming/01-connect/01-python.md rename to docs/en/05-develop/01-connect/01-python.md diff --git a/docs/en/15-programming/01-connect/02-java.md b/docs/en/05-develop/01-connect/02-java.md similarity index 100% rename from docs/en/15-programming/01-connect/02-java.md rename to docs/en/05-develop/01-connect/02-java.md diff --git a/docs/en/15-programming/01-connect/03-go.md b/docs/en/05-develop/01-connect/03-go.md similarity index 100% rename from docs/en/15-programming/01-connect/03-go.md rename to docs/en/05-develop/01-connect/03-go.md diff --git a/docs/en/15-programming/01-connect/04-rust.md b/docs/en/05-develop/01-connect/04-rust.md similarity index 100% rename from docs/en/15-programming/01-connect/04-rust.md rename to docs/en/05-develop/01-connect/04-rust.md diff --git a/docs/en/15-programming/01-connect/05-node.md b/docs/en/05-develop/01-connect/05-node.md similarity index 100% rename from docs/en/15-programming/01-connect/05-node.md rename to docs/en/05-develop/01-connect/05-node.md diff --git a/docs/en/15-programming/01-connect/09-rest-api.md b/docs/en/05-develop/01-connect/09-rest-api.md similarity index 100% rename from docs/en/15-programming/01-connect/09-rest-api.md rename to docs/en/05-develop/01-connect/09-rest-api.md diff --git a/docs/en/15-programming/01-connect/_category_.yml b/docs/en/05-develop/01-connect/_category_.yml similarity index 100% rename from docs/en/15-programming/01-connect/_category_.yml rename to docs/en/05-develop/01-connect/_category_.yml diff --git a/docs/en/15-programming/02-model.md b/docs/en/05-develop/02-model.md similarity index 100% rename from docs/en/15-programming/02-model.md rename to docs/en/05-develop/02-model.md diff --git a/docs/en/12-stream.md b/docs/en/05-develop/04-stream.md similarity index 100% rename from docs/en/12-stream.md rename to docs/en/05-develop/04-stream.md diff --git a/docs/en/15-programming/index.md b/docs/en/05-develop/index.md similarity index 100% rename from docs/en/15-programming/index.md rename to docs/en/05-develop/index.md diff --git a/docs/en/13-replication/index.md b/docs/en/06-replication/index.md similarity index 100% rename from docs/en/13-replication/index.md rename to docs/en/06-replication/index.md diff --git a/docs/en/11-tmq.md b/docs/en/09-data-out/02-tmq.md similarity index 96% rename from docs/en/11-tmq.md rename to docs/en/09-data-out/02-tmq.md index d563f7bf9f..120b33d88f 100644 --- a/docs/en/11-tmq.md +++ b/docs/en/09-data-out/02-tmq.md @@ -6,6 +6,13 @@ description: Use data subscription to get data from TDengine. import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; +import Java from "./_sub_java.mdx"; +import Python from "./_sub_python.mdx"; +import Go from "./_sub_go.mdx"; +import Rust from "./_sub_rust.mdx"; +import Node from "./_sub_node.mdx"; +import CSharp from "./_sub_cs.mdx"; +import CDemo from "./_sub_c.mdx"; This topic introduces how to read out data from TDengine using data subscription, which is an advanced feature in TDengine. To access the data in TDengine in data subscription way, you need to create topic, create consumer, subscribe to a topic, and consume data. In this document we will briefly explain these main steps of data subscription. diff --git a/docs/en/09-data-out/_sub_c.mdx b/docs/en/09-data-out/_sub_c.mdx new file mode 100644 index 0000000000..b0667268e9 --- /dev/null +++ b/docs/en/09-data-out/_sub_c.mdx @@ -0,0 +1,3 @@ +```c +{{#include docs/examples/c/tmq_example.c}} +``` diff --git a/docs/en/09-data-out/_sub_cs.mdx b/docs/en/09-data-out/_sub_cs.mdx new file mode 100644 index 0000000000..a435ea0273 --- /dev/null +++ b/docs/en/09-data-out/_sub_cs.mdx @@ -0,0 +1,3 @@ +```csharp +{{#include docs/examples/csharp/SubscribeDemo.cs}} +``` \ No newline at end of file diff --git a/docs/en/09-data-out/_sub_go.mdx b/docs/en/09-data-out/_sub_go.mdx new file mode 100644 index 0000000000..34b2aefd92 --- /dev/null +++ b/docs/en/09-data-out/_sub_go.mdx @@ -0,0 +1,3 @@ +```go +{{#include docs/examples/go/sub/main.go}} +``` \ No newline at end of file diff --git a/docs/en/09-data-out/_sub_java.mdx b/docs/en/09-data-out/_sub_java.mdx new file mode 100644 index 0000000000..d14b5fd609 --- /dev/null +++ b/docs/en/09-data-out/_sub_java.mdx @@ -0,0 +1,11 @@ +```java +{{#include docs/examples/java/src/main/java/com/taos/example/SubscribeDemo.java}} +{{#include docs/examples/java/src/main/java/com/taos/example/MetersDeserializer.java}} +{{#include docs/examples/java/src/main/java/com/taos/example/Meters.java}} +``` +```java +{{#include docs/examples/java/src/main/java/com/taos/example/MetersDeserializer.java}} +``` +```java +{{#include docs/examples/java/src/main/java/com/taos/example/Meters.java}} +``` \ No newline at end of file diff --git a/docs/en/09-data-out/_sub_node.mdx b/docs/en/09-data-out/_sub_node.mdx new file mode 100644 index 0000000000..3eeff0922a --- /dev/null +++ b/docs/en/09-data-out/_sub_node.mdx @@ -0,0 +1,3 @@ +```js +{{#include docs/examples/node/nativeexample/subscribe_demo.js}} +``` \ No newline at end of file diff --git a/docs/en/09-data-out/_sub_python.mdx b/docs/en/09-data-out/_sub_python.mdx new file mode 100644 index 0000000000..1309da5b41 --- /dev/null +++ b/docs/en/09-data-out/_sub_python.mdx @@ -0,0 +1,3 @@ +```py +{{#include docs/examples/python/tmq_example.py}} +``` diff --git a/docs/en/09-data-out/_sub_rust.mdx b/docs/en/09-data-out/_sub_rust.mdx new file mode 100644 index 0000000000..eb06c8f18c --- /dev/null +++ b/docs/en/09-data-out/_sub_rust.mdx @@ -0,0 +1,3 @@ +```rust +{{#include docs/examples/rust/cloud-example/examples/subscribe_demo.rs}} +``` diff --git a/docs/en/17-taos-sql/01-data-type.md b/docs/en/12-taos-sql/01-data-type.md similarity index 100% rename from docs/en/17-taos-sql/01-data-type.md rename to docs/en/12-taos-sql/01-data-type.md diff --git a/docs/en/17-taos-sql/02-database.md b/docs/en/12-taos-sql/02-database.md similarity index 100% rename from docs/en/17-taos-sql/02-database.md rename to docs/en/12-taos-sql/02-database.md diff --git a/docs/en/17-taos-sql/03-table.md b/docs/en/12-taos-sql/03-table.md similarity index 100% rename from docs/en/17-taos-sql/03-table.md rename to docs/en/12-taos-sql/03-table.md diff --git a/docs/en/17-taos-sql/04-stable.md b/docs/en/12-taos-sql/04-stable.md similarity index 100% rename from docs/en/17-taos-sql/04-stable.md rename to docs/en/12-taos-sql/04-stable.md diff --git a/docs/en/17-taos-sql/05-insert.md b/docs/en/12-taos-sql/05-insert.md similarity index 100% rename from docs/en/17-taos-sql/05-insert.md rename to docs/en/12-taos-sql/05-insert.md diff --git a/docs/en/17-taos-sql/06-select.md b/docs/en/12-taos-sql/06-select.md similarity index 100% rename from docs/en/17-taos-sql/06-select.md rename to docs/en/12-taos-sql/06-select.md diff --git a/docs/en/17-taos-sql/08-delete-data.mdx b/docs/en/12-taos-sql/08-delete-data.mdx similarity index 100% rename from docs/en/17-taos-sql/08-delete-data.mdx rename to docs/en/12-taos-sql/08-delete-data.mdx diff --git a/docs/en/17-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md similarity index 100% rename from docs/en/17-taos-sql/10-function.md rename to docs/en/12-taos-sql/10-function.md diff --git a/docs/en/17-taos-sql/12-distinguished.md b/docs/en/12-taos-sql/12-distinguished.md similarity index 100% rename from docs/en/17-taos-sql/12-distinguished.md rename to docs/en/12-taos-sql/12-distinguished.md diff --git a/docs/en/17-taos-sql/13-tmq.md b/docs/en/12-taos-sql/13-tmq.md similarity index 100% rename from docs/en/17-taos-sql/13-tmq.md rename to docs/en/12-taos-sql/13-tmq.md diff --git a/docs/en/17-taos-sql/14-stream.md b/docs/en/12-taos-sql/14-stream.md similarity index 100% rename from docs/en/17-taos-sql/14-stream.md rename to docs/en/12-taos-sql/14-stream.md diff --git a/docs/en/17-taos-sql/16-operators.md b/docs/en/12-taos-sql/16-operators.md similarity index 100% rename from docs/en/17-taos-sql/16-operators.md rename to docs/en/12-taos-sql/16-operators.md diff --git a/docs/en/17-taos-sql/17-json.md b/docs/en/12-taos-sql/17-json.md similarity index 100% rename from docs/en/17-taos-sql/17-json.md rename to docs/en/12-taos-sql/17-json.md diff --git a/docs/en/17-taos-sql/18-escape.md b/docs/en/12-taos-sql/18-escape.md similarity index 100% rename from docs/en/17-taos-sql/18-escape.md rename to docs/en/12-taos-sql/18-escape.md diff --git a/docs/en/17-taos-sql/19-limit.md b/docs/en/12-taos-sql/19-limit.md similarity index 100% rename from docs/en/17-taos-sql/19-limit.md rename to docs/en/12-taos-sql/19-limit.md diff --git a/docs/en/17-taos-sql/20-keywords.md b/docs/en/12-taos-sql/20-keywords.md similarity index 100% rename from docs/en/17-taos-sql/20-keywords.md rename to docs/en/12-taos-sql/20-keywords.md diff --git a/docs/en/17-taos-sql/26-udf.md b/docs/en/12-taos-sql/26-udf.md similarity index 100% rename from docs/en/17-taos-sql/26-udf.md rename to docs/en/12-taos-sql/26-udf.md diff --git a/docs/en/17-taos-sql/27-index.md b/docs/en/12-taos-sql/27-index.md similarity index 100% rename from docs/en/17-taos-sql/27-index.md rename to docs/en/12-taos-sql/27-index.md diff --git a/docs/en/17-taos-sql/_category_.yml b/docs/en/12-taos-sql/_category_.yml similarity index 100% rename from docs/en/17-taos-sql/_category_.yml rename to docs/en/12-taos-sql/_category_.yml diff --git a/docs/en/17-taos-sql/index.md b/docs/en/12-taos-sql/index.md similarity index 100% rename from docs/en/17-taos-sql/index.md rename to docs/en/12-taos-sql/index.md diff --git a/docs/en/17-taos-sql/timewindow-1.webp b/docs/en/12-taos-sql/timewindow-1.webp similarity index 100% rename from docs/en/17-taos-sql/timewindow-1.webp rename to docs/en/12-taos-sql/timewindow-1.webp diff --git a/docs/en/17-taos-sql/timewindow-2.webp b/docs/en/12-taos-sql/timewindow-2.webp similarity index 100% rename from docs/en/17-taos-sql/timewindow-2.webp rename to docs/en/12-taos-sql/timewindow-2.webp diff --git a/docs/en/17-taos-sql/timewindow-3.webp b/docs/en/12-taos-sql/timewindow-3.webp similarity index 100% rename from docs/en/17-taos-sql/timewindow-3.webp rename to docs/en/12-taos-sql/timewindow-3.webp diff --git a/docs/en/15-programming/03-connector/01-python.md b/docs/en/15-connector/01-python.md similarity index 100% rename from docs/en/15-programming/03-connector/01-python.md rename to docs/en/15-connector/01-python.md diff --git a/docs/en/15-programming/03-connector/02-java.md b/docs/en/15-connector/02-java.md similarity index 100% rename from docs/en/15-programming/03-connector/02-java.md rename to docs/en/15-connector/02-java.md diff --git a/docs/en/15-programming/03-connector/03-go.md b/docs/en/15-connector/03-go.md similarity index 100% rename from docs/en/15-programming/03-connector/03-go.md rename to docs/en/15-connector/03-go.md diff --git a/docs/en/15-programming/03-connector/04-rust.md b/docs/en/15-connector/04-rust.md similarity index 100% rename from docs/en/15-programming/03-connector/04-rust.md rename to docs/en/15-connector/04-rust.md diff --git a/docs/en/15-programming/03-connector/05-node.md b/docs/en/15-connector/05-node.md similarity index 100% rename from docs/en/15-programming/03-connector/05-node.md rename to docs/en/15-connector/05-node.md diff --git a/docs/en/15-programming/03-connector/09-rest-api.md b/docs/en/15-connector/09-rest-api.md similarity index 100% rename from docs/en/15-programming/03-connector/09-rest-api.md rename to docs/en/15-connector/09-rest-api.md diff --git a/docs/en/15-programming/03-connector/index.md b/docs/en/15-connector/index.md similarity index 100% rename from docs/en/15-programming/03-connector/index.md rename to docs/en/15-connector/index.md diff --git a/docs/en/19-tools/01-cli.md b/docs/en/17-tools/01-cli.md similarity index 100% rename from docs/en/19-tools/01-cli.md rename to docs/en/17-tools/01-cli.md diff --git a/docs/en/19-tools/03-taosbenchmark.md b/docs/en/17-tools/03-taosbenchmark.md similarity index 100% rename from docs/en/19-tools/03-taosbenchmark.md rename to docs/en/17-tools/03-taosbenchmark.md diff --git a/docs/en/19-tools/index.md b/docs/en/17-tools/index.md similarity index 100% rename from docs/en/19-tools/index.md rename to docs/en/17-tools/index.md -- GitLab