8000 Adds optional COUNT argument to sPop · chenyongze/phpredis@d2e203a · GitHub
[go: up one dir, main page]

Skip to content

Commit d2e203a

Browse files
Adds optional COUNT argument to sPop
Fixes phpredis#1145
1 parent e21bc63 commit d2e203a

File tree

6 files changed

+65
-14
lines changed

6 files changed

+65
-14
lines changed

README.markdown

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,7 +2103,7 @@ $redis->lSize('key1');/* 2 */
21032103
* [sIsMember, sContains](#sismember-scontains) - Determine if a given value is a member of a set
21042104
* [sMembers, sGetMembers](#smembers-sgetmembers) - Get all the members in a set
21052105
* [sMove](#smove) - Move a member from one set to another
2106-
* [sPop](#spop) - Remove and return a random member from a set
2106+
* [sPop](#spop) - Remove and return one or more members of a set at random
21072107
* [sRandMember](#srandmember) - Get one or multiple random members from a set
21082108
* [sRem, sRemove](#srem-sremove) - Remove one or more members from a set
21092109
* [sUnion](#sunion) - Add multiple sets
@@ -2373,16 +2373,24 @@ $redis->sMove('key1', 'key2', 'member13'); /* 'key1' => {'member11', 'member12'
23732373
_**Description**_: Removes and returns a random element from the set value at Key.
23742374
##### *Parameters*
23752375
*key*
2376-
##### *Return value*
2376+
*count*: Integer, optional
2377+
##### *Return value (without count argument)*
23772378
*String* "popped" value
23782379
*Bool* `FALSE` if set identified by key is empty or doesn't exist.
2380+
##### *Return value (with count argument)*
2381+
*Array*: Member(s) returned or an empty array if the set doesn't exist
2382+
*Bool*: `FALSE` on error if the key is not a set
23792383
##### *Example*
23802384
~~~
23812385
$redis->sAdd('key1' , 'member1');
23822386
$redis->sAdd('key1' , 'member2');
23832387
$redis->sAdd('key1' , 'member3'); /* 'key1' => {'member3', 'member1', 'member2'}*/
23842388
$redis->sPop('key1'); /* 'member1', 'key1' => {'member3', 'member2'} */
23852389
$redis->sPop('key1'); /* 'member3', 'key1' => {'member2'} */
2390+
2391+
/* With count */
2392+
$redis->sAdd('key2', 'member1', 'member2', 'member3');
2393+
$redis->sPop('key2', 3); /* Will return all members but in no particular order */
23862394
~~~
23872395

23882396
### sRandMember

redis.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1340,7 +1340,14 @@ PHP_METHOD(Redis, sMove)
13401340
/* {{{ proto string Redis::sPop(string key) */
13411341
PHP_METHOD(Redis, sPop)
13421342
{
1343-
REDIS_PROCESS_KW_CMD("SPOP", redis_key_cmd, redis_string_response);
1343+
if (ZEND_NUM_ARGS() == 1) {
1344+
REDIS_PROCESS_KW_CMD("SPOP", redis_key_cmd, redis_string_response);
1345+
} else if (ZEND_NUM_ARGS() == 2) {
1346+
REDIS_PROCESS_KW_CMD("SPOP", redis_key_long_cmd, redis_sock_read_multibulk_reply);
1347+
} else {
1348+
ZEND_WRONG_PARAM_COUNT();
1349+
}
1350+
13441351
}
13451352
/* }}} */
13461353

redis_cluster.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,13 @@ PHP_METHOD(RedisCluster, lset) {
11331133

11341134
/* {{{ proto string RedisCluster::spop(string key) */
11351135
PHP_METHOD(RedisCluster, spop) {
1136-
CLUSTER_PROCESS_KW_CMD("SPOP", redis_key_cmd, cluster_bulk_resp, 0);
1136+
if (ZEND_NUM_ARGS() == 1) {
1137+
CLUSTER_PROCESS_KW_CMD("SPOP", redis_key_cmd, cluster_bulk_resp, 0);
1138+
} else if (ZEND_NUM_ARGS() == 2) {
1139+
CLUSTER_PROCESS_KW_CMD("SPOP", redis_key_long_cmd, cluster_mbulk_resp, 0);
1140+
} else {
1141+
ZEND_WRONG_PARAM_COUNT();
1142+
}
11371143
}
11381144
/* }}} */
11391145

redis_commands.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ int redis_key_long_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
343343
CMD_SET_SLOT(slot, key, key_len);
344344

345345
if (key_free) efree(key);
346+
346347
// Success!
347348
return SUCCESS;
348349
}

tests/RedisTest.php

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,19 +1154,46 @@ public function testsMove()
11541154
public function testsPop()
11551155
{
11561156
$this->redis->del('set0');
1157-
$this->assertTrue($this->redis->sPop('set0') === FALSE);
1157+
$this->assertTrue($this->redis->sPop('set0') === FALSE);
11581158

11591159
$this->redis->sAdd('set0', 'val');
11601160
$this->redis->sAdd('set0', 'val2');
11611161

1162-
$v0 = $this->redis->sPop('set0');
1163-
$this->assertTrue(1 === $this->redis->scard('set0'));
1164-
$this->assertTrue($v0 === 'val' || $v0 === 'val2');
1165-
$v1 = $this->redis->sPop('set0');
1166-
$this->assertTrue(0 === $this->redis->scard('set0'));
1167-
$this->assertTrue(($v0 === 'val' && $v1 === 'val2') || ($v1 === 'val' && $v0 === 'val2'));
1162+
$v0 = $this->redis->sPop('set0');
1163+
$this->assertTrue(1 === $this->redis->scard('set0'));
1164+
$this->assertTrue($v0 === 'val' || $v0 === 'val2');
1165+
$v1 = $this->redis->sPop('set0');
1166+
$this->assertTrue(0 === $this->redis->scard('set0'));
1167+
$this->assertTrue(($v0 === 'val' && $v1 === 'val2') || ($v1 === 'val' && $v0 === 'val2'));
11681168

1169-
$this->assertTrue($this->redis->sPop('set0') === FALSE);
1169+
$this->assertTrue($this->redis->sPop('set0') === FALSE);
1170+
}
1171+
1172+
public function testsPopWithCount() {
1173+
if (!$this->minVersionCheck("3.2")) {
1174+
return $this->markTestSkipped();
1175+
}
1176+
1177+
$set = 'set0';
1178+
$prefix = 'member';
1179+
$count = 5;
1180+
1181+
/* Add a few members */
1182+
$this->redis->del($set);
1183+
for ($i = 0; $i < $count; $i++) {
1184+
$this->redis->sadd($set, $prefix.$i);
1185+
}
1186+
1187+
/* Pop them all */
1188+
$ret = $this->redis->sPop($set, $i);
1189+
1190+
/* Make sure we got an arary and the count is right */
1191+
if ($this->assertTrue(is_array($ret)) && $this->assertTrue(count($ret) == $count)) {
1192+
/* Probably overkill but validate the actual returned members */
1193+
for ($i = 0; $i < $count; $i++) {
1194+
$this->assertTrue(in_array($prefix.$i, $ret));
1195+
}
1196+
}
11701197
}
11711198

11721199
public function testsRandMember() {

tests/TestSuite.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@ public static function make_warning($str_msg) {
5252
}
5353

5454
protected function assertFalse($bool) {
55-
$this->assertTrue(!$bool);
55+
return $this->assertTrue(!$bool);
5656
}
5757

5858
protected function assertTrue($bool) {
5959
if($bool)
60-
return;
60+
return true;
6161

6262
$bt = debug_backtrace(false);
6363
self::$errors []= sprintf("Assertion failed: %s:%d (%s)\n",
6464
$bt[0]["file"], $bt[0]["line"], $bt[1]["function"]);
65+
66+
return false;
6567
}
6668

6769
protected function assertLess($a, $b) {

0 commit comments

Comments
 (0)
0