Commit 6daea121 authored by Marc Gravell's avatar Marc Gravell

Make sure the initial cursor/pageOffset are correct (for both enumerable and...

Make sure the initial cursor/pageOffset are correct (for both enumerable and enumerator) even if not iterated
parent a4fd24e1
......@@ -99,7 +99,7 @@ public void ScanResume()
var expected = new HashSet<string>();
long snapCursor = 0;
int snapOffset = 0;
int snapOffset = 0, snapPageSize = 0;
i = 0;
var seq = server.Keys(DB, pageSize: 15);
......@@ -111,14 +111,41 @@ public void ScanResume()
{
snapCursor = ((IScanningCursor)seq).Cursor;
snapOffset = ((IScanningCursor)seq).PageOffset;
snapPageSize = ((IScanningCursor)seq).PageSize;
}
expected.Add((string)key);
}
Assert.AreNotEqual(43, expected.Count);
Assert.AreNotEqual(0, snapCursor);
Assert.AreEqual(11, snapOffset);
Assert.AreEqual(15, snapPageSize);
seq = server.Keys(DB, pageSize: 15, cursor: snapCursor, pageOffset: snapOffset);
var seqCur = (IScanningCursor)seq;
Assert.AreEqual(snapCursor, seqCur.Cursor);
Assert.AreEqual(snapPageSize, seqCur.PageSize);
Assert.AreEqual(snapOffset, seqCur.PageOffset);
using(var iter = seq.GetEnumerator())
{
var iterCur = (IScanningCursor)iter;
Assert.AreEqual(snapCursor, iterCur.Cursor);
Assert.AreEqual(snapOffset, iterCur.PageOffset);
Assert.AreEqual(snapCursor, seqCur.Cursor);
Assert.AreEqual(snapOffset, seqCur.PageOffset);
Assert.IsTrue(iter.MoveNext());
Assert.AreEqual(snapCursor, iterCur.Cursor);
Assert.AreEqual(snapOffset, iterCur.PageOffset);
Assert.AreEqual(snapCursor, seqCur.Cursor);
Assert.AreEqual(snapOffset, seqCur.PageOffset);
Assert.IsTrue(iter.MoveNext());
Assert.AreEqual(snapCursor, iterCur.Cursor);
Assert.AreEqual(snapOffset + 1, iterCur.PageOffset);
Assert.AreEqual(snapCursor, seqCur.Cursor);
Assert.AreEqual(snapOffset + 1, seqCur.PageOffset);
}
int count = 0;
foreach(var key in seq)
{
......
......@@ -164,6 +164,7 @@ internal abstract class CursorEnumerable<T> : IEnumerable<T>, IScanningCursor
protected CursorEnumerable(RedisBase redis, ServerEndPoint server, int db, int pageSize, long cursor, int pageOffset, CommandFlags flags)
{
if (pageOffset < 0) throw new ArgumentOutOfRangeException("pageOffset");
this.redis = redis;
this.server = server;
this.db = db;
......@@ -281,7 +282,7 @@ public bool MoveNext()
return false;
case State.Initial:
ProcessReply(parent.GetNextPageSync(this, nextCursor));
pageIndex = parent.initialOffset - 1;
pageIndex = parent.initialOffset - 1; // will be incremented in a moment
state = State.Running;
LoadNextPageAsync();
goto case State.Running;
......@@ -316,7 +317,7 @@ public void Reset()
{
if(state == State.Disposed) throw new ObjectDisposedException(GetType().Name);
nextCursor = currentCursor = parent.initialCursor;
pageIndex = parent.initialOffset - 1;
pageIndex = parent.initialOffset; // don't -1 here; this makes it look "right" before incremented
state = State.Initial;
page = null;
pending = null;
......@@ -340,7 +341,7 @@ int IScanningCursor.PageOffset
long IScanningCursor.Cursor
{
get { var tmp = activeCursor; return tmp == null ? CursorUtils.Origin : tmp.Cursor; }
get { var tmp = activeCursor; return tmp == null ? initialCursor : tmp.Cursor; }
}
int IScanningCursor.PageSize
......@@ -349,7 +350,7 @@ int IScanningCursor.PageSize
}
int IScanningCursor.PageOffset
{
get { var tmp = activeCursor; return tmp == null ? 0 : tmp.PageOffset; }
get { var tmp = activeCursor; return tmp == null ? initialOffset : tmp.PageOffset; }
}
}
}
......
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