SORT GET # implemented, with a test
This commit is contained in:
parent
5446315f29
commit
28173a49a7
3
TODO
3
TODO
@ -3,10 +3,9 @@ VERSION 1.1 TODO
|
|||||||
* For now only the last argument gets integer encoded, so make sure that: 1) every multi bulk commands implemented will have the last arg that is indeed a value, and not used otherwise. 2) to explicitly call the function to encode the object in MSET and other commands where there are multiple "values".
|
* For now only the last argument gets integer encoded, so make sure that: 1) every multi bulk commands implemented will have the last arg that is indeed a value, and not used otherwise. 2) to explicitly call the function to encode the object in MSET and other commands where there are multiple "values".
|
||||||
* Man pages for MSET MSETNX and SRANDMEMBER, Z-commands, ...
|
* Man pages for MSET MSETNX and SRANDMEMBER, Z-commands, ...
|
||||||
* Use strcoll() to compare objects in sorted sets, like it already happens for SORT.
|
* Use strcoll() to compare objects in sorted sets, like it already happens for SORT.
|
||||||
* Tests for: EXPIREAT, ZSCORE, ZINCRBY, SRANDMEMBER, SORT with #.
|
* Tests for: ZINCRBY, SRANDMEMBER, SORT with #.
|
||||||
* Write docs for the "STORE" operaiton of SORT, and GET "#" option.
|
* Write docs for the "STORE" operaiton of SORT, and GET "#" option.
|
||||||
* Append only mode: testing and a command to rebuild the log from scratch.
|
* Append only mode: testing and a command to rebuild the log from scratch.
|
||||||
* Redis-cli should be able to select a different DB than 0 using some switch.
|
|
||||||
|
|
||||||
VERSION 1.2 TODO
|
VERSION 1.2 TODO
|
||||||
|
|
||||||
|
13
redis.c
13
redis.c
@ -4577,13 +4577,24 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
|
|||||||
char buf[REDIS_SORTKEY_MAX+1];
|
char buf[REDIS_SORTKEY_MAX+1];
|
||||||
} keyname;
|
} keyname;
|
||||||
|
|
||||||
|
/* If the pattern is "#" return the substitution object itself in order
|
||||||
|
* to implement the "SORT ... GET #" feature. */
|
||||||
|
spat = pattern->ptr;
|
||||||
|
if (spat[0] == '#' && spat[1] == '\0') {
|
||||||
|
return subst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The substitution object may be specially encoded. If so we create
|
||||||
|
* a decoded object on the fly. */
|
||||||
if (subst->encoding == REDIS_ENCODING_RAW)
|
if (subst->encoding == REDIS_ENCODING_RAW)
|
||||||
|
/* If we don't need to get a decoded object increment the refcount
|
||||||
|
* so that the final decrRefCount() call will restore the original
|
||||||
|
* count */
|
||||||
incrRefCount(subst);
|
incrRefCount(subst);
|
||||||
else {
|
else {
|
||||||
subst = getDecodedObject(subst);
|
subst = getDecodedObject(subst);
|
||||||
}
|
}
|
||||||
|
|
||||||
spat = pattern->ptr;
|
|
||||||
ssub = subst->ptr;
|
ssub = subst->ptr;
|
||||||
if (sdslen(spat)+sdslen(ssub)-1 > REDIS_SORTKEY_MAX) return NULL;
|
if (sdslen(spat)+sdslen(ssub)-1 > REDIS_SORTKEY_MAX) return NULL;
|
||||||
p = strchr(spat,'*');
|
p = strchr(spat,'*');
|
||||||
|
@ -20,7 +20,7 @@ array set ::redis::multibulkarg {}
|
|||||||
|
|
||||||
# Flag commands requiring last argument as a bulk write operation
|
# Flag commands requiring last argument as a bulk write operation
|
||||||
foreach redis_bulk_cmd {
|
foreach redis_bulk_cmd {
|
||||||
set setnx rpush lpush lset lrem sadd srem sismember echo getset smove zadd zrem zscore rpoplpush
|
set setnx rpush lpush lset lrem sadd srem sismember echo getset smove zadd zrem zscore rpoplpush zincrby
|
||||||
} {
|
} {
|
||||||
set ::redis::bulkarg($redis_bulk_cmd) {}
|
set ::redis::bulkarg($redis_bulk_cmd) {}
|
||||||
}
|
}
|
||||||
|
@ -696,6 +696,15 @@ proc main {server port} {
|
|||||||
$r sort mylist
|
$r sort mylist
|
||||||
} [lsort -real {1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}]
|
} [lsort -real {1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}]
|
||||||
|
|
||||||
|
test {SORT with GET #} {
|
||||||
|
$r del mylist
|
||||||
|
$r lpush mylist 1
|
||||||
|
$r lpush mylist 2
|
||||||
|
$r lpush mylist 3
|
||||||
|
$r mset weight_1 10 weight_2 5 weight_3 30
|
||||||
|
$r sort mylist BY weight_* GET #
|
||||||
|
} {2 1 3}
|
||||||
|
|
||||||
test {LREM, remove all the occurrences} {
|
test {LREM, remove all the occurrences} {
|
||||||
$r flushdb
|
$r flushdb
|
||||||
$r rpush mylist foo
|
$r rpush mylist foo
|
||||||
@ -934,6 +943,23 @@ proc main {server port} {
|
|||||||
format $delta
|
format $delta
|
||||||
} {0}
|
} {0}
|
||||||
|
|
||||||
|
test {ZINCRBY - can create a new sorted set} {
|
||||||
|
$r del zset
|
||||||
|
$r zincrby zset 1 foo
|
||||||
|
list [$r zrange zset 0 -1] [$r zscore zset foo]
|
||||||
|
} {foo 1}
|
||||||
|
|
||||||
|
test {ZINCRBY - increment and decrement} {
|
||||||
|
$r zincrby zset 2 foo
|
||||||
|
$r zincrby zset 1 bar
|
||||||
|
set v1 [$r zrange zset 0 -1]
|
||||||
|
$r zincrby zset 10 bar
|
||||||
|
$r zincrby zset -5 foo
|
||||||
|
$r zincrby zset -5 bar
|
||||||
|
set v2 [$r zrange zset 0 -1]
|
||||||
|
list $v1 $v2 [$r zscore zset foo] [$r zscore zset bar]
|
||||||
|
} {{bar foo} {foo bar} -2 6}
|
||||||
|
|
||||||
test {EXPIRE - don't set timeouts multiple times} {
|
test {EXPIRE - don't set timeouts multiple times} {
|
||||||
$r set x foobar
|
$r set x foobar
|
||||||
set v1 [$r expire x 5]
|
set v1 [$r expire x 5]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user