]> git.saurik.com Git - redis.git/commitdiff
SORT GET # implemented, with a test
authorantirez <antirez@gmail.com>
Sat, 21 Nov 2009 12:25:51 +0000 (13:25 +0100)
committerantirez <antirez@gmail.com>
Sat, 21 Nov 2009 12:25:51 +0000 (13:25 +0100)
TODO
redis.c
redis.tcl
test-redis.tcl

diff --git a/TODO b/TODO
index 27102e016a0671eef2a721bf2cda2b64dfbc7855..c3175783db99c866d98cbc892983dbb2b04bf3de 100644 (file)
--- a/TODO
+++ b/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".
 * Man pages for MSET MSETNX and SRANDMEMBER, Z-commands, ...
 * Use strcoll() to compare objects in sorted sets, like it already happens for SORT.
 * 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, ...
 * 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.
 * Append only mode: testing and a command to rebuild the log from scratch.
 * Write docs for the "STORE" operaiton of SORT, and GET "#" option.
 * 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
 
diff --git a/redis.c b/redis.c
index f3968b81ca1616cedc644f0226082ea87f91c4c5..bbb461179042a08de02b6723da28331b580dc175 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -4577,13 +4577,24 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
         char buf[REDIS_SORTKEY_MAX+1];
     } keyname;
 
         char buf[REDIS_SORTKEY_MAX+1];
     } 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);
     else {
         subst = getDecodedObject(subst);
     }
 
         incrRefCount(subst);
     else {
         subst = getDecodedObject(subst);
     }
 
-    spat = pattern->ptr;
     ssub = subst->ptr;
     if (sdslen(spat)+sdslen(ssub)-1 > REDIS_SORTKEY_MAX) return NULL;
     p = strchr(spat,'*');
     ssub = subst->ptr;
     if (sdslen(spat)+sdslen(ssub)-1 > REDIS_SORTKEY_MAX) return NULL;
     p = strchr(spat,'*');
index 3407d5d1443efc547a32a2d6e50144d90939aa60..8ad96f450ec85d6b1207b900310b21d49830c988 100644 (file)
--- a/redis.tcl
+++ b/redis.tcl
@@ -20,7 +20,7 @@ array set ::redis::multibulkarg {}
 
 # Flag commands requiring last argument as a bulk write operation
 foreach redis_bulk_cmd {
 
 # Flag commands requiring last argument as a bulk write operation
 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) {}
 }
index a7b40cd3677834ef1f68179a78ef4465bb141264..10b1acd22acf5bceab52ee6d91c2eea46beceafd 100644 (file)
@@ -696,6 +696,15 @@ proc main {server port} {
         $r sort mylist
     } [lsort -real {1.1 5.10 3.10 7.44 2.1 5.75 6.12 0.25 1.15}]
 
         $r sort mylist
     } [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} {
         $r flushdb
         $r rpush mylist foo
     test {LREM, remove all the occurrences} {
         $r flushdb
         $r rpush mylist foo
@@ -934,6 +943,23 @@ proc main {server port} {
         format $delta
     } {0}
 
         format $delta
     } {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} {
         $r set x foobar
         set v1 [$r expire x 5]
     test {EXPIRE - don't set timeouts multiple times} {
         $r set x foobar
         set v1 [$r expire x 5]