added query helper macro and join query parts

This commit is contained in:
2024-02-19 22:57:43 +01:00
parent b11993d60b
commit b255ae22b4
14 changed files with 234 additions and 32 deletions
-1
View File
@@ -1,5 +1,4 @@
#include "matador/sql/dialect.hpp"
#include "matador/sql/column_definition.hpp"
#include "matador/utils/string.hpp"
+27 -2
View File
@@ -6,12 +6,12 @@
namespace matador::sql {
query_compiler::query_compiler(const sql::dialect &d)
: dialect_(d)
: dialect_(d)
{}
query_context query_compiler::compile(const query_data *data)
{
for (const auto &part : data->parts) {
for (const auto &part: data->parts) {
part->accept(*this);
}
@@ -20,6 +20,10 @@ query_context query_compiler::compile(const query_data *data)
void query_compiler::visit(query_select_part &select_part)
{
query_.sql = dialect_.token_at(dialect::token_t::SELECT) + " ";
query_.prototype.clear();
std::string result;
const auto &columns = select_part.columns();
if (columns.size() < 2) {
@@ -40,9 +44,30 @@ void query_compiler::visit(query_select_part &select_part)
query_.prototype.append(column_definition{(*it).name});
}
}
query_.sql += result;
}
void query_compiler::visit(query_from_part &from_part)
{
if (dialect_.default_schema_name().empty()) {
query_.sql += " " + dialect_.token_at(dialect::token_t::FROM) +
" " + dialect_.prepare_identifier(from_part.table().name) +
(from_part.table().alias.empty() ? "" : " AS " + dialect_.prepare_identifier(from_part.table().alias));
} else {
query_.sql += " " + dialect_.token_at(dialect::token_t::FROM) +
" " + dialect_.prepare_identifier(dialect_.default_schema_name()) +
"." + dialect_.prepare_identifier(from_part.table().name) +
(from_part.table().alias.empty() ? "" : " AS " + dialect_.prepare_identifier(from_part.table().alias));
}
}
void query_compiler::visit(query_join_part &join_part)
{
}
void query_compiler::visit(query_on_part &on_part)
{
}
+5 -9
View File
@@ -1,6 +1,7 @@
#include "matador/sql/query_intermediates.hpp"
#include "matador/sql/session.hpp"
#include "matador/sql/query_compiler.hpp"
#include "matador/sql/condition.hpp"
namespace matador::sql {
basic_query_intermediate::basic_query_intermediate(connection &db)
@@ -125,16 +126,10 @@ query_order_by_intermediate query_on_intermediate::order_by(const std::string &n
// return {connection_, builder_.order_by(name)};
}
query_on_intermediate query_join_intermediate::on(const basic_condition &cond)
query_join_intermediate query_from_intermediate::join_left(const table &t)
{
data_.parts.push_back(std::make_unique<query_join_part>(t));
return {connection_, data_};
// return {connection_, builder_.on(column, join_column)};
}
query_join_intermediate query_from_intermediate::join_left(const std::string &join_table_name, const std::string &as)
{
return {connection_, data_};
// return {connection_, builder_.join(join_table_name, join_type_t::INNER, as)};
}
query_where_intermediate query_from_intermediate::where(const basic_condition &cond)
@@ -149,8 +144,9 @@ query_select_intermediate::query_select_intermediate(connection &db, const std::
data_.parts.push_back(std::make_unique<query_select_part>(columns));
}
query_from_intermediate query_select_intermediate::from(const std::string &table, const std::string &as)
query_from_intermediate query_select_intermediate::from(const table& t)
{
data_.parts.push_back(std::make_unique<query_from_part>(t));
return {connection_, data_};
// return {connection_, builder_.from(table, as)};
}
+25 -6
View File
@@ -20,20 +20,39 @@ const std::vector<column>& query_select_part::columns() const
return columns_;
}
query_from_part::query_from_part(std::string table_name)
query_from_part::query_from_part(sql::table t)
: query_part(sql::dialect::token_t::FROM)
, table_(std::move(table_name)) {}
, table_(std::move(t)) {}
query_from_part::query_from_part(std::string table_name, std::string as)
: query_part(sql::dialect::token_t::FROM)
, table_(std::move(table_name))
, alias_(std::move(as)) {}
const sql::table &query_from_part::table() const
{
return table_;
}
void query_from_part::accept(query_part_visitor &visitor)
{
visitor.visit(*this);
}
query_join_part::query_join_part(sql::table t)
: query_part(sql::dialect::token_t::JOIN)
, table_(std::move(t)) {}
const sql::table &query_join_part::table() const
{
return table_;
}
void query_join_part::accept(query_part_visitor &visitor)
{
visitor.visit(*this);
}
void query_on_part::accept(query_part_visitor &visitor)
{
visitor.visit(*this);
}
void query_where_part::accept(query_part_visitor &visitor)
{
visitor.visit(*this);