mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-11 02:15:45 +02:00
chore(hset_family): Support resp3 format for hrandfield
Return nested arrays if hrandfield is used with values. Signed-off-by: Abhijat Malviya <abhijat@dragonflydb.io>
This commit is contained in:
parent
ff8bf7817a
commit
ade014cf85
4 changed files with 46 additions and 2 deletions
|
@ -458,4 +458,18 @@ void RedisReplyBuilder::SendEmptyArray() {
|
||||||
StartArray(0);
|
StartArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RedisReplyBuilder::SendBulkStrArrAsPairs(const ArgRange& strs) {
|
||||||
|
const size_t strs_size = strs.Size();
|
||||||
|
DCHECK(strs_size % 2 == 0) << "unexpected size of strings " << strs_size << ", expected pairs";
|
||||||
|
ReplyScope scope{this};
|
||||||
|
const bool is_resp3 = IsResp3();
|
||||||
|
StartArray(is_resp3 ? strs_size / 2 : strs_size);
|
||||||
|
for (size_t i = 0; i < strs_size; i += 2) {
|
||||||
|
if (is_resp3)
|
||||||
|
StartArray(2);
|
||||||
|
SendBulkString(strs[i]);
|
||||||
|
SendBulkString(strs[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace facade
|
} // namespace facade
|
||||||
|
|
|
@ -296,6 +296,8 @@ class RedisReplyBuilder : public RedisReplyBuilderBase {
|
||||||
|
|
||||||
void StartArray(unsigned len);
|
void StartArray(unsigned len);
|
||||||
void SendEmptyArray();
|
void SendEmptyArray();
|
||||||
|
|
||||||
|
void SendBulkStrArrAsPairs(const ArgRange& strs);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace facade
|
} // namespace facade
|
||||||
|
|
|
@ -1271,10 +1271,12 @@ void HSetFamily::HRandField(CmdArgList args, const CommandContext& cmd_cntx) {
|
||||||
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
auto* rb = static_cast<RedisReplyBuilder*>(cmd_cntx.rb);
|
||||||
OpResult<StringVec> result = cmd_cntx.tx->ScheduleSingleHopT(std::move(cb));
|
OpResult<StringVec> result = cmd_cntx.tx->ScheduleSingleHopT(std::move(cb));
|
||||||
if (result) {
|
if (result) {
|
||||||
if ((result->size() == 1) && (args.size() == 1))
|
if (result->size() == 1 && args.size() == 1)
|
||||||
rb->SendBulkString(result->front());
|
rb->SendBulkString(result->front());
|
||||||
|
else if (with_values)
|
||||||
|
rb->SendBulkStrArrAsPairs(*result);
|
||||||
else
|
else
|
||||||
rb->SendBulkStrArr(*result, facade::RedisReplyBuilder::ARRAY);
|
rb->SendBulkStrArr(*result, RedisReplyBuilder::ARRAY);
|
||||||
} else if (result.status() == OpStatus::KEY_NOTFOUND) {
|
} else if (result.status() == OpStatus::KEY_NOTFOUND) {
|
||||||
if (args.size() == 1)
|
if (args.size() == 1)
|
||||||
rb->SendNull();
|
rb->SendNull();
|
||||||
|
|
|
@ -541,4 +541,30 @@ TEST_F(HSetFamilyTest, KeyRemovedWhenEmpty) {
|
||||||
test_cmd([&] { EXPECT_THAT(Run({"HSTRLEN", "a", "afield"}), IntArg(0)); }, "HSTRLEN");
|
test_cmd([&] { EXPECT_THAT(Run({"HSTRLEN", "a", "afield"}), IntArg(0)); }, "HSTRLEN");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(HSetFamilyTest, HRandFieldRespFormat) {
|
||||||
|
absl::flat_hash_map<std::string, std::string> expected{
|
||||||
|
{"a", "1"},
|
||||||
|
{"b", "2"},
|
||||||
|
{"c", "3"},
|
||||||
|
};
|
||||||
|
Run({"HELLO", "3"});
|
||||||
|
EXPECT_THAT(Run({"HSET", "key", "a", "1", "b", "2", "c", "3"}), IntArg(3));
|
||||||
|
auto resp = Run({"HRANDFIELD", "key", "3", "WITHVALUES"});
|
||||||
|
EXPECT_THAT(resp, ArrLen(3));
|
||||||
|
for (const auto& v : resp.GetVec()) {
|
||||||
|
EXPECT_THAT(v, ArrLen(2));
|
||||||
|
EXPECT_THAT(v.GetVec()[0], AnyOf("a", "b", "c"));
|
||||||
|
EXPECT_THAT(v.GetVec()[1], expected[v.GetVec()[0].GetView()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Run({"HELLO", "2"});
|
||||||
|
resp = Run({"HRANDFIELD", "key", "3", "WITHVALUES"});
|
||||||
|
EXPECT_THAT(resp, ArrLen(6));
|
||||||
|
const auto& vec = resp.GetVec();
|
||||||
|
for (size_t i = 0; i < vec.size(); i += 2) {
|
||||||
|
EXPECT_THAT(vec[i], AnyOf("a", "b", "c"));
|
||||||
|
EXPECT_THAT(vec[i + 1], expected[vec[i].GetView()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace dfly
|
} // namespace dfly
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue