SORT support for sorted sets

This commit is contained in:
antirez 2009-11-29 10:10:35 +01:00
parent 80181f7848
commit a5eb649bfa

23
redis.c
View File

@ -4805,7 +4805,9 @@ static void sortCommand(redisClient *c) {
addReply(c,shared.nokeyerr); addReply(c,shared.nokeyerr);
return; 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); addReply(c,shared.wrongtypeerr);
return; return;
} }
@ -4858,11 +4860,15 @@ static void sortCommand(redisClient *c) {
} }
/* Load the sorting vector with all the objects to sort */ /* Load the sorting vector with all the objects to sort */
vectorlen = (sortval->type == REDIS_LIST) ? switch(sortval->type) {
listLength((list*)sortval->ptr) : case REDIS_LIST: vectorlen = listLength((list*)sortval->ptr); break;
dictSize((dict*)sortval->ptr); 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); vector = zmalloc(sizeof(redisSortObject)*vectorlen);
j = 0; j = 0;
if (sortval->type == REDIS_LIST) { if (sortval->type == REDIS_LIST) {
list *list = sortval->ptr; list *list = sortval->ptr;
listNode *ln; listNode *ln;
@ -4876,10 +4882,17 @@ static void sortCommand(redisClient *c) {
j++; j++;
} }
} else { } else {
dict *set = sortval->ptr; dict *set;
dictIterator *di; dictIterator *di;
dictEntry *setele; dictEntry *setele;
if (sortval->type == REDIS_SET) {
set = sortval->ptr;
} else {
zset *zs = sortval->ptr;
set = zs->dict;
}
di = dictGetIterator(set); di = dictGetIterator(set);
while((setele = dictNext(di)) != NULL) { while((setele = dictNext(di)) != NULL) {
vector[j].obj = dictGetEntryKey(setele); vector[j].obj = dictGetEntryKey(setele);