criteria progress
This commit is contained in:
@@ -1,7 +1,11 @@
|
||||
#include <utility>
|
||||
|
||||
#include "matador/query/criteria/binary_criteria.hpp"
|
||||
|
||||
#include "matador/query/criteria/criteria_visitor.hpp"
|
||||
|
||||
#include "matador/query/intermediates/fetchable_query.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
binary_criteria::binary_criteria(const table_column& col, const binary_operator operand, criteria_value value)
|
||||
: abstract_column_criteria(col)
|
||||
@@ -21,10 +25,10 @@ const criteria_value& binary_criteria::value() const {
|
||||
return value_;
|
||||
}
|
||||
|
||||
binary_column_criteria::binary_column_criteria(const table_column& left_column, const binary_operator operand, const table_column& right_column)
|
||||
: left_column_(left_column)
|
||||
binary_column_criteria::binary_column_criteria(table_column left_column, const binary_operator operand, table_column right_column)
|
||||
: left_column_(std::move(left_column))
|
||||
, operator_(operand)
|
||||
, right_column_(right_column){}
|
||||
, right_column_(std::move(right_column)){}
|
||||
|
||||
void binary_column_criteria::accept(criteria_visitor& visitor) const {
|
||||
visitor.visit(*this);
|
||||
|
||||
@@ -28,7 +28,7 @@ const std::vector<criteria_value>& collection_criteria::values() const {
|
||||
return values_;
|
||||
}
|
||||
|
||||
collection_query_criteria::collection_query_criteria(const table_column& col, collection_operator operand_, sql::query_context ctx)
|
||||
collection_query_criteria::collection_query_criteria(const table_column& col, const collection_operator operand_, fetchable_query ctx)
|
||||
: abstract_column_criteria(col)
|
||||
, operand_(operand_)
|
||||
, query_context_(std::move(ctx)){
|
||||
@@ -42,7 +42,7 @@ collection_operator collection_query_criteria::operand() const {
|
||||
return operand_;
|
||||
}
|
||||
|
||||
const sql::query_context & collection_query_criteria::context() const {
|
||||
const fetchable_query& collection_query_criteria::query() const {
|
||||
return query_context_;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,8 +90,8 @@ criteria_ptr in(const table_column &col, const std::initializer_list<utils::plac
|
||||
return std::make_unique<collection_criteria>(col, collection_operator::In, std::move(values));
|
||||
}
|
||||
|
||||
criteria_ptr in(const table_column &col, sql::query_context &&ctx) {
|
||||
return std::make_unique<collection_query_criteria>(col, collection_operator::In, std::move(ctx));
|
||||
criteria_ptr in(const table_column &col, fetchable_query &&q) {
|
||||
return std::make_unique<collection_query_criteria>(col, collection_operator::In, std::move(q));
|
||||
}
|
||||
|
||||
template <>
|
||||
@@ -103,8 +103,8 @@ criteria_ptr out(const table_column &col, const std::initializer_list<utils::pla
|
||||
return std::make_unique<collection_criteria>(col, collection_operator::Out, values);
|
||||
}
|
||||
|
||||
criteria_ptr out(const table_column &col, sql::query_context &&ctx) {
|
||||
return std::make_unique<collection_query_criteria>(col, collection_operator::In, std::move(ctx));
|
||||
criteria_ptr out(const table_column &col, fetchable_query &&q) {
|
||||
return std::make_unique<collection_query_criteria>(col, collection_operator::In, std::move(q));
|
||||
}
|
||||
|
||||
criteria_ptr between(const table_column &col, const int64_t min, const int64_t max) {
|
||||
|
||||
@@ -88,7 +88,7 @@ void criteria_evaluator::visit(const collection_criteria &node) {
|
||||
void criteria_evaluator::visit(const collection_query_criteria &node) {
|
||||
clause_ += prepare_identifier(dialect_, node.col()) +
|
||||
(node.operand() == collection_operator::Out ? " " + dialect_.token_at(sql::dialect_token::Not) + " " : " ") +
|
||||
dialect_.token_at(sql::dialect_token::In) + " (" +node.context().sql + ")";
|
||||
dialect_.token_at(sql::dialect_token::In) + " (" + node.query().str( dialect_ ) + ")";
|
||||
}
|
||||
|
||||
void criteria_evaluator::visit(const like_criteria &node) {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#include "matador/query/intermediates/fetchable_query.hpp"
|
||||
|
||||
#include "matador/query/query_compiler.hpp"
|
||||
|
||||
#include "matador/sql/executor.hpp"
|
||||
#include "matador/sql/field.hpp"
|
||||
#include "matador/sql/statement.hpp"
|
||||
@@ -54,7 +56,10 @@ utils::result<std::optional<sql::record>, utils::error> fetchable_query::fetch_o
|
||||
}
|
||||
|
||||
std::string fetchable_query::str(const sql::executor &exec) const {
|
||||
return exec.str(compile(exec.dialect()));
|
||||
return str(exec.dialect());
|
||||
}
|
||||
std::string fetchable_query::str(const sql::dialect &d) const {
|
||||
return compile(d).sql;
|
||||
}
|
||||
|
||||
sql::query_context fetchable_query::compile(const sql::dialect &d) const {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_alter_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
query_alter_intermediate::query_alter_intermediate() {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "matador/object/object.hpp"
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
executable_query query_add_foreign_key_constraint_intermediate::references( const table& tab, const std::vector<table_column>& columns) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "matador/query/intermediates/query_create_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
|
||||
#include "matador/query/table_constraint.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
#include "matador/object/object.hpp"
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_delete_from_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "matador/query/intermediates/query_delete_from_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
query_drop_intermediate::query_drop_intermediate() {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_execute_offset_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_execute_limit_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
query_execute_limit_intermediate query_execute_offset_intermediate::limit(size_t limit) {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_execute_order_direction_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_execute_limit_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
query_execute_limit_intermediate query_execute_where_intermediate::limit(size_t limit) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "matador/query/intermediates/query_order_by_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_order_by_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "matador/query/intermediates/query_into_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#include "matador/query/intermediates/query_intermediate.hpp"
|
||||
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
query_intermediate::query_intermediate()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_into_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_join_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_limit_intermediate.hpp"
|
||||
#include "matador/query/intermediates/query_offset_intermediate.hpp"
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_offset_intermediate.hpp"
|
||||
#include "matador/query/intermediates/query_limit_intermediate.hpp"
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_order_direction_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "matador/query/intermediates/query_limit_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "matador/query/intermediates/query_join_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
@@ -10,10 +11,15 @@ query_select_intermediate::query_select_intermediate(const std::vector<table_col
|
||||
context_->parts.push_back(std::make_unique<internal::query_select_part>(columns));
|
||||
}
|
||||
|
||||
query_from_intermediate query_select_intermediate::from(const table& t) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_from_part>(t));
|
||||
context_->tables.insert({t.name(), t});
|
||||
// query_from_intermediate query_select_intermediate::from(const table& tab) {
|
||||
// return from(std::vector{tab});
|
||||
// }
|
||||
query_from_intermediate query_select_intermediate::from(const std::vector<table>& tables) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_from_part>(tables));
|
||||
for (const auto& tab : tables) {
|
||||
context_->tables.insert({tab.name(), tab});
|
||||
}
|
||||
|
||||
return {context_};
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace matador::query
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_set_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "matador/query/intermediates/query_update_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "matador/query/intermediates/query_order_by_intermediate.hpp"
|
||||
|
||||
#include "matador/query/internal/query_parts.hpp"
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
query_group_by_intermediate query_where_intermediate::group_by(const table_column &column) {
|
||||
|
||||
@@ -134,13 +134,13 @@ const std::vector<table_column> &query_select_part::columns() const {
|
||||
return columns_;
|
||||
}
|
||||
|
||||
query_from_part::query_from_part(class table tab)
|
||||
query_from_part::query_from_part(std::vector<table> tables)
|
||||
: query_part(sql::dialect_token::From)
|
||||
, table_(std::move(tab)) {
|
||||
, tables_(std::move(tables)) {
|
||||
}
|
||||
|
||||
const table &query_from_part::table() const {
|
||||
return table_;
|
||||
const std::vector<table> &query_from_part::tables() const {
|
||||
return tables_;
|
||||
}
|
||||
|
||||
void query_from_part::accept(query_part_visitor &visitor) {
|
||||
|
||||
@@ -158,8 +158,20 @@ void query_compiler::visit(internal::query_select_part &part) {
|
||||
}
|
||||
|
||||
void query_compiler::visit(internal::query_from_part &part) {
|
||||
query_.table_name = part.table().name();
|
||||
query_.sql += " " + build_table_name(part.token(), *dialect_, part.table());
|
||||
query_.table_name = part.tables().front().name();
|
||||
query_.sql += " " + dialect_->from() + " ";
|
||||
if (const auto &tables = part.tables(); tables.size() < 2) {
|
||||
for (const auto &tab: tables) {
|
||||
query_.sql += build_table_name(*dialect_, tab);
|
||||
}
|
||||
} else {
|
||||
auto it = tables.begin();
|
||||
query_.sql.append(build_table_name(*dialect_, *it++));
|
||||
for (; it != tables.end(); ++it) {
|
||||
query_.sql.append(", ");
|
||||
query_.sql.append(build_table_name(*dialect_, *it));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void query_compiler::visit(internal::query_join_part &part) {
|
||||
@@ -456,8 +468,11 @@ std::string build_constraint(const table_constraint& cons, const sql::dialect& d
|
||||
}
|
||||
|
||||
std::string query_compiler::build_table_name(const sql::dialect_token token, const sql::dialect &d, const table& t) {
|
||||
return d.token_at(token) + " " +
|
||||
(!d.default_schema_name().empty() ? d.prepare_identifier_string(d.default_schema_name()) + "." : "") +
|
||||
return d.token_at(token) + " " + build_table_name(d, t);
|
||||
}
|
||||
|
||||
std::string query_compiler::build_table_name(const sql::dialect &d, const table& t) {
|
||||
return (!d.default_schema_name().empty() ? d.prepare_identifier_string(d.default_schema_name()) + "." : "") +
|
||||
d.prepare_identifier_string(t.table_name()) +
|
||||
(!t.has_alias() ? "" : " " + d.prepare_identifier_string(t.name()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user