ZRANGEBYLEX

Implemented ZRANGEBYLEX for both Redis and RedisCluster
This commit is contained in:
michael-grunder
2014-07-10 19:04:24 -07:00
parent 59038f4232
commit 0c7a1ba6e8
6 changed files with 75 additions and 0 deletions

View File

@@ -115,6 +115,7 @@ PHP_METHOD(Redis, zRevRange);
PHP_METHOD(Redis, zRangeByScore);
PHP_METHOD(Redis, zRangeByLex);
PHP_METHOD(Redis, zRevRangeByScore);
PHP_METHOD(Redis, zRangeByLex);
PHP_METHOD(Redis, zCount);
PHP_METHOD(Redis, zDeleteRangeByScore);
PHP_METHOD(Redis, zDeleteRangeByRank);

View File

@@ -2003,6 +2003,13 @@ PHP_METHOD(Redis, zRevRangeByScore) {
}
/* }}} */
/* {{{ proto array Redis::zRangeByLex(string key, string min, string max, [
* offset, limit]) */
PHP_METHOD(Redis, zRangeByLex) {
REDIS_PROCESS_CMD(zrangebylex, redis_sock_read_multibulk_reply);
}
/* }}} */
/* {{{ proto long Redis::zDelete(string key, string member) */
PHP_METHOD(Redis, zDelete)
{

View File

@@ -154,6 +154,8 @@ zend_function_entry redis_cluster_functions[] = {
PHP_ME(RedisCluster, zrange, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zrevrange, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zrangebyscore, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zrevrangebyscore, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zrangebylex, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zunionstore, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zinterstore, NULL, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, zrem, NULL, ZEND_ACC_PUBLIC)
@@ -1409,6 +1411,12 @@ PHP_METHOD(RedisCluster, zrevrangebyscore) {
}
/* }}} */
/* {{{ proto RedisCluster::zrangebylex(string key, string min, string max, [
* LIMIT offset count) */
PHP_METHOD(RedisCluster, zrangebylex) {
CLUSTER_PROCESS_CMD(zrangebylex, cluster_mbulk_resp);
}
/* }}} */
/* {{{ proto RedisCluster::sort(string key, array options) */
PHP_METHOD(RedisCluster, sort) {

View File

@@ -212,6 +212,8 @@ PHP_METHOD(RedisCluster, srandmember);
PHP_METHOD(RedisCluster, zrange);
PHP_METHOD(RedisCluster, zrevrange);
PHP_METHOD(RedisCluster, zrangebyscore);
PHP_METHOD(RedisCluster, zrevrangebyscore);
PHP_METHOD(RedisCluster, zrangebylex);
PHP_METHOD(RedisCluster, zunionstore);
PHP_METHOD(RedisCluster, zinterstore);
PHP_METHOD(RedisCluster, sort);

View File

@@ -2398,6 +2398,60 @@ int redis_sdiffstore_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
"SDIFFSTORE", sizeof("SDIFFSTORE")-1, 2, 0, cmd, cmd_len, slot);
}
/* ZRANGEBYLEX */
int redis_zrangebylex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx)
{
char *key, *min, *max;
int key_len, min_len, max_len, key_free;
long offset, count;
int argc = ZEND_NUM_ARGS();
/* We need either 3 or 5 arguments for this to be valid */
if(argc != 3 && argc != 5) {
php_error_docref(0 TSRMLS_CC, E_WARNING,
"Must pass either 3 or 5 arguments");
return FAILURE;
}
if(zend_parse_parameters(argc TSRMLS_CC, "sss|ll", &key,
&key_len, &min, &min_len, &max, &max_len,
&offset, &count)==FAILURE)
{
return FAILURE;
}
/* min and max must start with '(' or '[' */
if(min_len < 1 || max_len < 1 || (min[0] != '(' && min[0] != '[') ||
(max[0] != '(' && max[0] != '['))
{
php_error_docref(0 TSRMLS_CC, E_WARNING,
"min and max arguments must start with '[' or '('");
return FAILURE;
}
/* Prefix key */
key_free = redis_key_prefix(redis_sock, &key, &key_len);
/* Construct command */
if(argc == 3) {
*cmd_len = redis_cmd_format_static(cmd, "ZRANGEBYLEX", "sss", key,
key_len, min, min_len, max, max_len);
} else {
*cmd_len = redis_cmd_format_static(cmd, "ZRANGEBYLEX", "ssssll", key,
key_len, min, min_len, max, max_len, "LIMIT", sizeof("LIMIT")-1,
offset, count);
}
/* Pick our slot */
CMD_SET_SLOT(slot,key,key_len);
/* Free key if we prefixed */
if(key_free) efree(key);
return SUCCESS;
}
/*
* Redis commands that don't deal with the server at all. The RedisSock*
* pointer is the only thing retreived differently, so we just take that

View File

@@ -197,6 +197,9 @@ int redis_sdiff_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
int redis_sdiffstore_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx);
int redis_zrangebylex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx);
int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
long it, char *pat, int pat_len, long count);