From 5f5b9840c3d3f2ba6dd2f8c4d177f2bfac6f0d32 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 19 May 2009 18:39:58 +0200 Subject: [PATCH] Partial qsort implemented in SORT command, only when both BY and LIMIT is used. minor fix for a warning compiling under Linux. --- Makefile | 2 +- benchmark.c | 2 ++ pqsort.h | 2 +- redis.c | 8 ++++++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 8a397bddc..00c0f226c 100644 --- 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 diff --git a/benchmark.c b/benchmark.c index b550196c8..7d4c844d5 100644 --- a/benchmark.c +++ b/benchmark.c @@ -28,6 +28,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "fmacros.h" + #include #include #include diff --git a/pqsort.h b/pqsort.h index 10b81147a..fc437c257 100644 --- 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 6be82b4b0..12d211ab5 100644 --- 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