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
4444constexpr auto kLogTag = " PartitionsRepository" ;
4545constexpr auto kAggregateQuadTreeDepth = 4 ;
46+ constexpr auto kQueryRequestLimit = 100 ;
4647
4748using LayerVersionReponse = client::ApiResponse<int64_t , client::ApiError>;
4849using 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-
204199PartitionsResponse 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
227222QueryApi::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-
334328PartitionsResponse 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
0 commit comments