Commit 4cc1867b authored by Marc Gravell's avatar Marc Gravell

zrevrangebyscore descending : auto-flip limits

parent c70bc5d4
......@@ -6,11 +6,6 @@ namespace StackExchange.Redis.Tests
[TestFixture]
public class Scans : TestBase
{
protected override string GetConfiguration()
{
return "ubuntu";
}
[Test]
[TestCase(true)]
[TestCase(false)]
......@@ -65,6 +60,40 @@ public void SortedSetScan(bool supported)
Assert.AreEqual(1, sDictionary["a"]);
Assert.AreEqual(2, sDictionary["b"]);
Assert.AreEqual(3, sDictionary["c"]);
var basic = db.SortedSetRangeByRankWithScores(key, order: Order.Ascending).ToDictionary();
Assert.AreEqual(3, basic.Count);
Assert.AreEqual(1, basic["a"]);
Assert.AreEqual(2, basic["b"]);
Assert.AreEqual(3, basic["c"]);
basic = db.SortedSetRangeByRankWithScores(key, order: Order.Descending).ToDictionary();
Assert.AreEqual(3, basic.Count);
Assert.AreEqual(1, basic["a"]);
Assert.AreEqual(2, basic["b"]);
Assert.AreEqual(3, basic["c"]);
var basicArr = db.SortedSetRangeByScoreWithScores(key, order: Order.Ascending);
Assert.AreEqual(3, basicArr.Length);
Assert.AreEqual(1, basicArr[0].Score);
Assert.AreEqual(2, basicArr[1].Score);
Assert.AreEqual(3, basicArr[2].Score);
basic = basicArr.ToDictionary();
Assert.AreEqual(3, basic.Count, "asc");
Assert.AreEqual(1, basic["a"]);
Assert.AreEqual(2, basic["b"]);
Assert.AreEqual(3, basic["c"]);
basicArr = db.SortedSetRangeByScoreWithScores(key, order: Order.Descending);
Assert.AreEqual(3, basicArr.Length);
Assert.AreEqual(3, basicArr[0].Score);
Assert.AreEqual(2, basicArr[1].Score);
Assert.AreEqual(1, basicArr[2].Score);
basic = basicArr.ToDictionary();
Assert.AreEqual(3, basic.Count, "desc");
Assert.AreEqual(1, basic["a"]);
Assert.AreEqual(2, basic["b"]);
Assert.AreEqual(3, basic["c"]);
}
}
......@@ -99,6 +128,13 @@ public void HashScan(bool supported)
Assert.AreEqual("1", sDictionary["a"]);
Assert.AreEqual("2", sDictionary["b"]);
Assert.AreEqual("3", sDictionary["c"]);
var basic = db.HashGetAll(key).ToDictionary();
Assert.AreEqual(3, basic.Count);
Assert.AreEqual(1, (long)basic["a"]);
Assert.AreEqual(2, (long)basic["b"]);
Assert.AreEqual(3, (long)basic["c"]);
}
}
......
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
namespace StackExchange.Redis
{
......
......@@ -1625,6 +1625,20 @@ private Message GetSortedSetRangeByScoreMessage(RedisKey key, double start, doub
// there's basically only 4 layouts; with/without each of scores/limit
var command = order == Order.Descending ? RedisCommand.ZREVRANGEBYSCORE : RedisCommand.ZRANGEBYSCORE;
bool unlimited = skip == 0 && take == -1; // these are our defaults that mean "everything"; anything else needs to be sent explicitly
bool reverseLimits = (order == Order.Ascending) == (start > stop);
if (reverseLimits)
{
var tmp = start;
start = stop;
stop = tmp;
switch(exclude)
{
case Exclude.Start: exclude = Exclude.Stop; break;
case Exclude.Stop: exclude = Exclude.Start; break;
}
}
RedisValue from = GetRange(start, exclude, true), to = GetRange(stop, exclude, false);
if (withScores)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment