Added "withscores" option to zrangebyscore command. Based on withscores support in...
authorSam Hendley <sam.hendley@gmail.com>
Sat, 6 Feb 2010 23:41:25 +0000 (18:41 -0500)
committerSam Hendley <sam.hendley@gmail.com>
Sat, 6 Feb 2010 23:41:25 +0000 (18:41 -0500)
using it with the limit option.

redis.c
test-redis.tcl

diff --git a/redis.c b/redis.c
index 5da103d8773c35d44c2d4c32d41e1e6066d07a4d..f60569deb9e1d2e6a720aa2c4ba36553c11412ce 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -5197,15 +5197,29 @@ static void zrangebyscoreCommand(redisClient *c) {
     double min = strtod(c->argv[2]->ptr,NULL);
     double max = strtod(c->argv[3]->ptr,NULL);
     int offset = 0, limit = -1;
+    int withscores = 0;
+    int badsyntax = 0;
+
+    if (c->argc == 5 || c->argc == 8) {
+        if (strcasecmp(c->argv[c->argc-1]->ptr,"withscores") == 0) withscores = 1;
+        else badsyntax = 1;
+    }
+
+    if (c->argc != (4 + withscores) && c->argc != (7 + withscores)) {
+        badsyntax = 1;
+    }
 
-    if (c->argc != 4 && c->argc != 7) {
+
+    if (badsyntax) {
         addReplySds(c,
             sdsnew("-ERR wrong number of arguments for ZRANGEBYSCORE\r\n"));
         return;
-    } else if (c->argc == 7 && strcasecmp(c->argv[4]->ptr,"limit")) {
+    }
+
+    if (c->argc == (7 + withscores) && strcasecmp(c->argv[4]->ptr,"limit")) {
         addReply(c,shared.syntaxerr);
         return;
-    } else if (c->argc == 7) {
+    } else if (c->argc == (7 + withscores)) {
         offset = atoi(c->argv[5]->ptr);
         limit = atoi(c->argv[6]->ptr);
         if (offset < 0) offset = 0;
@@ -5251,11 +5265,14 @@ static void zrangebyscoreCommand(redisClient *c) {
                 addReplyBulkLen(c,ele);
                 addReply(c,ele);
                 addReply(c,shared.crlf);
+                if (withscores)
+                    addReplyDouble(c,ln->score);
                 ln = ln->forward[0];
                 rangelen++;
                 if (limit > 0) limit--;
             }
-            lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n",rangelen);
+            lenobj->ptr = sdscatprintf(sdsempty(),"*%d\r\n",
+                withscores ? (rangelen*2) : rangelen);
         }
     }
 }
index 14a1256e0ff8380bd161d99720cd0cd2349ee93d..dde6f6286e6c7b3911217fc512dc4199d4892ca2 100644 (file)
@@ -1310,6 +1310,16 @@ proc main {server port} {
         $r zrangebyscore zset 2 4
     } {b c d}
 
+    test {ZRANGEBYSCORE withscores} {
+        $r del zset
+        $r zadd zset 1 a
+        $r zadd zset 2 b
+        $r zadd zset 3 c
+        $r zadd zset 4 d
+        $r zadd zset 5 e
+        $r zrangebyscore zset 2 4 withscores
+    } {b 2 c 3 d 4}
+
     test {ZRANGEBYSCORE fuzzy test, 100 ranges in 1000 elements sorted set} {
         set err {}
         $r del zset
@@ -1363,6 +1373,16 @@ proc main {server port} {
             [$r zrangebyscore zset 0 10 LIMIT 20 10]
     } {{a b} {c d e} {c d e} {}}
 
+    test {ZRANGEBYSCORE with LIMIT and withscores} {
+        $r del zset
+        $r zadd zset 10 a
+        $r zadd zset 20 b
+        $r zadd zset 30 c
+        $r zadd zset 40 d
+        $r zadd zset 50 e
+        $r zrangebyscore zset 20 50 LIMIT 2 3 withscores
+    } {d 40 e 50}
+
     test {ZREMRANGE basics} {
         $r del zset
         $r zadd zset 1 a