90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
#include "matador/query/select_query_builder.hpp"
|
|
|
|
namespace matador::query {
|
|
criteria_transformer::criteria_transformer(const basic_schema& repo, const std::unordered_map<std::string, table>& tables_by_name)
|
|
: repo_(repo)
|
|
, tables_by_name_(tables_by_name) {}
|
|
|
|
void criteria_transformer::visit( const between_criteria& node ) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const binary_criteria& node ) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const binary_column_criteria& /*node*/ ) {}
|
|
|
|
void criteria_transformer::visit(const check_null_criteria& node) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const collection_criteria& node ) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const collection_query_criteria& node ) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const like_criteria& node ) {
|
|
update_criteria_column(node);
|
|
}
|
|
|
|
void criteria_transformer::visit( const logical_criteria& node ) {
|
|
node.left_clause()->accept(*this);
|
|
node.right_clause()->accept(*this);
|
|
}
|
|
|
|
void criteria_transformer::visit( const not_criteria& node ) {
|
|
node.clause()->accept(*this);
|
|
}
|
|
|
|
void criteria_transformer::update_criteria_column(const abstract_column_criteria& node) const {
|
|
if (node.col().table() == nullptr) {
|
|
return;
|
|
}
|
|
const auto it = tables_by_name_.find(node.col().table()->name());
|
|
if (it == tables_by_name_.end()) {
|
|
return;
|
|
}
|
|
|
|
const_cast<table_column&>(node.col()).table(&it->second);
|
|
}
|
|
|
|
void select_query_builder::on_revision(const char *id, uint64_t &/*rev*/) {
|
|
push(id);
|
|
}
|
|
|
|
void select_query_builder::push(const std::string &column_name) {
|
|
const auto it = processed_tables_.find(table_info_stack_.top().info.name());
|
|
if (it == processed_tables_.end()) {
|
|
throw query_builder_exception{query_build_error::UnexpectedError};
|
|
}
|
|
entity_query_data_.columns.emplace_back(&it->second, column_name, build_alias('c', ++column_index));
|
|
}
|
|
|
|
const select_query_data & select_query_builder::query_data() const {
|
|
return entity_query_data_;
|
|
}
|
|
|
|
std::string select_query_builder::build_alias(const char prefix, const unsigned int count) {
|
|
char str[4];
|
|
snprintf(str, 4, "%c%02d", prefix, count);
|
|
|
|
return str;
|
|
}
|
|
|
|
[[nodiscard]] bool select_query_builder::is_root_entity() const {
|
|
return table_info_stack_.size() == 1;
|
|
}
|
|
|
|
void select_query_builder::append_join(const table_column &left, const table_column &right) {
|
|
using namespace matador::query;
|
|
entity_query_data_.joins.push_back({
|
|
right.table(),
|
|
std::make_unique<binary_column_criteria>(left, binary_operator::EQUALS, right)
|
|
});
|
|
}
|
|
}
|