Skip to content

Commit 695d64d

Browse files
authored
Fix mapPage method in PagedIterable for sync stack (Azure#35123)
* Fix mapPage method in PagedIterable for sync stack * address pr comments
1 parent b4e1799 commit 695d64d

File tree

2 files changed

+98
-6
lines changed

2 files changed

+98
-6
lines changed

sdk/core/azure-core/src/main/java/com/azure/core/http/rest/PagedIterable.java

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import com.azure.core.util.IterableStream;
77
import com.azure.core.util.paging.PageRetrieverSync;
88

9+
import java.util.ArrayList;
910
import java.util.function.BiFunction;
1011
import java.util.function.Function;
1112
import java.util.function.Supplier;
13+
import java.util.stream.Collectors;
1214
import java.util.stream.Stream;
1315

1416
/**
@@ -73,6 +75,8 @@
7375
*/
7476
public class PagedIterable<T> extends PagedIterableBase<T, PagedResponse<T>> {
7577
private final PagedFlux<T> pagedFlux;
78+
private final Function<Integer, PagedResponse<T>> firstPageRetriever;
79+
private final BiFunction<String, Integer, PagedResponse<T>> nextPageRetriever;
7680

7781
/**
7882
* Creates instance given {@link PagedFlux}.
@@ -81,6 +85,8 @@ public class PagedIterable<T> extends PagedIterableBase<T, PagedResponse<T>> {
8185
public PagedIterable(PagedFlux<T> pagedFlux) {
8286
super(pagedFlux);
8387
this.pagedFlux = pagedFlux;
88+
this.firstPageRetriever = null;
89+
this.nextPageRetriever = null;
8490
}
8591

8692
/**
@@ -150,7 +156,9 @@ public PagedIterable(Supplier<PagedResponse<T>> firstPageRetriever,
150156
this(() -> (continuationToken, pageSize) ->
151157
continuationToken == null
152158
? firstPageRetriever.get()
153-
: nextPageRetriever.apply(continuationToken), true);
159+
: nextPageRetriever.apply(continuationToken),
160+
pageSize -> firstPageRetriever.get(),
161+
(continuationToken, pageSize) -> nextPageRetriever.apply(continuationToken));
154162
}
155163

156164
/**
@@ -175,7 +183,7 @@ public PagedIterable(Function<Integer, PagedResponse<T>> firstPageRetriever,
175183
BiFunction<String, Integer, PagedResponse<T>> nextPageRetriever) {
176184
this(() -> (continuationToken, pageSize) -> continuationToken == null
177185
? firstPageRetriever.apply(pageSize)
178-
: nextPageRetriever.apply(continuationToken, pageSize), true);
186+
: nextPageRetriever.apply(continuationToken, pageSize), firstPageRetriever, nextPageRetriever);
179187
}
180188

181189
/**
@@ -187,17 +195,51 @@ public PagedIterable(Function<Integer, PagedResponse<T>> firstPageRetriever,
187195
*/
188196
@SuppressWarnings("deprecation")
189197
public <S> PagedIterable<S> mapPage(Function<T, S> mapper) {
190-
return new PagedIterable<>(pagedFlux.mapPage(mapper));
198+
if (pagedFlux != null) {
199+
return new PagedIterable<>(pagedFlux.mapPage(mapper));
200+
}
201+
Function<Integer, PagedResponse<S>> firstMappedPageRetriever = pageSize -> {
202+
PagedResponse<T> firstPageResponse = this.firstPageRetriever.apply(pageSize);
203+
PagedResponse<S> firstMappedPageResponse = mapPagedResponse(firstPageResponse, mapper);
204+
return firstMappedPageResponse;
205+
};
206+
BiFunction<String, Integer, PagedResponse<S>> nextMappedPageRetriever = (continuationToken, pageSize) -> {
207+
PagedResponse<T> nextPageResponse = this.nextPageRetriever.apply(continuationToken, pageSize);
208+
PagedResponse<S> nextMappedPageResponse = mapPagedResponse(nextPageResponse, mapper);
209+
return nextMappedPageResponse;
210+
};
211+
return new PagedIterable<>(firstMappedPageRetriever, nextMappedPageRetriever);
191212
}
192213

193214
/**
194215
* Create PagedIterable backed by Page Retriever Function Supplier.
195216
*
196-
* @param provider the Page Retrieval Provider
197-
* @param ignored param is ignored, exists in signature only to avoid conflict with first ctr
217+
* @param provider the Page Retrieval Provider.
218+
* @param firstPageRetriever first page retriever function to get the first page given the page size.
219+
* @param nextPageRetriever next page retriever function to get the next page given a continuation token and the page size.
198220
*/
199-
private PagedIterable(Supplier<PageRetrieverSync<String, PagedResponse<T>>> provider, boolean ignored) {
221+
private PagedIterable(Supplier<PageRetrieverSync<String, PagedResponse<T>>> provider,
222+
Function<Integer, PagedResponse<T>> firstPageRetriever,
223+
BiFunction<String, Integer, PagedResponse<T>> nextPageRetriever) {
200224
super(provider);
201225
this.pagedFlux = null;
226+
this.firstPageRetriever = firstPageRetriever;
227+
this.nextPageRetriever = nextPageRetriever;
202228
}
229+
230+
private <S> PagedResponse<S> mapPagedResponse(PagedResponse<T> pagedResponse, Function<T, S> mapper) {
231+
if (pagedResponse == null) {
232+
return null;
233+
}
234+
return new PagedResponseBase<String, S>(pagedResponse.getRequest(),
235+
pagedResponse.getStatusCode(),
236+
pagedResponse.getHeaders(),
237+
pagedResponse.getValue()
238+
.stream()
239+
.map(mapper)
240+
.collect(Collectors.toCollection(() -> new ArrayList<>(pagedResponse.getValue().size()))),
241+
pagedResponse.getContinuationToken(),
242+
null);
243+
}
244+
203245
}

sdk/core/azure-core/src/test/java/com/azure/core/http/rest/PagedIterableTest.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,19 @@ public void streamByPageMap(int numberOfPages) {
148148
}
149149
}
150150

151+
@ParameterizedTest
152+
@ValueSource(ints = {0, 1, 2, 3, 4, 5})
153+
public void streamByPageMapSync(int numberOfPages) {
154+
PagedIterable<Integer> integerPagedIterable = getIntegerPagedIterable(numberOfPages);
155+
List<PagedResponse<String>> pages = integerPagedIterable.mapPage(String::valueOf).streamByPage()
156+
.collect(Collectors.toList());
157+
158+
assertEquals(numberOfPages, pages.size());
159+
for (int i = 0; i < numberOfPages; i++) {
160+
assertEquals(pagedStringResponses.get(i).getValue(), pages.get(i).getValue());
161+
}
162+
}
163+
151164
@ParameterizedTest
152165
@ValueSource(ints = {0, 5})
153166
public void iterateByPageMap(int numberOfPages) {
@@ -162,6 +175,20 @@ public void iterateByPageMap(int numberOfPages) {
162175
}
163176
}
164177

178+
@ParameterizedTest
179+
@ValueSource(ints = {0, 1, 2, 3, 4, 5})
180+
public void iterateByPageMapSync(int numberOfPages) {
181+
PagedIterable<Integer> integerPagedIterable = getIntegerPagedIterable(numberOfPages);
182+
183+
List<PagedResponse<String>> pages = new ArrayList<>();
184+
integerPagedIterable.mapPage(String::valueOf).iterableByPage().iterator().forEachRemaining(pages::add);
185+
186+
assertEquals(numberOfPages, pages.size());
187+
for (int i = 0; i < numberOfPages; i++) {
188+
assertEquals(pagedStringResponses.get(i).getValue(), pages.get(i).getValue());
189+
}
190+
}
191+
165192
@ParameterizedTest
166193
@ValueSource(ints = {0, 5})
167194
public void streamByTMap(int numberOfPages) {
@@ -174,6 +201,17 @@ public void streamByTMap(int numberOfPages) {
174201
.collect(Collectors.toList()), values);
175202
}
176203

204+
@ParameterizedTest
205+
@ValueSource(ints = {0, 1, 2, 3, 4, 5})
206+
public void streamByTMapSync(int numberOfPages) {
207+
PagedIterable<Integer> pagedIterable = getIntegerPagedIterable(numberOfPages);
208+
List<String> values = pagedIterable.mapPage(String::valueOf).stream().collect(Collectors.toList());
209+
210+
assertEquals(numberOfPages * 3, values.size());
211+
assertEquals(Stream.iterate(0, i -> i + 1).limit(numberOfPages * 3L).map(String::valueOf)
212+
.collect(Collectors.toList()), values);
213+
}
214+
177215
@ParameterizedTest
178216
@ValueSource(ints = {0, 5})
179217
public void iterateByTMap(int numberOfPages) {
@@ -187,6 +225,18 @@ public void iterateByTMap(int numberOfPages) {
187225
.collect(Collectors.toList()), values);
188226
}
189227

228+
@ParameterizedTest
229+
@ValueSource(ints = {0, 5})
230+
public void iterateByTMapSync(int numberOfPages) {
231+
PagedIterable<Integer> pagedIterable = getIntegerPagedIterable(numberOfPages);
232+
List<String> values = new ArrayList<>();
233+
pagedIterable.mapPage(String::valueOf).iterator().forEachRemaining(values::add);
234+
235+
assertEquals(numberOfPages * 3, values.size());
236+
assertEquals(Stream.iterate(0, i -> i + 1).limit(numberOfPages * 3L).map(String::valueOf)
237+
.collect(Collectors.toList()), values);
238+
}
239+
190240
@Test
191241
public void streamFirstPage() {
192242
TestPagedFlux<Integer> pagedFlux = getTestPagedFlux();

0 commit comments

Comments
 (0)