mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
Make SORT use the hybrid set accessors to allow sorting intsets
This commit is contained in:
parent
2b9a59471f
commit
029e5577ff
28
src/sort.c
28
src/sort.c
@ -202,7 +202,7 @@ void sortCommand(redisClient *c) {
|
||||
/* Load the sorting vector with all the objects to sort */
|
||||
switch(sortval->type) {
|
||||
case REDIS_LIST: vectorlen = listTypeLength(sortval); break;
|
||||
case REDIS_SET: vectorlen = dictSize((dict*)sortval->ptr); break;
|
||||
case REDIS_SET: vectorlen = setTypeSize(sortval); break;
|
||||
case REDIS_ZSET: vectorlen = dictSize(((zset*)sortval->ptr)->dict); break;
|
||||
default: vectorlen = 0; redisPanic("Bad SORT type"); /* Avoid GCC warning */
|
||||
}
|
||||
@ -219,18 +219,20 @@ void sortCommand(redisClient *c) {
|
||||
j++;
|
||||
}
|
||||
listTypeReleaseIterator(li);
|
||||
} else {
|
||||
dict *set;
|
||||
} else if (sortval->type == REDIS_SET) {
|
||||
setIterator *si = setTypeInitIterator(sortval);
|
||||
robj *ele;
|
||||
while((ele = setTypeNext(si)) != NULL) {
|
||||
vector[j].obj = ele;
|
||||
vector[j].u.score = 0;
|
||||
vector[j].u.cmpobj = NULL;
|
||||
j++;
|
||||
}
|
||||
setTypeReleaseIterator(si);
|
||||
} else if (sortval->type == REDIS_ZSET) {
|
||||
dict *set = ((zset*)sortval->ptr)->dict;
|
||||
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);
|
||||
@ -239,6 +241,8 @@ void sortCommand(redisClient *c) {
|
||||
j++;
|
||||
}
|
||||
dictReleaseIterator(di);
|
||||
} else {
|
||||
redisPanic("Unknown type");
|
||||
}
|
||||
redisAssert(j == vectorlen);
|
||||
|
||||
@ -369,7 +373,7 @@ void sortCommand(redisClient *c) {
|
||||
}
|
||||
|
||||
/* Cleanup */
|
||||
if (sortval->type == REDIS_LIST)
|
||||
if (sortval->type == REDIS_LIST || sortval->type == REDIS_SET)
|
||||
for (j = 0; j < vectorlen; j++)
|
||||
decrRefCount(vector[j].obj);
|
||||
decrRefCount(sortval);
|
||||
|
@ -38,6 +38,7 @@ start_server {
|
||||
foreach {num cmd enc title} {
|
||||
16 lpush ziplist "Ziplist"
|
||||
64 lpush linkedlist "Linked list"
|
||||
16 sadd intset "Intset"
|
||||
64 sadd hashtable "Hash table"
|
||||
} {
|
||||
set result [create_random_dataset $num $cmd]
|
||||
|
Loading…
x
Reference in New Issue
Block a user