Commit 029e5577 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

Make SORT use the hybrid set accessors to allow sorting intsets

parent 2b9a5947
...@@ -202,7 +202,7 @@ void sortCommand(redisClient *c) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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);
......
...@@ -38,6 +38,7 @@ start_server { ...@@ -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]
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment