mirror of
https://github.com/fluencelabs/redis
synced 2025-04-10 03:06:05 +00:00
SORT support for sorted sets
This commit is contained in:
parent
80181f7848
commit
a5eb649bfa
23
redis.c
23
redis.c
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user