Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 22d81a9

Browse files
Implement GEORADIUS_RO and GEORADIUSBYMEMBER_RO
This addresses #1502, #1487
1 parent 7bc845e commit 22d81a9

7 files changed

Lines changed: 63 additions & 32 deletions

File tree

php_redis.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,9 @@ PHP_METHOD(Redis, geohash);
205205
PHP_METHOD(Redis, geopos);
206206
PHP_METHOD(Redis, geodist);
207207
PHP_METHOD(Redis, georadius);
208+
PHP_METHOD(Redis, georadius_ro);
208209
PHP_METHOD(Redis, georadiusbymember);
210+
PHP_METHOD(Redis, georadiusbymember_ro);
209211

210212
PHP_METHOD(Redis, client);
211213
PHP_METHOD(Redis, command);

redis.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,9 @@ static zend_function_entry redis_functions[] = {
285285
PHP_ME(Redis, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
286286
PHP_ME(Redis, geopos, arginfo_key_members, ZEND_ACC_PUBLIC)
287287
PHP_ME(Redis, georadius, arginfo_georadius, ZEND_ACC_PUBLIC)
288+
PHP_ME(Redis, georadius_ro, arginfo_georadius, ZEND_ACC_PUBLIC)
288289
PHP_ME(Redis, georadiusbymember, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
290+
PHP_ME(Redis, georadiusbymember_ro, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
289291
PHP_ME(Redis, get, arginfo_key, ZEND_ACC_PUBLIC)
290292
PHP_ME(Redis, getAuth, arginfo_void, ZEND_ACC_PUBLIC)
291293
PHP_ME(Redis, getBit, arginfo_key_offset, ZEND_ACC_PUBLIC)
@@ -3595,11 +3597,19 @@ PHP_METHOD(Redis, geodist) {
35953597
}
35963598

35973599
PHP_METHOD(Redis, georadius) {
3598-
REDIS_PROCESS_CMD(georadius, redis_read_variant_reply);
3600+
REDIS_PROCESS_KW_CMD("GEORADIUS", redis_georadius_cmd, redis_read_variant_reply);
3601+
}
3602+
3603+
PHP_METHOD(Redis, georadius_ro) {
3604+
REDIS_PROCESS_KW_CMD("GEORADIUS_RO", redis_georadius_cmd, redis_read_variant_reply);
35993605
}
36003606

36013607
PHP_METHOD(Redis, georadiusbymember) {
3602-
REDIS_PROCESS_CMD(georadiusbymember, redis_read_variant_reply);
3608+
REDIS_PROCESS_KW_CMD("GEORADIUSBYMEMBER", redis_georadiusbymember_cmd, redis_read_variant_reply);
3609+
}
3610+
3611+
PHP_METHOD(Redis, georadiusbymember_ro) {
3612+
REDIS_PROCESS_KW_CMD("GEORADIUSBYMEMBER_RO", redis_georadiusbymember_cmd, redis_read_variant_reply);
36033613
}
36043614

36053615
/*

redis_cluster.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ zend_function_entry redis_cluster_functions[] = {
149149
PHP_ME(RedisCluster, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
150150
PHP_ME(RedisCluster, geopos, arginfo_key_members, ZEND_ACC_PUBLIC)
151151
PHP_ME(RedisCluster, georadius, arginfo_georadius, ZEND_ACC_PUBLIC)
152+
PHP_ME(RedisCluster, georadius_ro, arginfo_georadius, ZEND_ACC_PUBLIC)
152153
PHP_ME(RedisCluster, georadiusbymember, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
154+
PHP_ME(RedisCluster, georadiusbymember_ro, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
153155
PHP_ME(RedisCluster, get, arginfo_key, ZEND_ACC_PUBLIC)
154156
PHP_ME(RedisCluster, getbit, arginfo_key_offset, ZEND_ACC_PUBLIC)
155157
PHP_ME(RedisCluster, getlasterror, arginfo_void, ZEND_ACC_PUBLIC)
@@ -2953,12 +2955,22 @@ PHP_METHOD(RedisCluster, geodist) {
29532955

29542956
/* {{{ proto array RedisCluster::georadius() }}} */
29552957
PHP_METHOD(RedisCluster, georadius) {
2956-
CLUSTER_PROCESS_CMD(georadius, cluster_variant_resp, 1);
2958+
CLUSTER_PROCESS_KW_CMD("GEORADIUS", redis_georadius_cmd, cluster_variant_resp, 1);
2959+
}
2960+
2961+
/* {{{ proto array RedisCluster::georadius() }}} */
2962+
PHP_METHOD(RedisCluster, georadius_ro) {
2963+
CLUSTER_PROCESS_KW_CMD("GEORADIUS_RO", redis_georadius_cmd, cluster_variant_resp, 1);
29572964
}
29582965

29592966
/* {{{ proto array RedisCluster::georadiusbymember() }}} */
29602967
PHP_METHOD(RedisCluster, georadiusbymember) {
2961-
CLUSTER_PROCESS_CMD(georadiusbymember, cluster_variant_resp, 1)
2968+
CLUSTER_PROCESS_KW_CMD("GEORADIUSBYMEMBER", redis_georadiusbymember_cmd, cluster_variant_resp, 1);
2969+
}
2970+
2971+
/* {{{ proto array RedisCluster::georadiusbymember() }}} */
2972+
PHP_METHOD(RedisCluster, georadiusbymember_ro) {
2973+
CLUSTER_PROCESS_KW_CMD("GEORADIUSBYMEMBER_RO", redis_georadiusbymember_cmd, cluster_variant_resp, 1);
29622974
}
29632975

29642976
/* {{{ proto array RedisCluster::role(string key)

redis_cluster.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ PHP_METHOD(RedisCluster, geohash);
255255
PHP_METHOD(RedisCluster, geopos);
256256
PHP_METHOD(RedisCluster, geodist);
257257
PHP_METHOD(RedisCluster, georadius);
258+
PHP_METHOD(RedisCluster, georadius_ro);
258259
PHP_METHOD(RedisCluster, georadiusbymember);
260+
PHP_METHOD(RedisCluster, georadiusbymember_ro);
259261

260262
/* SCAN and friends */
261263
PHP_METHOD(RedisCluster, scan);

redis_commands.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,9 +2788,10 @@ void append_georadius_opts(RedisSock *redis_sock, smart_string *str, short *slot
27882788
}
27892789
}
27902790

2791-
/* GEORADIUS */
2791+
/* GEORADIUS / GEORADIUS_RO */
27922792
int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2793-
char **cmd, int *cmd_len, short *slot, void **ctx)
2793+
char *kw, char **cmd, int *cmd_len, short *slot,
2794+
void **ctx)
27942795
{
27952796
char *key, *unit;
27962797
short store_slot = 0;
@@ -2823,7 +2824,7 @@ int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
28232824
(gopts.store != STORE_NONE ? 2 : 0);
28242825

28252826
/* Begin construction of our command */
2826-
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "GEORADIUS");
2827+
redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
28272828

28282829
/* Prefix and set slot */
28292830
keyfree = redis_key_prefix(redis_sock, &key, &keylen);
@@ -2858,9 +2859,11 @@ int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
28582859
return SUCCESS;
28592860
}
28602861

