criteria progress

This commit is contained in:
Sascha Kühl
2026-01-21 16:08:27 +01:00
parent ac514c3765
commit 328d164c05
58 changed files with 230 additions and 82 deletions
@@ -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) {
+1 -1
View File
@@ -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) {
+4 -4
View File
@@ -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) {
+19 -4
View File
@@ -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()));
}