Skip to content

Commit 28f6df2

Browse files
Added another test for unions in joins
1 parent 480514e commit 28f6df2

1 file changed

Lines changed: 76 additions & 0 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include <gtest/gtest.h>
2+
3+
#include <rfl.hpp>
4+
#include <rfl/json.hpp>
5+
#include <sqlgen.hpp>
6+
#include <sqlgen/sqlite.hpp>
7+
#include <vector>
8+
9+
#include "sqlgen/sqlite/to_sql.hpp"
10+
11+
namespace test_union_in_join2 {
12+
13+
struct User1 {
14+
std::string name;
15+
int age;
16+
};
17+
18+
struct User2 {
19+
std::string name;
20+
int age;
21+
};
22+
23+
struct User3 {
24+
int age;
25+
std::string name;
26+
};
27+
28+
struct Login {
29+
int id;
30+
std::string username;
31+
};
32+
33+
TEST(sqlite, test_union_in_join2) {
34+
using namespace sqlgen;
35+
using namespace sqlgen::literals;
36+
37+
const auto conn = sqlgen::sqlite::connect();
38+
39+
const auto user1 = User1{.name = "John", .age = 30};
40+
sqlgen::write(conn, user1);
41+
42+
const auto user2 = User2{.name = "Jane", .age = 25};
43+
sqlgen::write(conn, user2);
44+
45+
const auto user3 = User3{.age = 40, .name = "Joe"};
46+
sqlgen::write(conn, user3);
47+
48+
const auto login = Login{.id = 1, .username = "John"};
49+
sqlgen::write(conn, login);
50+
51+
const auto s1 = sqlgen::select_from<User1>("name"_c, "age"_c);
52+
const auto s2 = sqlgen::select_from<User2>("name"_c, "age"_c);
53+
const auto s3 = sqlgen::select_from<User3>("name"_c, "age"_c);
54+
55+
const auto united = sqlgen::unite<std::vector<User1>>(s1, s2, s3);
56+
57+
const auto sel = select_from<"t1">(united, "id"_t2, "username"_t2) |
58+
inner_join<Login, "t2">("username"_t2 == "name"_t1) |
59+
where("id"_t2 == 1) | to<std::vector<Login>>;
60+
61+
const auto query = sqlgen::sqlite::to_sql(sel);
62+
63+
const auto result = sel(conn);
64+
65+
const auto users = result.value();
66+
67+
EXPECT_EQ(
68+
query,
69+
R"(SELECT t2."id", t2."username" FROM (SELECT "name", "age" FROM (SELECT "name", "age" FROM "User1") UNION SELECT "name", "age" FROM (SELECT "name", "age" FROM "User2") UNION SELECT "name", "age" FROM (SELECT "name", "age" FROM "User3")) t1 INNER JOIN "Login" t2 ON t2."username" = t1."name" WHERE t2."id" = 1)");
70+
71+
EXPECT_EQ(users.size(), 1);
72+
EXPECT_EQ(users.at(0).id, 1);
73+
EXPECT_EQ(users.at(0).username, "John");
74+
}
75+
76+
} // namespace test_union_in_join2

0 commit comments

Comments
 (0)