Skip to content
Snippets Groups Projects

F mixed write transactions

Merged Timm Fitschen requested to merge f-mixed-write-transactions into dev
All threads resolved!

Files

+ 138
18
@@ -37,6 +37,7 @@
@@ -37,6 +37,7 @@
#include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-test-part.h> // for TestPartResult
#include <gtest/gtest-test-part.h> // for TestPartResult
#include <gtest/gtest_pred_impl.h> // for AssertionResult
#include <gtest/gtest_pred_impl.h> // for AssertionResult
 
#include <initializer_list> // for initializer_list
#include <iostream> // for operator<<, endl
#include <iostream> // for operator<<, endl
#include <limits> // for numeric_limits
#include <limits> // for numeric_limits
#include <memory> // for unique_ptr, allocator
#include <memory> // for unique_ptr, allocator
@@ -723,7 +724,7 @@ auto test_numeric_values_impl(AtomicDataType a_type) -> void {
@@ -723,7 +724,7 @@ auto test_numeric_values_impl(AtomicDataType a_type) -> void {
prop.SetValue(static_cast<S>(value));
prop.SetValue(static_cast<S>(value));
props_orig.push_back(prop);
props_orig.push_back(prop);
auto i_stat = insert_transaction->InsertEntity(&prop);
auto i_stat = insert_transaction->InsertEntity(&prop);
EXPECT_EQ(i_stat, StatusCode::READY);
EXPECT_EQ(i_stat, StatusCode::GO_ON);
insert_transaction->ExecuteAsynchronously();
insert_transaction->ExecuteAsynchronously();
auto t_stat = insert_transaction->WaitForIt();
auto t_stat = insert_transaction->WaitForIt();
EXPECT_TRUE(t_stat.IsTerminated());
EXPECT_TRUE(t_stat.IsTerminated());
@@ -787,7 +788,7 @@ TEST_F(test_transaction, test_integer_out_of_range) {
@@ -787,7 +788,7 @@ TEST_F(test_transaction, test_integer_out_of_range) {
prop.SetValue(value);
prop.SetValue(value);
auto i_stat = insert_transaction->InsertEntity(&prop);
auto i_stat = insert_transaction->InsertEntity(&prop);
EXPECT_EQ(i_stat, StatusCode::READY);
EXPECT_EQ(i_stat, StatusCode::GO_ON);
insert_transaction->ExecuteAsynchronously();
insert_transaction->ExecuteAsynchronously();
auto t_stat = insert_transaction->WaitForIt();
auto t_stat = insert_transaction->WaitForIt();
@@ -802,22 +803,141 @@ TEST_F(test_transaction, test_integer_out_of_range) {
@@ -802,22 +803,141 @@ TEST_F(test_transaction, test_integer_out_of_range) {
}
}
}
}
// /*
/*
// * test miscellaneous queries
* Insert three record types in a single transaction.
// */
*/
// TEST_F(test_transaction, test_queries_misc) {
TEST_F(test_transaction, test_multi_insert_transactions) {
// const auto &connection =
const auto &connection =
// caosdb::connection::ConnectionManager::GetDefaultConnection();
caosdb::connection::ConnectionManager::GetDefaultConnection();
// // query empty database
auto insert_transaction(connection->CreateTransaction());
// auto query_transaction(connection->CreateTransaction());
// query_transaction->Query("FIND Property \"Prop *\"");
for (std::string name : {"RT1", "RT2", "RT3"}) {
// query_transaction->ExecuteAsynchronously();
Entity entity;
// auto t_stat = query_transaction->WaitForIt();
entity.SetRole(Role::RECORD_TYPE);
// std::cout << "status: " << t_stat.GetCode() << " // "
entity.SetName(name);
// << t_stat.GetDescription() << std::endl;
auto stat = insert_transaction->InsertEntity(&entity);
// EXPECT_TRUE(t_stat.GetCode() >= 0);
EXPECT_EQ(stat, StatusCode::GO_ON);
// }
}
 
insert_transaction->Execute();
 
auto insert_status = insert_transaction->GetStatus();
 
 
ASSERT_TRUE(insert_status.IsTerminated());
 
ASSERT_FALSE(insert_status.IsError());
 
 
// TODO(tf) test end results
 
}
 
 
/*
 
* Update three record types in a single transaction.
 
*/
 
TEST_F(test_transaction, test_multi_update_transactions) {
 
const auto &connection =
 
caosdb::connection::ConnectionManager::GetDefaultConnection();
 
 
auto insert_transaction(connection->CreateTransaction());
 
 
for (std::string name : {"RT1", "RT2", "RT3"}) {
 
Entity entity;
 
entity.SetRole(Role::RECORD_TYPE);
 
entity.SetName(name);
 
insert_transaction->InsertEntity(&entity);
 
}
 
insert_transaction->Execute();
 
 
auto retrieve_transaction(connection->CreateTransaction());
 
for (const Entity &entity : insert_transaction->GetResultSet()) {
 
retrieve_transaction->RetrieveById(entity.GetId());
 
}
 
retrieve_transaction->Execute();
 
 
auto update_transaction(connection->CreateTransaction());
 
for (Entity entity : retrieve_transaction->GetResultSet()) {
 
entity.SetDescription("NewDescription");
 
ASSERT_EQ(update_transaction->UpdateEntity(&entity), StatusCode::GO_ON);
 
}
 
update_transaction->Execute();
 
 
auto update_status = update_transaction->GetStatus();
 
 
ASSERT_TRUE(update_status.IsTerminated());
 
ASSERT_FALSE(update_status.IsError());
 
 
// TODO(tf) test end results
 
}
 
 
/*
 
*
 
* Setup: Insert A, B, while A references B
 
*
 
* Complex transaction: Insert C, update A (remove reference to B, add reference
 
* to C), delete B.
 
*/
 
TEST_F(test_transaction, test_multi_write_transactions) {
 
const auto &connection =
 
caosdb::connection::ConnectionManager::GetDefaultConnection();
 
 
Entity entity_a;
 
Entity entity_b;
 
Entity entity_c;
 
Property reference_b;
 
Property reference_c;
 
 
// SETUP
 
entity_a.SetRole(Role::RECORD_TYPE);
 
entity_a.SetName("RTA");
 
entity_b.SetRole(Role::RECORD_TYPE);
 
entity_b.SetName("RTB");
 
reference_b.SetName("RTB");
 
entity_a.AppendProperty(reference_b);
 
 
auto insert_transaction(connection->CreateTransaction());
 
insert_transaction->InsertEntity(&entity_a);
 
insert_transaction->InsertEntity(&entity_b);
 
insert_transaction->ExecuteAsynchronously();
 
insert_transaction->WaitForIt();
 
ASSERT_TRUE(insert_transaction->GetStatus().IsTerminated());
 
ASSERT_FALSE(insert_transaction->GetStatus().IsError());
 
auto entity_a_id =
 
insert_transaction->GetResultSet().at(0).GetId(); // entity_a
 
auto entity_b_id =
 
insert_transaction->GetResultSet().at(1).GetId(); // entity_b
 
 
auto retrieve_transaction(connection->CreateTransaction());
 
retrieve_transaction->RetrieveById(entity_a_id);
 
 
retrieve_transaction->Execute();
 
 
// COMPLEX TRANSACTION
 
entity_c.SetRole(Role::RECORD_TYPE);
 
entity_c.SetName("RTC");
 
reference_c.SetName("RTC");
 
 
Entity entity_a_update(retrieve_transaction->GetResultSet().at(0));
 
entity_a_update.RemoveProperty(0);
 
entity_a_update.AppendProperty(reference_c);
 
 
auto complex_transaction(connection->CreateTransaction());
 
ASSERT_EQ(complex_transaction->InsertEntity(&entity_c), StatusCode::GO_ON);
 
ASSERT_EQ(complex_transaction->DeleteById(entity_b_id), StatusCode::GO_ON);
 
ASSERT_EQ(complex_transaction->UpdateEntity(&entity_a_update),
 
StatusCode::GO_ON);
 
complex_transaction->ExecuteAsynchronously();
 
complex_transaction->WaitForIt();
 
 
EXPECT_TRUE(complex_transaction->GetStatus().IsTerminated());
 
EXPECT_FALSE(complex_transaction->GetStatus().IsError());
 
 
// TODO(tf) test end results
 
retrieve_transaction = connection->CreateTransaction();
 
ASSERT_EQ(retrieve_transaction->RetrieveById(entity_a_update.GetId()),
 
StatusCode::GO_ON);
 
retrieve_transaction->ExecuteAsynchronously();
 
retrieve_transaction->WaitForIt();
 
 
const auto &final_entity = retrieve_transaction->GetResultSet().at(0);
 
EXPECT_EQ("RTC", final_entity.GetProperties().at(0).GetName());
 
}
/*
/*
* insert three recordtypes and the submit multiple queries in different
* insert three recordtypes and the submit multiple queries in different
Loading