2861-
/* GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] */
2862+
/* GEORADIUSBYMEMBER/GEORADIUSBYMEMBER_RO
2863+
* key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] */
28622864
int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2863-
char **cmd, int *cmd_len, short *slot, void **ctx)
2865+
char *kw, char **cmd, int *cmd_len, short *slot,
2866+
void **ctx)
28642867
{
28652868
char *key, *mem, *unit;
28662869
strlen_t keylen, memlen, unitlen;
@@ -2890,7 +2893,7 @@ int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
28902893
(gopts.store != STORE_NONE ? 2 : 0);
28912894

28922895
/* Begin command construction*/
2893-
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "GEORADIUSBYMEMBER");
2896+
redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
28942897

28952898
/* Prefix our key if we're prefixing and set the slot */
28962899
keyfree = redis_key_prefix(redis_sock, &key, &keylen);

redis_commands.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
118118
int redis_xrange_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
119119
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
120120

121+
int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
122+
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
123+
124+
int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
125+
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
126+
121127
/* Commands which need a unique construction mechanism. This is either because
122128
* they don't share a signature with any other command, or because there is
123129
* specific processing we do (e.g. verifying subarguments) that make them
@@ -253,12 +259,6 @@ int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
253259
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
254260
char **cmd, int *cmd_len, short *slot, void **ctx);
255261

256-
int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
257-
char **cmd, int *cmd_len, short *slot, void **ctx);
258-
259-
int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
260-
char **cmd, int *cmd_len, short *slot, void **ctx);
261-
262262
int redis_migrate_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
263263
char **cmd, int *cmd_len, short *slot, void **ctx);
264264

tests/RedisTest.php

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5109,29 +5109,29 @@ public function genericGeoRadiusTest($cmd) {
51095109
$this->addCities('{gk}');
51105110

51115111
/* Pre tested with redis-cli. We're just verifying proper delivery of distance and unit */
5112-
if ($cmd == 'georadius') {
5113-
$this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 10, 'mi'), Array('Chico'));
5114-
$this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 30, 'mi'), Array('Gridley','Chico'));
5115-
$this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 50, 'km'), Array('Gridley','Chico'));
5116-
$this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 50000, 'm'), Array('Gridley','Chico'));
5117-
$this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 150000, 'ft'), Array('Gridley', 'Chico'));
5118-
$args = Array('georadius', '{gk}', $lng, $lat, 500, 'mi');
5112+
if ($cmd == 'georadius' || $cmd == 'georadius_ro') {
5113+
$this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 10, 'mi'), Array('Chico'));
5114+
$this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 30, 'mi'), Array('Gridley','Chico'));
5115+
$this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 50, 'km'), Array('Gridley','Chico'));
5116+
$this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 50000, 'm'), Array('Gridley','Chico'));
5117+
$this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 150000, 'ft'), Array('Gridley', 'Chico'));
5118+
$args = Array($cmd, '{gk}', $lng, $lat, 500, 'mi');
51195119

