diff --git a/src/module.c b/src/module.c index e63df49d..039bba22 100644 --- a/src/module.c +++ b/src/module.c @@ -1286,6 +1286,11 @@ int RM_ZsetRangeNext(RedisModuleKey *key) { return 0; } next = saved_next; + } else if (key->ztype == REDISMODULE_ZSET_RANGE_SCORE) { + if (!zzlLexValueLteMax(next,&key->zlrs)) { + key->zer = 1; + return 0; + } } key->zcurrent = next; return 1; @@ -1302,6 +1307,11 @@ int RM_ZsetRangeNext(RedisModuleKey *key) { { key->zer = 1; return 0; + } else if (key->ztype == REDISMODULE_ZSET_RANGE_SCORE) { + if (!zslLexValueLteMax(ln->ele,&key->zlrs)) { + key->zer = 1; + return 0; + } } key->zcurrent = next; return 1; @@ -1339,6 +1349,11 @@ int RM_ZsetRangePrev(RedisModuleKey *key) { return 0; } prev = saved_prev; + } else if (key->ztype == REDISMODULE_ZSET_RANGE_SCORE) { + if (!zzlLexValueGteMin(prev,&key->zlrs)) { + key->zer = 1; + return 0; + } } key->zcurrent = prev; return 1; @@ -1355,6 +1370,11 @@ int RM_ZsetRangePrev(RedisModuleKey *key) { { key->zer = 1; return 0; + } else if (key->ztype == REDISMODULE_ZSET_RANGE_SCORE) { + if (!zslLexValueGteMin(prev->ele,&key->zlrs)) { + key->zer = 1; + return 0; + } } key->zcurrent = prev; return 1; diff --git a/src/server.h b/src/server.h index c614228a..1e0a027e 100644 --- a/src/server.h +++ b/src/server.h @@ -1353,6 +1353,10 @@ unsigned char *zzlFirstInLexRange(unsigned char *zl, zlexrangespec *range); unsigned char *zzlLastInLexRange(unsigned char *zl, zlexrangespec *range); zskiplistNode *zslFirstInLexRange(zskiplist *zsl, zlexrangespec *range); zskiplistNode *zslLastInLexRange(zskiplist *zsl, zlexrangespec *range); +int zzlLexValueGteMin(unsigned char *p, zlexrangespec *spec); +int zzlLexValueLteMax(unsigned char *p, zlexrangespec *spec); +int zslLexValueGteMin(sds value, zlexrangespec *spec); +int zslLexValueLteMax(sds value, zlexrangespec *spec); /* Core functions */ int freeMemoryIfNeeded(void); diff --git a/src/t_zset.c b/src/t_zset.c index c1b1598e..86aa5510 100644 --- a/src/t_zset.c +++ b/src/t_zset.c @@ -63,8 +63,8 @@ * Skiplist implementation of the low level API *----------------------------------------------------------------------------*/ -static int zslLexValueGteMin(sds value, zlexrangespec *spec); -static int zslLexValueLteMax(sds value, zlexrangespec *spec); +int zslLexValueGteMin(sds value, zlexrangespec *spec); +int zslLexValueLteMax(sds value, zlexrangespec *spec); /* Create a skiplist node with the specified number of levels. * The SDS string 'ele' is referenced by the node after the call. */ @@ -580,13 +580,13 @@ int sdscmplex(sds a, sds b) { return sdscmp(a,b); } -static int zslLexValueGteMin(sds value, zlexrangespec *spec) { +int zslLexValueGteMin(sds value, zlexrangespec *spec) { return spec->minex ? (sdscmplex(value,spec->min) > 0) : (sdscmplex(value,spec->min) >= 0); } -static int zslLexValueLteMax(sds value, zlexrangespec *spec) { +int zslLexValueLteMax(sds value, zlexrangespec *spec) { return spec->maxex ? (sdscmplex(value,spec->max) < 0) : (sdscmplex(value,spec->max) <= 0); @@ -852,14 +852,14 @@ unsigned char *zzlLastInRange(unsigned char *zl, zrangespec *range) { return NULL; } -static int zzlLexValueGteMin(unsigned char *p, zlexrangespec *spec) { +int zzlLexValueGteMin(unsigned char *p, zlexrangespec *spec) { sds value = ziplistGetObject(p); int res = zslLexValueGteMin(value,spec); sdsfree(value); return res; } -static int zzlLexValueLteMax(unsigned char *p, zlexrangespec *spec) { +int zzlLexValueLteMax(unsigned char *p, zlexrangespec *spec) { sds value = ziplistGetObject(p); int res = zslLexValueLteMax(value,spec); sdsfree(value);