From a5eb649bfad4b66168feddb6729b75e266b04f44 Mon Sep 17 00:00:00 2001 From: antirez Date: Sun, 29 Nov 2009 10:10:35 +0100 Subject: [PATCH] SORT support for sorted sets --- redis.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/redis.c b/redis.c index bff40cec..65571f32 100644 --- a/redis.c +++ b/redis.c @@ -4805,7 +4805,9 @@ static void sortCommand(redisClient *c) { addReply(c,shared.nokeyerr); return; } - if (sortval->type != REDIS_SET && sortval->type != REDIS_LIST) { + if (sortval->type != REDIS_SET && sortval->type != REDIS_LIST && + sortval->type != REDIS_ZSET) + { addReply(c,shared.wrongtypeerr); return; } @@ -4858,11 +4860,15 @@ static void sortCommand(redisClient *c) { } /* Load the sorting vector with all the objects to sort */ - vectorlen = (sortval->type == REDIS_LIST) ? - listLength((list*)sortval->ptr) : - dictSize((dict*)sortval->ptr); + switch(sortval->type) { + case REDIS_LIST: vectorlen = listLength((list*)sortval->ptr); break; + case REDIS_SET: vectorlen = dictSize((dict*)sortval->ptr); break; + case REDIS_ZSET: vectorlen = dictSize(((zset*)sortval->ptr)->dict); break; + default: vectorlen = 0; assert(0); /* Avoid GCC warning */ + } vector = zmalloc(sizeof(redisSortObject)*vectorlen); j = 0; + if (sortval->type == REDIS_LIST) { list *list = sortval->ptr; listNode *ln; @@ -4876,10 +4882,17 @@ static void sortCommand(redisClient *c) { j++; } } else { - dict *set = sortval->ptr; + dict *set; dictIterator *di; dictEntry *setele; + if (sortval->type == REDIS_SET) { + set = sortval->ptr; + } else { + zset *zs = sortval->ptr; + set = zs->dict; + } + di = dictGetIterator(set); while((setele = dictNext(di)) != NULL) { vector[j].obj = dictGetEntryKey(setele);