Skip to content

Commit a657055

Browse files
Change the GetPartitions API (#1426)
Change the GetPartitions API, now it supports requests with more than 100 partitions which is an backend API limit. Relates-To: OLPSUP-25510 Signed-off-by: Mykhailo Kuchma <[email protected]>
1 parent 6b3881b commit a657055

File tree

3 files changed

+81
-41
lines changed

3 files changed

+81
-41
lines changed

olp-cpp-sdk-dataservice-read/src/repositories/PartitionsRepository.cpp

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2022 HERE Europe B.V.
2+
* Copyright (C) 2019-2023 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@ namespace repository = olp::dataservice::read::repository;
4343

4444
constexpr auto kLogTag = "PartitionsRepository";
4545
constexpr auto kAggregateQuadTreeDepth = 4;
46+
constexpr auto kQueryRequestLimit = 100;
4647

4748
using LayerVersionReponse = client::ApiResponse<int64_t, client::ApiError>;
4849
using LayerVersionCallback = std::function<void(LayerVersionReponse)>;
@@ -195,12 +196,6 @@ PartitionsRepository::GetVersionedPartitionsExtendedResponse(
195196
boost::none, fail_on_cache_error);
196197
}
197198

198-
PartitionsResponse PartitionsRepository::GetVersionedPartitions(
199-
const PartitionsRequest& request, int64_t version,
200-
client::CancellationContext context) {
201-
return GetPartitions(request, version, std::move(context));
202-
}
203-
204199
PartitionsResponse PartitionsRepository::GetVolatilePartitions(
205200
const PartitionsRequest& request, client::CancellationContext context) {
206201
auto catalog_request = CatalogRequest()
@@ -220,8 +215,8 @@ PartitionsResponse PartitionsRepository::GetVolatilePartitions(
220215
return expiry_response.GetError();
221216
}
222217

223-
return GetPartitions(request, boost::none, context,
224-
expiry_response.MoveResult());
218+
return GetPartitionsExtendedResponse(request, boost::none, context,
219+
expiry_response.MoveResult());
225220
}
226221

227222
QueryApi::PartitionsExtendedResponse
@@ -291,9 +286,15 @@ PartitionsRepository::GetPartitionsExtendedResponse(
291286
return query_api.GetError();
292287
}
293288

294-
response = QueryApi::GetPartitionsbyId(
295-
query_api.GetResult(), layer_id_, partition_ids, version,
296-
request.GetAdditionalFields(), request.GetBillingTag(), context);
289+
if (partition_ids.size() <= kQueryRequestLimit) {
290+
response = QueryApi::GetPartitionsbyId(
291+
query_api.GetResult(), layer_id_, partition_ids, version,
292+
request.GetAdditionalFields(), request.GetBillingTag(), context);
293+
} else {
294+
response = QueryPartitionsInBatches(
295+
query_api.GetResult(), partition_ids, version,
296+
request.GetAdditionalFields(), request.GetBillingTag(), context);
297+
}
297298
}
298299
// Save all partitions only when downloaded via metadata API
299300
const bool is_layer_metadata = partition_ids.empty();
@@ -324,13 +325,6 @@ PartitionsRepository::GetPartitionsExtendedResponse(
324325
return response;
325326
}
326327

327-
PartitionsResponse PartitionsRepository::GetPartitions(
328-
const PartitionsRequest& request, boost::optional<std::int64_t> version,
329-
client::CancellationContext context, boost::optional<time_t> expiry) {
330-
return GetPartitionsExtendedResponse(request, std::move(version),
331-
std::move(context), std::move(expiry));
332-
}
333-
334328
PartitionsResponse PartitionsRepository::GetPartitionById(
335329
const DataRequest& request, boost::optional<int64_t> version,
336330
client::CancellationContext context) {
@@ -584,6 +578,52 @@ PartitionResponse PartitionsRepository::GetTile(
584578
quad_tree_response.GetPayload());
585579
}
586580

581+
QueryApi::PartitionsExtendedResponse
582+
PartitionsRepository::QueryPartitionsInBatches(
583+
const client::OlpClient& client,
584+
const PartitionsRequest::PartitionIds& partitions,
585+
boost::optional<std::int64_t> version,
586+
const PartitionsRequest::AdditionalFields& additional_fields,
587+
boost::optional<std::string> billing_tag,
588+
client::CancellationContext context) {
589+
std::vector<model::Partition> aggregated_partitions;
590+
aggregated_partitions.reserve(partitions.size());
591+
592+
client::NetworkStatistics aggregated_network_statistics;
593+
594+
PartitionsRequest::PartitionIds batch;
595+
batch.reserve(kQueryRequestLimit);
596+
597+
for (size_t i = 0; i < partitions.size(); i += kQueryRequestLimit) {
598+
batch.clear();
599+
600+
std::copy(partitions.begin() + i,
601+
partitions.begin() +
602+
std::min(partitions.size(), i + kQueryRequestLimit),
603+
std::back_inserter(batch));
604+
605+
auto query_response =
606+
QueryApi::GetPartitionsbyId(client, layer_id_, batch, version,
607+
additional_fields, billing_tag, context);
608+
if (!query_response) {
609+
return query_response.GetError();
610+
}
611+
612+
auto partitions = query_response.MoveResult();
613+
auto& mutable_partitions = partitions.GetMutablePartitions();
614+
std::move(mutable_partitions.begin(), mutable_partitions.end(),
615+
std::back_inserter(aggregated_partitions));
616+
617+
aggregated_network_statistics += query_response.GetPayload();
618+
}
619+
620+
model::Partitions result_partitions;
621+
result_partitions.GetMutablePartitions().swap(aggregated_partitions);
622+
623+
return QueryApi::PartitionsExtendedResponse(std::move(result_partitions),
624+
aggregated_network_statistics);
625+
}
626+
587627
} // namespace repository
588628
} // namespace read
589629
} // namespace dataservice

