From 4156a8378c385b6bed02fa739b93f627edfa4e83 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Sun, 4 Feb 2024 11:42:09 +0800 Subject: [PATCH 1/7] solve conflict --- src/cmd_kv.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd_kv.cc b/src/cmd_kv.cc index cedc899fd..a637e4c2a 100644 --- a/src/cmd_kv.cc +++ b/src/cmd_kv.cc @@ -585,4 +585,4 @@ void SetRangeCmd::DoCmd(PClient* client) { } client->AppendInteger(static_cast(ret)); } -} // namespace pikiwidb \ No newline at end of file +} // namespace pikiwidb From 244ee159c9111b3ac409ddf9f049a8f824a7d862 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Tue, 30 Jan 2024 19:32:28 +0800 Subject: [PATCH 2/7] solve conflict --- src/cmd_set.cc | 141 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/src/cmd_set.cc b/src/cmd_set.cc index e4a0e366b..9053fb6eb 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -10,6 +10,7 @@ #include #include "pstd/pstd_string.h" #include "store.h" +#include namespace pikiwidb { @@ -105,15 +106,54 @@ void SRemCmd::DoCmd(PClient* client) { client->AppendInteger(reply_num); } +<<<<<<< HEAD SUnionCmd::SUnionCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySet) {} bool SUnionCmd::DoInitial(PClient* client) { std::vector keys(client->argv_.begin() + 1, client->argv_.end()); +======= +SAddCmd::SAddCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SAddCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} +// Integer reply: the number of elements that were added to the set, +// not including all the elements already present in the set. +void SAddCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); + } else { + client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); + return; + } + } + auto set = value->CastSet(); + const auto oldSize = set->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + set->insert(client->argv_[i]); + } + // new size is bigger than old size , avoid the risk + client->AppendInteger(set->size() - oldSize); +} + +SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SUnionStoreCmd::DoInitial(PClient* client) { + std::vector keys(client->argv_.begin(), client->argv_.end()); + keys.erase(keys.begin()); +>>>>>>> 903857d (feat:add set cmd sadd) client->SetKey(keys); return true; } +<<<<<<< HEAD void SUnionCmd::DoCmd(PClient* client) { std::vector res_vt; storage::Status s = PSTORE.GetBackend(client->GetCurrentDB())->SUnion(client->Keys(), &res_vt); @@ -127,10 +167,60 @@ SInterStoreCmd::SInterStoreCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} bool SInterStoreCmd::DoInitial(PClient* client) { +======= +void SUnionStoreCmd::DoCmd(PClient* client) { + std::unordered_set unionSet; + std::string destKey = client->Keys().at(0); + std::vector keys(client->Keys().begin() + 1, client->Keys().end()); + + PObject* value = nullptr; + for (auto key : keys) { + PError err = PSTORE.GetValueByType(key, value, kPTypeSet); + if (err == kPErrorOK) { + const auto set = value->CastSet(); + auto it = set->cbegin(); + for (; it != set->cend(); ++it) { + std::string sv(it->data(), it->size()); + if (unionSet.find(sv) == unionSet.end()) { + unionSet.insert(sv); + } + } + } else if (err != kPErrorNotExist) { + client->SetRes(CmdRes::kErrOther); + return; + } + } + + PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); + if (err == kPErrorOK) { + auto updateSet = value->CastSet(); + updateSet->clear(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else if (err == kPErrorNotExist) { + value = PSTORE.SetValue(destKey, PObject::CreateSet()); + auto updateSet = value->CastSet(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else { + client->SetRes(CmdRes::kErrOther); + } +} + +SRemCmd::SRemCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SRemCmd::DoInitial(PClient* client) { +>>>>>>> 903857d (feat:add set cmd sadd) client->SetKey(client->argv_[1]); return true; } +<<<<<<< HEAD void SInterStoreCmd::DoCmd(PClient* client) { std::vector value_to_dest; int32_t reply_num = 0; @@ -251,3 +341,54 @@ void SPopCmd::DoCmd(PClient* client) { } } } // namespace pikiwidb +======= +void SRemCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + int retVal = 0; + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + client->AppendInteger(0); + } else { + client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); + } + return; + } + auto unset = value->CastSet(); + const auto oldSize = unset->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + unset->erase(client->argv_[i]); + } + client->AppendInteger(oldSize - unset->size()); +} + +SAddCmd::SAddCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SAddCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} +void SAddCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + if(err!=kPErrorOK){ + if (err == kPErrorNotExist) { + client->AppendString(""); + } else { + client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); + } + return; + } + auto set = value->CastSet(); + auto resPair = set->emplace(client->argv_[2]); + if(resPair.second){ + client->AppendInteger(1); + }else{ + client->AppendInteger(0); + } + + +} +} // namespace pikiwidb +>>>>>>> 903857d (feat:add set cmd sadd) From 6b2b3df9d6dc5d62d460feb482f1a0d27e700fb4 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Mon, 1 Jan 2024 22:28:56 +0800 Subject: [PATCH 3/7] fix bug --- src/cmd_set.cc | 225 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 223 insertions(+), 2 deletions(-) diff --git a/src/cmd_set.cc b/src/cmd_set.cc index 9053fb6eb..f2ce8942d 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -369,23 +369,244 @@ bool SAddCmd::DoInitial(PClient* client) { client->SetKey(client->argv_[1]); return true; } +// Integer reply: the number of elements that were added to the set, +// not including all the elements already present in the set. +void SAddCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); + } else { + client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); + return; + } + } + auto set = value->CastSet(); + const auto oldSize = set->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + set->insert(client->argv_[i]); + } + // new size is bigger than old size , avoid the risk + client->AppendInteger(set->size() - oldSize); +} + +SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SUnionStoreCmd::DoInitial(PClient* client) { + std::vector keys(client->argv_.begin(), client->argv_.end()); + keys.erase(keys.begin()); + client->SetKey(keys); + return true; +} + +void SUnionStoreCmd::DoCmd(PClient* client) { + std::unordered_set unionSet; + std::string destKey = client->Keys().at(0); + std::vector keys(client->Keys().begin() + 1, client->Keys().end()); + + PObject* value = nullptr; + for (auto key : keys) { + PError err = PSTORE.GetValueByType(key, value, kPTypeSet); + if (err == kPErrorOK) { + const auto set = value->CastSet(); + auto it = set->cbegin(); + for (; it != set->cend(); ++it) { + std::string sv(it->data(), it->size()); + if (unionSet.find(sv) == unionSet.end()) { + unionSet.insert(sv); + } + } + } else if (err != kPErrorNotExist) { + client->SetRes(CmdRes::kErrOther); + return; + } + } + + PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); + if (err == kPErrorOK) { + auto updateSet = value->CastSet(); + updateSet->clear(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else if (err == kPErrorNotExist) { + value = PSTORE.SetValue(destKey, PObject::CreateSet()); + auto updateSet = value->CastSet(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else { + client->SetRes(CmdRes::kErrOther); + } +} + +SRemCmd::SRemCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SRemCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} + +void SRemCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + int retVal = 0; + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + client->AppendInteger(0); + } else { + client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); + } + return; + } + auto unset = value->CastSet(); + const auto oldSize = unset->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + unset->erase(client->argv_[i]); + } + client->AppendInteger(oldSize - unset->size()); +} + +SAddCmd::SAddCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SAddCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} +// Integer reply: the number of elements that were added to the set, +// not including all the elements already present in the set. void SAddCmd::DoCmd(PClient* client) { PObject* value = nullptr; PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - if(err!=kPErrorOK){ + if (err != kPErrorOK) { if (err == kPErrorNotExist) { - client->AppendString(""); + value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); } else { client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); + return; + } + } + auto set = value->CastSet(); + const auto oldSize = set->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + set->insert(client->argv_[i]); + } + // new size is bigger than old size , avoid the risk + client->AppendInteger(set->size() - oldSize); +} + +SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SUnionStoreCmd::DoInitial(PClient* client) { + std::vector keys(client->argv_.begin(), client->argv_.end()); + keys.erase(keys.begin()); + client->SetKey(keys); + return true; +} + +void SUnionStoreCmd::DoCmd(PClient* client) { + std::unordered_set unionSet; + std::string destKey = client->Keys().at(0); + std::vector keys(client->Keys().begin() + 1, client->Keys().end()); + + PObject* value = nullptr; + for (auto key : keys) { + PError err = PSTORE.GetValueByType(key, value, kPTypeSet); + if (err == kPErrorOK) { + const auto set = value->CastSet(); + auto it = set->cbegin(); + for (; it != set->cend(); ++it) { + std::string sv(it->data(), it->size()); + if (unionSet.find(sv) == unionSet.end()) { + unionSet.insert(sv); + } + } + } else if (err != kPErrorNotExist) { + client->SetRes(CmdRes::kErrOther); + return; + } + } + + PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); + if (err == kPErrorOK) { + auto updateSet = value->CastSet(); + updateSet->clear(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else if (err == kPErrorNotExist) { + value = PSTORE.SetValue(destKey, PObject::CreateSet()); + auto updateSet = value->CastSet(); + for (auto it : unionSet) { + updateSet->emplace(it); + } + client->AppendInteger(updateSet->size()); + } else { + client->SetRes(CmdRes::kErrOther); + } +} + +SRemCmd::SRemCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SRemCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} + +void SRemCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + int retVal = 0; + if (err != kPErrorOK) { + if (err == kPErrorNotExist) { + client->AppendInteger(0); + } else { + client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); } return; } + auto unset = value->CastSet(); + const auto oldSize = unset->size(); + for (int i = 2; i < client->argv_.size(); ++i) { + unset->erase(client->argv_[i]); + } + client->AppendInteger(oldSize - unset->size()); +} + +SAddCmd::SAddCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} + +bool SAddCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} +void SAddCmd::DoCmd(PClient* client) { + PObject* value = nullptr; + PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); + if(err != kPErrorOK){ + if (err == kPErrorNotExist) { + value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); + } else { + client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); + return; + } + } auto set = value->CastSet(); auto resPair = set->emplace(client->argv_[2]); if(resPair.second){ client->AppendInteger(1); }else{ client->AppendInteger(0); + } From 4610cd2c14b663942f74e1a066a9af8c3263e182 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Wed, 6 Mar 2024 12:34:30 +0800 Subject: [PATCH 4/7] solve conflict --- src/cmd_set.cc | 361 ------------------------------------------------- src/cmd_set.h | 6 + 2 files changed, 6 insertions(+), 361 deletions(-) diff --git a/src/cmd_set.cc b/src/cmd_set.cc index f2ce8942d..90e0286c5 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -10,7 +10,6 @@ #include #include "pstd/pstd_string.h" #include "store.h" -#include namespace pikiwidb { @@ -106,54 +105,15 @@ void SRemCmd::DoCmd(PClient* client) { client->AppendInteger(reply_num); } -<<<<<<< HEAD SUnionCmd::SUnionCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySet) {} bool SUnionCmd::DoInitial(PClient* client) { std::vector keys(client->argv_.begin() + 1, client->argv_.end()); -======= -SAddCmd::SAddCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SAddCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} -// Integer reply: the number of elements that were added to the set, -// not including all the elements already present in the set. -void SAddCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); - } else { - client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); - return; - } - } - auto set = value->CastSet(); - const auto oldSize = set->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - set->insert(client->argv_[i]); - } - // new size is bigger than old size , avoid the risk - client->AppendInteger(set->size() - oldSize); -} - -SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SUnionStoreCmd::DoInitial(PClient* client) { - std::vector keys(client->argv_.begin(), client->argv_.end()); - keys.erase(keys.begin()); ->>>>>>> 903857d (feat:add set cmd sadd) client->SetKey(keys); return true; } -<<<<<<< HEAD void SUnionCmd::DoCmd(PClient* client) { std::vector res_vt; storage::Status s = PSTORE.GetBackend(client->GetCurrentDB())->SUnion(client->Keys(), &res_vt); @@ -167,60 +127,10 @@ SInterStoreCmd::SInterStoreCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} bool SInterStoreCmd::DoInitial(PClient* client) { -======= -void SUnionStoreCmd::DoCmd(PClient* client) { - std::unordered_set unionSet; - std::string destKey = client->Keys().at(0); - std::vector keys(client->Keys().begin() + 1, client->Keys().end()); - - PObject* value = nullptr; - for (auto key : keys) { - PError err = PSTORE.GetValueByType(key, value, kPTypeSet); - if (err == kPErrorOK) { - const auto set = value->CastSet(); - auto it = set->cbegin(); - for (; it != set->cend(); ++it) { - std::string sv(it->data(), it->size()); - if (unionSet.find(sv) == unionSet.end()) { - unionSet.insert(sv); - } - } - } else if (err != kPErrorNotExist) { - client->SetRes(CmdRes::kErrOther); - return; - } - } - - PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); - if (err == kPErrorOK) { - auto updateSet = value->CastSet(); - updateSet->clear(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else if (err == kPErrorNotExist) { - value = PSTORE.SetValue(destKey, PObject::CreateSet()); - auto updateSet = value->CastSet(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else { - client->SetRes(CmdRes::kErrOther); - } -} - -SRemCmd::SRemCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SRemCmd::DoInitial(PClient* client) { ->>>>>>> 903857d (feat:add set cmd sadd) client->SetKey(client->argv_[1]); return true; } -<<<<<<< HEAD void SInterStoreCmd::DoCmd(PClient* client) { std::vector value_to_dest; int32_t reply_num = 0; @@ -341,275 +251,4 @@ void SPopCmd::DoCmd(PClient* client) { } } } // namespace pikiwidb -======= -void SRemCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - int retVal = 0; - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - client->AppendInteger(0); - } else { - client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); - } - return; - } - auto unset = value->CastSet(); - const auto oldSize = unset->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - unset->erase(client->argv_[i]); - } - client->AppendInteger(oldSize - unset->size()); -} - -SAddCmd::SAddCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SAddCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} -// Integer reply: the number of elements that were added to the set, -// not including all the elements already present in the set. -void SAddCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); - } else { - client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); - return; - } - } - auto set = value->CastSet(); - const auto oldSize = set->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - set->insert(client->argv_[i]); - } - // new size is bigger than old size , avoid the risk - client->AppendInteger(set->size() - oldSize); -} - -SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SUnionStoreCmd::DoInitial(PClient* client) { - std::vector keys(client->argv_.begin(), client->argv_.end()); - keys.erase(keys.begin()); - client->SetKey(keys); - return true; -} - -void SUnionStoreCmd::DoCmd(PClient* client) { - std::unordered_set unionSet; - std::string destKey = client->Keys().at(0); - std::vector keys(client->Keys().begin() + 1, client->Keys().end()); - - PObject* value = nullptr; - for (auto key : keys) { - PError err = PSTORE.GetValueByType(key, value, kPTypeSet); - if (err == kPErrorOK) { - const auto set = value->CastSet(); - auto it = set->cbegin(); - for (; it != set->cend(); ++it) { - std::string sv(it->data(), it->size()); - if (unionSet.find(sv) == unionSet.end()) { - unionSet.insert(sv); - } - } - } else if (err != kPErrorNotExist) { - client->SetRes(CmdRes::kErrOther); - return; - } - } - - PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); - if (err == kPErrorOK) { - auto updateSet = value->CastSet(); - updateSet->clear(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else if (err == kPErrorNotExist) { - value = PSTORE.SetValue(destKey, PObject::CreateSet()); - auto updateSet = value->CastSet(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else { - client->SetRes(CmdRes::kErrOther); - } -} - -SRemCmd::SRemCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SRemCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} - -void SRemCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - int retVal = 0; - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - client->AppendInteger(0); - } else { - client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); - } - return; - } - auto unset = value->CastSet(); - const auto oldSize = unset->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - unset->erase(client->argv_[i]); - } - client->AppendInteger(oldSize - unset->size()); -} - -SAddCmd::SAddCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SAddCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} -// Integer reply: the number of elements that were added to the set, -// not including all the elements already present in the set. -void SAddCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); - } else { - client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); - return; - } - } - auto set = value->CastSet(); - const auto oldSize = set->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - set->insert(client->argv_[i]); - } - // new size is bigger than old size , avoid the risk - client->AppendInteger(set->size() - oldSize); -} - -SUnionStoreCmd::SUnionStoreCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SUnionStoreCmd::DoInitial(PClient* client) { - std::vector keys(client->argv_.begin(), client->argv_.end()); - keys.erase(keys.begin()); - client->SetKey(keys); - return true; -} - -void SUnionStoreCmd::DoCmd(PClient* client) { - std::unordered_set unionSet; - std::string destKey = client->Keys().at(0); - std::vector keys(client->Keys().begin() + 1, client->Keys().end()); - PObject* value = nullptr; - for (auto key : keys) { - PError err = PSTORE.GetValueByType(key, value, kPTypeSet); - if (err == kPErrorOK) { - const auto set = value->CastSet(); - auto it = set->cbegin(); - for (; it != set->cend(); ++it) { - std::string sv(it->data(), it->size()); - if (unionSet.find(sv) == unionSet.end()) { - unionSet.insert(sv); - } - } - } else if (err != kPErrorNotExist) { - client->SetRes(CmdRes::kErrOther); - return; - } - } - - PError err = PSTORE.GetValueByType(destKey, value, kPTypeSet); - if (err == kPErrorOK) { - auto updateSet = value->CastSet(); - updateSet->clear(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else if (err == kPErrorNotExist) { - value = PSTORE.SetValue(destKey, PObject::CreateSet()); - auto updateSet = value->CastSet(); - for (auto it : unionSet) { - updateSet->emplace(it); - } - client->AppendInteger(updateSet->size()); - } else { - client->SetRes(CmdRes::kErrOther); - } -} - -SRemCmd::SRemCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SRemCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} - -void SRemCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - int retVal = 0; - if (err != kPErrorOK) { - if (err == kPErrorNotExist) { - client->AppendInteger(0); - } else { - client->SetRes(CmdRes::kSyntaxErr, "srem cmd error"); - } - return; - } - auto unset = value->CastSet(); - const auto oldSize = unset->size(); - for (int i = 2; i < client->argv_.size(); ++i) { - unset->erase(client->argv_[i]); - } - client->AppendInteger(oldSize - unset->size()); -} - -SAddCmd::SAddCmd(const std::string& name, int16_t arity) - : BaseCmd(name, arity, kCmdFlagsWrite, kAclCategoryWrite | kAclCategorySet) {} - -bool SAddCmd::DoInitial(PClient* client) { - client->SetKey(client->argv_[1]); - return true; -} -void SAddCmd::DoCmd(PClient* client) { - PObject* value = nullptr; - PError err = PSTORE.GetValueByType(client->Key(), value, kPTypeSet); - if(err != kPErrorOK){ - if (err == kPErrorNotExist) { - value = PSTORE.SetValue(client->Key(), PObject::CreateSet()); - } else { - client->SetRes(CmdRes::kSyntaxErr, "sadd cmd error"); - return; - } - } - auto set = value->CastSet(); - auto resPair = set->emplace(client->argv_[2]); - if(resPair.second){ - client->AppendInteger(1); - }else{ - client->AppendInteger(0); - - } - - -} -} // namespace pikiwidb ->>>>>>> 903857d (feat:add set cmd sadd) diff --git a/src/cmd_set.h b/src/cmd_set.h index 9a96fda70..4ef3156b9 100644 --- a/src/cmd_set.h +++ b/src/cmd_set.h @@ -24,12 +24,18 @@ class SIsMemberCmd : public BaseCmd { class SAddCmd : public BaseCmd { public: SAddCmd(const std::string &name, int16_t arity); + public: + SAddCmd(const std::string &name, int16_t arity); + protected: + bool DoInitial(PClient *client) override; protected: bool DoInitial(PClient *client) override; private: void DoCmd(PClient *client) override; + private: + void DoCmd(PClient *client) override; }; class SUnionStoreCmd : public BaseCmd { From 9e7c39702705b5a9dea9c580683db9721921654a Mon Sep 17 00:00:00 2001 From: whr1118 Date: Wed, 6 Mar 2024 12:36:12 +0800 Subject: [PATCH 5/7] solve conflict --- src/cmd_set.cc | 6 +++++- src/cmd_set.h | 6 ------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/cmd_set.cc b/src/cmd_set.cc index 90e0286c5..455e4d912 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -105,6 +105,11 @@ void SRemCmd::DoCmd(PClient* client) { client->AppendInteger(reply_num); } +<<<<<<< HEAD +======= +<<<<<<< HEAD +<<<<<<< HEAD +>>>>>>> 4619568 (resolve conflict) SUnionCmd::SUnionCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySet) {} @@ -251,4 +256,3 @@ void SPopCmd::DoCmd(PClient* client) { } } } // namespace pikiwidb - diff --git a/src/cmd_set.h b/src/cmd_set.h index 4ef3156b9..9a96fda70 100644 --- a/src/cmd_set.h +++ b/src/cmd_set.h @@ -24,18 +24,12 @@ class SIsMemberCmd : public BaseCmd { class SAddCmd : public BaseCmd { public: SAddCmd(const std::string &name, int16_t arity); - public: - SAddCmd(const std::string &name, int16_t arity); - protected: - bool DoInitial(PClient *client) override; protected: bool DoInitial(PClient *client) override; private: void DoCmd(PClient *client) override; - private: - void DoCmd(PClient *client) override; }; class SUnionStoreCmd : public BaseCmd { From 7eea3132ef8d1d7d7e9c52e1310b3d17b17eef14 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Wed, 6 Mar 2024 12:37:37 +0800 Subject: [PATCH 6/7] solve conflict --- src/cmd_set.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cmd_set.cc b/src/cmd_set.cc index 455e4d912..e4a0e366b 100644 --- a/src/cmd_set.cc +++ b/src/cmd_set.cc @@ -105,11 +105,6 @@ void SRemCmd::DoCmd(PClient* client) { client->AppendInteger(reply_num); } -<<<<<<< HEAD -======= -<<<<<<< HEAD -<<<<<<< HEAD ->>>>>>> 4619568 (resolve conflict) SUnionCmd::SUnionCmd(const std::string& name, int16_t arity) : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySet) {} From 25830a5576306ead539f6c56cdfdfa530fd9e2f4 Mon Sep 17 00:00:00 2001 From: whr1118 Date: Fri, 8 Mar 2024 13:32:53 +0800 Subject: [PATCH 7/7] finish zset cmd zcard --- src/base_cmd.h | 1 + src/cmd_table_manager.cc | 1 + src/cmd_zset.cc | 17 +++++++++++++++++ src/cmd_zset.h | 11 +++++++++++ tests/zset_test.go | 18 ++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/src/base_cmd.h b/src/base_cmd.h index 2828511ea..66b1f9853 100644 --- a/src/base_cmd.h +++ b/src/base_cmd.h @@ -109,6 +109,7 @@ const std::string kCmdNameLInsert = "linsert"; const std::string kCmdNameZAdd = "zadd"; const std::string kCmdNameZRevrange = "zrevrange"; const std::string kCmdNameZRangebyscore = "zrangebyscore"; +const std::string kCmdNameZCard = "zcard"; enum CmdFlags { kCmdFlagsWrite = (1 << 0), // May modify the dataset diff --git a/src/cmd_table_manager.cc b/src/cmd_table_manager.cc index ea567d7d4..6a08a21bf 100644 --- a/src/cmd_table_manager.cc +++ b/src/cmd_table_manager.cc @@ -116,6 +116,7 @@ void CmdTableManager::InitCmdTable() { ADD_COMMAND(ZAdd, -4); ADD_COMMAND(ZRevrange, -4); ADD_COMMAND(ZRangebyscore, -4); + ADD_COMMAND(ZCard, 2); } std::pair CmdTableManager::GetCommand(const std::string& cmdName, PClient* client) { diff --git a/src/cmd_zset.cc b/src/cmd_zset.cc index ce88bb7be..1957b656d 100644 --- a/src/cmd_zset.cc +++ b/src/cmd_zset.cc @@ -217,4 +217,21 @@ void ZRangebyscoreCmd::DoCmd(PClient* client) { } } +ZCardCmd::ZCardCmd(const std::string& name, int16_t arity) + : BaseCmd(name, arity, kCmdFlagsReadonly, kAclCategoryRead | kAclCategorySortedSet) {} + +bool ZCardCmd::DoInitial(PClient* client) { + client->SetKey(client->argv_[1]); + return true; +} + +void ZCardCmd::DoCmd(PClient* client) { + int32_t reply_Num = 0; + storage::Status s = PSTORE.GetBackend(client->GetCurrentDB())->ZCard(client->Key(), &reply_Num); + if (!s.ok()) { + client->SetRes(CmdRes::kSyntaxErr, "ZCard cmd error"); + return; + } + client->AppendInteger(reply_Num); +} } // namespace pikiwidb diff --git a/src/cmd_zset.h b/src/cmd_zset.h index e68b2c007..0cda57951 100644 --- a/src/cmd_zset.h +++ b/src/cmd_zset.h @@ -45,4 +45,15 @@ class ZRangebyscoreCmd : public BaseCmd { void DoCmd(PClient *client) override; }; +class ZCardCmd : public BaseCmd { + public: + ZCardCmd(const std::string &name, int16_t arity); + + protected: + bool DoInitial(PClient *client) override; + + private: + void DoCmd(PClient *client) override; +}; + } // namespace pikiwidb diff --git a/tests/zset_test.go b/tests/zset_test.go index 6c0e5df7e..e1a533b33 100644 --- a/tests/zset_test.go +++ b/tests/zset_test.go @@ -174,4 +174,22 @@ var _ = Describe("Zset", Ordered, func() { Expect(zRevRange.Err()).NotTo(HaveOccurred()) Expect(zRevRange.Val()).To(Equal([]string{"two", "one"})) }) + + It("should ZCard", func() { + err :=client.ZAdd(ctx, "zsetZCard", redis.Z{ + Score: 1, + Member: "one", + }).Err() + Expect(err).NotTo(HaveOccurred()) + err =client.ZAdd(ctx, "zsetZCard", redis.Z{ + Score: 2, + Member: "two", + }).Err() + Expect(err).NotTo(HaveOccurred()) + + card, err :=client.ZCard(ctx, "zsetZCard").Result() + Expect(err).NotTo(HaveOccurred()) + Expect(card).To(Equal(int64(2))) + }) + })