]> git.saurik.com Git - redis.git/commitdiff
Partial qsort implemented in SORT command, only when both BY and LIMIT is used. minor...
authorantirez <antirez@gmail.com>
Tue, 19 May 2009 16:39:58 +0000 (18:39 +0200)
committerantirez <antirez@gmail.com>
Tue, 19 May 2009 16:39:58 +0000 (18:39 +0200)
Makefile
benchmark.c
pqsort.h
redis.c

index 8a397bddc5d4bd5b14902fde2436a43fac569816..00c0f226c69c33f08487307712b36659b626b314 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ DEBUG?= -g
 CFLAGS?= -std=c99 -pedantic -O2 -Wall -W -DSDS_ABORT_ON_OOM
 CCOPT= $(CFLAGS)
 
-OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o
+OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o
 BENCHOBJ = ae.o anet.o benchmark.o sds.o adlist.o zmalloc.o
 CLIOBJ = anet.o sds.o adlist.o redis-cli.o zmalloc.o
 
index b550196c8cea211353bcbff9f5fd35570ff98c04..7d4c844d5218a82742ff272c74686d50f7f583f6 100644 (file)
@@ -28,6 +28,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "fmacros.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
index 10b81147ab33d8796d83ed1788f0830c9e57937e..fc437c257a2bd0f5d70ccd31fd65840572b89615 100644 (file)
--- a/pqsort.h
+++ b/pqsort.h
@@ -10,6 +10,6 @@
 
 void
 pqsort(void *a, size_t n, size_t es,
-    int (*cmp) __P((const void *, const void *)), size_t lrange, size_t rrange)
+    int (*cmp) __P((const void *, const void *)), size_t lrange, size_t rrange);
 
 #endif
diff --git a/redis.c b/redis.c
index 6be82b4b008a7e1e30b2f263b5f6ef70e224cc4e..12d211ab50e23ae8922b02a7a0d20d22e5c2fea2 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -56,7 +56,8 @@
 #include "dict.h"   /* Hash tables */
 #include "adlist.h" /* Linked lists */
 #include "zmalloc.h" /* total memory usage aware version of malloc/free */
-#include "lzf.h"
+#include "lzf.h"    /* LZF compression library */
+#include "pqsort.h" /* Partial qsort for SORT+LIMIT */
 
 /* Error codes */
 #define REDIS_OK                0
@@ -3426,7 +3427,10 @@ static void sortCommand(redisClient *c) {
         server.sort_desc = desc;
         server.sort_alpha = alpha;
         server.sort_bypattern = sortby ? 1 : 0;
-        qsort(vector,vectorlen,sizeof(redisSortObject),sortCompare);
+        if (sortby && (start != 0 || end != vectorlen-1))
+            pqsort(vector,vectorlen,sizeof(redisSortObject),sortCompare, start,end);
+        else
+            qsort(vector,vectorlen,sizeof(redisSortObject),sortCompare);
     }
 
     /* Send command output to the output buffer, performing the specified