51205120
/* Test a bad COUNT argument */
51215121
foreach (Array(-1, 0, 'notanumber') as $count) {
5122-
$this->assertFalse(@$this->redis->georadius('{gk}', $lng, $lat, 10, 'mi', Array('count' => $count)));
5122+
$this->assertFalse(@$this->redis->$cmd('{gk}', $lng, $lat, 10, 'mi', Array('count' => $count)));
51235123
}
51245124
} else {
5125-
$this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 10, 'mi'), Array('Chico'));
5126-
$this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 30, 'mi'), Array('Gridley','Chico'));
5127-
$this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 50, 'km'), Array('Gridley','Chico'));
5128-
$this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 50000, 'm'), Array('Gridley','Chico'));
5129-
$this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 150000, 'ft'), Array('Gridley', 'Chico'));
5130-
$args = Array('georadiusbymember', '{gk}', $city, 500, 'mi');
5125+
$this->assertEquals($this->redis->$cmd('{gk}', $city, 10, 'mi'), Array('Chico'));
5126+
$this->assertEquals($this->redis->$cmd('{gk}', $city, 30, 'mi'), Array('Gridley','Chico'));
5127+
$this->assertEquals($this->redis->$cmd('{gk}', $city, 50, 'km'), Array('Gridley','Chico'));
5128+
$this->assertEquals($this->redis->$cmd('{gk}', $city, 50000, 'm'), Array('Gridley','Chico'));
5129+
$this->assertEquals($this->redis->$cmd('{gk}', $city, 150000, 'ft'), Array('Gridley', 'Chico'));
5130+
$args = Array($cmd, '{gk}', $city, 500, 'mi');
51315131

51325132
/* Test a bad COUNT argument */
51335133
foreach (Array(-1, 0, 'notanumber') as $count) {
5134-
$this->assertFalse(@$this->redis->georadiusbymember('{gk}', $city, 10, 'mi', Array('count' => $count)));
5134+
$this->assertFalse(@$this->redis->$cmd('{gk}', $city, 10, 'mi', Array('count' => $count)));
51355135
}
51365136
}
51375137

@@ -5185,7 +5185,7 @@ public function genericGeoRadiusTest($cmd) {
51855185
}
51865186

51875187
$ret1 = $this->rawCommandArray('{gk}', $realargs);
5188-
if ($cmd == 'georadius') {
5188+
if ($cmd == 'georadius' || $cmd == 'georadius_ro') {
51895189
$ret2 = $this->redis->$cmd('{gk}', $lng, $lat, 500, 'mi', $realopts);
51905190
} else {
51915191
$ret2 = $this->redis->$cmd('{gk}', $city, 500, 'mi', $realopts);
@@ -5205,6 +5205,7 @@ public function testGeoRadius() {
52055205
}
52065206

52075207
$this->genericGeoRadiusTest('georadius');
5208+
$this->genericGeoRadiusTest('georadius_ro');
52085209
}
52095210

52105211
public function testGeoRadiusByMember() {
@@ -5213,6 +5214,7 @@ public function testGeoRadiusByMember() {
52135214
}
52145215

52155216
$this->genericGeoRadiusTest('georadiusbymember');
5217+
$this->genericGeoRadiusTest('georadiusbymember_ro');
52165218
}
52175219

52185220
public function testGeoPos() {

0 commit comments

Comments
 (0)