From 029e5577ff01c13d8ddfdf9c6749ac33c9bd9e9f Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Sat, 21 Aug 2010 11:15:31 +0200 Subject: [PATCH] Make SORT use the hybrid set accessors to allow sorting intsets --- src/sort.c | 28 ++++++++++++++++------------ tests/unit/sort.tcl | 1 + 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/sort.c b/src/sort.c index 4295a6ec..06696cc5 100644 --- a/src/sort.c +++ b/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); diff --git a/tests/unit/sort.tcl b/tests/unit/sort.tcl index 46246351..bca01737 100644 --- a/tests/unit/sort.tcl +++ b/tests/unit/sort.tcl @@ -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] -- 2.47.2