Skip to content

Commit

Permalink
Avoid streams in converting HRN to std::string (#1492)
Browse files Browse the repository at this point in the history
To make the code faster

Relates-To: OLPEDGE-2754

Signed-off-by: Rustam Gamidov <[email protected]>
  • Loading branch information
rustam-gamidov-here committed Apr 2, 2024
1 parent 2091bd0 commit 93bf554
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 18 deletions.
92 changes: 75 additions & 17 deletions olp-cpp-sdk-core/src/client/HRN.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2021 HERE Europe B.V.
* Copyright (C) 2019-2024 HERE Europe B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -19,7 +19,7 @@

#include "olp/core/client/HRN.h"

#include <sstream>
#include <cstring>

#include <olp/core/logging/Log.h>
#include <olp/core/porting/make_unique.h>
Expand All @@ -38,45 +38,103 @@ namespace olp {
namespace client {

std::string HRN::ToString() const {
std::ostringstream ret;
const auto generic_part =
kSeparator + region_ + kSeparator + account_ + kSeparator;
ret << kHrnTag << partition_ << kSeparator;
std::string ret;

switch (service_) {
case ServiceType::Data: {
ret << kDataTag << generic_part << catalog_id_;
ret.reserve(std::strlen(kHrnTag) + std::strlen(kDataTag) +
5 * sizeof(kSeparator) + partition_.size() + region_.size() +
account_.size() + catalog_id_.size() + layer_id_.size());
ret.append(kHrnTag)
.append(partition_)
.append(1, kSeparator)
.append(kDataTag)
.append(1, kSeparator)
.append(region_)
.append(1, kSeparator)
.append(account_)
.append(1, kSeparator)
.append(catalog_id_);
if (!layer_id_.empty()) {
ret << kSeparator << layer_id_;
ret.append(1, kSeparator).append(layer_id_);
}
break;
}
case ServiceType::Schema: {
ret << kSchemaTag << generic_part << group_id_ << kSeparator
<< schema_name_ << kSeparator << version_;
ret.reserve(std::strlen(kHrnTag) + std::strlen(kSchemaTag) +
6 * sizeof(kSeparator) + partition_.size() + region_.size() +
account_.size() + group_id_.size() + schema_name_.size() +
version_.size());
ret.append(kHrnTag)
.append(partition_)
.append(1, kSeparator)
.append(kSchemaTag)
.append(1, kSeparator)
.append(region_)
.append(1, kSeparator)
.append(account_)
.append(1, kSeparator)
.append(group_id_)
.append(1, kSeparator)
.append(schema_name_)
.append(1, kSeparator)
.append(version_);
break;
}
case ServiceType::Pipeline: {
ret << kPipelineTag << generic_part << pipeline_id_;
ret.reserve(std::strlen(kHrnTag) + std::strlen(kPipelineTag) +
4 * sizeof(kSeparator) + partition_.size() + region_.size() +
account_.size() + pipeline_id_.size());
ret.append(kHrnTag)
.append(partition_)
.append(1, kSeparator)
.append(kPipelineTag)
.append(1, kSeparator)
.append(region_)
.append(1, kSeparator)
.append(account_)
.append(1, kSeparator)
.append(pipeline_id_);
break;
}
default: {
ret << generic_part;
ret.reserve(std::strlen(kHrnTag) + 4 * sizeof(kSeparator) +
partition_.size() + region_.size() + account_.size());
ret.append(kHrnTag)
.append(partition_)
.append(1, kSeparator)
.append(1, kSeparator)
.append(region_)
.append(1, kSeparator)
.append(account_)
.append(1, kSeparator);
break;
}
}

return ret.str();
return ret;
}

std::string HRN::ToCatalogHRNString() const {
std::string ret;
if (service_ != ServiceType::Data) {
OLP_SDK_LOG_WARNING_F(kLogTag, "ToCatalogHRNString: ServiceType != Data");
return {};
return ret;
}

return kHrnTag + partition_ + kSeparator + kDataTag + kSeparator + region_ +
kSeparator + account_ + kSeparator + catalog_id_;
ret.reserve(std::strlen(kHrnTag) + std::strlen(kDataTag) +
4 * sizeof(kSeparator) + partition_.size() + region_.size() +
account_.size() + catalog_id_.size());
ret.append(kHrnTag)
.append(partition_)
.append(1, kSeparator)
.append(kDataTag)
.append(1, kSeparator)
.append(region_)
.append(1, kSeparator)
.append(account_)
.append(1, kSeparator)
.append(catalog_id_);
return ret;
}

HRN::HRN(const std::string& input) {
Expand Down
13 changes: 12 additions & 1 deletion olp-cpp-sdk-core/tests/client/HRNTest.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2021 HERE Europe B.V.
* Copyright (C) 2019-2024 HERE Europe B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -150,10 +150,21 @@ TEST(HRNTest, CompareHRNs) {
TEST(HRNTest, ToString) {
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2").ToString(),
"hrn:here:data:::hereos-internal-test-v2");
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2:rendering").ToString(),
"hrn:here:data:::hereos-internal-test-v2:rendering");
EXPECT_EQ(HRN("hrn:here:schema:::group_id:artifact_id:version").ToString(),
"hrn:here:schema:::group_id:artifact_id:version");
EXPECT_EQ(HRN("hrn:here:data:::test_pipeline").ToString(),
"hrn:here:data:::test_pipeline");
EXPECT_EQ(HRN("hrn:here:pipeline:US:test:test_pipeline").ToString(),
"hrn:here:pipeline:US:test:test_pipeline");
}

TEST(HRNTest, ToCatalogHRNString) {
EXPECT_EQ(HRN("hrn:here:pipeline:US:test:test_pipeline").ToCatalogHRNString(),
"");
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2").ToCatalogHRNString(),
"hrn:here:data:::hereos-internal-test-v2");
}

TEST(HRNTest, Parsing) {
Expand Down

0 comments on commit 93bf554

Please sign in to comment.