summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/module.c20
-rw-r--r--src/server.h4
-rw-r--r--src/t_zset.c12
3 files changed, 30 insertions, 6 deletions
diff --git a/src/module.c b/src/module.c
index e63df49dc..039bba227 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 c614228a3..1e0a027e1 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 c1b1598ee..86aa5510d 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);