]> git.saurik.com Git - redis.git/commitdiff
Make SORT use the hybrid set accessors to allow sorting intsets
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Sat, 21 Aug 2010 09:15:31 +0000 (11:15 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Sat, 21 Aug 2010 09:20:41 +0000 (11:20 +0200)
src/sort.c
tests/unit/sort.tcl

index 4295a6ecca4da627725697700c1b79a93636db79..06696cc5312cc08221505dc67f10075e4bfd45d5 100644 (file)
@@ -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);
index 462463517cc8884546e9ac5839d9539f67e556fa..bca0173799d7ea7fbe46210e6eb8da3cb0509d14 100644 (file)
@@ -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]