Skip to content
Snippets Groups Projects
Verified Commit 31dc1d79 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

Move conversion of ServerResponses to Transaction object

parent 75a171cd
No related branches found
No related tags found
1 merge request!7ENH: Support FIND and COUNT queries
...@@ -208,7 +208,7 @@ private: ...@@ -208,7 +208,7 @@ private:
class MultiResultSet : public ResultSet { class MultiResultSet : public ResultSet {
public: public:
~MultiResultSet() = default; ~MultiResultSet() = default;
explicit MultiResultSet(MultiTransactionResponse *response); explicit MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set);
[[nodiscard]] inline auto Size() const noexcept -> int override { [[nodiscard]] inline auto Size() const noexcept -> int override {
return this->entities.size(); return this->entities.size();
} }
......
...@@ -131,28 +131,8 @@ auto ResultSet::end() const -> ResultSet::iterator { ...@@ -131,28 +131,8 @@ auto ResultSet::end() const -> ResultSet::iterator {
return ResultSet::iterator(this, Size()); return ResultSet::iterator(this, Size());
} }
MultiResultSet::MultiResultSet(MultiTransactionResponse *response) { MultiResultSet::MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set)
auto *responses = response->mutable_responses(); : entities(std::move(result_set)) {}
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;
}
}
}
[[nodiscard]] auto UniqueResult::GetEntity() const -> const Entity & { [[nodiscard]] auto UniqueResult::GetEntity() const -> const Entity & {
const Entity *result = this->entity.get(); const Entity *result = this->entity.get();
...@@ -338,7 +318,28 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus { ...@@ -338,7 +318,28 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus {
break; break;
} }
} else { } 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; return this->status;
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "gtest/gtest_pred_impl.h" // for Test, TestInfo, TEST #include "gtest/gtest_pred_impl.h" // for Test, TestInfo, TEST
#include <memory> // for allocator, unique_ptr #include <memory> // for allocator, unique_ptr
#include <string> // for string, basic_string #include <string> // for string, basic_string
#include <utility> // for move
#include <vector> // for vector #include <vector> // for vector
namespace caosdb::transaction { namespace caosdb::transaction {
...@@ -39,6 +40,7 @@ using caosdb::connection::Connection; ...@@ -39,6 +40,7 @@ using caosdb::connection::Connection;
using caosdb::exceptions::ConnectionError; using caosdb::exceptions::ConnectionError;
using caosdb::transaction::UniqueResult; using caosdb::transaction::UniqueResult;
using ProtoEntity = caosdb::entity::v1alpha1::Entity; using ProtoEntity = caosdb::entity::v1alpha1::Entity;
using caosdb::entity::v1alpha1::RetrieveResponse;
TEST(test_transaction, create_transaction) { TEST(test_transaction, create_transaction) {
const auto *host = "localhost"; const auto *host = "localhost";
...@@ -92,21 +94,18 @@ TEST(test_transaction, test_retrieve_by_ids) { ...@@ -92,21 +94,18 @@ TEST(test_transaction, test_retrieve_by_ids) {
} }
TEST(test_transaction, test_multi_result_set_empty) { TEST(test_transaction, test_multi_result_set_empty) {
MultiTransactionResponse response; std::vector<std::unique_ptr<Entity>> empty;
MultiResultSet rs(std::move(empty));
MultiResultSet rs(&response);
EXPECT_EQ(rs.Size(), 0); EXPECT_EQ(rs.Size(), 0);
} }
TEST(test_transaction, test_multi_result_iterator) { TEST(test_transaction, test_multi_result_iterator) {
MultiTransactionResponse response; std::vector<std::unique_ptr<Entity>> one_elem;
RetrieveResponse response;
response.add_responses() response.mutable_entity()->set_id("100");
->mutable_retrieve_response() one_elem.push_back(std::make_unique<Entity>(response.release_entity()));
->mutable_entity()
->set_id("100");
MultiResultSet rs(&response); MultiResultSet rs(std::move(one_elem));
EXPECT_EQ(rs.Size(), 1); EXPECT_EQ(rs.Size(), 1);
for (const Entity &entity : rs) { for (const Entity &entity : rs) {
...@@ -126,18 +125,19 @@ TEST(test_transaction, test_unique_result_iterator) { ...@@ -126,18 +125,19 @@ TEST(test_transaction, test_unique_result_iterator) {
} }
TEST(test_transaction, test_multi_result_set_one) { TEST(test_transaction, test_multi_result_set_one) {
MultiTransactionResponse response; std::vector<std::unique_ptr<Entity>> one_elem;
response.add_responses() RetrieveResponse response;
->mutable_retrieve_response() response.mutable_entity()->set_id("100");
->mutable_entity() one_elem.push_back(std::make_unique<Entity>(response.release_entity()));
->set_id("100");
MultiResultSet rs(&response); MultiResultSet rs(std::move(one_elem));
EXPECT_EQ(rs.Size(), 1); EXPECT_EQ(rs.Size(), 1);
EXPECT_EQ(rs.At(0).GetId(), "100"); EXPECT_EQ(rs.At(0).GetId(), "100");
} }
TEST(test_transaction, test_multi_result_set_three) { TEST(test_transaction, test_multi_result_set_three) {
std::vector<std::unique_ptr<Entity>> three_elem;
MultiTransactionResponse response; MultiTransactionResponse response;
response.add_responses() response.add_responses()
->mutable_retrieve_response() ->mutable_retrieve_response()
...@@ -152,7 +152,14 @@ TEST(test_transaction, test_multi_result_set_three) { ...@@ -152,7 +152,14 @@ TEST(test_transaction, test_multi_result_set_three) {
->mutable_entity() ->mutable_entity()
->set_id("102"); ->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_EQ(rs.Size(), 3);
EXPECT_TRUE(rs.At(1).HasErrors()); EXPECT_TRUE(rs.At(1).HasErrors());
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment