Skip to content

Commit e1bd960

Browse files
authored
feat: Implement GEORADIUSBYMEMBER_RO command (#5726)
Signed-off-by: Eric <[email protected]>
1 parent 333f2df commit e1bd960

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

src/server/geo_family.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,8 @@ void GeoFamily::GeoSearch(CmdArgList args, const CommandContext& cmd_cntx) {
685685
GeoSearchStoreGeneric(cmd_cntx.tx, builder, shape, key, member, geo_ops);
686686
}
687687

688-
void GeoFamily::GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cntx) {
688+
void GeoFamily::GeoRadiusByMemberGeneric(CmdArgList args, const CommandContext& cmd_cntx,
689+
bool read_only) {
689690
GeoShape shape = {};
690691
GeoSearchOpts geo_ops;
691692
// parse arguments
@@ -737,7 +738,7 @@ void GeoFamily::GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cnt
737738
geo_ops.withdist = true;
738739
} else if (cur_arg == "WITHHASH") {
739740
geo_ops.withhash = true;
740-
} else if (cur_arg == "STORE") {
741+
} else if (cur_arg == "STORE" && !read_only) {
741742
if (geo_ops.store != GeoStoreType::kNoStore) {
742743
return builder->SendError(kStoreTypeErr);
743744
}
@@ -748,7 +749,7 @@ void GeoFamily::GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cnt
748749
} else {
749750
return builder->SendError(kSyntaxErr);
750751
}
751-
} else if (cur_arg == "STOREDIST") {
752+
} else if (cur_arg == "STOREDIST" && !read_only) {
752753
if (geo_ops.store != GeoStoreType::kNoStore) {
753754
return builder->SendError(kStoreTypeErr);
754755
}
@@ -773,6 +774,14 @@ void GeoFamily::GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cnt
773774
GeoSearchStoreGeneric(cmd_cntx.tx, builder, shape, key, member, geo_ops);
774775
}
775776

777+
void GeoFamily::GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cntx) {
778+
GeoRadiusByMemberGeneric(args, cmd_cntx, false);
779+
}
780+
781+
void GeoFamily::GeoRadiusByMemberRO(CmdArgList args, const CommandContext& cmd_cntx) {
782+
GeoRadiusByMemberGeneric(args, cmd_cntx, true);
783+
}
784+
776785
void GeoFamily::GeoRadiusGeneric(CmdArgList args, const CommandContext& cmd_cntx, bool read_only) {
777786
GeoShape shape = {};
778787
GeoSearchOpts geo_ops;
@@ -893,6 +902,7 @@ constexpr uint32_t kGeoPos = READ | GEO | SLOW;
893902
constexpr uint32_t kGeoDist = READ | GEO | SLOW;
894903
constexpr uint32_t kGeoSearch = READ | GEO | SLOW;
895904
constexpr uint32_t kGeoRadiusByMember = WRITE | GEO | SLOW;
905+
constexpr uint32_t kGeoRadiusByMemberRO = READ | GEO | SLOW;
896906
constexpr uint32_t kGeoRadius = WRITE | GEO | SLOW;
897907
constexpr uint32_t kGeoRadiusRO = READ | GEO | SLOW;
898908
} // namespace acl
@@ -907,6 +917,8 @@ void GeoFamily::Register(CommandRegistry* registry) {
907917
<< CI{"GEOSEARCH", CO::READONLY, -7, 1, 1, acl::kGeoSearch}.HFUNC(GeoSearch)
908918
<< CI{"GEORADIUSBYMEMBER", CO::WRITE | CO::STORE_LAST_KEY, -5, 1, 1, acl::kGeoRadiusByMember}
909919
.HFUNC(GeoRadiusByMember)
920+
<< CI{"GEORADIUSBYMEMBER_RO", CO::READONLY, -5, 1, 1, acl::kGeoRadiusByMemberRO}.HFUNC(
921+
GeoRadiusByMemberRO)
910922
<< CI{"GEORADIUS", CO::WRITE | CO::STORE_LAST_KEY, -6, 1, 1, acl::kGeoRadius}.HFUNC(GeoRadius)
911923
<< CI{"GEORADIUS_RO", CO::READONLY, -6, 1, 1, acl::kGeoRadiusRO}.HFUNC(GeoRadiusRO);
912924
}

src/server/geo_family.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ class GeoFamily {
2121
static void GeoPos(CmdArgList args, const CommandContext& cmd_cntx);
2222
static void GeoDist(CmdArgList args, const CommandContext& cmd_cntx);
2323
static void GeoSearch(CmdArgList args, const CommandContext& cmd_cntx);
24+
static void GeoRadiusByMemberGeneric(CmdArgList args, const CommandContext& cmd_cntx,
25+
bool read_only);
2426
static void GeoRadiusByMember(CmdArgList args, const CommandContext& cmd_cntx);
27+
static void GeoRadiusByMemberRO(CmdArgList args, const CommandContext& cmd_cntx);
2528
static void GeoRadiusGeneric(CmdArgList args, const CommandContext& cmd_cntx, bool read_only);
2629
static void GeoRadius(CmdArgList args, const CommandContext& cmd_cntx);
2730
static void GeoRadiusRO(CmdArgList args, const CommandContext& cmd_cntx);

src/server/geo_family_test.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,34 @@ TEST_F(GeoFamilyTest, GeoRadiusByMember) {
242242
EXPECT_THAT(resp, ErrArg(err));
243243
}
244244

245+
TEST_F(GeoFamilyTest, GeoRadiusByMemberRO) {
246+
EXPECT_EQ(10, CheckedInt({"geoadd", "Europe", "13.4050", "52.5200", "Berlin", "3.7038",
247+
"40.4168", "Madrid", "9.1427", "38.7369", "Lisbon", "2.3522",
248+
"48.8566", "Paris", "16.3738", "48.2082", "Vienna", "4.8952",
249+
"52.3702", "Amsterdam", "10.7522", "59.9139", "Oslo", "23.7275",
250+
"37.9838", "Athens", "19.0402", "47.4979", "Budapest", "6.2603",
251+
"53.3498", "Dublin"}));
252+
253+
auto resp =
254+
Run({"GEORADIUSBYMEMBER_RO", "Europe", "Madrid", "700", "KM", "WITHCOORD", "WITHDIST"});
255+
EXPECT_THAT(
256+
resp,
257+
RespArray(ElementsAre(
258+
RespArray(ElementsAre(
259+
"Madrid", "0", RespArray(ElementsAre("3.7038007378578186", "40.416799319406216")))),
260+
RespArray(
261+
ElementsAre("Lisbon", "502.20769462704084",
262+
RespArray(ElementsAre("9.142698347568512", "38.736900197448534")))))));
263+
264+
// GEORADIUSBYMEMBER_RO should not accept arguments for storing (writing data)
265+
resp =
266+
Run({"GEORADIUSBYMEMBER_RO", "Europe", "Madrid", "700", "KM", "STOREDIST", "store_dist_key"});
267+
EXPECT_THAT(resp, ErrArg("syntax error"));
268+
269+
resp = Run({"GEORADIUSBYMEMBER_RO", "Europe", "Madrid", "700", "KM", "STORE", "store_key"});
270+
EXPECT_THAT(resp, ErrArg("syntax error"));
271+
}
272+
245273
TEST_F(GeoFamilyTest, GeoRadius) {
246274
EXPECT_EQ(10, CheckedInt({"geoadd", "Europe", "13.4050", "52.5200", "Berlin", "3.7038",
247275
"40.4168", "Madrid", "9.1427", "38.7369", "Lisbon", "2.3522",

0 commit comments

Comments
 (0)