Make SORT use the hybrid set accessors to allow sorting intsets

This commit is contained in:
Pieter Noordhuis 2010-08-21 11:15:31 +02:00
parent 2b9a59471f
commit 029e5577ff
2 changed files with 17 additions and 12 deletions

View File

@ -202,7 +202,7 @@ void sortCommand(redisClient *c) {
/* Load the sorting vector with all the objects to sort */ /* Load the sorting vector with all the objects to sort */
switch(sortval->type) { switch(sortval->type) {
case REDIS_LIST: vectorlen = listTypeLength(sortval); break; 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; case REDIS_ZSET: vectorlen = dictSize(((zset*)sortval->ptr)->dict); break;
default: vectorlen = 0; redisPanic("Bad SORT type"); /* Avoid GCC warning */ default: vectorlen = 0; redisPanic("Bad SORT type"); /* Avoid GCC warning */
} }
@ -219,18 +219,20 @@ void sortCommand(redisClient *c) {
j++; j++;
} }
listTypeReleaseIterator(li); listTypeReleaseIterator(li);
} else { } else if (sortval->type == REDIS_SET) {
dict *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; 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);
@ -239,6 +241,8 @@ void sortCommand(redisClient *c) {
j++; j++;
} }
dictReleaseIterator(di); dictReleaseIterator(di);
} else {
redisPanic("Unknown type");
} }
redisAssert(j == vectorlen); redisAssert(j == vectorlen);
@ -369,7 +373,7 @@ void sortCommand(redisClient *c) {
} }
/* Cleanup */ /* Cleanup */
if (sortval->type == REDIS_LIST) if (sortval->type == REDIS_LIST || sortval->type == REDIS_SET)
for (j = 0; j < vectorlen; j++) for (j = 0; j < vectorlen; j++)
decrRefCount(vector[j].obj); decrRefCount(vector[j].obj);
decrRefCount(sortval); decrRefCount(sortval);

View File

@ -38,6 +38,7 @@ start_server {
foreach {num cmd enc title} { foreach {num cmd enc title} {
16 lpush ziplist "Ziplist" 16 lpush ziplist "Ziplist"
64 lpush linkedlist "Linked list" 64 lpush linkedlist "Linked list"
16 sadd intset "Intset"
64 sadd hashtable "Hash table" 64 sadd hashtable "Hash table"
} { } {
set result [create_random_dataset $num $cmd] set result [create_random_dataset $num $cmd]