Skip to content

Commit e3565a2

Browse files
Bohdan Kurylovychborzun
authored andcommitted
Implemented the PrefetchTiles with CancellableFuture in versioned client
- Implemented the PrefetchTiles method which returns CancellableFuture in the dataservice-read VersionedLayerClient class. - aligned the API of PrefetchTiles methods with other methods; - used the move semantics for the PrefetchTiles responses; Relates to: OLPEDGE-958 Signed-off-by: Bohdan Kurylovych <[email protected]>
1 parent 7dec51e commit e3565a2

File tree

6 files changed

+169
-11
lines changed

6 files changed

+169
-11
lines changed

olp-cpp-sdk-dataservice-read/include/olp/dataservice/read/VersionedLayerClient.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,28 @@ class DATASERVICE_READ_API VersionedLayerClient final {
126126
* @return A token that can be used to cancel this request.
127127
*/
128128
client::CancellationToken PrefetchTiles(
129-
PrefetchTilesRequest request, PrefetchTilesResponseCallback callback);
129+
PrefetchTilesRequest request,
130+
PrefetchTilesResponseCallback callback) const;
131+
132+
/**
133+
* @brief Pre-fetches a set of tiles asychronously.
134+
*
135+
* This method recursively downloads all tilekeys from minLevel to maxLevel
136+
* specified in the \c PrefetchTilesRequest's properties. This will help to
137+
* reduce the network load by using the pre-fetched tiles' data from cache.
138+
*
139+
* \note - this does not guarantee that all tiles are available offline, as
140+
* the cache might overflow and data might be evicted at any point.
141+
*
142+
* @param request contains the complete set of request parameters.
143+
* \note The \c PrefetchTilesRequest's GetLayerId value will be ignored and
144+
* the parameter from constructore will be used instead.
145+
* @return CancellableFuture of type \c PrefetchTilesResponse, which when
146+
* complete will contain the data or an error. Alternatively, the
147+
* \c CancellableFuture can be used to cancel this request.
148+
*/
149+
client::CancellableFuture<PrefetchTilesResponse> PrefetchTiles(
150+
PrefetchTilesRequest request) const;
130151

131152
private:
132153
std::unique_ptr<VersionedLayerClientImpl> impl_;

olp-cpp-sdk-dataservice-read/src/VersionedLayerClient.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,16 @@ client::CancellationToken VersionedLayerClient::GetPartitions(
4646
}
4747

4848
client::CancellationToken VersionedLayerClient::PrefetchTiles(
49-
PrefetchTilesRequest request, PrefetchTilesResponseCallback callback) {
49+
PrefetchTilesRequest request,
50+
PrefetchTilesResponseCallback callback) const {
5051
return impl_->PrefetchTiles(std::move(request), std::move(callback));
5152
}
5253

54+
client::CancellableFuture<VersionedLayerClient::PrefetchTilesResponse>
55+
VersionedLayerClient::PrefetchTiles(PrefetchTilesRequest request) const {
56+
return impl_->PrefetchTiles(std::move(request));
57+
}
58+
5359
} // namespace read
5460
} // namespace dataservice
5561
} // namespace olp

olp-cpp-sdk-dataservice-read/src/VersionedLayerClientImpl.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,14 @@ client::CancellationToken VersionedLayerClientImpl::GetData(
148148
}
149149

150150
client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
151-
PrefetchTilesRequest request, PrefetchTilesResponseCallback callback) {
151+
PrefetchTilesRequest request,
152+
PrefetchTilesResponseCallback callback) const {
152153
const int64_t request_key = pending_requests_->GenerateRequestPlaceholder();
153154
auto pending_requests = pending_requests_;
154-
auto request_callback = [=](const PrefetchTilesResponse& response) {
155+
auto request_callback = [=](PrefetchTilesResponse response) {
155156
pending_requests->Remove(request_key);
156157
if (callback) {
157-
callback(response);
158+
callback(std::move(response));
158159
}
159160
};
160161

@@ -164,6 +165,17 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
164165
return token;
165166
}
166167

168+
client::CancellableFuture<PrefetchTilesResponse>
169+
VersionedLayerClientImpl::PrefetchTiles(PrefetchTilesRequest request) const {
170+
auto promise = std::make_shared<std::promise<PrefetchTilesResponse>>();
171+
auto cancel_token = PrefetchTiles(std::move(request),
172+
[promise](PrefetchTilesResponse response) {
173+
promise->set_value(std::move(response));
174+
});
175+
return client::CancellableFuture<PrefetchTilesResponse>(cancel_token,
176+
promise);
177+
}
178+
167179
} // namespace read
168180
} // namespace dataservice
169181
} // namespace olp

