Add Redis::zMscore command.
This commit is contained in:
Pavlo Yatsukhnenko
2021-01-17 16:27:30 +02:00
parent a024a9a2bc
commit a534a2c36b
5 changed files with 74 additions and 0 deletions
+44
View File
@@ -2511,6 +2511,50 @@ redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval
return 0;
}
PHP_REDIS_API int
redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
{
char inbuf[4096], *line;
int i, numElems, len;
size_t buf_len;
zval z_multi_result;
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &buf_len) < 0) {
return FAILURE;
}
if (*inbuf != TYPE_MULTIBULK) {
if (IS_ATOMIC(redis_sock)) {
if (*inbuf == TYPE_ERR) {
redis_sock_set_err(redis_sock, inbuf + 1, buf_len);
}
RETVAL_FALSE;
} else {
add_next_index_bool(z_tab, 0);
}
return FAILURE;
}
numElems = atoi(inbuf + 1);
array_init(&z_multi_result);
for (i = 0; i < numElems; ++i) {
if ((line = redis_sock_read(redis_sock, &len)) == NULL) {
add_next_index_bool(&z_multi_result, 0);
continue;
}
add_next_index_double(&z_multi_result, atof(line));
efree(line);
}
if (IS_ATOMIC(redis_sock)) {
RETVAL_ZVAL(&z_multi_result, 0, 1);
} else {
add_next_index_zval(z_tab, &z_multi_result);
}
return SUCCESS;
}
PHP_REDIS_API void
redis_mbulk_reply_loop(RedisSock *redis_sock, zval *z_tab, int count,
int unserialize)
+1
View File
@@ -87,6 +87,7 @@ PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, Re
PHP_REDIS_API int redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
PHP_REDIS_API int redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
PHP_REDIS_API int redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
PHP_REDIS_API int redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, REDIS_SCAN_TYPE type, zend_long *iter);
+1
View File
@@ -126,6 +126,7 @@ PHP_METHOD(Redis, zCard);
PHP_METHOD(Redis, zCount);
PHP_METHOD(Redis, zIncrBy);
PHP_METHOD(Redis, zLexCount);
PHP_METHOD(Redis, zMscore);
PHP_METHOD(Redis, zPopMax);
PHP_METHOD(Redis, zPopMin);
PHP_METHOD(Redis, zRange);
+8
View File
@@ -441,6 +441,7 @@ static zend_function_entry redis_functions[] = {
PHP_ME(Redis, zCount, arginfo_key_min_max, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zIncrBy, arginfo_zincrby, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zLexCount, arginfo_key_min_max, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zMscore, arginfo_key_members, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zPopMax, arginfo_key, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zPopMin, arginfo_key, ZEND_ACC_PUBLIC)
PHP_ME(Redis, zRange, arginfo_zrange, ZEND_ACC_PUBLIC)
@@ -2250,6 +2251,13 @@ PHP_METHOD(Redis, zScore)
}
/* }}} */
/* {{{ proto array Redis::zMscore(string key, string member0, ...memberN) */
PHP_METHOD(Redis, zMscore)
{
REDIS_PROCESS_KW_CMD("ZMSCORE", redis_key_varval_cmd, redis_mbulk_reply_double);
}
/* }}} */
/* {{{ proto long Redis::zRank(string key, string member) */
PHP_METHOD(Redis, zRank) {
REDIS_PROCESS_KW_CMD("ZRANK", redis_kv_cmd, redis_long_response);
+20
View File
@@ -2506,6 +2506,26 @@ class Redis_Test extends TestSuite
}
}
public function testzMscore()
{
// Only available since 6.2.0
if (version_compare($this->version, '6.2.0') < 0) {
$this->markTestSkipped();
return;
}
$this->redis->del('key');
foreach (range('a', 'c') as $c) {
$this->redis->zAdd('key', 1, $c);
}
$scores = $this->redis->zMscore('key', 'a', 'notamember', 'c');
$this->assertEquals([1.0, false, 1.0], $scores);
$scores = $this->redis->zMscore('wrongkey', 'a', 'b', 'c');
$this->assertEquals([false, false, false], $scores);
}
public function testZRemRangeByLex() {
if (version_compare($this->version, "2.8.9") < 0) {
$this->MarkTestSkipped();