Skip to content

Commit ba60ca6

Browse files
authored
Add multi page support for Pageable.FromPages method Azure#22705 (Azure#22706)
1 parent d7a95ca commit ba60ca6

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

sdk/core/Azure.Core/src/AsyncPageable.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public static AsyncPageable<T> FromPages(IEnumerable<Page<T>> pages)
145145
[EditorBrowsable(EditorBrowsableState.Never)]
146146
public override int GetHashCode() => base.GetHashCode();
147147

148-
private class StaticPageable: AsyncPageable<T>
148+
private class StaticPageable : AsyncPageable<T>
149149
{
150150
private readonly IEnumerable<Page<T>> _pages;
151151

@@ -158,9 +158,21 @@ public StaticPageable(IEnumerable<Page<T>> pages)
158158
public override async IAsyncEnumerable<Page<T>> AsPages(string? continuationToken = default, int? pageSizeHint = default)
159159
#pragma warning restore 1998
160160
{
161+
var shouldReturnPages = continuationToken == null;
162+
161163
foreach (var page in _pages)
162164
{
163-
yield return page;
165+
if (shouldReturnPages)
166+
{
167+
yield return page;
168+
}
169+
else
170+
{
171+
if (continuationToken == page.ContinuationToken)
172+
{
173+
shouldReturnPages = true;
174+
}
175+
}
164176
}
165177
}
166178
}

sdk/core/Azure.Core/src/Pageable.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public static Pageable<T> FromPages(IEnumerable<Page<T>> pages)
115115
[EditorBrowsable(EditorBrowsableState.Never)]
116116
public override int GetHashCode() => base.GetHashCode();
117117

118-
private class StaticPageable: Pageable<T>
118+
private class StaticPageable : Pageable<T>
119119
{
120120
private readonly IEnumerable<Page<T>> _pages;
121121

@@ -126,7 +126,22 @@ public StaticPageable(IEnumerable<Page<T>> pages)
126126

127127
public override IEnumerable<Page<T>> AsPages(string? continuationToken = default, int? pageSizeHint = default)
128128
{
129-
return _pages;
129+
var shouldReturnPages = continuationToken == null;
130+
131+
foreach (var page in _pages)
132+
{
133+
if (shouldReturnPages)
134+
{
135+
yield return page;
136+
}
137+
else
138+
{
139+
if (continuationToken == page.ContinuationToken)
140+
{
141+
shouldReturnPages = true;
142+
}
143+
}
144+
}
130145
}
131146
}
132147
}

sdk/core/Azure.Core/tests/PageableTests.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,49 @@ public async Task CanCreateAsyncPageableFromPages()
3333

3434
Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, await pageable.ToEnumerableAsync());
3535
}
36+
37+
[Test]
38+
public void CanCreatePageableFromPage_MultiplePage()
39+
{
40+
var pageable = Pageable<byte>.FromPages(new[]
41+
{
42+
Page<byte>.FromValues(new byte[] {1, 2}, "X", null),
43+
Page<byte>.FromValues(new byte[] {3, 4}, null, null)
44+
});
45+
46+
var pages = pageable.AsPages(continuationToken: null);
47+
var page = pages.First();
48+
49+
Assert.AreEqual(new byte[] { 1, 2 }, page.Values);
50+
Assert.AreEqual("X", page.ContinuationToken);
51+
52+
pages = pageable.AsPages(continuationToken: "X");
53+
page = pages.First();
54+
55+
Assert.AreEqual(new byte[] { 3, 4 }, page.Values);
56+
Assert.Null(page.ContinuationToken);
57+
}
58+
59+
[Test]
60+
public async Task CanCreateAsyncPageableFromPage_MultiplePage()
61+
{
62+
var pageable = AsyncPageable<byte>.FromPages(new[]
63+
{
64+
Page<byte>.FromValues(new byte[] {1, 2}, "X", null),
65+
Page<byte>.FromValues(new byte[] {3, 4}, null, null)
66+
});
67+
68+
var pages = pageable.AsPages(continuationToken: null);
69+
var page = await pages.FirstAsync();
70+
71+
Assert.AreEqual(new byte[] { 1, 2 }, page.Values);
72+
Assert.AreEqual("X", page.ContinuationToken);
73+
74+
pages = pageable.AsPages(continuationToken: "X");
75+
page = await pages.FirstAsync();
76+
77+
Assert.AreEqual(new byte[] { 3, 4 }, page.Values);
78+
Assert.Null(page.ContinuationToken);
79+
}
3680
}
37-
}
81+
}

0 commit comments

Comments
 (0)