olp-cpp-sdk-dataservice-read/src/VersionedLayerClientImpl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ class VersionedLayerClientImpl {
8282
PartitionsRequest partitions_request, PartitionsCallback callback) const;
8383

8484
virtual client::CancellationToken PrefetchTiles(
85-
PrefetchTilesRequest request, PrefetchTilesResponseCallback callback);
85+
PrefetchTilesRequest request,
86+
PrefetchTilesResponseCallback callback) const;
87+
88+
virtual client::CancellableFuture<PrefetchTilesResponse> PrefetchTiles(
89+
PrefetchTilesRequest request) const;
8690

8791
protected:
8892
client::HRN catalog_;

tests/functional/olp-cpp-sdk-dataservice-read/DataserviceReadVersionedLayerClientTest.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ TEST_F(DataserviceReadVersionedLayerClientTest, Prefetch) {
199199
auto token = client->PrefetchTiles(
200200
request,
201201
[&promise](VersionedLayerClient::PrefetchTilesResponse response) {
202-
promise.set_value(response);
202+
promise.set_value(std::move(response));
203203
});
204204

205205
ASSERT_NE(future.wait_for(kWaitTimeout), std::future_status::timeout);
@@ -267,4 +267,41 @@ TEST_F(DataserviceReadVersionedLayerClientTest, Prefetch) {
267267
}
268268
}
269269

270+
TEST_F(DataserviceReadVersionedLayerClientTest, PrefetchWithCancellableFuture) {
271+
const auto catalog =
272+
olp::client::HRN::FromString(CustomParameters::getArgument(
273+
"dataservice_read_test_versioned_prefetch_catalog"));
274+
const auto kLayerId = CustomParameters::getArgument(
275+
"dataservice_read_test_versioned_prefetch_layer");
276+
const auto kTileId = CustomParameters::getArgument(
277+
"dataservice_read_test_versioned_prefetch_tile");
278+
279+
auto client = std::make_unique<olp::dataservice::read::VersionedLayerClient>(
280+
catalog, kLayerId, *settings_);
281+
282+
std::vector<olp::geo::TileKey> tile_keys = {
283+
olp::geo::TileKey::FromHereTile(kTileId)};
284+
285+
auto request = olp::dataservice::read::PrefetchTilesRequest()
286+
.WithTileKeys(tile_keys)
287+
.WithMinLevel(10)
288+
.WithMaxLevel(12);
289+
auto cancel_future = client->PrefetchTiles(std::move(request));
290+
291+
auto raw_future = cancel_future.GetFuture();
292+
ASSERT_NE(raw_future.wait_for(kWaitTimeout), std::future_status::timeout);
293+
VersionedLayerClient::PrefetchTilesResponse response = raw_future.get();
294+
EXPECT_SUCCESS(response);
295+
ASSERT_FALSE(response.GetResult().empty());
296+
297+
const auto& result = response.GetResult();
298+
299+
for (auto tile_result : result) {
300+
EXPECT_SUCCESS(*tile_result);
301+
ASSERT_TRUE(tile_result->tile_key_.IsValid());
302+
}
303+
304+
ASSERT_EQ(6u, result.size());
305+
}
306+
270307
} // namespace

