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() ...@@ -99,7 +99,7 @@ public void ScanResume()
var expected = new HashSet<string>(); var expected = new HashSet<string>();
long snapCursor = 0; long snapCursor = 0;
int snapOffset = 0; int snapOffset = 0, snapPageSize = 0;
i = 0; i = 0;
var seq = server.Keys(DB, pageSize: 15); var seq = server.Keys(DB, pageSize: 15);
...@@ -111,14 +111,41 @@ public void ScanResume() ...@@ -111,14 +111,41 @@ public void ScanResume()
{ {
snapCursor = ((IScanningCursor)seq).Cursor; snapCursor = ((IScanningCursor)seq).Cursor;
snapOffset = ((IScanningCursor)seq).PageOffset; snapOffset = ((IScanningCursor)seq).PageOffset;
snapPageSize = ((IScanningCursor)seq).PageSize;
} }
expected.Add((string)key); expected.Add((string)key);
} }
Assert.AreNotEqual(43, expected.Count); Assert.AreNotEqual(43, expected.Count);
Assert.AreNotEqual(0, snapCursor); Assert.AreNotEqual(0, snapCursor);
Assert.AreEqual(11, snapOffset); Assert.AreEqual(11, snapOffset);
Assert.AreEqual(15, snapPageSize);
seq = server.Keys(DB, pageSize: 15, cursor: snapCursor, pageOffset: snapOffset); 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; int count = 0;
foreach(var key in seq) foreach(var key in seq)
{ {
......
...@@ -164,6 +164,7 @@ internal abstract class CursorEnumerable<T> : IEnumerable<T>, IScanningCursor ...@@ -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) 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.redis = redis;
this.server = server; this.server = server;
this.db = db; this.db = db;
...@@ -281,7 +282,7 @@ public bool MoveNext() ...@@ -281,7 +282,7 @@ public bool MoveNext()
return false; return false;
case State.Initial: case State.Initial:
ProcessReply(parent.GetNextPageSync(this, nextCursor)); ProcessReply(parent.GetNextPageSync(this, nextCursor));
pageIndex = parent.initialOffset - 1; pageIndex = parent.initialOffset - 1; // will be incremented in a moment
state = State.Running; state = State.Running;
LoadNextPageAsync(); LoadNextPageAsync();
goto case State.Running; goto case State.Running;
...@@ -316,7 +317,7 @@ public void Reset() ...@@ -316,7 +317,7 @@ public void Reset()
{ {
if(state == State.Disposed) throw new ObjectDisposedException(GetType().Name); if(state == State.Disposed) throw new ObjectDisposedException(GetType().Name);
nextCursor = currentCursor = parent.initialCursor; 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; state = State.Initial;
page = null; page = null;
pending = null; pending = null;
...@@ -340,7 +341,7 @@ int IScanningCursor.PageOffset ...@@ -340,7 +341,7 @@ int IScanningCursor.PageOffset
long IScanningCursor.Cursor 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 int IScanningCursor.PageSize
...@@ -349,7 +350,7 @@ int IScanningCursor.PageSize ...@@ -349,7 +350,7 @@ int IScanningCursor.PageSize
} }
int IScanningCursor.PageOffset 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