diff --git a/src/graph/DropEdgeIndexExecutor.cpp b/src/graph/DropEdgeIndexExecutor.cpp index 486398f571b..81831ed810f 100644 --- a/src/graph/DropEdgeIndexExecutor.cpp +++ b/src/graph/DropEdgeIndexExecutor.cpp @@ -28,7 +28,7 @@ void DropEdgeIndexExecutor::execute() { auto *name = sentence_->indexName(); auto spaceId = ectx()->rctx()->session()->space(); - auto future = ectx()->getMetaClient()->dropEdgeIndex(spaceId, *name); + auto future = ectx()->getMetaClient()->dropEdgeIndex(spaceId, *name, sentence_->isIfExists()); auto *runner = ectx()->rctx()->runner(); auto cb = [this] (auto &&resp) { diff --git a/src/graph/DropTagIndexExecutor.cpp b/src/graph/DropTagIndexExecutor.cpp index 8eeb718600c..c61039b9bff 100644 --- a/src/graph/DropTagIndexExecutor.cpp +++ b/src/graph/DropTagIndexExecutor.cpp @@ -28,7 +28,7 @@ void DropTagIndexExecutor::execute() { auto *name = sentence_->indexName(); auto spaceId = ectx()->rctx()->session()->space(); - auto future = ectx()->getMetaClient()->dropTagIndex(spaceId, *name); + auto future = ectx()->getMetaClient()->dropTagIndex(spaceId, *name, sentence_->isIfExists()); auto *runner = ectx()->rctx()->runner(); auto cb = [this] (auto &&resp) { diff --git a/src/graph/test/IndexTest.cpp b/src/graph/test/IndexTest.cpp index 4beb8f7fc92..8ab2bd1f00a 100644 --- a/src/graph/test/IndexTest.cpp +++ b/src/graph/test/IndexTest.cpp @@ -129,6 +129,18 @@ TEST_F(IndexTest, TagIndex) { code = client->execute(query, resp); ASSERT_EQ(cpp2::ErrorCode::E_EXECUTION_ERROR, code); } + { + cpp2::ExecutionResponse resp; + std::string query = "DROP TAG INDEX not_exists_tag_index"; + auto code = client->execute(query, resp); + ASSERT_EQ(cpp2::ErrorCode::E_EXECUTION_ERROR, code); + } + { + cpp2::ExecutionResponse resp; + std::string query = "DROP TAG INDEX IF EXISTS not_exists_tag_index"; + auto code = client->execute(query, resp); + ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code); + } } TEST_F(IndexTest, EdgeIndex) { @@ -237,6 +249,18 @@ TEST_F(IndexTest, EdgeIndex) { code = client->execute(query, resp); ASSERT_EQ(cpp2::ErrorCode::E_EXECUTION_ERROR, code); } + { + cpp2::ExecutionResponse resp; + std::string query = "DROP EDGE INDEX not_exists_edge_index"; + auto code = client->execute(query, resp); + ASSERT_EQ(cpp2::ErrorCode::E_EXECUTION_ERROR, code); + } + { + cpp2::ExecutionResponse resp; + std::string query = "DROP EDGE INDEX IF EXISTS not_exists_edge_index"; + auto code = client->execute(query, resp); + ASSERT_EQ(cpp2::ErrorCode::SUCCEEDED, code); + } } } // namespace graph diff --git a/src/interface/meta.thrift b/src/interface/meta.thrift index 72ca465d7c2..b13219a901b 100644 --- a/src/interface/meta.thrift +++ b/src/interface/meta.thrift @@ -417,6 +417,7 @@ struct CreateTagIndexReq { struct DropTagIndexReq { 1: common.GraphSpaceID space_id, 2: string index_name, + 3: bool if_exists, } struct GetTagIndexReq { @@ -450,6 +451,7 @@ struct CreateEdgeIndexReq { struct DropEdgeIndexReq { 1: common.GraphSpaceID space_id, 2: string index_name, + 3: bool if_exists, } struct GetEdgeIndexReq { diff --git a/src/meta/client/MetaClient.cpp b/src/meta/client/MetaClient.cpp index d76c41cdb84..bd2fc294755 100644 --- a/src/meta/client/MetaClient.cpp +++ b/src/meta/client/MetaClient.cpp @@ -1156,17 +1156,20 @@ MetaClient::createTagIndex(GraphSpaceID spaceID, } folly::Future> -MetaClient::dropTagIndex(GraphSpaceID spaceID, std::string name) { +MetaClient::dropTagIndex(GraphSpaceID spaceID, + std::string name, + bool ifExists) { cpp2::DropTagIndexReq req; req.set_space_id(std::move(spaceID)); req.set_index_name(std::move(name)); + req.set_if_exists(ifExists); folly::Promise> promise; auto future = promise.getFuture(); getResponse(std::move(req), [] (auto client, auto request) { return client->future_dropTagIndex(request); - }, [] (cpp2::ExecResp&& resp) -> TagIndexID { - return resp.get_id().get_tag_index_id(); + }, [] (cpp2::ExecResp&& resp) -> bool { + return resp.code == cpp2::ErrorCode::SUCCEEDED; }, std::move(promise), true); return future; } @@ -1247,17 +1250,20 @@ MetaClient::createEdgeIndex(GraphSpaceID spaceID, } folly::Future> -MetaClient::dropEdgeIndex(GraphSpaceID spaceID, std::string name) { +MetaClient::dropEdgeIndex(GraphSpaceID spaceID, + std::string name, + bool ifExists) { cpp2::DropEdgeIndexReq req; req.set_space_id(std::move(spaceID)); req.set_index_name(std::move(name)); + req.set_if_exists(ifExists); folly::Promise> promise; auto future = promise.getFuture(); getResponse(std::move(req), [] (auto client, auto request) { return client->future_dropEdgeIndex(request); - }, [] (cpp2::ExecResp&& resp) -> EdgeIndexID { - return resp.get_id().get_edge_index_id(); + }, [] (cpp2::ExecResp&& resp) -> bool { + return resp.code == cpp2::ErrorCode::SUCCEEDED; }, std::move(promise), true); return future; } diff --git a/src/meta/client/MetaClient.h b/src/meta/client/MetaClient.h index 0fe5856e47b..25dfce957a5 100644 --- a/src/meta/client/MetaClient.h +++ b/src/meta/client/MetaClient.h @@ -244,7 +244,7 @@ class MetaClient { // Remove the define of tag index folly::Future> - dropTagIndex(GraphSpaceID spaceId, std::string name); + dropTagIndex(GraphSpaceID spaceId, std::string name, bool ifExists = false); folly::Future> getTagIndex(GraphSpaceID spaceId, std::string name); @@ -270,7 +270,7 @@ class MetaClient { // Remove the define of edge index folly::Future> - dropEdgeIndex(GraphSpaceID spaceId, std::string name); + dropEdgeIndex(GraphSpaceID spaceId, std::string name, bool ifExists = false); folly::Future> getEdgeIndex(GraphSpaceID spaceId, std::string name); diff --git a/src/meta/processors/indexMan/DropEdgeIndexProcessor.cpp b/src/meta/processors/indexMan/DropEdgeIndexProcessor.cpp index 248fc6f4094..e81c286da0a 100644 --- a/src/meta/processors/indexMan/DropEdgeIndexProcessor.cpp +++ b/src/meta/processors/indexMan/DropEdgeIndexProcessor.cpp @@ -17,8 +17,12 @@ void DropEdgeIndexProcessor::process(const cpp2::DropEdgeIndexReq& req) { auto edgeIndexID = getEdgeIndexID(spaceID, indexName); if (!edgeIndexID.ok()) { - LOG(ERROR) << "Edge Index not exist Space: " << spaceID << " Index name: " << indexName; - resp_.set_code(cpp2::ErrorCode::E_NOT_FOUND); + LOG(ERROR) << "Edge Index not exists in Space: " << spaceID << " Index name: " << indexName; + if (req.get_if_exists()) { + resp_.set_code(cpp2::ErrorCode::SUCCEEDED); + } else { + resp_.set_code(cpp2::ErrorCode::E_NOT_FOUND); + } onFinished(); return; } diff --git a/src/meta/processors/indexMan/DropTagIndexProcessor.cpp b/src/meta/processors/indexMan/DropTagIndexProcessor.cpp index 378bdc21141..ac148dd1eea 100644 --- a/src/meta/processors/indexMan/DropTagIndexProcessor.cpp +++ b/src/meta/processors/indexMan/DropTagIndexProcessor.cpp @@ -17,8 +17,12 @@ void DropTagIndexProcessor::process(const cpp2::DropTagIndexReq& req) { auto tagIndexID = getTagIndexID(spaceID, indexName); if (!tagIndexID.ok()) { - LOG(ERROR) << "Tag Index not exist Space: " << spaceID << " Index name: " << indexName; - resp_.set_code(cpp2::ErrorCode::E_NOT_FOUND); + LOG(ERROR) << "Tag Index not exists in Space: " << spaceID << " Index name: " << indexName; + if (req.get_if_exists()) { + resp_.set_code(cpp2::ErrorCode::SUCCEEDED); + } else { + resp_.set_code(cpp2::ErrorCode::E_NOT_FOUND); + } onFinished(); return; } diff --git a/src/parser/MaintainSentences.h b/src/parser/MaintainSentences.h index e850800212b..d7cc8272c23 100644 --- a/src/parser/MaintainSentences.h +++ b/src/parser/MaintainSentences.h @@ -477,7 +477,7 @@ class DescribeEdgeSentence final : public Sentence { class DropTagSentence final : public DropSentence { public: - explicit DropTagSentence(std::string *name, bool ifExist) : DropSentence(ifExist) { + explicit DropTagSentence(std::string *name, bool ifExists) : DropSentence(ifExists) { name_.reset(name); kind_ = Kind::kDropTag; } @@ -495,7 +495,7 @@ class DropTagSentence final : public DropSentence { class DropEdgeSentence final : public DropSentence { public: - explicit DropEdgeSentence(std::string *name, bool ifExist) : DropSentence(ifExist) { + explicit DropEdgeSentence(std::string *name, bool ifExists) : DropSentence(ifExists) { name_.reset(name); kind_ = Kind::kDropEdge; } @@ -625,9 +625,9 @@ class DescribeEdgeIndexSentence final : public Sentence { }; -class DropTagIndexSentence final : public Sentence { +class DropTagIndexSentence final : public DropSentence { public: - explicit DropTagIndexSentence(std::string *indexName) { + explicit DropTagIndexSentence(std::string *indexName, bool ifExists) : DropSentence(ifExists) { indexName_.reset(indexName); kind_ = Kind::kDropTagIndex; } @@ -643,9 +643,9 @@ class DropTagIndexSentence final : public Sentence { }; -class DropEdgeIndexSentence final : public Sentence { +class DropEdgeIndexSentence final : public DropSentence { public: - explicit DropEdgeIndexSentence(std::string *indexName) { + explicit DropEdgeIndexSentence(std::string *indexName, bool ifExists) : DropSentence(ifExists) { indexName_.reset(indexName); kind_ = Kind::kDropEdgeIndex; } diff --git a/src/parser/parser.yy b/src/parser/parser.yy index 6de9f640df3..b73b1ba1ad1 100644 --- a/src/parser/parser.yy +++ b/src/parser/parser.yy @@ -1180,14 +1180,14 @@ create_edge_index_sentence ; drop_tag_index_sentence - : KW_DROP KW_TAG KW_INDEX name_label { - $$ = new DropTagIndexSentence($4); + : KW_DROP KW_TAG KW_INDEX opt_if_exists name_label { + $$ = new DropTagIndexSentence($5, $4); } ; drop_edge_index_sentence - : KW_DROP KW_EDGE KW_INDEX name_label { - $$ = new DropEdgeIndexSentence($4); + : KW_DROP KW_EDGE KW_INDEX opt_if_exists name_label { + $$ = new DropEdgeIndexSentence($5, $4); } ;