some column interface refactorings
This commit is contained in:
+10
-28
@@ -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_;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()) +
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user