From 798d9e55317d67fa694e5408dc30a61e021e8b49 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Sun, 7 Mar 2010 20:35:53 +0100 Subject: [PATCH] added ZREVRANK --- redis.c | 18 ++++++++++++++++-- test-redis.tcl | 4 ++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/redis.c b/redis.c index f213b3b1..c882694d 100644 --- 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; diff --git a/test-redis.tcl b/test-redis.tcl index a6acea18..74b955da 100644 --- a/test-redis.tcl +++ b/test-redis.tcl @@ -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] -- 2.47.2