This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 270e0d3a224 Region operations for table model (#14794)
270e0d3a224 is described below
commit 270e0d3a224226137162dc722ece8199e45455ba
Author: Li Yu Heng <[email protected]>
AuthorDate: Fri Feb 7 14:31:34 2025 +0800
Region operations for table model (#14794)
* done for table mode
* distinguish table and tree model
* distinguish table and tree model
* self review
---
.../iotdb/confignode/manager/ProcedureManager.java | 36 +++++++--
.../iotdb/db/queryengine/plan/Coordinator.java | 10 ++-
.../queryengine/plan/analyze/AnalyzeVisitor.java | 4 +-
.../execution/config/TableConfigTaskVisitor.java | 45 +++++++++++
.../config/executor/ClusterConfigTaskExecutor.java | 39 +++++-----
.../config/executor/IConfigTaskExecutor.java | 17 ++--
.../config/metadata/region/ExtendRegionTask.java | 20 ++++-
.../config/metadata/region/MigrateRegionTask.java | 21 ++++-
.../metadata/region/ReconstructRegionTask.java | 25 +++++-
.../config/metadata/region/RemoveRegionTask.java | 20 ++++-
.../plan/relational/sql/ast/AstVisitor.java | 16 ++++
.../plan/relational/sql/ast/ExtendRegion.java | 77 ++++++++++++++++++
.../plan/relational/sql/ast/MigrateRegion.java | 90 ++++++++++++++++++++++
.../plan/relational/sql/ast/ReconstructRegion.java | 76 ++++++++++++++++++
.../plan/relational/sql/ast/RemoveRegion.java | 77 ++++++++++++++++++
.../plan/relational/sql/parser/AstBuilder.java | 33 +++++++-
.../db/storageengine/load/LoadTsFileManager.java | 5 +-
.../iotdb/db/utils/constant/SqlConstant.java | 2 +-
.../db/relational/grammar/sql/RelationalSql.g4 | 16 ++++
.../src/main/thrift/confignode.thrift | 4 +
20 files changed, 586 insertions(+), 47 deletions(-)
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index 2b2acd14019..002fcf859ff 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.confignode.manager;
+import org.apache.iotdb.common.rpc.thrift.Model;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
import org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration;
@@ -140,6 +141,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TUnsubscribeReq;
import org.apache.iotdb.consensus.ConsensusFactory;
import org.apache.iotdb.db.exception.BatchProcessException;
import org.apache.iotdb.db.schemaengine.template.Template;
+import org.apache.iotdb.db.utils.constant.SqlConstant;
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
@@ -714,7 +716,8 @@ public class ProcedureManager {
Arrays.asList(
new Pair<>("Original DataNode", originalDataNode),
new Pair<>("Destination DataNode", destDataNode),
- new Pair<>("Coordinator for add peer",
coordinatorForAddPeer)));
+ new Pair<>("Coordinator for add peer", coordinatorForAddPeer)),
+ migrateRegionReq.getModel());
if (configManager
.getPartitionManager()
.getAllReplicaSets(originalDataNode.getDataNodeId())
@@ -755,7 +758,8 @@ public class ProcedureManager {
targetDataNode,
Arrays.asList(
new Pair<>("Target DataNode", targetDataNode),
- new Pair<>("Coordinator", coordinator)));
+ new Pair<>("Coordinator", coordinator)),
+ req.getModel());
ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
if (configManager
@@ -796,7 +800,8 @@ public class ProcedureManager {
targetDataNode,
Arrays.asList(
new Pair<>("Target DataNode", targetDataNode),
- new Pair<>("Coordinator", coordinator)));
+ new Pair<>("Coordinator", coordinator)),
+ req.getModel());
if (configManager
.getPartitionManager()
.getAllReplicaSets(targetDataNode.getDataNodeId())
@@ -828,9 +833,9 @@ public class ProcedureManager {
targetDataNode,
Arrays.asList(
new Pair<>("Target DataNode", targetDataNode),
- new Pair<>("Coordinator", coordinator)));
+ new Pair<>("Coordinator", coordinator)),
+ req.getModel());
- ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
if (configManager
.getPartitionManager()
.getAllReplicaSetsMap(regionId.getType())
@@ -869,10 +874,11 @@ public class ProcedureManager {
private String regionOperationCommonCheck(
TConsensusGroupId regionId,
TDataNodeLocation targetDataNode,
- List<Pair<String, TDataNodeLocation>> relatedDataNodes) {
+ List<Pair<String, TDataNodeLocation>> relatedDataNodes,
+ Model model) {
String failMessage;
-
ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
+
if (TConsensusGroupType.DataRegion == regionId.getType()
&&
ConsensusFactory.SIMPLE_CONSENSUS.equals(conf.getDataRegionConsensusProtocolClass()))
{
failMessage = "SimpleConsensus not supports region operation.";
@@ -899,6 +905,8 @@ public class ProcedureManager {
} else if ((failMessage = checkRegionOperationWithRemoveDataNode(regionId,
targetDataNode))
!= null) {
// need to do nothing more
+ } else if ((failMessage = checkRegionOperationModelCorrectness(regionId,
model)) != null) {
+ // need to do nothing more
}
return failMessage;
@@ -963,6 +971,20 @@ public class ProcedureManager {
return null;
}
+ private String checkRegionOperationModelCorrectness(TConsensusGroupId
regionId, Model model) {
+ String databaseName =
configManager.getPartitionManager().getRegionDatabase(regionId);
+ boolean isTreeModelDatabase =
databaseName.startsWith(SqlConstant.TREE_MODEL_DATABASE_PREFIX);
+ if (Model.TREE == model && isTreeModelDatabase
+ || Model.TABLE == model && !isTreeModelDatabase) {
+ return null;
+ }
+ return String.format(
+ "The region's database %s is belong to %s model, but the model you are
operating is %s",
+ databaseName,
+ isTreeModelDatabase ? Model.TREE.toString() : Model.TABLE.toString(),
+ model.toString());
+ }
+
// end region
public TSStatus migrateRegion(TMigrateRegionReq migrateRegionReq) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index a0602bec83d..3ab76899366 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -70,11 +70,15 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropColumn;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropFunction;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.KillQuery;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.PipeStatement;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetProperties;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowAINodes;
@@ -423,7 +427,11 @@ public class Coordinator {
|| statement instanceof CreateFunction
|| statement instanceof DropFunction
|| statement instanceof ShowFunctions
- || statement instanceof RelationalAuthorStatement) {
+ || statement instanceof RelationalAuthorStatement
+ || statement instanceof MigrateRegion
+ || statement instanceof ReconstructRegion
+ || statement instanceof ExtendRegion
+ || statement instanceof RemoveRegion) {
return new ConfigExecution(
queryContext,
null,
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index f7d0f4c8f59..27111794cc9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -220,7 +220,7 @@ import static
org.apache.iotdb.db.queryengine.plan.relational.planner.optimizati
import static
org.apache.iotdb.db.schemaengine.schemaregion.view.visitor.GetSourcePathsVisitor.getSourcePaths;
import static
org.apache.iotdb.db.storageengine.load.metrics.LoadTsFileCostMetricsSet.ANALYSIS;
import static org.apache.iotdb.db.utils.constant.SqlConstant.COUNT_TIME_HEADER;
-import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT_DOT;
+import static
org.apache.iotdb.db.utils.constant.SqlConstant.TREE_MODEL_DATABASE_PREFIX;
/** This visitor is used to analyze each type of Statement and returns the
{@link Analysis}. */
public class AnalyzeVisitor extends StatementVisitor<Analysis,
MPPQueryContext> {
@@ -2430,7 +2430,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
if (viewPath != null) {
try {
// if it's really view path, it should start with root.
- if (viewPath.startsWith(ROOT_DOT)) {
+ if (viewPath.startsWith(TREE_MODEL_DATABASE_PREFIX)) {
sourcePath = new MeasurementPath(viewPath);
} else {
// otherwise it should just be an alias
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index 18dd15c3ae2..221b0255ea8 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -44,6 +44,10 @@ import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowFuncti
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowPipePluginsTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowRegionTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowVariablesTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterDBTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterTableAddColumnTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.AlterTableDropColumnTask;
@@ -116,15 +120,19 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropPipePlugin;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTable;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropTopic;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.KillQuery;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Node;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Property;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QualifiedName;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameTable;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.SetConfiguration;
@@ -993,4 +1001,41 @@ public class TableConfigTaskVisitor extends
AstVisitor<IConfigTask, MPPQueryCont
context.setQueryType(QueryType.WRITE);
return new DropFunctionTask(Model.TABLE, node.getUdfName());
}
+
+ @Override
+ protected IConfigTask visitMigrateRegion(MigrateRegion migrateRegion,
MPPQueryContext context) {
+ context.setQueryType(QueryType.WRITE);
+
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+ // As the implementation is identical, we'll simply translate to the
+ // corresponding tree-model variant and execute that.
+ return new MigrateRegionTask(migrateRegion);
+ }
+
+ @Override
+ protected IConfigTask visitReconstructRegion(
+ ReconstructRegion reconstructRegion, MPPQueryContext context) {
+ context.setQueryType(QueryType.WRITE);
+
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+ // As the implementation is identical, we'll simply translate to the
+ // corresponding tree-model variant and execute that.
+ return new ReconstructRegionTask(reconstructRegion);
+ }
+
+ @Override
+ protected IConfigTask visitExtendRegion(ExtendRegion extendRegion,
MPPQueryContext context) {
+ context.setQueryType(QueryType.WRITE);
+
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+ // As the implementation is identical, we'll simply translate to the
+ // corresponding tree-model variant and execute that.
+ return new ExtendRegionTask(extendRegion);
+ }
+
+ @Override
+ protected IConfigTask visitRemoveRegion(RemoveRegion removeRegion,
MPPQueryContext context) {
+ context.setQueryType(QueryType.WRITE);
+
accessControl.checkUserHasMaintainPrivilege(context.getSession().getUserName());
+ // As the implementation is identical, we'll simply translate to the
+ // corresponding tree-model variant and execute that.
+ return new RemoveRegionTask(removeRegion);
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 4a70c5991c9..2f3ed1a0f2d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -187,6 +187,10 @@ import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowTTLTas
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowTriggersTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.ShowVariablesTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.model.ShowModelsTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DeleteDeviceTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DescribeTableDetailsTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.DescribeTableTask;
@@ -241,10 +245,6 @@ import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipePlug
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipesStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StartPipeStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StopPipeStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
@@ -2780,16 +2780,16 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
@Override
- public SettableFuture<ConfigTaskResult> migrateRegion(
- final MigrateRegionStatement migrateRegionStatement) {
+ public SettableFuture<ConfigTaskResult> migrateRegion(final
MigrateRegionTask migrateRegionTask) {
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
try (ConfigNodeClient configNodeClient =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
final TMigrateRegionReq tMigrateRegionReq =
new TMigrateRegionReq(
- migrateRegionStatement.getRegionId(),
- migrateRegionStatement.getFromId(),
- migrateRegionStatement.getToId());
+ migrateRegionTask.getStatement().getRegionId(),
+ migrateRegionTask.getStatement().getFromId(),
+ migrateRegionTask.getStatement().getToId(),
+ migrateRegionTask.getModel());
final TSStatus status =
configNodeClient.migrateRegion(tMigrateRegionReq);
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
future.setException(new IoTDBException(status.message, status.code));
@@ -2869,14 +2869,15 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
@Override
public SettableFuture<ConfigTaskResult> reconstructRegion(
- ReconstructRegionStatement reconstructRegionStatement) {
+ ReconstructRegionTask reconstructRegionTask) {
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
try (ConfigNodeClient configNodeClient =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
final TReconstructRegionReq req =
new TReconstructRegionReq(
- reconstructRegionStatement.getRegionIds(),
- reconstructRegionStatement.getDataNodeId());
+ reconstructRegionTask.getStatement().getRegionIds(),
+ reconstructRegionTask.getStatement().getDataNodeId(),
+ reconstructRegionTask.getModel());
final TSStatus status = configNodeClient.reconstructRegion(req);
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
future.setException(new IoTDBException(status.message, status.code));
@@ -2891,14 +2892,15 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
@Override
- public SettableFuture<ConfigTaskResult> extendRegion(
- ExtendRegionStatement extendRegionStatement) {
+ public SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionTask
extendRegionTask) {
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
try (ConfigNodeClient configNodeClient =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
final TExtendRegionReq req =
new TExtendRegionReq(
- extendRegionStatement.getRegionId(),
extendRegionStatement.getDataNodeId());
+ extendRegionTask.getStatement().getRegionId(),
+ extendRegionTask.getStatement().getDataNodeId(),
+ extendRegionTask.getModel());
final TSStatus status = configNodeClient.extendRegion(req);
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
future.setException(new IoTDBException(status.message, status.code));
@@ -2913,14 +2915,15 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
@Override
- public SettableFuture<ConfigTaskResult> removeRegion(
- RemoveRegionStatement removeRegionStatement) {
+ public SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionTask
removeRegionTask) {
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
try (ConfigNodeClient configNodeClient =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
final TRemoveRegionReq req =
new TRemoveRegionReq(
- removeRegionStatement.getRegionId(),
removeRegionStatement.getDataNodeId());
+ removeRegionTask.getStatement().getRegionId(),
+ removeRegionTask.getStatement().getDataNodeId(),
+ removeRegionTask.getModel());
final TSStatus status = configNodeClient.removeRegion(req);
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
future.setException(new IoTDBException(status.message, status.code));
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
index d34ae66ac16..b4c917373a1 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -35,6 +35,10 @@ import org.apache.iotdb.db.protocol.session.IClientSession;
import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
import org.apache.iotdb.db.queryengine.common.SessionInfo;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ExtendRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.MigrateRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.ReconstructRegionTask;
+import
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region.RemoveRegionTask;
import
org.apache.iotdb.db.queryengine.plan.planner.plan.node.metadata.write.view.AlterLogicalViewNode;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DeleteDevice;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DropDB;
@@ -67,10 +71,6 @@ import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipePlug
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.ShowPipesStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StartPipeStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.pipe.StopPipeStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
-import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
@@ -253,14 +253,13 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> countTimeSlotList(
CountTimeSlotListStatement countTimeSlotListStatement);
- SettableFuture<ConfigTaskResult> migrateRegion(MigrateRegionStatement
migrateRegionStatement);
+ SettableFuture<ConfigTaskResult> migrateRegion(MigrateRegionTask
migrateRegionTask);
- SettableFuture<ConfigTaskResult> reconstructRegion(
- ReconstructRegionStatement reconstructRegionStatement);
+ SettableFuture<ConfigTaskResult> reconstructRegion(ReconstructRegionTask
reconstructRegionTask);
- SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionStatement
extendRegionStatement);
+ SettableFuture<ConfigTaskResult> extendRegion(ExtendRegionTask
extendRegionTask);
- SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionStatement
removeRegionStatement);
+ SettableFuture<ConfigTaskResult> removeRegion(RemoveRegionTask
removeRegionTask);
SettableFuture<ConfigTaskResult> removeDataNode(RemoveDataNodeStatement
removeDataNodeStatement);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
index 00dafd9d154..1ffce010927 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ExtendRegionTask.java
@@ -19,9 +19,11 @@
package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
+import org.apache.iotdb.common.rpc.thrift.Model;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ExtendRegionStatement;
import com.google.common.util.concurrent.ListenableFuture;
@@ -29,14 +31,30 @@ import com.google.common.util.concurrent.ListenableFuture;
public class ExtendRegionTask implements IConfigTask {
protected final ExtendRegionStatement statement;
+ private final Model model;
public ExtendRegionTask(ExtendRegionStatement statement) {
this.statement = statement;
+ this.model = Model.TREE;
+ }
+
+ public ExtendRegionTask(ExtendRegion extendRegion) {
+ this.statement =
+ new ExtendRegionStatement(extendRegion.getRegionId(),
extendRegion.getDataNodeId());
+ this.model = Model.TABLE;
}
@Override
public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
throws InterruptedException {
- return configTaskExecutor.extendRegion(statement);
+ return configTaskExecutor.extendRegion(this);
+ }
+
+ public ExtendRegionStatement getStatement() {
+ return statement;
+ }
+
+ public Model getModel() {
+ return model;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
index fd22585aa8c..8c6f2bfe36b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/MigrateRegionTask.java
@@ -19,9 +19,11 @@
package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
+import org.apache.iotdb.common.rpc.thrift.Model;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.MigrateRegionStatement;
import com.google.common.util.concurrent.ListenableFuture;
@@ -29,15 +31,32 @@ import com.google.common.util.concurrent.ListenableFuture;
public class MigrateRegionTask implements IConfigTask {
protected final MigrateRegionStatement statement;
+ private final Model model;
public MigrateRegionTask(MigrateRegionStatement migrateRegionStatement) {
this.statement = migrateRegionStatement;
+ this.model = Model.TREE;
+ }
+
+ public MigrateRegionTask(MigrateRegion migrateRegion) {
+ this.statement =
+ new MigrateRegionStatement(
+ migrateRegion.getRegionId(), migrateRegion.getFromId(),
migrateRegion.getToId());
+ this.model = Model.TABLE;
}
@Override
public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor) {
// If the action is executed successfully, return the Future.
// If your operation is async, you can return the corresponding future
directly.
- return configTaskExecutor.migrateRegion(statement);
+ return configTaskExecutor.migrateRegion(this);
+ }
+
+ public Model getModel() {
+ return this.model;
+ }
+
+ public MigrateRegionStatement getStatement() {
+ return statement;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
index f5276ed64e7..e1d7127f749 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/ReconstructRegionTask.java
@@ -19,24 +19,43 @@
package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
+import org.apache.iotdb.common.rpc.thrift.Model;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.ReconstructRegionStatement;
import com.google.common.util.concurrent.ListenableFuture;
public class ReconstructRegionTask implements IConfigTask {
- protected final ReconstructRegionStatement reconstructRegionStatement;
+ protected final ReconstructRegionStatement statement;
+ private final Model model;
public ReconstructRegionTask(ReconstructRegionStatement
reconstructRegionStatement) {
- this.reconstructRegionStatement = reconstructRegionStatement;
+ this.statement = reconstructRegionStatement;
+ this.model = Model.TREE;
+ }
+
+ public ReconstructRegionTask(ReconstructRegion reconstructRegion) {
+ this.statement =
+ new ReconstructRegionStatement(
+ reconstructRegion.getDataNodeId(),
reconstructRegion.getRegionIds());
+ this.model = Model.TABLE;
}
@Override
public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
throws InterruptedException {
- return configTaskExecutor.reconstructRegion(reconstructRegionStatement);
+ return configTaskExecutor.reconstructRegion(this);
+ }
+
+ public Model getModel() {
+ return model;
+ }
+
+ public ReconstructRegionStatement getStatement() {
+ return statement;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
index 26ecea097f7..86d4bafc9db 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/region/RemoveRegionTask.java
@@ -19,9 +19,11 @@
package org.apache.iotdb.db.queryengine.plan.execution.config.metadata.region;
+import org.apache.iotdb.common.rpc.thrift.Model;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
import
org.apache.iotdb.db.queryengine.plan.statement.metadata.region.RemoveRegionStatement;
import com.google.common.util.concurrent.ListenableFuture;
@@ -29,14 +31,30 @@ import com.google.common.util.concurrent.ListenableFuture;
public class RemoveRegionTask implements IConfigTask {
protected final RemoveRegionStatement statement;
+ private final Model model;
public RemoveRegionTask(RemoveRegionStatement statement) {
this.statement = statement;
+ this.model = Model.TREE;
+ }
+
+ public RemoveRegionTask(RemoveRegion removeRegion) {
+ this.statement =
+ new RemoveRegionStatement(removeRegion.getRegionId(),
removeRegion.getDataNodeId());
+ this.model = Model.TABLE;
}
@Override
public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
throws InterruptedException {
- return configTaskExecutor.removeRegion(statement);
+ return configTaskExecutor.removeRegion(this);
+ }
+
+ public RemoveRegionStatement getStatement() {
+ return statement;
+ }
+
+ public Model getModel() {
+ return model;
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
index ed67e02098d..a5fa1f155fa 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AstVisitor.java
@@ -636,4 +636,20 @@ public abstract class AstVisitor<R, C> {
protected R visitRelationalAuthorPlan(RelationalAuthorStatement node, C
context) {
return visitStatement(node, context);
}
+
+ protected R visitMigrateRegion(MigrateRegion node, C context) {
+ return visitStatement(node, context);
+ }
+
+ protected R visitReconstructRegion(ReconstructRegion node, C context) {
+ return visitStatement(node, context);
+ }
+
+ protected R visitExtendRegion(ExtendRegion node, C context) {
+ return visitStatement(node, context);
+ }
+
+ protected R visitRemoveRegion(RemoveRegion node, C context) {
+ return visitStatement(node, context);
+ }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
new file mode 100644
index 00000000000..687777c8558
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ExtendRegion.java
@@ -0,0 +1,77 @@
+/*
+ * 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.iotdb.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ExtendRegion extends Statement {
+
+ private final int regionId;
+ private final int dataNodeId;
+
+ public ExtendRegion(int regionId, int dataNodeId) {
+ super(null);
+ this.regionId = regionId;
+ this.dataNodeId = dataNodeId;
+ }
+
+ @Override
+ public List<? extends Node> getChildren() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ExtendRegion.class, regionId, dataNodeId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ExtendRegion)) {
+ return false;
+ }
+ ExtendRegion another = (ExtendRegion) obj;
+ return regionId == another.regionId && dataNodeId == another.dataNodeId;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("extend region %d to datanode %d", regionId,
dataNodeId);
+ }
+
+ @Override
+ public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+ return visitor.visitExtendRegion(this, context);
+ }
+
+ public int getRegionId() {
+ return regionId;
+ }
+
+ public int getDataNodeId() {
+ return dataNodeId;
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
new file mode 100644
index 00000000000..4ec5497f471
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/MigrateRegion.java
@@ -0,0 +1,90 @@
+/*
+ * 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.iotdb.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import javax.annotation.Nullable;
+
+import java.util.List;
+import java.util.Objects;
+
+public class MigrateRegion extends Statement {
+ private final int regionId;
+
+ private final int fromId;
+
+ private final int toId;
+
+ public MigrateRegion(int regionId, int fromId, int toId) {
+ this(null, regionId, fromId, toId);
+ }
+
+ public MigrateRegion(@Nullable NodeLocation location, int regionId, int
fromId, int toId) {
+ super(location);
+ this.regionId = regionId;
+ this.fromId = fromId;
+ this.toId = toId;
+ }
+
+ @Override
+ public List<? extends Node> getChildren() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(MigrateRegion.class, regionId, fromId, toId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof MigrateRegion)) {
+ return false;
+ }
+ MigrateRegion another = (MigrateRegion) obj;
+ return regionId == another.regionId && fromId == another.fromId && toId ==
another.toId;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("migrate region %d from %d to %d", regionId, fromId,
toId);
+ }
+
+ @Override
+ public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+ return visitor.visitMigrateRegion(this, context);
+ }
+
+ public int getRegionId() {
+ return regionId;
+ }
+
+ public int getFromId() {
+ return fromId;
+ }
+
+ public int getToId() {
+ return toId;
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
new file mode 100644
index 00000000000..df4aad22606
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ReconstructRegion.java
@@ -0,0 +1,76 @@
+/*
+ * 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.iotdb.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class ReconstructRegion extends Statement {
+ final int dataNodeId;
+ final List<Integer> regionIds;
+
+ public ReconstructRegion(int dataNodeId, List<Integer> regionIds) {
+ super(null);
+ this.dataNodeId = dataNodeId;
+ this.regionIds = regionIds;
+ }
+
+ @Override
+ public List<? extends Node> getChildren() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ReconstructRegion.class, dataNodeId, regionIds);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof ReconstructRegion)) {
+ return false;
+ }
+ ReconstructRegion another = (ReconstructRegion) obj;
+ return dataNodeId == another.dataNodeId &&
regionIds.equals(another.regionIds);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("reconstruct region %s of datanode %d", regionIds,
dataNodeId);
+ }
+
+ @Override
+ public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+ return visitor.visitReconstructRegion(this, context);
+ }
+
+ public int getDataNodeId() {
+ return dataNodeId;
+ }
+
+ public List<Integer> getRegionIds() {
+ return regionIds;
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
new file mode 100644
index 00000000000..8c14433167a
--- /dev/null
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/RemoveRegion.java
@@ -0,0 +1,77 @@
+/*
+ * 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.iotdb.db.queryengine.plan.relational.sql.ast;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+import java.util.Objects;
+
+public class RemoveRegion extends Statement {
+
+ private final int regionId;
+ private final int dataNodeId;
+
+ public RemoveRegion(int regionId, int dataNodeId) {
+ super(null);
+ this.regionId = regionId;
+ this.dataNodeId = dataNodeId;
+ }
+
+ @Override
+ public List<? extends Node> getChildren() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(RemoveRegion.class, regionId, dataNodeId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof RemoveRegion)) {
+ return false;
+ }
+ RemoveRegion another = (RemoveRegion) obj;
+ return regionId == another.regionId && dataNodeId == another.dataNodeId;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("remove region %d from %d", regionId, dataNodeId);
+ }
+
+ @Override
+ public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+ return visitor.visitRemoveRegion(this, context);
+ }
+
+ public int getRegionId() {
+ return regionId;
+ }
+
+ public int getDataNodeId() {
+ return dataNodeId;
+ }
+}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index 27465268674..c1802199e85 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -82,6 +82,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExistsPredicate;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Explain;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExplainAnalyze;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ExtendRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Fill;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Flush;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FunctionCall;
@@ -108,6 +109,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Literal;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LoadTsFile;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.MigrateRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NaturalJoin;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Node;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NodeLocation;
@@ -124,9 +126,11 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QuantifiedCompari
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Query;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QueryBody;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.QuerySpecification;
+import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ReconstructRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Relation;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RelationalAuthorStatement;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveDataNode;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RemoveRegion;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameColumn;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.RenameTable;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Row;
@@ -1141,7 +1145,34 @@ public class AstBuilder extends
RelationalSqlBaseVisitor<Node> {
@Override
public Node
visitMigrateRegionStatement(RelationalSqlParser.MigrateRegionStatementContext
ctx) {
- return super.visitMigrateRegionStatement(ctx);
+ return new MigrateRegion(
+ Integer.parseInt(ctx.regionId.getText()),
+ Integer.parseInt(ctx.fromId.getText()),
+ Integer.parseInt(ctx.toId.getText()));
+ }
+
+ @Override
+ public Node visitReconstructRegionStatement(
+ RelationalSqlParser.ReconstructRegionStatementContext ctx) {
+ int dataNodeId = Integer.parseInt(ctx.targetDataNodeId.getText());
+ List<Integer> regionIds =
+ ctx.regionIds.stream()
+ .map(Token::getText)
+ .map(Integer::parseInt)
+ .collect(Collectors.toList());
+ return new ReconstructRegion(dataNodeId, regionIds);
+ }
+
+ @Override
+ public Node
visitExtendRegionStatement(RelationalSqlParser.ExtendRegionStatementContext
ctx) {
+ return new ExtendRegion(
+ Integer.parseInt(ctx.regionId.getText()),
Integer.parseInt(ctx.targetDataNodeId.getText()));
+ }
+
+ @Override
+ public Node
visitRemoveRegionStatement(RelationalSqlParser.RemoveRegionStatementContext
ctx) {
+ return new RemoveRegion(
+ Integer.parseInt(ctx.regionId.getText()),
Integer.parseInt(ctx.targetDataNodeId.getText()));
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
index 41bbbafe901..74bf838a8d3 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/LoadTsFileManager.java
@@ -77,7 +77,7 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Stream;
import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT;
-import static org.apache.iotdb.db.utils.constant.SqlConstant.ROOT_DOT;
+import static
org.apache.iotdb.db.utils.constant.SqlConstant.TREE_MODEL_DATABASE_PREFIX;
/**
* {@link LoadTsFileManager} is used for dealing with {@link
LoadTsFilePieceNode} and {@link
@@ -445,7 +445,8 @@ public class LoadTsFileManager {
// Table model needs to register TableSchema
final String tableName =
chunkData.getDevice() != null ? chunkData.getDevice().getTableName()
: null;
- if (tableName != null && !(tableName.startsWith(ROOT_DOT) ||
tableName.equals(ROOT))) {
+ if (tableName != null
+ && !(tableName.startsWith(TREE_MODEL_DATABASE_PREFIX) ||
tableName.equals(ROOT))) {
writer
.getSchema()
.getTableSchemaMap()
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
index cad8f229c4e..625af893561 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/constant/SqlConstant.java
@@ -36,7 +36,7 @@ public class SqlConstant {
public static final String ROOT = "root";
- public static final String ROOT_DOT = "root.";
+ public static final String TREE_MODEL_DATABASE_PREFIX = "root.";
public static final String QUOTE = "'";
public static final String DQUOTE = "\"";
diff --git
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
index 20180597005..3d825dcf7fb 100644
---
a/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
+++
b/iotdb-core/relational-grammar/src/main/antlr4/org/apache/iotdb/db/relational/grammar/sql/RelationalSql.g4
@@ -108,6 +108,9 @@ statement
| countTimeSlotListStatement
| showSeriesSlotListStatement
| migrateRegionStatement
+ | reconstructRegionStatement
+ | extendRegionStatement
+ | removeRegionStatement
| removeDataNodeStatement
// Admin Statement
@@ -479,6 +482,18 @@ migrateRegionStatement
: MIGRATE REGION regionId=INTEGER_VALUE FROM fromId=INTEGER_VALUE TO
toId=INTEGER_VALUE
;
+reconstructRegionStatement
+ : RECONSTRUCT REGION regionIds+=INTEGER_VALUE (COMMA
regionIds+=INTEGER_VALUE)* ON targetDataNodeId=INTEGER_VALUE
+ ;
+
+extendRegionStatement
+ : EXTEND REGION regionId=INTEGER_VALUE TO targetDataNodeId=INTEGER_VALUE
+ ;
+
+removeRegionStatement
+ : REMOVE REGION regionId=INTEGER_VALUE FROM targetDataNodeId=INTEGER_VALUE
+ ;
+
removeDataNodeStatement
: REMOVE DATANODE dataNodeId=INTEGER_VALUE (',' dataNodeId=INTEGER_VALUE)*
;
@@ -1188,6 +1203,7 @@ EXCLUDING: 'EXCLUDING';
EXECUTE: 'EXECUTE';
EXISTS: 'EXISTS';
EXPLAIN: 'EXPLAIN';
+EXTEND: 'EXTEND';
EXTRACT: 'EXTRACT';
EXTRACTOR: 'EXTRACTOR';
FALSE: 'FALSE';
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index 7385fafd2e0..c649566fe07 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -310,21 +310,25 @@ struct TMigrateRegionReq {
1: required i32 regionId
2: required i32 fromId
3: required i32 toId
+ 4: required common.Model model
}
struct TReconstructRegionReq {
1: required list<i32> regionIds
2: required i32 dataNodeId
+ 3: required common.Model model
}
struct TExtendRegionReq {
1: required i32 regionId
2: required i32 dataNodeId
+ 3: required common.Model model
}
struct TRemoveRegionReq {
1: required i32 regionId
2: required i32 dataNodeId
+ 3: required common.Model model
}
// Authorize