From 8f4df0d1c83dac9b8d30be3ad56483bf27dbccb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Sat, 18 Oct 2025 13:28:02 +0200 Subject: [PATCH] added like and between operator --- .../condition/condition_node_visitor.hpp | 2 ++ .../matador/condition/condition_operators.hpp | 4 ++++ .../matador/condition/like_condition_node.hpp | 20 +++++++++++++++++++ include/matador/condition/types.hpp | 1 + src/CMakeLists.txt | 2 ++ src/condition/condition_operators.cpp | 11 +++++++++- src/condition/like_condition_node.cpp | 13 ++++++++++++ src/main.cpp | 2 ++ 8 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 include/matador/condition/like_condition_node.hpp create mode 100644 src/condition/like_condition_node.cpp diff --git a/include/matador/condition/condition_node_visitor.hpp b/include/matador/condition/condition_node_visitor.hpp index 65dfcea..0342217 100644 --- a/include/matador/condition/condition_node_visitor.hpp +++ b/include/matador/condition/condition_node_visitor.hpp @@ -4,6 +4,7 @@ namespace matador::condition { class between_condition_node; class binary_condition_node; +class like_condition_node; class logical_condition_node; class not_condition_node; class collection_condition_node; @@ -15,6 +16,7 @@ public: virtual void visit(const between_condition_node &node) = 0; virtual void visit(const binary_condition_node &node) = 0; virtual void visit(const collection_condition_node &node) = 0; + virtual void visit(const like_condition_node &node) = 0; virtual void visit(const logical_condition_node &node) = 0; virtual void visit(const not_condition_node &node) = 0; }; diff --git a/include/matador/condition/condition_operators.hpp b/include/matador/condition/condition_operators.hpp index 813a4fe..c56aca1 100644 --- a/include/matador/condition/condition_operators.hpp +++ b/include/matador/condition/condition_operators.hpp @@ -61,5 +61,9 @@ condition_node_ptr out(const column &col, std::initializer_list args) { return std::make_unique(col, collection_operator::OUT, values); } +condition_node_ptr between(const column &col, value min, value max); + +condition_node_ptr like(const column &col, const std::string &pattern); + } #endif //CONDITION_CONDITION_OPERATORS_HPP \ No newline at end of file diff --git a/include/matador/condition/like_condition_node.hpp b/include/matador/condition/like_condition_node.hpp new file mode 100644 index 0000000..e612c2e --- /dev/null +++ b/include/matador/condition/like_condition_node.hpp @@ -0,0 +1,20 @@ +#ifndef CONDITION_LIKE_CONDITION_NODE_HPP +#define CONDITION_LIKE_CONDITION_NODE_HPP + +#include "column.hpp" +#include "condition_node.hpp" + +namespace matador::condition { +class like_condition_node final : public condition_node { +public: + like_condition_node() = delete; + like_condition_node(column column, std::string pattern); + + void accept(condition_node_visitor &visitor) const override; + +private: + column column_; + std::string pattern_; +}; +} +#endif //CONDITION_LIKE_CONDITION_NODE_HPP \ No newline at end of file diff --git a/include/matador/condition/types.hpp b/include/matador/condition/types.hpp index 9d413d8..091bf43 100644 --- a/include/matador/condition/types.hpp +++ b/include/matador/condition/types.hpp @@ -1,6 +1,7 @@ #ifndef CONDITION_TYPES_HPP #define CONDITION_TYPES_HPP +#include #include #include #include diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1aba22a..dc4e68c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,6 +15,8 @@ SET(SOURCE condition/logical_condition_node.cpp ../include/matador/condition/between_condition_node.hpp condition/between_condition_node.cpp + ../include/matador/condition/like_condition_node.hpp + condition/like_condition_node.cpp ) add_library(matador-condition STATIC ${SOURCE}) diff --git a/src/condition/condition_operators.cpp b/src/condition/condition_operators.cpp index 748f37b..63a48c5 100644 --- a/src/condition/condition_operators.cpp +++ b/src/condition/condition_operators.cpp @@ -1,5 +1,7 @@ #include "matador/condition/condition_operators.hpp" +#include "matador/condition/between_condition_node.hpp" +#include "matador/condition/like_condition_node.hpp" #include "matador/condition/logical_condition_node.hpp" #include "matador/condition/not_condition_node.hpp" @@ -16,4 +18,11 @@ condition_node_ptr operator!(condition_node_ptr cond) { return std::make_unique(std::move(cond)); } -} \ No newline at end of file +condition_node_ptr between(const column &col, value min, value max) { + return std::make_unique(col, std::move(min), std::move(max)); +} + +condition_node_ptr like(const column &col, const std::string &pattern) { + return std::make_unique(col, pattern); +} +} diff --git a/src/condition/like_condition_node.cpp b/src/condition/like_condition_node.cpp new file mode 100644 index 0000000..2bc16d5 --- /dev/null +++ b/src/condition/like_condition_node.cpp @@ -0,0 +1,13 @@ +#include "matador/condition/like_condition_node.hpp" + +#include "matador/condition/condition_node_visitor.hpp" + +namespace matador::condition { +like_condition_node::like_condition_node(column column, std::string pattern) +: column_(std::move(column)) +, pattern_(std::move(pattern)){} + +void like_condition_node::accept(condition_node_visitor &visitor) const { + visitor.visit(*this); +} +} diff --git a/src/main.cpp b/src/main.cpp index f546fc8..93002c3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,8 @@ int main() { cond = "age"_col <= 7; cond = in("age"_col, {34, 35, 78}); cond = out("age"_col, {34, 35, 78}); + cond = between("age"_col, 34, 78); + cond = like("name"_col, "John"); // "age"_col != 7 && in("age"_col, {7,5,5,8});