mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 17:10:50 +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 */
|
/* 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);
|
||||||
|
@ -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]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user