]> git.saurik.com Git - redis.git/commitdiff
added ZREVRANK
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Sun, 7 Mar 2010 19:35:53 +0000 (20:35 +0100)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Sun, 7 Mar 2010 19:35:53 +0000 (20:35 +0100)
redis.c
test-redis.tcl

diff --git a/redis.c b/redis.c
index f213b3b1fdc2dbdcdf84308b34ffddbde8c94e94..c882694dd34d27481c921b1e48cca488c73560b2 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -666,6 +666,7 @@ static void brpopCommand(redisClient *c);
 static void appendCommand(redisClient *c);
 static void substrCommand(redisClient *c);
 static void zrankCommand(redisClient *c);
+static void zrevrankCommand(redisClient *c);
 static void hsetCommand(redisClient *c);
 static void hgetCommand(redisClient *c);
 
@@ -722,6 +723,7 @@ static struct redisCommand cmdTable[] = {
     {"zcard",zcardCommand,2,REDIS_CMD_INLINE,1,1,1},
     {"zscore",zscoreCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,1,1,1},
     {"zrank",zrankCommand,3,REDIS_CMD_INLINE,1,1,1},
+    {"zrevrank",zrevrankCommand,3,REDIS_CMD_INLINE,1,1,1},
     {"hset",hsetCommand,4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,1,1,1},
     {"hget",hgetCommand,3,REDIS_CMD_BULK,1,1,1},
     {"incrby",incrbyCommand,3,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM,1,1,1},
@@ -5546,7 +5548,7 @@ static void zscoreCommand(redisClient *c) {
     }
 }
 
-static void zrankCommand(redisClient *c) {
+static void zrankGenericCommand(redisClient *c, int reverse) {
     robj *o;
     o = lookupKeyRead(c->db,c->argv[1]);
     if (o == NULL) {
@@ -5570,13 +5572,25 @@ static void zrankCommand(redisClient *c) {
         double *score = dictGetEntryVal(de);
         rank = zslGetRank(zsl, *score, c->argv[2]);
         if (rank) {
-            addReplyLong(c, rank-1);
+            if (reverse) {
+                addReplyLong(c, zsl->length - rank);
+            } else {
+                addReplyLong(c, rank-1);
+            }
         } else {
             addReply(c,shared.nullbulk);
         }
     }
 }
 
+static void zrankCommand(redisClient *c) {
+    zrankGenericCommand(c, 0);
+}
+
+static void zrevrankCommand(redisClient *c) {
+    zrankGenericCommand(c, 1);
+}
+
 /* ==================================== Hash ================================ */
 static void hsetCommand(redisClient *c) {
     int update = 0;
index a6acea18a2c8204b5296a518c7f8368026689f67..74b955da3fd602206ef1c6e62c05dea28021e5b8 100644 (file)
@@ -1204,6 +1204,10 @@ proc main {server port} {
         list [$r zrank zranktmp x] [$r zrank zranktmp y] [$r zrank zranktmp z]
     } {0 1 2}
 
+    test {ZREVRANK basics} {
+        list [$r zrevrank zranktmp x] [$r zrevrank zranktmp y] [$r zrevrank zranktmp z]
+    } {2 1 0}
+
     test {ZRANK - after deletion} {
         $r zrem zranktmp y
         list [$r zrank zranktmp x] [$r zrank zranktmp z]