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_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 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))) + }) + })