some column interface refactorings

This commit is contained in:
Sascha Kühl
2025-12-08 16:27:00 +01:00
parent 3b0b9615ca
commit 263c202c69
14 changed files with 126 additions and 125 deletions
+10 -28
View File
@@ -7,7 +7,7 @@
namespace matador::query {
column operator ""_col(const char *name, size_t len) {
column operator ""_col(const char *name, const size_t len) {
const std::string str(name, len);
const auto pos = str.find('.');
if (pos == std::string::npos) {
@@ -18,7 +18,7 @@ column operator ""_col(const char *name, size_t len) {
throw std::invalid_argument("Invalid column name: multiple dots found");
}
return column{table{str.substr(0, pos)}, str.substr(pos + 1)};
return column{std::make_shared<table>(str.substr(0, pos)), str.substr(pos + 1)};
}
column::column(const char *name, const std::string& as)
@@ -27,30 +27,23 @@ column::column(const char *name, const std::string& as)
column::column(std::string name, std::string as)
: table_(std::make_shared<query::table>())
, name(std::move(name))
, name_(std::move(name))
, alias_(std::move(as)) {}
column::column(const sql::sql_function_t func, std::string name)
: table_(std::make_shared<query::table>())
, name(std::move(name))
, name_(std::move(name))
, function_(func) {}
column::column(const query::table& tab, std::string name, std::string as)
: table_(std::make_shared<query::table>(tab))
, name(std::move(name))
, alias_(std::move(as)) {
table_->columns_.push_back(*this);
}
column::column(const std::shared_ptr<query::table>& t, std::string name, std::string as)
: table_(t)
, name(std::move(name))
, name_(std::move(name))
, alias_(std::move(as)) {
}
bool column::equals(const column &x) const {
return *table_ == *x.table_ &&
name == x.name &&
name_ == x.name_ &&
alias_ == x.alias_ &&
function_ == x.function_;
}
@@ -60,18 +53,11 @@ column &column::as(std::string a) {
return *this;
}
const std::string& column::column_name() const {
return name;
const std::string& column::name() const {
return name_;
}
std::string column::full_name() const {
if (table_ && !table_->name().empty()) {
return table_->name() + "." + name;
}
return name;
}
const std::string& column::alias_name() const {
const std::string& column::alias() const {
return alias_;
}
@@ -87,10 +73,6 @@ bool column::has_alias() const {
return !alias_.empty();
}
std::string column::alias() const {
return alias_;
}
std::shared_ptr<table> column::table() const {
return table_;
}
@@ -100,7 +82,7 @@ void column::table( const std::shared_ptr<query::table>& t ) {
}
column::operator const std::string&() const {
return name;
return name_;
}
}
+4 -4
View File
@@ -39,8 +39,8 @@ std::string criteria_evaluator::evaluate(const abstract_criteria &node) {
}
void criteria_evaluator::visit(const between_criteria &node) {
query_.bind_vars.emplace_back(node.col().column_name());
query_.bind_vars.emplace_back(node.col().column_name());
query_.bind_vars.emplace_back(node.col().name());
query_.bind_vars.emplace_back(node.col().name());
clause_ += prepare_identifier(dialect_, node.col()) + " " + dialect_.token_at(sql::dialect_token::Between) + " ";
evaluate_value(node.minimum());
clause_ += " " + dialect_.token_at(sql::dialect_token::And) + " ";
@@ -51,7 +51,7 @@ template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;
void criteria_evaluator::visit(const binary_criteria &node) {
query_.bind_vars.emplace_back(node.col().column_name());
query_.bind_vars.emplace_back(node.col().name());
clause_ += prepare_criteria(dialect_, node.col()) + " " + detail::BinaryOperatorEnum.to_string(node.operand()) + " ";
evaluate_value(node.value());
@@ -64,7 +64,7 @@ void criteria_evaluator::visit( const binary_column_criteria& node ) {
void criteria_evaluator::visit(const collection_criteria &node) {
const auto count = node.values().size();
for (size_t i = 0; i < count; ++i) {
query_.bind_vars.emplace_back(node.col().column_name());
query_.bind_vars.emplace_back(node.col().name());
}
clause_ += prepare_identifier(dialect_, node.col()) +
+18 -18
View File
@@ -37,14 +37,14 @@ sql::query_context query_compiler::compile(const query_data &data,
std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const query_data &data, const column &col) {
if (col.is_function()) {
ctx.prototype.emplace_back(col.has_alias() ? col.alias() : col.column_name());
ctx.prototype.emplace_back(col.has_alias() ? col.alias() : col.name());
ctx.prototype.back().change_type(utils::basic_type::type_int32);
} else {
ctx.prototype.emplace_back(col.column_name());
ctx.prototype.emplace_back(col.name());
}
if (const auto it = data.tables.find(col.table()->name()); it != data.tables.end()) {
return prepare_identifier(*d, {it->second, col.column_name(), col.alias()});
return prepare_identifier(*d, it->second, {col.name(), col.alias()});
}
return prepare_identifier(*d, col);
@@ -69,13 +69,13 @@ void query_compiler::visit(internal::query_add_foreign_key_constraint_part& part
if (part.columns().size() < 2) {
for (const auto &col: part.columns()) {
query_.sql += dialect_->prepare_identifier_string(col.column_name());
query_.sql += dialect_->prepare_identifier_string(col.name());
}
} else {
auto it = part.columns().begin();
query_.sql += dialect_->prepare_identifier_string(it->column_name());
query_.sql += dialect_->prepare_identifier_string(it->name());
for (; it != part.columns().end(); ++it) {
query_.sql += ", " + dialect_->prepare_identifier_string(it->column_name());
query_.sql += ", " + dialect_->prepare_identifier_string(it->name());
}
}
query_.sql += ")";
@@ -86,13 +86,13 @@ void query_compiler::visit(internal::query_add_primary_key_constraint_part& part
if (part.columns().size() < 2) {
for (const auto &col: part.columns()) {
query_.sql += dialect_->prepare_identifier_string(col.column_name());
query_.sql += dialect_->prepare_identifier_string(col.name());
}
} else {
auto it = part.columns().begin();
query_.sql += dialect_->prepare_identifier_string(it->column_name());
query_.sql += dialect_->prepare_identifier_string(it->name());
for (; it != part.columns().end(); ++it) {
query_.sql += ", " + dialect_->prepare_identifier_string(it->column_name());
query_.sql += ", " + dialect_->prepare_identifier_string(it->name());
}
}
query_.sql += ")";
@@ -103,13 +103,13 @@ void query_compiler::visit(internal::query_add_foreign_key_reference_part& part)
if (part.columns().size() < 2) {
for (const auto &col: part.columns()) {
query_.sql += dialect_->prepare_identifier_string(col.column_name());
query_.sql += dialect_->prepare_identifier_string(col.name());
}
} else {
auto it = part.columns().begin();
query_.sql += dialect_->prepare_identifier_string(it->column_name());
query_.sql += dialect_->prepare_identifier_string(it->name());
for (; it != part.columns().end(); ++it) {
query_.sql += ", " + dialect_->prepare_identifier_string(it->column_name());
query_.sql += ", " + dialect_->prepare_identifier_string(it->name());
}
}
query_.sql += ")";
@@ -207,14 +207,14 @@ void query_compiler::visit(internal::query_into_part &part) {
std::string result{"("};
if (part.columns().size() < 2) {
for (const auto &col: part.columns()) {
result.append(dialect_->prepare_identifier_string(col.column_name()));
result.append(dialect_->prepare_identifier_string(col.name()));
}
} else {
auto it = part.columns().begin();
result.append(dialect_->prepare_identifier_string((it++)->column_name()));
result.append(dialect_->prepare_identifier_string((it++)->name()));
for (; it != part.columns().end(); ++it) {
result.append(", ");
result.append(dialect_->prepare_identifier_string(it->column_name()));
result.append(dialect_->prepare_identifier_string(it->name()));
}
}
result += (")");
@@ -355,16 +355,16 @@ void query_compiler::visit(internal::query_set_part &part) {
value_visitor visitor(writer, query_); if (part.column_values().size() < 2) {
for (const auto &column_value: part.column_values()) {
result.append(dialect_->prepare_identifier_string(column_value.col().column_name()) + "=");
result.append(dialect_->prepare_identifier_string(column_value.col().name()) + "=");
result.append(determine_value(visitor, column_value.value()));
}
} else {
auto it = part.column_values().begin();
result.append(dialect_->prepare_identifier_string(it->col().column_name()) + "=");
result.append(dialect_->prepare_identifier_string(it->col().name()) + "=");
result.append(determine_value(visitor, (it++)->value()));
for (; it != part.column_values().end(); ++it) {
result.append(", ");
result.append(dialect_->prepare_identifier_string(it->col().column_name()) + "=");
result.append(dialect_->prepare_identifier_string(it->col().name()) + "=");
result.append(determine_value(visitor, it->value()));
}
}
+18 -14
View File
@@ -4,19 +4,23 @@
namespace matador::query {
std::string prepare_identifier( const sql::dialect& d, const column& col ) {
std::string result;
if (!col.is_function()) {
if (!col.table()->name().empty()) {
result = d.prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + ".";
}
result += d.prepare_identifier_string(col.column_name());
} else {
result = d.sql_function_at(col.function()) + "(" + col.column_name() + ")";
return prepare_identifier(d, *col.table(), col);
}
std::string prepare_identifier( const sql::dialect& d, const table& tab, const column& col ) {
std::string result;
if (!col.is_function()) {
if (!tab.name().empty()) {
result = d.prepare_identifier_string(tab.has_alias() ? tab.alias() : tab.name()) + ".";
}
if (!col.alias().empty()) {
result += " AS " + col.alias();
}
return result;
result += d.prepare_identifier_string(col.name());
} else {
result = d.sql_function_at(col.function()) + "(" + col.name() + ")";
}
if (!col.alias().empty()) {
result += " AS " + col.alias();
}
return result;
}
std::string prepare_criteria(const sql::dialect& d, const column& col) {
@@ -28,10 +32,10 @@ std::string prepare_criteria(const sql::dialect& d, const column& col) {
if (!col.table()->name().empty()) {
result = d.prepare_identifier_string(col.table()->has_alias() ? col.table()->alias() : col.table()->name()) + ".";
}
result += d.prepare_identifier_string(col.column_name());
result += d.prepare_identifier_string(col.name());
// }
} else {
result = d.sql_function_at(col.function()) + "(" + col.column_name() + ")";
result = d.sql_function_at(col.function()) + "(" + col.name() + ")";
}
return result;
+3 -3
View File
@@ -49,9 +49,9 @@ const std::vector<column>& table::columns() const {
return columns_;
}
column table::column( const std::string& name ) const {
return {*this, name};
}
// column table::column(const std::string& name) const {
// return {std::shared_ptr<table>(const_cast<table*>(this)), name};
// }
table::operator const std::vector<query::column>&() const {
return columns_;