From 31dc1d79a39735c04307ff79db009d88e05a0270 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Fri, 6 Aug 2021 11:16:20 +0200 Subject: [PATCH] Move conversion of ServerResponses to Transaction object --- include/caosdb/transaction.h | 2 +- src/caosdb/transaction.cpp | 47 ++++++++++++++++++------------------ test/test_transaction.cpp | 41 ++++++++++++++++++------------- 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/include/caosdb/transaction.h b/include/caosdb/transaction.h index ddf7133..7be9d18 100644 --- a/include/caosdb/transaction.h +++ b/include/caosdb/transaction.h @@ -208,7 +208,7 @@ private: class MultiResultSet : public ResultSet { public: ~MultiResultSet() = default; - explicit MultiResultSet(MultiTransactionResponse *response); + explicit MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set); [[nodiscard]] inline auto Size() const noexcept -> int override { return this->entities.size(); } diff --git a/src/caosdb/transaction.cpp b/src/caosdb/transaction.cpp index 334d8f7..698218a 100644 --- a/src/caosdb/transaction.cpp +++ b/src/caosdb/transaction.cpp @@ -131,28 +131,8 @@ auto ResultSet::end() const -> ResultSet::iterator { return ResultSet::iterator(this, Size()); } -MultiResultSet::MultiResultSet(MultiTransactionResponse *response) { - auto *responses = response->mutable_responses(); - for (auto sub_response : *responses) { - switch (sub_response.wrapped_response_case()) { - case WrappedResponseCase::kRetrieveResponse: - this->entities.push_back(std::make_unique<Entity>( - sub_response.mutable_retrieve_response()->release_entity())); - break; - case WrappedResponseCase::kInsertResponse: - this->entities.push_back( - std::make_unique<Entity>(sub_response.release_insert_response())); - break; - case WrappedResponseCase::kDeleteResponse: - this->entities.push_back( - std::make_unique<Entity>(sub_response.release_insert_response())); - break; - default: - // TODO(tf) Updates - break; - } - } -} +MultiResultSet::MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set) + : entities(std::move(result_set)) {} [[nodiscard]] auto UniqueResult::GetEntity() const -> const Entity & { const Entity *result = this->entity.get(); @@ -338,7 +318,28 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus { break; } } else { - this->result_set = std::make_unique<MultiResultSet>(this->response); + auto *responses = this->response->mutable_responses(); + std::vector<std::unique_ptr<Entity>> entities; + for (auto sub_response : *responses) { + switch (sub_response.wrapped_response_case()) { + case WrappedResponseCase::kRetrieveResponse: + entities.push_back(std::make_unique<Entity>( + sub_response.mutable_retrieve_response()->release_entity())); + break; + case WrappedResponseCase::kInsertResponse: + entities.push_back( + std::make_unique<Entity>(sub_response.release_insert_response())); + break; + case WrappedResponseCase::kDeleteResponse: + entities.push_back( + std::make_unique<Entity>(sub_response.release_insert_response())); + break; + default: + // TODO(tf) Updates + break; + } + } + this->result_set = std::make_unique<MultiResultSet>(std::move(entities)); } return this->status; diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp index 557ded7..86d3294 100644 --- a/test/test_transaction.cpp +++ b/test/test_transaction.cpp @@ -31,6 +31,7 @@ #include "gtest/gtest_pred_impl.h" // for Test, TestInfo, TEST #include <memory> // for allocator, unique_ptr #include <string> // for string, basic_string +#include <utility> // for move #include <vector> // for vector namespace caosdb::transaction { @@ -39,6 +40,7 @@ using caosdb::connection::Connection; using caosdb::exceptions::ConnectionError; using caosdb::transaction::UniqueResult; using ProtoEntity = caosdb::entity::v1alpha1::Entity; +using caosdb::entity::v1alpha1::RetrieveResponse; TEST(test_transaction, create_transaction) { const auto *host = "localhost"; @@ -92,21 +94,18 @@ TEST(test_transaction, test_retrieve_by_ids) { } TEST(test_transaction, test_multi_result_set_empty) { - MultiTransactionResponse response; - - MultiResultSet rs(&response); + std::vector<std::unique_ptr<Entity>> empty; + MultiResultSet rs(std::move(empty)); EXPECT_EQ(rs.Size(), 0); } TEST(test_transaction, test_multi_result_iterator) { - MultiTransactionResponse response; - - response.add_responses() - ->mutable_retrieve_response() - ->mutable_entity() - ->set_id("100"); + std::vector<std::unique_ptr<Entity>> one_elem; + RetrieveResponse response; + response.mutable_entity()->set_id("100"); + one_elem.push_back(std::make_unique<Entity>(response.release_entity())); - MultiResultSet rs(&response); + MultiResultSet rs(std::move(one_elem)); EXPECT_EQ(rs.Size(), 1); for (const Entity &entity : rs) { @@ -126,18 +125,19 @@ TEST(test_transaction, test_unique_result_iterator) { } TEST(test_transaction, test_multi_result_set_one) { - MultiTransactionResponse response; - response.add_responses() - ->mutable_retrieve_response() - ->mutable_entity() - ->set_id("100"); + std::vector<std::unique_ptr<Entity>> one_elem; + RetrieveResponse response; + response.mutable_entity()->set_id("100"); + one_elem.push_back(std::make_unique<Entity>(response.release_entity())); - MultiResultSet rs(&response); + MultiResultSet rs(std::move(one_elem)); EXPECT_EQ(rs.Size(), 1); EXPECT_EQ(rs.At(0).GetId(), "100"); } TEST(test_transaction, test_multi_result_set_three) { + std::vector<std::unique_ptr<Entity>> three_elem; + MultiTransactionResponse response; response.add_responses() ->mutable_retrieve_response() @@ -152,7 +152,14 @@ TEST(test_transaction, test_multi_result_set_three) { ->mutable_entity() ->set_id("102"); - MultiResultSet rs(&response); + auto *responses = response.mutable_responses(); + std::vector<std::unique_ptr<Entity>> entities; + for (auto sub_response : *responses) { + three_elem.push_back(std::make_unique<Entity>( + sub_response.mutable_retrieve_response()->release_entity())); + } + + MultiResultSet rs(std::move(three_elem)); EXPECT_EQ(rs.Size(), 3); EXPECT_TRUE(rs.At(1).HasErrors()); } -- GitLab