This is an automated email from the ASF dual-hosted git repository.
zyk 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 a285d428208 Support Delete/Drop Logical View (#9938)
a285d428208 is described below
commit a285d42820852951e58b8fab31c4204dba1781df
Author: Marcos_Zyk <[email protected]>
AuthorDate: Thu May 25 21:32:51 2023 +0800
Support Delete/Drop Logical View (#9938)
---
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 6 +-
.../confignode/client/DataNodeRequestType.java | 5 +
.../client/async/AsyncDataNodeClientPool.java | 21 ++
.../client/async/handlers/AsyncClientHandler.java | 3 +
.../iotdb/confignode/manager/ConfigManager.java | 11 +
.../apache/iotdb/confignode/manager/IManager.java | 3 +
.../iotdb/confignode/manager/ProcedureManager.java | 47 +++
.../impl/schema/DeleteLogicalViewProcedure.java | 353 +++++++++++++++++++++
.../state/schema/DeleteLogicalViewState.java | 26 ++
.../procedure/store/ProcedureFactory.java | 6 +
.../confignode/procedure/store/ProcedureType.java | 5 +-
.../thrift/ConfigNodeRPCServiceProcessor.java | 6 +
.../src/main/thrift/confignode.thrift | 7 +
.../thrift/src/main/thrift/datanode.thrift | 21 ++
.../apache/iotdb/db/client/ConfigNodeClient.java | 22 ++
.../db/metadata/mtree/MTreeBelowSGMemoryImpl.java | 54 ++++
.../plan/schemaregion/SchemaRegionPlanType.java | 3 +
.../plan/schemaregion/SchemaRegionPlanVisitor.java | 17 +
.../impl/SchemaRegionPlanDeserializer.java | 25 ++
.../impl/SchemaRegionPlanSerializer.java | 37 +++
.../impl/SchemaRegionPlanTxtSerializer.java | 25 ++
.../impl/write/DeleteLogicalViewPlanImpl.java | 44 +++
.../impl/write/PreDeleteLogicalViewPlanImpl.java | 44 +++
.../RollbackPreDeleteLogicalViewPlanImpl.java | 44 +++
.../impl/write/SchemaRegionWritePlanFactory.java | 29 ++
.../write/view/IDeleteLogicalViewPlan.java | 42 +++
.../write/view/IPreDeleteLogicalViewPlan.java | 42 +++
.../view/IRollbackPreDeleteLogicalViewPlan.java | 42 +++
.../db/metadata/schemaregion/ISchemaRegion.java | 7 +
.../schemaregion/SchemaRegionMemoryImpl.java | 85 +++++
.../schemaregion/SchemaRegionSchemaFileImpl.java | 15 +
.../metadata/visitor/SchemaExecutionVisitor.java | 44 ++-
.../execution/executor/RegionWriteExecutor.java | 2 +-
.../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 8 +-
.../plan/execution/config/ConfigTaskVisitor.java | 8 +
.../config/executor/ClusterConfigTaskExecutor.java | 43 +++
.../config/executor/IConfigTaskExecutor.java | 4 +
.../metadata/view/DeleteLogicalViewTask.java | 46 +++
.../iotdb/db/mpp/plan/parser/ASTVisitor.java | 14 +-
.../db/mpp/plan/planner/LogicalPlanVisitor.java | 4 +-
.../mpp/plan/planner/plan/node/PlanNodeType.java | 16 +-
.../db/mpp/plan/planner/plan/node/PlanVisitor.java | 25 +-
.../view/ConstructLogicalViewBlackListNode.java | 91 ++++++
.../write/{ => view}/CreateLogicalViewNode.java | 2 +-
.../metedata/write/view/DeleteLogicalViewNode.java | 91 ++++++
.../view/RollbackLogicalViewBlackListNode.java | 91 ++++++
.../iotdb/db/mpp/plan/statement/StatementType.java | 1 +
.../db/mpp/plan/statement/StatementVisitor.java | 8 +-
.../{ => view}/CreateLogicalViewStatement.java | 2 +-
.../metadata/view/DeleteLogicalViewStatement.java | 66 ++++
.../impl/DataNodeInternalRPCServiceImpl.java | 91 ++++++
51 files changed, 1732 insertions(+), 22 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 0642cf4c336..98a866e5fdb 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -64,7 +64,7 @@ ddlStatement
// Quota
| setSpaceQuota | showSpaceQuota | setThrottleQuota | showThrottleQuota
// View
- | createLogicalView
+ | createLogicalView | dropLogicalView
;
dmlStatement
@@ -563,6 +563,10 @@ createLogicalView
: CREATE VIEW viewTargetPaths AS viewSourcePaths
;
+dropLogicalView
+ : (DELETE | DROP) VIEW prefixPath (COMMA prefixPath)*
+ ;
+
viewSuffixPaths
: nodeNameWithoutWildcard (DOT nodeNameWithoutWildcard)*
;
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
b/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
index d36dce571f6..80701acefa8 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
@@ -84,12 +84,17 @@ public enum DataNodeRequestType {
INVALIDATE_MATCHED_SCHEMA_CACHE,
DELETE_DATA_FOR_DELETE_SCHEMA,
DELETE_TIMESERIES,
+
CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE,
ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE,
DEACTIVATE_TEMPLATE,
COUNT_PATHS_USING_TEMPLATE,
CHECK_TIMESERIES_EXISTENCE,
+ CONSTRUCT_VIEW_SCHEMA_BLACK_LIST,
+ ROLLBACK_VIEW_SCHEMA_BLACK_LIST,
+ DELETE_VIEW,
+
/** @TODO Need to migrate to 'Node Maintenance' */
KILL_QUERY_INSTANCE,
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
index 332b7e2317b..018a46ad229 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
@@ -41,6 +41,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TActiveTriggerInstanceReq;
import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq;
import org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListReq;
import
org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TCreateDataRegionReq;
import org.apache.iotdb.mpp.rpc.thrift.TCreateFunctionInstanceReq;
@@ -50,6 +51,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TCreateTriggerInstanceReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeactivateTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteDataForDeleteSchemaReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteTimeSeriesReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
import org.apache.iotdb.mpp.rpc.thrift.TDropFunctionInstanceReq;
import org.apache.iotdb.mpp.rpc.thrift.TDropPipePluginInstanceReq;
import org.apache.iotdb.mpp.rpc.thrift.TDropTriggerInstanceReq;
@@ -61,6 +63,7 @@ import org.apache.iotdb.mpp.rpc.thrift.TRegionLeaderChangeReq;
import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq;
import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateConfigNodeGroupReq;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TUpdateTriggerLocationReq;
@@ -344,6 +347,24 @@ public class AsyncDataNodeClientPool {
(CheckTimeSeriesExistenceRPCHandler)
clientHandler.createAsyncRPCHandler(requestId,
targetDataNode));
break;
+ case CONSTRUCT_VIEW_SCHEMA_BLACK_LIST:
+ client.constructViewSchemaBlackList(
+ (TConstructViewSchemaBlackListReq)
clientHandler.getRequest(requestId),
+ (DeleteSchemaRPCHandler)
+ clientHandler.createAsyncRPCHandler(requestId,
targetDataNode));
+ break;
+ case ROLLBACK_VIEW_SCHEMA_BLACK_LIST:
+ client.rollbackViewSchemaBlackList(
+ (TRollbackViewSchemaBlackListReq)
clientHandler.getRequest(requestId),
+ (DeleteSchemaRPCHandler)
+ clientHandler.createAsyncRPCHandler(requestId,
targetDataNode));
+ break;
+ case DELETE_VIEW:
+ client.deleteViewSchema(
+ (TDeleteViewSchemaReq) clientHandler.getRequest(requestId),
+ (DeleteSchemaRPCHandler)
+ clientHandler.createAsyncRPCHandler(requestId,
targetDataNode));
+ break;
case KILL_QUERY_INSTANCE:
client.killQueryInstance(
(String) clientHandler.getRequest(requestId),
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
index a5904b5f8a8..a37c225a04a 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
@@ -162,6 +162,9 @@ public class AsyncClientHandler<Q, R> {
case CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE:
case ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE:
case DEACTIVATE_TEMPLATE:
+ case CONSTRUCT_VIEW_SCHEMA_BLACK_LIST:
+ case ROLLBACK_VIEW_SCHEMA_BLACK_LIST:
+ case DELETE_VIEW:
return new DeleteSchemaRPCHandler(
requestType,
requestId,
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index c896a0d51b0..42baef81f85 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -121,6 +121,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartResp;
import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropModelReq;
@@ -1582,6 +1583,16 @@ public class ConfigManager implements IManager {
}
}
+ @Override
+ public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+ TSStatus status = confirmLeader();
+ if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ return procedureManager.deleteLogicalView(req);
+ } else {
+ return status;
+ }
+ }
+
@Override
public TSStatus createPipe(TCreatePipeReq req) {
TSStatus status = confirmLeader();
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index 5eea6b30fdf..9e8560d0aec 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -64,6 +64,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartReq;
import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartResp;
import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropModelReq;
@@ -550,6 +551,8 @@ public interface IManager {
*/
TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req);
+ TSStatus deleteLogicalView(TDeleteLogicalViewReq req);
+
/**
* Create Pipe
*
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index a33072f8b19..d842f8dc3ad 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -61,6 +61,7 @@ import
org.apache.iotdb.confignode.procedure.impl.pipe.task.StartPipeProcedureV2
import
org.apache.iotdb.confignode.procedure.impl.pipe.task.StopPipeProcedureV2;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
+import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
@@ -79,6 +80,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreateCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TCreatePipeReq;
import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TMigrateRegionReq;
import org.apache.iotdb.confignode.rpc.thrift.TRegionMigrateResultReportReq;
@@ -221,6 +223,51 @@ public class ProcedureManager {
}
}
+ public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+ String queryId = req.getQueryId();
+ PathPatternTree patternTree =
+ PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+ long procedureId = -1;
+ synchronized (this) {
+ boolean hasOverlappedTask = false;
+ ProcedureType type;
+ DeleteLogicalViewProcedure deleteLogicalViewProcedure;
+ for (Procedure<?> procedure : executor.getProcedures().values()) {
+ type = ProcedureFactory.getProcedureType(procedure);
+ if (type == null ||
!type.equals(ProcedureType.DELETE_TIMESERIES_PROCEDURE)) {
+ continue;
+ }
+ deleteLogicalViewProcedure = ((DeleteLogicalViewProcedure) procedure);
+ if (queryId.equals(deleteLogicalViewProcedure.getQueryId())) {
+ procedureId = deleteLogicalViewProcedure.getProcId();
+ break;
+ }
+ if
(patternTree.isOverlapWith(deleteLogicalViewProcedure.getPatternTree())) {
+ hasOverlappedTask = true;
+ break;
+ }
+ }
+
+ if (procedureId == -1) {
+ if (hasOverlappedTask) {
+ return RpcUtils.getStatus(
+ TSStatusCode.OVERLAP_WITH_EXISTING_TASK,
+ "Some other task is deleting some target views.");
+ }
+ procedureId =
+ this.executor.submitProcedure(new
DeleteLogicalViewProcedure(queryId, patternTree));
+ }
+ }
+ List<TSStatus> procedureStatus = new ArrayList<>();
+ boolean isSucceed =
+ waitingProcedureFinished(Collections.singletonList(procedureId),
procedureStatus);
+ if (isSucceed) {
+ return StatusUtils.OK;
+ } else {
+ return procedureStatus.get(0);
+ }
+ }
+
public TSStatus setSchemaTemplate(String queryId, String templateName,
String templateSetPath) {
long procedureId = -1;
synchronized (this) {
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
new file mode 100644
index 00000000000..e333a3af225
--- /dev/null
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
@@ -0,0 +1,353 @@
+/*
+ * 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.confignode.procedure.impl.schema;
+
+import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
+import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
+import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.confignode.client.DataNodeRequestType;
+import org.apache.iotdb.confignode.client.async.AsyncDataNodeClientPool;
+import org.apache.iotdb.confignode.client.async.handlers.AsyncClientHandler;
+import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
+import
org.apache.iotdb.confignode.procedure.exception.ProcedureSuspendedException;
+import org.apache.iotdb.confignode.procedure.exception.ProcedureYieldException;
+import
org.apache.iotdb.confignode.procedure.impl.statemachine.StateMachineProcedure;
+import
org.apache.iotdb.confignode.procedure.state.schema.DeleteLogicalViewState;
+import org.apache.iotdb.confignode.procedure.store.ProcedureType;
+import org.apache.iotdb.db.exception.metadata.PathNotExistException;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
+import org.apache.iotdb.mpp.rpc.thrift.TInvalidateMatchedSchemaCacheReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+
+public class DeleteLogicalViewProcedure
+ extends StateMachineProcedure<ConfigNodeProcedureEnv,
DeleteLogicalViewState> {
+
+ private static final Logger LOGGER =
LoggerFactory.getLogger(DeleteLogicalViewProcedure.class);
+
+ private String queryId;
+
+ private PathPatternTree patternTree;
+ private transient ByteBuffer patternTreeBytes;
+
+ private transient String requestMessage;
+
+ public DeleteLogicalViewProcedure() {
+ super();
+ }
+
+ public DeleteLogicalViewProcedure(String queryId, PathPatternTree
patternTree) {
+ super();
+ this.queryId = queryId;
+ setPatternTree(patternTree);
+ }
+
+ @Override
+ protected Flow executeFromState(ConfigNodeProcedureEnv env,
DeleteLogicalViewState state)
+ throws ProcedureSuspendedException, ProcedureYieldException,
InterruptedException {
+ long startTime = System.currentTimeMillis();
+ try {
+ switch (state) {
+ case CONSTRUCT_BLACK_LIST:
+ LOGGER.info("Construct view schema black list of view {}",
requestMessage);
+ if (constructBlackList(env) > 0) {
+ setNextState(DeleteLogicalViewState.CLEAN_DATANODE_SCHEMA_CACHE);
+ break;
+ } else {
+ setFailure(
+ new ProcedureException(
+ new PathNotExistException(
+ patternTree.getAllPathPatterns().stream()
+ .map(PartialPath::getFullPath)
+ .collect(Collectors.toList()),
+ false)));
+ return Flow.NO_MORE_STATE;
+ }
+ case CLEAN_DATANODE_SCHEMA_CACHE:
+ LOGGER.info("Invalidate cache of view {}", requestMessage);
+ invalidateCache(env);
+ break;
+ case DELETE_VIEW_SCHEMA:
+ LOGGER.info("Delete view schema of {}", requestMessage);
+ deleteViewSchema(env);
+ return Flow.NO_MORE_STATE;
+ default:
+ setFailure(new ProcedureException("Unrecognized state " +
state.toString()));
+ return Flow.NO_MORE_STATE;
+ }
+ return Flow.HAS_MORE_STATE;
+ } finally {
+ LOGGER.info(
+ String.format(
+ "DeleteLogicalView-[%s] costs %sms",
+ state.toString(), (System.currentTimeMillis() - startTime)));
+ }
+ }
+
+ // return the total num of timeseries in schema black list
+ private long constructBlackList(ConfigNodeProcedureEnv env) {
+ Map<TConsensusGroupId, TRegionReplicaSet> targetSchemaRegionGroup =
+ env.getConfigManager().getRelatedSchemaRegionGroup(patternTree);
+ if (targetSchemaRegionGroup.isEmpty()) {
+ return 0;
+ }
+ List<TSStatus> successResult = new ArrayList<>();
+ DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq>
constructBlackListTask =
+ new
DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq>(
+ "construct view schema black list",
+ env,
+ targetSchemaRegionGroup,
+ DataNodeRequestType.CONSTRUCT_VIEW_SCHEMA_BLACK_LIST,
+ ((dataNodeLocation, consensusGroupIdList) ->
+ new TConstructViewSchemaBlackListReq(consensusGroupIdList,
patternTreeBytes))) {
+ @Override
+ protected List<TConsensusGroupId> processResponseOfOneDataNode(
+ TDataNodeLocation dataNodeLocation,
+ List<TConsensusGroupId> consensusGroupIdList,
+ TSStatus response) {
+ List<TConsensusGroupId> failedRegionList = new ArrayList<>();
+ if (response.getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ successResult.add(response);
+ } else if (response.getCode() ==
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+ List<TSStatus> subStatusList = response.getSubStatus();
+ for (int i = 0; i < subStatusList.size(); i++) {
+ if (subStatusList.get(i).getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ successResult.add(subStatusList.get(i));
+ } else {
+ failedRegionList.add(consensusGroupIdList.get(i));
+ }
+ }
+ } else {
+ failedRegionList.addAll(consensusGroupIdList);
+ }
+ return failedRegionList;
+ }
+ };
+ constructBlackListTask.execute();
+
+ if (isFailed()) {
+ return 0;
+ }
+
+ long preDeletedNum = 0;
+ for (TSStatus resp : successResult) {
+ preDeletedNum += Long.parseLong(resp.getMessage());
+ }
+ return preDeletedNum;
+ }
+
+ private void invalidateCache(ConfigNodeProcedureEnv env) {
+ Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
+ AsyncClientHandler<TInvalidateMatchedSchemaCacheReq, TSStatus>
clientHandler =
+ new AsyncClientHandler<>(
+ DataNodeRequestType.INVALIDATE_MATCHED_SCHEMA_CACHE,
+ new TInvalidateMatchedSchemaCacheReq(patternTreeBytes),
+ dataNodeLocationMap);
+
AsyncDataNodeClientPool.getInstance().sendAsyncRequestToDataNodeWithRetry(clientHandler);
+ Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
+ for (TSStatus status : statusMap.values()) {
+ // all dataNodes must clear the related schema cache
+ if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ LOGGER.error("Failed to invalidate schema cache of view {}",
requestMessage);
+ setFailure(
+ new ProcedureException(new MetadataException("Invalidate view
schema cache failed")));
+ return;
+ }
+ }
+
+ setNextState(DeleteLogicalViewState.DELETE_VIEW_SCHEMA);
+ }
+
+ private void deleteViewSchema(ConfigNodeProcedureEnv env) {
+ DeleteLogicalViewRegionTaskExecutor<TDeleteViewSchemaReq>
deleteTimeSeriesTask =
+ new DeleteLogicalViewRegionTaskExecutor<>(
+ "delete view schema",
+ env,
+ env.getConfigManager().getRelatedSchemaRegionGroup(patternTree),
+ DataNodeRequestType.DELETE_VIEW,
+ ((dataNodeLocation, consensusGroupIdList) ->
+ new TDeleteViewSchemaReq(consensusGroupIdList,
patternTreeBytes)));
+ deleteTimeSeriesTask.execute();
+ }
+
+ @Override
+ protected void rollbackState(
+ ConfigNodeProcedureEnv env, DeleteLogicalViewState
deleteLogicalViewState)
+ throws IOException, InterruptedException, ProcedureException {
+ DeleteLogicalViewRegionTaskExecutor<TRollbackViewSchemaBlackListReq>
rollbackStateTask =
+ new DeleteLogicalViewRegionTaskExecutor<>(
+ "roll back view schema black list",
+ env,
+ env.getConfigManager().getRelatedSchemaRegionGroup(patternTree),
+ DataNodeRequestType.ROLLBACK_VIEW_SCHEMA_BLACK_LIST,
+ (dataNodeLocation, consensusGroupIdList) ->
+ new TRollbackViewSchemaBlackListReq(consensusGroupIdList,
patternTreeBytes));
+ rollbackStateTask.execute();
+ }
+
+ @Override
+ protected boolean isRollbackSupported(DeleteLogicalViewState
deleteLogicalViewState) {
+ return true;
+ }
+
+ @Override
+ protected DeleteLogicalViewState getState(int stateId) {
+ return DeleteLogicalViewState.values()[stateId];
+ }
+
+ @Override
+ protected int getStateId(DeleteLogicalViewState deleteLogicalViewState) {
+ return deleteLogicalViewState.ordinal();
+ }
+
+ @Override
+ protected DeleteLogicalViewState getInitialState() {
+ return DeleteLogicalViewState.CONSTRUCT_BLACK_LIST;
+ }
+
+ public String getQueryId() {
+ return queryId;
+ }
+
+ public PathPatternTree getPatternTree() {
+ return patternTree;
+ }
+
+ public void setPatternTree(PathPatternTree patternTree) {
+ this.patternTree = patternTree;
+ requestMessage = patternTree.getAllPathPatterns().toString();
+ patternTreeBytes = preparePatternTreeBytesData(patternTree);
+ }
+
+ private ByteBuffer preparePatternTreeBytesData(PathPatternTree patternTree) {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ DataOutputStream dataOutputStream = new
DataOutputStream(byteArrayOutputStream);
+ try {
+ patternTree.serialize(dataOutputStream);
+ } catch (IOException ignored) {
+
+ }
+ return ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
+ }
+
+ @Override
+ public void serialize(DataOutputStream stream) throws IOException {
+
stream.writeShort(ProcedureType.DELETE_LOGICAL_VIEW_PROCEDURE.getTypeCode());
+ super.serialize(stream);
+ ReadWriteIOUtils.write(queryId, stream);
+ patternTree.serialize(stream);
+ }
+
+ @Override
+ public void deserialize(ByteBuffer byteBuffer) {
+ super.deserialize(byteBuffer);
+ queryId = ReadWriteIOUtils.readString(byteBuffer);
+ setPatternTree(PathPatternTree.deserialize(byteBuffer));
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ DeleteLogicalViewProcedure that = (DeleteLogicalViewProcedure) o;
+ return this.getProcId() == that.getProcId()
+ && this.getState() == that.getState()
+ && patternTree.equals(that.patternTree);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getProcId(), getState(), patternTree);
+ }
+
+ private class DeleteLogicalViewRegionTaskExecutor<Q>
+ extends DataNodeRegionTaskExecutor<Q, TSStatus> {
+
+ private final String taskName;
+
+ DeleteLogicalViewRegionTaskExecutor(
+ String taskName,
+ ConfigNodeProcedureEnv env,
+ Map<TConsensusGroupId, TRegionReplicaSet> targetSchemaRegionGroup,
+ DataNodeRequestType dataNodeRequestType,
+ BiFunction<TDataNodeLocation, List<TConsensusGroupId>, Q>
dataNodeRequestGenerator) {
+ super(env, targetSchemaRegionGroup, false, dataNodeRequestType,
dataNodeRequestGenerator);
+ this.taskName = taskName;
+ }
+
+ @Override
+ protected List<TConsensusGroupId> processResponseOfOneDataNode(
+ TDataNodeLocation dataNodeLocation,
+ List<TConsensusGroupId> consensusGroupIdList,
+ TSStatus response) {
+ List<TConsensusGroupId> failedRegionList = new ArrayList<>();
+ if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ return failedRegionList;
+ }
+
+ if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+ List<TSStatus> subStatus = response.getSubStatus();
+ for (int i = 0; i < subStatus.size(); i++) {
+ if (subStatus.get(i).getCode() !=
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ failedRegionList.add(consensusGroupIdList.get(i));
+ }
+ }
+ } else {
+ failedRegionList.addAll(consensusGroupIdList);
+ }
+ return failedRegionList;
+ }
+
+ @Override
+ protected void onAllReplicasetFailure(
+ TConsensusGroupId consensusGroupId, Set<TDataNodeLocation>
dataNodeLocationSet) {
+ setFailure(
+ new ProcedureException(
+ new MetadataException(
+ String.format(
+ "Delete view %s failed when [%s] because all replicaset
of schemaRegion %s failed. %s",
+ requestMessage, taskName, consensusGroupId.id,
dataNodeLocationSet))));
+ interruptTask();
+ }
+ }
+}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
new file mode 100644
index 00000000000..fa608fb423c
--- /dev/null
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
@@ -0,0 +1,26 @@
+/*
+ * 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.confignode.procedure.state.schema;
+
+public enum DeleteLogicalViewState {
+ CONSTRUCT_BLACK_LIST,
+ CLEAN_DATANODE_SCHEMA_CACHE,
+ DELETE_VIEW_SCHEMA
+}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index ab180dc8026..e352f606312 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@ -37,6 +37,7 @@ import
org.apache.iotdb.confignode.procedure.impl.pipe.task.StartPipeProcedureV2
import
org.apache.iotdb.confignode.procedure.impl.pipe.task.StopPipeProcedureV2;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
+import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
import
org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
@@ -92,6 +93,9 @@ public class ProcedureFactory implements IProcedureFactory {
case DELETE_TIMESERIES_PROCEDURE:
procedure = new DeleteTimeSeriesProcedure();
break;
+ case DELETE_LOGICAL_VIEW_PROCEDURE:
+ procedure = new DeleteLogicalViewProcedure();
+ break;
case CREATE_TRIGGER_PROCEDURE:
procedure = new CreateTriggerProcedure();
break;
@@ -222,6 +226,8 @@ public class ProcedureFactory implements IProcedureFactory {
return ProcedureType.PIPE_META_SYNC_PROCEDURE;
} else if (procedure instanceof PipeHandleMetaChangeProcedure) {
return ProcedureType.PIPE_HANDLE_META_CHANGE_PROCEDURE;
+ } else if (procedure instanceof DeleteLogicalViewProcedure) {
+ return ProcedureType.DELETE_LOGICAL_VIEW_PROCEDURE;
}
return null;
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
index 12839b5b412..7e6ffa008ea 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
@@ -75,7 +75,10 @@ public enum ProcedureType {
/** Pipe Runtime */
PIPE_HANDLE_LEADER_CHANGE_PROCEDURE((short) 1100),
PIPE_META_SYNC_PROCEDURE((short) 1101),
- PIPE_HANDLE_META_CHANGE_PROCEDURE((short) 1102);
+ PIPE_HANDLE_META_CHANGE_PROCEDURE((short) 1102),
+
+ /** logical view */
+ DELETE_LOGICAL_VIEW_PROCEDURE((short) 1200);
private final short typeCode;
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index c2b44e07de1..6e73fee6675 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -97,6 +97,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabaseReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -857,6 +858,11 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
return configManager.deleteTimeSeries(req);
}
+ @Override
+ public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+ return configManager.deleteLogicalView(req);
+ }
+
@Override
@Deprecated
public TSStatus createPipeSink(TPipeSinkInfo req) {
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index c70bafcb47d..e9d41faea32 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -659,6 +659,11 @@ struct TDeleteTimeSeriesReq{
2: required binary pathPatternTree
}
+struct TDeleteLogicalViewReq{
+ 1: required string queryId
+ 2: required binary pathPatternTree
+}
+
// ====================================================
// CQ
// ====================================================
@@ -1260,6 +1265,8 @@ service IConfigNodeRPCService {
*/
common.TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req)
+ common.TSStatus deleteLogicalView(TDeleteLogicalViewReq req)
+
// ======================================================
// Sync
// ======================================================
diff --git a/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
b/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
index d519a2e80e4..727d2e8f2a1 100644
--- a/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
+++ b/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
@@ -387,6 +387,21 @@ struct TPushPipeMetaReq {
1: required list<binary> pipeMetas
}
+struct TConstructViewSchemaBlackListReq{
+ 1: required list<common.TConsensusGroupId> schemaRegionIdList
+ 2: required binary pathPatternTree
+}
+
+struct TRollbackViewSchemaBlackListReq{
+ 1: required list<common.TConsensusGroupId> schemaRegionIdList
+ 2: required binary pathPatternTree
+}
+
+struct TDeleteViewSchemaReq{
+ 1: required list<common.TConsensusGroupId> schemaRegionIdList
+ 2: required binary pathPatternTree
+}
+
// ====================================================
// CQ
// ====================================================
@@ -764,6 +779,12 @@ service IDataNodeRPCService {
TCheckTimeSeriesExistenceResp
checkTimeSeriesExistence(TCheckTimeSeriesExistenceReq req)
+ common.TSStatus
constructViewSchemaBlackList(TConstructViewSchemaBlackListReq req)
+
+ common.TSStatus rollbackViewSchemaBlackList(TRollbackViewSchemaBlackListReq
req)
+
+ common.TSStatus deleteViewSchema(TDeleteViewSchemaReq req)
+
/**
* Send pipeMetas to DataNodes, for synchronization
*/
diff --git
a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 4376f6a4eec..f9d69c2caa4 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -66,6 +66,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabaseReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -1695,6 +1696,27 @@ public class ConfigNodeClient implements
IConfigNodeRPCService.Iface, ThriftClie
throw new TException(MSG_RECONNECTION_FAIL);
}
+ @Override
+ public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) throws
TException {
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TSStatus status = client.deleteLogicalView(req);
+ if (!updateConfigNodeLeader(status)) {
+ return status;
+ }
+ } catch (TException e) {
+ logger.warn(
+ "Failed to connect to ConfigNode {} from DataNode {} when
executing {}",
+ configNode,
+ config.getAddressAndPort(),
+ Thread.currentThread().getStackTrace()[1].getMethodName());
+ configLeader = null;
+ }
+ waitAndReconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
+ }
+
@Override
public TSStatus createPipeSink(TPipeSinkInfo req) throws TException {
for (int i = 0; i < RETRY_NUM; i++) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index bd6cacb9747..6eeadd9d61c 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -1082,5 +1082,59 @@ public class MTreeBelowSGMemoryImpl {
return measurementMNode;
}
}
+
+ public List<PartialPath> constructLogicalViewBlackList(PartialPath
pathPattern)
+ throws MetadataException {
+ List<PartialPath> result = new ArrayList<>();
+ try (MeasurementUpdater<IMemMNode> updater =
+ new MeasurementUpdater<IMemMNode>(rootNode, pathPattern, store, false)
{
+
+ protected void updateMeasurement(IMeasurementMNode<IMemMNode> node) {
+ if (node.isLogicalView()) {
+ node.setPreDeleted(true);
+ result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+ }
+ }
+ }) {
+ updater.update();
+ }
+ return result;
+ }
+
+ public List<PartialPath> rollbackLogicalViewBlackList(PartialPath
pathPattern)
+ throws MetadataException {
+ List<PartialPath> result = new ArrayList<>();
+ try (MeasurementUpdater<IMemMNode> updater =
+ new MeasurementUpdater<IMemMNode>(rootNode, pathPattern, store, false)
{
+
+ protected void updateMeasurement(IMeasurementMNode<IMemMNode> node) {
+ if (node.isLogicalView()) {
+ node.setPreDeleted(false);
+ result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+ }
+ }
+ }) {
+ updater.update();
+ }
+ return result;
+ }
+
+ public List<PartialPath> getPreDeletedLogicalView(PartialPath pathPattern)
+ throws MetadataException {
+ List<PartialPath> result = new LinkedList<>();
+ try (MeasurementCollector<Void, IMemMNode> collector =
+ new MeasurementCollector<Void, IMemMNode>(rootNode, pathPattern,
store, false) {
+
+ protected Void collectMeasurement(IMeasurementMNode<IMemMNode> node)
{
+ if (node.isLogicalView() && node.isPreDeleted()) {
+ result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+ }
+ return null;
+ }
+ }) {
+ collector.traverse();
+ }
+ return result;
+ }
// endregion
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
index 0d36c801614..33e4dbd2136 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
@@ -46,6 +46,9 @@ public enum SchemaRegionPlanType {
DEACTIVATE_TEMPLATE((byte) 2),
// logical view
CREATE_LOGICAL_VIEW((byte) 66),
+ PRE_DELETE_LOGICAL_VIEW((byte) 67),
+ ROLLBACK_PRE_DELETE_LOGICAL_VIEW((byte) 68),
+ DELETE_LOGICAL_VIEW((byte) 69),
// query plan doesn't need any ser/deSer, thus use one type to represent all
READ_SCHEMA(Byte.MAX_VALUE);
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
index e6d145139a4..4936e3160aa 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
@@ -32,6 +32,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
public abstract class SchemaRegionPlanVisitor<R, C> {
@@ -94,4 +97,18 @@ public abstract class SchemaRegionPlanVisitor<R, C> {
public R visitCreateLogicalView(ICreateLogicalViewPlan
createLogicalViewPlan, C context) {
return visitSchemaRegionPlan(createLogicalViewPlan, context);
}
+
+ public R visitPreDeleteLogicalView(
+ IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, C context) {
+ return visitSchemaRegionPlan(preDeleteLogicalViewPlan, context);
+ }
+
+ public R visitRollbackPreDeleteLogicalView(
+ IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan, C
context) {
+ return visitSchemaRegionPlan(rollbackPreDeleteLogicalViewPlan, context);
+ }
+
+ public R visitDeleteLogicalView(IDeleteLogicalViewPlan
deleteLogicalViewPlan, C context) {
+ return visitSchemaRegionPlan(deleteLogicalViewPlan, context);
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
index a251b662f22..e4ff058041e 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
@@ -41,6 +41,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -361,5 +364,27 @@ public class SchemaRegionPlanDeserializer implements
IDeserializer<ISchemaRegion
createLogicalViewPlan.setViewPathToSourceExpressionMap(viewPathToSourceMap);
return createLogicalViewPlan;
}
+
+ @Override
+ public ISchemaRegionPlan visitPreDeleteLogicalView(
+ IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, ByteBuffer buffer)
{
+ preDeleteLogicalViewPlan.setPath((PartialPath)
PathDeserializeUtil.deserialize(buffer));
+ return preDeleteLogicalViewPlan;
+ }
+
+ @Override
+ public ISchemaRegionPlan visitRollbackPreDeleteLogicalView(
+ IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
ByteBuffer buffer) {
+ rollbackPreDeleteLogicalViewPlan.setPath(
+ (PartialPath) PathDeserializeUtil.deserialize(buffer));
+ return rollbackPreDeleteLogicalViewPlan;
+ }
+
+ @Override
+ public ISchemaRegionPlan visitDeleteLogicalView(
+ IDeleteLogicalViewPlan deleteLogicalViewPlan, ByteBuffer buffer) {
+ deleteLogicalViewPlan.setPath((PartialPath)
PathDeserializeUtil.deserialize(buffer));
+ return deleteLogicalViewPlan;
+ }
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
index ee56a8b7d03..d4dd9041b40 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
@@ -37,6 +37,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -424,5 +427,39 @@ public class SchemaRegionPlanSerializer implements
ISerializer<ISchemaRegionPlan
return new SchemaRegionPlanSerializationResult(e);
}
}
+
+ @Override
+ public SchemaRegionPlanSerializationResult visitPreDeleteLogicalView(
+ IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, DataOutputStream
dataOutputStream) {
+ try {
+ preDeleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+ return SchemaRegionPlanSerializationResult.SUCCESS;
+ } catch (IOException e) {
+ return new SchemaRegionPlanSerializationResult(e);
+ }
+ }
+
+ @Override
+ public SchemaRegionPlanSerializationResult
visitRollbackPreDeleteLogicalView(
+ IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+ DataOutputStream dataOutputStream) {
+ try {
+ rollbackPreDeleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+ return SchemaRegionPlanSerializationResult.SUCCESS;
+ } catch (IOException e) {
+ return new SchemaRegionPlanSerializationResult(e);
+ }
+ }
+
+ @Override
+ public SchemaRegionPlanSerializationResult visitDeleteLogicalView(
+ IDeleteLogicalViewPlan deleteLogicalViewPlan, DataOutputStream
dataOutputStream) {
+ try {
+ deleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+ return SchemaRegionPlanSerializationResult.SUCCESS;
+ } catch (IOException e) {
+ return new SchemaRegionPlanSerializationResult(e);
+ }
+ }
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
index 400b8efd57c..a4445f967de 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
@@ -37,6 +37,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -261,5 +264,27 @@ public class SchemaRegionPlanTxtSerializer implements
ISerializer<ISchemaRegionP
}
return null;
}
+
+ @Override
+ public Void visitPreDeleteLogicalView(
+ IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, StringBuilder
stringBuilder) {
+ stringBuilder.append(preDeleteLogicalViewPlan.getPath().getFullPath());
+ return null;
+ }
+
+ @Override
+ public Void visitRollbackPreDeleteLogicalView(
+ IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+ StringBuilder stringBuilder) {
+
stringBuilder.append(rollbackPreDeleteLogicalViewPlan.getPath().getFullPath());
+ return null;
+ }
+
+ @Override
+ public Void visitDeleteLogicalView(
+ IDeleteLogicalViewPlan deleteLogicalViewPlan, StringBuilder
stringBuilder) {
+ stringBuilder.append(deleteLogicalViewPlan.getPath().getFullPath());
+ return null;
+ }
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..b20c2c7da37
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * 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.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+
+public class DeleteLogicalViewPlanImpl implements IDeleteLogicalViewPlan {
+
+ private PartialPath path;
+
+ DeleteLogicalViewPlanImpl() {}
+
+ DeleteLogicalViewPlanImpl(PartialPath path) {
+ this.path = path;
+ }
+
+ @Override
+ public PartialPath getPath() {
+ return path;
+ }
+
+ @Override
+ public void setPath(PartialPath path) {
+ this.path = path;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..77c4eb88ee3
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * 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.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+
+public class PreDeleteLogicalViewPlanImpl implements IPreDeleteLogicalViewPlan
{
+
+ private PartialPath path;
+
+ PreDeleteLogicalViewPlanImpl() {}
+
+ PreDeleteLogicalViewPlanImpl(PartialPath path) {
+ this.path = path;
+ }
+
+ @Override
+ public PartialPath getPath() {
+ return path;
+ }
+
+ @Override
+ public void setPath(PartialPath path) {
+ this.path = path;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..a61a7f3b9df
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * 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.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
+
+public class RollbackPreDeleteLogicalViewPlanImpl implements
IRollbackPreDeleteLogicalViewPlan {
+
+ private PartialPath path;
+
+ RollbackPreDeleteLogicalViewPlanImpl() {}
+
+ RollbackPreDeleteLogicalViewPlanImpl(PartialPath path) {
+ this.path = path;
+ }
+
+ @Override
+ public PartialPath getPath() {
+ return path;
+ }
+
+ @Override
+ public void setPath(PartialPath path) {
+ this.path = path;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
index e8491905240..1ee9a2bc834 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.metadata.plan.schemaregion.impl.write;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IActivateTemplateInClusterPlan;
@@ -27,6 +28,7 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IAutoCreateDeviceMNo
import org.apache.iotdb.db.metadata.plan.schemaregion.write.IChangeAliasPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IChangeTagOffsetPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateAlignedTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateLogicalViewPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeleteTimeSeriesPlan;
@@ -34,6 +36,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -73,6 +78,12 @@ public class SchemaRegionWritePlanFactory {
return new DeactivateTemplatePlanImpl();
case CREATE_LOGICAL_VIEW:
return new CreateLogicalViewPlanImpl();
+ case PRE_DELETE_LOGICAL_VIEW:
+ return new PreDeleteLogicalViewPlanImpl();
+ case ROLLBACK_PRE_DELETE_LOGICAL_VIEW:
+ return new RollbackPreDeleteLogicalViewPlanImpl();
+ case DELETE_LOGICAL_VIEW:
+ return new DeleteLogicalViewPlanImpl();
default:
throw new UnsupportedOperationException(
String.format(
@@ -158,4 +169,22 @@ public class SchemaRegionWritePlanFactory {
Map<PartialPath, List<Integer>> templateSetInfo) {
return new DeactivateTemplatePlanImpl(templateSetInfo);
}
+
+ public static ICreateLogicalViewPlan getCreateLogicalViewPlan(
+ PartialPath targetPath, ViewExpression sourceExpression) {
+ return new CreateLogicalViewPlanImpl(targetPath, sourceExpression);
+ }
+
+ public static IPreDeleteLogicalViewPlan
getPreDeleteLogicalViewPlan(PartialPath path) {
+ return new PreDeleteLogicalViewPlanImpl(path);
+ }
+
+ public static IRollbackPreDeleteLogicalViewPlan
getRollbackPreDeleteLogicalViewPlan(
+ PartialPath path) {
+ return new RollbackPreDeleteLogicalViewPlanImpl(path);
+ }
+
+ public static IDeleteLogicalViewPlan getDeleteLogicalViewPlan(PartialPath
path) {
+ return new DeleteLogicalViewPlanImpl(path);
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..83f598592e2
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * 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.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+ @Override
+ default SchemaRegionPlanType getPlanType() {
+ return SchemaRegionPlanType.DELETE_LOGICAL_VIEW;
+ }
+
+ @Override
+ default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+ return visitor.visitDeleteLogicalView(this, context);
+ }
+
+ PartialPath getPath();
+
+ void setPath(PartialPath path);
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..ae9f4a09034
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * 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.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IPreDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+ @Override
+ default SchemaRegionPlanType getPlanType() {
+ return SchemaRegionPlanType.PRE_DELETE_LOGICAL_VIEW;
+ }
+
+ @Override
+ default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+ return visitor.visitPreDeleteLogicalView(this, context);
+ }
+
+ PartialPath getPath();
+
+ void setPath(PartialPath path);
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..794d2b6faf5
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * 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.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IRollbackPreDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+ @Override
+ default SchemaRegionPlanType getPlanType() {
+ return SchemaRegionPlanType.ROLLBACK_PRE_DELETE_LOGICAL_VIEW;
+ }
+
+ @Override
+ default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+ return visitor.visitRollbackPreDeleteLogicalView(this, context);
+ }
+
+ PartialPath getPath();
+
+ void setPath(PartialPath path);
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
index 902aedbd93d..fb204799738 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
@@ -176,6 +176,13 @@ public interface ISchemaRegion {
// region Interfaces for Logical View
void createLogicalView(ICreateLogicalViewPlan createLogicalViewPlan) throws
MetadataException;
+
+ long constructLogicalViewBlackList(PathPatternTree patternTree) throws
MetadataException;
+
+ void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws
MetadataException;
+
+ void deleteLogicalView(PathPatternTree patternTree) throws MetadataException;
+
// endregion
// region Interfaces for metadata info Query
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
index 8b24cfc508c..347745ecf37 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
@@ -70,6 +70,9 @@ import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
@@ -828,6 +831,54 @@ public class SchemaRegionMemoryImpl implements
ISchemaRegion {
// TODO: CRTODO: shall we update id table?
}
+ @Override
+ public long constructLogicalViewBlackList(PathPatternTree patternTree)
throws MetadataException {
+ long preDeletedNum = 0;
+ for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+ // Given pathPatterns may match one logical view multi times, which may
results in the
+ // preDeletedNum larger than the actual num of logical view. It doesn't
matter since the main
+ // purpose is to check whether there's logical view to be deleted.
+ List<PartialPath> paths =
mtree.constructLogicalViewBlackList(pathPattern);
+ preDeletedNum += paths.size();
+ for (PartialPath path : paths) {
+ try {
+
writeToMLog(SchemaRegionWritePlanFactory.getPreDeleteLogicalViewPlan(path));
+ } catch (IOException e) {
+ throw new MetadataException(e);
+ }
+ }
+ }
+ return preDeletedNum;
+ }
+
+ @Override
+ public void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws
MetadataException {
+ for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+ List<PartialPath> paths =
mtree.rollbackLogicalViewBlackList(pathPattern);
+ for (PartialPath path : paths) {
+ try {
+
writeToMLog(SchemaRegionWritePlanFactory.getRollbackPreDeleteLogicalViewPlan(path));
+ } catch (IOException e) {
+ throw new MetadataException(e);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void deleteLogicalView(PathPatternTree patternTree) throws
MetadataException {
+ for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+ for (PartialPath path : mtree.getPreDeletedLogicalView(pathPattern)) {
+ try {
+ deleteSingleTimeseriesInBlackList(path);
+
writeToMLog(SchemaRegionWritePlanFactory.getDeleteLogicalViewPlan(path));
+ } catch (IOException e) {
+ throw new MetadataException(e);
+ }
+ }
+ }
+ }
+
private void deleteSingleTimeseriesInBlackList(PartialPath path)
throws MetadataException, IOException {
IMeasurementMNode<IMemMNode> measurementMNode =
mtree.deleteTimeseries(path);
@@ -1394,5 +1445,39 @@ public class SchemaRegionMemoryImpl implements
ISchemaRegion {
return new RecoverOperationResult(e);
}
}
+
+ @Override
+ public RecoverOperationResult visitPreDeleteLogicalView(
+ IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan,
SchemaRegionMemoryImpl context) {
+ try {
+ recoverPreDeleteTimeseries(preDeleteLogicalViewPlan.getPath());
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitRollbackPreDeleteLogicalView(
+ IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+ SchemaRegionMemoryImpl context) {
+ try {
+
recoverRollbackPreDeleteTimeseries(rollbackPreDeleteLogicalViewPlan.getPath());
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
+
+ @Override
+ public RecoverOperationResult visitDeleteLogicalView(
+ IDeleteLogicalViewPlan deleteLogicalViewPlan, SchemaRegionMemoryImpl
context) {
+ try {
+ deleteOneTimeseriesUpdateStatistics(deleteLogicalViewPlan.getPath());
+ return RecoverOperationResult.SUCCESS;
+ } catch (MetadataException | IOException e) {
+ return new RecoverOperationResult(e);
+ }
+ }
}
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
index d426f1f6855..27b892831df 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
@@ -904,6 +904,21 @@ public class SchemaRegionSchemaFileImpl implements
ISchemaRegion {
throw new UnsupportedOperationException("createLogicalView is
unsupported.");
}
+ @Override
+ public long constructLogicalViewBlackList(PathPatternTree patternTree)
throws MetadataException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws
MetadataException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void deleteLogicalView(PathPatternTree patternTree) throws
MetadataException {
+ throw new UnsupportedOperationException();
+ }
+
private void deleteSingleTimeseriesInBlackList(PartialPath path)
throws MetadataException, IOException {
IMeasurementMNode<ICachedMNode> measurementMNode =
mtree.deleteTimeseries(path);
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
index 6529c34a502..8b9db82b733 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
import org.apache.iotdb.db.exception.metadata.MeasurementAlreadyExistException;
import
org.apache.iotdb.db.exception.metadata.template.TemplateIsInUseException;
-import
org.apache.iotdb.db.metadata.plan.schemaregion.impl.write.CreateLogicalViewPlanImpl;
import
org.apache.iotdb.db.metadata.plan.schemaregion.impl.write.SchemaRegionWritePlanFactory;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateAlignedTimeSeriesPlan;
import
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateTimeSeriesPlan;
@@ -41,7 +40,6 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -53,6 +51,10 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.Measurement
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -450,7 +452,8 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
for (Map.Entry<PartialPath, ViewExpression> entry :
viewPathToSourceMap.entrySet()) {
try {
schemaRegion.createLogicalView(
- new CreateLogicalViewPlanImpl(entry.getKey(), entry.getValue()));
+ SchemaRegionWritePlanFactory.getCreateLogicalViewPlan(
+ entry.getKey(), entry.getValue()));
} catch (MetadataException e) {
logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
failingStatus.add(RpcUtils.getStatus(e.getErrorCode(),
e.getMessage()));
@@ -462,6 +465,41 @@ public class SchemaExecutionVisitor extends
PlanVisitor<TSStatus, ISchemaRegion>
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, "Execute
successfully");
}
+ @Override
+ public TSStatus visitConstructLogicalViewBlackList(
+ ConstructLogicalViewBlackListNode node, ISchemaRegion schemaRegion) {
+ try {
+ long preDeletedNum =
schemaRegion.constructLogicalViewBlackList(node.getPatternTree());
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS,
String.valueOf(preDeletedNum));
+ } catch (MetadataException e) {
+ logger.error(e.getMessage(), e);
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
+ @Override
+ public TSStatus visitRollbackLogicalViewBlackList(
+ RollbackLogicalViewBlackListNode node, ISchemaRegion schemaRegion) {
+ try {
+ schemaRegion.rollbackLogicalViewBlackList(node.getPatternTree());
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ } catch (MetadataException e) {
+ logger.error(e.getMessage(), e);
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
+ @Override
+ public TSStatus visitDeleteLogicalView(DeleteLogicalViewNode node,
ISchemaRegion schemaRegion) {
+ try {
+ schemaRegion.deleteLogicalView(node.getPatternTree());
+ return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+ } catch (MetadataException e) {
+ logger.error(e.getMessage(), e);
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
@Override
public TSStatus visitPlan(PlanNode node, ISchemaRegion context) {
return null;
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
index f50acceea2a..327b23862c5 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
@@ -45,13 +45,13 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalBatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.MeasurementGroup;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertNode;
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index 909b3e24685..a4983f060d3 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -117,7 +117,6 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountLevelTimeSeriesState
import org.apache.iotdb.db.mpp.plan.statement.metadata.CountNodesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement;
@@ -136,6 +135,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ShowQueriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
@@ -2976,7 +2976,8 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
PathPatternTree patternTree = new PathPatternTree();
for (PartialPath devicePath :
batchActivateTemplateStatement.getDevicePathList()) {
-
patternTree.appendPathPattern(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
+ // the devicePath is a path without wildcard
+
patternTree.appendFullPath(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
}
SchemaPartition partition =
partitionFetcher.getOrCreateSchemaPartition(patternTree);
@@ -2996,7 +2997,8 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
PathPatternTree patternTree = new PathPatternTree();
for (PartialPath activatePath :
internalBatchActivateTemplateStatement.getDeviceMap().keySet()) {
-
patternTree.appendPathPattern(activatePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
+ // the devicePath is a path without wildcard
+
patternTree.appendFullPath(activatePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
}
SchemaPartition partition =
partitionFetcher.getOrCreateSchemaPartition(patternTree);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index b6fe7fcb05d..e42d3ae5466 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -63,6 +63,7 @@ import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowNodes
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowPathSetTemplateTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowSchemaTemplateTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.UnsetSchemaTemplateTask;
+import
org.apache.iotdb.db.mpp.plan.execution.config.metadata.view.DeleteLogicalViewTask;
import org.apache.iotdb.db.mpp.plan.execution.config.sys.AuthorizerTask;
import org.apache.iotdb.db.mpp.plan.execution.config.sys.ClearCacheTask;
import org.apache.iotdb.db.mpp.plan.execution.config.sys.FlushTask;
@@ -128,6 +129,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.FlushStatement;
@@ -431,6 +433,12 @@ public class ConfigTaskVisitor
return new DeleteTimeSeriesTask(context.getQueryId(),
deleteTimeSeriesStatement);
}
+ @Override
+ public IConfigTask visitDeleteLogicalView(
+ DeleteLogicalViewStatement deleteLogicalViewStatement, TaskContext
context) {
+ return new DeleteLogicalViewTask(context.getQueryId(),
deleteLogicalViewStatement);
+ }
+
@Override
public IConfigTask visitGetRegionId(
GetRegionIdStatement getRegionIdStatement, TaskContext context) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index e1881628bba..6858e22e238 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -56,6 +56,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -167,6 +168,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.KillQueryStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.CreatePipeStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.DropPipeStatement;
@@ -1715,6 +1717,47 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
return future;
}
+ @Override
+ public SettableFuture<ConfigTaskResult> deleteLogicalView(
+ String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ TDeleteLogicalViewReq req =
+ new TDeleteLogicalViewReq(
+ queryId,
+
serializePatternListToByteBuffer(deleteLogicalViewStatement.getPathPatternList()));
+ try (ConfigNodeClient client =
+
CLUSTER_DELETION_CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID))
{
+ TSStatus tsStatus;
+ do {
+ try {
+ tsStatus = client.deleteLogicalView(req);
+ } catch (TTransportException e) {
+ if (e.getType() == TTransportException.TIMED_OUT
+ || e.getCause() instanceof SocketTimeoutException) {
+ // time out mainly caused by slow execution, wait until
+ tsStatus =
RpcUtils.getStatus(TSStatusCode.OVERLAP_WITH_EXISTING_TASK);
+ } else {
+ throw e;
+ }
+ }
+ // keep waiting until task ends
+ } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() ==
tsStatus.getCode());
+
+ if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
+ LOGGER.warn(
+ "Failed to execute delete view {}, status is {}.",
+ deleteLogicalViewStatement.getPathPatternList(),
+ tsStatus);
+ future.setException(new IoTDBException(tsStatus.getMessage(),
tsStatus.getCode()));
+ } else {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ }
+ } catch (ClientManagerException | TException e) {
+ future.setException(e);
+ }
+ return future;
+ }
+
@Override
public SettableFuture<ConfigTaskResult> getRegionId(GetRegionIdStatement
getRegionIdStatement) {
SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index 3bb992ca6dd..aadfc3f7a7c 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -53,6 +53,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.KillQueryStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.CreatePipeStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.DropPipeStatement;
@@ -171,6 +172,9 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> deleteTimeSeries(
String queryId, DeleteTimeSeriesStatement deleteTimeSeriesStatement);
+ SettableFuture<ConfigTaskResult> deleteLogicalView(
+ String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement);
+
SettableFuture<ConfigTaskResult> getRegionId(GetRegionIdStatement
getRegionIdStatement);
SettableFuture<ConfigTaskResult> getSeriesSlotList(
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
new file mode 100644
index 00000000000..40ce84918b7
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
@@ -0,0 +1,46 @@
+/*
+ * 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.mpp.plan.execution.config.metadata.view;
+
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import
org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class DeleteLogicalViewTask implements IConfigTask {
+
+ private final String queryId;
+
+ private final DeleteLogicalViewStatement deleteLogicalViewStatement;
+
+ public DeleteLogicalViewTask(
+ String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement) {
+ this.queryId = queryId;
+ this.deleteLogicalViewStatement = deleteLogicalViewStatement;
+ }
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.deleteLogicalView(queryId,
deleteLogicalViewStatement);
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index 956b3158447..8f965050939 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -117,7 +117,6 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSlotListStatemen
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreatePipePluginStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement;
@@ -164,6 +163,8 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTempl
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -1004,6 +1005,17 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
return createLogicalViewStatement;
}
+ @Override
+ public Statement visitDropLogicalView(IoTDBSqlParser.DropLogicalViewContext
ctx) {
+ DeleteLogicalViewStatement deleteLogicalViewStatement = new
DeleteLogicalViewStatement();
+ List<PartialPath> partialPaths = new ArrayList<>();
+ for (IoTDBSqlParser.PrefixPathContext prefixPathContext :
ctx.prefixPath()) {
+ partialPaths.add(parsePrefixPath(prefixPathContext));
+ }
+ deleteLogicalViewStatement.setPathPatternList(partialPaths);
+ return deleteLogicalViewStatement;
+ }
+
// parse suffix paths in logical view
private PartialPath
parseViewSuffixPath(IoTDBSqlParser.ViewSuffixPathsContext ctx) {
List<IoTDBSqlParser.NodeNameWithoutWildcardContext> nodeNamesWithoutStar =
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
index ed82734b768..01eaf88aecc 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
@@ -34,13 +34,13 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ActivateTem
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalBatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.MeasurementGroup;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertRowNode;
@@ -70,7 +70,6 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountLevelTimeSeriesState
import org.apache.iotdb.db.mpp.plan.statement.metadata.CountNodesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement;
@@ -80,6 +79,7 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.BatchActivateTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ShowQueriesStatement;
import org.apache.iotdb.tsfile.utils.Pair;
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
index 762238ac915..9d0bc8a148d 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
@@ -39,7 +39,6 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -51,6 +50,10 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InvalidateS
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceMergeNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceViewIntoNode;
@@ -169,7 +172,10 @@ public enum PlanNodeType {
IDENTITY_SINK((short) 70),
SHUFFLE_SINK((short) 71),
BATCH_ACTIVATE_TEMPLATE((short) 72),
- CREATE_LOGICAL_VIEW((short) 73);
+ CREATE_LOGICAL_VIEW((short) 73),
+ CONSTRUCT_LOGICAL_VIEW_BLACK_LIST((short) 74),
+ ROLLBACK_LOGICAL_VIEW_BLACK_LIST((short) 75),
+ DELETE_LOGICAL_VIEW((short) 76);
public static final int BYTES = Short.BYTES;
@@ -364,6 +370,12 @@ public enum PlanNodeType {
return BatchActivateTemplateNode.deserialize(buffer);
case 73:
return CreateLogicalViewNode.deserialize(buffer);
+ case 74:
+ return ConstructLogicalViewBlackListNode.deserialize(buffer);
+ case 75:
+ return RollbackLogicalViewBlackListNode.deserialize(buffer);
+ case 76:
+ return DeleteLogicalViewNode.deserialize(buffer);
default:
throw new IllegalArgumentException("Invalid node type: " + nodeType);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
index 771a8050145..d2955839a8c 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
@@ -38,7 +38,6 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -49,6 +48,10 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCre
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceMergeNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceViewIntoNode;
@@ -375,6 +378,22 @@ public abstract class PlanVisitor<R, C> {
return visitPlan(node, context);
}
+ public R visitCreateLogicalView(CreateLogicalViewNode node, C context) {
+ return visitPlan(node, context);
+ }
+
+ public R
visitConstructLogicalViewBlackList(ConstructLogicalViewBlackListNode node, C
context) {
+ return visitPlan(node, context);
+ }
+
+ public R visitRollbackLogicalViewBlackList(RollbackLogicalViewBlackListNode
node, C context) {
+ return visitPlan(node, context);
+ }
+
+ public R visitDeleteLogicalView(DeleteLogicalViewNode node, C context) {
+ return visitPlan(node, context);
+ }
+
/////////////////////////////////////////////////////////////////////////////////////////////////
// Data Write Node
/////////////////////////////////////////////////////////////////////////////////////////////////
@@ -402,8 +421,4 @@ public abstract class PlanVisitor<R, C> {
public R visitDeleteData(DeleteDataNode node, C context) {
return visitPlan(node, context);
}
-
- public R visitCreateLogicalView(CreateLogicalViewNode node, C context) {
- return visitPlan(node, context);
- }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
new file mode 100644
index 00000000000..932a8e464e2
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
@@ -0,0 +1,91 @@
+/*
+ * 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.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class ConstructLogicalViewBlackListNode extends PlanNode {
+
+ private final PathPatternTree patternTree;
+
+ public ConstructLogicalViewBlackListNode(PlanNodeId id, PathPatternTree
patternTree) {
+ super(id);
+ this.patternTree = patternTree;
+ }
+
+ public PathPatternTree getPatternTree() {
+ return patternTree;
+ }
+
+ @Override
+ public List<PlanNode> getChildren() {
+ return null;
+ }
+
+ @Override
+ public void addChild(PlanNode child) {}
+
+ @Override
+ public PlanNode clone() {
+ return new ConstructLogicalViewBlackListNode(getPlanNodeId(), patternTree);
+ }
+
+ @Override
+ public int allowedChildCount() {
+ return 0;
+ }
+
+ @Override
+ public List<String> getOutputColumnNames() {
+ return null;
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitConstructLogicalViewBlackList(this, context);
+ }
+
+ @Override
+ protected void serializeAttributes(ByteBuffer byteBuffer) {
+ PlanNodeType.CONSTRUCT_LOGICAL_VIEW_BLACK_LIST.serialize(byteBuffer);
+ patternTree.serialize(byteBuffer);
+ }
+
+ @Override
+ protected void serializeAttributes(DataOutputStream stream) throws
IOException {
+ PlanNodeType.CONSTRUCT_LOGICAL_VIEW_BLACK_LIST.serialize(stream);
+ patternTree.serialize(stream);
+ }
+
+ public static ConstructLogicalViewBlackListNode deserialize(ByteBuffer
buffer) {
+ PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+ PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+ return new ConstructLogicalViewBlackListNode(planNodeId, patternTree);
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
similarity index 99%
rename from
server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
rename to
server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
index e4eff9e08ee..1995b0f2c35 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write;
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.commons.path.PartialPath;
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
new file mode 100644
index 00000000000..db2245ce395
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
@@ -0,0 +1,91 @@
+/*
+ * 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.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class DeleteLogicalViewNode extends PlanNode {
+
+ private final PathPatternTree patternTree;
+
+ public DeleteLogicalViewNode(PlanNodeId id, PathPatternTree patternTree) {
+ super(id);
+ this.patternTree = patternTree;
+ }
+
+ public PathPatternTree getPatternTree() {
+ return patternTree;
+ }
+
+ @Override
+ public List<PlanNode> getChildren() {
+ return null;
+ }
+
+ @Override
+ public void addChild(PlanNode child) {}
+
+ @Override
+ public PlanNode clone() {
+ return new DeleteLogicalViewNode(getPlanNodeId(), patternTree);
+ }
+
+ @Override
+ public int allowedChildCount() {
+ return 0;
+ }
+
+ @Override
+ public List<String> getOutputColumnNames() {
+ return null;
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitDeleteLogicalView(this, context);
+ }
+
+ @Override
+ protected void serializeAttributes(ByteBuffer byteBuffer) {
+ PlanNodeType.DELETE_LOGICAL_VIEW.serialize(byteBuffer);
+ patternTree.serialize(byteBuffer);
+ }
+
+ @Override
+ protected void serializeAttributes(DataOutputStream stream) throws
IOException {
+ PlanNodeType.DELETE_LOGICAL_VIEW.serialize(stream);
+ patternTree.serialize(stream);
+ }
+
+ public static DeleteLogicalViewNode deserialize(ByteBuffer buffer) {
+ PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+ PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+ return new DeleteLogicalViewNode(planNodeId, patternTree);
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
new file mode 100644
index 00000000000..5630ac3d449
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
@@ -0,0 +1,91 @@
+/*
+ * 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.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class RollbackLogicalViewBlackListNode extends PlanNode {
+
+ private final PathPatternTree patternTree;
+
+ public RollbackLogicalViewBlackListNode(PlanNodeId id, PathPatternTree
patternTree) {
+ super(id);
+ this.patternTree = patternTree;
+ }
+
+ public PathPatternTree getPatternTree() {
+ return patternTree;
+ }
+
+ @Override
+ public List<PlanNode> getChildren() {
+ return null;
+ }
+
+ @Override
+ public void addChild(PlanNode child) {}
+
+ @Override
+ public PlanNode clone() {
+ return new RollbackLogicalViewBlackListNode(getPlanNodeId(), patternTree);
+ }
+
+ @Override
+ public int allowedChildCount() {
+ return 0;
+ }
+
+ @Override
+ public List<String> getOutputColumnNames() {
+ return null;
+ }
+
+ @Override
+ public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+ return visitor.visitRollbackLogicalViewBlackList(this, context);
+ }
+
+ @Override
+ protected void serializeAttributes(ByteBuffer byteBuffer) {
+ PlanNodeType.ROLLBACK_LOGICAL_VIEW_BLACK_LIST.serialize(byteBuffer);
+ patternTree.serialize(byteBuffer);
+ }
+
+ @Override
+ protected void serializeAttributes(DataOutputStream stream) throws
IOException {
+ PlanNodeType.ROLLBACK_LOGICAL_VIEW_BLACK_LIST.serialize(stream);
+ patternTree.serialize(stream);
+ }
+
+ public static RollbackLogicalViewBlackListNode deserialize(ByteBuffer
buffer) {
+ PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+ PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+ return new RollbackLogicalViewBlackListNode(planNodeId, patternTree);
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
index e3ebe07d419..04403e9295d 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
@@ -169,4 +169,5 @@ public enum StatementType {
SHOW_THROTTLE_QUOTA,
CREATE_LOGICAL_VIEW,
+ DELETE_LOGICAL_VIEW,
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index 5f716f95b51..03c18855434 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -42,7 +42,6 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSlotListStatemen
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreatePipePluginStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
@@ -91,6 +90,8 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTempl
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -247,6 +248,11 @@ public abstract class StatementVisitor<R, C> {
return visitStatement(createLogicalViewStatement, context);
}
+ public R visitDeleteLogicalView(
+ DeleteLogicalViewStatement deleteLogicalViewStatement, C context) {
+ return visitStatement(deleteLogicalViewStatement, context);
+ }
+
// ML Model
public R visitCreateModel(CreateModelStatement createModelStatement, C
context) {
return visitStatement(createModelStatement, context);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
similarity index 99%
rename from
server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
rename to
server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
index 66c60210305..e208be48b3a 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.iotdb.db.mpp.plan.statement.metadata;
+package org.apache.iotdb.db.mpp.plan.statement.metadata.view;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.db.mpp.plan.expression.Expression;
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
new file mode 100644
index 00000000000..2b3860d5ee1
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
@@ -0,0 +1,66 @@
+/*
+ * 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.mpp.plan.statement.metadata.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.List;
+
+public class DeleteLogicalViewStatement extends Statement implements
IConfigStatement {
+ List<PartialPath> pathPatternList;
+
+ public DeleteLogicalViewStatement() {
+ super();
+ statementType = StatementType.DELETE_LOGICAL_VIEW;
+ }
+
+ public DeleteLogicalViewStatement(List<PartialPath> pathPatternList) {
+ this();
+ this.pathPatternList = pathPatternList;
+ }
+
+ @Override
+ public List<PartialPath> getPaths() {
+ return pathPatternList;
+ }
+
+ public List<PartialPath> getPathPatternList() {
+ return pathPatternList;
+ }
+
+ public void setPathPatternList(List<PartialPath> pathPatternList) {
+ this.pathPatternList = pathPatternList;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitDeleteLogicalView(this, context);
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.WRITE;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
index af62026464e..0863b58d1f5 100644
---
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -103,6 +103,9 @@ import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeleteTimeS
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
import org.apache.iotdb.db.mpp.plan.scheduler.load.LoadTsFileScheduler;
import org.apache.iotdb.db.mpp.plan.statement.component.WhereCondition;
@@ -132,6 +135,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq;
import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceResp;
import org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListReq;
import
org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateResp;
import org.apache.iotdb.mpp.rpc.thrift.TCreateDataRegionReq;
@@ -144,6 +148,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TDeactivateTemplateReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteDataForDeleteSchemaReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteModelMetricsReq;
import org.apache.iotdb.mpp.rpc.thrift.TDeleteTimeSeriesReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
import org.apache.iotdb.mpp.rpc.thrift.TDisableDataNodeReq;
import org.apache.iotdb.mpp.rpc.thrift.TDropFunctionInstanceReq;
import org.apache.iotdb.mpp.rpc.thrift.TDropPipePluginInstanceReq;
@@ -170,6 +175,7 @@ import
org.apache.iotdb.mpp.rpc.thrift.TRegionLeaderChangeReq;
import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq;
import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
import org.apache.iotdb.mpp.rpc.thrift.TSchemaFetchRequest;
import org.apache.iotdb.mpp.rpc.thrift.TSchemaFetchResponse;
import org.apache.iotdb.mpp.rpc.thrift.TSendBatchPlanNodeReq;
@@ -802,6 +808,91 @@ public class DataNodeInternalRPCServiceImpl implements
IDataNodeRPCService.Iface
return resp;
}
+ @Override
+ public TSStatus
constructViewSchemaBlackList(TConstructViewSchemaBlackListReq req)
+ throws TException {
+ PathPatternTree patternTree =
+ PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+ AtomicInteger preDeletedNum = new AtomicInteger(0);
+ TSStatus executionResult =
+ executeInternalSchemaTask(
+ req.getSchemaRegionIdList(),
+ consensusGroupId -> {
+ String storageGroup =
+ schemaEngine
+ .getSchemaRegion(new
SchemaRegionId(consensusGroupId.getId()))
+ .getDatabaseFullPath();
+ PathPatternTree filteredPatternTree =
+ filterPathPatternTree(patternTree, storageGroup);
+ if (filteredPatternTree.isEmpty()) {
+ return RpcUtils.SUCCESS_STATUS;
+ }
+ RegionWriteExecutor executor = new RegionWriteExecutor();
+ TSStatus status =
+ executor
+ .execute(
+ new SchemaRegionId(consensusGroupId.getId()),
+ new ConstructLogicalViewBlackListNode(
+ new PlanNodeId(""), filteredPatternTree))
+ .getStatus();
+ if (status.code == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ preDeletedNum.getAndAdd(Integer.parseInt(status.getMessage()));
+ }
+ return status;
+ });
+ executionResult.setMessage(String.valueOf(preDeletedNum.get()));
+ return executionResult;
+ }
+
+ @Override
+ public TSStatus rollbackViewSchemaBlackList(TRollbackViewSchemaBlackListReq
req)
+ throws TException {
+ PathPatternTree patternTree =
+ PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+ return executeInternalSchemaTask(
+ req.getSchemaRegionIdList(),
+ consensusGroupId -> {
+ String storageGroup =
+ schemaEngine
+ .getSchemaRegion(new
SchemaRegionId(consensusGroupId.getId()))
+ .getDatabaseFullPath();
+ PathPatternTree filteredPatternTree =
filterPathPatternTree(patternTree, storageGroup);
+ if (filteredPatternTree.isEmpty()) {
+ return RpcUtils.SUCCESS_STATUS;
+ }
+ RegionWriteExecutor executor = new RegionWriteExecutor();
+ return executor
+ .execute(
+ new SchemaRegionId(consensusGroupId.getId()),
+ new RollbackLogicalViewBlackListNode(new PlanNodeId(""),
filteredPatternTree))
+ .getStatus();
+ });
+ }
+
+ @Override
+ public TSStatus deleteViewSchema(TDeleteViewSchemaReq req) throws TException
{
+ PathPatternTree patternTree =
+ PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+ return executeInternalSchemaTask(
+ req.getSchemaRegionIdList(),
+ consensusGroupId -> {
+ String storageGroup =
+ schemaEngine
+ .getSchemaRegion(new
SchemaRegionId(consensusGroupId.getId()))
+ .getDatabaseFullPath();
+ PathPatternTree filteredPatternTree =
filterPathPatternTree(patternTree, storageGroup);
+ if (filteredPatternTree.isEmpty()) {
+ return RpcUtils.SUCCESS_STATUS;
+ }
+ RegionWriteExecutor executor = new RegionWriteExecutor();
+ return executor
+ .execute(
+ new SchemaRegionId(consensusGroupId.getId()),
+ new DeleteLogicalViewNode(new PlanNodeId(""),
filteredPatternTree))
+ .getStatus();
+ });
+ }
+
@Override
public TSStatus pushPipeMeta(TPushPipeMetaReq req) {
final List<PipeMeta> pipeMetas = new ArrayList<>();