tests/integration/olp-cpp-sdk-dataservice-read/VersionedLayerClientTest.cpp

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@ TEST_F(DataserviceReadVersionedLayerClientTest, PrefetchTilesWithCache) {
14781478
auto token = client->PrefetchTiles(
14791479
request,
14801480
[&promise](VersionedLayerClient::PrefetchTilesResponse response) {
1481-
promise.set_value(response);
1481+
promise.set_value(std::move(response));
14821482
});
14831483

14841484
ASSERT_NE(future.wait_for(kWaitTimeout), std::future_status::timeout);
@@ -1580,7 +1580,7 @@ TEST_F(DataserviceReadVersionedLayerClientTest, PrefetchTilesBusy) {
15801580
auto token1 = client->PrefetchTiles(
15811581
request1,
15821582
[&promise1](VersionedLayerClient::PrefetchTilesResponse response) {
1583-
promise1.set_value(response);
1583+
promise1.set_value(std::move(response));
15841584
});
15851585

15861586
// Wait for QuadKey request
@@ -1602,7 +1602,7 @@ TEST_F(DataserviceReadVersionedLayerClientTest, PrefetchTilesBusy) {
16021602
auto token2 = client->PrefetchTiles(
16031603
request2,
16041604
[&promise2](VersionedLayerClient::PrefetchTilesResponse response) {
1605-
promise2.set_value(response);
1605+
promise2.set_value(std::move(response));
16061606
});
16071607

16081608
// Unblock the QuadKey request
@@ -1668,7 +1668,7 @@ TEST_F(DataserviceReadVersionedLayerClientTest,
16681668
auto token = client->PrefetchTiles(
16691669
request,
16701670
[&promise](VersionedLayerClient::PrefetchTilesResponse response) {
1671-
promise.set_value(response);
1671+
promise.set_value(std::move(response));
16721672
});
16731673

16741674
wait_for_cancel->get_future().get();
@@ -1735,4 +1735,82 @@ TEST_F(DataserviceReadVersionedLayerClientTest, PrefetchTilesCancelOnLookup) {
17351735
olp::client::ErrorCode::Cancelled);
17361736
}
17371737

1738+
TEST_F(DataserviceReadVersionedLayerClientTest,
1739+
PrefetchTilesWithCancellableFuture) {
1740+
olp::client::HRN catalog(GetTestCatalog());
1741+
constexpr auto kLayerId = "hype-test-prefetch";
1742+
1743+
std::vector<olp::geo::TileKey> tile_keys = {
1744+
olp::geo::TileKey::FromHereTile("5904591")};
1745+
1746+
auto request = olp::dataservice::read::PrefetchTilesRequest()
1747+
.WithTileKeys(tile_keys)
1748+
.WithMinLevel(10)
1749+
.WithMaxLevel(12);
1750+
1751+
auto client = std::make_unique<olp::dataservice::read::VersionedLayerClient>(
1752+
catalog, kLayerId, *settings_);
1753+
ASSERT_TRUE(client);
1754+
1755+
auto cancel_future = client->PrefetchTiles(request);
1756+
auto raw_future = cancel_future.GetFuture();
1757+
1758+
ASSERT_NE(raw_future.wait_for(kWaitTimeout), std::future_status::timeout);
1759+
VersionedLayerClient::PrefetchTilesResponse response = raw_future.get();
1760+
ASSERT_TRUE(response.IsSuccessful()) << response.GetError().GetMessage();
1761+
ASSERT_FALSE(response.GetResult().empty());
1762+
1763+
const auto& result = response.GetResult();
1764+
for (auto tile_result : result) {
1765+
ASSERT_TRUE(tile_result->IsSuccessful())
1766+
<< tile_result->GetError().GetMessage();
1767+
ASSERT_TRUE(tile_result->tile_key_.IsValid());
1768+
}
1769+
}
1770+
1771+
TEST_F(DataserviceReadVersionedLayerClientTest,
1772+
CancelPrefetchTilesWithCancellableFuture) {
1773+
olp::client::HRN catalog(GetTestCatalog());
1774+
constexpr auto kLayerId = "hype-test-prefetch";
1775+
1776+
std::vector<olp::geo::TileKey> tile_keys = {
1777+
olp::geo::TileKey::FromHereTile("5904591")};
1778+
1779+
auto request = olp::dataservice::read::PrefetchTilesRequest()
1780+
.WithTileKeys(tile_keys)
1781+
.WithMinLevel(10)
1782+
.WithMaxLevel(12);
1783+
1784+
auto client = std::make_unique<olp::dataservice::read::VersionedLayerClient>(
1785+
catalog, kLayerId, *settings_);
1786+
ASSERT_TRUE(client);
1787+
1788+
auto wait_for_cancel = std::make_shared<std::promise<void>>();
1789+
auto pause_for_cancel = std::make_shared<std::promise<void>>();
1790+
1791+
olp::http::RequestId request_id;
1792+
NetworkCallback send_mock;
1793+
CancelCallback cancel_mock;
1794+
std::tie(request_id, send_mock, cancel_mock) = GenerateNetworkMockActions(
1795+
wait_for_cancel, pause_for_cancel,
1796+
{olp::http::HttpStatusCode::OK, HTTP_RESPONSE_LOOKUP_QUERY});
1797+
EXPECT_CALL(*network_mock_, Send(_, _, _, _, _))
1798+
.WillOnce(testing::Invoke(std::move(send_mock)));
1799+
1800+
EXPECT_CALL(*network_mock_, Cancel(_))
1801+
.WillOnce(testing::Invoke(std::move(cancel_mock)));
1802+
1803+
auto cancel_future = client->PrefetchTiles(request);
1804+
1805+
wait_for_cancel->get_future().get();
1806+
cancel_future.GetCancellationToken().cancel();
1807+
pause_for_cancel->set_value();
1808+
1809+
auto raw_future = cancel_future.GetFuture();
1810+
ASSERT_NE(raw_future.wait_for(kWaitTimeout), std::future_status::timeout);
1811+
VersionedLayerClient::PrefetchTilesResponse response = raw_future.get();
1812+
ASSERT_FALSE(response.IsSuccessful());
1813+
ASSERT_TRUE(response.GetResult().empty());
1814+
}
1815+
17381816
} // namespace

0 commit comments

Comments
 (0)