olp-cpp-sdk-dataservice-read/src/repositories/PartitionsRepository.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2022 HERE Europe B.V.
2+
* Copyright (C) 2019-2023 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -57,10 +57,6 @@ class PartitionsRepository {
5757
client::ApiLookupClient client,
5858
NamedMutexStorage storage = NamedMutexStorage());
5959

60-
PartitionsResponse GetVersionedPartitions(
61-
const read::PartitionsRequest& request, std::int64_t version,
62-
client::CancellationContext context);
63-
6460
PartitionsResponse GetVolatilePartitions(
6561
const read::PartitionsRequest& request,
6662
client::CancellationContext context);
@@ -93,19 +89,21 @@ class PartitionsRepository {
9389
boost::optional<std::vector<std::string>> additional_fields =
9490
boost::none);
9591

96-
PartitionsResponse GetPartitions(
97-
const read::PartitionsRequest& request,
98-
boost::optional<std::int64_t> version,
99-
client::CancellationContext context,
100-
boost::optional<time_t> expiry = boost::none);
101-
10292
QueryApi::PartitionsExtendedResponse GetPartitionsExtendedResponse(
10393
const read::PartitionsRequest& request,
10494
boost::optional<std::int64_t> version,
10595
client::CancellationContext context,
10696
boost::optional<time_t> expiry = boost::none,
10797
bool fail_on_cache_error = false);
10898

99+
QueryApi::PartitionsExtendedResponse QueryPartitionsInBatches(
100+
const client::OlpClient& client,
101+
const PartitionsRequest::PartitionIds& partitions,
102+
boost::optional<std::int64_t> version,
103+
const PartitionsRequest::AdditionalFields& additional_fields,
104+
boost::optional<std::string> billing_tag,
105+
client::CancellationContext context);
106+
109107
const client::HRN catalog_;
110108
const std::string layer_id_;
111109
client::OlpClientSettings settings_;

olp-cpp-sdk-dataservice-read/tests/PartitionsRepositoryTest.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2022 HERE Europe B.V.
2+
* Copyright (C) 2019-2023 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -625,8 +625,8 @@ TEST_F(PartitionsRepositoryTest, GetVersionedPartitions) {
625625
request.WithPartitionIds({kPartitionId, kInvalidPartitionId});
626626
request.WithFetchOption(read::CacheOnly);
627627

628-
auto response =
629-
repository.GetVersionedPartitions(request, kVersion, context);
628+
auto response = repository.GetVersionedPartitionsExtendedResponse(
629+
request, kVersion, context);
630630

631631
ASSERT_FALSE(response.IsSuccessful());
632632
EXPECT_TRUE(response.GetResult().GetPartitions().empty());
@@ -658,8 +658,8 @@ TEST_F(PartitionsRepositoryTest, GetVersionedPartitions) {
658658
read::PartitionsRequest request;
659659
request.WithPartitionIds({kPartitionId});
660660

661-
auto response =
662-
repository.GetVersionedPartitions(request, kVersion, context);
661+
auto response = repository.GetVersionedPartitionsExtendedResponse(
662+
request, kVersion, context);
663663

664664
ASSERT_TRUE(response.IsSuccessful()) << response.GetError().GetMessage();
665665
EXPECT_EQ(response.GetResult().GetPartitions().size(), 1);
@@ -690,15 +690,16 @@ TEST_F(PartitionsRepositoryTest, GetVersionedPartitions) {
690690
settings, lookup_client);
691691
read::PartitionsRequest request;
692692

693-
auto response =
694-
repository.GetVersionedPartitions(request, kVersion, context);
693+
auto response = repository.GetVersionedPartitionsExtendedResponse(
694+
request, kVersion, context);
695695

696696
ASSERT_TRUE(response.IsSuccessful()) << response.GetError().GetMessage();
697697
EXPECT_TRUE(response.GetResult().GetPartitions().empty());
698698

699699
request.WithFetchOption(read::CacheOnly);
700700

701-
response = repository.GetVersionedPartitions(request, kVersion, context);
701+
response = repository.GetVersionedPartitionsExtendedResponse(
702+
request, kVersion, context);
702703

703704
ASSERT_TRUE(response.IsSuccessful()) << response.GetError().GetMessage();
704705
EXPECT_TRUE(response.GetResult().GetPartitions().empty());
@@ -817,7 +818,8 @@ TEST_F(PartitionsRepositoryTest, AdditionalFields) {
817818
read::PartitionsRequest::kCrc,
818819
read::PartitionsRequest::kDataSize});
819820

820-
auto response = repository.GetVersionedPartitions(request, kVersion, context);
821+
auto response = repository.GetVersionedPartitionsExtendedResponse(
822+
request, kVersion, context);
821823

822824
ASSERT_TRUE(response.IsSuccessful());
823825
auto result = response.GetResult();
@@ -830,8 +832,8 @@ TEST_F(PartitionsRepositoryTest, AdditionalFields) {
830832

831833
request.WithFetchOption(read::CacheOnly);
832834

833-
auto response_2 =
834-
repository.GetVersionedPartitions(request, kVersion, context);
835+
auto response_2 = repository.GetVersionedPartitionsExtendedResponse(
836+
request, kVersion, context);
835837

836838
ASSERT_TRUE(response_2.IsSuccessful());
837839

0 commit comments

Comments
 (0)