use table metas where possible

This commit is contained in:
2026-01-09 18:10:23 +01:00
parent ac53526a27
commit b9f5819be5
9 changed files with 173 additions and 404 deletions
+47 -97
View File
@@ -7,6 +7,7 @@
#include "matador/query/table_column.hpp"
#include "models/person.hpp"
#include "models/model_metas.hpp"
#include "QueryFixture.hpp"
@@ -16,11 +17,12 @@
using namespace matador::sql;
using namespace matador::object;
using namespace matador::query;
using namespace matador::query::meta;
using namespace matador::utils;
using namespace matador::test;
TEST_CASE_METHOD(QueryFixture, "Test create statement", "[query][statement][create]") {
REQUIRE(repo.attach<matador::test::person>("person"));
const auto obj = object_generator::generate<person>(repo.repo(), "person");
const auto obj = object_generator::generate<person>(repo.repo(), "persons");
auto stmt = query::create()
.table(obj->name())
.columns(obj->attributes())
@@ -31,11 +33,11 @@ TEST_CASE_METHOD(QueryFixture, "Test create statement", "[query][statement][crea
auto res = stmt->execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 0);
tables_to_drop.emplace("person");
tables_to_drop.emplace("persons");
check_table_exists("person");
check_table_exists("persons");
const std::vector<std::string> cols = {"id", "name", "age", "image"};
const auto fields = db.describe("person");
const auto fields = db.describe("persons");
REQUIRE(fields.is_ok());
for (const auto &fld : *fields) {
@@ -44,39 +46,27 @@ TEST_CASE_METHOD(QueryFixture, "Test create statement", "[query][statement][crea
}
TEST_CASE_METHOD(QueryFixture, "Test insert statement", "[query][statement][insert]") {
using namespace matador::test;
REQUIRE(repo.attach<person>("person"));
const auto obj = object_generator::generate<person>(repo.repo(), "person");
auto stmt = query::create()
.table(obj->name())
.columns(obj->attributes())
.constraints(obj->constraints())
.prepare(db);
REQUIRE(stmt);
REQUIRE(repo.attach<person>("persons")
.and_then([this] { return repo.create(db);}));
auto res = stmt->execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 0);
tables_to_drop.emplace("person");
check_table_exists("person");
check_table_exists(PERSON.table_name());
person george{1, "george", 45, {1,2,3,4}};
stmt = query::insert()
.into<person>("person", repo)
auto stmt = query::insert()
.into(PERSON, {PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.values(generator::placeholders<person>())
.prepare(db);
REQUIRE(stmt);
res = stmt->bind(george)
auto res = stmt->bind(george)
.execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
auto row = query::select<person>(repo)
.from("person")
auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON)
.fetch_one<person>(db);
REQUIRE(row.is_ok());
@@ -88,40 +78,26 @@ TEST_CASE_METHOD(QueryFixture, "Test insert statement", "[query][statement][inse
}
TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][update]") {
using namespace matador::test;
using namespace matador::utils;
REQUIRE(repo.attach<person>("persons")
.and_then([this] { return repo.create(db);}));
REQUIRE(repo.attach<matador::test::person>("person"));
const auto obj = object_generator::generate<person>(repo.repo(), "person");
auto stmt = query::create()
.table(obj->name())
.columns(obj->attributes())
.constraints(obj->constraints())
.prepare(db);
REQUIRE(stmt);
auto res = stmt->execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 0);
tables_to_drop.emplace("person");
check_table_exists("person");
check_table_exists(PERSON.table_name());
person george{1, "george", 45, {1,2,3,4}};
stmt = query::insert()
.into<person>("person", repo)
auto stmt = query::insert()
.into(PERSON, {PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.values(generator::placeholders<person>())
.prepare(db);
REQUIRE(stmt);
res = stmt->bind(george)
auto res = stmt->bind(george)
.execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
auto row = query::select<person>(repo)
.from("person")
auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON)
.fetch_one<person>(db);
REQUIRE(row.is_ok());
@@ -133,9 +109,9 @@ TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][upda
george.age = 36;
george.image = {5,6,7,8};
stmt = query::update("person")
stmt = query::update(PERSON)
.set(generator::column_value_pairs<person>())
.where("id"_col == _)
.where(PERSON.id == _)
.prepare(db);
REQUIRE(stmt);
@@ -145,8 +121,8 @@ TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][upda
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
row = query::select<person>(repo)
.from("person")
row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON)
.fetch_one<person>(db);
REQUIRE(row.is_ok());
@@ -158,26 +134,13 @@ TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][upda
}
TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][delete]") {
using namespace matador::test;
REQUIRE(repo.attach<person>("persons")
.and_then([this] { return repo.create(db);}));
REQUIRE(repo.attach<matador::test::person>("person"));
const auto obj = object_generator::generate<person>(repo.repo(), "person");
auto stmt = query::create()
.table(obj->name())
.columns(obj->attributes())
.constraints(obj->constraints())
.prepare(db);
REQUIRE(stmt);
check_table_exists(PERSON.table_name());
auto res = stmt->execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 0);
tables_to_drop.emplace("person");
check_table_exists("person");
stmt = query::insert()
.into<person>("person", repo)
auto stmt = query::insert()
.into(PERSON, {PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.values(generator::placeholders<person>())
.prepare(db);
REQUIRE(stmt);
@@ -190,16 +153,16 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
};
for (const auto &p : peoples) {
res = stmt->bind(p)
auto res = stmt->bind(p)
.execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
stmt->reset();
}
auto select_stmt = query::select<person>(repo)
.from("person")
.where("name"_col == matador::utils::_)
auto select_stmt = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON)
.where(PERSON.name ==_)
.prepare(db);
REQUIRE(select_stmt);
@@ -216,12 +179,12 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
}
stmt = query::remove()
.from("person")
.where("name"_col == matador::utils::_)
.from(PERSON)
.where(PERSON.name == _)
.prepare(db);
REQUIRE(stmt);
res = stmt->bind(0, "jane")
auto res = stmt->bind(0, "jane")
.execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
@@ -248,26 +211,13 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
}
TEST_CASE_METHOD(QueryFixture, "Test reuse prepared statement", "[query][statement][reuse]") {
using namespace matador::test;
REQUIRE(repo.attach<matador::test::person>("persons")
.and_then([this] { return repo.create(db);}));
REQUIRE(repo.attach<matador::test::person>("person"));
const auto obj = object_generator::generate<person>(repo.repo(), "person");
auto stmt = query::create()
.table(obj->name())
.columns(obj->attributes())
.constraints(obj->constraints())
.prepare(db);
REQUIRE(stmt);
check_table_exists(PERSON.table_name());
auto res = stmt->execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 0);
tables_to_drop.emplace("person");
check_table_exists("person");
stmt = query::insert()
.into<person>("person", repo)
auto stmt = query::insert()
.into(PERSON, {PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.values(generator::placeholders<person>())
.prepare(db);
REQUIRE(stmt);
@@ -280,15 +230,15 @@ TEST_CASE_METHOD(QueryFixture, "Test reuse prepared statement", "[query][stateme
};
for (const auto &p : peoples) {
res = stmt->bind(p)
auto res = stmt->bind(p)
.execute();
REQUIRE(res.is_ok());
REQUIRE(*res == 1);
stmt->reset();
}
stmt = query::select<person>(repo)
.from("person")
stmt = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON)
.prepare(db);
REQUIRE(stmt);