From 0d49ea1fe08cf1eab41a00149393a291c65a59d7 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 25 Jan 2024 20:32:06 +0300 Subject: Turn odb-tests repository into package for muti-package repository --- odb-tests/common/relationship/query/driver.cxx | 168 +++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 odb-tests/common/relationship/query/driver.cxx (limited to 'odb-tests/common/relationship/query/driver.cxx') diff --git a/odb-tests/common/relationship/query/driver.cxx b/odb-tests/common/relationship/query/driver.cxx new file mode 100644 index 0000000..20d5370 --- /dev/null +++ b/odb-tests/common/relationship/query/driver.cxx @@ -0,0 +1,168 @@ +// file : common/relationship-query/query/driver.cxx +// license : GNU GPL v2; see accompanying LICENSE file + +// Test relationship queries. +// + +#include // std::unique_ptr +#include + +#include +#include +#include + +#include + +#include "test.hxx" +#include "test-odb.hxx" + +#undef NDEBUG +#include + +using namespace std; +using namespace odb::core; + +int +main (int argc, char* argv[]) +{ + try + { + unique_ptr db (create_database (argc, argv)); + + // + // + { + shared_ptr ca (new country ("CA", "Canada")); + shared_ptr za (new country ("ZA", "South Africa")); + shared_ptr us (new country ("US", "United States")); + shared_ptr se (new country ("SE", "Sweden")); + + shared_ptr st (new employer ("Simple Tech, Inc", ca)); + shared_ptr ct (new employer ("Complex Tech, Inc", us)); + + // person + // + shared_ptr p1 ( + new person (1, "John", "Doe", 30, ca, true, za)); + + shared_ptr p2 ( + new person (2, "Jane", "Doe", 29, za, false, us)); + p2->husband = p1; + + shared_ptr p3 ( + new person (3, "Joe", "Dirt", 31, us, true, us)); + + shared_ptr p4 ( + new person (4, "Johan", "Johansen", 32, se, false, ca)); + + // employee + // + shared_ptr e1 ( + new employee (1, "John", "Doe", 30, ca, true, za, st)); + + shared_ptr e2 ( + new employee (2, "Jane", "Doe", 29, za, false, us, ct)); + e2->husband = p1; + + shared_ptr e3 ( + new employee (3, "Joe", "Dirt", 31, us, true, us, st)); + + shared_ptr e4 ( + new employee (4, "Johan", "Johansen", 32, se, false, ca, ct)); + + transaction t (db->begin ()); + db->persist (ca); + db->persist (za); + db->persist (us); + db->persist (se); + + db->persist (st); + db->persist (ct); + + db->persist (p1); + db->persist (p2); + db->persist (p3); + db->persist (p4); + + db->persist (e1); + db->persist (e2); + db->persist (e3); + db->persist (e4); + t.commit (); + } + + typedef odb::query p_query; + typedef odb::result p_result; + + typedef odb::query e_query; + typedef odb::result e_result; + + // Make sure we have an independent JOIN for each relationship. + // + { + session s; + transaction t (db->begin ()); + + p_result pr (db->query ( + p_query::residence.location->code == "ZA")); + assert (size (pr) == 1); + + e_result er (db->query ( + e_query::residence.location->code == "ZA")); + assert (size (er) == 1); + + t.commit (); + } + + // Test Self-JOIN. + // + { + session s; + transaction t (db->begin ()); + + p_result pr (db->query (p_query::husband->last_name == "Doe")); + assert (size (pr) == 1); + + e_result er (db->query (e_query::husband->last_name == "Doe")); + assert (size (er) == 1); + + t.commit (); + } + + // Test query conditions from both base and derived. + // + { + session s; + transaction t (db->begin ()); + + e_result r ( + db->query ( + e_query::employed_by->name == "Simple Tech, Inc" && + e_query::nationality->code == "US")); + + assert (size (r) == 1); + + t.commit (); + } + + // Test second-level pointers. + // + { + session s; + transaction t (db->begin ()); + + p_result r ( + db->query ( + p_query::husband->residence.location == "CA")); + + assert (size (r) == 1); + + t.commit (); + } + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + return 1; + } +} -- cgit v1.1