initial commit

This commit is contained in:
Sascha Kühl
2025-10-17 15:51:35 +02:00
commit 6ffa9de6d0
22 changed files with 506 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
SET(SOURCE
../include/matador/condition/collection_condition_node.hpp
../include/matador/condition/column.hpp
../include/matador/condition/condition_node.hpp
../include/matador/condition/condition_node_visitor.hpp
../include/matador/condition/condition_operators.hpp
../include/matador/condition/logical_condition_node.hpp
../include/matador/condition/types.hpp
../include/matador/condition/value.hpp
condition/binary_condition_node.cpp
condition/collection_condition_node.cpp
condition/column.cpp
condition/condition_operators.cpp
condition/not_condition_node.cpp
condition/logical_condition_node.cpp
../include/matador/condition/between_condition_node.hpp
condition/between_condition_node.cpp
)
add_library(matador-condition STATIC ${SOURCE})
target_include_directories(matador-condition PUBLIC ../include)
add_executable(main main.cpp)
target_include_directories(main PUBLIC ../include)
target_link_libraries(main matador-condition)
+15
View File
@@ -0,0 +1,15 @@
#include "matador/condition/between_condition_node.hpp"
#include "matador/condition/condition_node_visitor.hpp"
namespace matador::condition {
between_condition_node::between_condition_node( column column, value min, value max )
: column_(std::move(column))
, min_(std::move(min))
, max_(std::move(max))
{}
void between_condition_node::accept( condition_node_visitor& visitor ) const {
visitor.visit(*this);
}
}
+15
View File
@@ -0,0 +1,15 @@
#include "matador/condition/binary_condition_node.hpp"
#include "matador/condition/condition_node_visitor.hpp"
namespace matador::condition {
binary_condition_node::binary_condition_node( column column, const binary_operator operator_, value value )
: column_(std::move(column))
, operator_(operator_)
, value_(std::move(value))
{}
void binary_condition_node::accept( condition_node_visitor& visitor ) const {
visitor.visit(*this);
}
}
@@ -0,0 +1,21 @@
#include "matador/condition/collection_condition_node.hpp"
#include "matador/condition/condition_node_visitor.hpp"
namespace matador::condition {
collection_condition_node::collection_condition_node( column col, collection_operator operator_, std::vector<value> values )
: column_(std::move(col))
, operator_(operator_)
, values_(std::move(values))
{}
collection_condition_node::collection_condition_node(column col, const collection_operator operator_, const std::initializer_list<value> values )
: column_(std::move(col))
, operator_(operator_)
, values_(values)
{}
void collection_condition_node::accept( condition_node_visitor& visitor ) const {
visitor.visit(*this);
}
}
+36
View File
@@ -0,0 +1,36 @@
#include "matador/condition/column.hpp"
#include <stdexcept>
namespace matador::condition {
column::column( std::string name )
: name_(std::move(name)) {}
column::column( std::string table_name, std::string name )
: table_(std::move(table_name))
, name_(std::move(name)){}
const std::string& column::table() const {
return table_;
}
const std::string& column::name() const {
return name_;
}
column operator ""_col( const char* name, size_t len ) {
const std::string str(name, len);
const auto pos = str.find('.');
if (pos == std::string::npos) {
return column{str};
}
if (str.find('.', pos + 1) != std::string::npos) {
// Invalid: more than one dot
throw std::invalid_argument("Invalid column name: multiple dots found");
}
return column{str.substr(0, pos), str.substr(pos + 1)};
}
}
+19
View File
@@ -0,0 +1,19 @@
#include "matador/condition/condition_operators.hpp"
#include "matador/condition/logical_condition_node.hpp"
#include "matador/condition/not_condition_node.hpp"
namespace matador::condition {
condition_node_ptr operator&&(condition_node_ptr left, condition_node_ptr right) {
return std::make_unique<logical_condition_node>(std::move(left), logical_operator::AND, std::move(right));
}
condition_node_ptr operator||(condition_node_ptr left, condition_node_ptr right) {
return std::make_unique<logical_condition_node>(std::move(left), logical_operator::OR, std::move(right));
}
condition_node_ptr operator!(condition_node_ptr cond) {
return std::make_unique<not_condition_node>(std::move(cond));
}
}
+15
View File
@@ -0,0 +1,15 @@
#include "matador/condition/logical_condition_node.hpp"
#include "matador/condition/condition_node_visitor.hpp"
namespace matador::condition {
logical_condition_node::logical_condition_node( condition_node_ptr left, const logical_operator op, condition_node_ptr right )
: left_(std::move(left))
, op_(op)
, right_(std::move(right))
{}
void logical_condition_node::accept(condition_node_visitor& visitor) const {
visitor.visit(*this);
}
}
+13
View File
@@ -0,0 +1,13 @@
#include "matador/condition/not_condition_node.hpp"
#include "matador/condition/condition_node_visitor.hpp"
namespace matador::condition {
not_condition_node::not_condition_node(condition_node_ptr condition)
: condition_(std::move(condition))
{}
void not_condition_node::accept( condition_node_visitor& visitor ) const {
visitor.visit(*this);
}
}
+20
View File
@@ -0,0 +1,20 @@
#include "matador/condition/column.hpp"
#include "matador/condition/condition_operators.hpp"
using namespace matador::condition;
int main() {
auto cond = "age"_col != 7 && "age"_col == 7;
cond = !("person.age"_col == 7);
cond = "age"_col > 7;
cond = "age"_col < 7;
cond = "age"_col >= 7;
cond = "age"_col <= 7;
cond = in("age"_col, {34, 35, 78});
cond = out("age"_col, {34, 35, 78});
// "age"_col != 7 && in("age"_col, {7,5,5,8});
// "(\"age\" <> 7 AND \"age\" IN (7, 5, 5, 8))"
}